; Choosing which disk the registers mean. ; ; SEVERAL DISKS ARE ONE CONTROLLER AND NOT SEVERAL DEVICES, and the instruction set is the ; reason. A port is an immediate byte inside the OUT that names it, so a program cannot ; compute one - "the disk on port 0x20 plus drive times four" is not a thing this machine can ; say. Two disks as two devices would mean a branch per access in every place the filesystem ; names a disk port. ; ; So the drive is a register, the way a floppy controller has always done it. ; ; Written by Anachronaut #Program start: ; How many are plugged in. A fact about the machine, so it is read only. INA 0x25 INIB 0d48 CCF ADD OUTQ 0x00 INIA 0d1 OUTA 0x24 INA 0x24 CCF ADD ; B is still 48, from the count above. OUTQ 0x00 ; It took. ; ---- A drive that is not there is refused, not wrapped ---- ; ; Wrapping to drive 0 would mean a program asking for a drive this machine does not have ; quietly reading the one it does. That is the same shape of fault as taking a bank number ; somebody else is using: it succeeds, and the wrong disk answers. INIA 0d9 OUTA 0x24 INA 0x24 CCF ADD OUTQ 0x00 ; Still 1. ; ---- And reading follows the selection ---- ; ; Drive 1 has no disk in it here, which is not the same as not existing: the controller has ; four drives whether or not there are disks in them, so this selects, reads, and fails. INIA 0d1 OUTA 0x24 RSTA OUTA 0x20 OUTA 0x21 INIA 0x01 OUTA 0x22 waitDisk: INA 0x23 INIB 0x01 AND BNQ waitDisk INA 0x23 INIB 0x02 AND BRQ readWorked INIA 0d78 ; 'N', which is what an empty drive should give. OUTA 0x00 BRI done readWorked: INIA 0d89 OUTA 0x00 done: INIA 0d10 OUTA 0x00 HALT #Vectors Boot start