TRS-80 DOS - LDOS 5.3.1 for the Model I - BOOT/SYS Disassembled
Page Customization
Page Index
BOOT/SYS
Other Navigation
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
| Address | Purpose |
|---|---|
| 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
| Address | Name and Purpose |
|---|---|
| 4203H | Boot 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. |
| 4242H | Load-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. |
| 4279H | Get 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. |
| 429EH | Print Control/Message String Send an 03H-terminated string at HL to the ROM display routine 0033H. |
| 42ACH | FDC Read Sector Seek and read one sector (cylinder D, sector E) into the buffer, with a single retry on failure. |
| 42B4H | Seek + Read Core Program the WD1771 Sector/Data registers, issue Seek (1BH) then Read Sector (88H), transfer the bytes and check the status. |
| 4294H | Boot 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.
DISABLE INTERRUPTS. No interrupt handlers exist yet during the boot, so maskable interrupts are turned off.
| Model I Drive-Select Latch write: 01H (37E1H) | Function Description | ||||||||
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summary of Bits | |
| - | - | - | - | d3 | d2 | d1 | d0 | Drive-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 | |
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.
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).
Point Register Pair HL to the Disk Error message at 42F3H.
Save the string pointer (Register Pair HL) on the stack.
Save the caller's buffer pointer (Register Pair BC) on the stack.
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.
| 1771 FDC Command: 1BH (00011011) | Function Description | ||||||||
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summary of Bits | |
| 0 | 0 | 0 | 1 | h | V | r1 | r0 | Command=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) | |
| 1771 Type I Status Register (read after Seek) | Function Description | ||||||||
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summary of Bits | |
| N | W | H | S | C | T | I | B | Type 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 | |
| 1771 FDC Command: 88H (10001000) | Function Description | ||||||||
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summary of Bits | |
| 1 | 0 | 0 | m | b | E | 0 | 0 | Command=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) | |
| 1771 Type II Status Register (read after Read Sector) | Function Description | ||||||||
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summary of Bits | |
| N | W | R | F | C | L | D | B | Type 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 | |
| 1771 FDC Command: D0H (11010000) | Function Description | ||||||||
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summary of Bits | |
| 1 | 1 | 0 | 1 | I3 | I2 | I1 | I0 | Command=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 | |
42E4H - Boot Messages and Control Strings
The clear-screen control string and the two boot-failure messages. These are data, not executable code.
Home cursor (1CH), erase to end of frame (1FH), 03H terminator. Sent by 429EH at boot start.
No System Message
Disk Error Message
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.
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.
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.
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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
44C7H - Day-of-Week and Month Name Tables
Three-letter abbreviations used by the LDOS date routines. These are data tables.
3-character day abbreviation (3 bytes, 44C7H-44C9H), index 0.
3-character day abbreviation (3 bytes, 44CAH-44CCH), index 1.
3-character day abbreviation (3 bytes, 44CDH-44CFH), index 2.
3-character day abbreviation (3 bytes, 44D0H-44D2H), index 3.
3-character day abbreviation (3 bytes, 44D3H-44D5H), index 4.
3-character day abbreviation (3 bytes, 44D6H-44D8H), index 5.
3-character day abbreviation (3 bytes, 44D9H-44DBH), index 6.
3-character month abbreviation (3 bytes, 44DCH-44DEH), index 0.
3-character month abbreviation (3 bytes, 44DFH-44E1H), index 1.
3-character month abbreviation (3 bytes, 44E2H-44E4H), index 2.
3-character month abbreviation (3 bytes, 44E5H-44E7H), index 3.
3-character month abbreviation (3 bytes, 44E8H-44EAH), index 4.
3-character month abbreviation (3 bytes, 44EBH-44EDH), index 5.
3-character month abbreviation (3 bytes, 44EEH-44F0H), index 6.
3-character month abbreviation (3 bytes, 44F1H-44F3H), index 7.
3-character month abbreviation (3 bytes, 44F4H-44F6H), index 8.
3-character month abbreviation (3 bytes, 44F7H-44F9H), index 9.
3-character month abbreviation (3 bytes, 44FAH-44FCH), index 10.
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.
203 bytes of reserved fill: one 0FDH byte at 4500H, then 0FCH repeated, then 0FFH through 45CAH. Not opcodes.
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).
4600H - Zero Fill
An unused sector, zero-filled.
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.
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).
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.
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).
Load a geometry byte from DCT+07H into Register A.
Switch to the ALTERNATE register set, which holds the streaming position.
GOSUB to 53B0H (companion get-next-byte) to read the record type.
Transfer record: read and discard the length byte (02H).
Switch to the ALTERNATE register set holding the streaming position (mirror of Boot Image A's 4279H).
Opens with 0FDH 0E9H = JP (IY), the DCT driver-vector head, followed by drive-geometry / parameter bytes used by the loader.