From 4f2d40ca35e0e39886dc881d06256fc25ba27a77 Mon Sep 17 00:00:00 2001 From: user Date: Thu, 16 Jul 2026 12:20:57 +0200 Subject: fs rewrite stage 2: inodes + root directory (block-based, persistent) - fs.asm: a real block filesystem on the persistent block device - superblock, block/inode bitmaps, a 32-entry inode table (type, size, 8 direct block pointers -> files up to 2 KiB), and a root directory of 16-byte entries. Metadata cached in WRAMX; one-block data cache streams file/dir blocks. - same syscall interface (open/getb/putb/list/remove) -> tools unchanged; ls now enumerates until flist() runs out (16 files, was hardcoded 8). - old 8-slot WRAM FS removed; cart RAM partitioned: process banks 0-7, disk 8-11. - two register-clobber bugs fixed: alloc_block/alloc_inode returned the bitmap-block number (write_bitmap clobbers C); db_use loaded the wrong block on a transition (db_flush->write_block clobbers C) -> multi-block files broke. - verified: 10+ files, multi-block (300-byte) files, delete, and persistence across reboots. Debug 'blk' disk tool retained (fill/peek). - README: document the block filesystem. --- c/blk.c | 2 +- c/gbos.h | 1 + c/libc.s | 10 +++++++++- c/ls.c | 8 +++----- 4 files changed, 14 insertions(+), 7 deletions(-) (limited to 'c') diff --git a/c/blk.c b/c/blk.c index adf2a58..36839c0 100644 --- a/c/blk.c +++ b/c/blk.c @@ -6,7 +6,7 @@ void main(void) { if (argc >= 3 && argv[0][0] == 'f') { bfill(atou(argv[1]), atou(argv[2])); } else if (argc >= 2 && argv[0][0] == 'p') { - putu(bpeek(atou(argv[1]))); nl(); + putu(bpeek2(atou(argv[1]), argc>=3?atou(argv[2]):0)); nl(); } else { puts("usage: blk fill | blk peek "); nl(); } diff --git a/c/gbos.h b/c/gbos.h index 03a91de..6badd16 100644 --- a/c/gbos.h +++ b/c/gbos.h @@ -45,4 +45,5 @@ void yield(void); unsigned char reap(void); /* reap a finished bg job, or 0 */ void bfill(unsigned char block, unsigned char byte); /* [debug] disk */ unsigned char bpeek(unsigned char block); /* [debug] disk */ +unsigned char bpeek2(unsigned char block, unsigned char off); #endif diff --git a/c/libc.s b/c/libc.s index 5b81dca..c245bbd 100644 --- a/c/libc.s +++ b/c/libc.s @@ -200,7 +200,7 @@ _reap: rst #0x30 ret - .globl _bfill, _bpeek + .globl _bfill, _bpeek, _bpeek2 ;; void bfill(unsigned char block /*A*/, unsigned char byte /*E*/) _bfill: ld b, a @@ -210,6 +210,14 @@ _bfill: ;; unsigned char bpeek(unsigned char block /*A*/) -> A _bpeek: ld b, a + ld e, #0 ld c, #24 ; SYS_BPEEK rst #0x30 ret + ;; unsigned char bpeek2(unsigned char block /*A*/, unsigned char off /*E*/) -> A +_bpeek2: + ld b, a + ld c, #24 ; SYS_BPEEK (off already in E) + rst #0x30 + ret + diff --git a/c/ls.c b/c/ls.c index f7e5161..5d5ce43 100644 --- a/c/ls.c +++ b/c/ls.c @@ -1,9 +1,7 @@ #include "gbos.h" -/* ls: list files in the RAM filesystem. */ +/* ls: list files in the filesystem. */ void main(void) { - char name[9]; + char name[16]; unsigned char i; - for (i = 0; i < 8; i++) { - if (flist(i, name)) { name[8] = 0; puts(name); nl(); } - } + for (i = 0; flist(i, name); i++) { name[15] = 0; puts(name); nl(); } } -- cgit v1.3.1-sl0p