forked from crazyettin/EttinOS
Fix backspace not working at linebreak.
This commit is contained in:
parent
958b64e8a3
commit
3045519bd4
1 changed files with 50 additions and 18 deletions
68
src/os.asm
68
src/os.asm
|
@ -3,6 +3,10 @@
|
||||||
mov ax, 0x1000
|
mov ax, 0x1000
|
||||||
mov ds, ax
|
mov ds, ax
|
||||||
|
|
||||||
|
mov ah, 0xf
|
||||||
|
int 0x10
|
||||||
|
mov byte [cpl], ah
|
||||||
|
|
||||||
mov si, welcome
|
mov si, welcome
|
||||||
call print
|
call print
|
||||||
|
|
||||||
|
@ -68,30 +72,33 @@ ret
|
||||||
|
|
||||||
read:
|
read:
|
||||||
call clear
|
call clear
|
||||||
|
mov bl, 0
|
||||||
|
mov ah, 0x3
|
||||||
|
int 0x10
|
||||||
|
mov byte [.lastline], dh
|
||||||
mov di, input
|
mov di, input
|
||||||
mov cl, 0
|
|
||||||
.loop:
|
.loop:
|
||||||
mov ah, 0
|
mov ah, 0
|
||||||
int 0x16
|
int 0x16
|
||||||
|
cmp al, 0
|
||||||
|
je .loop
|
||||||
cmp al, 0xd
|
cmp al, 0xd
|
||||||
je .return
|
je .return
|
||||||
cmp al, 0x8
|
cmp al, 0x8
|
||||||
je .backspace
|
je .backspace
|
||||||
cmp cl, 0x80
|
cmp bl, 0x80
|
||||||
je .loop
|
je .loop
|
||||||
cmp al, 0x20
|
|
||||||
je .space
|
|
||||||
cmp al, 0x9
|
cmp al, 0x9
|
||||||
je .erase
|
je .erase
|
||||||
cmp al, 0
|
cmp al, 0x20
|
||||||
je .loop
|
je .space
|
||||||
.character:
|
.character:
|
||||||
mov byte [di], 0
|
mov byte [di], 0
|
||||||
mov ah, 0xe
|
mov ah, 0xe
|
||||||
int 0x10
|
int 0x10
|
||||||
stosb
|
stosb
|
||||||
inc cl
|
inc bl
|
||||||
jmp .loop
|
jmp .linecheck
|
||||||
.erase:
|
.erase:
|
||||||
mov al, 0x20
|
mov al, 0x20
|
||||||
jmp .character
|
jmp .character
|
||||||
|
@ -102,34 +109,57 @@ mov al, byte [di]
|
||||||
mov ah, 0xe
|
mov ah, 0xe
|
||||||
int 0x10
|
int 0x10
|
||||||
inc di
|
inc di
|
||||||
inc cl
|
inc bl
|
||||||
|
.linecheck:
|
||||||
|
mov ah, 0x3
|
||||||
|
int 0x10
|
||||||
|
cmp dh, [.lastline]
|
||||||
|
jle .loop
|
||||||
|
mov byte [.lastline], dh
|
||||||
jmp .loop
|
jmp .loop
|
||||||
.backspace:
|
.backspace:
|
||||||
cmp cl, 0
|
cmp bl, 0
|
||||||
je .loop
|
je .loop
|
||||||
|
mov ah, 0x3
|
||||||
|
int 0x10
|
||||||
|
cmp dl, 1
|
||||||
|
je .prevline
|
||||||
mov ah, 0xe
|
mov ah, 0xe
|
||||||
int 0x10
|
int 0x10
|
||||||
dec di
|
dec di
|
||||||
dec cl
|
dec bl
|
||||||
|
jmp .loop
|
||||||
|
.prevline:
|
||||||
|
mov ah, 0x2
|
||||||
|
dec dh
|
||||||
|
mov dl, [cpl]
|
||||||
|
int 0x10
|
||||||
|
dec di
|
||||||
|
dec bl
|
||||||
jmp .loop
|
jmp .loop
|
||||||
.return:
|
.return:
|
||||||
mov di, input.end
|
mov di, input.end
|
||||||
.tspfind:
|
.findtrailingspace:
|
||||||
dec di
|
dec di
|
||||||
cmp byte [di], 0
|
cmp byte [di], 0
|
||||||
je .tspfind
|
je .findtrailingspace
|
||||||
cmp byte [di], 0x20
|
cmp byte [di], 0x20
|
||||||
je .tsperase
|
je .erasetrailingspace
|
||||||
jmp .done
|
jmp .done
|
||||||
.tsperase:
|
.erasetrailingspace:
|
||||||
mov al, 0
|
mov al, 0
|
||||||
stosb
|
stosb
|
||||||
dec di
|
dec di
|
||||||
jmp .tspfind
|
jmp .findtrailingspace
|
||||||
.done:
|
.done:
|
||||||
|
mov ah, 0x2
|
||||||
|
mov dh, [.lastline]
|
||||||
|
int 0x10
|
||||||
mov si, newline
|
mov si, newline
|
||||||
call print
|
call print
|
||||||
ret
|
ret
|
||||||
|
.lastline:
|
||||||
|
db 0
|
||||||
|
|
||||||
compare:
|
compare:
|
||||||
mov al, [si]
|
mov al, [si]
|
||||||
|
@ -162,7 +192,6 @@ mov [di], bl
|
||||||
inc di
|
inc di
|
||||||
dec cx
|
dec cx
|
||||||
jnz .loop
|
jnz .loop
|
||||||
; mov si, input
|
|
||||||
ret
|
ret
|
||||||
.hex:
|
.hex:
|
||||||
db "0123456789abcdef"
|
db "0123456789abcdef"
|
||||||
|
@ -176,7 +205,7 @@ ret
|
||||||
.input:
|
.input:
|
||||||
db "Input:", 0xd, 0xa, "* Typing a character overwrites the cursor location.", 0xd, 0xa, "* The tab key erases the cursor location.", 0xd, 0xa, "* The space and backspace keys move the cursor.", 0xd, 0xa, 0
|
db "Input:", 0xd, 0xa, "* Typing a character overwrites the cursor location.", 0xd, 0xa, "* The tab key erases the cursor location.", 0xd, 0xa, "* The space and backspace keys move the cursor.", 0xd, 0xa, 0
|
||||||
.commands:
|
.commands:
|
||||||
db "Commands:", 0xd, 0xa, "* help: you are reading it.", 0xd, 0xa, "* hello: a hello world program.", 0xd, 0xa, "* echo: echoes its input.", 0xd, 0xa, "* keycode: echoes the BIOS scancode of a key.", 0xd, 0xa, 0
|
db "Commands:", 0xd, 0xa, "* help: you are reading it.", 0xd, 0xa, "* hello: a hello world program.", 0xd, 0xa, "* echo: echoes its input.", 0xd, 0xa, "* keycode: echoes the BIOS code of a key.", 0xd, 0xa, 0
|
||||||
|
|
||||||
hello:
|
hello:
|
||||||
mov si, .msg
|
mov si, .msg
|
||||||
|
@ -223,6 +252,9 @@ db 0
|
||||||
|
|
||||||
;Data
|
;Data
|
||||||
|
|
||||||
|
cpl:
|
||||||
|
db 0
|
||||||
|
|
||||||
welcome:
|
welcome:
|
||||||
db 0xd, 0xa, "Welcome to EttinOS!", 0xd, 0xa, 0xd, 0xa, 0
|
db 0xd, 0xa, "Welcome to EttinOS!", 0xd, 0xa, 0xd, 0xa, 0
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue