forked from crazyettin/EttinOS
Add an error message to the bootloader in case the system is not found, fix two related bugs in readstr related to movement between lines and scrolling, and tidy the code up a bit.
This commit is contained in:
parent
45a11e601f
commit
fc3a0bbbe9
5 changed files with 85 additions and 47 deletions
15
src/BOOT.ASM
15
src/BOOT.ASM
|
@ -112,6 +112,20 @@ add di, ax
|
|||
pop cx
|
||||
loop search
|
||||
|
||||
;Print an error message if the system is not found
|
||||
mov si, errormsg
|
||||
printerror:
|
||||
;Load a character
|
||||
lodsb
|
||||
;Check for the string end
|
||||
cmp al, 0x0
|
||||
je $
|
||||
;Print the character
|
||||
mov ah, 0xe
|
||||
int 0x10
|
||||
;Repeat
|
||||
jmp printerror
|
||||
|
||||
;Load the system entry
|
||||
loadfat:
|
||||
;Load CX from the stack
|
||||
|
@ -191,6 +205,7 @@ jmp 0x0:0x500
|
|||
;Data
|
||||
bootdev db 0x0
|
||||
sysfile db "SYSTEM BIN"
|
||||
errormsg db "System not found", 0xd, 0xa, 0x0
|
||||
cluster dw 0x0
|
||||
pointer dw 0x500
|
||||
|
||||
|
|
|
@ -6,35 +6,31 @@ cmpstr:
|
|||
push ax
|
||||
push bx
|
||||
|
||||
;Compare the strings
|
||||
.loop:
|
||||
|
||||
;Load characters
|
||||
;Load the current characters
|
||||
mov al, [si]
|
||||
mov bl, [di]
|
||||
|
||||
;Compare the characters
|
||||
cmp al, bl
|
||||
|
||||
;Check for difference
|
||||
jne .neq
|
||||
|
||||
;Check for the string end
|
||||
cmp al, 0x0
|
||||
je .eq
|
||||
|
||||
;Repeat
|
||||
;Repeat for the next characters
|
||||
inc si
|
||||
inc di
|
||||
jmp .loop
|
||||
|
||||
.neq:
|
||||
;Clear the carry flag
|
||||
clc
|
||||
;Set the carry flag
|
||||
.eq:
|
||||
stc
|
||||
jmp .done
|
||||
|
||||
.eq:
|
||||
;Set the carry flag
|
||||
stc
|
||||
;Clear the carry flag
|
||||
.neq:
|
||||
clc
|
||||
|
||||
.done:
|
||||
|
||||
|
|
|
@ -5,20 +5,17 @@ printstr:
|
|||
;Store the initial registers in the stack
|
||||
push ax
|
||||
|
||||
;Print the string
|
||||
.loop:
|
||||
|
||||
;Load a character
|
||||
;Load the current character
|
||||
lodsb
|
||||
|
||||
;Check for the string end
|
||||
cmp al, 0x0
|
||||
je .done
|
||||
|
||||
;Print the character
|
||||
mov ah, 0xe
|
||||
int 0x10
|
||||
|
||||
;Repeat
|
||||
;Repeat for the next character
|
||||
jmp .loop
|
||||
|
||||
.done:
|
||||
|
|
|
@ -8,10 +8,10 @@ push bx
|
|||
push cx
|
||||
push dx
|
||||
|
||||
;Setup
|
||||
;Store the input length in the stack
|
||||
mov ah, 0
|
||||
push ax
|
||||
|
||||
;Initialise the destination with spaces
|
||||
mov cx, ax
|
||||
mov al, 0x20
|
||||
|
@ -19,9 +19,8 @@ rep stosb
|
|||
pop ax
|
||||
push ax
|
||||
sub di, ax
|
||||
|
||||
;Initialise the cursor pointer
|
||||
mov bl, 0x1
|
||||
;Initialise the cursor pointer in BL and clear BH
|
||||
mov bx, 0x1
|
||||
|
||||
.loop:
|
||||
|
||||
|
@ -29,6 +28,7 @@ mov bl, 0x1
|
|||
mov ah, 0x0
|
||||
int 0x16
|
||||
|
||||
;Check for special keys and non-printing characters
|
||||
;Check for return
|
||||
cmp al, 0xd
|
||||
je .return
|
||||
|
@ -52,6 +52,7 @@ jle .loop
|
|||
cmp al, 0x7f
|
||||
je .loop
|
||||
|
||||
;Store and print a character
|
||||
.character:
|
||||
;Store the character
|
||||
stosb
|
||||
|
@ -62,26 +63,30 @@ int 0x10
|
|||
inc bl
|
||||
jmp .loop
|
||||
|
||||
.erase:
|
||||
;Replace the cursor position with a space
|
||||
.erase:
|
||||
mov al, 0x20
|
||||
jmp .character
|
||||
|
||||
;Move the cursor forward
|
||||
.space:
|
||||
call .nextchar
|
||||
inc di
|
||||
inc bl
|
||||
jmp .loop
|
||||
|
||||
;Move the cursor backward
|
||||
.backspace:
|
||||
;Check for the input beginning
|
||||
cmp bl, 0x1
|
||||
je .loop
|
||||
;Move the cursor
|
||||
call .prevchar
|
||||
dec di
|
||||
dec bl
|
||||
jmp .loop
|
||||
|
||||
;Finish reading the string
|
||||
.return:
|
||||
|
||||
;Find and remove trailing spaces
|
||||
|
@ -126,40 +131,72 @@ pop ax
|
|||
|
||||
ret
|
||||
|
||||
;Move the cursor forward
|
||||
|
||||
;Move forward within a line
|
||||
.nextchar:
|
||||
;Get the cursor position
|
||||
mov ah, 0x3
|
||||
int 0x10
|
||||
;Move from the end of a line to the beginning of the next one
|
||||
cmp dl, [cpl]
|
||||
;Check for the end of the line
|
||||
cmp dl, 0x4f
|
||||
je .nextln
|
||||
;Move forward within a line
|
||||
;Move
|
||||
inc dl
|
||||
mov ah, 0x2
|
||||
int 0x10
|
||||
ret
|
||||
|
||||
;Move to the beginning of the next line
|
||||
.nextln:
|
||||
;Check if the current line is the last on screen
|
||||
cmp dh, 0x18
|
||||
je .scroll
|
||||
;Move
|
||||
mov ah, 0x2
|
||||
inc dh
|
||||
mov dl, 0x1
|
||||
mov dl, 0x0
|
||||
int 0x10
|
||||
ret
|
||||
|
||||
;Scroll the screen up by one line
|
||||
.scroll:
|
||||
;Scroll
|
||||
mov ah, 0x6
|
||||
mov al, 0x1
|
||||
mov bh, 0x7
|
||||
mov ch, 0x0
|
||||
mov cl, 0x0
|
||||
mov dh, 0x18
|
||||
mov dl, 0x4f
|
||||
int 0x10
|
||||
;Move to the beginning of the new line
|
||||
mov ah, 0x2
|
||||
mov bh, 0x0
|
||||
mov dl, 0x0
|
||||
int 0x10
|
||||
ret
|
||||
|
||||
;Move the cursor backward
|
||||
|
||||
;Move backward within a line
|
||||
.prevchar:
|
||||
;Get the cursor position
|
||||
mov ah, 0x3
|
||||
int 0x10
|
||||
;Move from the beginning of a line to the end of the previous one
|
||||
cmp dl, 0x1
|
||||
;Check for the beginning of the line
|
||||
cmp dl, 0x0
|
||||
je .prevln
|
||||
;Move backward within a line
|
||||
;Move
|
||||
dec dl
|
||||
mov ah, 0x2
|
||||
int 0x10
|
||||
ret
|
||||
|
||||
;Move to the end of the previous line
|
||||
.prevln:
|
||||
mov ah, 0x2
|
||||
dec dh
|
||||
mov dl, [cpl]
|
||||
mov dl, 0x4f
|
||||
int 0x10
|
||||
ret
|
||||
|
|
|
@ -26,13 +26,8 @@ mov sp, stack
|
|||
add sp, 0x100
|
||||
sti
|
||||
|
||||
;Get the terminal width
|
||||
mov ah, 0xf
|
||||
int 0x10
|
||||
mov [cpl], ah
|
||||
|
||||
;Print a welcome message
|
||||
mov si, welcome
|
||||
mov si, welcomemsg
|
||||
call println
|
||||
|
||||
loop:
|
||||
|
@ -98,13 +93,11 @@ jnc .error
|
|||
call keycode
|
||||
jmp loop
|
||||
.error:
|
||||
mov si, error
|
||||
mov si, errormsg
|
||||
call println
|
||||
jmp loop
|
||||
|
||||
cpl db 0x0
|
||||
|
||||
welcome db 0xd, 0xa, "Welcome to EttinOS!", 0xd, 0xa, 0x0
|
||||
welcomemsg db 0xd, 0xa, "Welcome to EttinOS!", 0xd, 0xa, 0x0
|
||||
|
||||
prompt db "> ", 0x0
|
||||
|
||||
|
@ -115,7 +108,7 @@ cmd:
|
|||
.help db "help", 0x0
|
||||
.keycode db "keycode", 0x0
|
||||
|
||||
error db "Unknown command", 0x0
|
||||
errormsg db "Unknown command", 0x0
|
||||
|
||||
buffer times 0xff db 0x0
|
||||
|
||||
|
|
Loading…
Reference in a new issue