fs: further adjust to previous blkdev refactoring
Previous refacoring broke all seek/tell within fs. fs handles now lost the responsibility to keep track of current position. It's blkdev's job.
This commit is contained in:
parent
ae028e3a86
commit
c18d42f08b
@ -31,11 +31,10 @@
|
|||||||
; parseHex
|
; parseHex
|
||||||
; parseHexPair
|
; parseHexPair
|
||||||
; blkSel
|
; blkSel
|
||||||
|
; blkSet
|
||||||
; fsFindFN
|
; fsFindFN
|
||||||
; fsOpen
|
; fsOpen
|
||||||
; fsGetC
|
; fsGetC
|
||||||
; fsSeek
|
|
||||||
; fsTell
|
|
||||||
; cpHLDE
|
; cpHLDE
|
||||||
; parseArgs
|
; parseArgs
|
||||||
; _blkGetC
|
; _blkGetC
|
||||||
|
@ -46,8 +46,10 @@
|
|||||||
.equ IO_SAVED_POS IO_OUT_BLK+BLOCKDEV_SIZE
|
.equ IO_SAVED_POS IO_OUT_BLK+BLOCKDEV_SIZE
|
||||||
; File handle for included source
|
; File handle for included source
|
||||||
.equ IO_INCLUDE_HDL IO_SAVED_POS+2
|
.equ IO_INCLUDE_HDL IO_SAVED_POS+2
|
||||||
|
; blkdev for include file
|
||||||
|
.equ IO_INCLUDE_BLK IO_INCLUDE_HDL+FS_HANDLE_SIZE
|
||||||
; see ioPutBack below
|
; see ioPutBack below
|
||||||
.equ IO_PUTBACK_BUF IO_INCLUDE_HDL+FS_HANDLE_SIZE
|
.equ IO_PUTBACK_BUF IO_INCLUDE_BLK+BLOCKDEV_SIZE
|
||||||
.equ IO_IN_INCLUDE IO_PUTBACK_BUF+1
|
.equ IO_IN_INCLUDE IO_PUTBACK_BUF+1
|
||||||
.equ IO_PC IO_IN_INCLUDE+1
|
.equ IO_PC IO_IN_INCLUDE+1
|
||||||
; Current lineno in top-level file
|
; Current lineno in top-level file
|
||||||
@ -64,6 +66,9 @@ ioInit:
|
|||||||
xor a
|
xor a
|
||||||
ld (IO_PUTBACK_BUF), a
|
ld (IO_PUTBACK_BUF), a
|
||||||
ld (IO_IN_INCLUDE), a
|
ld (IO_IN_INCLUDE), a
|
||||||
|
ld de, IO_INCLUDE_BLK
|
||||||
|
ld hl, _ioIncBlk
|
||||||
|
call blkSet
|
||||||
jp ioResetCounters
|
jp ioResetCounters
|
||||||
|
|
||||||
ioGetC:
|
ioGetC:
|
||||||
@ -73,8 +78,8 @@ ioGetC:
|
|||||||
call ioInInclude
|
call ioInInclude
|
||||||
jr z, .normalmode
|
jr z, .normalmode
|
||||||
; We're in "include mode", read from FS
|
; We're in "include mode", read from FS
|
||||||
ld ix, IO_INCLUDE_HDL
|
ld ix, IO_INCLUDE_BLK
|
||||||
call fsGetC
|
call _blkGetC
|
||||||
cp 0x0a ; newline
|
cp 0x0a ; newline
|
||||||
jr nz, .notNewline
|
jr nz, .notNewline
|
||||||
; We have newline. Increase lineno and return (the rest of the
|
; We have newline. Increase lineno and return (the rest of the
|
||||||
@ -182,8 +187,8 @@ _ioSeek:
|
|||||||
jp _blkSeek
|
jp _blkSeek
|
||||||
.include:
|
.include:
|
||||||
; We're in "include mode", seek in FS
|
; We're in "include mode", seek in FS
|
||||||
ld ix, IO_INCLUDE_HDL
|
ld ix, IO_INCLUDE_BLK
|
||||||
jp fsSeek ; returns
|
jp _blkSeek ; returns
|
||||||
|
|
||||||
_ioTell:
|
_ioTell:
|
||||||
call ioInInclude
|
call ioInInclude
|
||||||
@ -193,8 +198,8 @@ _ioTell:
|
|||||||
jp _blkTell
|
jp _blkTell
|
||||||
.include:
|
.include:
|
||||||
; We're in "include mode", tell from FS
|
; We're in "include mode", tell from FS
|
||||||
ld ix, IO_INCLUDE_HDL
|
ld ix, IO_INCLUDE_BLK
|
||||||
jp fsTell ; returns
|
jp _blkTell ; returns
|
||||||
|
|
||||||
; Sets Z according to whether we're inside an include
|
; Sets Z according to whether we're inside an include
|
||||||
ioInInclude:
|
ioInInclude:
|
||||||
@ -213,6 +218,9 @@ ioOpenInclude:
|
|||||||
ld (IO_IN_INCLUDE), a
|
ld (IO_IN_INCLUDE), a
|
||||||
ld hl, 0
|
ld hl, 0
|
||||||
ld (IO_INC_LINENO), hl
|
ld (IO_INC_LINENO), hl
|
||||||
|
xor a
|
||||||
|
ld ix, IO_INCLUDE_BLK
|
||||||
|
call _blkSeek
|
||||||
cp a ; ensure Z
|
cp a ; ensure Z
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -229,3 +237,10 @@ ioLineNo:
|
|||||||
pop af
|
pop af
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
_ioIncGetC:
|
||||||
|
ld ix, IO_INCLUDE_HDL
|
||||||
|
jp fsGetC
|
||||||
|
|
||||||
|
_ioIncBlk:
|
||||||
|
.dw _ioIncGetC, unsetZ
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@ is configured to start at `0xe00`
|
|||||||
> fopn 0 hello.asm ; open file in handle 0
|
> fopn 0 hello.asm ; open file in handle 0
|
||||||
> zasm 1 3 ; assemble opened file and spit result in mmap
|
> zasm 1 3 ; assemble opened file and spit result in mmap
|
||||||
> bsel 3 ; select mmap
|
> bsel 3 ; select mmap
|
||||||
|
> mptr e000 ; set memptr to mmap's beginning
|
||||||
> peek 5
|
> peek 5
|
||||||
210890CD3C ; looking good
|
210890CD3C ; looking good
|
||||||
> mptr 4200 ; hello.asm is configured to run from 0x4200
|
> mptr 4200 ; hello.asm is configured to run from 0x4200
|
||||||
|
@ -58,7 +58,7 @@ blkSel:
|
|||||||
|
|
||||||
ld hl, blkDevTbl
|
ld hl, blkDevTbl
|
||||||
or a ; cp 0
|
or a ; cp 0
|
||||||
jr z, .afterloop ; index is zero? don't loop
|
jr z, .end ; index is zero? don't loop
|
||||||
push bc ; <|
|
push bc ; <|
|
||||||
ld b, a ; |
|
ld b, a ; |
|
||||||
.loop: ; |
|
.loop: ; |
|
||||||
@ -66,7 +66,19 @@ blkSel:
|
|||||||
call addHL ; |
|
call addHL ; |
|
||||||
djnz .loop ; |
|
djnz .loop ; |
|
||||||
pop bc ; <|
|
pop bc ; <|
|
||||||
.afterloop:
|
.end:
|
||||||
|
call blkSet
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop af
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Setup blkdev handle in (DE) using routines at (HL).
|
||||||
|
blkSet:
|
||||||
|
push af
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
|
||||||
; Write GETC
|
; Write GETC
|
||||||
push hl ; <|
|
push hl ; <|
|
||||||
call intoHL ; |
|
call intoHL ; |
|
||||||
|
@ -86,9 +86,8 @@
|
|||||||
.equ FS_META_FNAME_OFFSET 6
|
.equ FS_META_FNAME_OFFSET 6
|
||||||
; Size in bytes of a FS handle:
|
; Size in bytes of a FS handle:
|
||||||
; * 4 bytes for starting offset of the FS block
|
; * 4 bytes for starting offset of the FS block
|
||||||
; * 2 bytes for current position relative to block's position
|
|
||||||
; * 2 bytes for file size
|
; * 2 bytes for file size
|
||||||
.equ FS_HANDLE_SIZE 8
|
.equ FS_HANDLE_SIZE 6
|
||||||
.equ FS_ERR_NO_FS 0x5
|
.equ FS_ERR_NO_FS 0x5
|
||||||
.equ FS_ERR_NOT_FOUND 0x6
|
.equ FS_ERR_NOT_FOUND 0x6
|
||||||
|
|
||||||
@ -390,76 +389,63 @@ fsOpen:
|
|||||||
ld (ix+2), a
|
ld (ix+2), a
|
||||||
ld a, (FS_BLK+7)
|
ld a, (FS_BLK+7)
|
||||||
ld (ix+3), a
|
ld (ix+3), a
|
||||||
; Current pos
|
|
||||||
ld hl, FS_METASIZE
|
|
||||||
ld (ix+4), l
|
|
||||||
ld (ix+5), h
|
|
||||||
; file size
|
; file size
|
||||||
ld hl, (FS_META+FS_META_FSIZE_OFFSET)
|
ld hl, (FS_META+FS_META_FSIZE_OFFSET)
|
||||||
ld (ix+6), l
|
ld (ix+4), l
|
||||||
ld (ix+7), h
|
ld (ix+5), h
|
||||||
pop af
|
pop af
|
||||||
pop hl
|
pop hl
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Place FS blockdev at proper position for file handle in (IX).
|
; Place FS blockdev at proper position for file handle in (IX) at position HL.
|
||||||
fsPlaceH:
|
fsPlaceH:
|
||||||
push af
|
push af
|
||||||
push bc
|
|
||||||
push hl
|
|
||||||
push de
|
push de
|
||||||
|
push hl
|
||||||
|
; Move fsdev to beginning of block
|
||||||
ld e, (ix)
|
ld e, (ix)
|
||||||
ld d, (ix+1)
|
ld d, (ix+1)
|
||||||
ld l, (ix+2)
|
ld l, (ix+2)
|
||||||
ld h, (ix+3)
|
ld h, (ix+3)
|
||||||
ld c, (ix+4)
|
|
||||||
ld b, (ix+5)
|
|
||||||
add hl, bc
|
|
||||||
jr nc, .nocarry
|
|
||||||
inc de
|
|
||||||
.nocarry:
|
|
||||||
ld a, BLOCKDEV_SEEK_ABSOLUTE
|
ld a, BLOCKDEV_SEEK_ABSOLUTE
|
||||||
call fsblkSeek
|
call fsblkSeek
|
||||||
pop de
|
|
||||||
|
; skip metadata
|
||||||
|
ld a, BLOCKDEV_SEEK_FORWARD
|
||||||
|
ld hl, FS_METASIZE
|
||||||
|
call fsblkSeek
|
||||||
|
|
||||||
pop hl
|
pop hl
|
||||||
pop bc
|
pop de
|
||||||
|
|
||||||
|
; go to specified pos
|
||||||
|
ld a, BLOCKDEV_SEEK_FORWARD
|
||||||
|
call fsblkSeek
|
||||||
pop af
|
pop af
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Advance file handle in (IX) by one byte
|
; Advance file handle in (IX) by one byte
|
||||||
fsAdvanceH:
|
; Sets Z according to whether HL is within bounds for file handle at (IX), that
|
||||||
push af
|
; is, if it is smaller than file size.
|
||||||
inc (ix+4)
|
fsWithinBounds:
|
||||||
jr nz, .end
|
|
||||||
inc (ix+5)
|
|
||||||
.end:
|
|
||||||
pop af
|
|
||||||
ret
|
|
||||||
|
|
||||||
; 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
|
push de
|
||||||
; current pos in HL, adjusted to remove FS_METASIZE
|
|
||||||
call fsTell
|
|
||||||
; file size
|
; file size
|
||||||
ld e, (ix+6)
|
ld e, (ix+4)
|
||||||
ld d, (ix+7)
|
ld d, (ix+5)
|
||||||
call cpHLDE
|
call cpHLDE
|
||||||
pop de
|
pop de
|
||||||
pop hl
|
|
||||||
jr nc, .outOfBounds ; HL >= DE
|
jr nc, .outOfBounds ; HL >= DE
|
||||||
cp a ; ensure Z
|
cp a ; ensure Z
|
||||||
ret
|
ret
|
||||||
.outOfBounds:
|
.outOfBounds:
|
||||||
jp unsetZ ; returns
|
jp unsetZ ; returns
|
||||||
|
|
||||||
; Read a byte in handle at (IX), put it into A and advance the handle's
|
; Read a byte in handle at (IX) at position HL and put it into A.
|
||||||
; position.
|
|
||||||
; Z is set on success, unset if handle is at the end of the file.
|
; Z is set on success, unset if handle is at the end of the file.
|
||||||
fsGetC:
|
fsGetC:
|
||||||
call fsHandleWithinBounds
|
ld a, h
|
||||||
|
ld a, l
|
||||||
|
call fsWithinBounds
|
||||||
jr z, .proceed
|
jr z, .proceed
|
||||||
; We want to unset Z, but also return 0 to ensure that a GetC that
|
; We want to unset Z, but also return 0 to ensure that a GetC that
|
||||||
; doesn't check Z doesn't end up with false data.
|
; doesn't check Z doesn't end up with false data.
|
||||||
@ -467,35 +453,14 @@ fsGetC:
|
|||||||
jp unsetZ ; returns
|
jp unsetZ ; returns
|
||||||
.proceed:
|
.proceed:
|
||||||
call fsPlaceH
|
call fsPlaceH
|
||||||
call fsblkGetC
|
jp fsblkGetC ; returns
|
||||||
ret nz ; error, don't advance
|
|
||||||
; increase current pos
|
|
||||||
jp fsAdvanceH ; returns
|
|
||||||
|
|
||||||
; Write byte A in handle (IX) 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.
|
; Z is set on success, unset if handle is at the end of the file.
|
||||||
; TODO: detect end of block alloc
|
; TODO: detect end of block alloc
|
||||||
fsPutC:
|
fsPutC:
|
||||||
call fsPlaceH
|
call fsPlaceH
|
||||||
call fsblkPutC
|
jp fsblkPutC ; returns
|
||||||
jp fsAdvanceH ; returns
|
|
||||||
|
|
||||||
; 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:
|
|
||||||
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:
|
|
||||||
ld l, (ix+4)
|
|
||||||
ld h, (ix+5)
|
|
||||||
ld a, FS_METASIZE
|
|
||||||
jp subHL ; returns
|
|
||||||
|
|
||||||
; Mount the fs subsystem upon the currently selected blockdev at current offset.
|
; Mount the fs subsystem upon the currently selected blockdev at current offset.
|
||||||
; Verify is block is valid and error out if its not, mounting nothing.
|
; Verify is block is valid and error out if its not, mounting nothing.
|
||||||
|
@ -120,6 +120,8 @@ static void io_write(int unused, uint16_t addr, uint8_t val)
|
|||||||
fsdev_ptr |= val;
|
fsdev_ptr |= val;
|
||||||
fsdev_addr_lvl = 0;
|
fsdev_addr_lvl = 0;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Out of bounds I/O write: %d / %d (0x%x)\n", addr, val, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,11 +23,10 @@
|
|||||||
jp parseHex
|
jp parseHex
|
||||||
jp parseHexPair
|
jp parseHexPair
|
||||||
jp blkSel
|
jp blkSel
|
||||||
|
jp blkSet
|
||||||
jp fsFindFN
|
jp fsFindFN
|
||||||
jp fsOpen
|
jp fsOpen
|
||||||
jp fsGetC
|
jp fsGetC
|
||||||
jp fsSeek
|
|
||||||
jp fsTell
|
|
||||||
jp cpHLDE
|
jp cpHLDE
|
||||||
jp parseArgs
|
jp parseArgs
|
||||||
jp printstr
|
jp printstr
|
||||||
|
@ -16,15 +16,14 @@
|
|||||||
.equ parseHex 0x1e
|
.equ parseHex 0x1e
|
||||||
.equ parseHexPair 0x21
|
.equ parseHexPair 0x21
|
||||||
.equ blkSel 0x24
|
.equ blkSel 0x24
|
||||||
.equ fsFindFN 0x27
|
.equ blkSet 0x27
|
||||||
.equ fsOpen 0x2a
|
.equ fsFindFN 0x2a
|
||||||
.equ fsGetC 0x2d
|
.equ fsOpen 0x2d
|
||||||
.equ fsSeek 0x30
|
.equ fsGetC 0x30
|
||||||
.equ fsTell 0x33
|
.equ cpHLDE 0x33
|
||||||
.equ cpHLDE 0x36
|
.equ parseArgs 0x36
|
||||||
.equ parseArgs 0x39
|
.equ printstr 0x39
|
||||||
.equ printstr 0x3c
|
.equ _blkGetC 0x3c
|
||||||
.equ _blkGetC 0x3f
|
.equ _blkPutC 0x3f
|
||||||
.equ _blkPutC 0x42
|
.equ _blkSeek 0x42
|
||||||
.equ _blkSeek 0x45
|
.equ _blkTell 0x45
|
||||||
.equ _blkTell 0x48
|
|
||||||
|
@ -21,11 +21,10 @@ jp findchar
|
|||||||
jp parseHex
|
jp parseHex
|
||||||
jp parseHexPair
|
jp parseHexPair
|
||||||
jp blkSel
|
jp blkSel
|
||||||
|
jp blkSet
|
||||||
jp fsFindFN
|
jp fsFindFN
|
||||||
jp fsOpen
|
jp fsOpen
|
||||||
jp fsGetC
|
jp fsGetC
|
||||||
jp fsSeek
|
|
||||||
jp fsTell
|
|
||||||
jp cpHLDE
|
jp cpHLDE
|
||||||
jp parseArgs
|
jp parseArgs
|
||||||
jp _blkGetC
|
jp _blkGetC
|
||||||
|
@ -16,14 +16,13 @@
|
|||||||
.equ parseHex 0x1e
|
.equ parseHex 0x1e
|
||||||
.equ parseHexPair 0x21
|
.equ parseHexPair 0x21
|
||||||
.equ blkSel 0x24
|
.equ blkSel 0x24
|
||||||
.equ fsFindFN 0x27
|
.equ blkSet 0x27
|
||||||
.equ fsOpen 0x2a
|
.equ fsFindFN 0x2a
|
||||||
.equ fsGetC 0x2d
|
.equ fsOpen 0x2d
|
||||||
.equ fsSeek 0x30
|
.equ fsGetC 0x30
|
||||||
.equ fsTell 0x33
|
.equ cpHLDE 0x33
|
||||||
.equ cpHLDE 0x36
|
.equ parseArgs 0x36
|
||||||
.equ parseArgs 0x39
|
.equ _blkGetC 0x39
|
||||||
.equ _blkGetC 0x3c
|
.equ _blkPutC 0x3c
|
||||||
.equ _blkPutC 0x3f
|
.equ _blkSeek 0x3f
|
||||||
.equ _blkSeek 0x42
|
.equ _blkTell 0x42
|
||||||
.equ _blkTell 0x45
|
|
||||||
|
@ -16,17 +16,16 @@
|
|||||||
.equ parseHex 0x1e
|
.equ parseHex 0x1e
|
||||||
.equ parseHexPair 0x21
|
.equ parseHexPair 0x21
|
||||||
.equ blkSel 0x24
|
.equ blkSel 0x24
|
||||||
.equ fsFindFN 0x27
|
.equ blkSet 0x27
|
||||||
.equ fsOpen 0x2a
|
.equ fsFindFN 0x2a
|
||||||
.equ fsGetC 0x2d
|
.equ fsOpen 0x2d
|
||||||
.equ fsSeek 0x30
|
.equ fsGetC 0x30
|
||||||
.equ fsTell 0x33
|
.equ cpHLDE 0x33
|
||||||
.equ cpHLDE 0x36
|
.equ parseArgs 0x36
|
||||||
.equ parseArgs 0x39
|
.equ _blkGetC 0x39
|
||||||
.equ _blkGetC 0x3c
|
.equ _blkPutC 0x3c
|
||||||
.equ _blkPutC 0x3f
|
.equ _blkSeek 0x3f
|
||||||
.equ _blkSeek 0x42
|
.equ _blkTell 0x42
|
||||||
.equ _blkTell 0x45
|
|
||||||
|
|
||||||
#include "err.h"
|
#include "err.h"
|
||||||
#include "zasm/const.asm"
|
#include "zasm/const.asm"
|
||||||
|
Loading…
Reference in New Issue
Block a user