~vdupras/duskos

2a0b4df730a6991fc76475c6e016f7677b3fd981 — Virgil Dupras a month ago 0c9a2b5
fs/boot: Add FAT12 support
3 files changed, 18 insertions(+), 10 deletions(-)

M Makefile
M fs/fs/boot.fs
M fs/tests/sys/drive.fs
M Makefile => Makefile +2 -2
@@ 15,8 15,8 @@ boot.fs: $(BOOTFS_SRC)
	cat $(BOOTFS_SRC) > $@

fatfs: fs
	dd if=/dev/zero of=$@ bs=4M count=1
	mformat -d 1 -i $@ ::
	dd if=/dev/zero of=$@ bs=1M count=1
	mformat -M 512 -d 1 -i $@ ::
	mcopy -sQ -i $@ fs/* ::

.PHONY: run

M fs/fs/boot.fs => fs/fs/boot.fs +15 -7
@@ 9,8 9,7 @@
\ This unit has access to a very small set of words, that it, words implemented
\ by boot.fs as well as the "drive" protocol, which is implemented by a driver
\ that is inserted between boot.fs and this unit.
create bpb drvblksz allot
0 bpb (drv@)
create bpb 0 here (drv@) $18 allot

: BPB_BytsPerSec bpb $0b + w@ ;
: BPB_SecPerClus bpb $0d + c@ ;


@@ 25,15 24,18 @@ create bpb drvblksz allot
: FirstSectorOfCluster ( n -- sec ) 1- 1- BPB_SecPerClus * FirstDataSector + ;
: FirstRootDirSecNum BPB_RsvdSecCnt BPB_NumFATs BPB_FATSz16 * + ;
: ClusterSize BPB_SecPerClus BPB_BytsPerSec * ;
: DataSec
  BPB_TotSec16 BPB_FATSz16 BPB_NumFATs * BPB_RsvdSecCnt + RootDirSectors + - ;
: CountOfClusters DataSec BPB_SecPerClus / ;
: FAT12? CountOfClusters 4085 < ;

\ read multiple sectors in buf
: readsectors ( sec u buf -- )
  A>r swap >r swap >A begin ( buf )
    A> over (drv@) A+ drvblksz + next ( buf ) drop r>A ;

create FAT16( BPB_BytsPerSec BPB_FATSz16 * allot
here value )FAT16
: readFAT BPB_RsvdSecCnt BPB_FATSz16 FAT16( readsectors ;
create FAT( BPB_BytsPerSec BPB_FATSz16 * allot
: readFAT BPB_RsvdSecCnt BPB_FATSz16 FAT( readsectors ;

32 const DIRENTRYSZ
11 const FNAMESZ


@@ 71,10 73,16 @@ here const )fnbuf
\ Make the current dir the root
: readroot FirstRootDirSecNum RootDirSectors dirbuf( readsectors ;

: EOC? ( cluster -- f ) $fff8 and $fff8 = ;
: EOC? ( cluster -- f )
  FAT12? if $ff8 else $fff8 then tuck and = ;

\ get cluster following this one in the FAT
: nextcluster ( cluster -- nextcluster ) << FAT16( + w@ ;
: nextcluster ( cluster -- nextcluster )
  FAT12? if
    dup dup >> + ( cl off )
    FAT( + w@ ( cl ncl ) swap 1 and if 4 rshift else $fff and then
  else
    << FAT( + w@ then ;

: readcluster ( cluster dst -- )
  over << BPB_BytsPerSec BPB_FATSz16 * >= if abort" cluster out of range" then

M fs/tests/sys/drive.fs => fs/tests/sys/drive.fs +1 -1
@@ 1,5 1,5 @@
?f<< tests/harness.fs
testbegin
\ Tests for sys/ramdrive (already loaded in init.fs)
$36 8 drvseek ( a ) 8 []>str S" FAT16   " #s=
$36 8 drvseek ( a ) 8 []>str S" FAT12   " #s=
testend