Стирание текущей строки в консоли после нажатия клавиши escape - Assembler
Формулировка задачи:
Здравствуйте, я написал программу, которая вводит и выводит числа в десятичной системе счисления. Хочу поинтересоваться возможно ли стирание текущей строки в консоли после нажатия клавиши escape. Стирание происходит через сдвиг каретки на один символ влево и заполнением этого места пробелом. В моей программе также есть функция, которая, при нажатии клавиши backspace, стирает последний введённый символ. И эта функция работает. А вот после нажатия escape число должно фактически обнуляться, а визуально стирать строку, но это не происходит! Показывается стрелка влево и каретка остаётся на том же месте! Пробовал просто менять положение каретки, и это получается, но чтобы очищало строку - никак.
Вот, соответственно, код программы:
.model small
.stack
.data
a dw ?
b dw ?
incorrect db 10, 13, "WAS ENTERED INCORRECT CHARACTER!$"
bignumber db 10, 13, "NUMBER IS TOO BIG!$"
impossible db 10, 13, "DIVIDE BE ZERO IS IMPOSSIBLE$"
nextln db 10, 13, "$"
backspace db 32, 8, "$"
.code
Input proc
mov bx, 0
begin:
mov ah, 01h
int 21h
cmp al, 13
je exit
cmp al, 27
je escape
cmp al, 8
je bkspace
cmp al, '0'
jb error
cmp al, '9'
ja error
allisok:
sub al, 30h
xor ah, ah
xchg ax, bx
mov dx, 10
mul dx
add bx, ax
cmp bx, 6553
jae check
jmp begin
error:
mov dx, offset incorrect
mov ah, 09h
int 21h
mov bx, 0
jmp nextline
check:
cmp bx, 6553
ja numberok
mov ah, 01h
int 21h
cmp al, 13
je exit
cmp al, '0'
jb error
cmp al, '9'
ja error
cmp al, '6'
jb allisok
mov dx, offset bignumber
mov ah, 09h
int 21h
mov bx, 0
jmp nextline
nextline:
mov dx, offset nextln
mov ah, 09h
int 21h
jmp begin
exit:
ret
numberok:
mov dx, offset nextln
mov ah, 09h
int 21h
ret
escape:
mov bx, 0
mov cx, 4
again:
mov dx, offset backspace
mov ah, 09h
int 21h
loop again
jmp begin
bkspace:
mov dx, offset backspace
mov ah, 09h
int 21h
mov ax, bx
xor dx, dx
mov cx, 10
div cx
mov bx, ax
jmp begin
Input endp
Output proc
xor cx, cx
mov bx, 10
l1:
xor dx,dx
div bx
push dx
inc cx
test ax, ax
jnz l1
mov ah, 02h
l2:
pop dx
add dl, '0'
int 21h
loop l2
ret
Output endp
main:
mov ax, @data
mov ds, ax
call Input
mov a, bx
call Input
mov b, bx
mov ax, a
call Output
mov dl, '/'
mov ah, 02h
int 21h
mov ax, b
call Output
mov dl, '='
mov ah, 02h
int 21h
cmp b, 0
je dbzero
xor dx, dx
mov ax, a
div b
call Output
mov ax, 4c00h
int 21h
int 20h
dbzero:
mov dx, offset impossible
mov ah, 09h
int 21h
end main
;made by Belsky AntonРешение задачи: «Стирание текущей строки в консоли после нажатия клавиши escape»
textual
Листинг программы
.MODEL TINY
InpBuffLen=10
Cr=0dh
Lf=0ah
BSpace=8
.CODE
org 100h
Begin:
jmp @@get_key
@@disp:
mov EscPres, 0
cmp al, BSpace
jne @@no_bs
call BackSpace
jmp @@get_key
@@no_bs:
cmp CharQty, InpBuffLen
jae @@get_key
inc CharQty
mov dl, al
mov ah, 2
int 21h
@@get_key:
mov ah, 8
int 21h
cmp al, 1bh
jne @@disp
inc EscPres
mov dx, offset ClrBuff
call DispStrDx
mov CharQty, 0
cmp EscPres, 2
jb @@get_key
mov dx, offset MsgTerm
call DispStrDx
mov ah, 8
int 21h
int 20h
;---------------------------
BackSpace PROC NEAR
cmp CharQty, 0
je @F
dec CharQty
mov dx, offset ClrOne
call DispStrDx
@@:
ret
BackSpace ENDP
;---------------------------
DispStrDx PROC NEAR
push ax
mov ah, 9
int 21h
pop ax
ret
DispStrDx ENDP
;---------------------------
.DATA
CharQty db 0
EscPres db 0
MsgTerm db Cr, Lf, "Press a key to exit", Cr, Lf, 24h
ClrOne db BSpace, " ", BSpace, 24h
ClrBuff db Cr, InpBuffLen dup(" "),Cr,"$"
end Begin