; =============================================================================
; System test suite 01D2h (+ continuous test 01B2, helpers through 03BF)
; Source: VECTOR 4/8086 - V2_AC_Interleaved_XHE_XHO.bin
; CPU: Z80  |  base: 0000h
; See also: docs/05-system-test-suite.md
; =============================================================================

; --- Continuous test (menu key T) ---
01B2  af                XOR A  ; CONTINUOUS TEST entry (menu T)
01B3  32dc5f            LD (5FDCh), A
01B6  21a406            LD HL, 06A4h  ; print cycle banner @06A4
01B9  cde403            CALL 03E4h
01BC  3adc5f            LD A, (5FDCh)
01BF  cd0604            CALL 0406h
01C2  3e0e              LD A, 0Eh
01C4  cd4304            CALL 0443h
01C7  cdd201            CALL 01D2h  ; CALL system test suite
01CA  d8                RET C  ; fail CF → RET menu
01CB  c0                RET NZ  ; abort NZ → RET menu
01CC  21dc5f            LD HL, 5FDCh  ; pass: inc cycle, loop
01CF  34                INC (HL)
01D0  18e4              JR 01B6h

; --- Suite dispatcher 01D2 ---
01D2  e1                POP HL  ; SYSTEM TEST SUITE entry
01D3  d1                POP DE
01D4  310060            LD SP, 6000h  ; SP=6000 test stack
01D7  d5                PUSH DE
01D8  e5                PUSH HL
01D9  cdf701            CALL 01F7h  ; PROM checksum
01DC  380f              JR C, 01EDh
01DE  cd1102            CALL 0211h  ; keyboard test
01E1  380a              JR C, 01EDh
01E3  cd4402            CALL 0244h  ; disk controller test
01E6  3805              JR C, 01EDh
01E8  cd6d02            CALL 026Dh  ; memory/screen test
01EB  3003              JR NC, 01F0h
01ED  cddd03            CALL 03DDh  ; fail: OUT (00),02
01F0  e1                POP HL
01F1  d1                POP DE
01F2  310022            LD SP, 2200h  ; SP=2200 restore
01F5  d5                PUSH DE
01F6  e9                JP (HL)  ; JP (HL) return to caller w/ flags

; --- 01F7 PROM checksum ---
01F7  210000            LD HL, 0000h  ; TEST PROM: sum 0000-1FFF == 20h
01FA  0600              LD B, 00h
01FC  78                LD A, B
01FD  86                ADD A, (HL)
01FE  47                LD B, A
01FF  23                INC HL
0200  7c                LD A, H
0201  fe20              CP 20h
0203  20f7              JR NZ, 01FCh
0205  78                LD A, B
0206  d620              SUB 20h
0208  c8                RET Z
0209  218807            LD HL, 0788h  ; FAULT IN PROM
020C  cde403            CALL 03E4h
020F  37                SCF
0210  c9                RET

; --- 0211 Keyboard ---
0211  db00              IN A, (00h)  ; TEST KEYBOARD: expect AAh
0213  210000            LD HL, 0000h
0216  db01              IN A, (01h)
0218  e601              AND 01h
021A  2007              JR NZ, 0223h
021C  2b                DEC HL
021D  7c                LD A, H
021E  b5                OR L
021F  20f5              JR NZ, 0216h
0221  1819              JR 023Ch
0223  210000            LD HL, 0000h
0226  3e10              LD A, 10h
0228  d300              OUT (00h), A
022A  db01              IN A, (01h)
022C  e602              AND 02h
022E  2007              JR NZ, 0237h
0230  2b                DEC HL
0231  7c                LD A, H
0232  b5                OR L
0233  20f5              JR NZ, 022Ah
0235  1805              JR 023Ch
0237  db00              IN A, (00h)
0239  d6aa              SUB AAh
023B  c8                RET Z
023C  219d07            LD HL, 079Dh  ; FAULT IN KEYBOARD
023F  cde403            CALL 03E4h
0242  37                SCF
0243  c9                RET

; --- 0244 Disk controller ---
0244  3aaa09            LD A, (09AAh)  ; TEST DISK: 15AA if drives configured
0247  b7                OR A
0248  2005              JR NZ, 024Fh
024A  3aad09            LD A, (09ADh)
024D  b7                OR A
024E  c8                RET Z
024F  cdaa15            CALL 15AAh
0252  b7                OR A
0253  c8                RET Z
0254  c5                PUSH BC
0255  f5                PUSH AF
0256  21b607            LD HL, 07B6h  ; FAULT IN DISK CONTROLLER
0259  cde403            CALL 03E4h
025C  f1                POP AF
025D  cdf203            CALL 03F2h
0260  c1                POP BC
0261  78                LD A, B
0262  cdf203            CALL 03F2h
0265  21f107            LD HL, 07F1h
0268  cde403            CALL 03E4h
026B  37                SCF
026C  c9                RET

; --- 026D Memory / screen ---
026D  cdda03            CALL 03DAh  ; TEST MEMORY/SCREEN
0270  cd2103            CALL 0321h  ; screen AA/55 bank CE
0273  d8                RET C
0274  16ff              LD D, FFh
0276  cd3604            CALL 0436h  ; size probe banks FF/BF/7F
0279  21ff77            LD HL, 77FFh
027C  7e                LD A, (HL)
027D  2f                CPL
027E  77                LD (HL), A
027F  2f                CPL
0280  be                CP (HL)
0281  3eff              LD A, FFh
0283  2024              JR NZ, 02A9h
0285  16bf              LD D, BFh
0287  cd3604            CALL 0436h
028A  21ff77            LD HL, 77FFh
028D  7e                LD A, (HL)
028E  2f                CPL
028F  77                LD (HL), A
0290  2f                CPL
0291  be                CP (HL)
0292  3ebf              LD A, BFh
0294  2013              JR NZ, 02A9h
0296  167f              LD D, 7Fh
0298  cd3604            CALL 0436h
029B  21ff77            LD HL, 77FFh
029E  7e                LD A, (HL)
029F  2f                CPL
02A0  77                LD (HL), A
02A1  2f                CPL
02A2  be                CP (HL)
02A3  3e7f              LD A, 7Fh
02A5  2002              JR NZ, 02A9h
02A7  3e3f              LD A, 3Fh
02A9  06ce              LD B, CEh
02AB  32da5f            LD (5FDAh), A
02AE  78                LD A, B
02AF  32db5f            LD (5FDBh), A
02B2  1600              LD D, 00h
02B4  cd4603            CALL 0346h  ; march each bank via 0346
02B7  d8                RET C
02B8  21ff77            LD HL, 77FFh
02BB  72                LD (HL), D
02BC  cdd503            CALL 03D5h
02BF  280d              JR Z, 02CEh
02C1  cdda03            CALL 03DAh
02C4  fe1b              CP 1Bh  ; ESC/space abort
02C6  2804              JR Z, 02CCh
02C8  fe20              CP 20h
02CA  2002              JR NZ, 02CEh
02CC  b7                OR A
02CD  c9                RET
02CE  14                INC D
02CF  3adb5f            LD A, (5FDBh)
02D2  ba                CP D
02D3  28f9              JR Z, 02CEh
02D5  7a                LD A, D
02D6  fed0              CP D0h
02D8  3804              JR C, 02DEh
02DA  fee0              CP E0h
02DC  38f0              JR C, 02CEh
02DE  3ada5f            LD A, (5FDAh)
02E1  ba                CP D
02E2  20d0              JR NZ, 02B4h
02E4  1600              LD D, 00h
02E6  cd3604            CALL 0436h  ; verify phase
02E9  3aff77            LD A, (77FFh)
02EC  ba                CP D
02ED  2017              JR NZ, 0306h
02EF  14                INC D
02F0  3adb5f            LD A, (5FDBh)
02F3  ba                CP D
02F4  28f9              JR Z, 02EFh
02F6  7a                LD A, D
02F7  fed0              CP D0h
02F9  3804              JR C, 02FFh
02FB  fee0              CP E0h
02FD  38f0              JR C, 02EFh
02FF  3ada5f            LD A, (5FDAh)
0302  ba                CP D
0303  20e1              JR NZ, 02E6h
0305  c9                RET
0306  5f                LD E, A  ; BLOCK CONFLICT
0307  216307            LD HL, 0763h
030A  d5                PUSH DE
030B  cde403            CALL 03E4h
030E  d1                POP DE
030F  7a                LD A, D
0310  d5                PUSH DE
0311  cdf203            CALL 03F2h
0314  d1                POP DE
0315  7b                LD A, E
0316  cdf203            CALL 03F2h
0319  21f107            LD HL, 07F1h
031C  cde403            CALL 03E4h
031F  37                SCF
0320  c9                RET

; --- 0321 Screen RAM AA/55 ---
0321  16ce              LD D, CEh  ; screen memory test
0323  cd3604            CALL 0436h
0326  210070            LD HL, 7000h
0329  4e                LD C, (HL)
032A  3eaa              LD A, AAh
032C  77                LD (HL), A
032D  be                CP (HL)
032E  200d              JR NZ, 033Dh
0330  2f                CPL
0331  77                LD (HL), A
0332  be                CP (HL)
0333  2008              JR NZ, 033Dh
0335  71                LD (HL), C
0336  23                INC HL
0337  7c                LD A, H
0338  fe78              CP 78h
033A  20ed              JR NZ, 0329h
033C  c9                RET
033D  71                LD (HL), C  ; FAULT IN SCREEN MEMORY
033E  21d307            LD HL, 07D3h
0341  cde403            CALL 03E4h
0344  37                SCF
0345  c9                RET

; --- 0346 Bank march + 03AC pretest ---
0346  cd3604            CALL 0436h  ; bank march test
0349  cdac03            CALL 03ACh
034C  2022              JR NZ, 0370h
034E  210070            LD HL, 7000h
0351  e5                PUSH HL
0352  3adc5f            LD A, (5FDCh)
0355  5f                LD E, A
0356  7d                LD A, L
0357  84                ADD A, H
0358  83                ADD A, E
0359  77                LD (HL), A
035A  23                INC HL
035B  7c                LD A, H
035C  fe78              CP 78h
035E  c25603            JP NZ, 0356h
0361  e1                POP HL
0362  7d                LD A, L
0363  84                ADD A, H
0364  83                ADD A, E
0365  be                CP (HL)
0366  2008              JR NZ, 0370h
0368  23                INC HL
0369  7c                LD A, H
036A  fe78              CP 78h
036C  c26203            JP NZ, 0362h
036F  c9                RET
0370  ae                XOR (HL)  ; FAULT IN MEMORY - BLOCK detail
0371  5f                LD E, A
0372  cb45              BIT 0, L
0374  08                EX AF, AF'
0375  d5                PUSH DE
0376  21ff06            LD HL, 06FFh
0379  cde403            CALL 03E4h
037C  d1                POP DE
037D  7a                LD A, D
037E  d5                PUSH DE
037F  cdf203            CALL 03F2h
0382  211b07            LD HL, 071Bh
0385  cde403            CALL 03E4h
0388  d1                POP DE
0389  7b                LD A, E
038A  d5                PUSH DE
038B  cdf203            CALL 03F2h
038E  213407            LD HL, 0734h
0391  08                EX AF, AF'
0392  2803              JR Z, 0397h
0394  212207            LD HL, 0722h
0397  cde403            CALL 03E4h
039A  d1                POP DE
039B  7a                LD A, D
039C  fe40              CP 40h
039E  3802              JR C, 03A2h
03A0  37                SCF
03A1  c9                RET
03A2  214507            LD HL, 0745h  ; MAIN MEMORY FAULT - HALTING
03A5  cde403            CALL 03E4h
03A8  cddd03            CALL 03DDh
03AB  76                HALT
03AC  210070            LD HL, 7000h  ; AA/55 pretest 7000-77FF
03AF  3eaa              LD A, AAh
03B1  77                LD (HL), A
03B2  be                CP (HL)
03B3  c0                RET NZ
03B4  2f                CPL
03B5  77                LD (HL), A
03B6  be                CP (HL)
03B7  c0                RET NZ
03B8  23                INC HL
03B9  7c                LD A, H
03BA  fe78              CP 78h
03BC  c2af03            JP NZ, 03AFh
03BF  c9                RET
