2021-05-26 17:43:46 +00:00
;Main
2021-05-26 14:05:49 +00:00
mov ax , 0x1000
mov ds , ax
2021-05-27 21:53:34 +00:00
mov ah , 0xf
int 0x10
mov byte [ cpl ], ah
2021-05-26 14:05:49 +00:00
mov si , welcome
call print
loop:
mov si , prompt
call print
2021-05-26 17:15:44 +00:00
call read
cmp byte [ input ], 0
je loop
2021-05-26 17:43:46 +00:00
execute:
2021-05-27 18:00:50 +00:00
.help:
mov si , input
mov di , command.help
call compare
jnc .hello
call help
jmp loop
2021-05-26 17:43:46 +00:00
.hello:
2021-05-26 17:15:44 +00:00
mov si , input
2021-05-26 17:43:46 +00:00
mov di , command.hello
2021-05-26 17:15:44 +00:00
call compare
2021-05-26 17:43:46 +00:00
jnc .echo
call hello
jmp loop
.echo:
2021-05-26 17:15:44 +00:00
mov si , input
2021-05-26 17:43:46 +00:00
mov di , command.echo
2021-05-26 17:15:44 +00:00
call compare
2021-05-27 18:00:50 +00:00
jnc .keycode
2021-05-26 17:43:46 +00:00
call echo
2021-05-26 17:15:44 +00:00
jmp loop
2021-05-27 18:00:50 +00:00
.keycode:
mov si , input
mov di , command.keycode
call compare
jnc .unknown
call keycode
jmp loop
2021-05-26 17:43:46 +00:00
.unknown:
mov si , command.unknown
2021-05-26 17:15:44 +00:00
call print
jmp loop
2021-05-26 17:43:46 +00:00
;Calls
2021-05-26 14:05:49 +00:00
print:
lodsb
cmp al , 0
je .done
mov ah , 0xe
int 0x10
jmp print
.done:
ret
2021-05-27 18:00:50 +00:00
clear:
2021-05-26 17:15:44 +00:00
mov di , input
mov cx , 0x80
mov al , 0
rep stosb
2021-05-27 18:00:50 +00:00
ret
read:
call cl ear
2021-05-27 21:53:34 +00:00
mov bl , 0
mov ah , 0x3
int 0x10
mov byte [ .lastline ], dh
2021-05-26 17:15:44 +00:00
mov di , input
2021-05-26 14:05:49 +00:00
.loop:
mov ah , 0
int 0x16
2021-05-27 21:53:34 +00:00
cmp al , 0
je .loop
2021-05-26 14:05:49 +00:00
cmp al , 0xd
je .return
2021-05-26 15:25:56 +00:00
cmp al , 0x8
2021-05-26 14:05:49 +00:00
je .backspace
2021-05-27 21:53:34 +00:00
cmp bl , 0x80
2021-05-26 14:05:49 +00:00
je .loop
cmp al , 0x9
je .erase
2021-05-27 21:53:34 +00:00
cmp al , 0x20
je .space
2021-05-26 14:05:49 +00:00
.character:
mov byte [ di ], 0
mov ah , 0xe
int 0x10
stosb
2021-05-27 21:53:34 +00:00
inc bl
jmp .linecheck
2021-05-26 14:05:49 +00:00
.erase:
mov al , 0x20
jmp .character
.space:
cmp byte [ di ], 0
je .character
mov al , byte [ di ]
mov ah , 0xe
int 0x10
inc di
2021-05-27 21:53:34 +00:00
inc bl
.linecheck:
mov ah , 0x3
int 0x10
cmp dh , [ .lastline ]
jle .loop
mov byte [ .lastline ], dh
2021-05-26 14:05:49 +00:00
jmp .loop
.backspace:
2021-05-27 21:53:34 +00:00
cmp bl , 0
2021-05-26 14:05:49 +00:00
je .loop
2021-05-27 21:53:34 +00:00
mov ah , 0x3
int 0x10
cmp dl , 1
je .prevline
2021-05-26 14:05:49 +00:00
mov ah , 0xe
int 0x10
dec di
2021-05-27 21:53:34 +00:00
dec bl
jmp .loop
.prevline:
mov ah , 0x2
dec dh
mov dl , [ cpl ]
int 0x10
dec di
dec bl
2021-05-26 14:05:49 +00:00
jmp .loop
.return:
2021-05-26 15:25:56 +00:00
mov di , input.end
2021-05-27 21:53:34 +00:00
.findtrailingspace:
2021-05-26 15:25:56 +00:00
dec di
cmp byte [ di ], 0
2021-05-27 21:53:34 +00:00
je .findtrailingspace
2021-05-26 15:25:56 +00:00
cmp byte [ di ], 0x20
2021-05-27 21:53:34 +00:00
je .erasetrailingspace
2021-05-26 15:25:56 +00:00
jmp .done
2021-05-27 21:53:34 +00:00
.erasetrailingspace:
2021-05-26 15:25:56 +00:00
mov al , 0
stosb
dec di
2021-05-27 21:53:34 +00:00
jmp .findtrailingspace
2021-05-26 15:25:56 +00:00
.done:
2021-05-27 21:53:34 +00:00
mov ah , 0x2
mov dh , [ .lastline ]
int 0x10
2021-05-26 14:05:49 +00:00
mov si , newline
call print
ret
2021-05-27 21:53:34 +00:00
.lastline:
db 0
2021-05-26 14:05:49 +00:00
2021-05-26 17:15:44 +00:00
compare:
mov al , [ si ]
mov bl , [ di ]
cmp al , bl
jne .nequal
cmp al , 0
je .equal
inc si
inc di
jmp compare
.nequal:
clc
ret
.equal:
stc
ret
2021-05-27 18:00:50 +00:00
byte2hex:
call cl ear
mov di , input
mov si , .hex
mov cx , 0x2
.loop:
rol ax , 0x4
mov bx , ax
and bx , 0xf
mov bl , [ si + bx ]
mov [ di ], bl
inc di
dec cx
jnz .loop
ret
.hex:
db "0123456789abcdef"
help:
mov si , .input
call print
mov si , .commands
call print
ret
.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
.commands:
2021-05-27 21:53:34 +00:00
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
2021-05-27 18:00:50 +00:00
2021-05-26 17:43:46 +00:00
hello:
mov si , .msg
call print
ret
.msg:
db "Hello world!" , 0xd , 0xa , 0
echo:
call read
cmp byte [ input ], 0
2021-05-27 18:00:50 +00:00
je .done
mov si , input
call print
mov si , newline
call print
.done:
ret
keycode:
mov ah , 0
int 0x16
mov byte [ .scan ], ah
mov byte [ .ascii ], al
mov si , .prefix
call print
mov ah , [ .scan ]
call byte 2h ex
mov si , input
call print
mov ah , [ .ascii ]
call byte 2h ex
2021-05-26 17:43:46 +00:00
mov si , input
call print
mov si , newline
call print
ret
2021-05-27 18:00:50 +00:00
.prefix:
db "0x" , 0
.scan:
db 0
.ascii:
db 0
2021-05-26 17:43:46 +00:00
;Data
2021-05-27 21:53:34 +00:00
cpl:
db 0
2021-05-26 14:05:49 +00:00
welcome:
db 0xd , 0xa , "Welcome to EttinOS!" , 0xd , 0xa , 0xd , 0xa , 0
prompt:
db "> " , 0
2021-05-26 17:43:46 +00:00
command:
2021-05-27 18:00:50 +00:00
.help:
db "help" , 0
2021-05-26 17:43:46 +00:00
.hello:
db "hello" , 0
.echo:
db "echo" , 0
2021-05-27 18:00:50 +00:00
.keycode:
db "keycode" , 0
2021-05-26 17:43:46 +00:00
.unknown:
db "Unknown command" , 0xd , 0xa , 0
2021-05-26 14:05:49 +00:00
newline:
db 0xd , 0xa , 0
2021-05-26 15:25:56 +00:00
input:
2021-05-26 17:15:44 +00:00
times 0x80 db 0
2021-05-26 15:25:56 +00:00
.end:
db 0