Значится так. Компилил TASM-ом. Стрелочками перемещается курсор. CTRL+стрелочки - символ вместе с курсором во все стороны. На краях перпрыгивает на противоположный край. ESC - выход. Код уже отладил. Читай:
Код:
![Выделить весь код](images/misc/selectcode.png)
.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