TRS-80 DOS - LDOS 5.3.1 for the Model I - BOOT/SYS Disassembled

Page Customization

Summary:

LDOS 5.3.1 BOOT/SYS Disassembly - Bootstrap Loader (Model I)

BOOT/SYS is the LDOS 5.3.1 bootstrap program written to a diskette by FORMAT and SYSGEN. On a Model I the boot ROM reads track 0, sector 0 of drive 0 into memory at 4200H and jumps to it. That first sector (Boot Image A, 4200H-42FFH) is the only part the ROM loads and runs. It disables interrupts, blanks the screen, selects drive 0, reads the directory record of the resident system loader from the directory cylinder, then streams that file sector by sector, interpreting it as an LDOS load module (record type 01H = load block, 02H = transfer address, others skipped) and finally jumps to the loaded system's entry point.

Disk access is done directly against the memory-mapped WD1771 floppy disk controller at 37ECH-37EFH: a Seek (command 1BH) followed by a Read Sector (command 88H), polling the status register and aborting with a Force Interrupt (0D0H) on error. If a read fails the code prints "Disk Error"; if the directory entry is not in use it prints "No System"; either way it then halts.

The BOOT/SYS file is 1792 bytes (seven 256-byte sectors, 4200H-48FFH). Beyond the ROM-loaded boot sector it also stores an alternate, drive-geometry-aware boot sector (Boot Image B), a Drive Code Table (DCT) initialization-template table, the day-of-week and month name tables used for date display, the LDOS identification and version/date string, and a secondary loader that works with a companion resident module. Only Boot Image A is executed directly by the boot ROM; the remaining sectors are described in the Remainder of File section.

Variable, Buffer and Hardware List

AddressPurpose
4200H-4202H
3 bytes
Entry padding executed on boot (NOP; CP 11H). The operand byte at 4202H (11H) doubles as the directory cylinder constant, fetched as data at 4216H.
41E0H
-
Boot stack top, set by LD SP,41E0H.
37E1H
1 byte
Drive-select latch (write). On the Model I 37E0H-37E3H are one physical latch; drive 0 = bit 0.
37ECH
1 byte
WD1771 FDC Command register (write) / Status register (read).
37EEH
1 byte
WD1771 FDC Sector register (target sector).
37EFH
1 byte
WD1771 FDC Data register (byte transfer; also holds the Seek target cylinder).
5100H-51FFH
256 bytes
Disk sector buffer. First holds the directory record, then each system-file sector as it is streamed.
5116H
2 bytes
First extent field of the loaded directory record (buffer+16H): EXT+0 = starting cylinder, EXT+1 = granule byte (bits 7-5 start granule, bits 4-0 count minus one).

Major Routine List

AddressName and Purpose
4203HBoot Entry / Initialization
Disable interrupts, set the stack, clear the screen, select drive 0, read the system loader's directory record from cylinder 17 sector 4.
4242HLoad-Record Interpreter (Main Loop)
Read a load-record type byte and dispatch: 01H load block, 02H transfer, otherwise skip; jump to the transfer address when done.
4279HGet Next File Byte
Return the next byte of the system file, reading a fresh sector into 5100H (and advancing sector/cylinder) whenever the 256-byte buffer is exhausted.
429EHPrint Control/Message String
Send an 03H-terminated string at HL to the ROM display routine 0033H.
42ACHFDC Read Sector
Seek and read one sector (cylinder D, sector E) into the buffer, with a single retry on failure.
42B4HSeek + Read Core
Program the WD1771 Sector/Data registers, issue Seek (1BH) then Read Sector (88H), transfer the bytes and check the status.
4294HBoot Failure
Print "Disk Error" or "No System", wait for the operator, and halt.

Cross-Reference Notes

Boot Image A calls only the Model I ROM (character display at 0033H and keyboard line input at 0040H). It reads the directory record of, and transfers control to, the resident LDOS system loader (documented on the SYS0/SYS page, sub-disassem-dos-ldos-m1-sys00.htm). The alternate boot (Boot Image B) and the secondary loader reference resident LDOS structures such as the Drive Control Table (DCT$, 4700H) and the sector buffer (5100H) and a companion overlay module in the 5200H-53FFH range that is not part of BOOT/SYS.

Disassembly:

4200H - Boot Sector Entry and Initialization

The Model I boot ROM loads track 0, sector 0 of drive 0 into memory at 4200H and jumps there. The code disables interrupts, sets up a stack, clears the screen, selects drive 0, and reads the system loader's directory record before streaming and launching the system.

4200
NOP 00
The Model I boot ROM reads track 0, sector 0 of drive 0 into memory beginning at 4200H and jumps to 4200H. This first byte is a No Operation; execution falls straight through into the initialization code.
4201
CP 11H FE 11
Executed harmlessly on entry as CP 11H; it compares Register A (left by the ROM boot) against 11H and the result is immediately discarded by the reinitialization that follows. The immediate operand byte at 4202H (11H) is deliberately reused later as data: it is the directory cylinder number (track 17) fetched at 4216H.
4203
DI F3
Boot Entry
DISABLE INTERRUPTS. No interrupt handlers exist yet during the boot, so maskable interrupts are turned off.
4204
LD SP,41E0H 31 E0 41
Set the Stack Pointer to 41E0H, establishing a private boot stack safely below this code and its 5100H sector buffer.
4207
LD IY,0000H FD 21 00 00
Load Register Pair IY with 0000H, clearing the index register before the system loader is entered.
420B
LD HL,42E4H 21 E4 42
Point Register Pair HL to the clear-screen control string at 42E4H (home cursor 1CH, erase-to-end-of-frame 1FH, 03H terminator).
420E
GOSUB to 429EH to send that control string to the video driver, blanking the display.
4211
LD A,01H 3E 01
Load Register A with 01H, the drive-0 select bit (bit 0) for the drive-select latch.
4213
LD (37E1H),A 32 E1 37
Store 01H (Register A) to the drive-select latch at 37E1H, selecting floppy drive 0. On the Model I the four addresses 37E0H-37E3H are one physical latch.
Model I Drive-Select Latch write: 01H (37E1H)Function Description
Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0Summary of Bits
----d3d2d1d0Drive-Select Latch (37E0H-37E3H are one physical latch)
Bit 0: 1=Drive 0 Selected
Bit 1: Drive 1 Select
Bit 2: Drive 2 Select
Bit 3: Drive 3 Select
Bit 4-7: Unused on the standard Expansion Interface
4216
LD A,(4202H) 3A 02 42
Fetch the directory cylinder number from 4202H into Register A. That byte holds 11H (decimal 17), the LDOS Model I directory track.
4219
LD D,A 57
Copy the directory cylinder (Register A = 17) into Register D, where the FDC read routine expects the target cylinder.
421A
LD E,04H 1E 04
Load Register E with 04H, the directory sector that holds the system loader's directory record.
421C
LD BC,5100H 01 00 51
Point Register Pair BC to the 5100H disk sector buffer, where the sector will be read.
421F
GOSUB to 42ACH to seek cylinder 17 (Register D) and read sector 4 (Register E) into the 5100H buffer (Register Pair BC).
4222
If the NZ FLAG is set (the read failed), JUMP to 4294H to display Disk Error and halt.
4224
LD A,(5100H) 3A 00 51
Fetch the attribute byte (DIR+00) of the directory record just read, from the start of the buffer at 5100H, into Register A.
4227
AND 10H E6 10
Isolate bit 4 of the attribute byte (Register A), the directory-entry in-use flag.
4229
LD HL,42E7H 21 E7 42
Point Register Pair HL to the No System message at 42E7H, in case the entry is empty.
422C
If the Z FLAG is set (bit 4 clear, meaning the directory entry is not in use and there is no system file), JUMP to 4297H to display No System and halt.
422E
EXX D9
Switch to the ALTERNATE register set, which holds the file-streaming position (cylinder, sector, and in-buffer index) across calls to the byte reader.
422F
LD HL,(5116H) 2A 16 51
Load Register Pair HL from 5116H, the first extent field of the directory record in the buffer: Register L receives EXT+0 (the file's starting cylinder) and Register H receives EXT+1 (the granule byte; bits 7-5 = starting granule, bits 4-0 = granule count minus one).
4232
LD D,L 55
Copy the starting cylinder (Register L) into Register D of the alternate set, the streaming cylinder pointer.
4233
LD A,H 7C
Copy the granule byte (Register H) into Register A to extract the starting granule.
4234
RLCA 07
Rotate Register A left (bit 7 into bit 0). With the next two rotates this moves the starting-granule field (bits 7-5) down toward bits 2-0.
4235
RLCA 07
Rotate Register A left again (second of three).
4236
RLCA 07
Rotate Register A left again (third of three); the starting-granule number now sits in bits 2-0.
4237
AND 07H E6 07
Mask Register A with 07H to isolate the 3-bit starting granule number.
4239
LD H,A 67
Save the starting granule number (Register A) in Register H.
423A
RLCA 07
Rotate Register A left (multiply the granule number by 2).
423B
RLCA 07
Rotate Register A left again (granule number now multiplied by 4).
423C
ADD A,H 84
Add Register H (the granule number) to Register A, giving granule number times 5. A Model I 5.25-inch single-density granule is 5 sectors, so this converts the starting granule into a starting sector offset within the cylinder.
423D
LD E,A 5F
Store the starting sector offset (Register A) into Register E of the alternate set, the streaming sector pointer.
423E
LD BC,51FFH 01 FF 51
Load Register Pair BC of the alternate set with 51FFH. Register C is the in-buffer index, primed so the first INC C wraps it to 00H (buffer 5100H) and forces an initial sector read.
4241
EXX D9
Switch back to the MAIN register set to run the load-record interpreter.
4242
Main Loop
GOSUB to 4279H to read the next byte of the system file. That byte is an LDOS load-record type code, returned in Register A.
4245
DEC A 3D
Decrement Register A to test for record type 01H (a load block); Register A becomes 0 (Z set) when the type was 01H.
4246
If the NZ FLAG is set (the type was not 01H), JUMP to 425FH to test the remaining record types.
4248
Type 01H load block: GOSUB to 4279H to read the record length byte into Register A.
424B
LD B,A 47
Copy the record length (Register A) into Register B, the byte counter.
424C
GOSUB to 4279H to read the load-address low byte into Register A.
424F
LD L,A 6F
Store the load-address low byte (Register A) into Register L.
4250
DEC B 05
Decrement Register B to account for the address-low byte already consumed from the record length.
4251
GOSUB to 4279H to read the load-address high byte into Register A.
4254
LD H,A 67
Store the load-address high byte (Register A) into Register H; Register Pair HL is now the destination address for this block.
4255
DEC B 05
Decrement Register B again; Register B now holds the count of data bytes (record length minus the two address bytes).
4256
Loop Start
GOSUB to 4279H to read one data byte into Register A.
4259
LD (HL),A 77
Store the data byte (Register A) at the destination address in Register Pair HL.
425A
INC HL 23
INCrement Register Pair HL to advance the destination pointer.
425B
DECrement Register B and LOOP BACK to 4256H while data bytes remain. Loop End
425D
LOOP BACK to 4242H to read the next load record.
425F
DEC A 3D
Decrement Register A a second time to test for record type 02H (the transfer/entry record); Register A becomes 0 (Z set) when the type was 02H.
4260
If the Z FLAG is set (type 02H), JUMP to 426DH to take the transfer address.
4262
Any other record type (copyright/comment, etc.): GOSUB to 4279H to read the record length into Register A.
4265
LD B,A 47
Copy the record length (Register A) into Register B, the skip counter.
4266
Loop Start
GOSUB to 4279H to read and discard one byte of the record.
4269
DECrement Register B and LOOP BACK to 4266H until the whole record is skipped. Loop End
426B
LOOP BACK to 4242H for the next record.
426D
Transfer record: GOSUB to 4279H to read and discard the record length byte (which is 02H).
4270
GOSUB to 4279H to read the entry-address low byte into Register A.
4273
LD L,A 6F
Store the entry-address low byte (Register A) into Register L.
4274
GOSUB to 4279H to read the entry-address high byte into Register A.
4277
LD H,A 67
Store the entry-address high byte (Register A) into Register H; Register Pair HL is now the loaded system's entry point.
4278
JP (HL) E9
JUMP to the address in Register Pair HL, handing control to the freshly loaded system loader. The boot's job is done.
4279
EXX D9
Get Next File Byte
Switch to the ALTERNATE register set, which holds the streaming position: Register D = cylinder, Register E = sector, Register C = in-buffer index (Register Pair BC points into the 5100H buffer).
427A
INC C 0C
INCrement Register C, advancing the in-buffer index through 00H..FFH.
427B
If the NZ FLAG is set (the buffer is not yet exhausted), JUMP to 4291H to fetch the byte.
427D
PUSH BC C5
The buffer is exhausted. Save the buffer index (Register Pair BC) on the stack.
427E
LD A,01H 3E 01
Load Register A with 01H (the drive-0 select bit).
4280
LD (37E1H),A 32 E1 37
Store 01H (Register A) to the drive-select latch at 37E1H, re-selecting drive 0 before the read (the latch is volatile).
4283
GOSUB to 42ACH to read the next sector (cylinder in Register D, sector in Register E) into the 5100H buffer.
4286
If the NZ FLAG is set (the read failed), JUMP to 4294H to display Disk Error and halt.
4288
POP BC C1
Restore the buffer index (Register Pair BC) from the stack.
4289
INC E 1C
INCrement Register E to advance to the next sector number for the following read.
428A
LD A,E 7B
Copy the sector number (Register E) into Register A.
428B
SUB 0AH D6 0A
SUBtract 0AH (10) from Register A to test whether the sector number has reached 10 (sectors are numbered 0-9 per track).
428D
If the NZ FLAG is set (sector number is still below 10), JUMP to 4291H to fetch the byte.
428F
LD E,A 5F
Store 0 (Register A) into Register E, wrapping the sector number back to 0.
4290
INC D 14
INCrement Register D to step to the next cylinder.
4291
LD A,(BC) 0A
Fetch the file byte from the buffer at Register Pair BC (5100H plus the in-buffer index) into Register A.
4292
EXX D9
Switch back to the MAIN register set.
4293
RET C9
RETURN with the file byte in Register A.
4294
LD HL,42F3H 21 F3 42
Boot Failure
Point Register Pair HL to the Disk Error message at 42F3H.
4297
GOSUB to 429EH to display the message at Register Pair HL.
429A
GOSUB to the Model I ROM at 0040H to wait for the operator (keyboard line input).
429D
HALT 76
HALT the processor; the boot has failed and cannot continue.
429E
PUSH HL E5
Print Control/Message String
Save the string pointer (Register Pair HL) on the stack.
429F
LD A,(HL) 7E
Fetch the next character of the string from Register Pair HL into Register A.
42A0
CP 03H FE 03
Compare Register A against 03H, the end-of-string terminator.
42A2
If the Z FLAG is set (terminator reached), JUMP to 42AAH to restore and return.
42A4
GOSUB to the Model I ROM display routine at 0033H to show the character in Register A at the cursor.
42A7
INC HL 23
INCrement Register Pair HL to the next character.
42A8
LOOP BACK to 429FH for the next character.
42AA
POP HL E1
Restore the string pointer (Register Pair HL) from the stack.
42AB
RET C9
RETURN to the caller.
42AC
PUSH BC C5
FDC Read Sector
Save the caller's buffer pointer (Register Pair BC) on the stack.
42AD
GOSUB to 42B4H to seek the cylinder in Register D and read the sector in Register E into the buffer; it returns the Z FLAG set on success.
42B0
POP HL E1
Recover the caller's buffer pointer from the stack into Register Pair HL.
42B1
RET Z C8
If the Z FLAG is set (the read succeeded), RETURN to the caller.
42B2
LD B,H 44
The read failed. Copy the buffer pointer high byte (Register H) into Register B.
42B3
LD C,L 4D
Copy the buffer pointer low byte (Register L) into Register C, rebuilding Register Pair BC = buffer, then fall through into 42B4H to retry the seek and read once.
42B4
LD (37EEH),DE ED 53 EE 37
Seek + Read Core
Store Register Pair DE to 37EEH: Register E goes to the FDC Sector Register (37EEH = target sector) and Register D goes to the FDC Data Register (37EFH = the Seek target cylinder). The WD1771 seeks to whatever cylinder is in the Data Register.
42B8
LD HL,37ECH 21 EC 37
Point Register Pair HL to the FDC Command/Status Register at 37ECH.
42BB
LD (HL),1BH 36 1B
Write 1BH to the FDC Command Register at Register Pair HL (37ECH), issuing a Seek to the cylinder held in the Data Register.
1771 FDC Command: 1BH (00011011)Function Description
Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0Summary of Bits
0001hVr1r0Command=Seek
Bit 7-4: Command Code (0001)
h: 1=Enable Head Load/Settle, 0=No delay
V: 1=Verify Destination Track ID, 0=No verification
r1, r0: Stepping Motor Rate (11=15ms)
42BD
EX (SP),HL E3
Exchange Register Pair HL with the top of stack; the first of four such exchanges forms a short timing delay while the head seeks and settles.
42BE
EX (SP),HL E3
Exchange (SP) and HL (second delay cycle).
42BF
EX (SP),HL E3
Exchange (SP) and HL (third delay cycle).
42C0
EX (SP),HL E3
Exchange (SP) and HL (fourth delay cycle). Register Pair HL again points at 37ECH.
42C1
LD A,(HL) 7E
Read the FDC status register at Register Pair HL (37ECH) into Register A. After a Seek this is a Type I status.
1771 Type I Status Register (read after Seek)Function Description
Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0Summary of Bits
NWHSCTIBType I Command Status Register
N: 1=Not Ready, 0=Ready
W: 1=Write Protected, 0=Not Protected
H: 1=Head Loaded, 0=Head Not Loaded
S: 1=Seek Error, 0=No Error
C: 1=CRC Error, 0=No Error
T: 1=Track 0, 0=Not Track 0
I: 1=Index Mark, 0=No Index
B: 1=Busy, 0=Not Busy
42C2
RRCA 0F
Rotate Register A right, moving bit 0 (the Busy flag) into the Carry.
42C3
If the CARRY FLAG is set (the controller is still Busy), LOOP BACK to 42C1H to poll again.
42C5
LD (HL),88H 36 88
Write 88H to the FDC Command Register at Register Pair HL (37ECH), issuing a Read Sector command.
1771 FDC Command: 88H (10001000)Function Description
Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0Summary of Bits
100mbE00Command=Read Sector
Bit 7-5: Read Command (100)
m: 1=Multiple Records, 0=Single Record
b: 1=IBM format, 0=Non-IBM Format
E: 1=Enable HLD/HLT/10ms Delay, 0=Assume Head Already Engaged, no Delay
Remainder: Unused (00)
42C7
PUSH DE D5
Save Register Pair DE on the stack.
42C8
LD DE,37EFH 11 EF 37
Point Register Pair DE to the FDC Data Register at 37EFH, the source of the incoming bytes.
42CB
EX (SP),HL E3
Exchange (SP) and HL (timing delay before the first byte).
42CC
EX (SP),HL E3
Exchange (SP) and HL (second delay cycle); Register Pair HL again points at 37ECH.
42CD
JUMP to 42DAH to enter the transfer loop at its status test.
42CF
RRCA 0F
Rotate Register A right, moving bit 0 (Busy) into the Carry.
42D0
If the NO CARRY FLAG is set (the controller is no longer Busy, so the command has finished), JUMP to 42DCH to check the final status.
42D2
LD A,(HL) 7E
Read the FDC status register at Register Pair HL (37ECH) into Register A during the transfer.
42D3
BIT 1,A CB 4F
Test bit 1 of Register A, the Data Request (DRQ) flag, to see whether a byte is ready.
42D5
If the Z FLAG is set (no byte ready yet), LOOP BACK to 42CFH to re-check the Busy flag.
42D7
LD A,(DE) 1A
Fetch the data byte from the FDC Data Register at Register Pair DE (37EFH) into Register A.
42D8
LD (BC),A 02
Store the data byte (Register A) into the buffer at Register Pair BC.
42D9
INC BC 03
INCrement Register Pair BC to advance the buffer pointer.
42DA
LOOP BACK to 42D2H to read the next byte.
42DC
LD A,(HL) 7E
Read the final FDC status register at Register Pair HL (37ECH) into Register A. This is a Type II status.
1771 Type II Status Register (read after Read Sector)Function Description
Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0Summary of Bits
NWRFCLDBType II Command Status Register
N: 1=Not Ready, 0=Ready
W: 1=Write Protected, 0=Not Protected
R: 1=Record Type/Deleted Data, 0=Normal Data
F: 1=Record Not Found, 0=Record Found
C: 1=CRC Error, 0=No Error
L: 1=Lost Data, 0=No Data Lost
D: 1=Data Request (DRQ), 0=No Request
B: 1=Busy, 0=Not Busy
42DD
AND 1CH E6 1C
Mask Register A with 1CH to keep bits 4, 3, and 2 (Record Not Found, CRC Error, Lost Data).
42DF
POP DE D1
Restore Register Pair DE from the stack.
42E0
RET Z C8
If the Z FLAG is set (none of the error bits are set), RETURN with success.
42E1
LD (HL),0D0H 36 D0
An error occurred. Write 0D0H to the FDC Command Register at Register Pair HL (37ECH), a Force Interrupt that aborts the controller.
1771 FDC Command: D0H (11010000)Function Description
Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0Summary of Bits
1101I3I2I1I0Command=Force Interrupt
Bit 7-4: Command Code (1101)
I3: 1=Interrupt Immediately
I2: 1=Interrupt on the next Index Pulse
I1: 1=Interrupt when Ready goes Not Ready
I0: 1=Interrupt when Not Ready goes Ready
All 0: Terminate the command with no interrupt
42E3
RET C9
RETURN with the NZ FLAG set to signal the read error to the caller.

42E4H - Boot Messages and Control Strings

The clear-screen control string and the two boot-failure messages. These are data, not executable code.

42E4
DEFB 1CH,1FH,03H 1C 1F 03
Clear-Screen Control String
Home cursor (1CH), erase to end of frame (1FH), 03H terminator. Sent by 429EH at boot start.

No System Message

42E7
DEFB 17H,0E8H 17 E8
Two lead-in bytes (17H, 0E8H) are emitted to the video driver ahead of the text to turn on double width characters and position the message.
42E9
DEFM "No System" : DEFB 03H 4E 6F 20 53 79 73 74 65 6D 03
The text "No System"; 03H terminates the string. Displayed at 4297H when the directory entry is not in use.

Disk Error Message

42F3
DEFB 17H,0E8H 17 E8
Two lead-in bytes (17H, 0E8H) are emitted to the video driver ahead of the text to turn on double width characters and position the message.
42F5
DEFM "Disk Error" : DEFB 03H 44 69 73 6B 20 45 72 72 6F 72 03
The text "Disk Error"; 03H terminates the string. Displayed at 4297H when an FDC read fails.

4300H - Alternate Boot Sector (Boot Image B)

A second, drive-geometry-aware bootstrap program stored in the BOOT/SYS file. It is assembled to execute at 4200H but is held here at 4300H; its absolute CALL and JP operands therefore name addresses in the 42xxH page, which correspond to its own body shown one page higher (operand address plus 0100H). Only one boot program is written to track 0, sector 0 by FORMAT/SYSGEN.

Boot Image B performs the same job as Boot Image A - clear the screen, select the drive, read the system loader's directory record, then stream the file as an LDOS load module and jump to its entry - but it is geometry-independent. Instead of hard-coding cylinder 17 and 5-sector granules, it reads the Drive Control Table (DCT) through Register Pair IY: IY+03H (drive spec, masked here to force single density), IY+07H and IY+08H (allocation and granules-per-track / sectors-per-granule), and IY+09H (directory cylinder). Sector reads are issued through the DCT's jump vector with JP (IY) at its 43D5H rather than by programming the WD1771 directly, so the same code works for any installed drive geometry.

Multiply Routine
43D7H is a bit-serial 8-bit multiply (PUSH BC; LD D,A; XOR A; LD B,08H; loop: ADD A,A; SLA E; ADD A,D on carry; DJNZ; POP BC; RET). Boot Image B calls it (as its 42D7H) to convert a starting granule number into a starting sector offset, the geometry-independent equivalent of the "granule times 5" shortcut hard-coded in Boot Image A at 423CH.

Messages
43E6H holds Boot Image B's own copies of the two boot-failure strings, "No System" and "Disk Error", each preceded by the same two lead-in bytes (17H, 0E8H) and terminated by 03H, matching the pair at 42E7H/42F3H in Boot Image A.

43FFH - Days-per-Month Table and Padding

A fill byte, two inert bytes, the days-per-month table used by the date routines, and zero padding up to the DCT initialization templates. These are data, not executed by the boot sector.

43FF
DEFB 0FFH FF
Single fill byte after Boot Image B, which ends at 43FEH (its 03H "Disk Error" terminator).
4400
DEFB 53H,0C9H 53 C9
Two inert bytes ahead of the days-per-month table. The table below is indexed by month number 1-12, so it is effectively based at 4401H (month 1 lands on 4402H); that makes 4401H (0C9H) the unused "month 0" slot and 4400H (53H) a boundary byte left from the preceding image. Neither is reached by any boot code.
4402
DEFB 1FH, 1CH, 1FH, 1EH, 1FH, 1EH, 1FH, 1FH, 1EH, 1FH, 1EH, 1FH 1F 1C 1F 1E 1F 1E 1F 1F 1E 1F 1E 1F
Days-per-Month Table
Days in each month, January through December: 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31. Indexed by month number 1-12.
440E-441F
DEFB 00H x 18 00 x 18
Zero padding to the start of the DCT initialization-template table at 4420H.

4420H - Drive Code Table (DCT) Initialization Templates

Sixteen fixed 10-byte DCT templates (4420H-44BFH). SYSGEN/CONFIG copies the template matching each installed drive into the live Drive Code Table at DCT$ (4700H). The layout is verified byte-for-byte against the running DCT$ inside SYS0.SYS. This is data, not executed by the boot sector.

Each 10-byte entry: +00..02 = JP driver (0C3H, drive present) or RET (0C9H, drive absent); +03 drive-spec/flags; +04 drive-select bit-mask (01/02/04/08 = drives 0-3, +40H tags the 308AH-driver variant); +05 current cylinder (runtime; 00H, or 0FFH = position unknown/restore); +06 highest cylinder; +07 highest sector; +08 allocation byte, ((granules/track - 1) << 5) OR (sectors/granule - 1); +09 directory cylinder. The present-vector target is 45FBH (the resident SYS0 FDC driver) or 308AH (an alternate/loadable driver). The 4-byte tail 22H 09H 24H 11H is DCT geometry - 35-track single density: 35 cylinders, 10 sectors/track, 2 granules of 5 sectors, directory track 17 - NOT the instructions "LD (2409H),HL / LD DE". The tail 4CH 0FH 27H 26H is the double-density geometry: 77 cylinders, 16 sectors/track, 2 granules of 8 sectors, directory track 38.

4420
DEFB C3H, 8AH, 30H, 03H, 41H, 00H, 22H, 09H, 24H, 11H C3 8A 30 03 41 00 22 09 24 11
DCT Template - 308AH driver, drive 0, 35-trk SD
JP 308AH (drive present, alternate driver); select-mask 41H; current cylinder 00H; geometry - highest cylinder 22H (35 cylinders), highest sector 09H (10 sectors/track), alloc 24H (2 granules of 5 sectors), directory cylinder 11H (17).
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 8AH - low byte of the driver entry address 308AH (an alternate / loadable driver)
  • 30H - high byte of the driver entry address 308AH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 41H - drive-select bit-mask (drive 0) with bit 6 (40H) set to select the 308AH-driver variant
  • 00H - current cylinder, initialized to track 0
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
442A
DEFB C3H, 8AH, 30H, 03H, 42H, 0FFH, 22H, 09H, 24H, 11H C3 8A 30 03 42 FF 22 09 24 11
308AH driver, drive 1, 35-trk SD. Select-mask 42H; current cylinder 0FFH (unknown/restore); standard-density geometry.
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 8AH - low byte of the driver entry address 308AH (an alternate / loadable driver)
  • 30H - high byte of the driver entry address 308AH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 42H - drive-select bit-mask (drive 1) with bit 6 (40H) set to select the 308AH-driver variant
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
4434
DEFB C3H, 8AH, 30H, 22H, 41H, 0FFH, 4CH, 0FH, 27H, 26H C3 8A 30 22 41 FF 4C 0F 27 26
308AH driver, drive 0, 77-trk DD. Spec 22H (double density); geometry - highest cylinder 4CH (77 cylinders), highest sector 0FH (16 sectors/track), alloc 27H (2 granules of 8 sectors), directory cylinder 26H (38).
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 8AH - low byte of the driver entry address 308AH (an alternate / loadable driver)
  • 30H - high byte of the driver entry address 308AH
  • 22H - drive-spec / flags byte: this is the double-density (DDEN) variant, carrying the 4CH 0FH 27H 26H geometry
  • 41H - drive-select bit-mask (drive 0) with bit 6 (40H) set to select the 308AH-driver variant
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 4CH - highest cylinder = 76 (77 cylinders, tracks 0-76)
  • 0FH - highest sector = 15 (16 sectors per track, double density)
  • 27H - allocation byte: 2 granules per track, 8 sectors per granule (16 sectors/track)
  • 26H - directory cylinder = 38
443E
DEFB C3H, 8AH, 30H, 22H, 42H, 0FFH, 4CH, 0FH, 27H, 26H C3 8A 30 22 42 FF 4C 0F 27 26
308AH driver, drive 1, 77-trk DD. Same double-density geometry, select-mask 42H.
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 8AH - low byte of the driver entry address 308AH (an alternate / loadable driver)
  • 30H - high byte of the driver entry address 308AH
  • 22H - drive-spec / flags byte: this is the double-density (DDEN) variant, carrying the 4CH 0FH 27H 26H geometry
  • 42H - drive-select bit-mask (drive 1) with bit 6 (40H) set to select the 308AH-driver variant
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 4CH - highest cylinder = 76 (77 cylinders, tracks 0-76)
  • 0FH - highest sector = 15 (16 sectors per track, double density)
  • 27H - allocation byte: 2 granules per track, 8 sectors per granule (16 sectors/track)
  • 26H - directory cylinder = 38
4448
DEFB C9H, 8AH, 30H, 03H, 44H, 0FFH, 22H, 09H, 24H, 11H C9 8A 30 03 44 FF 22 09 24 11
308AH driver, drive 2, 35-trk SD - DISABLED. Leading 0C9H (RET) marks the drive absent; the JP operand and geometry follow but are not executed.
  • C9H - RET opcode - the DCT vector is disabled, so a call returns at once (drive absent)
  • 8AH - low byte of the driver entry address 308AH (an alternate / loadable driver)
  • 30H - high byte of the driver entry address 308AH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 44H - drive-select bit-mask (drive 2) with bit 6 (40H) set to select the 308AH-driver variant
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
4452
DEFB C3H, 8AH, 30H, 03H, 48H, 0FFH, 22H, 09H, 24H, 11H C3 8A 30 03 48 FF 22 09 24 11
308AH driver, drive 3, 35-trk SD. Select-mask 48H.
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 8AH - low byte of the driver entry address 308AH (an alternate / loadable driver)
  • 30H - high byte of the driver entry address 308AH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 48H - drive-select bit-mask (drive 3) with bit 6 (40H) set to select the 308AH-driver variant
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
445C
DEFB C3H, 8AH, 30H, 22H, 44H, 0FFH, 4CH, 0FH, 27H, 26H C3 8A 30 22 44 FF 4C 0F 27 26
308AH driver, drive 2, 77-trk DD. Select-mask 44H.
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 8AH - low byte of the driver entry address 308AH (an alternate / loadable driver)
  • 30H - high byte of the driver entry address 308AH
  • 22H - drive-spec / flags byte: this is the double-density (DDEN) variant, carrying the 4CH 0FH 27H 26H geometry
  • 44H - drive-select bit-mask (drive 2) with bit 6 (40H) set to select the 308AH-driver variant
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 4CH - highest cylinder = 76 (77 cylinders, tracks 0-76)
  • 0FH - highest sector = 15 (16 sectors per track, double density)
  • 27H - allocation byte: 2 granules per track, 8 sectors per granule (16 sectors/track)
  • 26H - directory cylinder = 38
4466
DEFB C3H, 8AH, 30H, 22H, 48H, 0FFH, 4CH, 0FH, 27H, 26H C3 8A 30 22 48 FF 4C 0F 27 26
308AH driver, drive 3, 77-trk DD. Select-mask 48H.
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 8AH - low byte of the driver entry address 308AH (an alternate / loadable driver)
  • 30H - high byte of the driver entry address 308AH
  • 22H - drive-spec / flags byte: this is the double-density (DDEN) variant, carrying the 4CH 0FH 27H 26H geometry
  • 48H - drive-select bit-mask (drive 3) with bit 6 (40H) set to select the 308AH-driver variant
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 4CH - highest cylinder = 76 (77 cylinders, tracks 0-76)
  • 0FH - highest sector = 15 (16 sectors per track, double density)
  • 27H - allocation byte: 2 granules per track, 8 sectors per granule (16 sectors/track)
  • 26H - directory cylinder = 38
4470
DEFB C3H, 0FBH, 45H, 83H, 01H, 00H, 22H, 09H, 24H, 11H C3 FB 45 83 01 00 22 09 24 11
DCT Template - 45FBH resident driver, drive 0, 35-trk SD. JP 45FBH (the resident SYS0 FDC driver); spec 83H (bit7 = drive 0); select-mask 01H; current cylinder 00H. This entry matches the live DCT$ drive-0 slot in SYS0.SYS.
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 0FBH - low byte of the driver entry address 45FBH (the resident SYS0 FDC driver)
  • 45H - high byte of the driver entry address 45FBH
  • 83H - drive-spec / flags byte with bit 7 set, marking drive 0 (the system drive)
  • 01H - drive-select bit-mask (drive 0)
  • 00H - current cylinder, initialized to track 0
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
447A
DEFB C3H, 0FBH, 45H, 03H, 02H, 0FFH, 22H, 09H, 24H, 11H C3 FB 45 03 02 FF 22 09 24 11
45FBH driver, drive 1, 35-trk SD. Select-mask 02H; current cylinder 0FFH.
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 0FBH - low byte of the driver entry address 45FBH (the resident SYS0 FDC driver)
  • 45H - high byte of the driver entry address 45FBH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 02H - drive-select bit-mask (drive 1)
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
4484
DEFB C3H, 0FBH, 45H, 03H, 04H, 0FFH, 22H, 09H, 24H, 11H C3 FB 45 03 04 FF 22 09 24 11
45FBH driver, drive 2, 35-trk SD. Select-mask 04H.
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 0FBH - low byte of the driver entry address 45FBH (the resident SYS0 FDC driver)
  • 45H - high byte of the driver entry address 45FBH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 04H - drive-select bit-mask (drive 2)
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
448E
DEFB C3H, 0FBH, 45H, 03H, 08H, 0FFH, 22H, 09H, 24H, 11H C3 FB 45 03 08 FF 22 09 24 11
45FBH driver, drive 3, 35-trk SD. Select-mask 08H.
  • C3H - JP opcode - the DCT jump vector is active (drive present)
  • 0FBH - low byte of the driver entry address 45FBH (the resident SYS0 FDC driver)
  • 45H - high byte of the driver entry address 45FBH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 08H - drive-select bit-mask (drive 3)
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
4498
DEFB C9H, 0FBH, 45H, 83H, 01H, 00H, 22H, 09H, 24H, 11H C9 FB 45 83 01 00 22 09 24 11
45FBH driver, drive 0, 35-trk SD - DISABLED. Leading 0C9H (RET) marks drive 0 absent (the not-configured form of the 4470H row).
  • C9H - RET opcode - the DCT vector is disabled, so a call returns at once (drive absent)
  • 0FBH - low byte of the driver entry address 45FBH (the resident SYS0 FDC driver)
  • 45H - high byte of the driver entry address 45FBH
  • 83H - drive-spec / flags byte with bit 7 set, marking drive 0 (the system drive)
  • 01H - drive-select bit-mask (drive 0)
  • 00H - current cylinder, initialized to track 0
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
44A2
DEFB C9H, 0FBH, 45H, 03H, 02H, 0FFH, 22H, 09H, 24H, 11H C9 FB 45 03 02 FF 22 09 24 11
45FBH driver, drive 1, 35-trk SD - DISABLED.
  • C9H - RET opcode - the DCT vector is disabled, so a call returns at once (drive absent)
  • 0FBH - low byte of the driver entry address 45FBH (the resident SYS0 FDC driver)
  • 45H - high byte of the driver entry address 45FBH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 02H - drive-select bit-mask (drive 1)
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
44AC
DEFB C9H, 0FBH, 45H, 03H, 04H, 0FFH, 22H, 09H, 24H, 11H C9 FB 45 03 04 FF 22 09 24 11
45FBH driver, drive 2, 35-trk SD - DISABLED.
  • C9H - RET opcode - the DCT vector is disabled, so a call returns at once (drive absent)
  • 0FBH - low byte of the driver entry address 45FBH (the resident SYS0 FDC driver)
  • 45H - high byte of the driver entry address 45FBH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 04H - drive-select bit-mask (drive 2)
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
44B6
DEFB C9H, 0FBH, 45H, 03H, 08H, 0FFH, 22H, 09H, 24H, 11H C9 FB 45 03 08 FF 22 09 24 11
45FBH driver, drive 3, 35-trk SD - DISABLED.
  • C9H - RET opcode - the DCT vector is disabled, so a call returns at once (drive absent)
  • 0FBH - low byte of the driver entry address 45FBH (the resident SYS0 FDC driver)
  • 45H - high byte of the driver entry address 45FBH
  • 03H - drive-spec / flags byte (standard-density entry)
  • 08H - drive-select bit-mask (drive 3)
  • 0FFH - current cylinder = unknown; forces a restore/seek on first access
  • 22H - highest cylinder = 34 (35 cylinders, tracks 0-34)
  • 09H - highest sector = 9 (10 sectors per track, single density)
  • 24H - allocation byte: 2 granules per track, 5 sectors per granule (10 sectors/track)
  • 11H - directory cylinder = 17
44C0
DEFB 0FFH FF
Single fill byte closing the template table.
44C1-44C6
DEFB 00H x 6 00 00 00 00 00 00
Zero pad up to the Day-of-Week table at 44C7H.

44C7H - Day-of-Week and Month Name Tables

Three-letter abbreviations used by the LDOS date routines. These are data tables.

44C7
DEFM "Sun" 53 75 6E
Day-of-Week Table (Sunday)
3-character day abbreviation (3 bytes, 44C7H-44C9H), index 0.
44CA
DEFM "Mon" 4D 6F 6E
Day-of-Week Table (Monday)
3-character day abbreviation (3 bytes, 44CAH-44CCH), index 1.
44CD
DEFM "Tue" 54 75 65
Day-of-Week Table (Tuesday)
3-character day abbreviation (3 bytes, 44CDH-44CFH), index 2.
44D0
DEFM "Wed" 57 65 64
Day-of-Week Table (Wednesday)
3-character day abbreviation (3 bytes, 44D0H-44D2H), index 3.
44D3
DEFM "Thu" 54 68 75
Day-of-Week Table (Thursday)
3-character day abbreviation (3 bytes, 44D3H-44D5H), index 4.
44D6
DEFM "Fri" 46 72 69
Day-of-Week Table (Friday)
3-character day abbreviation (3 bytes, 44D6H-44D8H), index 5.
44D9
DEFM "Sat" 53 61 74
Day-of-Week Table (Saturday)
3-character day abbreviation (3 bytes, 44D9H-44DBH), index 6.
44DC
DEFM "Jan" 4A 61 6E
Month Name Table (January)
3-character month abbreviation (3 bytes, 44DCH-44DEH), index 0.
44DF
DEFM "Feb" 46 65 62
Month Name Table (February)
3-character month abbreviation (3 bytes, 44DFH-44E1H), index 1.
44E2
DEFM "Mar" 4D 61 72
Month Name Table (March)
3-character month abbreviation (3 bytes, 44E2H-44E4H), index 2.
44E5
DEFM "Apr" 41 70 72
Month Name Table (April)
3-character month abbreviation (3 bytes, 44E5H-44E7H), index 3.
44E8
DEFM "May" 4D 61 79
Month Name Table (May)
3-character month abbreviation (3 bytes, 44E8H-44EAH), index 4.
44EB
DEFM "Jun" 4A 75 6E
Month Name Table (June)
3-character month abbreviation (3 bytes, 44EBH-44EDH), index 5.
44EE
DEFM "Jul" 4A 75 6C
Month Name Table (July)
3-character month abbreviation (3 bytes, 44EEH-44F0H), index 6.
44F1
DEFM "Aug" 41 75 67
Month Name Table (August)
3-character month abbreviation (3 bytes, 44F1H-44F3H), index 7.
44F4
DEFM "Sep" 53 65 70
Month Name Table (September)
3-character month abbreviation (3 bytes, 44F4H-44F6H), index 8.
44F7
DEFM "Oct" 4F 63 74
Month Name Table (October)
3-character month abbreviation (3 bytes, 44F7H-44F9H), index 9.
44FA
DEFM "Nov" 4E 6F 76
Month Name Table (November)
3-character month abbreviation (3 bytes, 44FAH-44FCH), index 10.
44FD
DEFM "Dec" 44 65 63
Month Name Table (December)
3-character month abbreviation (3 bytes, 44FDH-44FFH), index 11.

4500H - Reserved Fill and DOS Identification

A reserved fill region followed by the LDOS identification, version and creation-date string.

4500-45CA
DEFB 0FDH, 0FCH x 68, 0FFH x 134 FD FC..FC FF..FF
Reserved Fill
203 bytes of reserved fill: one 0FDH byte at 4500H, then 0FCH repeated, then 0FFH through 45CAH. Not opcodes.
45CB
DEFB 53H, 00H, 89H, 0E0H, 42H 53 00 89 E0 42
Five-byte field immediately ahead of the identification string. It contains the little-endian word 42E0H (bytes 89H E0H 42H), a back-pointer into Boot Image A's status-check tail at 42E0H, with 53H 00H reading as a marker/length. Not executed; SYSGEN bookkeeping.
45D0
DEFM "LDOS531 07/14/91" : DEFB 0DH 4C 44 4F 53 35 33 31 20 30 37 2F 31 34 2F 39 31 0D
DOS Identification String
The operating system name and version ("LDOS531"), a space, and the build date "07/14/91", terminated by a carriage return (0DH). The remainder to 45FEH is space padding (20H).
45E1-45FE
DEFB 20H x 30 20 x 1E
Space padding filling out the identification field.

4600H - Zero Fill

An unused sector, zero-filled.

4600-46FF
DEFB 00H x 256 00 x 100
Zero Fill
256 zero bytes; reserved/unused space in the boot image.

4700H - DCT$ Drive-0 Slot and Drive/Device Template Data

The first 10 bytes are the live Drive Code Table drive-0 slot (DCT$, 4700H): the secondary loader's LDIR at 48B0H copies the selected 10-byte DCT entry here from (IY) before entering the system. The file's resting bytes in that slot are placeholder. The remainder is drive/device template data, followed by fill.

4700-4709
DEFB 54H, 53H, 20H, 20H, 20H, 8FH, 54H, 44H, 45H, 46H 54 53 20 20 20 8F 54 44 45 46
DCT$ Drive-0 Entry Slot (10 bytes)
Destination of the LDIR at 48B0H, which installs the runtime drive-0 DCT entry (a 0C3H 0FBH 45H... record, as seen live in SYS0.SYS) from (IY). The bytes shown are the file's inert placeholder for the slot, not a valid DCT entry (they do not begin with a 0C3H JP vector).
470A
DEFM "AUL" 41 55 4C
Trailing characters of the placeholder text; combined the region reads "TS .TDEFAUL". Note this is "DEFAUL", not "DEFAULT".
470D
DEFB 52H, 52H, 00H, 04H, 01H, 00H, 02H, 02H, 00H, 00H 52 52 00 04 01 00 02 02 00 00
10-byte drive/device parameter template (geometry-like fields 04H 01H 00H 02H 02H). It does not open with a 0C3H/0C9H vector, so it is a device-parameter record, not a ready DCT entry; its exact fields are not fully resolved from this file alone.
4717
DEFB 20H, 20H 20 20
Two space bytes separating the two templates.
4719
DEFB 52H, 52H, 00H, 04H, 01H, 00H, 02H, 02H, 00H, 00H 52 52 00 04 01 00 02 02 00 00
Second copy of the 10-byte drive/device parameter template (identical to 470DH).
4723-47FF
DEFB 6CH x 221 6C x DD
Fill
221 bytes of 6CH fill to the end of the sector (the unusual fill value suggests a partly-stale template sector).

4800H - Secondary Loader

A secondary loader stage that finalizes the Drive Code Table and enters the loaded system. It is a geometry-aware mirror of Boot Image A. It depends on a companion resident module and is not run by the boot ROM.

This stage reads the drive geometry through Register Pair IY (DCT+05H, +07H, +08H, +09H), streams load-module records exactly as the boot sectors do, then copies the selected 10-byte DCT entry from (IY) to the DCT$ base at 4700H with LDIR, clears IY, and jumps to the loaded system with JP (HL) at 48B7H. It reuses Boot Image A's error exits (JP Z,4229H "No System" and JP NZ,4294H "Disk Error"), so it coexists with Boot Image A in memory. Its disk/support calls are 52D1H (driver initialization), 53B0H (get next file byte), 53C7H (read sector), 53CFH (read-sector helper) plus workspace 53BFH, in a companion module at 5200H-53FFH that is NOT part of BOOT/SYS and is NOT any SYS overlay (only SYS6/SYS7 also originate at 5200H, but those are the transient RST-28H command overlays and never touch the WD1771). That companion is the double-density boot driver installed by SOLE/CMD: SOLE.CMD contains a byte-for-byte copy of this very secondary loader - calling the same 52D1H/53B0H/53C7H/53CFH - together with the matching WD1771 double-density read engine (drive and density select via 37E1H, track register 37EDH, sector 37EEH, data 37EFH, command/status 37ECH; DDEN taken from the DCT spec byte). SOLE writes both to the disk so that at boot the driver occupies 5200H-53FFH while this loader occupies the 4800H sector, consistent with the 77-track double-density geometry and the 308AH alternate-driver vector held elsewhere in these BOOT/SYS sectors. One local note: the entry preamble at 4800H-4819H ends with JR 47C7H, whose target lies in the 4723H-47FFH region that is 6CH-filled in this captured image, so either that part of the 47xx sector originally held code overwritten on this disk or the preamble is entered mid-stream from the driver rather than at 4800H; the confidently-decoded loader begins at 481AH.

4800
LD BC,0FCD7H 01 D7 FC
Secondary Loader - Entry / Setup
Entry preamble. This stage is called by the companion 5200H-53FFH module and coexists in memory with Boot Image A, whose error exits it reuses (see note).
4803
LD D,D 52
4804
INC BC 03
4805
LD HL,4511H 21 11 45
Point Register Pair HL at 4511H, a buffer/geometry value stored into the DCT next.
4808
LD (IY+07H),L FD 75 07
Store Register L into DCT+07H (Register Pair IY = the drive DCT entry being built).
480B
LD (IY+08H),H FD 74 08
Store Register H into DCT+08H.
480E
POP HL E1
480F
CALL 52D1H CD D1 52
GOSUB to 52D1H, the driver-initialization entry of the SOLE-installed double-density boot driver resident at 5200H-53FFH (restores/selects the drive; not part of BOOT/SYS).
4812
LD (IY+05H),00H FD 36 05 00
Set DCT+05H (current cylinder) to 0.
4816
LD B,08H 06 08
4818
JR 47C7H 18 AD
JUMP (relative) to 47C7H. That address lies inside the 4723H-47FFH region, which is 6CH-filled in this file image; see the note above.
481A
LD A,(IY+07H) FD 7E 07
Geometry-aware directory read
Load a geometry byte from DCT+07H into Register A.
481D
LD D,A 57
481E
AND 1FH E6 1F
Isolate the low 5 bits.
4820
LD E,A 5F
4821
INC E 1C
4822
XOR D AA
4823
RLCA 07
4824
RLCA 07
4825
RLCA 07
4826
INC A 3C
4827
LD B,A 47
4828
XOR A AF
Clear Register A ahead of the multiply loop.
4829
Multiply loop body: repeatedly add Register E.
482A
DECrement Register B and LOOP BACK to 4829H.
482C
LD BC,5100H 01 00 51
Point Register Pair BC at the 5100H sector buffer.
482F
PUSH BC C5
4830
PUSH AF F5
4831
LD D,(IY+09H) FD 56 09
Load Register D with DCT+09H, the directory cylinder.
4834
LD E,C 59
Register E = 0 (sector 0).
4835
CALL 53C7H CD C7 53
GOSUB to 53C7H (companion module) to read the sector.
4838
POP AF F1
4839
LD HL,51CDH 21 CD 51
483C
BIT 5,(HL) CB 6E
Test bit 5 of (51CDH), a drive-configuration bit.
483E
If the Z FLAG is set, JUMP to 4841H (skip the doubling).
4840
ADD A,A 87
4841
Store Register A into 53BFH, a companion-module workspace cell (external).
4844
LD E,04H 1E 04
Register E = 4, the directory sector holding the system loader's record.
4846
POP BC C1
4847
PUSH BC C5
4848
CALL 53C7H CD C7 53
GOSUB to 53C7H to read the directory record into the buffer.
484B
POP HL E1
484C
BIT 4,(HL) CB 66
Test the in-use flag (DIR+00 bit 4) of the directory record.
484E
If the Z FLAG is set (entry not in use), JUMP to Boot Image A's 4229H to display No System and halt.
4851
EXX D9
Granule to sector conversion (geometry-aware)
Switch to the ALTERNATE register set, which holds the streaming position.
4852
LD HL,(5116H) 2A 16 51
Load the first extent field of the directory record (starting cylinder / granule byte).
4855
LD A,H 7C
4856
RLCA 07
4857
RLCA 07
4858
RLCA 07
4859
AND 07H E6 07
Isolate the 3-bit starting granule number.
485B
LD E,A 5F
485C
LD A,(IY+08H) FD 7E 08
Load the allocation byte from DCT+08H.
485F
AND 1FH E6 1F
Isolate the sectors-per-granule field.
4861
INC A 3C
Register A = sectors per granule.
4862
LD D,A 57
4863
INC E 1C
4864
NEG ED 44
4866
Multiply loop: granule x sectors-per-granule by repeated addition.
4867
DEC E 1D
4868
LOOP BACK to 4866H while granules remain.
486A
LD E,A 5F
Register E (alt) = starting sector offset within the cylinder.
486B
LD D,L 55
Register D (alt) = starting cylinder.
486C
LD BC,51FFH 01 FF 51
Prime the buffer index so the first INC C forces a sector read.
486F
EXX D9
Switch back to the MAIN register set.
4870
Load-record streaming core
GOSUB to 53B0H (companion get-next-byte) to read the record type.
4873
DEC A 3D
Test for record type 01H (load block).
4874
If not type 01H, JUMP to 488DH to test the other types.
4876
CALL 53B0H CD B0 53
Read the record length.
4879
LD B,A 47
487A
CALL 53B0H CD B0 53
Read the load-address low byte.
487D
LD L,A 6F
487E
DEC B 05
487F
CALL 53B0H CD B0 53
Read the load-address high byte.
4882
LD H,A 67
Register Pair HL = destination address.
4883
DEC B 05
Register B = data-byte count.
4884
Loop: read one data byte.
4887
LD (HL),A 77
Store it at the destination.
4888
INC HL 23
4889
LOOP BACK to 4884H while data bytes remain.
488B
LOOP BACK to 4870H for the next record.
488D
Test for record type 02H (transfer address).
488E
If type 02H, JUMP to 489BH to take the transfer.
4890
CALL 53B0H CD B0 53
Other record type: read the length.
4893
LD B,A 47
4894
Loop: read and discard one byte.
4897
LOOP BACK to 4894H until the record is skipped.
4899
LOOP BACK to 4870H for the next record.
489B
Transfer + DCT install
Transfer record: read and discard the length byte (02H).
489E
CALL 53B0H CD B0 53
Read the entry-address low byte.
48A1
LD L,A 6F
48A2
CALL 53B0H CD B0 53
Read the entry-address high byte.
48A5
LD H,A 67
Register Pair HL = the loaded system's entry point.
48A6
PUSH HL E5
Save the entry address on the stack.
48A7
PUSH IY FD E5
48A9
POP HL E1
Register Pair HL = Register Pair IY, the selected 10-byte DCT entry.
48AA
LD DE,4700H 11 00 47
Point Register Pair DE at the DCT$ base (4700H).
48AD
LD BC,000AH 01 0A 00
Register Pair BC = 10, the DCT-entry length.
48B0
LDIR ED B0
Install drive-0 DCT entry. Block-copy the 10-byte DCT entry from (IY) to 4700H, populating the live DCT$ drive-0 slot.
48B2
POP HL E1
Restore the entry address into Register Pair HL.
48B3
LD IY,0000H FD 21 00 00
Clear Register Pair IY.
48B7
JP (HL) E9
JUMP to the loaded system's entry point.
48B8
Get Next File Byte
Switch to the ALTERNATE register set holding the streaming position (mirror of Boot Image A's 4279H).
48B9
INC C 0C
Advance the in-buffer index.
48BA
If the buffer is not exhausted, JUMP to 48CCH to fetch the byte.
48BC
PUSH BC C5
48BD
CALL 53C7H CD C7 53
Buffer exhausted: GOSUB to 53C7H (companion) to read the next sector.
48C0
If the read failed, JUMP to Boot Image A's 4294H to display Disk Error and halt.
48C3
POP BC C1
48C4
INC E 1C
Advance to the next sector.
48C5
LD A,E 7B
48C6
SUB 00H D6 00
Compare against the sectors-per-track count. The 00H operand is self-modified by the loader from the drive geometry (the analogue of Boot Image A's fixed SUB 0AH at 428BH).
48C8
If below the sector count, JUMP to 48CCH.
48CA
LD E,A 5F
Wrap the sector number back to 0.
48CB
INC D 14
Step to the next cylinder.
48CC
Fetch the file byte from the buffer.
48CD
EXX D9
48CE
RET C9
RETURN with the file byte in Register A.
48CF
Sector-read helper
Save Register Pair HL.
48D0
LD H,B 60
48D1
LD L,C 69
48D2
CALL 53CFH CD CF 53
GOSUB to 53CFH (companion module) to perform the read.
48D5
POP HL E1
48D6
RET C9
RETURN to the caller.
48D7
DEFB 0FDH, 0E9H, 02H, 02H, 12H, 53H, 00H, 80H, 20H, 00H, 00H, 42H, 00H, 01H, 09H, 0BH, 00H, 00H, 00H, 04H, 00H, 15H, 20H FD E9 02 02 12 53 00 80 20 00 00 42 00 01 09 0B 00 00 00 04 00 15 20
DCT / Parameter Template
Opens with 0FDH 0E9H = JP (IY), the DCT driver-vector head, followed by drive-geometry / parameter bytes used by the loader.
48EE-48FD
DEFB 0FFH x 16 FF x 10
Fill.
48FE
DEFB 6DH, 0B6H 6D B6
Two-byte trailer at the end of the BOOT/SYS file.