Browse Source

fs: standardize file handle routine argument to IX

Using HL/DE was awkward and error-prone.
pull/10/head
Virgil Dupras 5 years ago
parent
commit
7c191fd978
3 changed files with 57 additions and 59 deletions
  1. +6
    -14
      apps/zasm/io.asm
  2. +50
    -44
      kernel/fs.asm
  3. +1
    -1
      kernel/fs_cmds.asm

+ 6
- 14
apps/zasm/io.asm 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


+ 50
- 44
kernel/fs.asm 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


+ 1
- 1
kernel/fs_cmds.asm 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:


Loading…
Cancel
Save