157 lines
3.0 KiB
NASM
157 lines
3.0 KiB
NASM
; Reading the SplitBit Filesystem.
|
|
;
|
|
; The disk this reads was made by SplitDisk, which is the other implementation of the same
|
|
; format. That is what makes this worth running: the library is being checked against
|
|
; something written by different code working from the same written specification, rather
|
|
; than against itself. If the two ever drift, this is where it shows.
|
|
;
|
|
; The cases here are the ones most likely to be wrong. across.txt is longer than a block,
|
|
; so reading it has to carry on from one to the next. Its entry, and the two after it, are
|
|
; in the second directory block, so finding it has to walk past the end of the first.
|
|
; aName22CharactersLong! fills the name field exactly, so there is no zero on the end of
|
|
; it to stop a comparison. empty.txt has no blocks at all.
|
|
;
|
|
; Correct output is:
|
|
; greeting.txt 0000 11 hello from a file
|
|
; across.txt 0002 BC ABCDEFGH...
|
|
; aName22CharactersLong! 0000 16 exactly twenty two!!!!
|
|
; empty.txt 0000 00
|
|
; absent.txt missing
|
|
|
|
#Include print.asm
|
|
#Include sbfs.asm
|
|
|
|
#Program
|
|
|
|
start:
|
|
CALL sbfsMount
|
|
BRQ mounted
|
|
SETD.0 NoMount
|
|
CALL printString
|
|
CALL lineFeed
|
|
HALT
|
|
|
|
mounted:
|
|
SETD.0 WantGreeting
|
|
CALL showFile
|
|
SETD.0 WantAcross
|
|
CALL showFile
|
|
SETD.0 WantLongName
|
|
CALL showFile
|
|
SETD.0 WantEmpty
|
|
CALL showFile
|
|
SETD.0 WantAbsent
|
|
CALL showFile
|
|
HALT
|
|
|
|
; DP0 names a file. Prints its name, what the directory says about it, and then the file
|
|
; itself. DP3 keeps the name across the calls, because it is the pointer a CALL does not
|
|
; put back.
|
|
showFile:
|
|
PSHD.0
|
|
POPD.3
|
|
CALL printString
|
|
CALL blankSpace
|
|
|
|
PSHD.3
|
|
POPD.0
|
|
CALL sbfsFind
|
|
BRQ showFound
|
|
SETD.0 Missing
|
|
CALL printString
|
|
CALL lineFeed
|
|
RET
|
|
|
|
showFound:
|
|
SETD.0 SbfsFileBlocks
|
|
LDA.0
|
|
CALL printByteHex
|
|
INCD.0
|
|
LDA.0
|
|
CALL printByteHex
|
|
CALL blankSpace
|
|
SETD.0 SbfsFileTail
|
|
LDA.0
|
|
CALL printByteHex
|
|
CALL blankSpace
|
|
|
|
SETD.1 Landing
|
|
CALL sbfsRead
|
|
BRQ showContents
|
|
SETD.0 Failed
|
|
CALL printString
|
|
CALL lineFeed
|
|
RET
|
|
|
|
; Writes out exactly as many bytes as the file has, and no more. The length is the block
|
|
; count and the tail side by side: blocks times 256 plus the tail is the same as putting
|
|
; the count in the high byte and the tail in the low one.
|
|
showContents:
|
|
SETD.0 Landing
|
|
SETD.1 SbfsFileBlocks
|
|
DPUP.1 0d01
|
|
LDA.1
|
|
SETD.1 LeftHigh
|
|
STA.1
|
|
SETD.1 SbfsFileTail
|
|
LDA.1
|
|
SETD.1 LeftLow
|
|
STA.1
|
|
|
|
showLoop:
|
|
SETD.1 LeftHigh
|
|
LDA.1
|
|
SETD.2 LeftLow
|
|
LDB.2
|
|
OR
|
|
BRQ showEnd ; Nothing left of it.
|
|
|
|
LDA.0
|
|
OUTA 0x00
|
|
INCD.0
|
|
|
|
SETD.1 LeftLow
|
|
LDA.1
|
|
DECA
|
|
STA.1
|
|
BRC showBorrow ; It went under, so the high byte owes one.
|
|
BRI showLoop
|
|
showBorrow:
|
|
SETD.1 LeftHigh
|
|
LDA.1
|
|
DECA
|
|
STA.1
|
|
BRI showLoop
|
|
|
|
showEnd:
|
|
CALL lineFeed
|
|
RET
|
|
|
|
#Data
|
|
|
|
WantGreeting:
|
|
"greeting.txt"
|
|
WantAcross:
|
|
"across.txt"
|
|
WantLongName:
|
|
"aName22CharactersLong!"
|
|
WantEmpty:
|
|
"empty.txt"
|
|
WantAbsent:
|
|
"absent.txt"
|
|
|
|
NoMount:
|
|
"no mount"
|
|
Missing:
|
|
"missing"
|
|
Failed:
|
|
"failed"
|
|
|
|
LeftHigh:
|
|
0x00
|
|
LeftLow:
|
|
0x00
|
|
|
|
Landing:
|
|
#Reserve 0d1024
|