Listing: 02-floppy-load.asm · driver 05-helpers-disk.asm
Related: Type 21h
SYSTEM FILE · Winchester load
path · How to boot
floppy
Entry: Menu F or
vector 000F → JP 1000
Unit: A=03h (floppy)
First read: LBA 0 → 2400h
(512 bytes)
Flowchart
1000
CALL 1600 ; unit 3 ready
B=FEh, A=3, C=0
CALL 1434 ; geometry + restore
HL=2400, DE=0, BC=0, A=1
CALL 14A8 ; sector 0 → 2400h
require (2402)==02h
B=(2415), C=(2442), A=3
CALL 1434 ; geometry from header
require (2442)&C0h == 80h
(67F6)=0
type = (2442)&3Fh
│
├─ ≠ 21h ── if (2400)≠0 → JP 2400h
│ else error #1
│
└─ = 21h ── 10B8 (see 03-system-file-type21.md)
- Low-level fail →
155D(hardware errors)
- Format/config fail →
11C0(system errors)
- Both return to menu (
014Fwas pushed) withA=FFh, CF=1
Steps
1. 1600 — select unit
Programs A2–A6, waits ready on
A6/A7. A=0 OK else HW error
code.
2. 1434 — geometry + restore
(2009)=A ; unit
if A≥3: ; floppy
(200E)=(C>>4)&3
search table @0831 for B ; default B=FEh
fill 2003..2008
JP 15DE ; restore
else: ; Winchester: geometry from header via HL
…
Table @0831: keys
FA–FF. Default
FE 08 03 28.
3. 14A8 — read N sectors
| Reg | Role |
|---|---|
A |
Count |
HL |
Buffer |
DE/BC |
LBA |
Uses geometry, CALL 1638 (INIR×2 from
A0 = 512 bytes), advances
H+=2 per sector.
4. Header validation
(1026–1056)
(2402)==02h else 11C0 #1 UNRECOGNIZED SYSTEM DISKETTE
B=(2415), C=(2442)
CALL 1434 A=3
(2442)&C0h==80h else 11C0 #1
type=(2442)&3Fh
JP Z,10B8 if type==21h
5. Simple boot
(1059–1063)
HL=(2400)
if HL≠0 → JP 2400h ; run image in place
else 11C0 #1
SYSTEM header @ 2400 (LBA
0)
| Off | Field |
|---|---|
+00 |
Nonzero for simple boot; execute at
2400, not through the word as a vector
target |
+02 |
02h format id |
+0B |
Config id |
+0D |
Sectors/block (type 21h) |
+11 |
Dir entry count |
+15 |
Geometry key |
+16 |
Dir LBA factor |
+1E |
11-byte SYSTEM name (type 21h) |
+42 |
Flags + type |
+4C |
Config records |
Branch summary
| Type | Path |
|---|---|
≠ 21h |
JP 2400 if word nonzero |
= 21h |
Full file load — Type 21h SYSTEM FILE |
Winchester contrast
(1066 / 1072)
Full write-up: Winchester load path · listing 06-winchester-load.asm
1066 CALL 1072 → NZ:155D / C:11C0 / else JP 2400
1072 unit 0, CALL 1600 / 15DE
read sector → 2400 via 1638 (not 14A8)
(2402)==02 else A=2 CF (UNRECOGNIZED MEDIA FORMAT)
(240B)==(09AA) else A=5 CF (CONFIGURATION MISMATCH)
CALL 1434 A=0 ; geometry from header
Primarily header + JP 2400, not the type-21h
directory loader. No (2442) / type check.
Disk helpers
| Addr | Role |
|---|---|
1600 |
Select unit |
1434 |
Geometry + restore |
14A8 |
Read N sectors |
1638 |
Low-level read + INIR |
168B |
Address regs A2–A6 |
15DE |
Restore/seek command |
155D / 11C0 |
Error printers |
Controller ports
| Port | Use |
|---|---|
A0 |
Data (512B INIR) |
A1 |
Status/sense |
A2–A5 |
Address |
A6 |
Unit control |
A7 |
Busy/ready |
A8 |
Gate |
10/13 |
Aux pulses |
Core listing outline
1000 LD A,03 / CALL 1600
1009 LD B,FE / A=3 / C=0 / CALL 1434
1015 HL=2400 / A=1 / CALL 14A8
1026 require (2402)=02
1030 B=(2415) C=(2442) A=3 / CALL 1434
1040 require (2442)&C0=80
1051 if type=21 → 10B8
1059 if (2400)≠0 → JP 2400 else error #1