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 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
|
Loading…
x
Reference in New Issue
Block a user