Удаление символа на экране

Я делаю игру в сборке, используя EMU8086 для проекта в школе. В этой игре мне нужно разрешить пользователю вводить строку, чтобы прогрессировать. Когда он вводит строку, он может что-то печатать неправильно и использовать клавишу Backspace для ее исправления. Проблема заключается в том, что клавиша Backspace перемещает курсор над предыдущим символом, но ранее введенный символ остается. Почему backspace не очищает предыдущий символ? Как я могу исправить свою программу так, чтобы предыдущий символ на экране был удален?

Мой код:

data segment

ends

stack segment
dw   128  dup(0)
ends    
StringHelper db 20 dup(?)
Line db 13,10,'$'
FullInput db 'You cant type more than 20 letters!!! please try again!!',13,10,'$'
t db '$'
code segment
PROC PrintMessage
  ;BX MUST have OFFSET OF MESSAGE
  ; if you want to go down a line do (lea bx,line)      
  mov dx,bx      
  mov ah,09h
  int 21h     
  ret 
 endp printMessage
 proc InputString          
;askes the user to input chars untill he press (enter) then puts it in StringHelper
b:
lea bx, StringHelper
mov cx,5  
xor dx,dx
a:                 ;restarts string helper
mov [bx],00
inc bx
loop a
lea bx, StringHelper
up:
cmp dx,20        ;cheacks if you wrote more than 20 chars
jz TryAgain
deleted:
xor ax,ax
mov ah,01h
int 21h
xor ah,ah
mov cx,08h        ;checks if the user inputed the backspace key
cmp al,cl
jz BackSpace
mov cx,0dh
cmp al, cl                ;checks if the user enters enter
jz InputIsOver
inc dx
mov [bx],al
inc bx
jmp up
TryAgain:
lea bx, line
call PrintMessage 
lea bx, FullInput
call PrintMessage
jmp b:
BackSpace:
cmp dx,0            ;checks if te user didnt just BackSpaced nothing
jz deleted
lea bx,stringhelper  ;gets the start of the array
add bx,dx            ;adds dx which is the indexer to how many chars  you     already wrote
mov [bx],00h         ;puts 0(nothing) at that place
dec bx
dec dx
jmp deleted          ;returen to get an extra input
InPutIsOver:

ret
endp
start:
  mov  ax, @data
 mov  ds, ax
mov al,13h
int 10h 
call InputString
 ; add your code here

mov ax, 4c00h
int 21h  

ends

end start

2 ответа

Для типичных экранов и эмуляторов терминала печать символа возврата на одну позицию просто перемещает курсор на одну позицию влево. Чтобы очистить символ, попробуйте распечатать Backspace+ пробел + Backspace.

Кит прав, даже в DOS, если вы печатаете символ возврата на задний план, это не разрушительно. Это означает, что курсор вернется назад, но символ внизу останется. Это нормальное поведение.

У меня не было времени внимательно посмотреть на код, но после первоначальной печати первого backspace вы можете использовать Int 21h/Ah=2, чтобы распечатать другой пробел, за которым следует еще один backspace.

В коде Backspace у вас есть:

BackSpace:
cmp dx,0            ;checks if te user didnt just BackSpaced nothing
jz deleted

Чтобы исправить это, я думаю, вы можете изменить код на что-то вроде:

BackSpace:
cmp dx,0            ;checks if te user didnt just BackSpaced nothing
jz deleted

mov ah, 02h         ; DOS Display character call 
mov dl, 20h         ; A space to clear old character 
int 21h             ; Display it  
mov dl, 08h         ; Another backspace character to move cursor back again
int 21h             ; Display it 
Другие вопросы по тегам