Add open to the VFS

This commit is contained in:
pjht 2023-11-05 10:34:11 -06:00
parent 75754cfb7f
commit f3530d5528
Signed by: pjht
GPG Key ID: 7B5F6AFBEC7EE78E
3 changed files with 135 additions and 15 deletions

View File

@ -74,9 +74,43 @@ mount_mb_read_done:
ld a, b ; Loop if there is no message
cp 0
jp nz, mount_loop
ld a, (0xA001)
ld c, a
mount_done:
; Set up an open message to the VFS for "/test"
ld hl, (mailbox_num)
ld (0xA000), hl
ld a, 0x2 ; Open operation
ld (0xA002), a
ld a, 0x2F ; '/'
ld (0xA003), a
ld a, 0x74 ; 't'
ld (0xA004), a
ld a, 0x65 ; 'e'
ld (0xA005), a
ld a, 0x73 ; 's'
ld (0xA006), a
ld a, 0x74 ; 't'
ld (0xA007), a
ld a, 0x0 ; '\0'
ld (0xA008), a
push de
push bc
ld de, 2 ; Get the mailbox number for the VFS
call proc_map_get
open_pmg_done:
pop bc
pop de
ld ix, 0x0000 ; Send the message
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:
halt
mailbox_num: .ds.b 2

View File

@ -82,13 +82,18 @@ call mb_send
jp msg_loop
open:
jp z, operation_done
halt
ld a, 0xAA
ld (0xB000), a
ld a, 0x55
ld (0xB001), a
jp operation_done
read:
jp z, operation_done
jp operation_done
mount:
jp z, operation_done
jp operation_done

101
vfs.z80
View File

@ -114,15 +114,13 @@ mount:
ld a, (mount_count)
ld l, 0x0
ld h, a
ld de, data_mount_offset
add hl, de
ld de, 0x9000
ld de, 0x9000 + data_mount_offset
add hl, de
push hl
pop de
push de
ld hl, 0xB003
ld bc, 252
ld bc, 0xFC
ldir
; FS type at 0xB1FF
ld a, (fs_count)
@ -141,21 +139,27 @@ jp mount_loop1_done
add hl, de
djnz mount_loop1
mount_loop1_done:
; hl -> pointer to fs type info
; top of stack -> pointer to open mount info slot
ld de, 14
add hl, de
pop ix
ld de, 252
; hl -> pointer to byte 15 of fs type info
; ix -> pointer to open mount info slot
ld de, 0xFD
add ix, de
; ix -> pointer to offset 0xFD of mount info
; fs info word starting at 0xE -> mount info word starting at 0xFD
ld e, (hl)
inc hl
ld d, (hl)
ld (ix), e
ld (ix+1), d
push ix
ld hl, (fs_mailbox_num)
ld (0x8000), hl
ld a, 0x2
ld (0x8002), a
push ix
push de
ld hl, 0xB0FF
ld de, 0x8003
@ -175,10 +179,9 @@ ld a, b ; Loop if there is no message
cp 0
jp nz, mount_wait_loop
pop ix
; response byte 1 -> mount info byte at offset 0xFF
ld a, (0x8000)
ld (ix+2), a
ld a, (0x8001)
ld (ix+3), a
ld a, (mount_count)
inc a
ld (mount_count), a
@ -192,21 +195,99 @@ ld a, (iy)
ld b, a
ld a, (ix)
cp b
jp nz, vfsstrcmp_loopend
cp 0
ret z
jp nz, vfsstrcmp_loopend
inc ix
inc iy
jp vfsstrcmp_loop
vfsstrcmp_loopend:
ld a, (ix)
cp 0
ret z
ld a, (iy)
ld b, a
ld a, (ix)
sub b
ret
; TODO open
open:
; Scan mountpoints for largest prefix matching path
ld hl, data_mount_offset + 0x9000
ld bc, 0
ld de, 0
open_mount_scan:
ld a, (hl)
cp 0
jp z, open_mount_scan_done
push hl
pop ix
ld iy, 0xB003
push bc
call vfsstrcmp
pop bc
cp 0
jp nz, open_no_prefix
push hl
pop de
call strlen
open_no_prefix:
ld a, h
inc a
ld h, a
ld l, 0
jp open_mount_scan
open_mount_scan_done:
; Send open request to FS w/ path-prefix and mount ID
ld hl, 0xB003
add hl, bc
push de
; mountpoint path -> 0x8003-0x8103 (exclusive end)
ld de, 0x8003
ld bc, 0x100
ldir
pop de
; mount info byte 0xFF -> 0x8103
ld e, 0xFF
ld a, (de)
ld (0x8103), a
; imm 0x0 -> 0x8002
ld a, 0x0
ld (0x8002), a
; fs_mailbox_num (16bit) -> 0x8000,0x8001
ld hl, 0x8000
ld bc, (fs_mailbox_num)
ld (hl), c
inc hl
ld (hl), b
; mount info word 0xFD -> hl
ld e, 0xFD
ld a, (de)
ld l, a
inc de
ld a, (de)
ld h, a
push hl
ld a, (send_page_addr)
ld c, a
ld de, (send_page_addr+1)
ld ix, 0x0
call mb_send
; Get request back, pass on to caller (add in alt MB id support?)
open_wait_loop:
call yield
ld hl, (fs_mailbox_num)
call mb_read ; Read a message
ld a, b ; Loop if there is no message
cp 0
jp nz, open_wait_loop
pop hl
ld (0xB002), hl
; word at 0x8000 -> 0xB000
ld a, (0x8000)
ld (0xB000), a
ld a, (0x8001)
ld (0xB001), a
jp operation_done