mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-27 14:18:06 +11:00
fs: implement fsNext
This allows more than one file to be allocated. `fls` properly lists multiple files.
This commit is contained in:
parent
1a6d285d2d
commit
5eca14d49a
@ -130,6 +130,21 @@ blkPutC:
|
|||||||
ld iyl, 2
|
ld iyl, 2
|
||||||
jr _blkCall
|
jr _blkCall
|
||||||
|
|
||||||
|
; Writes B chars to blkPutC from (HL).
|
||||||
|
; Sets Z if successful, unset Z if there was an error.
|
||||||
|
blkWrite:
|
||||||
|
push hl
|
||||||
|
.loop:
|
||||||
|
ld a, (hl)
|
||||||
|
call blkPutC
|
||||||
|
jr nz, .end ; Z already unset
|
||||||
|
inc hl
|
||||||
|
djnz .loop
|
||||||
|
cp a ; ensure Z
|
||||||
|
.end:
|
||||||
|
pop hl
|
||||||
|
ret
|
||||||
|
|
||||||
; Seeks the block device in one of 5 modes, which is the A argument:
|
; Seeks the block device in one of 5 modes, which is the A argument:
|
||||||
; 0 : Move exactly to X, X being the HL argument.
|
; 0 : Move exactly to X, X being the HL argument.
|
||||||
; 1 : Move forward by X bytes, X being the HL argument
|
; 1 : Move forward by X bytes, X being the HL argument
|
||||||
|
132
parts/fs.asm
132
parts/fs.asm
@ -73,6 +73,7 @@
|
|||||||
; FS_HANDLE_COUNT
|
; FS_HANDLE_COUNT
|
||||||
; *** CONSTS ***
|
; *** CONSTS ***
|
||||||
FS_MAX_NAME_SIZE .equ 0x1a
|
FS_MAX_NAME_SIZE .equ 0x1a
|
||||||
|
FS_BLOCKSIZE .equ 0x100
|
||||||
; Size in bytes of a FS handle:
|
; Size in bytes of a FS handle:
|
||||||
; * 2 bytes for starting offset
|
; * 2 bytes for starting offset
|
||||||
; * 2 bytes for file size (we could fetch it from metadata all the time, but it
|
; * 2 bytes for file size (we could fetch it from metadata all the time, but it
|
||||||
@ -98,6 +99,10 @@ FS_META .equ FS_PTR+2
|
|||||||
FS_HANDLES .equ FS_META+0x20
|
FS_HANDLES .equ FS_META+0x20
|
||||||
FS_RAMEND .equ FS_HANDLES+(FS_HANDLE_COUNT*FS_HANDLE_SIZE)
|
FS_RAMEND .equ FS_HANDLES+(FS_HANDLE_COUNT*FS_HANDLE_SIZE)
|
||||||
|
|
||||||
|
; *** DATA ***
|
||||||
|
P_FS_MAGIC:
|
||||||
|
.db "CFS", 0
|
||||||
|
|
||||||
; *** CODE ***
|
; *** CODE ***
|
||||||
|
|
||||||
; *** Navigation ***
|
; *** Navigation ***
|
||||||
@ -117,7 +122,43 @@ fsBegin:
|
|||||||
; is the last valid block), doesn't move.
|
; is the last valid block), doesn't move.
|
||||||
; Sets Z according to whether we moved.
|
; Sets Z according to whether we moved.
|
||||||
fsNext:
|
fsNext:
|
||||||
|
push bc
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
ld a, (FS_META+3)
|
||||||
|
cp 0
|
||||||
|
jr z, .error ; if our block allocates 0 blocks, this is the
|
||||||
|
; end of the line.
|
||||||
|
call fsPlace
|
||||||
|
ld b, a ; we will seek A times
|
||||||
|
ld a, BLOCKDEV_SEEK_FORWARD
|
||||||
|
ld hl, FS_BLOCKSIZE
|
||||||
|
.loop:
|
||||||
|
call blkSeek
|
||||||
|
djnz .loop
|
||||||
|
; Good, were here. We're going to read meta from our current position.
|
||||||
|
; But before we do, let's keep a copy of FS_PTR around. We might need
|
||||||
|
; to go back.
|
||||||
|
ld de, (FS_PTR)
|
||||||
|
call blkTell ; --> HL
|
||||||
|
ld (FS_PTR), hl
|
||||||
|
call fsReadMeta
|
||||||
|
jr nz, .goback ; error! let's bail out
|
||||||
|
call fsIsValid
|
||||||
|
jr nz, .goback ; error! let's bail out
|
||||||
|
; We're good! We have a valid FS block and FS_PTR is already updated.
|
||||||
|
; Meta is already read. Nothing to do!
|
||||||
|
cp a ; ensure Z
|
||||||
|
jr .end
|
||||||
|
.goback:
|
||||||
|
ld (FS_PTR), de
|
||||||
|
call fsReadMeta
|
||||||
|
.error:
|
||||||
call unsetZ
|
call unsetZ
|
||||||
|
.end:
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Reads metadata at current FS_PTR and place it in FS_META.
|
; Reads metadata at current FS_PTR and place it in FS_META.
|
||||||
@ -133,6 +174,39 @@ fsReadMeta:
|
|||||||
pop bc
|
pop bc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; Writes metadata in FS_META at current FS_PTR.
|
||||||
|
; Returns Z according to whether the blkWrite operation succeeded.
|
||||||
|
fsWriteMeta:
|
||||||
|
call fsPlace
|
||||||
|
push bc
|
||||||
|
push hl
|
||||||
|
ld b, 0x20
|
||||||
|
ld hl, FS_META
|
||||||
|
call blkWrite ; Sets Z
|
||||||
|
pop hl
|
||||||
|
pop bc
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Initializes FS_META with "CFS" followed by zeroes
|
||||||
|
fsInitMeta:
|
||||||
|
push af
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
ld hl, P_FS_MAGIC
|
||||||
|
ld de, FS_META
|
||||||
|
ld bc, 3
|
||||||
|
ldir
|
||||||
|
xor a
|
||||||
|
ld b, 0x20-3
|
||||||
|
.loop:
|
||||||
|
ld (hl), a
|
||||||
|
inc hl
|
||||||
|
djnz .loop
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop af
|
||||||
|
ret
|
||||||
|
|
||||||
; Make sure that our underlying blockdev is correcly placed.
|
; Make sure that our underlying blockdev is correcly placed.
|
||||||
fsPlace:
|
fsPlace:
|
||||||
push af
|
push af
|
||||||
@ -144,7 +218,8 @@ fsPlace:
|
|||||||
pop af
|
pop af
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Create a new file with A blocks allocated to it.
|
; Create a new file with A blocks allocated to it and with its new name at
|
||||||
|
; (HL).
|
||||||
; Before doing so, enumerate all blocks in search of a deleted file with
|
; Before doing so, enumerate all blocks in search of a deleted file with
|
||||||
; allocated space big enough. If it does, it will either take the whole space
|
; allocated space big enough. If it does, it will either take the whole space
|
||||||
; if the allocated space asked is exactly the same, or of it isn't, split the
|
; if the allocated space asked is exactly the same, or of it isn't, split the
|
||||||
@ -153,16 +228,51 @@ fsPlace:
|
|||||||
; Places FS_PTR to the newly allocated block. You have to write the new
|
; Places FS_PTR to the newly allocated block. You have to write the new
|
||||||
; filename yourself.
|
; filename yourself.
|
||||||
fsAlloc:
|
fsAlloc:
|
||||||
push hl
|
push bc
|
||||||
|
push de
|
||||||
|
push hl ; keep HL for later
|
||||||
push af ; keep A for later
|
push af ; keep A for later
|
||||||
call fsPlace
|
; First step: find last block
|
||||||
|
call fsBegin
|
||||||
|
ret nz ; not a valid block? hum, something's wrong
|
||||||
|
.loop1:
|
||||||
|
call fsNext
|
||||||
|
jr z, .loop1
|
||||||
|
call fsPlace ; Make sure that our block device points to
|
||||||
|
; the beginning of our FS block
|
||||||
|
; We've reached last block. Two situations are possible at this point:
|
||||||
|
; 1 - the block is unallocated (0 alloc size)
|
||||||
|
; 2 - the block is allocated, but there are no next block
|
||||||
|
; So, what we need to do is check our allocation size
|
||||||
|
call fsAllocatedBlocks
|
||||||
|
cp 0
|
||||||
|
jr z, .proceed ; 0 allocated blocks? this is our block
|
||||||
|
; > 0 allocated blocks. We need to allocate further
|
||||||
|
ld b, a ; we will seek A times
|
||||||
ld a, BLOCKDEV_SEEK_FORWARD
|
ld a, BLOCKDEV_SEEK_FORWARD
|
||||||
ld hl, 3
|
ld hl, FS_BLOCKSIZE
|
||||||
|
.loop2:
|
||||||
call blkSeek
|
call blkSeek
|
||||||
|
djnz .loop2
|
||||||
|
.proceed:
|
||||||
|
; At this point, the blockdev is placed right where we want to allocate
|
||||||
|
; But first, let's prepare the FS_META we're going to write
|
||||||
|
call fsInitMeta
|
||||||
pop af ; now we want our A arg
|
pop af ; now we want our A arg
|
||||||
call blkPutC
|
ld a, 1
|
||||||
pop hl
|
ld (FS_META+3), a
|
||||||
call fsPlace
|
pop hl ; now we want our HL arg
|
||||||
|
ld de, FS_META+6
|
||||||
|
ld bc, FS_MAX_NAME_SIZE
|
||||||
|
ldir
|
||||||
|
; Good, FS_META ready. Now, let's update FS_PTR because it hasn't been
|
||||||
|
; changed yet.
|
||||||
|
call blkTell
|
||||||
|
ld (FS_PTR), hl
|
||||||
|
; Ok, now we can write our metadata
|
||||||
|
call fsWriteMeta
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; *** Metadata ***
|
; *** Metadata ***
|
||||||
@ -175,14 +285,12 @@ fsIsValid:
|
|||||||
push de
|
push de
|
||||||
ld a, 3
|
ld a, 3
|
||||||
ld hl, FS_META
|
ld hl, FS_META
|
||||||
ld de, .magic
|
ld de, P_FS_MAGIC
|
||||||
call strncmp
|
call strncmp
|
||||||
; The result of Z is our result.
|
; The result of Z is our result.
|
||||||
pop de
|
pop de
|
||||||
pop hl
|
pop hl
|
||||||
ret
|
ret
|
||||||
.magic:
|
|
||||||
.db "CFS"
|
|
||||||
|
|
||||||
; Return, in A, the number of allocated blocks at current position.
|
; Return, in A, the number of allocated blocks at current position.
|
||||||
fsAllocatedBlocks:
|
fsAllocatedBlocks:
|
||||||
@ -276,9 +384,12 @@ flsCmd:
|
|||||||
.db "fls", 0, 0, 0, 0
|
.db "fls", 0, 0, 0, 0
|
||||||
call fsBegin
|
call fsBegin
|
||||||
jr nz, .error
|
jr nz, .error
|
||||||
|
.loop:
|
||||||
call fsFileName
|
call fsFileName
|
||||||
call printstr
|
call printstr
|
||||||
call printcrlf
|
call printcrlf
|
||||||
|
call fsNext
|
||||||
|
jr z, .loop ; Z set? fsNext was successfull
|
||||||
xor a
|
xor a
|
||||||
jr .end
|
jr .end
|
||||||
.error:
|
.error:
|
||||||
@ -298,7 +409,6 @@ fnewCmd:
|
|||||||
call intoDE
|
call intoDE
|
||||||
ex de, hl
|
ex de, hl
|
||||||
call fsAlloc
|
call fsAlloc
|
||||||
call fsRename
|
|
||||||
pop de
|
pop de
|
||||||
pop hl
|
pop hl
|
||||||
xor a
|
xor a
|
||||||
|
@ -53,6 +53,7 @@ mmapPutC:
|
|||||||
call _mmapAddr
|
call _mmapAddr
|
||||||
ld (hl), a
|
ld (hl), a
|
||||||
call _mmapForward
|
call _mmapForward
|
||||||
|
cp a ; ensure Z
|
||||||
pop hl
|
pop hl
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user