Added file loading

This commit is contained in:
2023-12-22 13:18:07 +01:00
parent bb4d159f8b
commit 5d787348b1
13 changed files with 153 additions and 23 deletions
+1
View File
@@ -0,0 +1 @@
./build/**
+3 -2
View File
@@ -1,13 +1,14 @@
# Bootloader # Bootloader
nasm -fbin src/boot.asm -o build/boot.bin nasm -fbin src/boot.asm -o build/boot.bin
nasm -fbin src/filetable.asm -o build/filetable.bin nasm -fbin src/filetable.asm -o build/filetable.bin
cat build/main.bin build/filetable.bin > build/bootloader.bin cat build/boot.bin build/filetable.bin > build/bootloader.bin
# Kernel # Kernel
nasm -fbin src/kernel.asm -o build/kernel.bin nasm -fbin src/kernel.asm -o build/kernel.bin
# Final binary # Final binary
cat build/bootloader.bin build/kernel.bin > build/os.bin nasm -fbin src/calc.asm -o build/calc.bin
cat build/bootloader.bin build/kernel.bin build/calc.bin > build/os.bin
# Run QEMU # Run QEMU
qemu-system-x86_64 -drive format=raw,file="./build/os.bin",index=0,media=disk -m 256M qemu-system-x86_64 -drive format=raw,file="./build/os.bin",index=0,media=disk -m 256M
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+30 -4
View File
@@ -7,16 +7,29 @@ start:
xor ax, ax xor ax, ax
mov es, ax mov es, ax
mov ds, ax mov ds, ax
mov bp, 0x9000 mov bp, 0x7c00
mov sp, bp mov sp, bp
; Save drive number
mov byte [driveNumber], dl
; Print boot message
mov si, bootMsg
call print
mov dl, byte [driveNumber]
call printHex
mov si, newline
call print
; Read filetable from disk ; Read filetable from disk
mov bx, FILETAB_LOC ; Filetable location in memory mov bx, FILETAB_LOC ; Filetable location in memory
mov es, bx mov es, bx
xor bx, bx xor bx, bx
mov ah, 2 ; Read from disk mov ah, 2 ; Read from disk
mov al, 1 ; Read 1 sector mov al, 1 ; Read 1 sector (512B)
mov dl, byte [driveNumber] ; Drive number
mov ch, 0 ; Cylinder mov ch, 0 ; Cylinder
mov dh, 0 ; Head mov dh, 0 ; Head
mov cl, 2 ; Sector mov cl, 2 ; Sector
@@ -30,7 +43,9 @@ start:
xor bx, bx xor bx, bx
mov ah, 2 ; Read from disk mov ah, 2 ; Read from disk
mov al, 2 ; Read 2 sectors mov al, 2 ; Read 2 sectors (1024B)
mov dl, byte [driveNumber] ; Drive number
mov ch, 0 ; Cylinder mov ch, 0 ; Cylinder
mov dh, 0 ; Head mov dh, 0 ; Head
mov cl, 3 ; Sector mov cl, 3 ; Sector
@@ -46,13 +61,24 @@ start:
mov gs, ax mov gs, ax
mov ss, ax mov ss, ax
mov bl, byte [driveNumber]
; Far jump to the kernel ; Far jump to the kernel
jmp KERNEL_LOC:0x0 jmp KERNEL_LOC:0x0000
readFail: readFail:
mov si, diskErrorMsg
call print
cli cli
hlt hlt
%include "./src/print.asm"
driveNumber: db 0
bootMsg: db ENDL, "Booting kern.", ENDL, "Booting from drive ", 0
diskErrorMsg: db "Disk Error!", ENDL, 0
FILETAB_LOC equ 0x1000 FILETAB_LOC equ 0x1000
KERNEL_LOC equ 0x2000 KERNEL_LOC equ 0x2000
+13
View File
@@ -0,0 +1,13 @@
[bits 16]
start:
mov si, msg
call print
cli
hlt
%include "./src/print.asm"
msg: db "Hello!", ENDL, 0
times 512-($-$$) db 0
+1 -1
View File
@@ -2,7 +2,7 @@
db "{" ; Start db "{" ; Start
db "kernel.bin:03," db "kernel.bin:03,"
db "calc:05," db "calc:05,"
db "coolThing:07" db "coolThing:06"
db "}" ; End db "}" ; End
times 512-($-$$) db 0 times 512-($-$$) db 0
+100 -15
View File
@@ -1,8 +1,9 @@
[bits 16] [bits 16]
%define ENDL 0x0a, 0x0d
start: start:
; Save the drive number from stack
mov byte [driveNumber], dl
call resetTextMode call resetTextMode
; Print start message ; Print start message
@@ -14,7 +15,7 @@ input:
mov si, prompt mov si, prompt
call print call print
mov di, userInput mov di, userInput
mov byte [inputLen], 0 xor cx, cx
.loop: .loop:
xor ax, ax ; Clear ax xor ax, ax ; Clear ax
int 0x16 ; Get a character int 0x16 ; Get a character
@@ -26,12 +27,14 @@ input:
je .enter je .enter
mov [di], al ; Add the input to userInput mov [di], al ; Add the input to userInput
inc cl
inc di inc di
jmp .loop jmp .loop
.enter: .enter:
mov al, 0x0a ; Print LF mov al, 0x0a ; Print LF
int 0x10 int 0x10
mov byte [di], 0 ; NULL terminate userInput (Replaces CR) mov byte [di], 0 ; NULL terminate userInput (Replaces CR)
mov byte [inputLen], cl
mov al, [userInput] mov al, [userInput]
cmp al, 'H' cmp al, 'H'
@@ -46,23 +49,101 @@ input:
; Load Program - Takes userInput and tries to run that file ; Load Program - Takes userInput and tries to run that file
; ;
loadProgram: loadProgram:
mov ax, userInput mov di, userInput
; Get filetable into [es:di]
mov bx, FILETAB_LOC mov bx, FILETAB_LOC
mov es, bx mov es, bx
xor bx, bx xor bx, bx ; Get [es:bx] to be start of filetable
mov di, bx .nextCh:
mov al, [es:bx]
cmp al, '}' ; Check for end of filetable
je .notFound
repne scasb ; Scan for string at ax, in string at di cmp al, [di] ; Check for starting character
je .found je .beginSearch
mov si, notFoundMsg inc bx
jmp .nextCh
.beginSearch:
push bx ; Save position, if it doesn't equal
mov byte cl, [inputLen]
.searchLoop:
mov al, [es:bx]
inc bx
cmp al, [di]
jne .restartSearch
dec cl
jz .match
inc di
jmp .searchLoop
.match:
mov al, [es:bx]
cmp al, ':' ; Check if we are at the end of a filename
je executeProgram
.restartSearch:
mov di, userInput
pop bx
inc bx
jmp .nextCh
.notFound:
mov si, fileNotFoundMsg
call print
jmp input
; Expects [es:bx] to point to a sector number folowed by a comma ('XX,' where X is 0-9)
executeProgram:
mov cl, 10 ; Get 10 to multiply with
xor al, al ; Reset al
inc bx ; Skip ':'
.getSectorNum:
mov dl, [es:bx]
inc bx
cmp dl, ',' ; Check if its end of sector number
je .load
cmp dl, '0' ; Check if it is a digit 0-9
jl .notFound
cmp dl, '9'
jg .notFound
sub dl, '0' ; Convert ASCII char to an integer
mul cl ; ax *= cl (al *= 10)
add al, dl ; al += dl
jmp .getSectorNum
.notFound:
mov si, sectorNotFoundMsg
call print
jmp input
.load:
mov cl, al ; Sector
mov ah, 0 ; Reset disk system
mov dl, byte [driveNumber]
int 0x13
mov bx, PROGRAM_LOC
mov es, bx
xor bx, bx ; [es:bx] - Place to load out program
mov ah, 2 ; Read sectors into memory
mov dl, byte [driveNumber]
mov al, 1 ; Read 1 sector
mov ch, 0 ; Cylinder
mov dh, 0 ; Head
int 0x13
jnc .loaded ; Loaded file successfully
mov si, programLoadFailMsg
call print call print
jmp input jmp input
.found: .loaded:
mov ax, PROGRAM_LOC
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
jmp input jmp PROGRAM_LOC:0x0000
; ;
; Help - Prints the help message (helpMsg) ; Help - Prints the help message (helpMsg)
@@ -163,10 +244,13 @@ reboot: jmp 0xffff:0x0000
; -------- ; --------
; Data ; Data
; -------- ; --------
driveNumber: db 0
startMsg: db "kern.", ENDL, ENDL, 0 ; The bootup message startMsg: db "kern.", ENDL, ENDL, 0 ; The bootup message
prompt: db "> ", 0 ; Prompt for input prompt: db "> ", 0 ; Prompt for input
newline: db ENDL, 0 ; CRLF fileNotFoundMsg: db "File not found!", ENDL, 0 ; User tries to load nonexistent file
notFoundMsg: db "File not found!", ENDL, 0 sectorNotFoundMsg: db "Sector not found!", ENDL, 0 ; File in an incorrect sector in filetable
programLoadFailMsg: db "Failed while loading program!", ENDL, 0 ; File load fail
browserMsg: db " Filename Sector ", ENDL, \ browserMsg: db " Filename Sector ", ENDL, \
"---------- --------", ENDL, 0 "---------- --------", ENDL, 0
@@ -177,9 +261,10 @@ helpMsg: db "Available Commands:", ENDL, \
"H - Help", ENDL, \ "H - Help", ENDL, \
"R - Reboot", ENDL, 0 "R - Reboot", ENDL, 0
userInput: db 0
inputLen: db 0 inputLen: db 0
userInput: db 0
FILETAB_LOC equ 0x1000 FILETAB_LOC equ 0x1000
PROGRAM_LOC equ 0x8000
times 2*512-($-$$) db 0 times 2*512-($-$$) db 0
+4
View File
@@ -47,3 +47,7 @@ printHex:
ret ret
hexString: db "0x0000", 0 hexString: db "0x0000", 0
; Usefull definitions
%define ENDL 0x0a, 0x0d
newline: db ENDL, 0 ; CRLF