From 1a6d285d2de68691a4b6b1870ad2ecd19fab1b5f Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Tue, 23 Apr 2019 10:54:56 -0400 Subject: [PATCH] fs: always read whole block meta in memory to avoid seeking --- parts/fs.asm | 83 ++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 36 deletions(-) diff --git a/parts/fs.asm b/parts/fs.asm index 49c6b21..78f0220 100644 --- a/parts/fs.asm +++ b/parts/fs.asm @@ -92,9 +92,10 @@ FS_START .equ FS_BLKSEL+2 ; below, which all assume this offset as a context. This offset is not relative ; to FS_START. It can be used directly with blkSeek. FS_PTR .equ FS_START+2 -; A place to store tmp data -FS_TMP .equ FS_PTR+2 -FS_HANDLES .equ FS_TMP+0x20 +; This variable below contain the metadata of the last block FS_PTR was moved +; to. We read this data in memory to avoid constant seek+read operations. +FS_META .equ FS_PTR+2 +FS_HANDLES .equ FS_META+0x20 FS_RAMEND .equ FS_HANDLES+(FS_HANDLE_COUNT*FS_HANDLE_SIZE) ; *** CODE *** @@ -108,9 +109,8 @@ fsBegin: ld hl, (FS_START) ld (FS_PTR), hl pop hl - call fsPlace + call fsReadMeta call fsIsValid ; sets Z - call fsPlace ret ; Change current position to the next block with metadata. If it can't (if this @@ -120,8 +120,20 @@ fsNext: call unsetZ ret +; Reads metadata at current FS_PTR and place it in FS_META. +; Returns Z according to whether the blkRead operation succeeded. +fsReadMeta: + call fsPlace + push bc + push hl + ld b, 0x20 + ld hl, FS_META + call blkRead ; Sets Z + pop hl + pop bc + ret + ; Make sure that our underlying blockdev is correcly placed. -; All other routines assumer a properly placed blkdev cursor. fsPlace: push af push hl @@ -150,28 +162,23 @@ fsAlloc: pop af ; now we want our A arg call blkPutC pop hl + call fsPlace ret ; *** Metadata *** -; Sets Z according to whether the current block is valid. +; Sets Z according to whether the current block in FS_META is valid. ; Don't call other FS routines without checking block validity first: other ; routines don't do checks. fsIsValid: push hl - ld b, 0x3 - ld hl, FS_TMP - call blkRead - jr nz, .error + push de ld a, 3 + ld hl, FS_META ld de, .magic call strncmp - jr nz, .error - ; success - jr .end ; Z is set at this point -.error: - call unsetZ -.end: + ; The result of Z is our result. + pop de pop hl ret .magic: @@ -179,25 +186,41 @@ fsIsValid: ; Return, in A, the number of allocated blocks at current position. fsAllocatedBlocks: + ld a, (FS_META+3) ret ; Return, in HL, the file size at current position. fsFileSize: + ld hl, (FS_META+4) ret ; Return HL, which points to a null-terminated string which contains the ; filename at current position. fsFileName: + ld hl, FS_META+6 + ret + +; Change name of current file to name in (HL) +fsRename: push af + push hl ; save filename for later + call fsPlace ld a, BLOCKDEV_SEEK_FORWARD ld hl, 6 call blkSeek - ld b, FS_MAX_NAME_SIZE - ld hl, FS_TMP - call blkRead + pop hl ; now we need the filename + push hl ; ... but let's preserve it for the caller +.loop: + ld a, (hl) + cp 0 + jr z, .end + call blkPutC + inc hl + jr .loop +.end: + pop hl pop af ret - ; *** Handling *** ; Open file at current position into handle at (HL) @@ -234,7 +257,8 @@ fsOnCmd: push hl call blkTell ld (FS_PTR), hl - call fsPlace + call fsReadMeta + jr nz, .error call fsIsValid jr nz, .error ; success @@ -273,21 +297,8 @@ fnewCmd: inc de call intoDE ex de, hl - push hl ; save the filename for later call fsAlloc - call fsPlace - ld a, BLOCKDEV_SEEK_FORWARD - ld hl, 6 - call blkSeek - pop hl ; now we need the filename -.loop: - ld a, (hl) - cp 0 - jr z, .end - call blkPutC - inc hl - jr .loop -.end: + call fsRename pop de pop hl xor a