Initial Commit

This commit is contained in:
2023-12-21 22:13:56 +01:00
commit a346d66879
14 changed files with 340 additions and 0 deletions
+13
View File
@@ -0,0 +1,13 @@
# Bootloader
nasm -fbin src/boot.asm -o build/boot.bin
nasm -fbin src/filetable.asm -o build/filetable.bin
cat build/main.bin build/filetable.bin > build/bootloader.bin
# Kernel
nasm -fbin src/kernel.asm -o build/kernel.bin
# Final binary
cat build/bootloader.bin build/kernel.bin > build/os.bin
# Run QEMU
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.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
rm -rf build/*
+60
View File
@@ -0,0 +1,60 @@
[org 0x7c00]
[bits 16]
[global start]
start:
; Setup
xor ax, ax
mov es, ax
mov ds, ax
mov bp, 0x9000
mov sp, bp
; Read filetable from disk
mov bx, FILETAB_LOC ; Filetable location in memory
mov es, bx
xor bx, bx
mov ah, 2 ; Read from disk
mov al, 1 ; Read 1 sector
mov ch, 0 ; Cylinder
mov dh, 0 ; Head
mov cl, 2 ; Sector
int 0x13 ; INT 0x13 - Disk operations
jc readFail ; CF will be set if the read fails
; Read filetable from disk
mov bx, KERNEL_LOC ; Filetable location in memory
mov es, bx
xor bx, bx
mov ah, 2 ; Read from disk
mov al, 2 ; Read 2 sectors
mov ch, 0 ; Cylinder
mov dh, 0 ; Head
mov cl, 3 ; Sector
int 0x13 ; INT 0x13 - Disk operations
jc readFail ; CF will be set if the read fails
; Setup segmentation
mov ax, KERNEL_LOC
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
; Far jump to the kernel
jmp KERNEL_LOC:0x0
readFail:
cli
hlt
FILETAB_LOC equ 0x1000
KERNEL_LOC equ 0x2000
times 510-($-$$) db 0
dw 0xaa55
View File
+8
View File
@@ -0,0 +1,8 @@
; Simple Filetable
db "{" ; Start
db "kernel.bin:03,"
db "calc:05,"
db "coolThing:07"
db "}" ; End
times 512-($-$$) db 0
+185
View File
@@ -0,0 +1,185 @@
[bits 16]
%define ENDL 0x0a, 0x0d
start:
call resetTextMode
; Print start message
mov si, startMsg
call print
; Runs prompt
input:
mov si, prompt
call print
mov di, userInput
mov byte [inputLen], 0
.loop:
xor ax, ax ; Clear ax
int 0x16 ; Get a character
mov ah, 0x0e ; Echo back input
mov bh, 0
int 0x10
cmp al, 0x0d ; Compare with CR
je .enter
mov [di], al ; Add the input to userInput
inc di
jmp .loop
.enter:
mov al, 0x0a ; Print LF
int 0x10
mov byte [di], 0; NULL terminate userInput (Replaces CR)
mov al, [userInput]
cmp al, 'H'
je help
cmp al, 'F'
je fileBrowser
cmp al, 'G'
je graphicsTest
cmp al, 'R'
je reboot
;
; Load Program - Takes userInput and tries to run that file
;
loadProgram:
mov ax, userInput
; Get filetable into [es:di]
mov bx, FILETAB_LOC
mov es, bx
xor bx, bx
mov di, bx
repne scasb ; Scan for string at ax, in string at di
je .found
mov si, notFoundMsg
call print
jmp input
.found:
jmp input
;
; Help - Prints the help message (helpMsg)
;
help:
mov si, helpMsg
call print
jmp input
;
; File Browser
;
fileBrowser:
mov si, browserMsg
call print
; Prints the filetable
printFiletable:
mov bx, FILETAB_LOC
mov es, bx
xor bx, bx
xor cx, cx
.filetableLoop:
inc bx
mov al, [es:bx] ; Get the filetable character
cmp al, '}' ; Check for filetable end
je .done
cmp al, ':' ; Check for sector number
je .sectorLoop
cmp al, ',' ; Check for another entry
je .entryLoop
inc cx
int 0x10
jmp .filetableLoop
.sectorLoop:
cmp cx, 20
je .filetableLoop
mov al, ' '
int 0x10
inc cx
jmp .sectorLoop
.entryLoop:
xor cx, cx
mov si, newline
call print
jmp .filetableLoop
.done:
mov si, newline
call print
jmp input
;
; Graphics Mode Test
;
graphicsTest:
call resetGraphicsMode
; Test square
mov ah, 0x0c ; Write gfx pixel
mov al, 0x02 ; Green
mov bh, 0 ; Page number
mov cx, 100 ; Column number
mov dx, 100 ; Row number
int 0x10
.colLoop:
inc cx
int 0x10
cmp cx, 150
jne .colLoop
inc dx
int 0x10
mov cx, 99
cmp dx, 150
jne .colLoop
.done:
mov si, startMsg
call print
xor ax, ax
int 0x16
call resetTextMode
jmp input
;
; Reboots the OS
;
reboot: jmp 0xffff:0x0000
; ----------
; Includes
; ----------
%include "./src/print.asm"
%include "./src/screen.asm"
; --------
; Data
; --------
startMsg: db "kern.", ENDL, ENDL, 0 ; The bootup message
prompt: db "> ", 0 ; Prompt for input
newline: db ENDL, 0 ; CRLF
notFoundMsg: db "File not found!", ENDL, 0
browserMsg: db " Filename Sector ", ENDL, \
"---------- --------", ENDL, 0
helpMsg: db "Available Commands:", ENDL, \
"F - List all files", ENDL, \
"G - Graphics mode test", ENDL, \
"H - Help", ENDL, \
"R - Reboot", ENDL, 0
userInput: db 0
inputLen: db 0
FILETAB_LOC equ 0x1000
times 2*512-($-$$) db 0
+49
View File
@@ -0,0 +1,49 @@
;
; Prints a string
; si - Pointer to NULL terminated string
;
print:
pusha
mov ah, 0x0e
mov bl, 0x0f
mov bh, 0
.loop:
lodsb ; Load [si] into al; Increment si
or al, al
jz .done
int 0x10
jmp .loop
.done:
popa
ret
;
; Prints a hex value
; dx - Value to print in Hex
;
printHex:
pusha
xor cx, cx ; Init counter
.loop:
cmp cx, 4 ; Check for loop end
je .done
mov ax, dx ; Copy dx to ax
and ax, 0x000f ; Get last nibble (4 bits) of ax
add ax, '0' ; Convert number to an ASCII number (0-9)
cmp ax, '9' ; Check if number was less than 9, meaning we can use it
jle .addChar
add ax, 0x07 ; Convert to letter (A-F)
.addChar:
mov bx, hexString + 5
sub bx, cx ; Get position of current hex character
mov [bx], al
ror dx, 4 ; Rotate bits of dx (0x1a2b -> 0xb1a2)
inc cx ; Increment the counter
jmp .loop
.done:
mov si, hexString
call print
popa
ret
hexString: db "0x0000", 0
+24
View File
@@ -0,0 +1,24 @@
resetTextMode:
pusha
mov ah, 0 ; Set mode
mov al, 0x03 ; 25x80, Text mode
int 0x10
mov ah, 0x0b ; Change color/palette
mov bh, 0x00 ; Change BG color
mov bl, 0x01 ; Blue BG
int 0x10
popa
ret
resetGraphicsMode:
pusha
mov ah, 0 ; Set mode
mov al, 0x13 ; 320x200, 256 color graphics mode
int 0x10
popa
ret