; =============================================================================
; Winchester load path 1066h / 1072h
; Source: VECTOR 4/8086 - V2_AC_Interleaved_XHE_XHO.bin
; CPU: Z80  |  base: 0000h  |  size: 8192
; Linear disassembly with fixed relative branch targets
; See also: docs/04-winchester-load-path.md
; =============================================================================

; --- Menu / vector entry 1066 (key W, JP from 0012) ---
1066  cd7210            CALL 1072h           ; core Winchester load helper
1069  c25d15            JP NZ, 155Dh         ; hardware error → 155D
106C  dac011            JP C, 11C0h          ; system error A=2 or 5 → 11C0
106F  c30024            JP 2400h             ; success: run SYSTEM at 2400

; --- Helper 1072 (also auto-boot CALL from 0140) ---
1072  af                XOR A
1073  32f667            LD (67F6h), A        ; clear load flag
1076  3e00              LD A, 00h            ; unit 0 = Winchester
1078  cd0016            CALL 1600h           ; select unit / wait ready
107B  b7                OR A
107C  c0                RET NZ               ; HW error to caller
107D  3e00              LD A, 00h
107F  0e01              LD C, 01h            ; C bit0 → restore variant
1081  cdde15            CALL 15DEh           ; restore / home
1084  b7                OR A
1085  c0                RET NZ
1086  210024            LD HL, 2400h         ; buffer = SYSTEM header
1089  3e00              LD A, 00h            ; unit 0 for 168B
108B  0601              LD B, 01h            ; OUT (A3),B
108D  110000            LD DE, 0000h         ; LBA/address 0
1090  0e00              LD C, 00h
1092  cd3816            CALL 1638h           ; read 512B via INIR (not 14A8)
1095  b7                OR A
1096  c0                RET NZ
1097  3a0224            LD A, (2402h)
109A  fe02              CP 02h               ; format id
109C  2805              JR Z, 10A3h
109E  af                XOR A
109F  3e02              LD A, 02h            ; #2 UNRECOGNIZED MEDIA FORMAT
10A1  37                SCF
10A2  c9                RET
10A3  3aaa09            LD A, (09AAh)        ; ROM config id
10A6  210b24            LD HL, 240Bh
10A9  be                CP (HL)              ; must match header +0B
10AA  2805              JR Z, 10B1h
10AC  af                XOR A
10AD  37                SCF
10AE  3e05              LD A, 05h            ; #5 CONFIGURATION MISMATCH
10B0  c9                RET
10B1  3e00              LD A, 00h            ; unit 0 → 1434 header-geometry path
10B3  cd3414            CALL 1434h           ; HL still near 240B; fills 200x from 2410+
10B6  b7                OR A
10B7  c9                RET                 ; Z = success for 1066 / auto-boot

; --- Auto-boot caller (entry path 012B) uses 1072 ---
; 012B  LD SP,2200h
; 012E  LD A,(09AAh) / OR A / JR Z,014F
; 0134  print LOADING @06E7
; 013A  CALL 15AAh
; 0140  CALL 1072h
; 0143  JR C/NZ → menu
; 0147  putchar 18h / CALL 2400h

; --- 1434 A<3 branch (Winchester geometry from header) ---
; Entered with A=0, HL≈240Bh after config CP
1434  fe03              CP 03h
1436  320920            LD (2009h), A        ; unit
1439  3846              JR C, 1481h          ; A<3 → header geometry (Winchester)
; ... A>=3 floppy table @0831 omitted (see 05-helpers-disk.asm) ...
1481  23                INC HL              ; 240B → … → 2410
1482  23                INC HL
1483  23                INC HL
1484  23                INC HL
1485  23                INC HL
1486  7e                LD A, (HL)           ; (2410) → 2006
1487  320620            LD (2006h), A
148A  23                INC HL
148B  5e                LD E, (HL)           ; word (2411) → 2003
148C  23                INC HL
148D  56                LD D, (HL)
148E  ed530320          LD (2003h), DE
1492  23                INC HL
1493  7e                LD A, (HL)           ; (2413) → 2008
1494  320820            LD (2008h), A
1497  23                INC HL
1498  7e                LD A, (HL)           ; (2414) density flag
1499  b7                OR A
149A  2802              JR Z, 149Eh
149C  3e01              LD A, 01h
149E  320720            LD (2007h), A
14A1  4f                LD C, A
14A2  3a0920            LD A, (2009h)
14A5  c3de15            JP 15DEh             ; restore with new geometry

; --- 1600 unit-select: A=0 Winchester ready path ---
1600  0e00              LD C, 00h
1602  cd8b16            CALL 168Bh
1605  f5                PUSH AF
1606  cd9415            CALL 1594h
1609  3eb0              LD A, B0h
160B  d3a6              OUT (A6h), A
160D  cd9415            CALL 1594h
1610  f1                POP AF
1611  113075            LD DE, 7530h         ; floppy default timeout
1614  2602              LD H, 02h
1616  2ef0              LD L, F0h            ; floppy ready mask
1618  b7                OR A
1619  2006              JR NZ, 1621h         ; A!=0 (floppy etc.)
161B  2ed0              LD L, D0h            ; ★ Winchester ready mask
161D  118813            LD DE, 1388h         ; ★ shorter timeout
1620  24                INC H
1621  08                EX AF, AF'
1622  d3a6              OUT (A6h), A
1624  08                EX AF, AF'
1625  cd7816            CALL 1678h
1628  3e00              LD A, 00h
162A  d2ce15            JP NC, 15CEh
162D  cd9415            CALL 1594h
1630  1b                DEC DE
1631  7a                LD A, D
1632  b3                OR E
1633  20ec              JR NZ, 1621h
1635  7c                LD A, H
1636  1896              JR 15CEh

; --- 1638 low-level read (Winchester first sector) ---
1638  cd8b16            CALL 168Bh
163B  e5                PUSH HL
163C  2ef0              LD L, F0h
163E  b7                OR A
163F  2002              JR NZ, 1643h
1641  2ed0              LD L, D0h            ; unit 0 ready mask
1643  cd7816            CALL 1678h
1646  e1                POP HL
1647  3817              JR C, 1660h
1649  3e20              LD A, 20h
164B  d3a7              OUT (A7h), A         ; read command
164D  cdbc16            CALL 16BCh
1650  2813              JR Z, 1665h
1652  cd7016            CALL 1670h
1655  78                LD A, B
1656  fe08              CP 08h
1658  3e04              LD A, 04h            ; DISK READ
165A  c2ce15            JP NZ, 15CEh
165D  cd7616            CALL 1676h
1660  3e06              LD A, 06h
1662  c3ce15            JP 15CEh
1665  0ea0              LD C, A0h
1667  0600              LD B, 00h
1669  edb2              INIR                 ; 256 bytes
166B  edb2              INIR                 ; 256 bytes = 512 total
166D  c3ce15            JP 15CEh

; --- 168B: A<3 Winchester unit bits on A6 ---
168B  08                EX AF, AF'
168C  7b                LD A, E
168D  d3a4              OUT (A4h), A
168F  7a                LD A, D
1690  d3a5              OUT (A5h), A
1692  78                LD A, B
1693  d3a3              OUT (A3h), A
1695  3e01              LD A, 01h
1697  d3a2              OUT (A2h), A
1699  3d                DEC A
169A  08                EX AF, AF'
169B  fe03              CP 03h
169D  380e              JR C, 16ADh          ; ★ Winchester / unit <3
169F  d603              SUB 03h              ; floppy A>=3
16A1  87                ADD A, A
16A2  f638              OR 38h
16A4  47                LD B, A
16A5  79                LD A, C
16A6  e601              AND 01h
16A8  b0                OR B
16A9  d3a6              OUT (A6h), A
16AB  08                EX AF, AF'
16AC  c9                RET
16AD  87                ADD A, A             ; A = unit*8
16AE  87                ADD A, A
16AF  87                ADD A, A
16B0  f6a0              OR A0h
16B2  47                LD B, A
16B3  79                LD A, C
16B4  e607              AND 07h
16B6  b0                OR B
16B7  d3a6              OUT (A6h), A
16B9  08                EX AF, AF'
16BA  3d                DEC A
16BB  c9                RET
