fox32rom/ryfs.asm

112 lines
2.6 KiB
NASM

; 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_disk: 1 byte
; file_first_sector: 2 bytes
; file_seek_offset: 4 bytes
; file_reserved: 1 byte
ryfs_open:
push r1
push r2
push r10
; r10: pointer to file struct entry
mov r10, r2
mov.8 [r10], r1 ; write file_disk
inc r10
push r0
mov r0, 1
mov r2, r3
call read_sector
pop r0
; point to the file name of the first directory entry
mov r1, r3
add r1, 20
mov r2, 11 ; compare 11 bytes
ryfs_open_find_dir_entry_loop:
call compare_memory_bytes
ifz jmp ryfs_open_found_dir_entry
add r1, 16 ; point to the file name in the next directory entry
jmp ryfs_open_find_dir_entry_loop ; FIXME: this never returns if the file wasn't found
ryfs_open_found_dir_entry:
sub r1, 4 ; point to first sector of this file
mov.16 [r10], [r1] ; write file_first_sector
add r10, 2
mov [r10], 0 ; write file_seek_offset
inc r10
mov.8 [r10], 0 ; write file_reserved
movz.16 r0, [r1]
pop r10
pop r2
pop r1
ret
; read a whole file into the specified buffer
; FIXME: this will always load a multiple of 506 bytes, even if the file is smaller
; inputs:
; r0: pointer to file struct
; r1: pointer to destination buffer
; outputs:
; 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:
push r0
push r1
push r2
push r10
push r11
mov r10, r0
mov r11, r1
; read the first sector into the temp buffer
movz.8 r1, [r0] ; file_disk
inc r0
movz.16 r0, [r0] ; file_first_sector
ryfs_read_whole_file_sector_loop:
mov r2, TEMP_SECTOR_BUF
call read_sector
; copy the sector data to the destination buffer
mov r0, TEMP_SECTOR_BUF
add r0, 6
mov r1, r11
mov r2, 506
call copy_memory_bytes
; check to see if this is the last sector
; FIXME: if this is the last sector, it should respect the sector size field in the header
sub r0, 4
cmp.16 [r0], 0
ifz jmp ryfs_read_whole_file_last_sector
; there are more sectors left, load them
movz.16 r0, [r0] ; sector number
mov r1, [r10] ; file_disk
add r11, 506
jmp ryfs_read_whole_file_sector_loop
ryfs_read_whole_file_last_sector:
pop r11
pop r10
pop r2
pop r1
pop r0
ret