All functions work now. Readline supports backspace properly. Etc

This commit is contained in:
Xnoe 2021-08-28 12:29:50 +01:00
parent ef03c94f13
commit 6e7a6bfb1e
Signed by: xnoe
GPG Key ID: 45AC398F44F0DAFE

View File

@ -1,30 +1,86 @@
[BITS 16]
mov ax, 2000h mov ax, 2000h
mov ds, ax mov ds, ax
push msg push msg
call print call print
push msg2 cmd_loop:
push cmd_prompt
call print call print
push 13 push user_cmd
push msg push 64
push msg call readline
push newline
call print
push user_cmd
push cmd_help_text
push 4
call strcmp call strcmp
cmp ax, 1 cmp ax, 1
jne _ne je cmd_help
push msg_same
call print
_ne:
jmp $ push user_cmd
push cmd_clear_text
push 5
call strcmp
cmp ax, 1
je cmd_clear
push cmd_err
call print
jmp cmd_loop
cmd_help:
push cmd_help_msg
call print
jmp cmd_loop
cmd_help_msg:
db "XnoeOS Help Dialogue", 13, 10
db "--------------------", 13, 10
db "Commands: ", 13, 10
db " - help", 13, 10
db " : Displays this message", 13, 10
db " - clear", 13, 10
db " : Clears the screen", 13, 10
db 0
cmd_clear:
mov ah, 02h
mov dh, 0
mov dl, 0
int 10h
mov ah, 0ah
mov cx, 2000
mov al, 20h
int 10h
jmp cmd_loop
data: data:
msg db "Kernel OK!", 13, 10, 0 msg db "Kernel OK!", 13, 10, 0
msg2 db "Hello, World!", 13, 10, 0 cmd_prompt db ">>> ", 0
msg_same db "They are the same", 13, 10, 0 cmd_err db "Bad Command!", 13, 10, 13, 10, 0
cmd_help_text db "help"
cmd_clear_text db "clear"
newline db 13, 10, 0
user_cmd:
times 64 db 0
; print(str)
print: print:
push bp push bp
mov bp, sp mov bp, sp
@ -42,29 +98,85 @@ print_exit:
pop bp pop bp
ret ret
; strcmp(length, str1, str2)
strcmp: strcmp:
push bp push bp
mov bp, sp mov bp, sp
mov ax, [bp + 4] mov si, [bp + 6]
lea si, [bp+6] mov di, [bp + 8]
lea di, [bp+8]
dec di
mov word [bp - 2], 0 mov word [bp - 2], 0
strcmp_loop: strcmp_loop:
inc di mov ax, [bp + 4]
inc word [bp - 2] cmp [bp - 2], ax
je strcmp_equal
lodsb lodsb
cmp [di], al cmp [di], al
jne strcmp_notequal jne strcmp_notequal
cmp [bp - 2], ax
jne strcmp_equal
inc di
inc word [bp - 2]
jmp strcmp_loop
strcmp_equal: strcmp_equal:
mov ax, 1 mov ax, 1
pop bp jmp strcmp_exit
ret
strcmp_notequal: strcmp_notequal:
mov ax, 0 mov ax, 0
strcmp_exit:
pop bp
ret
; readline(max length, buffer)
readline:
push bp
mov bp, sp
mov di, [bp + 6]
mov bx, 0
readline_loop:
mov ah, 0h
int 16h
cmp ah, 01ch
je readline_exit
cmp ah, 0eh
je readline_backspace
mov byte [di], al
inc di
inc bx
mov ah, 0eh
mov cx, 1
int 10h
mov ax, [bp + 4]
cmp bx, ax
je readline_exit
jmp readline_loop
readline_backspace:
cmp bx, 0
je readline_loop
dec di
dec bx
mov ah, 0eh
mov cx, 1
int 10h
mov ah, 0ah
mov cx, 1
mov al, 20h
int 10h
jmp readline_loop
readline_exit:
pop bp pop bp
ret ret