Block device peripheral and SBFS file system implemented.
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
; Storage.
|
||||
;
|
||||
; The disk is a block device and nothing more. It knows numbered blocks of 256 bytes and
|
||||
; has never heard of a file, which is deliberate: a filesystem is software this machine
|
||||
; will run rather than something the host does on its behalf. A disk that understood
|
||||
; filenames would be the emulator doing the work while the machine pretended it had.
|
||||
;
|
||||
; Its buffer is one block, and like any memory a device brings, it is unreachable until
|
||||
; it is registered as a bank and gone through with the controller.
|
||||
;
|
||||
; Between writing and reading the buffer is scrubbed, so a stale copy of the message
|
||||
; sitting in it cannot make a broken read look like a working one.
|
||||
;
|
||||
; The image is made fresh for every run of the suite, so block 3 is zeroes before this
|
||||
; program touches it.
|
||||
;
|
||||
; Correct output is:
|
||||
; 00 the write worked
|
||||
; from the disk block 3 came back
|
||||
; 02 a block past the end of the image is an error, not a fault
|
||||
|
||||
#Include print.asm
|
||||
|
||||
#Program
|
||||
|
||||
start:
|
||||
; The disk's buffer becomes bank 5.
|
||||
INIA 0d5
|
||||
OUTA 0xE3
|
||||
INIA 0x20
|
||||
OUTA 0xE2
|
||||
INIA 0x03
|
||||
OUTA 0xE8
|
||||
|
||||
; Put the message into the buffer and write it to block 3.
|
||||
SETD.0 Message
|
||||
CALL aimSourceData
|
||||
CALL aimDestBuffer
|
||||
INIA 0d16
|
||||
CALL setLength
|
||||
INIA 0x01
|
||||
OUTA 0xE8
|
||||
|
||||
CALL selectBlockThree
|
||||
INIA 0x02
|
||||
OUTA 0x22 ; Write.
|
||||
INA 0x23
|
||||
CALL printByteHex
|
||||
CALL lineFeed
|
||||
|
||||
; Scrub the buffer, so what comes back has to have come off the disk.
|
||||
CALL aimDestBuffer
|
||||
INIA 0x2D ; '-' as the fill byte.
|
||||
OUTA 0xE2
|
||||
INIA 0d16
|
||||
CALL setLength
|
||||
INIA 0x02
|
||||
OUTA 0xE8 ; Fill.
|
||||
|
||||
CALL selectBlockThree
|
||||
INIA 0x01
|
||||
OUTA 0x22 ; Read.
|
||||
|
||||
; Bring the block into Data Memory and print it.
|
||||
INIA 0d5
|
||||
OUTA 0xE0
|
||||
RSTA
|
||||
OUTA 0xE1
|
||||
OUTA 0xE2
|
||||
SETD.0 Landing
|
||||
CALL aimDestData
|
||||
INIA 0d16
|
||||
CALL setLength
|
||||
INIA 0x01
|
||||
OUTA 0xE8
|
||||
|
||||
SETD.0 Landing
|
||||
CALL printString
|
||||
CALL lineFeed
|
||||
|
||||
; A block past the end of the image says so in Status rather than stopping the machine.
|
||||
; A disk that cannot read a block is an ordinary thing that happens to working programs.
|
||||
INIA 0xFF
|
||||
OUTA 0x20
|
||||
INIA 0xFF
|
||||
OUTA 0x21
|
||||
INIA 0x01
|
||||
OUTA 0x22
|
||||
INA 0x23
|
||||
CALL printByteHex
|
||||
CALL lineFeed
|
||||
HALT
|
||||
|
||||
selectBlockThree:
|
||||
RSTA
|
||||
OUTA 0x20
|
||||
INIA 0d3
|
||||
OUTA 0x21
|
||||
RET
|
||||
|
||||
aimSourceData:
|
||||
INIA 0d1
|
||||
OUTA 0xE0
|
||||
PSHD.0
|
||||
POPA
|
||||
POPB
|
||||
OUTB 0xE1
|
||||
OUTA 0xE2
|
||||
RET
|
||||
|
||||
aimDestData:
|
||||
INIA 0d1
|
||||
OUTA 0xE3
|
||||
PSHD.0
|
||||
POPA
|
||||
POPB
|
||||
OUTB 0xE4
|
||||
OUTA 0xE5
|
||||
RET
|
||||
|
||||
aimDestBuffer:
|
||||
INIA 0d5
|
||||
OUTA 0xE3
|
||||
RSTA
|
||||
OUTA 0xE4
|
||||
OUTA 0xE5
|
||||
RET
|
||||
|
||||
setLength:
|
||||
PSHA
|
||||
RSTA
|
||||
OUTA 0xE6
|
||||
POPA
|
||||
OUTA 0xE7
|
||||
RET
|
||||
|
||||
#Data
|
||||
|
||||
Message:
|
||||
"from the disk"
|
||||
|
||||
Landing:
|
||||
#Reserve 0d20
|
||||
Reference in New Issue
Block a user