2016-03-31 12 views
1

Ich mache ein Spiel in Assembly mit EMU8086 für ein Projekt in der Schule. In diesem Spiel muss ich dem Benutzer erlauben, eine Zeichenfolge einzugeben, um fortzufahren. Während er die Zeichenfolge eingibt, könnte er etwas falsch eingeben und die Rücktaste verwenden, um es zu korrigieren. Das Problem ist, dass die Rücktaste den Cursor über das vorherige Zeichen bewegt, aber das zuvor eingegebene Zeichen bleibt. Warum löscht die Rücktaste nicht das vorherige Zeichen? Wie kann ich mein Programm reparieren, so dass das vorherige Zeichen auf dem Bildschirm entfernt wird?Löschen eines Zeichens auf dem Bildschirm

My-Code ist:

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 
+1

Das riesige Wand von nicht-eingerückten Code wäre besser lesbar, wenn Sie zwischen einzelnen Code-Blöcken Leerzeilen und solche Dinge gelassen haben. Zumindest die Kommentare sehen vernünftig aus (sie sagen, warum der Code tut was auch immer). –

Antwort

4

Für typische Bildschirme und Terminalemulatoren, die Rückdruckzeichen bewegt sich nur der Cursor um eine Stelle nach links. Um ein Zeichen zu löschen, versuchen Sie, die Rücktaste + Leerzeichen + Rücktaste zu drücken.

0

Keith ist korrekt, auch in DOS, wenn Sie eine Backspace Zeichen drucken, ist es nicht-destruktiv. Dies bedeutet, dass der Cursor zurückgeht, aber das darunter liegende Zeichen bleibt erhalten. Das ist normales Verhalten.

Ich habe nicht eng Zeit schauen auf den Code hatte aber nach anfänglichem Druck der ersten Backspace Sie Int 21h/Ah=2 auszudrucken andere Raum Zeichen gefolgt von einem weiteren Backspace verwenden können.

Im Code der Rück Sie haben:

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

es zu beheben, ich glaube, Sie den Code so etwas wie ändern können:

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