fox32rom: Add read and seek routines for RYFS
This commit is contained in:
parent
3de7fd9567
commit
3583067b23
1
boot.asm
1
boot.asm
|
@ -60,7 +60,6 @@ start_boot_process_ryfs:
|
||||||
mov r0, kernel_file_name
|
mov r0, kernel_file_name
|
||||||
mov r1, 0
|
mov r1, 0
|
||||||
mov r2, KERNEL_FILE_STRUCT
|
mov r2, KERNEL_FILE_STRUCT
|
||||||
mov r3, TEMP_SECTOR_BUF
|
|
||||||
call ryfs_open
|
call ryfs_open
|
||||||
|
|
||||||
mov r0, KERNEL_FILE_STRUCT
|
mov r0, KERNEL_FILE_STRUCT
|
||||||
|
|
|
@ -54,6 +54,10 @@ menu_update_event: jmp [0xF004401C]
|
||||||
; disk jump table
|
; disk jump table
|
||||||
read_sector: jmp [0xF0045000]
|
read_sector: jmp [0xF0045000]
|
||||||
write_sector: jmp [0xF0045004]
|
write_sector: jmp [0xF0045004]
|
||||||
|
ryfs_open: jmp [0xF0045008]
|
||||||
|
ryfs_seek: jmp [0xF004500C]
|
||||||
|
ryfs_read: jmp [0xF0045010]
|
||||||
|
ryfs_read_whole_file: jmp [0xF0045014]
|
||||||
|
|
||||||
; memory copy/compare jump table
|
; memory copy/compare jump table
|
||||||
copy_memory_bytes: jmp [0xF0046000]
|
copy_memory_bytes: jmp [0xF0046000]
|
||||||
|
|
4
main.asm
4
main.asm
|
@ -192,6 +192,10 @@ get_rom_version:
|
||||||
org.pad 0xF0045000
|
org.pad 0xF0045000
|
||||||
data.32 read_sector
|
data.32 read_sector
|
||||||
data.32 write_sector
|
data.32 write_sector
|
||||||
|
data.32 ryfs_open
|
||||||
|
data.32 ryfs_seek
|
||||||
|
data.32 ryfs_read
|
||||||
|
data.32 ryfs_read_whole_file
|
||||||
|
|
||||||
; memory copy/compare jump table
|
; memory copy/compare jump table
|
||||||
org.pad 0xF0046000
|
org.pad 0xF0046000
|
||||||
|
|
186
ryfs.asm
186
ryfs.asm
|
@ -1,19 +1,18 @@
|
||||||
; RYFS routines
|
; RYFS routines
|
||||||
|
|
||||||
; open a file from a RYFS-formatted disk
|
|
||||||
; inputs:
|
|
||||||
; r0: pointer to file name string (8.3 format, for example "test txt" for test.txt)
|
|
||||||
; r1: disk ID
|
|
||||||
; r2: file struct: pointer to a blank 8 byte file struct as described below
|
|
||||||
; r3: pointer to sector buffer
|
|
||||||
; outputs:
|
|
||||||
; r0: first file sector
|
|
||||||
;
|
|
||||||
; file struct:
|
; file struct:
|
||||||
; file_disk: 1 byte
|
; file_disk: 1 byte
|
||||||
; file_first_sector: 2 bytes
|
; file_first_sector: 2 bytes
|
||||||
; file_seek_offset: 4 bytes
|
; file_seek_offset: 4 bytes
|
||||||
; file_reserved: 1 byte
|
; file_reserved: 1 byte
|
||||||
|
|
||||||
|
; open a file from a RYFS-formatted disk
|
||||||
|
; inputs:
|
||||||
|
; r0: pointer to file name string (8.3 format, for example "test txt" for test.txt)
|
||||||
|
; r1: disk ID
|
||||||
|
; r2: file struct: pointer to a blank file struct
|
||||||
|
; outputs:
|
||||||
|
; r0: first file sector
|
||||||
ryfs_open:
|
ryfs_open:
|
||||||
push r1
|
push r1
|
||||||
push r2
|
push r2
|
||||||
|
@ -26,12 +25,12 @@ ryfs_open:
|
||||||
|
|
||||||
push r0
|
push r0
|
||||||
mov r0, 1
|
mov r0, 1
|
||||||
mov r2, r3
|
mov r2, TEMP_SECTOR_BUF
|
||||||
call read_sector
|
call read_sector
|
||||||
pop r0
|
pop r0
|
||||||
|
|
||||||
; point to the file name of the first directory entry
|
; point to the file name of the first directory entry
|
||||||
mov r1, r3
|
mov r1, TEMP_SECTOR_BUF
|
||||||
add r1, 20
|
add r1, 20
|
||||||
mov r2, 11 ; compare 11 bytes
|
mov r2, 11 ; compare 11 bytes
|
||||||
ryfs_open_find_dir_entry_loop:
|
ryfs_open_find_dir_entry_loop:
|
||||||
|
@ -53,6 +52,165 @@ ryfs_open_found_dir_entry:
|
||||||
pop r1
|
pop r1
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; seek specified file to the specified offset
|
||||||
|
; inputs:
|
||||||
|
; r0: byte offset
|
||||||
|
; r1: pointer to file struct
|
||||||
|
; outputs:
|
||||||
|
; none
|
||||||
|
ryfs_seek:
|
||||||
|
push r1
|
||||||
|
|
||||||
|
add r1, 3
|
||||||
|
mov [r1], r0
|
||||||
|
|
||||||
|
pop r1
|
||||||
|
ret
|
||||||
|
|
||||||
|
; read specified number of bytes into the specified buffer
|
||||||
|
; inputs:
|
||||||
|
; r0: number of bytes to read
|
||||||
|
; r1: pointer to file struct
|
||||||
|
; r2: pointer to destination buffer
|
||||||
|
; outputs:
|
||||||
|
; none
|
||||||
|
ryfs_read:
|
||||||
|
push r0
|
||||||
|
push r1
|
||||||
|
push r2
|
||||||
|
push r3
|
||||||
|
push r4
|
||||||
|
push r5
|
||||||
|
push r10
|
||||||
|
push r11
|
||||||
|
push r12
|
||||||
|
|
||||||
|
; number_of_sectors_to_load = ceil(input r0, 506) / 506
|
||||||
|
|
||||||
|
; first, ceil the number of bytes to multiple of 506
|
||||||
|
; value_temp = value / 506
|
||||||
|
; if value % 506 != 0:
|
||||||
|
; value_temp++
|
||||||
|
; value_ceil = value_temp * 506
|
||||||
|
mov r10, r0
|
||||||
|
mov r11, r0
|
||||||
|
mov r12, 506
|
||||||
|
div r11, r12
|
||||||
|
rem r10, r12
|
||||||
|
ifnz inc r11
|
||||||
|
mul r11, r12
|
||||||
|
div r11, r12
|
||||||
|
mov r3, r11 ; r3: number_of_sectors_to_load
|
||||||
|
|
||||||
|
mov r10, r1
|
||||||
|
add r10, 3
|
||||||
|
mov r4, [r10]
|
||||||
|
|
||||||
|
mov r10, r4
|
||||||
|
mov r11, r4
|
||||||
|
mov r12, 506
|
||||||
|
div r11, r12
|
||||||
|
rem r10, r12
|
||||||
|
ifnz inc r11
|
||||||
|
mul r11, r12
|
||||||
|
div r11, r12
|
||||||
|
mov r4, r11 ; r4: number of sectors to traverse
|
||||||
|
|
||||||
|
; start_sector = traverse through linked sectors starting at file_struct.file_first_sector
|
||||||
|
|
||||||
|
push r0
|
||||||
|
push r1
|
||||||
|
push r2
|
||||||
|
mov r10, r1
|
||||||
|
; read the file's first sector into the temp buffer
|
||||||
|
movz.8 r1, [r10] ; file_disk
|
||||||
|
inc r10
|
||||||
|
movz.16 r0, [r10] ; file_first_sector
|
||||||
|
mov r31, r4
|
||||||
|
ryfs_read_traverse_sectors_loop:
|
||||||
|
mov r2, TEMP_SECTOR_BUF
|
||||||
|
call read_sector
|
||||||
|
mov r4, r0
|
||||||
|
add r2, 2 ; point to next sector number
|
||||||
|
movz.16 r0, [r2] ; load next sector number
|
||||||
|
cmp r31, 0 ; if we started at zero, then don't attempt to loop
|
||||||
|
ifnz loop ryfs_read_traverse_sectors_loop
|
||||||
|
pop r2
|
||||||
|
pop r1
|
||||||
|
pop r0
|
||||||
|
|
||||||
|
; r4: start_sector
|
||||||
|
|
||||||
|
; total_bytes_remaining = input r0
|
||||||
|
; this_sector = start_sector
|
||||||
|
; for range 0..number_of_sectors_to_load:
|
||||||
|
; load this_sector into temporary buffer
|
||||||
|
; bytes_to_load = if total_bytes_remaining >= 506
|
||||||
|
; 506
|
||||||
|
; else:
|
||||||
|
; total_bytes_remaining
|
||||||
|
; for range 0..bytes_to_load:
|
||||||
|
; load byte from temporary buffer into destination buffer
|
||||||
|
; this_sector = this_sector.next
|
||||||
|
|
||||||
|
mov r10, r0 ; r10: total_bytes_remaining
|
||||||
|
ryfs_read_sector_loop:
|
||||||
|
push r0
|
||||||
|
push r1
|
||||||
|
push r2
|
||||||
|
; read this sector into the temp buffer
|
||||||
|
mov r0, r4
|
||||||
|
movz.8 r1, [r1] ; file_disk
|
||||||
|
mov r2, TEMP_SECTOR_BUF
|
||||||
|
call read_sector
|
||||||
|
pop r2
|
||||||
|
pop r1
|
||||||
|
pop r0
|
||||||
|
|
||||||
|
; r11: bytes_to_load
|
||||||
|
cmp r10, 506
|
||||||
|
ifgteq mov r11, 506
|
||||||
|
iflt mov r11, r10
|
||||||
|
|
||||||
|
push r0
|
||||||
|
push r1
|
||||||
|
push r2
|
||||||
|
|
||||||
|
; calculate the seek offset
|
||||||
|
mov r12, r1
|
||||||
|
add r12, 3
|
||||||
|
mov r5, [r12]
|
||||||
|
rem r5, 506
|
||||||
|
|
||||||
|
; copy the sector data to the destination buffer
|
||||||
|
mov r0, TEMP_SECTOR_BUF
|
||||||
|
add r0, 6
|
||||||
|
add r0, r5 ; add the seek offset
|
||||||
|
mov r1, r2
|
||||||
|
mov r2, r11
|
||||||
|
call copy_memory_bytes
|
||||||
|
pop r2
|
||||||
|
pop r1
|
||||||
|
pop r0
|
||||||
|
|
||||||
|
dec r10
|
||||||
|
ifnz jmp ryfs_read_sector_loop
|
||||||
|
|
||||||
|
; file_struct.file_seek_offset += input r0
|
||||||
|
add r1, 3
|
||||||
|
add [r1], r0
|
||||||
|
|
||||||
|
pop r12
|
||||||
|
pop r11
|
||||||
|
pop r10
|
||||||
|
pop r5
|
||||||
|
pop r4
|
||||||
|
pop r3
|
||||||
|
pop r2
|
||||||
|
pop r1
|
||||||
|
pop r0
|
||||||
|
ret
|
||||||
|
|
||||||
; read a whole file into the specified buffer
|
; read a whole file into the specified buffer
|
||||||
; FIXME: this will always load a multiple of 506 bytes, even if the file is smaller
|
; FIXME: this will always load a multiple of 506 bytes, even if the file is smaller
|
||||||
; inputs:
|
; inputs:
|
||||||
|
@ -60,12 +218,6 @@ ryfs_open_found_dir_entry:
|
||||||
; r1: pointer to destination buffer
|
; r1: pointer to destination buffer
|
||||||
; outputs:
|
; outputs:
|
||||||
; none
|
; none
|
||||||
;
|
|
||||||
; file struct:
|
|
||||||
; file_disk: 1 byte
|
|
||||||
; file_first_sector: 2 bytes
|
|
||||||
; file_seek_offset: 4 bytes
|
|
||||||
; file_reserved: 1 byte
|
|
||||||
ryfs_read_whole_file:
|
ryfs_read_whole_file:
|
||||||
push r0
|
push r0
|
||||||
push r1
|
push r1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user