diff --git a/boot.asm b/boot.asm index a56f08c..faeb6ec 100644 --- a/boot.asm +++ b/boot.asm @@ -22,12 +22,26 @@ start_boot_process: mov r0, 0 ; booting from disk id 0 jmp 0x00000800 +; load the boot sector of the romdisk and jump to it +; inputs: +; none +; outputs: +; none (returns if romdisk is not bootable) +start_boot_process_from_romdisk: ; read sector 0 to 0x800 - out r1, 0x00000800 - out r0, 0 + mov r0, 0 + mov r1, 4 + mov r2, 0x00000800 + call read_sector + + ; check for the bootable magic bytes + cmp [0x000009FC], 0x523C334C + ifnz ret ; now clean up and jump to the loaded binary call boot_cleanup + mov rsp, SYSTEM_STACK ; reset stack pointer + mov r0, 4 ; booting from disk id 4 jmp 0x00000800 ; clean up the system's state before jumping to the loaded binary diff --git a/disk.asm b/disk.asm index 1e6c98e..41e6625 100644 --- a/disk.asm +++ b/disk.asm @@ -10,6 +10,9 @@ const TEMP_SECTOR_BUF: 0x01FFF808 ; outputs: ; none read_sector: + cmp.8 r1, 4 + ifz jmp read_romdisk_sector + push r3 push r4 @@ -23,6 +26,49 @@ read_sector: pop r3 ret +; read a sector from the romdisk into the specified memory buffer +; inputs: +; r0: sector number +; r2: sector buffer (512 bytes) +; outputs: +; none +read_romdisk_sector: + push r0 + push r1 + push r2 + + ; source pointer + mul r0, 512 + add r0, romdisk_image + + ; destination pointer + mov r1, r2 + + ; copy 512 bytes + mov r2, 512 + + call copy_memory_bytes + + pop r2 + pop r1 + pop r0 + ret + +; check if a RYFS image is included as a romdisk +; inputs: +; none +; outputs: +; Z flag: set if available, reset if not +is_romdisk_available: + push r0 + + mov r0, romdisk_image + add r0, 514 + cmp.16 [r0], 0x5952 + + pop r0 + ret + ; write a sector from the specified memory buffer ; inputs: ; r0: sector number @@ -31,6 +77,9 @@ read_sector: ; outputs: ; none write_sector: + cmp.8 r1, 4 + ifz ret + push r3 push r4 @@ -42,4 +91,4 @@ write_sector: pop r4 pop r3 - ret \ No newline at end of file + ret diff --git a/main.asm b/main.asm index 804ef34..a48a093 100644 --- a/main.asm +++ b/main.asm @@ -161,6 +161,9 @@ event_loop: cmp r0, 0 ifnz call start_boot_process + call is_romdisk_available + ifz call start_boot_process_from_romdisk + jmp event_loop get_rom_version: @@ -394,5 +397,9 @@ bottom_bar_patterns: data.32 0xFFFFFFFF data.32 0xFF674764 +romdisk_image: + #include_bin_optional "romdisk.img" +romdisk_image_end: + ; pad out to 512 KiB org.pad 0xF0080000