.global libvfs_init ; Pointer to message frame in HL ; Physical address of message frame in C:DE ; Clobbers A, BC, DE, HL, IX libvfs_init: ld (msg_frame_ptr), hl ld a, c ld (msg_frame_phys), a ld (msg_frame_phys+1), de call get_free_mailbox ; Initialize a mailbox ld (mailbox_num), hl ret .global libvfs_register_fs ; Registers a FS with the VFS ; Mailbox in HL, pointer to name in IX ; Clobbers A, BC, DE, HL, IX, IY libvfs_register_fs: push hl ld iy, (msg_frame_ptr) ld hl, (mailbox_num) ld (iy), l ld (iy+1), h ld a, 0x0 ; Register FS operation ld (iy+2), a ld bc, 7 push ix pop hl ld d, iyh ld e, 0x3 call strcpy pop hl ld (iy+0x11), l ld (iy+0x12), h ld de, 2 ; Get the mailbox number for the VFS call proc_map_get pmg_done: ld a, (msg_frame_phys) ld c, a ld de, (msg_frame_phys+1) ld ix, 0x0000 call mb_send reg_fs_loop: call yield loop_yield_done: ld hl, (mailbox_num) call mb_read ; Read a message reg_fs_mb_read_done: ld a, b ; Loop if there is no message cp 0 jp nz, reg_fs_loop ret .global libvfs_mount ; Mounts a FS ; Device string in BC ; Path string in DE ; FS name string in HL ; Clobbers A, BC, DE, HL, IX, IY libvfs_mount: push hl push bc push de ld iy, (msg_frame_ptr) ld hl, (mailbox_num) ld (iy), l ld (iy+1), h ld a, 0x1 ; Mount operation ld (iy+2), a ld d, iyh ld e, 0x3 pop hl call strcpy ld d, iyh ld e, 0xFF pop hl call strcpy ld d, iyh inc d ld e, 0xFF pop hl call strcpy ld de, 2 ; Get the mailbox number for the VFS call proc_map_get mount_pmg_done: ; Send the message ld a, (msg_frame_phys) ld c, a ld de, (msg_frame_phys+1) ld ix, 0x0000 call mb_send mount_loop: call yield mount_loop_yield_done: ld hl, (mailbox_num) call mb_read ; Read a message mount_mb_read_done: ld a, b ; Loop if there is no message cp 0 jp nz, mount_loop mount_done: ret .global libvfs_open ; Opens a file ; Path in HL ; Pointer to 4-byte buffer in DE (file info saved there) ; FD returned in DE, MBID of FS in HL ; Clobbers A, BC, DE, HL, IX, IY libvfs_open: push de push hl ld iy, (msg_frame_ptr) ld hl, (mailbox_num) ld (iy), l ld (iy+1), h ld a, 0x2 ; Open operation ld (iy+2), a ld d, iyh ld e, 0x3 pop hl call strcpy ld de, 2 ; Get the mailbox number for the VFS call proc_map_get open_pmg_done: ; Send the message ld a, (msg_frame_phys) ld c, a ld de, (msg_frame_phys+1) ld ix, 0x0000 call mb_send open_loop: call yield open_loop_yield_done: ld hl, (mailbox_num) call mb_read ; Read a message open_mb_read_done: ld a, b ; Loop if there is no message cp 0 jp nz, open_loop open_done: ld hl, (msg_frame_ptr) pop de ld bc, 4 ldir ret .global libvfs_read ; Reads data from an open file ; Pointer to file struct in HL ; Data length in BC ; Offset in DE ; Buffer returned in HL ; BUFFER INVALIDATED WHEN MESSAGE IS NEXT SENT ; WITH FRAME GIVEN ON INIT libvfs_read: push hl ld iy, (msg_frame_ptr) ld hl, (mailbox_num) ld (iy), l ld (iy+1), h pop hl ld a, 0x1 ; Read operation ld (iy+2), a ld a, (hl) ld (iy+3), c inc hl ld a, (hl) ld (iy+4), b inc hl ld (iy+5), e ld (iy+6), d ld (iy+7), c ld (iy+8), b ; Send the message ld c, (hl) inc hl ld b, (hl) push bc pop hl ld a, (msg_frame_phys) ld c, a ld de, (msg_frame_phys+1) ld ix, 0x0000 call mb_send read_loop: call yield read_loop_yield_done: ld hl, (mailbox_num) call mb_read ; Read a message read_mb_read_done: ld a, b ; Loop if there is no message cp 0 jp nz, read_loop read_done: ld hl, (msg_frame_ptr) ret .bss mailbox_num: .ds.b 2 msg_frame_ptr: .ds.b 2 msg_frame_phys: .ds.b 3