fox32rom/boot.asm

58 lines
1.9 KiB
NASM

; disk booting routines
; these are only used during booting, they are not exposed via the jump table
; read disk 0 and attempt to figure out what type of disk it is, and load the correct binary into memory
; currently this only supports booting raw binaries
; inputs:
; r0: disk size (bytes)
; outputs:
; none (doesn't return)
start_boot_process:
; in the future, this will check the header for various different types of disk types
; but for now, just assume the user mounted a raw binary
; load it to 0x00000800 (immediately after the interrupt vectors) and jump
; r0 contains the size of the disk in bytes
; divide the size by 512 and add 1 to get the size in sectors
div r0, 512
inc r0
mov r31, r0
mov r0, 0 ; sector counter
mov r2, 0x00000800 ; destination pointer
mov r3, 0x80003000 ; command to read a sector from disk 0 into the sector buffer
mov r4, 0x80002000 ; command to read a byte from the sector buffer
start_boot_process_sector_loop:
out r3, r0 ; read the current sector into the sector buffer
mov r1, 0 ; byte counter
start_boot_process_byte_loop:
mov r5, r4
or r5, r1 ; or the byte read command with the current byte counter
in r5, r5 ; read the current byte into r5
mov.8 [r2], r5 ; write the byte
inc r2 ; increment the destination pointer
inc r1 ; increment the byte counter
cmp r1, 512
ifnz jmp start_boot_process_byte_loop
loop start_boot_process_sector_loop
; done loading !!!
; now clean up and jump to the loaded binary
call boot_cleanup
jmp 0x00000800
; clean up the system's state before jumping to the loaded binary
; inputs:
; none
; outputs:
; none
boot_cleanup:
; clear the background
mov r0, 0xFF000000
call fill_background
; disable the menu bar
mov r0, 0x8000031E
out r0, 0
ret