помогите плиз
переместить по экрану символ вертикально
спасибо.
shurikan
18-11-2003, 03:39
himik
Ну, полностью код писать не буду. Наводку даю:
(я так понимаю, что это требуется под DOS)
Способ 1.
Используем прерывние 10h (видео) функции скроллирование прямоугольной области экрана.
Если в ah записать число 06h, то скроллинг осуществляется вверх, а если 07h, то - вниз. Остальные аргументы одинаковы для обеих функций.
ch, cl - соответственно номера строки и колонки левого верхнего угла области скроллинга, (для всего экрана эти координаты 0 и 0)
dh, dl - номера строки и колонки правого нижнего угла области скроллинга,
al - количество строк, на которое нужно произвести сдвиг,
bh - видео атрибут (цвет символа и фона) для заполнения пустого места, например 07h - светло серый символ на черном фоне.
Способ 2.
Прямое обращение к видеопамяти.
*push ds
*mov *ax,0B800h
*mov *ds,ax
*mov *ax, Y
*mul *160
*add *ax, X
*add *ax, X
*mov *dx,[ax]
*sub *ax, 160 ; для сдвига вверх
*add *ax, 160 ; для сдвига вниз
*mov *[ax],dx
*pop *ds
:)
Исправлено: shurikan, 4:41 18-11-2003
shurikan
Ну, полностью код писать не буду.
:help::pray: напиши если не сложно, очень надо, а я в этом ваще никак не рублю(
Санкс.
shurikan
20-11-2003, 03:08
himik
OK! Только тогда я попрошу полностью выложить задание. А то я только понял, что писать надо на ассемблере. Это должна быть подпрограмма, принимающая какие-то параметры? Или как можно узнать какой символ двигать, куда именно сейчас (вверх или вниз), постоянно или по нажатию клавиши, с какой скоростью, когда остановиться???? Лады? А так это не сложно - сделаем. :biggrin:
Добавлено:
Можно и комментарии приклеить.
shurikan
мдя озадачил)))
задание так и звучит
Составить программу, перемещения символа по экрану вертикально :-(
А как я думаю значения не имеет.
shurikan
21-11-2003, 03:12
himik
Значится так. Компилил TASM-ом. Стрелочками перемещается курсор. CTRL+стрелочки - символ вместе с курсором во все стороны. На краях перпрыгивает на противоположный край. ESC - выход. Код уже отладил. Читай:
.286
.model smal
.data
videoseg * * * * dw 0B800h
cursor_pos * * * * dw ?
cursor_shape * * dw ?
video_off * * * * *dw ?
key_tbl * * * * * *db 4Bh, 4Dh, 48h, 50h, 73h, 74h, 8Dh, 91h, 0
off_tbl * * * * * *dw offset do_left
* * * * * * * * * dw offset do_right
* * * * * * * * * dw offset do_up
* * * * * * * * * dw offset do_down
* * * * * * * * * dw offset do_cleft
* * * * * * * * * dw offset do_cright
* * * * * * * * * dw offset do_cup
* * * * * * * * * dw offset do_cdown
.code
start:
* * * * mov * * * *ax,@data
* * * * mov * * * *ds,ax
* * * * mov * * * *ax,videoseg
* * * * mov * * * *es,ax
* * * * mov * * * *ah,03h
* * * * mov * * * *bh,0
* * * * int * * * *10h
* * * * mov * * * *cursor_pos,dx
* * * * mov * * * *cursor_shape,cx
* * * * xor * * * *cx,cx
* * * * mov * * * *cl,dl
* * * * shl * * * *cx,1
* * * * xor * * * *ax,ax
* * * * mov * * * *al,dh
* * * * mov * * * *bp,160
* * * * mul * * * *bp
* * * * add * * * *ax,cx
* * * * mo * * * * vvideo_off,ax
next:
* * * * mov * * * *ah,10h
* * * * int * * * *16h
* * * * cmp * * * *ah,1
* * * * je * * * * done
* * * * call * * * process
* * * * jmp * * * *next
done:
* * * * mov * * * ax,4c00h
* * * * int * * * *21h
process:
* * * *cmp * * * *al,0E0h
* * * *jne * * * * *locret
* * * *xor * * * * *bx,bx
@@1:
* * * *mov * * * *al,key_tbl[bx]
* * * *and * * * *al,al
* * * *je * * * * * locret
* * * *cmp * * * *ah,al
* * * *je * * * * * found
* * * * inc * * * * bx
* * * * jmp * * * @@1
found:
* * * * shl * * * * bx,1
* * * * add * * * *bx,offset off_tbl
* * * * mov * * * ax,[bx]
* * * * call * * * * ax
locret:
* * * * ret
do_left:
* * * * mov * * * dx,cursor_pos
* * * * and * * * dl,dl
* * * * je * * * * *zero_col0
* * * * dec * * * dx
* * * * sub * * * video_off,2
* * * * jmp * * * cont0
zero_col0:
* * * * mov * * *dl,79
* * * * add * * * video_off,2*79
cont0:
* * * * mov * * *cursor_pos,dx
* * * * call * * * *set_cursor_pos
* * * * ret
do_right:
* * * * mov * * *dx,cursor_pos
* * * * cmp * * *dl,79
* * * * je * * * * last_col0
* * * * inc * * * *dx
* * * * add * * *video_off,2
* * * * jmp * * * cont1
last_col0:
* * * * xor * * * dl,dl
* * * * sub * * *video_off,2*79
cont1:
* * * *mov * * * cursor_pos,dx
* * * *call * * * *set_cursor_pos
* * * *ret
do_up:
* * * *mov * * * dx,cursor_pos
* * * *and * * * dh,dh
* * * *je * * * * *zero_row0
* * * *sub * * * dx,100h
* * * *sub * * * video_off,160
* * * *jmp * * * cont2
zero_row0:
* * * *mov * * *dh,24
* * * *add * * * video_off,160*24
cont2:
* * * *mov * * * cursor_pos,dx
* * * *call * * * *set_cursor_pos
* * * *ret
do_down:
* * * *mov * * * dx,cursor_pos
* * * *cmp * * * dh,24
* * * *je * * * * *last_row0
* * * *add * * * dx,100h
* * * *add * * * video_off,160
* * * *jmp * * * cont3
last_row0:
* * * *xor * * * *dh,dh
* * * *sub * * * video_off,160*24
cont3:
* * * *mov * * *cursor_pos,dx
* * * *call * * * *set_cursor_pos
* * * *ret
do_cleft:
* * * *mov * * * bx,video_off
* * * *mov * * * bp,bx
* * * *mov * * * dx,cursor_pos
* * * *and * * * dl,dl
* * * *je * * * * *zero_col1
* * * *sub * * * bp,2
* * * *jmp * * * cont4
zero_col1:
* * * *add * * * bp,2*79
cont4:
* * * *mov * * *dx,es:[bx]
* * * *mov * * *ax,es:[bp]
* * * *mov * * *es:[bx],ax
* * * *mov * * *es:[bp],dx
* * * *call * * * do_left
* * * *ret
do_cright:
* * * *mov * * * bx,video_off
* * * *mov * * * bp,bx
* * * *mov * * * dx,cursor_pos
* * * *cmp * * * dl,79
* * * *je * * * * *last_col1
* * * *add * * * bp,2
* * * *jmp * * * cont5
last_col1:
* * * *sub * * * bp,2*79
cont5:
* * * *mov * * *dx,es:[bx]
* * * *mov * * *ax,es:[bp]
* * * *mov * * *es:[bx],ax
* * * *mov * * *es:[bp],dx
* * * *call * * * do_right
* * * *ret
do_cup:
* * * *mov * * *bx,video_off
* * * *mov * * *bp,bx
* * * *mov * * *dx,cursor_pos
* * * *and * * *dh,dh
* * * *je * * * * zero_row1
* * * *sub * * *bp,160
* * * *jmp * * *cont6
zero_row1:
* * * *add * * *bp,160*24
cont6:
* * * *mov * * *dx,es:[bx]
* * * *mov * * *ax,es:[bp]
* * * *mov * * *es:[bx],ax
* * * *mov * * *es:[bp],dx
* * * *call * * * do_up
* * * *ret
do_cdown:
* * * *mov * * *bx,video_off
* * * *mov * * *bp,bx
* * * *mov * * *dx,cursor_pos
* * * *cmp * * *dh,24
* * * *je * * * * last_row1
* * * *add * * *bp,160
* * * *jmp * * *cont7
last_row1:
* * * *sub * * *bp,160*24
cont7:
* * * *mov * * *dx,es:[bx]
* * * *mov * * *ax,es:[bp]
* * * *mov * * *es:[bx],ax
* * * *mov * * *es:[bp],dx
* * * *call * * * *do_down
* * * *ret
set_cursor_pos:
* * * *mov * * *ah,02h
* * * *xor * * * *bh,bh
* * * *int * * * *10h
* * * *ret
.stack
end start
:)
shurikan
большое спасибо, выручил)
Guest
пасиб, но надо было на ассемблере :-)))
shurikan
21-11-2003, 15:48
himik
Не за что :gigi:
Комментарии нужны? :)
Комментарии нужны?
shurikan
было бы не плохо, а то я не смогу если спросят объяснить)
shurikan
22-11-2003, 04:40
himik
OK! Здесь добавлять не буду, вышлю по e-mail с вложением.
:)
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.