All functions work now. Readline supports backspace properly. Etc
This commit is contained in:
parent
ef03c94f13
commit
6e7a6bfb1e
154
kernel.asm
154
kernel.asm
@ -1,30 +1,86 @@
|
||||
[BITS 16]
|
||||
mov ax, 2000h
|
||||
mov ds, ax
|
||||
|
||||
push msg
|
||||
call print
|
||||
|
||||
push msg2
|
||||
cmd_loop:
|
||||
push cmd_prompt
|
||||
call print
|
||||
|
||||
push 13
|
||||
push msg
|
||||
push msg
|
||||
push user_cmd
|
||||
push 64
|
||||
call readline
|
||||
|
||||
push newline
|
||||
call print
|
||||
|
||||
push user_cmd
|
||||
push cmd_help_text
|
||||
push 4
|
||||
call strcmp
|
||||
|
||||
cmp ax, 1
|
||||
jne _ne
|
||||
push msg_same
|
||||
call print
|
||||
_ne:
|
||||
je cmd_help
|
||||
|
||||
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:
|
||||
msg db "Kernel OK!", 13, 10, 0
|
||||
msg2 db "Hello, World!", 13, 10, 0
|
||||
msg_same db "They are the same", 13, 10, 0
|
||||
cmd_prompt db ">>> ", 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:
|
||||
push bp
|
||||
mov bp, sp
|
||||
@ -42,29 +98,85 @@ print_exit:
|
||||
pop bp
|
||||
ret
|
||||
|
||||
; strcmp(length, str1, str2)
|
||||
strcmp:
|
||||
push bp
|
||||
mov bp, sp
|
||||
mov ax, [bp + 4]
|
||||
lea si, [bp+6]
|
||||
lea di, [bp+8]
|
||||
dec di
|
||||
mov si, [bp + 6]
|
||||
mov di, [bp + 8]
|
||||
mov word [bp - 2], 0
|
||||
strcmp_loop:
|
||||
inc di
|
||||
inc word [bp - 2]
|
||||
mov ax, [bp + 4]
|
||||
cmp [bp - 2], ax
|
||||
je strcmp_equal
|
||||
|
||||
lodsb
|
||||
|
||||
cmp [di], al
|
||||
jne strcmp_notequal
|
||||
cmp [bp - 2], ax
|
||||
jne strcmp_equal
|
||||
|
||||
inc di
|
||||
inc word [bp - 2]
|
||||
jmp strcmp_loop
|
||||
|
||||
strcmp_equal:
|
||||
mov ax, 1
|
||||
pop bp
|
||||
ret
|
||||
jmp strcmp_exit
|
||||
strcmp_notequal:
|
||||
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
|
||||
ret
|
Loading…
x
Reference in New Issue
Block a user