Мне очень эта программа напоминает металлоискатель : )
Пока что я сделал только перемещение символа "*" с помощью букв w,s,a,d.
data segment
old_cs dw ?
old_ip dw ?
symbol db ?
Pressed db 1
x db ?
y db ?
sgn db '*'
atr db 10
data ends
code segment
assume cs: code, ds: data
new_1c proc far
push ax
push bx
push ds
push es
mov ax, data
mov ds, ax
mov ax, 40h
mov es, ax
mov ax, es:[1Ch]
mov bx, es:[1Ah]
cmp bx, ax
jne get_char
jmp go_out
get_char:
mov al, es:[bx]
mov es:[1Ch], bx
mov symbol, al
inc Pressed
go_out:
pop es
pop ds
pop bx
pop ax
iret
new_1c endp
start:
mov ax, data
mov ds, ax
mov ah, 35h
mov al, 1Ch
int 21h
mov old_ip, bx
mov old_cs, es
push ds
mov dx, offset new_1c
mov ax, seg new_1c
mov ds, ax
mov ah, 25h
mov al, 1Ch
int 21h
pop ds
mov ax, data
mov es, ax
mov x,14
mov y,40
main_loop:
cmp Pressed, 0
je m1
mov Pressed, 0
cmp symbol, 30h
je q
xor ax, ax
mov al, symbol
m1: cmp al, 'w'
jne m2
dec x
jmp met
m2: cmp al, 's'
jne m3
inc x
jmp met
m3: cmp al, 'a'
jne m4
dec y
jmp met
m4: cmp al, 'd'
jne main_loop
inc y
met: xor bh, bh
mov ah, 13h
mov al, 0d
mov dh, x
mov dl, y
lea bp, sgn
mov cx, 1
mov bl, atr
int 10h
jmp main_loop
q:
push ds
mov dx, old_ip
mov ax, old_cs
mov ds, ax
mov ah, 25h
mov al, 1Ch
int 21h
pop ds
mov ax, 4C00h
int 21h
code ends
end start
Не могу понять, почему "вверх" не срабатывает с первого раза? приходится повторно нажимать "w", в результате мы поднимаеся не на одну позицию, а на две...
И как сделать какую-нибудь очистку экрана? чтоб очищать консоль и на экран выводился только один символ "*" .