diff --git a/bin/disk.img b/bin/disk.img index f3694b6..17391ce 100644 Binary files a/bin/disk.img and b/bin/disk.img differ diff --git a/bin/mbr.bin b/bin/mbr.bin index 8445126..22e6c40 100644 Binary files a/bin/mbr.bin and b/bin/mbr.bin differ diff --git a/obj/boot/mbr.bin b/obj/boot/mbr.bin index 8445126..22e6c40 100644 Binary files a/obj/boot/mbr.bin and b/obj/boot/mbr.bin differ diff --git a/src/boot/loader.s b/src/boot/loader.s index 698dd1a..c1e7c40 100644 --- a/src/boot/loader.s +++ b/src/boot/loader.s @@ -415,5 +415,5 @@ ErrorNo64: Die: cli hlt ; die nooooow - retf ; For conveniance '-' + retf KERNEL: diff --git a/src/boot/mbr.s b/src/boot/mbr.s index 9bbb40f..ce718a2 100644 --- a/src/boot/mbr.s +++ b/src/boot/mbr.s @@ -4,7 +4,7 @@ ; Authors: spectral` ; ; NeoX ; ; ; -; Desc: Bootsector for OS/K ; +; Desc: Bootsector for OS/K ; ; (x86_64 architecture only) ; ;=----------------------------------------------------------------------------=; @@ -21,7 +21,7 @@ %define BUFFER_OFF 0x0000 ;; SECOND STAGE LOADER "SEGMENT" -%define LOAD_SEG 0x0000 ; (LOAD_SEG << 4) + LOAD_OFF = 0x030000 +%define LOAD_SEG 0x0000 ; (LOAD_SEG << 4) + LOAD_OFF = 0x001000 %define LOAD_OFF 0x1000 [BITS 16] ; Ensure 16-bit code (because fuck UEFI) @@ -60,6 +60,18 @@ _start: jmp BOOT_SEG:$+5 ; Fix the cs:ip registers with a vaudou magical trip bootstrap: + jmp bootstrapper + +;; LOVELY DATA +FileNotFound db "FStage ERR : NO LOADER", 0 ; File was not found +DiskError db "FStage ERR : DISK", 0 ; Error while reading from the disk +UserData dw 0 ; Start of the data sectors +Bootdrv db 0 ; Boot Bootdrv number +filename db "LOADER BIN" ; Filename + + +;; GO ! +bootstrapper: mov ax, BOOT_SEG ; Set segments to the location of the bootloader mov ds, ax mov es, ax @@ -98,8 +110,8 @@ loadRoot: mov al, byte [fats] ; Location of root dir = (fats * fatSectors) + reservedSectors mul word [fatSectors] ; multiply by the sectors used add ax, word [reservedSectors] ; increase ax by the reserved sectors - mov word [userData], ax ; Start of user data = startOfRoot + numberOfRoot - add word [userData], cx ; Add the size and location of the root directory + mov word [UserData], ax ; Start of user data = startOfRoot + numberOfRoot + add word [UserData], cx ; Add the size and location of the root directory mov di, BUFFER_SEG ; Set the extra segment to the disk buffer mov es, di @@ -123,7 +135,7 @@ searchRoot: loop searchRoot ; Continue to search for the file ;; ERROR... - mov si, fileNotFound ; Could not find the file + mov si, FileNotFound ; Could not find the file call print ;; REBOOT @@ -196,11 +208,11 @@ readClusters: .clusterLoop: xor bh, bh xor dx, dx - push ax ; Get the cluster start = (cluster - 2) * sectorsPerCluster + userData + push ax ; Get the cluster start = (cluster - 2) * sectorsPerCluster + UserData sub ax, 2 ; Subtract 2 mov bl, byte [sectorsPerCluster] ; Sectors per cluster is a byte value mul bx ; multiply (cluster - 2) * sectorsPerCluster - add ax, word [userData] ; add the userData + add ax, word [UserData] ; add the UserData xor ch, ch mov cl, byte [sectorsPerCluster] ; Sectors to read call readSectors ; Read the sectors @@ -287,7 +299,7 @@ readSectors: int 0x13 ; Call int 13h (BIOS disk I/O) dec di ; Decrease read attempt counter jnz .attemptRead ; Try to read the sector again - mov si, diskError ; Error reading the disk :/ + mov si, DiskError ; Error reading the disk :/ call print jmp reboot .readOk: @@ -328,13 +340,6 @@ print: .done: ret -;; LOVELY DATA - fileNotFound db "FStage ERR : NO LOADER", 0 ; File was not found - diskError db "FStage ERR : DISK", 0 ; Error while reading from the disk - userData dw 0 ; Start of the data sectors - Bootdrv db 0 ; Boot Bootdrv number - filename db "LOADER BIN" ; Filename - ;; END times 510 - ($ - $$) db 0 ; Pad remainder of boot sector with zeros dw 0xaa55 ; Boot signature