fs: standardize file handle routine argument to IX

Using HL/DE was awkward and error-prone.
This commit is contained in:
Virgil Dupras 2019-05-31 14:06:24 -04:00
parent 83771b538f
commit 7c191fd978
3 changed files with 57 additions and 59 deletions

View File

@ -79,10 +79,8 @@ ioGetC:
call ioInInclude
jr z, .normalmode
; We're in "include mode", read from FS
push de
ld de, IO_INCLUDE_HDL
ld ix, IO_INCLUDE_HDL
call fsGetC
pop de
cp 0x0a ; newline
jr nz, .notNewline
; We have newline. Increase lineno and return (the rest of the
@ -190,11 +188,8 @@ _ioSeek:
jp (ix)
.include:
; We're in "include mode", seek in FS
push de
ld de, IO_INCLUDE_HDL
call fsSeek
pop de
ret
ld ix, IO_INCLUDE_HDL
jp fsSeek ; returns
_ioTell:
call ioInInclude
@ -204,11 +199,8 @@ _ioTell:
jp (ix)
.include:
; We're in "include mode", tell from FS
push de
ld de, IO_INCLUDE_HDL
call fsTell
pop de
ret
ld ix, IO_INCLUDE_HDL
jp fsTell ; returns
; Sets Z according to whether we're inside an include
ioInInclude:
@ -221,7 +213,7 @@ ioInInclude:
ioOpenInclude:
call fsFindFN
ret nz
ld hl, IO_INCLUDE_HDL
ld ix, IO_INCLUDE_HDL
call fsOpen
ld a, 1
ld (IO_IN_INCLUDE), a

View File

@ -347,66 +347,84 @@ fsIsDeleted:
; below mimic blkdev's methods, but for our private mount.
fsblkGetC:
push ix
ld ix, (FS_GETC)
jp _blkCall
call _blkCall
pop ix
ret
fsblkRead:
push ix
ld ix, (FS_GETC)
jp _blkRead
call _blkRead
pop ix
ret
fsblkPutC:
push ix
ld ix, (FS_PUTC)
jp _blkCall
call _blkCall
pop ix
ret
fsblkWrite:
push ix
ld ix, (FS_PUTC)
jp _blkWrite
call _blkWrite
pop ix
ret
fsblkSeek:
push ix
push iy
ld ix, (FS_SEEK)
ld iy, (FS_TELL)
jp _blkSeek
call _blkSeek
pop iy
pop ix
ret
fsblkTell:
push ix
ld de, 0
ld ix, (FS_TELL)
jp _blkCall
call _blkCall
pop ix
ret
; *** Handling ***
; Open file at current position into handle at (HL)
; Open file at current position into handle at (IX)
fsOpen:
push bc
push hl
push de
push af
ex de, hl
; Starting pos
ld hl, FS_PTR
ld bc, 4
ldir
ld a, (FS_PTR)
ld (ix), a
ld a, (FS_PTR+1)
ld (ix+1), a
ld a, (FS_PTR+2)
ld (ix+2), a
ld a, (FS_PTR+3)
ld (ix+3), a
; Current pos
ld hl, FS_METASIZE
call writeHLinDE
inc de
inc de
ld (ix+4), l
ld (ix+5), h
; file size
ld hl, (FS_META+FS_META_FSIZE_OFFSET)
call writeHLinDE
ld (ix+6), l
ld (ix+7), h
pop af
pop de
pop hl
pop bc
ret
; Place FS blockdev at proper position for file handle in (DE).
; Place FS blockdev at proper position for file handle in (IX).
fsPlaceH:
push af
push bc
push hl
push de
pop ix
push ix
ld e, (ix)
ld d, (ix+1)
ld l, (ix+2)
@ -419,7 +437,7 @@ fsPlaceH:
.nocarry:
ld a, BLOCKDEV_SEEK_ABSOLUTE
call fsblkSeek
pop ix
pop de
pop hl
pop bc
pop af
@ -435,14 +453,13 @@ fsAdvanceH:
pop af
ret
; Sets Z according to whether file handle at (DE) is within bounds, that is, if
; Sets Z according to whether file handle at (IX) is within bounds, that is, if
; current position is smaller than file size.
fsHandleWithinBounds:
push hl
push de
; current pos in HL, adjusted to remove FS_METASIZE
call fsTell
push de
push de \ pop ix
; file size
ld e, (ix+6)
ld d, (ix+7)
@ -455,7 +472,7 @@ fsHandleWithinBounds:
.outOfBounds:
jp unsetZ ; returns
; Read a byte in handle at (DE), put it into A and advance the handle's
; Read a byte in handle at (IX), put it into A and advance the handle's
; position.
; Z is set on success, unset if handle is at the end of the file.
fsGetC:
@ -466,43 +483,32 @@ fsGetC:
xor a
jp unsetZ ; returns
.proceed:
push ix
call fsPlaceH
push ix ; Save handle in IX for fsAdvanceH
call fsblkGetC
ret nz ; error, don't advance
; increase current pos
pop ix ; recall handle in IX
jr nz, .end ; error, don't advance
call fsAdvanceH
.end:
pop ix
ret
jp fsAdvanceH ; returns
; Write byte A in handle (DE) and advance the handle's position.
; Write byte A in handle (IX) and advance the handle's position.
; Z is set on success, unset if handle is at the end of the file.
; TODO: detect end of block alloc
fsPutC:
call fsPlaceH
push ix
call fsblkPutC
; increase current pos
pop ix ; recall
call fsAdvanceH
ret
jp fsAdvanceH ; returns
; Sets position of handle (DE) to HL. This position does *not* include metadata.
; Sets position of handle (IX) to HL. This position does *not* include metadata.
; It is an offset that starts at actual data.
; Sets Z if offset is within bounds, unsets Z if it isn't.
fsSeek:
push de \ pop ix
ld a, FS_METASIZE
call addHL
ld (ix+4), l
ld (ix+5), h
ret
; Returns current position of file handle at (IX) in HL.
fsTell:
push de \ pop ix
ld l, (ix+4)
ld h, (ix+5)
ld a, FS_METASIZE

View File

@ -76,7 +76,7 @@ fopnCmd:
jr nz, .notfound
; Found!
; FS_PTR points to the file we want to open
ex de, hl ; HL now points to the file handle.
push de \ pop ix ; IX now points to the file handle.
call fsOpen
jr .end
.notfound: