From dfb82db1432b019cde6300e46b02e4c275f0c1e2 Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Wed, 1 Apr 2026 17:16:00 +0100 Subject: [PATCH] Added RFS versions of BASIC MZ-5Z008 and 2Z009E --- asm/mz2z009e.asm | 2378 +- asm/mz2z009e_orig.asm | 12 + asm/mz2z009e_rfs.asm | 12 + asm/mz5z008.asm | 4110 +++- asm/mz5z008_orig.asm | 12 + asm/mz5z008_rfs.asm | 20232 +--------------- dis/MZ-2Z009E/mz2z009e_dz80.asm | 1063 +- dis/MZ-5Z008/mz5z008.asm | 17821 -------------- dis/MZ-5Z008/mz5z008_dz80.asm | 1169 +- tools/MZQD/MZQDTool | Bin 0 -> 17320 bytes tools/MZQD/MZQDTool.c | 366 + tools/MZQD/Makefile | 19 + tools/MZQD/side_a/AUTO RUN.mzf | Bin 0 -> 382 bytes tools/MZQD/side_a/BASIC 5Z008A RFS.mzf | Bin 0 -> 37210 bytes tools/MZQD/side_a/BASIC 5Z008ADRFS.mzf | Bin 0 -> 38045 bytes tools/MZQD/side_a/BASIC MZ-5Z008 ORIG.mzf | Bin 0 -> 34431 bytes tools/MZQD/side_a/BASIC MZ-5Z008.mzf | Bin 0 -> 34434 bytes tools/MZQD/side_b/DELETE.mzf | Bin 0 -> 8575 bytes tools/MZQD/side_b/QDCOPY.mzf | Bin 0 -> 7967 bytes tools/MZQD/side_b/TRANS.mzf | Bin 0 -> 25795 bytes .../MZQD/side_b_applications/OPENING 800.mzf | Bin 0 -> 17505 bytes .../MZQD/side_b_applications/OPENING DATA.mzf | Bin 0 -> 2176 bytes tools/MZQDTool | Bin 0 -> 17320 bytes tools/assemble_roms.sh | 2 +- tools/make_roms.sh | 6 +- 25 files changed, 6250 insertions(+), 40952 deletions(-) create mode 100644 asm/mz2z009e_orig.asm create mode 100644 asm/mz2z009e_rfs.asm create mode 100644 asm/mz5z008_orig.asm delete mode 100644 dis/MZ-5Z008/mz5z008.asm create mode 100755 tools/MZQD/MZQDTool create mode 100755 tools/MZQD/MZQDTool.c create mode 100644 tools/MZQD/Makefile create mode 100644 tools/MZQD/side_a/AUTO RUN.mzf create mode 100644 tools/MZQD/side_a/BASIC 5Z008A RFS.mzf create mode 100644 tools/MZQD/side_a/BASIC 5Z008ADRFS.mzf create mode 100644 tools/MZQD/side_a/BASIC MZ-5Z008 ORIG.mzf create mode 100644 tools/MZQD/side_a/BASIC MZ-5Z008.mzf create mode 100644 tools/MZQD/side_b/DELETE.mzf create mode 100644 tools/MZQD/side_b/QDCOPY.mzf create mode 100644 tools/MZQD/side_b/TRANS.mzf create mode 100644 tools/MZQD/side_b_applications/OPENING 800.mzf create mode 100644 tools/MZQD/side_b_applications/OPENING DATA.mzf create mode 100755 tools/MZQDTool diff --git a/asm/mz2z009e.asm b/asm/mz2z009e.asm index aaa7881..e7233d8 100644 --- a/asm/mz2z009e.asm +++ b/asm/mz2z009e.asm @@ -103,14 +103,6 @@ CPLANE EQU 0109CH MAXCF EQU 0109DH PMASK EQU 0109EH GMODE EQU 0109FH -APTS EQU 010F0H -NAME EQU 010F1H -SIZE EQU 01102H -DTADR EQU 01104H -EXADR EQU 01106H -COMNT EQU 01108H -DTEFG EQU 01171H -DTEFGX EQU 01172H TMCNT EQU 01195H SUMDT EQU 01197H CSMDT EQU 01199H @@ -124,7 +116,6 @@ FUNBUF EQU 012B2H INBUFC EQU 01352H INBUFL EQU 01353H INBUF EQU 01354H -TIMST EQU 00033H LINLIM EQU 01364H KEYDAT EQU 01365H AMPM EQU 01366H @@ -167,27 +158,54 @@ TEXTBF EQU 02000H BITBUF EQU 08000H IBUFE EQU 010F0H ERRTXT EQU 0FDA0H -ATRB EQU 010F0H PRGSTART EQU 00000H -TAPECOPY EQU 01200H -BUILD_ORIG EQU 1 -BUILD_RFS EQU 0 - ; Create an MZF Tape header. +; =========================================================================== +; Build configuration — set these flags to select the build variant: +; +; BUILD_RFS=0, BUILD_TAPE=0 : Original BASIC (FD boot BIN) +; BUILD_RFS=0, BUILD_TAPE=1 : Original BASIC (Tape/CMT/RFS ROM boot) +; BUILD_RFS=1, BUILD_TAPE=0 : RFS Enhanced BASIC (FD boot BIN) +; BUILD_RFS=1, BUILD_TAPE=1 : RFS Enhanced BASIC (Tape/CMT/RFS ROM boot) +; =========================================================================== +;BUILD_RFS EQU 1 ; 0 = original BASIC, 1 = RFS enhancements +;BUILD_TAPE EQU 0 ; 0 = FD/BIN, 1 = Tape/CMT/RFS ROM boot + +; Tape/CMT boot constants +ATRB EQU 010F0H ; MZF header location (= ELMD area) +TAPECOPY EQU 01200H ; Load address for tape bootstrap +TIMST EQU 00033H ; Timer stop routine in Monitor ROM +HDRLEN EQU 00040H ; MZF header length (64 bytes) + +; RFS (ROM Filing System) hardware registers and constants +PORT_LODRAM EQU 0E0H ; OUT: map 0000-0FFF to DRAM +PORT_DRAM EQU 0E1H ; OUT: map D000-FFFF to DRAM +PORT_LOROM EQU 0E2H ; OUT: map 0000-0FFF to Monitor ROM +PORT_MMIO EQU 0E3H ; OUT: map D000-FFFF to VRAM/MMIO/ROM +BNKCTRLRST EQU 0EFF8H ; RFS bank control reset register +BNKCTRL EQU 0EFFFH ; Bank Control register (CS, CLK bits) +HWSPIDATA EQU 0EFFBH ; Hardware SPI Data register (read/write) +HWSPISTART EQU 0EFFCH ; Start SPI transfer register +SDCS_ACT EQU 001H ; BNKCTRL: CS LOW (active), BBCLK enable +SDCS_DEACT EQU 003H ; BNKCTRL: CS HIGH (inactive), BBCLK enable +L8CA0 EQU 08CA0H ; Color attribute buffer address (was DS padding) + +; --------------------------------------------------------------------------- +; MZF tape header (only for BUILD_TAPE=1) +; --------------------------------------------------------------------------- + IF BUILD_TAPE = 1 ORG ATRB - - ; Declare the MZF header to bootstrap BASIC from tape/SD. -BOOTATRB: DB 01h ; Code Type, 01 = Machine Code. -BOOTNAME: IF BUILD_ORIG = 1 - DB "BASIC 2Z-009E ", 0Dh ; Title/Name (17 bytes). - ENDIF +BOOTATRB: DB 001H ; File type: 01 = Machine Code IF BUILD_RFS = 1 - DB "BASIC 2Z-009ERFS", 0Dh ; Title/Name (17 bytes). +BOOTNAME: DB "BASIC 2Z-009ERFS", 00DH ; Title (17 bytes + CR) + ELSE +BOOTNAME: DB "BASIC 2Z-009E ", 00DH ; Title (17 bytes + CR) + ENDIF +BOOTSIZE: DW BASICEND - L0000 ; Size of program +BOOTDTADR: DW TAPECOPY ; Load address +BOOTEXADR: DW EXECSTART + TAPECOPY ; Exec address (relocated) +BOOTCOMNT: DS 104 ; Comment area (unused) ENDIF -BOOTSIZE: DW BASICEND - L0000 ; Size of program. -BOOTDTADR: DW TAPECOPY ; Load address of program. -BOOTEXADR: DW EXECSTART + TAPECOPY ; Exec address of program. -BOOTCOMNT: DS 104 ORG PRGSTART @@ -247,15 +265,11 @@ L004D: DB 000H ; System status / work area L004E: DB 000H L004F: DB 0FFH L0050: DB 000H - DB 0C3H - DB 0EEH - DB 00BH +L0051: JP L0BEE ; Jump vector (dynamic) L0054: DS 2, 000H L0056: DB 000H L0057: DB 018H - DB 0C3H - DB 08AH - DB 003H +L0058: JP 0038AH ; Jump vector (dynamic) L005B: DB 000H DB 027H L005D: DB 071H @@ -488,154 +502,94 @@ L017B: XOR A LD HL,0803EH LD HL,L80F6 L0182: PUSH AF - CALL L0D20 - POP AF - JP L0000 + JP RFS_ERR_HOOK ; Hook BEFORE L0D20 (Monitor ROM overlay at 0000-0FFF) + POP AF ; Dead code — original bytes for Monitor ROM compatibility + JP L0000 ; Dead code — original warm restart target -L018A: LD A,H - DEC A - CALL PE,0E805H - DEC B - RST 038H - DEC BC - LD B,E - INC C - EX AF,AF' - ADD HL,BC - XOR C - RRCA - LD A,00FH - RET Z - DEC BC - JP Z,0D80BH - DEC BC - AND 00BH -L01A2: ADC A,H - LD (BC),A - ADC A,D - INC BC - POP BC - DEC B - AND B - INC D - ADD A,A - LD A,(BC) - ADC A,C - LD A,(BC) - SCF - LD A,(BC) - LD B,(HL) - INC D - HALT - INC D - SUB C - INC D - LD B,014H - LD E,H - LD (BC),A - POP HL - INC C - RET PE - INC C - RST 028H - INC C - PUSH HL - INC D - AND H - INC DE - LD (HL),D - INC DE - LD C,E - LD B,LSE5 - NOP - LD A,00DH - JR NC,L01CE ; (+000H) -L01CE: PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - ADC A,A - ADD HL,BC - LD D,L - ADD HL,BC - PUSH HL -L01D9: NOP - RET PE - DEC DE - IN A,(01EH) - DEC E - RRA -L01E0: POP AF - LD E,03DH - LD A,(DE) - CP B - LD A,(DE) - RET PO - ADD HL,DE - LD (HL),C - DEC DE - OR H - INC E - RET C - INC E - RET - - INC E - POP HL - LD A,(DE) - RET NC - JR L01D9 ; (-01cH) - - JR 00243H ; (+04cH) - - ADD HL,DE - RRCA - JR L01A2 ; (-059H) - - DEC DE - DEC DE - DEC E - DB 0DDH - INC D -L0200: PUSH HL - NOP - LD E,B - LD E,067H - INC L - OR (HL) - INC L - LD B,(HL) - INC L - NOP - ADD HL,HL - SBC A,L - LD HL,(02925H) - XOR E - RRA - CALL M,L742A - RLCA - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP +; --------------------------------------------------------------------------- +; SVC Dispatch Table — 80 entries (#00-#4F), each a 16-bit handler address. +; RST 018H reads the SVC number (byte after RST), looks up handler[SVC*2]. +; --------------------------------------------------------------------------- +L018A: DW 03D7CH ; SVC #00 + DW 005ECH ; SVC #01 + DW 005E8H ; SVC #02 + DW 00BFFH ; SVC #03 + DW 00C43H ; SVC #04 + DW 00908H ; SVC #05 + DW 00FA9H ; SVC #06 + DW 00F3EH ; SVC #07 + DW 00BC8H ; SVC #08 + DW 00BCAH ; SVC #09 + DW 00BD8H ; SVC #0A + DW 00BE6H ; SVC #0B + DW 0028CH ; SVC #0C + DW 0038AH ; SVC #0D + DW 005C1H ; SVC #0E + DW 014A0H ; SVC #0F + DW 00A87H ; SVC #10 + DW 00A89H ; SVC #11 + DW 00A37H ; SVC #12 + DW 01446H ; SVC #13 + DW 01476H ; SVC #14 + DW 01491H ; SVC #15 + DW 01406H ; SVC #16 + DW 0025CH ; SVC #17 + DW 00CE1H ; SVC #18 + DW 00CE8H ; SVC #19 + DW 00CEFH ; SVC #1A + DW 014E5H ; SVC #1B + DW 013A4H ; SVC #1C + DW 01372H ; SVC #1D + DW 0064BH ; SVC #1E + DW 000E5H ; SVC #1F + DW 00D3EH ; SVC #20 + DW 00030H ; SVC #21 + DW 000E5H ; SVC #22 + DW 000E5H ; SVC #23 + DW 000E5H ; SVC #24 + DW 0098FH ; SVC #25 + DW 00955H ; SVC #26 + DW 000E5H ; SVC #27 + DW 01BE8H ; SVC #28 + DW 01EDBH ; SVC #29 + DW 01F1DH ; SVC #2A +L01E0: DW 01EF1H ; SVC #2B + DW 01A3DH ; SVC #2C + DW 01AB8H ; SVC #2D + DW 019E0H ; SVC #2E + DW 01B71H ; SVC #2F + DW 01CB4H ; SVC #30 + DW 01CD8H ; SVC #31 + DW 01CC9H ; SVC #32 + DW 01AE1H ; SVC #33 + DW 018D0H ; SVC #34 + DW 018E4H ; SVC #35 + DW 0194CH ; SVC #36 + DW 0180FH ; SVC #37 + DW 01BA7H ; SVC #38 + DW 01D1BH ; SVC #39 + DW 014DDH ; SVC #3A +L0200: DW 000E5H ; SVC #3B + DW 01E58H ; SVC #3C + DW 02C67H ; SVC #3D + DW 02CB6H ; SVC #3E + DW 02C46H ; SVC #3F + DW 02900H ; SVC #40 + DW 02A9DH ; SVC #41 + DW 02925H ; SVC #42 + DW 01FABH ; SVC #43 + DW 02AFCH ; SVC #44 + DW 00774H ; SVC #45 + DW 000E5H ; SVC #46 (BREAKZ) + DW 000E5H ; SVC #47 + DW 000E5H ; SVC #48 + DW 000E5H ; SVC #49 + DW 000E5H ; SVC #4A + DW 000E5H ; SVC #4B + DW 000E5H ; SVC #4C + DW 000E5H ; SVC #4D + DW 000E5H ; SVC #4E + DW 000E5H ; SVC #4F SVC_DISP: EX (SP),HL PUSH AF LD A,(HL) @@ -3841,8 +3795,8 @@ L1A9B: LD (L1044),HL RET NZ LD A,(L1001) CP 00DH - JP Z,01F9AH - RET + JP Z,BC_ERR_HOOK ; !BC hook: L1F6A cascade path + RET CALL SKPDE CALL L1AEF @@ -3892,7 +3846,7 @@ L1B18: DB 02AH JP NZ,L2B7F LD A,(L1043) BIT 2,A - JP NZ,01F97H + JP NZ,YP_HOOK_A ; !Y source A: L1043 bit2 BIT 1,A LD IX,(ZWO) JR NZ,L1B65 ; (+00bH) @@ -3981,7 +3935,7 @@ L1BEF: LD A,C L1BFD: CALL SKPDE LD A,(L1050) BIT 6,A - JP Z,01F97H + JP Z,YP_HOOK_B ; !Y source B: L1050 bit6=0 CALL 018C7H LD A,(ZDIRMX) LD B,A @@ -4080,9 +4034,11 @@ L1C9D: LD A,(01051H) RET Z JP 01F7CH - CALL L1D15 - JP NZ,L2AD2 - LD BC,(ELMD20) + JP SVC30_DBG ; Was: CALL L1D15 / JP NZ,RFS_SVC30_HOOK + NOP + NOP + NOP +SVC30_FD: LD BC,(ELMD20) PUSH BC XOR A LD IX,(ZINP) @@ -4090,9 +4046,12 @@ L1C9D: LD A,(01051H) POP BC RET - LD A,(01051H) - BIT 7,A - JP Z,01F97H + JP SVC32_FIX ; Was: LD A,(01051H) / BIT 7,A / JP Z,01F97H + NOP ; Padding (original was 8 bytes, now 3+1+1=5+...) + NOP + NOP + NOP + NOP LD BC,(ELMD20) JP L313A @@ -4104,7 +4063,7 @@ L1C9D: LD A,(01051H) L1CE4: CALL L1D15 JP NZ,L2AE0 BIT 7,A - JP NZ,01F97H + JP NZ,YP_HOOK_C ; !Y source C: device setup bit7 PUSH DE LD HL,L0200 LD (L1042),HL @@ -4133,12 +4092,12 @@ L1D15: LD A,(L1050) CALL L1C5B LD HL,L1050 BIT 7,(HL) - JP NZ,01F97H + JP NZ,YP_HOOK_D ; !Y source D: L1050 bit7 BIT 5,(HL) - JP NZ,02F38H + JP NZ,RFS_BIT5PATH INC HL BIT 7,(HL) - JP NZ,01F97H + JP NZ,YP_HOOK_E ; !Y source E: L1051 bit7 LD HL,L2000 LD BC,00008H L1D43: CALL ?CLRHL @@ -4178,7 +4137,7 @@ L1D6B: LD (01E13H),A CALL L1D15 LD IX,(ZFREE) JR Z,L1D95 ; (+004H) - LD IX,L2F4B + LD IX,RFS_FREE_HOOK L1D95: CALL IOCALL JR C,L1DA8 ; (+00eH) LD H,B @@ -4838,7 +4797,7 @@ L2B51: CALL SKPDE JP L2E77 L2B6A: CALL L1D15 - JP Z,01F97H + JP Z,YP_HOOK_F ; !Y source F: L1D15 bit5=0 CALL L2E36 CALL 02F38H LD A,(HL) @@ -5446,7 +5405,7 @@ L2F4B: PUSH HL JP L368D L2F6E: CALL L1D15 - JP Z,01F97H + JP Z,SVC2F_YP_DBG ; Was: JP Z,01F97H — hook to trace !Y cause POP HL CALL LDDEMI LD (02FB1H),HL @@ -5497,7 +5456,7 @@ L2FC9: PUSH HL RET L2FCF: OR 0AFH -L2FD1: CALL L2FE8 +L2FD1: CALL L2FE8 ; Patched at runtime by L4000 cold start → CALL L2FE8_FIX L2FD4: CALL SKPDE OR A LD IX,(ZINP) @@ -5695,7 +5654,7 @@ L3153: LD (03109H),SP JR Z,L3107 ; (-05cH) CALL L32CB CALL L3174 - DI + DI OUT (LSE4),A CALL NC,L065B CALL NC,L3274 @@ -6717,18 +6676,27 @@ L389B: CALL L388D POP BC RET -$QD: DB 05EH,00DH,051H,044H ; $QD - Quick Disk device descriptor - DS 2, 000H - DB "_@ ",0C4H,038H - DB FDPD - DB "8*9",0DAH,038H,000H,004H,018H - DS 3, 039H - DB 097H - DB 01FH - DB 097H - DB 01FH - DB 0C1H - DB 038H +; $QD - Quick Disk device descriptor (29 bytes) +$QD: + IF BUILD_RFS = 1 + DW $RFS ; Next device = $RFS (RFS enhanced) + ELSE + DW $USR ; Next device = $USR (original) + ENDIF + DB "QD",000H,000H ; Device name + DB 05FH ; flags1 + DB 040H ; flags2 + DB 020H ; dirmx (32 entries) + DW 038C4H ; ZINIT + DW 038FBH ; ZRO + DW 0392AH ; ZWO + DW 038DAH ; ZCL + DW 00400H ; ZKL + DW 03918H ; ZINP + DW 03939H ; ZOUT + DW 01F97H ; ZDELT + DW 01F97H ; ZWDIR + DW 038C1H ; ZFREE NOP NOP XOR A @@ -7815,7 +7783,12 @@ L3FDB: POP HL RET DS 33, 000H -L4000: LD HL,L85FE +L4000: + IF BUILD_RFS = 1 + LD HL,RFS_END ; TEXTST: moved past RFS module + ELSE + LD HL,085FEH ; TEXTST: original end of BASIC code + ENDIF LD (L1070),HL LD HL,L4052 LD (000E3H),HL @@ -7834,9 +7807,13 @@ L401B: LD A,(L0036) L4027: LD DE,L84E0 RST 018H L402B: DB 005H - RST 018H + IF BUILD_RFS = 1 + JP MEMCLI_PATCH ; RFS: call SVC 020H then set HL=RFS_END + ELSE + RST 018H ; Original: SVC 020H (boot beep + EI) DB 020H EX DE,HL + ENDIF L402F: LD (HL),000H INC HL LD A,H @@ -9408,24 +9385,13 @@ L4B4E: LD A,L DB 005H RET -L4B5C: JR NZ,04BA7H ; (+049H) - LD C,(HL) - JR NZ,L4B61 ; (+000H) -L4B61: LD B,D - DEC B - LD D,D - LD B,L - LD B,C - LD C,E - NOP -L4B68: LD D,D - DEC B - LD B,L - LD B,C - LD B,H - LD E,C -L4B6E: NOP - NOP +L4B5C: DB 020H,049H,04EH,020H,000H ; " IN \0" — error location text +L4B61: DB 042H,005H ; "B\x05" — control prefix + DB 052H,045H,041H,04BH,000H ; "REAK\0" — BREAK message +L4B68: DB 052H,005H ; "R\x05" — control prefix + DB 045H,041H,044H,059H ; "EADY" — Ready prompt +L4B6E: DB 000H ; NUL terminator + DB 000H ; padding L4B70: CALL L6E43 DEC A CP 046H @@ -11352,7 +11318,7 @@ L592D: CALL L46AE L593A: PUSH HL CALL HLFTCH - LD DE,L5982 + LD DE,DEVNAMEBUF LD B,001H CALL L5975 CALL NC,L5975 @@ -11365,13 +11331,14 @@ L593A: PUSH HL LD A,03AH LD (DE),A POP AF - LD DE,L5982 - JR L596B ; (+009H) + JP RFS_DIR_FIX ; Was: LD DE,L5982 / JR L596B (buffer now DEVNAMEBUF) + NOP + NOP L5962: POP HL CALL L414A LD B,000H - CALL NZ,L6E67 + CALL NZ,RFS_DIR_STR ; Was: L6E67; handles RFS device name in strings L596B: PUSH HL RST 018H DB 02CH @@ -11836,11 +11803,11 @@ L5C86: PUSH HL LD (L1014),HL LD A,(L1001) CP 00DH - JP Z,04B46H + JP Z,BC_ERR_HOOK ; !BC hook: dump ELMD before error 0xBC RST 018H DB 031H POP HL - RET + RET L5CB3: CALL TESTX DB 041H @@ -12487,54 +12454,21 @@ L60E3: CCF LD HL,L0000 RET -L60E8: SBC A,E - LD A,0BCH - JR NZ,L60ED ; (+000H) -L60ED: SBC A,B - JR L6086 ; (-06aH) - - ADD A,B - NOP - SUB H - LD (HL),H - INC H - NOP - NOP - SUB C - LD B,E - LD D,B - NOP - NOP - ADC A,(HL) - INC E - LD B,B - NOP - NOP - ADC A,D - LD A,D - NOP - NOP - NOP - ADD A,A - LD C,B - NOP - NOP - NOP -L610B: ADD A,H - JR NZ,L610E ; (+000H) -L610E: NOP - NOP -L6110: ADD A,C - NOP - NOP - NOP - NOP - LD A,L - LD C,H - CALL Z,0CDCCH -L611A: LD H,(HL) - DEC HL - CALL Z,L1277 +; --------------------------------------------------------------------------- +; Floating-point constant table — powers of 10 for number formatting +; Each entry is 5 bytes (1 exponent + 4 mantissa) in Sharp MZ FP format +; --------------------------------------------------------------------------- +L60E8: DB 09BH,03EH,0BCH,020H,000H ; FP 10^9 +L60ED: DB 098H,018H,096H,080H,000H ; FP 10^8 + DB 094H,074H,024H,000H,000H ; FP 10^7 + DB 091H,043H,050H,000H,000H ; FP 10^6 + DB 08EH,01CH,040H,000H,000H ; FP 10^5 + DB 08AH,07AH,000H,000H,000H ; FP 10^4 + DB 087H,048H,000H,000H,000H ; FP 10^3 +L610B: DB 084H,020H,000H,000H,000H ; FP 10^2 +L6110: DB 081H,000H,000H,000H,000H ; FP 10^1 + DB 07DH,04CH,0CCH,0CCH,0CDH ; FP 0.1 +L611A: DB 066H,02BH,0CCH,077H,012H ; FP precision guard L611F: LD HL,(L6302) LD B,000H L6124: LD DE,L610B @@ -15033,11 +14967,7 @@ L7181: LD A,005H LD DE,L719B JP L797E -L719B: SUB C - NOP - NOP - NOP - NOP +L719B: DB 091H,000H,000H,000H,000H ; FP constant (65536.0) L71A0: CALL L5E76 LD BC,(TMPEND) PUSH BC @@ -17349,10 +17279,8 @@ L7F67: LD DE,L7F8A CALL L797E JP L7D97 -L7F8A: LD A,A - LD D,H - INC DE - CALL Z,0C5D0H +L7F8A: DB 07FH,054H,013H,0CCH,0D0H ; FP constant (used by EXP/LOG) + PUSH BC ; *** was misaligned: disassembler consumed D0+C5 as CALL Z *** PUSH HL CALL L7DB1 POP HL @@ -17523,118 +17451,36 @@ L80CB: CALL L7FCB POP BC RET -L80E0: LD A,(HL) -L80E1: XOR D - XOR D - XOR D - XOR E - LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C - LD (HL),H - RET NC - DEC C - NOP - RET NC - LD L,(HL) - JR C,L80E1 ; (-011H) - DEC E - DEC HL - LD H,A - RST 010H -L80F6: LD (L402B),A - LD H,B - JR NC,L808E ; (-06eH) - JR NC,L809B ; (-063H) - LD E,B - RST 010H - CCF - SBC A,A - LD A,(04A50H) - SUB (HL) - DEC SP - ADD A,D -L8108: ADD A,B - ADD A,B - NOP - NOP - NOP - LD A,H - LD HL,(0AAAAH) - XOR E - LD (HL),A - OR (HL) - DEC BC - LD H,B - OR (HL) - LD (HL),C - LD D,B - DEC C - NOP - RET NC - LD L,E - SUB E - JP P,0BC7DH - LD H,H - RRCA - HALT - RST 000H -L8125: ADD A,B - LD E,H - RET - -L8128: RES 4,L - LD B,(HL) - LD D,H - LD D,A - CCF - SBC A,A - LD A,(0AA7FH) - XOR D - XOR D - XOR E - LD A,(HL) - LD C,H - CALL Z,0CDCCH - LD A,(HL) - SUB D - LD C,C - INC H - SUB D - LD A,L - LD H,E - ADC A,(HL) - JR C,L8128 ; (-01cH) - LD A,L - CP D - LD L,08BH - AND E - LD A,L - DEC E - ADC A,C - RET C - SBC A,(HL) - LD A,L - ADC A,B - ADC A,B - ADC A,B - ADC A,C - LD A,H - LD (HL),B - RET P - RET P - POP AF - LD A,H - RST 010H - SUB H - DEC (HL) - PUSH HL - LD A,H - LD B,E - INC C - JR NC,L8125 ; (-03dH) +; --------------------------------------------------------------------------- +; Floating-point polynomial coefficient tables for transcendental functions +; (SIN, COS, TAN, ATN, LOG, EXP, SQR). 5 bytes per FP constant. +; --------------------------------------------------------------------------- +L80E0: DB 07EH,0AAH,0AAH,0AAH,0ABH ; SIN/COS coeff 0 + DB 07AH,008H,088H,088H,089H ; SIN/COS coeff 1 + DB 074H,0D0H,00DH,000H,0D0H ; SIN/COS coeff 2 +L80EF: DB 06EH,038H,0EFH,01DH,02BH ; SIN/COS coeff 3 + DB 067H,0D7H,032H,02BH,040H ; SIN/COS coeff 4 +L80F6: DB 060H,030H,092H,030H,09DH ; SIN/COS coeff 5 + DB 058H,0D7H,03FH,09FH,03AH ; SIN/COS coeff 6 + DB 050H,04AH,096H,03BH,082H ; SIN/COS coeff 7 +L8108: DB 080H,080H,000H,000H,000H ; FP 1.0 + DB 07CH,02AH,0AAH,0AAH,0ABH ; TAN coeff 0 + DB 077H,0B6H,00BH,060H,0B6H ; TAN coeff 1 + DB 071H,050H,00DH,000H,0D0H ; TAN coeff 2 + DB 06BH,093H,0F2H,07DH,0BCH ; TAN coeff 3 + DB 064H,00FH,076H,0C7H,080H ; TAN coeff 4 +L8125: DB 05CH,0C9H,0CBH,0A5H,046H ; TAN coeff 5 +L8128: DB 054H,057H,03FH,09FH,03AH ; ATN coeff 0 + DB 07FH,0AAH,0AAH,0AAH,0ABH ; ATN coeff 1 + DB 07EH,04CH,0CCH,0CCH,0CDH ; ATN coeff 2 + DB 07EH,092H,049H,024H,092H ; ATN coeff 3 + DB 07DH,063H,08EH,038H,0E4H ; ATN coeff 4 + DB 07DH,0BAH,02EH,08BH,0A3H ; ATN coeff 5 + DB 07DH,01DH,089H,0D8H,09EH ; ATN coeff 6 + DB 07DH,088H,088H,088H,089H ; ATN coeff 7 + DB 07CH,070H,0F0H,0F0H,0F1H ; ATN coeff 8 + DB 07CH,0D7H,094H,035H,0E5H ; ATN coeff 9 + DB 07CH,043H,00CH,030H,0C3H ; ATN coeff 10 LD DE,L0000 LD A,(HL) OR A @@ -17656,22 +17502,12 @@ L817D: PUSH BC POP BC RET -L8183: ADD A,E - LD C,C - RRCA - JP C,082A2H - LD C,C - RRCA - JP C,L81A2 - LD C,C - RRCA - JP C,080A2H - LD C,C - RRCA - JP C,L7BA2 - LD C,FDPC - DEC (HL) - INC DE +; FP constants for LOG/EXP computation +L8183: DB 083H,049H,00FH,0DAH,0A2H ; FP log2(e) + DB 082H,049H,00FH,0DAH,0A2H ; FP constant + DB 081H,049H,00FH,0DAH,0A2H ; FP constant + DB 080H,049H,00FH,0DAH,0A2H ; FP constant + DB 07BH,00EH,0FAH,035H,013H ; FP ln(2) PUSH HL CALL L60B5 LD A,000H @@ -18003,97 +17839,34 @@ L8399: CALL L7BAC POP BC RET -L83F1: NOP -L83F2: LD A,A - LD E,(HL) - LD E,E - RET C - XOR C -L83F7: LD A,A - LD C,H - CALL Z,0CDCCH -L83FC: ADD A,C - LD D,L - LD D,L - LD D,L - LD D,(HL) -L8401: ADD A,C - DEC (HL) - INC B - DI - INC (HL) - ADD A,C - JR L8440 ; (+037H) - - RET P - LD D,D - ADD A,C - DEC BC -L840D: SUB L - POP BC - CALL PO,00581H - XOR D - JP 08168H - - LD (BC),A - CALL 09986H - ADD A,C - LD BC,0D164H - CALL P,L0081 - OR C - IN D,(C) - ADD A,C - NOP - LD E,B - RST 010H - OUT (080H),A - DEC (HL) - INC B - DI - INC (HL) - ADD A,B - LD D,A - LD B,H - CALL M,L80CB - LD L,D - RET NZ - ADD A,0E8H - ADD A,B - LD (HL),L - DEC H - LD A,L - LD D,080H - LD A,D - ADD A,E -L8440: OR D - CALL C,07D80H - LD A,00CH - DEC C - ADD A,B - LD A,(HL) - SBC A,(HL) - LD DE,0805DH - LD A,A - LD C,(HL) - BIT 3,D -L8451: LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C -L8456: ADD A,B - LD SP,L1772 - RET M -L845B: ADD A,B - LD SP,L1772 - RET M -L8460: ADD A,C - JR C,L840D ; (-056H) - DEC SP - LD HL,(03180H) - LD (HL),D - RLA - RET M +L83F1: DB 000H ; Exponent work variable +; --------------------------------------------------------------------------- +; Floating-point polynomial coefficient tables for SQR, LOG, EXP functions +; --------------------------------------------------------------------------- +L83F2: DB 07FH,05EH,05BH,0D8H,0A9H ; 1/sqrt(2) approx +L83F7: DB 07FH,04CH,0CCH,0CCH,0CDH ; log10(2) approx +L83FC: DB 081H,055H,055H,055H,056H ; Coeff +L8401: DB 081H,035H,004H,0F3H,034H ; LOG poly coeff 0 + DB 081H,018H,037H,0F0H,052H ; LOG poly coeff 1 + DB 081H,00BH,095H,0C1H,0E4H ; LOG poly coeff 2 + DB 081H,005H,0AAH,0C3H,068H ; LOG poly coeff 3 + DB 081H,002H,0CDH,086H,099H ; LOG poly coeff 4 + DB 081H,001H,064H,0D1H,0F4H ; LOG poly coeff 5 + DB 081H,000H,0B1H,0EDH,050H ; LOG poly coeff 6 + DB 081H,000H,058H,0D7H,0D3H ; LOG poly coeff 7 + DB 080H,035H,004H,0F3H,034H ; EXP poly coeff 0 + DB 080H,057H,044H,0FCH,0CBH ; EXP poly coeff 1 + DB 080H,06AH,0C0H,0C6H,0E8H ; EXP poly coeff 2 + DB 080H,075H,025H,07DH,016H ; EXP poly coeff 3 + DB 080H,07AH,083H,0B2H,0DCH ; EXP poly coeff 4 + DB 080H,07DH,03EH,00CH,00DH ; EXP poly coeff 5 + DB 080H,07EH,09EH,011H,05DH ; EXP poly coeff 6 + DB 080H,07FH,04EH,0CBH,05AH ; EXP poly coeff 7 +L8451: DB 07AH,008H,088H,088H,089H ; SQR constant +L8456: DB 080H,031H,072H,017H,0F8H ; SQR constant +L845B: DB 080H,031H,072H,017H,0F8H ; SQR constant +L8460: DB 081H,038H,0AAH,03BH,02AH ; SQR constant + DB 080H,031H,072H,017H,0F8H ; SQR constant L846A: DS 2, 000H L846C: DS 2, 000H L846E: DS 4, 000H @@ -18137,7 +17910,7 @@ L84E0: DB 016H DS 2, 030H DB 039H L852E: DS 2, 020H - DB "V1.0A ",00DH + DB "V1.1T ",00DH DS 3, 020H DB 043H,005H,"OPYRIGHT ",006H,"(C) 1984 ",005H,"BY ",006H,"SHARP ",005H,"CORP." DS 5, 020H @@ -18179,18 +17952,1574 @@ L852E: DS 2, 020H DB LSSCR DB LSSCR DB LSSCR - DB 020H,00DH," 30406 ",005H,"BYTES FR" + DB 020H,00DH," 28284 ",005H,"BYTES FR" DS 2, 045H DS 2, 00DH DS 93, 000H -L85FE: DS 1698, 0FFH -L8CA0: DS 864, 0FFH + IF BUILD_RFS = 0 +; Dummy EQUs for BUILD_RFS=0: labels referenced from conditional hooks +; but defined inside the RFS module. Never called when BUILD_RFS=0. +$RFS EQU $USR + ENDIF -EXECSTART: XOR A ; Execution entry point + IF BUILD_RFS = 1 +; =========================================================================== +; RFS (ROM Filing System) support for MZ-2Z009E Disk BASIC +; Version 1.0B - March 2026 +; (c) 2026 Philip Smart +; +; Provides SD card file access via the RFS hardware interface. +; Device name: RF (e.g. DIR RF1:, LOAD RF1:"filename", SAVE RF1:"filename") +; =========================================================================== + +; --------------------------------------------------------------------------- +; $RFS Device Descriptor (29 bytes + 22 bytes state area = 51 bytes) +; Inserted into device chain: $QD → $RFS → $USR +; --------------------------------------------------------------------------- +$RFS: DW $USR ; Next device = $USR + DB "RFS",000H ; Device name "RFS" + DB 05FH ; flags1: bit5=1 block device, bit6=1 ZRO-based DIR + DB 007H ; flags2 + DB 0FFH ; dirmx: 255 max directory entries + DW RFSINIT ; ZINIT handler + DW RFSRO ; ZRO handler (file search + header extract) + DW RFSWO ; ZWO handler (SAVE: compute SIZE) + DW RFSSTRT ; ZCL/ZSTRT handler (open/close) + DW 00000H ; ZKL (not used) + DW RFSINP_DIR ; ZINP handler (DIR fill + LOAD data) + DW RFSOUT ; ZOUT handler (triggers SD write) + DW 00000H ; ZDELT (not used) + DW RFSDIR ; ZWDIR handler (stub) + DW RFSFREE ; ZFREE handler +; Device state area (22 bytes) - BASIC reads/writes state at descriptor+29. +RFSSTATE: DS 22, 000H + +; --------------------------------------------------------------------------- +; RFSFREE - Free space query (not supported, return carry) +; --------------------------------------------------------------------------- +RFSFREE: XOR A + SCF + RET + +; --------------------------------------------------------------------------- +; RFSINIT - Initialize RFS device +; --------------------------------------------------------------------------- +RFSINIT: XOR A + LD (SAVE_PENDING),A + LD (DIR_FILLED),A + LD (DIR_ENTRY_IDX),A + LD A,0FFH + LD (DIRSECBUF),A + LD A,(ZCH) + ADD A,003H + LD (SDDRIVENO),A + RET + +; --------------------------------------------------------------------------- +; RFSSTRT - Start/Open device (A=0=open, A!=0=close) +; --------------------------------------------------------------------------- +RFSSTRT: OR A + RET NZ + LD A,(ZCH) + ADD A,003H + LD (SDDRIVENO),A + XOR A + LD (DIR_ENTRY_IDX),A + LD (DIR_FILLED),A ; Reset so next DIR re-enumerates + LD A,0FFH + LD (DIRSECBUF),A + RET + +; --------------------------------------------------------------------------- +; RFSDIR - ZWDIR handler (stub, not called with bit5=1) +; --------------------------------------------------------------------------- +RFSDIR: XOR A + RET + +; --------------------------------------------------------------------------- +; RFSWO - Write Open (ZWO handler) +; Calculates SIZE = TEXTED - TEXTST and stores in ELMD20. +; Actual write is deferred to RFSOUT via SAVE_PENDING flag. +; --------------------------------------------------------------------------- +RFSWO: LD HL,(TEXTED) + LD DE,(TEXTST) + OR A + SBC HL,DE + LD (ELMD20),HL + XOR A + RET + +; --------------------------------------------------------------------------- +; RFSOUT - Write Data (ZOUT handler for SAVE) +; First call triggers RFSDOWRITE; subsequent calls are no-ops. +; --------------------------------------------------------------------------- +RFSOUT: LD A,(SAVE_PENDING) + OR A + JR NZ,RFSOUT_NOP + INC A + LD (SAVE_PENDING),A + JP RFSDOWRITE +RFSOUT_NOP: XOR A + RET + +; --------------------------------------------------------------------------- +; RFSDOWRITE - Actual SD card write +; --------------------------------------------------------------------------- +RFSDOWRITE: PUSH HL + PUSH DE + PUSH BC + LD A,(ELMD) + CP 002H + JR NZ,WO_NONBASIC + LD HL,(ELMD20) + LD (FILE_SIZE),HL + LD HL,(TEXTST) + LD (FILE_LOADADDR),HL + JR WO_GOTINFO +WO_NONBASIC: + LD HL,(ELMD18) + LD (FILE_SIZE),HL + LD HL,(ELMD20) + LD (FILE_LOADADDR),HL +WO_GOTINFO: + LD A,(ZCH) + ADD A,003H + LD (SDDRIVENO),A + CALL MMIO_ON + LD A,0FFH + LD (DIRSECBUF),A + ; Find free directory entry + LD E,000H + LD B,000H +WO_SCAN: PUSH BC + PUSH DE + CALL GETSDDIRENT + POP DE + POP BC + OR A + JP NZ,WO_IOERR + LD A,(HL) + BIT 7,A + JR Z,WO_FOUND + INC E + DJNZ WO_SCAN + JP WO_IOERR +WO_FOUND: LD A,E + LD (SAVE_DIRENT),A + ; Calculate start sector: E * 128 + 16 + LD H,000H + LD L,E + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD DE,00010H + ADD HL,DE + LD D,000H + LD E,000H + CALL RFSGETSECTR + CALL SETLBAADDR + ; Write file data sector-by-sector +WO_WLOOP: LD HL,(FILE_SIZE) + LD A,H + OR L + JR Z,WO_WDONE + OUT (PORT_DRAM),A + LD HL,(FILE_SIZE) + LD DE,00200H + OR A + SBC HL,DE + JR C,WO_PARTIAL + LD (FILE_SIZE),HL + LD BC,00200H + JR WO_COPY +WO_PARTIAL: ADD HL,DE + LD B,H + LD C,L + PUSH BC + LD HL,0 + LD (FILE_SIZE),HL + ; Zero-fill SECTORBUF for partial sector + LD HL,SECTORBUF + LD DE,SECTORBUF + 1 + PUSH BC + LD BC,001FFH + LD (HL),000H + LDIR + POP BC + POP BC +WO_COPY: LD HL,(FILE_LOADADDR) + LD DE,SECTORBUF + LDIR + LD (FILE_LOADADDR),HL + OUT (PORT_MMIO),A + CALL SD_WRITE + OR A + JP NZ,WO_IOERR + CALL INC_STARTSEC + JR WO_WLOOP + ; Write directory entry +WO_WDONE: OUT (PORT_MMIO),A + LD A,0FFH + LD (DIRSECBUF),A + LD A,(SAVE_DIRENT) + LD E,A + PUSH DE + CALL GETSDDIRENT + POP DE + OR A + JP NZ,WO_IOERR + ; Fill directory entry + LD (HL),080H + INC HL + ; ATRB: remap type 02 -> 05 + LD A,(ELMD) + CP 002H + JR NZ,WO_AT1 + LD A,005H +WO_AT1: LD (HL),A + INC HL + ; NAME: 17 bytes, CR -> null + PUSH DE + LD DE,ELMD1 + LD B,17 +WO_NM: LD A,(DE) + CP 00DH + JR NZ,WO_NM1 + XOR A +WO_NM1: LD (HL),A + INC HL + INC DE + DJNZ WO_NM + POP DE + ; START_SECTOR: 4 bytes + PUSH HL + LD A,(SAVE_DIRENT) + LD H,000H + LD L,A + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD DE,00010H + ADD HL,DE + EX DE,HL + POP HL + LD (HL),000H + INC HL + LD (HL),000H + INC HL + LD (HL),D + INC HL + LD (HL),E + INC HL + ; SIZE: 2 bytes LE + PUSH DE + LD A,(ELMD) + CP 002H + JR NZ,WO_SZ_NB + LD DE,(ELMD20) + JR WO_SZ_OK +WO_SZ_NB: LD DE,(ELMD18) +WO_SZ_OK: LD (HL),E + INC HL + LD (HL),D + INC HL + ; DTADR: 2 bytes LE + LD A,(ELMD) + CP 002H + JR NZ,WO_DA_NB + LD DE,(TEXTST) + JR WO_DA_OK +WO_DA_NB: LD DE,(ELMD20) +WO_DA_OK: LD (HL),E + INC HL + LD (HL),D + INC HL + ; EXADR: 2 bytes LE + LD DE,(ELMD22) + LD (HL),E + INC HL + LD (HL),D + INC HL + ; RESERVED: 3 bytes zero + LD (HL),000H + INC HL + LD (HL),000H + INC HL + LD (HL),000H + POP DE + ; Write directory sector back + LD A,(SAVE_DIRENT) + SRL A + SRL A + SRL A + SRL A + LD DE,0 + LD H,0 + LD L,A + CALL RFSGETSECTR + CALL SETLBAADDR + CALL SD_WRITE + OR A + JR NZ,WO_IOERR + CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A + RET +WO_IOERR: CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A + SCF + RET + +; --------------------------------------------------------------------------- +; RFSRO - Read One directory entry (ZRO handler) +; Each call returns one valid 32-byte MZF directory entry at (HL). +; --------------------------------------------------------------------------- +RFSRO: LD (DIR_BUFPTR),HL + PUSH HL + PUSH DE + PUSH BC + LD A,(ZCH) + ADD A,003H + LD (SDDRIVENO),A + CALL MMIO_ON + LD HL,(DIR_BUFPTR) + LD B,32 +RFSRO_CLR: LD (HL),000H + INC HL + DJNZ RFSRO_CLR +RFSRO_NEXT: + LD A,(DIR_ENTRY_IDX) + LD E,A + CALL GETSDDIRENT + OR A + JR NZ,RFSRO_END + LD A,(HL) + BIT 7,A + JR Z,RFSRO_SKIP + INC HL + LD A,(HL) + DEC HL + OR A + JR Z,RFSRO_SKIP + CP 0FFH + JR Z,RFSRO_SKIP + CALL CONVERT_ENTRY + LD A,(DIR_ENTRY_IDX) + INC A + LD (DIR_ENTRY_IDX),A + CALL MMIO_OFF + POP BC + POP DE + POP HL + LD HL,(DIR_BUFPTR) + LD A,(HL) + OR A + RET +RFSRO_SKIP: + LD A,(DIR_ENTRY_IDX) + INC A + LD (DIR_ENTRY_IDX),A + JR Z,RFSRO_END + JR RFSRO_NEXT +RFSRO_END: + CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A + SCF + RET + +; --------------------------------------------------------------------------- +; RFSINP_DIR - ZINP handler for $RFS device +; Called from multiple paths: +; - SVC#2F dir search (02F38H) with H>=28H for disk ID check +; - SVC#2F dir search (02F38H) with H<28H for directory entry read +; - SVC#39 via RFS_BIT5PATH with H=20H for DIR enumeration +; - (SVC#30 no longer reaches here — RFS_SVC30_HOOK calls RFSINP_LD directly) +; Dispatch: +; H >= 28H → RFSINP_DISKID (returns valid-disk marker at L2800) +; H < 28H, DIR_FILLED=0 → fill DIR buffer at L2000 +; H < 28H, DIR_FILLED=1 → RET (buffer already filled, NOP for remaining iterations) +; --------------------------------------------------------------------------- +RFSINP_DIR: + ; Debug: entry marker "D" + PUSH AF + LD A,'D' + OUT (050H),A + POP AF + ; Dispatch based on H and DIR_FILLED state + LD A,H + CP 028H + JP NC,RFSINP_DISKID + LD A,(DIR_FILLED) + OR A + RET NZ ; DIR already filled — NOP for remaining SVC#2F iterations + ; DIR mode: enumerate files into 0x2000 buffer + PUSH HL + PUSH DE + PUSH BC + LD HL,L2000 + LD DE,L2000 + 1 + LD BC,007FFH + LD (HL),000H + LDIR + LD A,(ZCH) + ADD A,003H + LD (SDDRIVENO),A + LD HL,L2000 + LD (HL),080H + CALL MMIO_ON + LD A,0FFH + LD (DIRSECBUF),A + LD HL,L2000 + 020H + LD (DIR_BUFPTR),HL + LD E,000H + LD D,03FH + LD B,000H +RDIR_LOOP: PUSH BC + PUSH DE + CALL GETSDDIRENT + POP DE + POP BC + OR A + JR NZ,RDIR_DONE + LD A,(HL) + BIT 7,A + JR Z,RDIR_NEXT + INC HL + LD A,(HL) + DEC HL + OR A + JR Z,RDIR_NEXT + CP 0FFH + JR Z,RDIR_NEXT + PUSH DE + PUSH BC + CALL CONVERT_ENTRY + POP BC + POP DE + DEC D + JR Z,RDIR_DONE +RDIR_NEXT: INC E + DJNZ RDIR_LOOP +RDIR_DONE: CALL MMIO_OFF + POP BC + POP DE + POP HL + LD A,001H + LD (DIR_FILLED),A + XOR A + RET + +; --------------------------------------------------------------------------- +; RFSINP_DISKID - Identity read: fill L2800-L28FF with zeros +; All-zero is safe: L2E67's JP M check passes (bit7=0), and L2E36's +; bitmask comparison (CPL/AND) produces 0 for every byte. +; RFS_BIT5PATH sets L2800[0]=0x80 separately before the DIR fill call. +; --------------------------------------------------------------------------- +RFSINP_DISKID: + PUSH HL + PUSH DE + PUSH BC + LD HL,02800H + LD DE,02801H + LD BC,000FFH + LD (HL),000H ; Zero-fill: safe for L2E67 and L2E52 + LDIR + POP BC + POP DE + POP HL + XOR A + RET + +; --------------------------------------------------------------------------- +; RFSINP_LD - LOAD data transfer from SD card +; Finds file by name, reads sectors to load address. +; --------------------------------------------------------------------------- +RFSINP_LD: + ; Debug: LOAD data entry + PUSH AF + LD A,'L' + OUT (050H),A + LD A,'D' + OUT (050H),A + LD A,':' + OUT (050H),A + ; Show ELMD[0..7] + PUSH HL + PUSH BC + LD HL,ELMD + LD B,008H +RLD_DMP1: LD A,(HL) + CALL DBG_HEX + LD A,' ' + OUT (050H),A + INC HL + DJNZ RLD_DMP1 + CALL DBG_CRLF + POP BC + POP HL + POP AF + ; + LD (RFS_LD_A0),A + PUSH HL + PUSH DE + PUSH BC + LD A,(ZCH) + ADD A,003H + LD (SDDRIVENO),A + CALL MMIO_ON + LD A,0FFH + LD (DIRSECBUF),A + LD DE,ELMD1 + CALL FINDSD + JR Z,RLD_FOUND + ; Debug: file not found + PUSH AF + OUT (PORT_DRAM),A + LD A,'L' + OUT (050H),A + LD A,'N' + OUT (050H),A + CALL DBG_CRLF + OUT (PORT_MMIO),A + POP AF + JP RLD_NFERR +RLD_FOUND: + ; Debug: file found + PUSH AF + OUT (PORT_DRAM),A + LD A,'L' + OUT (050H),A + LD A,'F' + OUT (050H),A + CALL DBG_CRLF + OUT (PORT_MMIO),A + POP AF + ; HL = directory entry + ; Read file type from SD entry (offset 1) and update ELMD + INC HL ; HL = entry + 1 = type byte + LD A,(HL) + CP 005H + JR NZ,RLD_TYPOK + LD A,002H ; SD type 5 → MZ type 2 (BASIC) +RLD_TYPOK: LD (ELMD),A ; Update ELMD[0] with actual file type + ; Skip to START_SECTOR (entry + 19; we're at entry + 1) + LD DE,18 + ADD HL,DE + ; Copy 4-byte start sector + LD DE,FILE_STARTSEC + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + ; Read SIZE from SD entry and update ELMD20 + INC HL + LD E,(HL) + INC HL + LD D,(HL) + EX DE,HL + LD (FILE_SIZE),HL + LD (ELMD20),HL ; Update ELMD with actual file size + EX DE,HL + ; Read DTADR from SD entry and update ELMD22 + INC HL + LD E,(HL) + INC HL + LD D,(HL) + EX DE,HL + LD (FILE_LOADADDR),HL + LD (ELMD22),HL ; Update ELMD with actual DTADR + ; For BASIC (type 2), override load addr with TEXTST + LD A,(ELMD) ; Now reads correct type (set above) + CP 002H + JR NZ,RLD_NORLOC + LD HL,(TEXTST) + LD (FILE_LOADADDR),HL +RLD_NORLOC: + ; Convert to absolute sector + LD A,(FILE_STARTSEC) + LD D,A + LD A,(FILE_STARTSEC+1) + LD E,A + LD A,(FILE_STARTSEC+2) + LD H,A + LD A,(FILE_STARTSEC+3) + LD L,A + CALL RFSGETSECTR + CALL SETLBAADDR + ; Read sectors +RLD_LOOP: CALL SD_READ + OR A + JR NZ,RLD_ERR + OUT (PORT_DRAM),A + LD HL,(FILE_SIZE) + LD DE,00200H + OR A + SBC HL,DE + JR C,RLD_PARTIAL + LD (FILE_SIZE),HL + LD BC,00200H + JR RLD_COPY +RLD_PARTIAL:ADD HL,DE + LD B,H + LD C,L + LD HL,0 + LD (FILE_SIZE),HL +RLD_COPY: LD HL,SECTORBUF + LD DE,(FILE_LOADADDR) + LDIR + LD (FILE_LOADADDR),DE + LD HL,(FILE_SIZE) + LD A,H + OR L + JR Z,RLD_DONE + CALL INC_STARTSEC + OUT (PORT_MMIO),A + JR RLD_LOOP +RLD_DONE: OUT (PORT_MMIO),A + CALL MMIO_OFF + ; Conditionally write status bytes (SVC #33 path only) + LD A,(RFS_LD_A0) + OR A + JR Z,RLD_SKIP_STAT + LD HL,(L180B) + DEC HL + LD (HL),0FFH + DEC HL + LD (HL),0FFH +RLD_SKIP_STAT: + ; Debug: LOAD complete OK + LD A,'L' + OUT (050H),A + LD A,'=' + OUT (050H),A + LD A,'K' + OUT (050H),A + CALL DBG_CRLF + ; + POP BC + POP DE + POP HL + XOR A + RET +RLD_ERR: ; Debug: LOAD error (SD read) + PUSH AF + OUT (PORT_DRAM),A + LD A,'L' + OUT (050H),A + LD A,'=' + OUT (050H),A + LD A,'E' + OUT (050H),A + CALL DBG_CRLF + POP AF + OUT (PORT_MMIO),A + CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A + SCF + RET +RLD_NFERR: CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A + SCF + RET + +; =========================================================================== +; Low-level SD card access routines +; =========================================================================== + +; --------------------------------------------------------------------------- +; MMIO_ON - Enter MMIO mode for SPI access +; --------------------------------------------------------------------------- +MMIO_ON: POP HL + LD (SAVE_SP),SP + LD SP,TEMP_STACK_TOP + PUSH HL + DI + XOR A + OUT (PORT_MMIO),A + CALL TRAIN_UPCNTR + RET + +; --------------------------------------------------------------------------- +; MMIO_OFF - Leave MMIO mode, restore DRAM and BASIC stack +; --------------------------------------------------------------------------- +MMIO_OFF: POP HL + XOR A + OUT (PORT_DRAM),A + EI + LD SP,(SAVE_SP) + JP (HL) + +; --------------------------------------------------------------------------- +; TRAIN_UPCNTR - Train the RFS register latch (15 reads of EFF8H) +; --------------------------------------------------------------------------- +TRAIN_UPCNTR: + LD HL,BNKCTRLRST + LD B,15 +TRAIN_LP: LD A,(HL) + DJNZ TRAIN_LP + XOR A + RET + +; --------------------------------------------------------------------------- +; SPI routines +; --------------------------------------------------------------------------- +SPIOUT: LD (HWSPIDATA),A + LD (HWSPISTART),A + RET + +SPIIN: LD (HWSPISTART),A + LD A,(HWSPIDATA) + RET + +SPI_CS_LO: LD A,SDCS_ACT + LD (BNKCTRL),A + RET + +SPI_CS_HI: LD A,SDCS_DEACT + LD (BNKCTRL),A + RET + +; --------------------------------------------------------------------------- +; SD_READ - Read one 512-byte sector into SECTORBUF +; --------------------------------------------------------------------------- +SD_READ: CALL SPI_CS_LO + LD A,051H + CALL SPIOUT + LD A,(SDSTARTSEC) + CALL SPIOUT + LD A,(SDSTARTSEC+1) + CALL SPIOUT + LD A,(SDSTARTSEC+2) + CALL SPIOUT + LD A,(SDSTARTSEC+3) + CALL SPIOUT + LD A,0FFH + CALL SPIOUT + LD B,0FFH +SDR_R1: CALL SPIIN + CP 0FFH + JR NZ,SDR_GOTR1 + DJNZ SDR_R1 + JR SDR_ERR +SDR_GOTR1: OR A + JR NZ,SDR_ERR + LD B,0FFH +SDR_TOK: CALL SPIIN + CP 0FEH + JR Z,SDR_DATA + CP 0FFH + JR NZ,SDR_ERR + DJNZ SDR_TOK + JR SDR_ERR +SDR_DATA: LD HL,SECTORBUF + LD D,002H +SDR_PG: LD B,000H +SDR_BYTE: CALL SPIIN + LD (HL),A + INC HL + DJNZ SDR_BYTE + DEC D + JR NZ,SDR_PG + CALL SPIIN + CALL SPIIN + CALL SPI_CS_HI + XOR A + RET +SDR_ERR: CALL SPI_CS_HI + LD A,001H + RET + +; --------------------------------------------------------------------------- +; SD_WRITE - Write one 512-byte sector from SECTORBUF +; --------------------------------------------------------------------------- +SD_WRITE: CALL SPI_CS_LO + LD A,058H + CALL SPIOUT + LD A,(SDSTARTSEC) + CALL SPIOUT + LD A,(SDSTARTSEC+1) + CALL SPIOUT + LD A,(SDSTARTSEC+2) + CALL SPIOUT + LD A,(SDSTARTSEC+3) + CALL SPIOUT + LD A,0FFH + CALL SPIOUT + LD B,0FFH +SDW_R1: CALL SPIIN + CP 0FFH + JR NZ,SDW_GOTR1 + DJNZ SDW_R1 + JR SDW_ERR +SDW_GOTR1: OR A + JR NZ,SDW_ERR + LD A,0FEH + CALL SPIOUT + LD HL,SECTORBUF + LD D,002H +SDW_PG: LD B,000H +SDW_BYTE: LD A,(HL) + CALL SPIOUT + INC HL + DJNZ SDW_BYTE + DEC D + JR NZ,SDW_PG + LD A,0FFH + CALL SPIOUT + CALL SPIOUT + CALL SPIIN + AND 01FH + CP 005H + JR NZ,SDW_ERR + LD D,040H +SDW_BSY1: LD B,000H +SDW_BSY2: CALL SPIIN + CP 0FFH + JR Z,SDW_DONE + DJNZ SDW_BSY2 + DEC D + JR NZ,SDW_BSY1 + JR SDW_ERR +SDW_DONE: CALL SPI_CS_HI + XOR A + RET +SDW_ERR: CALL SPI_CS_HI + LD A,001H + RET + +; =========================================================================== +; Directory and file access routines +; =========================================================================== + +; --------------------------------------------------------------------------- +; ADD3216 - Add 16-bit BC to 32-bit DEHL +; --------------------------------------------------------------------------- +ADD3216: ADD HL,BC + EX DE,HL + LD BC,0 + ADC HL,BC + EX DE,HL + RET + +; --------------------------------------------------------------------------- +; RFSGETSECTR - Calculate absolute sector (adds drive offset) +; Each drive image = 0x8010 sectors +; --------------------------------------------------------------------------- +RFSGETSECTR: + LD A,(SDDRIVENO) +GETSEC_LP: OR A + RET Z + DEC A + LD BC,08010H + CALL ADD3216 + JR GETSEC_LP + +; --------------------------------------------------------------------------- +; SETLBAADDR - Store DEHL into SDSTARTSEC (big-endian) +; --------------------------------------------------------------------------- +SETLBAADDR: LD A,D + LD (SDSTARTSEC),A + LD A,E + LD (SDSTARTSEC+1),A + LD A,H + LD (SDSTARTSEC+2),A + LD A,L + LD (SDSTARTSEC+3),A + RET + +; --------------------------------------------------------------------------- +; INC_STARTSEC - Increment SDSTARTSEC by 1 (32-bit big-endian) +; --------------------------------------------------------------------------- +INC_STARTSEC: + LD HL,SDSTARTSEC+3 + INC (HL) + RET NZ + DEC HL + INC (HL) + RET NZ + DEC HL + INC (HL) + RET NZ + DEC HL + INC (HL) + RET + +; --------------------------------------------------------------------------- +; GETSDDIRENT - Get SD directory entry with sector caching +; Entry: E = entry number (0-255) +; Exit: HL = pointer to 32-byte entry, A = 0 success / 1 error +; --------------------------------------------------------------------------- +GETSDDIRENT: + PUSH DE + LD A,E + SRL A + SRL A + SRL A + SRL A + LD C,A + LD A,(DIRSECBUF) + CP C + JR Z,GDIR_CACHED + LD A,C + LD (DIRSECBUF),A + LD DE,0 + LD H,0 + LD L,A + CALL RFSGETSECTR + CALL SETLBAADDR + CALL SD_READ + OR A + JR NZ,GDIR_ERR +GDIR_CACHED:POP DE + PUSH DE + LD A,E + AND 00FH + LD HL,SECTORBUF + OR A + JR Z,GDIR_DONE + LD B,A + LD DE,00020H +GDIR_ADD: ADD HL,DE + DJNZ GDIR_ADD +GDIR_DONE: POP DE + XOR A + RET +GDIR_ERR: POP DE + LD A,001H + RET + +; --------------------------------------------------------------------------- +; FINDSD - Find file by name in SD directory +; Entry: DE = filename (CR or null terminated) +; Exit: Z = found (HL = entry), NZ = not found +; --------------------------------------------------------------------------- +FINDSD: LD (FINDSD_NAME),DE + LD E,000H + LD B,000H +FSD_LOOP: PUSH BC + PUSH DE + CALL GETSDDIRENT + POP DE + POP BC + OR A + JR NZ,FSD_NF + LD A,(HL) + BIT 7,A + JR Z,FSD_NEXT + INC HL + LD A,(HL) + DEC HL + OR A + JR Z,FSD_NEXT + CP 0FFH + JR Z,FSD_NEXT + PUSH HL + PUSH DE + PUSH BC + INC HL + INC HL + LD DE,(FINDSD_NAME) + LD B,17 +FSD_CMP: LD A,(DE) + CP 00DH + JR Z,FSD_MATCH + OR A + JR Z,FSD_MATCH + CP (HL) + JR NZ,FSD_NOMATCH + INC DE + INC HL + DJNZ FSD_CMP +FSD_MATCH: POP BC + POP DE + POP HL + XOR A + RET +FSD_NOMATCH:POP BC + POP DE + POP HL +FSD_NEXT: INC E + DJNZ FSD_LOOP +FSD_NF: LD A,001H + OR A + RET + +; --------------------------------------------------------------------------- +; CONVERT_ENTRY - Convert SD entry to Disk BASIC DIR buffer format +; Entry: HL = SD entry in SECTORBUF +; Exit: DIR_BUFPTR advanced by 32 +; --------------------------------------------------------------------------- +CONVERT_ENTRY: + INC HL + LD DE,(DIR_BUFPTR) + LD A,(HL) + CP 005H + JR NZ,CE_AT1 + LD A,002H +CE_AT1: LD (DE),A + INC HL + INC DE + LD B,17 +CE_NAME: LD A,(HL) + OR A + JR NZ,CE_NM1 + LD A,00DH +CE_NM1: LD (DE),A + INC HL + INC DE + DJNZ CE_NAME + ; Skip START_SECTOR[0..1], copy [2..3] + INC HL + INC HL + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + INC HL + INC DE + ; Copy SIZE(2) + DTADR(2) + EXADR(2) = 6 bytes + LD BC,6 + LDIR + ; Advance DIR_BUFPTR by 32 + LD HL,(DIR_BUFPTR) + LD DE,00020H + ADD HL,DE + LD (DIR_BUFPTR),HL + RET + +; --------------------------------------------------------------------------- +; MEMCLI_PATCH - Trampoline for memory clear init +; Original: RST 018H / DB 020H / EX DE,HL +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +MEMCLI_PATCH: + IF BUILD_RFS = 1 + ; Runtime patch: L2FD1 must call L2FE8_FIX instead of L2FE8. + ; Binary keeps original bytes (CD E8 2F) at 0x2FD1 so the LOAD + ; from MZ-5Z008 doesn't corrupt its own L2FD1 mid-transfer. + ; We patch here because cold start runs ONCE after full load. + LD A,L2FE8_FIX & 0FFH ; Low byte of L2FE8_FIX address + LD (L2FD1+1),A ; Patch CALL operand low byte + LD A,L2FE8_FIX >> 8 ; High byte + LD (L2FD1+2),A ; Patch CALL operand high byte + ; + RST 018H + DB 020H ; SVC 020H: boot beep + EI + LD HL,RFS_END + JP L402F ; Continue with memory clear loop + +; --------------------------------------------------------------------------- +; RFS_ERR_HOOK - Debug: show error code before BASIC warm restart +; A = error code from error table (L1F6A or L4AE6) +; NOTE: L0182 must JP here BEFORE calling L0D20, because L0D20 maps +; Monitor ROM at 0000-0FFF which overlays L0182's code. The original +; JP RFS_ERR_HOOK at 0x0187 was invisible (Monitor ROM's JP L0000 ran). +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +RFS_ERR_HOOK: + IF BUILD_RFS = 1 + ; AF on stack from L0182's PUSH AF + LD A,'!' + OUT (050H),A + LD A,'E' + OUT (050H),A + LD A,':' + OUT (050H),A + POP AF + PUSH AF + CALL DBG_HEX + CALL DBG_CRLF + CALL L0D20 ; Bank reset (maps Monitor ROM at 0000-0FFF) + JP 00186H ; Jump to Monitor ROM's handler (POP AF + JP L0000) + +; --------------------------------------------------------------------------- +; SVC30_DBG - Debug wrapper for SVC #30 handler +; Shows L1050 (device flags) and ZINP for every SVC #30 call, then dispatches. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +SVC30_DBG: + IF BUILD_RFS = 1 + ; Check ZINP high byte for $RFS + LD A,(ZINP+1) + CP 080H ; RFS handlers are at >= 0x8000 + JP NC,RFS_SVC30_HOOK ; $RFS + ; Not $RFS: use flags1 bit5 for block-device detection + LD A,(L1050) ; flags1 + AND 020H ; bit5 = block device + JP Z,SVC30_FD ; not block device → direct IOCALL + JP L2AD2 ; $FD/$QD block device + +; --------------------------------------------------------------------------- +; RFS_BIT5PATH - Block-device DIR handler for $RFS +; Replaces the standard L2FD1 path (0x2F38) which doesn't work with +; RFSINP_DIR because L2FD1 always calls ZINP with HL=L2800 (H>=28H), +; which triggers RFSINP_DISKID instead of the DIR fill path. +; For non-$RFS block devices ($FD/$QD), falls through to the original path. +; Detects $RFS by device name (ZDEVNM), not flags — $QD also has 0x5F. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +RFS_BIT5PATH: + IF BUILD_RFS = 1 + ; Detect $RFS by device name (flags1 bits 5+6 cannot distinguish + ; $QD from $RFS — both have 0x5F). Same approach as MZ-5Z008. + LD A,(ZDEVNM) ; First char of device name + CP 'R' + JP NZ,02F38H ; Not 'R' → not $RFS → original path + LD A,(ZDEVNM+1) ; Second char + CP 'F' + JP NZ,02F38H ; Not 'F' → not $RFS → original path + ; + ; $RFS custom DIR handler — replicates the TWO ZINP calls that the + ; standard 02F38H→L2FD1 path makes (L2FE8 identity + L2FD4 DIR fill). + ; MZ-5Z008 DBG_BIT5PATH does exactly this. + ; + ; 1st ZINP call: disk identity (H=0x28 → RFSINP_DISKID → zeros L2800) + LD HL,02800H ; H=0x28 triggers DISKID path + LD A,(ZCH) + CALL RFSINP_DIR + ; + ; 2nd ZINP call: DIR fill (H=0x20 → fills L2000-L27FF) + LD HL,L2000 ; H=0x20 triggers DIR fill path + LD A,(ZCH) + CALL RFSINP_DIR + ; + ; Check DIR buffer and clean up (same as MZ-5Z008 DBG_BIT5PATH) + LD HL,L2000 + LD A,(HL) + OR A + JP P,01F70H ; If bit7=0 → no entries (error) + ; Clear DIR_FILLED so next DIR re-enumerates + XOR A + LD (DIR_FILLED),A + ; Reset FDC to known state after MMIO bank switching. + ; L2D08 normally calls L368D for $FD cleanup, but skips it when + ; L1044=$RFS. The MMIO OUT(E3H)/OUT(E1H) bank switch during + ; RFSINP_DIR may leave the emulated FDC I/O ports in an undefined + ; state. L368D resets FDC select ports (DC/DD/DE) to 0 and clears + ; L35B5, ensuring the next FD access does a full identity check. + JP L368D ; XOR A + L361C(OUT DC/DD/DE) + LD (L35B5),A + RET + +; --------------------------------------------------------------------------- +; RFS_SVC30_HOOK - Direct RFSINP_LD call for $RFS +; Device already identified as $RFS by bit6 test in SVC30_DBG. +; Calls RFSINP_LD directly (the SVC#30 block path would go through +; L2AD2 → L2FE8 → IOCALL → RFSINP_DIR with H>=28H → RFSINP_DISKID, +; which zeros L2800 instead of loading the file). +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +RFS_SVC30_HOOK: + IF BUILD_RFS = 1 + ; $RFS: call RFSINP_LD directly (A=0 for read) + ; RFSINP_LD updates ELMD[0], ELMD20, ELMD22 from SD entry. + XOR A + CALL RFSINP_LD + JR C,SH_FAIL ; RFSINP_LD failed → don't patch stack + ; + ; Fix stacked file size for L5C0F. + ; L5C0F pushed BC=ELMD20 (was 0) BEFORE SVC#30. + ; RFSINP_LD wrote the actual size to ELMD20. + ; Stack: SP → [ret_addr, old_BC=0, ...]. Patch old_BC. + POP HL ; HL=ret_addr, SP → [old_BC, ...] + EX (SP),HL ; HL=old_BC, SP → [ret_addr, ...] + LD HL,(ELMD20) ; HL=actual file size + EX (SP),HL ; HL=ret_addr, SP → [actual_size, ...] + PUSH HL ; SP → [ret_addr, actual_size, ...] + JR SH_CLEANUP +SH_FAIL: +SH_CLEANUP: + ; Cleanup after RFS LOAD (success or fail): + ; 1. Clear L1FC0 dirty flag — prevents L1FAB infinite loop. + ; 2. Set SAVE_PENDING=1 — prevents spurious RFSDOWRITE. + XOR A + LD (L1FC0),A + LD A,001H + LD (SAVE_PENDING),A + RET + +; --------------------------------------------------------------------------- +; L2FE8_FIX - Skip FD-specific identity check for $RFS in L2FD1 +; L2FE8 calls IOOUT→L2D62(SVC#29 seek)→L2E36(identity check), all of which +; operate on FD hardware state (L35B5, track positioning, disk identity at +; L2800). For $RFS, these are meaningless and leave stale FD state that +; corrupts the next LOAD "FD1:" after DIR "RFSx:". +; By returning immediately for $RFS, L2FD1 skips straight to L2FD4 (ZINP +; dispatch) which calls RFSINP_DIR for the DIR fill — exactly what's needed. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +L2FE8_FIX: + IF BUILD_RFS = 1 + PUSH AF ; MUST preserve A (caller set A=0 for ZINP select + ; at L2FD4; IOOUT saves/restores AF via trampoline) + LD A,(ZINP+1) ; High byte of current ZINP handler + CP 080H ; RFS handlers are at >= 0x8000 + JR NC,L2FE8_SKIP ; $RFS → skip identity check + POP AF ; Restore A=0 for IOOUT save + JP L2FE8 ; $FD/$QD → original identity check path +L2FE8_SKIP: + POP AF ; Restore A + RET ; $RFS → return to L2FD4 (skip L2FE8 entirely) + +; --------------------------------------------------------------------------- +; RFS_DIR_FIX - Advance HL past ':' for DIR device-name parsing +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +RFS_DIR_FIX: + IF BUILD_RFS = 1 + LD DE,DEVNAMEBUF + INC HL + JP L596B + +; --------------------------------------------------------------------------- +; RFS_DIR_STR - Handle string expressions in DIR for device names +; Called instead of L6E67 to properly parse "RF1:" strings +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +RFS_DIR_STR: + IF BUILD_RFS = 1 + CALL L6E67 ; Evaluate string expr. B=strlen, DE=strptr + PUSH HL + EX DE,HL + LD DE,DEVNAMEBUF + LD A,B + OR A + JR Z,DSTR_DONE + LD C,A + LD B,000H +DSTR_LP: LD A,(HL) + LD (DE),A + INC HL + INC DE + INC B + DEC C + CP 03AH + JR Z,DSTR_DONE + LD A,C + OR A + JR NZ,DSTR_LP +DSTR_DONE: LD DE,DEVNAMEBUF + POP HL + RET + +; --------------------------------------------------------------------------- +; SVC32_FIX - Fixed SVC #32 (file data transfer) +; Original code only supported CMT (checks L1051 bit7). Block devices +; (FD, QD, RFS) have bit7=0 and always failed with !Y error. +; Fix: call ZINP directly via IOCALL, bypassing L2FE8 sector management. +; L2FE8's L2D62→L2E36 chain repositions the FD driver to directory sectors +; (via SVC#29), corrupting the file data position set by SVC#2F. +; HL (load address) passes through IOCALL to ZINP as the buffer address. +; DE=file size, BC=sector position from ELMD area (set by SVC#2F). +; L2D08 cleanup is essential: clears L1FC0, closes channels. Without it, +; L1FAB sees dirty L1FC0 and tries SVC#2E write-back → WRITE_SECTOR hang. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +SVC32_FIX: + IF BUILD_RFS = 1 + LD A,(01051H) + BIT 7,A + JR NZ,SVC32_CMT + ; Non-CMT: check if block device (bit5 of flags1) + LD A,(L1050) + BIT 5,A + JP Z,YP_HOOK_G ; !Y source G: SVC32 L1050 bit5=0 + ; Block device (FD/QD/RFS): skip L2FE8 sector management, + ; enter at L2FD4 (SKPDE→IOCALL chain) with L2D08 on stack. + ; L2FE8 repositions FD to directory sectors, corrupting position + ; set by SVC#2F. QD is immune (L35B5 bit7=1), FD is not. + LD DE,(ELMD20) ; File size + LD BC,(ELMD30) ; Sector position + PUSH HL ; Save load address + LD HL,L2D08 ; Cleanup return address + EX (SP),HL ; Stack=[L2D08,...], HL=load addr restored + XOR A ; A=0, Z=1 → selects ZINP at L2FD4 + JP L2FD4 ; SKPDE→IOCALL→RET→L2D08 cleanup +SVC32_CMT: + LD BC,(ELMD20) + JP L313A + +; --------------------------------------------------------------------------- +; SVC2F_YP_DBG - Diagnostic: L2F6E's L1D15 returned Z (bit5=0) → !Y error +; Prints "2F:XX YYYY" where XX=L1050 (flags1), YYYY=L1044 (device pointer). +; This tells us what device descriptor is active when !Y fires. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +SVC2F_YP_DBG: + IF BUILD_RFS = 1 + PUSH AF + LD A,'2' + OUT (050H),A + LD A,'F' + OUT (050H),A + LD A,':' + OUT (050H),A + LD A,(L1050) ; flags1 — bit5 should be 1 for block device + CALL DBG_HEX + LD A,' ' + OUT (050H),A + LD A,(L1044+1) ; device pointer high byte + CALL DBG_HEX + LD A,(L1044) ; device pointer low byte + CALL DBG_HEX + CALL DBG_CRLF + POP AF + JP 01F97H ; Continue to !Y error handler + +; --------------------------------------------------------------------------- +; RFS_FREE_HOOK - Intercept L2F4B free space query for $RFS +; During DIR display (2nd SVC#39 call), L1D6B sets IX=L2F4B (block device +; free space) and calls IOCALL. L2F4B → L2E36 → L2E67 reads "disk identity" +; via ZINP. For $RFS, RFSINP_DISKID fills L2800 with 0x80 (bit7=1), but +; L2E67 expects bit7=0 → fires JP M,01F70H → error table → JP 0x0182 → +; warm restart via 0x0D20 which resets SP, discarding pending stack frames +; from L2F4B/L2E36/IOCALL — corrupting system state for subsequent commands. +; Fix: detect $RFS and return carry (= no free space info). The caller at +; L1D95+3 does JR C,L1DA8 which skips free space display gracefully. +; For non-$RFS block devices ($FD/$QD), fall through to original L2F4B. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +RFS_FREE_HOOK: + IF BUILD_RFS = 1 + ; Detect $RFS by device name (flags1 bits 5+6 cannot distinguish + ; $QD from $RFS — both have 0x5F). Same fix as RFS_BIT5PATH. + LD A,(ZDEVNM) ; First char of device name + CP 'R' + JP NZ,L2F4B ; Not 'R' → not $RFS → original free space + LD A,(ZDEVNM+1) ; Second char + CP 'F' + JP NZ,L2F4B ; Not 'F' → not $RFS → original free space + XOR A ; A=0 (IOCALL checks: OR A / SCF / RET Z) + SCF ; Carry = skip free space display + RET + +; =========================================================================== +; RFS Data Variables +; =========================================================================== + ENDIF ; (Glass: label outside IF) +DEVNAMEBUF: + IF BUILD_RFS = 1 + DS 8, 000H ; Device name buffer for DIR/LOAD parsing + ; (replaces L5982 4-byte buffer which overflowed + ; for 3-letter device names like "RFS1:") + ENDIF ; (Glass: label outside IF) +SDSTARTSEC: + IF BUILD_RFS = 1 + DS 4, 000H ; Current sector address (big-endian) + ENDIF ; (Glass: label outside IF) +DIRSECBUF: + IF BUILD_RFS = 1 + DB 0FFH ; Cached directory sector number + ENDIF ; (Glass: label outside IF) +FILE_STARTSEC: + IF BUILD_RFS = 1 + DS 4, 000H ; File start sector (big-endian) + ENDIF ; (Glass: label outside IF) +FILE_LOADADDR: + IF BUILD_RFS = 1 + DW 00000H ; Current load/store address + ENDIF ; (Glass: label outside IF) +FILE_SIZE: + IF BUILD_RFS = 1 + DW 00000H ; Remaining bytes during transfer + ENDIF ; (Glass: label outside IF) +RFS_LD_A0: + IF BUILD_RFS = 1 + DB 000H ; Entry A for RFSINP_LD + ENDIF ; (Glass: label outside IF) +DIR_BUFPTR: + IF BUILD_RFS = 1 + DW 00000H ; Current DIR buffer write position +; --------------------------------------------------------------------------- +; DBG_HEX — Output A as 2 hex ASCII digits to port 050H. +; Preserves BC, DE, HL. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +DBG_HEX: + IF BUILD_RFS = 1 + PUSH AF + RRCA + RRCA + RRCA + RRCA + AND 00FH + CALL DBG_NIB + POP AF + AND 00FH +DBG_NIB: CP 00AH + JR C,DBG_DIG + ADD A,037H ; 'A'..'F' + OUT (050H),A + RET +DBG_DIG: ADD A,030H ; '0'..'9' + OUT (050H),A + RET +; +; --------------------------------------------------------------------------- +; DBG_CRLF — Output CR+LF to port 050H. Preserves all registers. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +DBG_CRLF: + IF BUILD_RFS = 1 + PUSH AF + LD A,00DH ; CR + OUT (050H),A + LD A,00AH ; LF + OUT (050H),A + POP AF + RET +; +; --------------------------------------------------------------------------- +; YP_HOOK — Identify which code path triggers !Y error. +; Each entry loads a letter (A-F) into A via the cascade trick (DB 021H). +; Output: single letter + CRLF, then continues to !Y error table at 01F97H. +; A = line 3813 (L1B55, BIT 2 of L1043) +; B = line 3902 (L1BFD, BIT 6 of L1050) +; C = line 4030 (device setup) +; D = line 4059 (BIT 7 of L1050) +; E = line 4064 (BIT 5 of L1050, DIR non-RFS) +; F = line 4764 (L2B6A, L1D15 bit5) +; G = SVC32_FIX (L1050 bit5=0, non-block device in SVC#32) +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +YP_HOOK_A: + IF BUILD_RFS = 1 + LD A,'A' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_B: + IF BUILD_RFS = 1 + LD A,'B' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_C: + IF BUILD_RFS = 1 + LD A,'C' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_D: + IF BUILD_RFS = 1 + LD A,'D' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_E: + IF BUILD_RFS = 1 + LD A,'E' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_F: + IF BUILD_RFS = 1 + LD A,'F' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_G: + IF BUILD_RFS = 1 + LD A,'G' + OUT (050H),A + CALL DBG_CRLF + JP 01F97H +; +; BC_ERR_HOOK - Debug: show ELMD[0..1] when error 0xBC fires + ENDIF ; (Glass: label outside IF) +BC_ERR_HOOK: + IF BUILD_RFS = 1 + PUSH AF + LD A,'B' + OUT (050H),A + LD A,(L1000) ; File mode byte + CALL DBG_HEX + LD A,(L1001) ; File type (should be 0x0D here) + CALL DBG_HEX + CALL DBG_CRLF + POP AF + JP 01F9AH ; L1F6A cascade: error 0xBC +; +; --------------------------------------------------------------------------- +; Data area +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +FINDSD_NAME: + IF BUILD_RFS = 1 + DW 00000H ; Saved filename pointer for FINDSD + ENDIF ; (Glass: label outside IF) +SAVE_DIRENT: + IF BUILD_RFS = 1 + DB 000H ; Directory entry number for SAVE + ENDIF ; (Glass: label outside IF) +SAVE_PENDING: + IF BUILD_RFS = 1 + DB 000H ; 1 = SAVE done flag + ENDIF ; (Glass: label outside IF) +DIR_FILLED: + IF BUILD_RFS = 1 + DB 000H ; 1 = DIR buffer filled + ENDIF ; (Glass: label outside IF) +SAVE_SP: + IF BUILD_RFS = 1 + DW 00000H ; Saved BASIC stack pointer + ENDIF ; (Glass: label outside IF) +DIR_ENTRY_IDX: + IF BUILD_RFS = 1 + DB 000H ; Current directory entry index + ENDIF ; (Glass: label outside IF) +SDDRIVENO: + IF BUILD_RFS = 1 + DB 000H ; SD drive number + ENDIF ; (Glass: label outside IF) +SECTORBUF: + IF BUILD_RFS = 1 + DS 512, 000H ; SD card sector buffer (512 bytes) + DS 14, 000H ; Temp stack space (grows downward, 7 levels = exact max depth) + ENDIF ; (Glass: labels outside IF) +TEMP_STACK_TOP: ; SP points here +RFS_END EQU TEMP_STACK_TOP ; End of RFS code = new TEXTST + IF BUILD_RFS = 1 +; +; Pad remaining space to maintain original binary size (0x9000 bytes) + DS 09000H - RFS_END, 0FFH + + ENDIF ; END BUILD_RFS = 1 + +; =========================================================================== +; Tape/CMT bootstrap (only for BUILD_TAPE=1) +; Loads at TAPECOPY (0x1200), copies BASIC ROM to 0x0000, jumps to cold start. +; =========================================================================== + IF BUILD_TAPE = 1 +EXECSTART: XOR A LD DE,L0000 - CALL TIMST - ;LD HL,(DTEFG) - ;PUSH HL + CALL TIMST ; Stop timer LD DE,L0000 LD HL,BASICEND - L0000 OR A @@ -18198,11 +19527,8 @@ EXECSTART: XOR A ; Execution entry point LD C,L LD B,H LD HL,TAPECOPY - OUT (LSE0),A - LDIR - ;POP HL - ;LD (L0054),HL - JP L0000 - - DS 0,11 + OUT (LSE0),A ; Map 0000-0FFF to DRAM + LDIR ; Copy BASIC ROM to 0x0000 + JP L0000 ; Jump to cold start BASICEND: + ENDIF diff --git a/asm/mz2z009e_orig.asm b/asm/mz2z009e_orig.asm new file mode 100644 index 0000000..b49aada --- /dev/null +++ b/asm/mz2z009e_orig.asm @@ -0,0 +1,12 @@ +; =========================================================================== +; Build configuration — set these flags to select the build variant: +; +; BUILD_RFS=0, BUILD_TAPE=0 : Original BASIC (QD boot, no RFS) +; BUILD_RFS=0, BUILD_TAPE=1 : Original BASIC (Tape/CMT/RFS ROM boot) +; BUILD_RFS=1, BUILD_TAPE=0 : RFS Enhanced BASIC (QD boot) +; BUILD_RFS=1, BUILD_TAPE=1 : RFS Enhanced BASIC (Tape/CMT/RFS ROM boot) +; =========================================================================== +BUILD_RFS EQU 0 ; 0 = original BASIC, 1 = RFS enhancements +BUILD_TAPE EQU 1 ; 0 = QD boot, 1 = Tape/CMT/RFS ROM boot + + INCLUDE "mz2z009e.asm" diff --git a/asm/mz2z009e_rfs.asm b/asm/mz2z009e_rfs.asm new file mode 100644 index 0000000..a3a3abc --- /dev/null +++ b/asm/mz2z009e_rfs.asm @@ -0,0 +1,12 @@ +; =========================================================================== +; Build configuration — set these flags to select the build variant: +; +; BUILD_RFS=0, BUILD_TAPE=0 : Original BASIC (QD boot, no RFS) +; BUILD_RFS=0, BUILD_TAPE=1 : Original BASIC (Tape/CMT/RFS ROM boot) +; BUILD_RFS=1, BUILD_TAPE=0 : RFS Enhanced BASIC (QD boot) +; BUILD_RFS=1, BUILD_TAPE=1 : RFS Enhanced BASIC (Tape/CMT/RFS ROM boot) +; =========================================================================== +BUILD_RFS EQU 1 ; 0 = original BASIC, 1 = RFS enhancements +BUILD_TAPE EQU 1 ; 0 = QD boot, 1 = Tape/CMT/RFS ROM boot + + INCLUDE "mz2z009e.asm" diff --git a/asm/mz5z008.asm b/asm/mz5z008.asm index 03c32bb..b09905d 100644 --- a/asm/mz5z008.asm +++ b/asm/mz5z008.asm @@ -4,7 +4,7 @@ ; ; Created with dZ80 2.1 ; -; on Monday, 16 of March 2026 at 03:02 PM +; on Monday, 16 of March 2026 at 07:23 PM ; LSD0 EQU 0D0H LSD1 EQU 0D1H @@ -26,90 +26,9 @@ FDPB EQU 0F9H FDPC EQU 0FAH FDPD EQU 0FBH LSFC EQU 0FCH -ELMD EQU 01000H -ELMD1 EQU 01001H -ELMD18 EQU 01012H -ELMD20 EQU 01014H -ELMD22 EQU 01016H -ELMD24 EQU 01018H -ELMD26 EQU 0101AH -ELMD30 EQU 0101EH -ELMD32 EQU 01020H -ZTOP EQU 01040H -ZLOG EQU 01042H -ZRWX EQU 01043H -ZEQT EQU 01044H -ZCH EQU 01046H -ZEOF EQU 01047H -ZWRK1 EQU 01048H -ZWRK2 EQU 01049H -ZNXT EQU 0104AH -ZDEVNM EQU 0104CH -ZFLAG1 EQU 01050H -ZFLAG2 EQU 01051H -ZDIRMX EQU 01052H -ZINIT EQU 01053H -ZRO EQU 01055H -ZWO EQU 01057H -ZCL EQU 01059H -ZKL EQU 0105BH -ZINP EQU 0105DH -ZOUT EQU 0105FH -ZDELT EQU 01061H -ZWDIR EQU 01063H -ZFREE EQU 01065H -DCHAN EQU 01069H -DDEV EQU 0106AH -.$CRT EQU 0106CH -.$LPT EQU 0106EH -TEXTST EQU 01070H -TEXTED EQU 01072H -VARST EQU 01074H -STRST EQU 01076H -VARED EQU 01078H -TMPEND EQU 0107AH -INTFAC EQU 0107CH -MEMLMT EQU 0107EH -MEMMAX EQU 01080H -CURXY EQU 01082H -POSADR EQU 01084H -BITADR EQU 01086H -POINTX EQU 01088H -POINTY EQU 0108AH -CURFLG EQU 0108CH -CURMAK EQU 0108DH -CMTMSG EQU 0108EH -INPFLG EQU 0108FH -DISPX EQU 01090H -FILOUT EQU 01091H -PSEL EQU 01092H -PCRLF EQU 01093H -LPT_TM EQU 01094H -LPOSB EQU 01095H -PSMAL EQU 01096H -PNMODE EQU 01097H -DMD EQU 01098H -MEMOP EQU 01099H -PWMODE EQU 0109AH -CMODE EQU 0109BH -CPLANE EQU 0109CH -MAXCF EQU 0109DH -PMASK EQU 0109EH -GMODE EQU 0109FH -APTS EQU 010F0H -NAME EQU 010F1H -SIZE EQU 01102H -DTADR EQU 01104H -EXADR EQU 01106H -COMNT EQU 01108H -DTEFG EQU 01171H -DTEFGX EQU 01172H TMCNT EQU 01195H -SUMDT EQU 01197H CSMDT EQU 01199H TEMPW EQU 0119EH -KEYBM1 EQU 011A3H -KEYBUF EQU 011A4H KEY262 EQU 012AAH KEY264 EQU 012ACH KEY266 EQU 012AEH @@ -117,7 +36,7 @@ FUNBUF EQU 012B2H INBUFC EQU 01352H INBUFL EQU 01353H INBUF EQU 01354H -TIMST EQU 00033H +TIMST EQU 00033H ; Timer stop routine in Monitor ROM LINLIM EQU 01364H KEYDAT EQU 01365H AMPM EQU 01366H @@ -168,27 +87,54 @@ PPI_PA EQU 0E010H PPI_PB EQU 0E011H PPI_PC EQU 0E012H PPI_CTL EQU 0E013H -ATRB EQU 010F0H PRGSTART EQU 00000H -TAPECOPY EQU 01200H -BUILD_ORIG EQU 1 -BUILD_RFS EQU 0 - ; Create an MZF Tape header. +; =========================================================================== +; Build configuration — set these flags to select the build variant: +; +; BUILD_RFS=0, BUILD_TAPE=0 : Original BASIC (QD boot, no RFS) +; BUILD_RFS=0, BUILD_TAPE=1 : Original BASIC (Tape/CMT/RFS ROM boot) +; BUILD_RFS=1, BUILD_TAPE=0 : RFS Enhanced BASIC (QD boot) +; BUILD_RFS=1, BUILD_TAPE=1 : RFS Enhanced BASIC (Tape/CMT/RFS ROM boot) +; =========================================================================== +;BUILD_RFS EQU 1 ; 0 = original BASIC, 1 = RFS enhancements +;BUILD_TAPE EQU 0 ; 0 = QD boot, 1 = Tape/CMT/RFS ROM boot + +; Tape/CMT boot constants +ATRB EQU 010F0H ; MZF header location (= ELMD area) +TAPECOPY EQU 01200H ; Load address for tape bootstrap +HDRLEN EQU 00040H ; MZF header length (64 bytes) + +; RFS (ROM Filing System) constants for picoZ80 +PORT_LODRAM EQU 0E0H ; OUT: map 0000-0FFF to DRAM +PORT_DRAM EQU 0E1H ; OUT: map D000-FFFF to DRAM +PORT_LOROM EQU 0E2H ; OUT: map 0000-0FFF to Monitor ROM +PORT_MMIO EQU 0E3H ; OUT: map D000-FFFF to VRAM/MMIO/ROM +BNKCTRLRST EQU 0EFF8H ; RFS bank control reset register +BNKCTRL EQU 0EFFFH ; Bank Control register (CS, CLK bits) +HWSPIDATA EQU 0EFFBH ; Hardware SPI Data register (read/write) +HWSPISTART EQU 0EFFCH ; Start SPI transfer register +; SECTORBUF relocated to RFS data area — was EQU 0CE00H (overlapped BASIC stack) +SDCS_ACT EQU 001H ; BNKCTRL: CS LOW (active), BBCLK enable +SDCS_DEACT EQU 003H ; BNKCTRL: CS HIGH (inactive), BBCLK enable + +; --------------------------------------------------------------------------- +; MZF tape header (only for BUILD_TAPE=1) +; Loaded by Monitor ROM at ATRB (0x10F0), then bootstrapped to 0x0000 +; --------------------------------------------------------------------------- + IF BUILD_TAPE = 1 ORG ATRB - - ; Declare the MZF header to bootstrap BASIC from tape/SD. -BOOTATRB: DB 01h ; Code Type, 01 = Machine Code. -BOOTNAME: IF BUILD_ORIG = 1 - DB "BASIC 5Z-008B ", 0Dh ; Title/Name (17 bytes). - ENDIF +BOOTATRB: DB 001H ; File type: 01 = Machine Code IF BUILD_RFS = 1 - DB "BASIC 5Z-008BRFS", 0Dh ; Title/Name (17 bytes). +BOOTNAME: DB "BASIC 5Z-008BRFS", 00DH ; Title (17 bytes + CR) + ELSE +BOOTNAME: DB "BASIC 5Z-008B ", 00DH ; Title (17 bytes + CR) + ENDIF +BOOTSIZE: DW BASICEND - L0000 ; Size of program +BOOTDTADR: DW TAPECOPY ; Load address +BOOTEXADR: DW EXECSTART + TAPECOPY ; Exec address (relocated) +BOOTCOMNT: DS 104 ; Comment area (unused) ENDIF -BOOTSIZE: DW BASICEND - L0000 ; Size of program. -BOOTDTADR: DW TAPECOPY ; Load address of program. -BOOTEXADR: DW EXECSTART + TAPECOPY ; Exec address of program. -BOOTCOMNT: DS 104 ORG PRGSTART @@ -493,6 +439,19 @@ L0182: PUSH AF POP AF JP L0000 +; --------------------------------------------------------------------------- +; SVC Dispatch Table (L018A - ~0x0201) +; +; This is a lookup table of 2-byte handler addresses indexed by SVC number. +; SVC_DISP uses: handler = word[L018A + SVC*2]. +; NOTE: The bytes in this table also serve as executable code — several +; labels within the table (L01A2, L01CE, L01D9, L01E0) are jump targets +; from nearby code. This dual-purpose layout prevents conversion to DW. +; +; Key entries: +; SVC #00=3D9D #02=05E8 #05=0908 #20=0D3E #29=1EDB #2A=1F1D +; SVC #2E=19E0 #33=1AE1 #39=1D1B #3A=14DD +; --------------------------------------------------------------------------- L018A: SBC A,L DEC A CALL PE,0E805H @@ -2073,7 +2032,7 @@ INKEY0: DB 000H EX AF,AF' LD HL,L0BFF -L0BB9: LD A,(L1090) +L0BB9: LD A,(DISPX) OR A JR Z,L0BC2 ; (+003H) LD HL,L0C43 @@ -2085,7 +2044,7 @@ L0BC2: EX AF,AF' LD A,00DH L0BCA: PUSH AF - LD A,(L1091) + LD A,(FILOUT) L0BCE: OR A JR NZ,L0BD4 ; (+003H) POP AF @@ -2095,7 +2054,7 @@ L0BD4: POP AF JP L0F3E PUSH AF - LD A,(L1091) + LD A,(FILOUT) OR A JR NZ,L0BE2 ; (+003H) POP AF @@ -2199,41 +2158,23 @@ L0C60: CP 060H L0C8A: LD A,02EH L0C8C: JP L0FA9 -L0C8F: NOP - NOP - NOP - NOP - RST 038H - RST 038H - RST 038H - DEC E - NOP - NOP - NOP - NOP - NOP - DEC C - NOP - NOP - NOP - LD A,(BC) - INC BC - JR NZ,00CB2H ; (+00eH) - NOP - NOP - RST 038H - NOP - RST 038H - RST 038H - DEC C - RST 038H - NOP - NOP - NOP +; --------------------------------------------------------------------------- +; Control character translation table (indexed by char code 0x00-0x1F) +; Used by L0C26: HL = L0C8F + C, A = (HL). +; 0x00 → handle via L0D3F, 0xFF → skip, other → translate via L0C60 +; --------------------------------------------------------------------------- +L0C8F: DB 000H,000H,000H,000H ; 00-03: NUL,SOH,STX,ETX → L0D3F + DB 0FFH,0FFH,0FFH,01DH ; 04-07: EOT,ENQ,ACK → skip; BEL → 0x1D + DB 000H,000H,000H,000H ; 08-0B: BS,HT,LF,VT → L0D3F + DB 000H,00DH,000H,000H ; 0C-0F: FF → L0D3F; CR → 0x0D; SO,SI → L0D3F + DB 000H,00AH,003H,020H ; 10-13: DLE → L0D3F; DC1 → 0x0A; DC2 → 0x03; DC3 → 0x20 + DB 00EH,000H,000H,0FFH ; 14-17: DC4 → 0x0E; NAK,SYN → L0D3F; ETB → skip + DB 000H,0FFH,0FFH,00DH ; 18-1B: CAN → L0D3F; EM,SUB → skip; ESC → 0x0D + DB 0FFH,000H,000H,000H ; 1C-1F: FS → skip; GS,RS,US → L0D3F L0CAF: DI XOR A LD (L004D),A - LD (L1091),A + LD (FILOUT),A LD SP,L0000 OUT (LSE1),A LD A,004H @@ -2259,21 +2200,21 @@ L0CDB: LD A,C DB 03AH JP L00DA - LD HL,(L1072) + LD HL,(TEXTED) ADD HL,DE - LD (L1072),HL - LD HL,(L1074) + LD (TEXTED),HL + LD HL,(VARST) ADD HL,DE - LD (L1074),HL - LD HL,(L1076) + LD (VARST),HL + LD HL,(STRST) ADD HL,DE - LD (L1076),HL - LD HL,(L1078) + LD (STRST),HL + LD HL,(VARED) ADD HL,DE - LD (L1078),HL - LD HL,(L107A) + LD (VARED),HL + LD HL,(TMPEND) ADD HL,DE - LD (L107A),HL + LD (TMPEND),HL RET L0D05: LD HL,(00B15H) @@ -2335,35 +2276,51 @@ L0D59: CALL L0D20 POP HL RET -$USR: DS 2, 000H ; $USR - User device descriptor -L0D60: DB "USR",000H,09FH - DS 2, 000H - DB LSE5 - DB 000H - DB 077H - DB 00DH - DB 077H - DB 00DH - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB 086H - DB 00DH - DB 086H - DB 00DH - DB LSE5 - DB 000H - LD HL,L1001 +; --------------------------------------------------------------------------- +; $USR Device Descriptor (User-defined device) +; +; Handlers pointing to 0x00E5 (monitor ROM) are stubs (no-op/error). +; ZRO and ZWO share the same handler (USR_RO). +; ZINP and ZOUT share the same handler (USR_IO). +; ZWDIR and ZFREE are not emitted explicitly — USR_RO code at 0x0D77 +; overlaps these 2 DW fields (the first 4 bytes of USR_RO: 21 01 10 DF +; encode ZWDIR=0x0121, ZFREE=0xDF10). Neither is called (flags1 bit7=1). +; --------------------------------------------------------------------------- +$USR: DW 00000H ; Next device = NULL (end of chain) +L0D60: DB "USR",000H ; Device name + DB 09FH ; flags1: bit7=1 (no dir/free), bit4-0=0x1F + DB 000H ; flags2 + DB 000H ; dirmx: 0 + DW 000E5H ; ZINIT (monitor ROM stub) + DW USR_RO ; ZRO handler (read/write open) + DW USR_RO ; ZWO handler (same as ZRO) + DW 000E5H ; ZCL (monitor ROM stub) + DW 000E5H ; ZKL (monitor ROM stub) + DW USR_IO ; ZINP handler (user I/O dispatch) + DW USR_IO ; ZOUT handler (same as ZINP) + DW 000E5H ; ZDELT (monitor ROM stub) +; ZWDIR/ZFREE implicit — next 4 bytes are USR_RO code, read as DW pointers +; +; --------------------------------------------------------------------------- +; USR_RO - User device open (ZRO/ZWO handler) +; +; Calls SVC #13H to find the USR device entry point, stores it in ZWRK1. +; --------------------------------------------------------------------------- +USR_RO: LD HL,ELMD1 RST 018H DB 013H LD A,D OR E JP Z,01F9AH LD (ZWRK1),DE - RET - - LD HL,(ZWRK1) + RET +; +; --------------------------------------------------------------------------- +; USR_IO - User device I/O (ZINP/ZOUT handler) +; +; Dispatches to the user-supplied routine address stored in ZWRK1. +; --------------------------------------------------------------------------- +USR_IO: LD HL,(ZWRK1) JP (HL) NOP @@ -2372,21 +2329,21 @@ L0D60: DB "USR",000H,09FH NOP NOP NOP - LD A,(L1050) + LD A,(ZFLAG1) BIT 7,A JP NZ,01F97H JP L1989 L0D9B: LD B,(IY+000H) CALL L1C39 - LD A,(L1000) + LD A,(ELMD) CP B JP NZ,01F9DH RET L0DA9: LD A,(L004D) OR A - LD A,(L1095) + LD A,(LPOSB) RET Z LD A,(L0054) RET @@ -2422,10 +2379,10 @@ $LPT: DB 0F7H,"/LPT",000H,08AH ; $LPT - Line printer device descripto L0F1D: LD A,00DH CALL L0FA9 XOR A - LD (L1095),A + LD (LPOSB),A RET - LD HL,L1090 + LD HL,DISPX BIT 0,(HL) JR Z,L0F3E ; (+010H) L0F2E: CALL IOOUT @@ -2450,14 +2407,14 @@ L0F3E: CALL IOOUT DB 003H RET -L0F4E: LD A,(L1097) +L0F4E: LD A,(PNMODE) CP 001H LD A,044H JP NZ,00180H LD A,B CP 00DH JR Z,L0F1D ; (-040H) - LD HL,L1095 + LD HL,LPOSB INC (HL) SUB 005H CP 002H @@ -2476,7 +2433,7 @@ L0F4E: LD A,(L1097) L0F7C: LD A,02EH JR L0FB0 ; (+030H) -L0F80: LD HL,L1095 +L0F80: LD HL,LPOSB DEC (HL) LD A,B CP 015H @@ -2541,97 +2498,92 @@ L0FD4: IN A,(0FEH) JP L0182 DS 17, 000H -L1000: DB 000H -L1001: DS 17, 000H -L1012: DS 2, 000H -L1014: DS 4, 000H -L1018: DS 38, 000H +; =========================================================================== +; BASIC System Workspace (0x1000-0x109F) +; =========================================================================== +; +; --- ELMD: File header / element data (0x1000-0x103F) --- +ELMD: DB 000H ; File type (0=obj, 1=BTX, 2=BASIC, 3=data, 5=MZF) +ELMD1: DS 17, 000H ; Filename (17 bytes, null-padded) +ELMD18: DW 00000H ; File size (bytes) +ELMD20: DW 00000H ; Load address / BASIC program size +ELMD22: DW 00000H ; Execution address +ELMD24: DW 00000H ; Reserved +ELMD26: DW 00000H ; Reserved + DS 2, 000H +ELMD30: DW 00000H ; Reserved +ELMD32: DW 00000H ; Reserved + DS 6, 000H +SDDRIVENO: DB 000H ; SD drive number (numeric 0-9) +CMTFILENO: DB 000H ; Sequential file counter + DS 20, 000H L103E: DS 2, 000H -L1040: LD (BC),A - NOP -L1042: NOP -L1043: NOP -L1044: NOP - NOP -L1046: NOP - NOP - NOP - NOP -L104A: NOP - NOP - NOP - NOP - NOP - NOP -L1050: LD BC,L0000 - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L1069: NOP - NOP - NOP - LD A,B - DEC BC - NOP - RRCA -L1070: NOP - NOP -L1072: NOP - NOP -L1074: NOP - NOP -L1076: NOP - NOP -L1078: NOP - NOP -L107A: NOP - NOP -L107C: NOP - NOP -L107E: NOP - NOP - NOP - RST 038H - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L1090: NOP -L1091: NOP - LD BC,L0E00 -L1095: NOP - NOP -L1097: LD BC,L0000 - DS 86, 000H +; +; --- Device workspace (0x1040-0x106F) --- +ZTOP: DW 00002H ; Top of device chain pointer +ZLOG: DB 000H ; Logical unit number +ZRWX: DB 000H ; Read/write mode +ZEQT: DW 00000H ; Equipment/device type +ZCH: DB 000H ; Channel number +ZEOF: DB 000H ; End of file flag +ZWRK1: DW 00000H ; Work area 1 (16-bit) +ZNXT: DW 00000H ; Next byte pointer +ZDEVNM: DS 4, 000H ; Active device name (4 bytes) +ZFLAG1: DB 001H ; Active device flags1 +ZFLAG2: DB 000H ; Active device flags2 +ZDIRMX: DB 000H ; Active device max dir entries +ZINIT: DW 00000H ; Active ZINIT function pointer +ZRO: DW 00000H ; Active ZRO function pointer +ZWO: DW 00000H ; Active ZWO function pointer +ZCL: DW 00000H ; Active ZCL function pointer +ZKL: DW 00000H ; Active ZKL function pointer +ZINP: DW 00000H ; Active ZINP function pointer +ZOUT: DW 00000H ; Active ZOUT function pointer +ZDELT: DW 00000H ; Active ZDELT function pointer +ZWDIR: DW 00000H ; Active ZWDIR function pointer +ZFREE: DW 00000H ; Active ZFREE function pointer + DS 2, 000H +DCHAN: DB 000H ; Default channel +DDEV: DW 00000H ; Default device descriptor pointer +_CRT: DW 00B78H ; CRT device descriptor pointer +_LPT: DW 00F00H ; LPT device descriptor pointer +; +; --- BASIC memory pointers (0x1070-0x109F) --- +TEXTST: DW 00000H ; Start of BASIC text +TEXTED: DW 00000H ; End of BASIC text +VARST: DW 00000H ; Start of variables +STRST: DW 00000H ; Start of string space +VARED: DW 00000H ; End of variables +TMPEND: DW 00000H ; End of temporary area +INTFAC: DW 00000H ; Integer accumulator +MEMLMT: DW 00000H ; Memory limit +MEMMAX: DW 0FF00H ; Maximum memory +CURXY: DW 00000H ; Cursor X,Y position +POSADR: DW 00000H ; Cursor VRAM address +BITADR: DW 00000H ; Bit address +POINTX: DW 00000H ; Graphics point X +POINTY: DW 00000H ; Graphics point Y +CURFLG: DB 000H ; Cursor flag +CURMAK: DB 000H ; Cursor make flag +CMTMSG: DB 000H ; CMT message flag +INPFLG: DB 000H ; Input flag +DISPX: DB 000H ; Display X position +FILOUT: DB 000H ; File output flag +PSEL: DB 001H ; Printer select +PCRLF: DB 000H ; Printer CR/LF mode +LPT_TM: DB 00EH ; LPT timeout +LPOSB: DB 000H ; LPT position +PSMAL: DB 000H ; Printer small flag +PNMODE: DB 001H ; Printer mode +DMD: DB 000H ; Display mode +MEMOP: DB 000H ; Memory operation flag +PWMODE: DB 000H ; Power mode +CMODE: DB 000H ; Color mode +CPLANE: DB 000H ; Color plane +MAXCF: DB 000H ; Max color flag +PMASK: DB 000H ; Plane mask +GMODE: DB 000H ; Graphics mode + DS 80, 000H ; 0x10A0-0x10EF (padding to L10F0) L10F0: DS 78, 000H L113E: DS 84, 000H RST 028H @@ -2639,7 +2591,7 @@ L113E: DS 84, 000H NOP NOP NOP -L1197: NOP +SUMDT: NOP NOP NOP NOP @@ -2647,174 +2599,40 @@ L1197: NOP NOP LD BC,00504H DS 3, 000H -L11A3: DB 000H -L11A4: DS 154, 000H +KEYBM1: DB 000H +KEYBUF: DS 154, 000H L123E: DS 57, 000H L1277: DS 73, 000H -L12C0: RLCA - LD D,D - LD D,L - LD C,(HL) - JR NZ,012E6H ; (+020H) - JR NZ,L12D5 ; (+00dH) - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - DEC B - LD C,H - LD C,C - LD D,E - LD D,H -L12D5: JR NZ,L12D7 ; (+000H) -L12D7: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - DEC B - LD B,C - LD D,L - LD D,H - LD C,A - JR NZ,L12E7 ; (+000H) -L12E7: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - LD B,052H - LD B,L - LD C,(HL) - LD D,L - LD C,L - JR NZ,L12F8 ; (+000H) -L12F8: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - INC B - LD B,H - LD C,C - LD D,D - JR NZ,L1306 ; (+000H) -L1306: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - DEC B - LD B,E - LD C,B - LD D,D - INC H - JR Z,L1317 ; (+000H) -L1317: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - EX AF,AF' - LD B,H - LD B,L -L1323: LD B,(HL) - JR NZ,L1371 ; (+04bH) - LD B,L - LD E,C - JR Z,L132A ; (+000H) -L132A: NOP - NOP - NOP - NOP - NOP - NOP - INC B - LD B,E - LD C,A - LD C,(HL) - LD D,H - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L133E: NOP - NOP - LD B,053H - LD B,C - LD D,(HL) - LD B,L - JR NZ,L1367 ; (+020H) - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - LD B,04CH - LD C,A - LD B,C - LD B,H - JR NZ,L1377 ; (+020H) - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L1360: NOP -L1361: NOP - NOP - NOP - NOP - NOP - NOP -L1367: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L1371: NOP +; --------------------------------------------------------------------------- +; Function key definition table (F1-F10 defaults, stored in RAM) +; Each entry: 1 byte length + string + zero-padded to 16 bytes total. +; Loaded at startup, modifiable via DEF KEY statement. +; --------------------------------------------------------------------------- +L12C0: DB 007H,"RUN",020H,020H,020H,00DH ; F1: RUN + DS 8, 000H + DB 005H,"LIST",020H ; F2: LIST + DS 10, 000H + DB 005H,"AUTO",020H ; F3: AUTO + DS 10, 000H + DB 006H,"RENUM",020H ; F4: RENUM + DS 9, 000H + DB 004H,"DIR",020H ; F5: DIR + DS 11, 000H + DB 005H,"CHR$(" ; F6: CHR$( + DS 10, 000H + DB 008H,"DEF KEY(" ; F7: DEF KEY( + DS 7, 000H + DB 004H,"CONT" ; F8: CONT + DS 9, 000H +L133E: DS 2, 000H ; (last 2 bytes of F8 entry, used as workspace) + DB 006H,"SAVE",020H,020H ; F9: SAVE + DS 9, 000H + DB 006H,"LOAD",020H,020H ; F10: LOAD + DS 9, 000H +L1360: DB 000H ; F11: (empty/unused) +L1361: DS 15, 000H ; (F11 padding, used as workspace) + DB 000H ; End marker +L1371: DB 000H ; End marker CALL L13D8 JR Z,L1385 ; (+00eH) L1377: CP 010H @@ -3041,7 +2859,7 @@ L14B8: JP 0017DH RET L14BC: CALL SKPDE - LD HL,L11A4 + LD HL,KEYBUF LD B,000H PUSH HL CALL LDHLDE @@ -3058,7 +2876,7 @@ L14BC: CALL SKPDE RET LD (DDEV),DE - LD (L1069),A + LD (DCHAN),A RET LD C,A @@ -3068,7 +2886,7 @@ L14BC: CALL SKPDE DB 002H BIT 7,C JR Z,L14F8 ; (+00aH) - LD HL,L11A4 + LD HL,KEYBUF PUSH HL CALL L1535 POP DE @@ -3123,7 +2941,7 @@ L1535: LD DE,(ZEQT) RST 018H DB 017H CALL LDHLDE - LD A,(L1046) + LD A,(ZCH) ADD A,031H LD (HL),A LD A,(01051H) @@ -3176,7 +2994,7 @@ L179E: DB 020H DS 91, 000H L1800: JP L4000 -L1803: LD A,(L1042) +L1803: LD A,(ZLOG) CP 088H RET @@ -3192,12 +3010,12 @@ L1815: XOR A LD (L1FC0),A RET -L181A: LD A,(L1042) +L181A: LD A,(ZLOG) LD (L1FC0),A RET L1821: CALL SKPDE - LD A,(L1050) + LD A,(ZFLAG1) BIT 7,A LD HL,L1848 L182C: JR Z,L183D ; (+00fH) @@ -3289,7 +3107,7 @@ L18C6: OR 0AFH CALL L1803 RET NZ PUSH DE - LD DE,L11A4 + LD DE,KEYBUF CALL L026A LD (0193CH),DE POP DE @@ -3299,7 +3117,7 @@ L18C6: OR 0AFH PUSH HL PUSH DE CALL L181A - LD HL,(L1040) + LD HL,(ZTOP) INC HL BIT 7,(HL) PUSH HL @@ -3327,7 +3145,7 @@ L1908: SET 7,(HL) L1913: CALL L1803 JR Z,L193B ; (+023H) - LD A,(L1050) + LD A,(ZFLAG1) BIT 7,A LD HL,L1989 JR Z,L1975 ; (+053H) @@ -3460,18 +3278,18 @@ L19D5: DEC HL RST 018H DB 029H RET C -L19F4: LD (L1040),HL - LD DE,L1042 +L19F4: LD (ZTOP),HL + LD DE,ZLOG LD BC,00008H LDIR LD (L1809),HL PUSH HL POP IY - LD DE,L1000 + LD DE,ELMD CALL L1C54 PUSH HL - LD HL,(L1044) - LD DE,L104A + LD HL,(ZEQT) + LD DE,ZNXT LD BC,0001DH LDIR POP HL @@ -3481,7 +3299,7 @@ L19F4: LD (L1040),HL LD BC,(ZKL) ADD HL,BC LD (L180D),HL - LD A,(L1043) + LD A,(ZRWX) AND 00FH RET @@ -3501,7 +3319,7 @@ L1A35: ADC A,C NOP NOP NOP - LD HL,L11A4 + LD HL,KEYBUF PUSH HL LD A,B OR A @@ -3517,7 +3335,7 @@ L1A50: LD A,L LD (01A84H),HL CALL LDDEMI LD (01A4EH),DE - LD DE,L11A4 + LD DE,KEYBUF EX DE,HL L1A62: LD A,(DE) OR A @@ -3555,11 +3373,11 @@ L1A8B: LD A,(HL) OR A JR NZ,L1A8B ; (-00aH) LD HL,(DDEV) - LD A,(L1069) -L1A9B: LD (L1044),HL + LD A,(DCHAN) +L1A9B: LD (ZEQT),HL PUSH HL - LD (L1046),A - LD DE,L104A + LD (ZCH),A + LD DE,ZNXT LD BC,0001DH LDIR LD B,A @@ -3576,20 +3394,20 @@ L1A9B: LD (L1044),HL RST 018H DB 02CH EX DE,HL - LD HL,L1001 + LD HL,ELMD1 LD B,01FH CALL ?CLRHL - LD HL,L1000 + LD HL,ELMD RST 018H DB 017H CALL L1EB4 - LD HL,L1050 + LD HL,ZFLAG1 BIT 4,(HL) RET Z INC HL BIT 7,(HL) RET NZ - LD A,(L1001) + LD A,(ELMD1) CP 00DH JP Z,01F9AH RET @@ -3600,37 +3418,37 @@ L1A9B: LD (L1044),HL CALL L1B97 JP L2D08 -L1AEF: LD A,(L1042) +L1AEF: LD A,(ZLOG) RST 018H DB 029H JP NC,01F7CH CALL L1C5B LD HL,L005D - LD A,(L1050) + LD A,(ZFLAG1) LD DE,(ZKL) INC DE INC DE BIT 7,A JR NZ,L1B0B ; (+001H) ADD HL,DE -L1B0B: LD A,(L1043) +L1B0B: LD A,(ZRWX) BIT 2,A JR Z,L1B13 ; (+001H) ADD HL,DE L1B13: EX DE,HL - LD A,(L1042) + LD A,(ZLOG) RST 018H L1B18: DB 02AH LD (L1FC0),A - LD (L1040),HL + LD (ZTOP),HL EX DE,HL - LD HL,L1042 + LD HL,ZLOG LD BC,00008H LDIR LD (01809H),DE PUSH DE POP IY - LD HL,L1000 + LD HL,ELMD CALL L1C54 LD HL,00010H ADD HL,DE @@ -3640,17 +3458,17 @@ L1B18: DB 02AH LD (L180D),HL CALL L1D15 JP NZ,L2B7F - LD A,(L1043) + LD A,(ZRWX) BIT 2,A JP NZ,01F97H BIT 1,A LD IX,(ZWO) JR NZ,L1B65 ; (+00bH) - LD A,(L1050) + LD A,(ZFLAG1) BIT 7,A JR Z,L1B6B ; (+00aH) LD IX,(ZRO) -L1B65: LD HL,L1000 +L1B65: LD HL,ELMD JP IOCALL L1B6B: CALL L0D9B @@ -3658,8 +3476,8 @@ L1B6B: CALL L0D9B CALL SKPDE LD IY,L0100 - LD (L1042),IY - LD IY,L1000 + LD (ZLOG),IY + LD IY,ELMD CALL L1D15 LD HL,L2B7A JR NZ,L1B8B ; (+003H) @@ -3667,13 +3485,13 @@ L1B6B: CALL L0D9B L1B8B: CALL L00FA LD B,080H CALL L1B97 - LD A,(L1000) + LD A,(ELMD) RET -L1B97: LD A,(L1000) +L1B97: LD A,(ELMD) CP 005H RET C - LD A,(L1012) + LD A,(ELMD18) AND 080H CP B RET Z @@ -3704,7 +3522,7 @@ L1BCF: CALL IOCALL L1BD4: OR A JR Z,L1BE4 ; (+00dH) - LD A,(L1043) + LD A,(ZRWX) BIT 1,A CALL NZ,L1892 JR L1BE4 ; (+003H) @@ -3729,13 +3547,13 @@ L1BEF: LD A,C JP L1FAB L1BFD: CALL SKPDE - LD A,(L1050) + LD A,(ZFLAG1) BIT 6,A JP Z,01F97H CALL 018C7H LD A,(ZDIRMX) LD B,A -L1C0F: LD HL,L11A4 +L1C0F: LD HL,KEYBUF PUSH BC LD IX,(ZRO) CALL IOCALL @@ -3763,13 +3581,13 @@ L1C39: CALL L1C5B CALL L1BFD JP C,01F73H CALL SKPDE - LD HL,L11A4 + LD HL,KEYBUF PUSH IY POP DE PUSH HL CALL L1C54 POP HL - LD DE,L1000 + LD DE,ELMD LD A,(HL) L1C54: LD BC,00040H LDIR @@ -3779,9 +3597,9 @@ L1C54: LD BC,00040H L1C5B: LD IX,L1C9D L1C5F: LD (01C99H),IX CALL SKPDE - LD A,(L1042) + LD A,(ZLOG) LD C,A - LD HL,(L1072) + LD HL,(TEXTED) PUSH HL L1C6E: POP HL LD A,(HL) @@ -3801,7 +3619,7 @@ L1C6E: POP HL LD A,(HL) EX AF,AF' INC HL - LD DE,L1044 + LD DE,ZEQT PUSH BC LD BC,00300H L1C8C: LD A,(DE) @@ -3824,7 +3642,7 @@ L1C9D: LD A,(01051H) RET Z EX AF,AF' LD B,A - LD A,(L1043) + LD A,(ZRWX) AND B BIT 1,A RET Z @@ -3846,20 +3664,20 @@ L1C9D: LD A,(01051H) LD BC,(ELMD20) JP L313A - LD A,(L1000) + LD A,(ELMD) CP 005H JR C,L1CE4 ; (+005H) LD A,080H - LD (L1012),A + LD (ELMD18),A L1CE4: CALL L1D15 JP NZ,L2AE0 BIT 7,A JP NZ,01F97H PUSH DE LD HL,L0200 - LD (L1042),HL + LD (ZLOG),HL CALL L1C5B - LD HL,L1000 + LD HL,ELMD PUSH HL POP IY LD IX,(ZWO) @@ -3871,7 +3689,7 @@ L1CE4: CALL L1D15 CALL IOCALL RET -L1D15: LD A,(L1050) +L1D15: LD A,(ZFLAG1) BIT 5,A RET @@ -3879,16 +3697,34 @@ L1D15: LD A,(L1050) OR A JR NZ,L1D6B ; (+04aH) LD HL,L0100 - LD (L1042),HL + LD (ZLOG),HL + IF BUILD_RFS = 1 + CALL RFS_L1C5B_WRAP + CALL RFS_FLAGS_TEST + ; RFS_FLAGS_TEST returns HL=ZFLAG1 for non-$RFS devices + ; (and already handles the ZFLAG1 bit7 error check). + BIT 5,(HL) ; ZFLAG1 bit5 = block device + JP NZ,02F38H ; Block device DIR path (ZINP-based) + INC HL ; HL = ZFLAG2 + BIT 7,(HL) ; ZFLAG2 bit7 = error + JP NZ,01F97H + NOP + NOP + NOP + NOP + NOP + ELSE + ; Original SVC#39 DIR handler (no RFS) CALL L1C5B - LD HL,L1050 + LD HL,ZFLAG1 BIT 7,(HL) JP NZ,01F97H BIT 5,(HL) - JP NZ,02F38H + JP NZ,02F38H ; Block device DIR path INC HL BIT 7,(HL) JP NZ,01F97H + ENDIF LD HL,L2000 LD BC,00008H L1D43: CALL ?CLRHL @@ -3913,8 +3749,8 @@ L1D68: JP L18C6 L1D6B: LD (01E13H),A XOR A - LD (L1090),A - LD HL,L11A4 + LD (DISPX),A + LD HL,KEYBUF PUSH HL LD DE,L1E1D LD B,00EH @@ -3958,7 +3794,7 @@ L1DC3: CALL SKPDE OR A RET Z RET M - LD DE,L11A4 + LD DE,KEYBUF PUSH DE LD A,020H LD B,026H @@ -4022,24 +3858,53 @@ L1E31: DS 2, 045H DS 2, 020H DB 03FH DB 020H - DB LSE5 - DB 0AFH,032H,042H,010H,0DDH,021H,071H,01EH,0EDH,073H,072H,01EH,0CDH,05FH,01CH - DB LSE1 - DB 0DDH,02AH,053H,010H,0CDH,045H,002H,0C9H,031H - DS 2, 000H - DB 006H - DB 000H - DB 0DFH - DB 038H - DB 018H - DB 0DFH -L1E7A: DB 0CDH,064H,001H,059H,0C8H,011H,08EH,01EH,0DFH,005H,03EH,001H,0DFH,00DH,0FEH,059H,0C8H,0C3H,07DH,001H,"OK ? [Y/N]",019H,000H -L1E9A: DB 011H - DB 000H - DB 010H -L1E9D: DB 0CDH - DB 008H - LD BC,L1323 +; --------------------------------------------------------------------------- +; Subroutine at 0x1E58: Opens device I/O channel (saves/restores SP and IX) +; --------------------------------------------------------------------------- + PUSH HL ; E5 +L1E59: XOR A ; AF + LD (01042H),A ; 32 42 10 — clear I/O flag + LD IX,01E71H ; DD 21 71 1E — IX = workspace + LD (01E72H),SP ; ED 73 72 1E — save stack pointer + CALL L1C5F ; CD 5F 1C — open channel + POP HL ; E1 + LD IX,(01053H) ; DD 2A 53 10 — restore IX + CALL IOCALL ; CD 45 02 + RET ; C9 +; Workspace area (0x1E71-0x1E73, used by above subroutine) + DB 031H ; 0x1E71 data (IX-based structure) + DS 2, 000H ; 0x1E72-73 SP save area +; --------------------------------------------------------------------------- +; Subroutine at 0x1E74: Confirm prompt — SVC #38 + "OK ? [Y/N]" +; --------------------------------------------------------------------------- + LD B,000H ; 06 00 + RST 018H ; DF + DB 038H ; SVC #38 + JR L1E59 ; 18 DF — loop back to XOR A at 0x1E59 +; --------------------------------------------------------------------------- +; Subroutine at 0x1E7A: Ask "OK ? [Y/N]" and return Z if 'Y' +; --------------------------------------------------------------------------- +L1E7A: CALL 00164H ; CD 64 01 + DB 059H ; inline param 'Y' for CALL 0164H + RET Z ; C8 — return if match + LD DE,01E8EH ; 11 8E 1E — DE → "OK ? [Y/N]" string + RST 018H ; DF + DB 005H ; SVC #5 — display string + LD A,001H ; 3E 01 + RST 018H ; DF + DB 00DH ; SVC #0D — read key + CP 059H ; FE 59 — compare with 'Y' + RET Z ; C8 — return Z if 'Y' + JP 0017DH ; C3 7D 01 — jump to error/cancel handler + DB "OK ? [Y/N]",019H,000H ; Inline string at 0x1E8E +; --------------------------------------------------------------------------- +; L1E9D: Filename comparison — compares entry name (HL) with search name (DE). +; Skips ATRB byte in both, compares up to 17 chars, CR terminates/matches. +; --------------------------------------------------------------------------- +L1E9A: LD DE,01000H +L1E9D: CALL SKPDE ; Skip DE past device name + INC HL ; Skip ATRB byte in directory entry + INC DE ; Skip ATRB byte in search name LD A,(DE) CP 00DH RET Z @@ -4083,7 +3948,7 @@ L1ED2: LD A,C DEC C JR L1ED2 ; (-009H) - LD HL,(L1072) + LD HL,(TEXTED) L1EDE: INC (HL) DEC (HL) SCF @@ -4120,7 +3985,7 @@ L1EF1: CALL SKPDE PUSH HL LD B,H LD C,L - LD HL,(L107A) + LD HL,(TMPEND) OR A SBC HL,BC LD B,H @@ -4144,7 +4009,7 @@ L1EF1: CALL SKPDE INC DE INC DE INC DE - LD HL,(L107A) + LD HL,(TMPEND) EX DE,HL ADD HL,DE EX DE,HL @@ -4154,7 +4019,7 @@ L1EF1: CALL SKPDE ADD HL,SP SBC HL,DE JR C,01F6DH ; (+037H) - LD HL,(L107E) + LD HL,(MEMLMT) DEC H DEC H SBC HL,DE @@ -4260,7 +4125,7 @@ L2907: LD BC,L0000 CALL SKPDE CALL L181A - LD HL,L11A4 + LD HL,KEYBUF PUSH HL LD A,B OR A @@ -4445,7 +4310,7 @@ L2A60: LD (IY+014H),L LD (HL),E CALL L2A88 OR A - LD A,(L1043) + LD A,(ZRWX) BIT 2,A RET NZ LD HL,(L180D) @@ -4488,14 +4353,14 @@ L2A88: LD C,(IY+01EH) CALL L2972 LD B,020H XOR A - LD HL,(L1040) + LD HL,(ZTOP) INC HL RES 7,(HL) JR L2ACF ; (+008H) L2AC7: XOR A LD B,A - LD HL,(L1040) + LD HL,(ZTOP) INC HL SET 7,(HL) L2ACF: POP DE @@ -4508,7 +4373,7 @@ L2AD2: LD DE,(ELMD20) JP L2D08 L2AE0: CALL L2AEA - LD IY,L1000 + LD IY,ELMD JP L2C07 L2AEA: PUSH DE @@ -4528,7 +4393,7 @@ L2AEA: PUSH DE CALL Z,L2B51 POP DE CALL L2AEA - LD HL,L1000 + LD HL,ELMD OR 0FFH CALL L2B51 CALL L2E2A @@ -4536,7 +4401,7 @@ L2AEA: PUSH DE LD (HL),081H PUSH HL POP IY - LD HL,(L1014) + LD HL,(ELMD20) LD (IY+014H),L LD (IY+015H),H LD HL,(ELMD30) @@ -4548,7 +4413,7 @@ L2B34: PUSH HL CALL L2B6A JP NZ,01F88H DEC (HL) - LD DE,L1000 + LD DE,ELMD CALL L2E24 CALL L2F37 L2B45: XOR A @@ -4581,11 +4446,11 @@ L2B6A: CALL L1D15 RET L2B7A: LD A,009H - LD (L1043),A + LD (ZRWX),A L2B7F: CALL L2F6E XOR B DEC HL - LD A,(L1043) + LD A,(ZRWX) BIT 0,A JP NZ,01F73H PUSH AF @@ -4608,7 +4473,7 @@ L2B7F: CALL L2F6E CALL L1E9A RET NZ POP AF - LD A,(L1043) + LD A,(ZRWX) BIT 1,A JP NZ,01F79H PUSH HL @@ -4620,7 +4485,7 @@ L2B7F: CALL L2F6E PUSH IY POP DE CALL L2E24 - LD HL,L1043 + LD HL,ZRWX BIT 3,(HL) RET NZ BIT 0,(HL) @@ -4644,7 +4509,7 @@ L2BDB: LD A,(HL) L2BEC: LD A,B OR A RET Z - LD A,(L1043) + LD A,(ZRWX) BIT 0,A RET NZ BIT 2,A @@ -4653,7 +4518,7 @@ L2BEC: LD A,B CALL L2907 PUSH IY POP HL - LD DE,L1000 + LD DE,ELMD CALL L2E24 L2C07: CALL L2F6E RLA @@ -4721,17 +4586,17 @@ L2C61: CALL L2F37 POP AF CALL L2CFB PUSH HL - LD DE,L1000 + LD DE,ELMD CALL L2E24 XOR A - LD (L1042),A + LD (ZLOG),A LD IX,L2C9B CALL L1C5F XOR A - LD (L1000),A + LD (ELMD),A POP HL L2C93: LD B,(HL) - LD IY,L1000 + LD IY,ELMD JP L2D6A L2C9B: INC HL @@ -4793,21 +4658,21 @@ L2D11: PUSH AF POP AF INC A JR NZ,L2D11 ; (-007H) - LD HL,(L1044) + LD HL,(ZEQT) LD DE,$FD CALL L2FC9 RET NZ - LD A,(L1046) + LD A,(ZCH) EXX LD H,A LD D,000H LD B,003H EXX XOR A - LD (L1042),A + LD (ZLOG),A L2D30: EXX LD A,B - LD (L1046),A + LD (ZCH),A ADD A,090H LD L,A LD E,000H @@ -4825,7 +4690,7 @@ L2D30: EXX JP P,L2D30 EXX LD A,H - LD (L1046),A + LD (ZCH),A BIT 7,D EXX CALL Z,L368D @@ -4836,7 +4701,7 @@ L2D5C: EXX EXX RET -L2D62: LD A,(L1046) +L2D62: LD A,(ZCH) ADD A,090H RST 018H DB 029H @@ -4846,13 +4711,13 @@ L2D6A: LD (L2DCF),A LD A,B PUSH AF EX DE,HL - LD HL,L1000 + LD HL,ELMD CALL L2E24 CALL L2E36 POP AF CP 005H JR C,L2D88 ; (+00aH) - LD A,(L1012) + LD A,(ELMD18) RLA LD A,003H JR NC,L2D88 ; (+002H) @@ -4880,7 +4745,7 @@ L2DA9: DEC HL OR C RET Z LD DE,L0100 - LD HL,L11A4 + LD HL,KEYBUF PUSH HL PUSH DE CALL 02FD0H @@ -4911,7 +4776,7 @@ L2DDD: INC D LD BC,(ELMD30) LD A,(L2DCF) OR A - LD HL,L11A4 + LD HL,KEYBUF JR Z,L2DF5 ; (+003H) LD HL,(L180B) L2DF5: PUSH HL @@ -5223,7 +5088,7 @@ L2FD4: CALL SKPDE LD IX,(ZINP) JR Z,L2FE2 ; (+004H) LD IX,(ZOUT) -L2FE2: LD A,(L1046) +L2FE2: LD A,(ZCH) JP IOCALL L2FE8: CALL IOOUT @@ -5234,15 +5099,24 @@ L2FE8: CALL IOOUT RET C JP L2E36 -$CMT: DB "Y3CMT",000H,05FH ; $CMT - Cassette device descriptor -L2FFE: DB 0C0H,000H,014H,"0d0",022H,030H - DB LSE5 - DS 2, 000H - DB 001H,0AAH,"0]0",097H,01FH - SUB A - RRA - SUB A - RRA +; --------------------------------------------------------------------------- +; $CMT - Cassette Tape device descriptor (same format as $RFS, $FD, etc.) +; --------------------------------------------------------------------------- +$CMT: DW 03359H ; Next device = $RS + DB "CMT",000H ; Device name + DB 05FH ; flags1: bit5=0, bit6=1 +L2FFE: DB 0C0H ; flags2 (bit 4 toggled by CMT handler) + DB 000H ; dirmx = 0 + DW 03014H ; ZINIT + DW 03064H ; ZRO + DW 03022H ; ZWO + DW 000E5H ; ZCL (= NOP stub) + DW 00100H ; ZKL + DW 030AAH ; ZINP + DW 0305DH ; ZOUT + DW 01F97H ; ZDELT (= error handler) + DW 01F97H ; ZWDIR (= error handler) + DW 01F97H ; ZFREE (= error handler) CALL TEST1 DB 054H LD HL,L2FFE @@ -5326,7 +5200,7 @@ L30AA: XOR A LD A,0AFH LD (L30AA),A PUSH HL - LD HL,L1000 + LD HL,ELMD LD DE,L333F CALL L3301 POP HL @@ -5399,7 +5273,7 @@ L311D: LD (03109H),SP L313A: PUSH HL LD DE,L334C - LD HL,L1000 + LD HL,ELMD CALL L3301 POP HL CALL L3153 @@ -5417,9 +5291,18 @@ L3153: LD (03109H),SP LD A,B OR C JR Z,L3107 ; (-05cH) + IF BUILD_RFS = 1 + CALL RFS_LOAD_HOOK + NOP + NOP + NOP + ELSE + ; Original SVC#30 data transfer (no RFS) CALL L32CB CALL L3174 - DI + NOP + ENDIF + DI OUT (LSE4),A CALL NC,L065B CALL NC,L3274 @@ -5500,7 +5383,7 @@ L31E7: OUT (LSE1),A LD A,B OR C JR NZ,L31E7 ; (-016H) - LD HL,(L1197) + LD HL,(SUMDT) LD A,H CALL L32C8 LD A,L @@ -5537,7 +5420,7 @@ L322B: CALL 00601H JR Z,L322B ; (-00dH) LD D,H LD HL,L0000 - LD (L1197),HL + LD (SUMDT),HL POP HL POP BC PUSH BC @@ -5552,7 +5435,7 @@ L3243: CALL L0624 LD A,B OR C JR NZ,L3243 ; (-010H) - LD HL,(L1197) + LD HL,(SUMDT) CALL L0624 JR C,L3267 ; (+00cH) CP H @@ -5687,12 +5570,26 @@ L333F: DB 04CH,005H,"OADING" DB 000H L334C: DB 056H,005H,"ERIFYING ",006H NOP -$RS: DB 08DH,"5RS" ; $RS - RS-232C device descriptor - DS 2, 000H - DB 08FH,001H,000H,072H,033H,0A4H,033H,0A4H,033H,0B5H,033H,0B5H,033H,0C6H,033H,0DBH,033H - DB LSE5 - DB 000H - RET C +; --------------------------------------------------------------------------- +; $RS - RS-232C device descriptor +; flags1 bit7=1: ZWDIR/ZFREE not used, overlap with RS_INIT code below. +; --------------------------------------------------------------------------- +$RS: DW $FD ; Next device = $FD (0x358D) + DB "RS",000H,000H ; Device name + DB 08FH ; flags1: bit7=1 (no dir/free) + DB 001H ; flags2 + DB 000H ; dirmx = 0 + DW 03372H ; ZINIT + DW 033A4H ; ZRO + DW 033A4H ; ZWO (same handler as ZRO) + DW 033B5H ; ZCL + DW 033B5H ; ZKL (same handler as ZCL) + DW 033C6H ; ZINP + DW 033DBH ; ZOUT + DW 000E5H ; ZDELT (= monitor ROM stub) +; ZWDIR/ZFREE implicit — next 4 bytes are ZINIT code, read as DW pointers +; (flags1 bit 7=1 → ZWDIR/ZFREE never called) +RS_INIT: RET C PUSH IY CALL L33EC CALL L3380 @@ -5756,7 +5653,7 @@ L33E7: CALL L352B L33EC: PUSH AF PUSH DE - LD A,(L1046) + LD A,(ZCH) INC A LD IY,033F7H LD DE,L0015 @@ -5991,15 +5888,22 @@ L357C: OR A SCF RET -$FD: DB 0A2H,"8FD" ; $FD - Floppy Disk device descriptor - DS 2, 000H - DB 03FH,003H,03FH,08DH,036H,00FH - DS 2, 000H - DB 001H,030H,000H,0FEH,000H,005H,037H,008H,037H,097H,01FH - SUB A - RRA - SUB A - RRA +; $FD descriptor (original, restored) +$FD: DW $QD ; Next device = $QD + DB "FD",000H,000H ; Device name + DB 03FH ; ZFLAG1 (original, bit5=1 = ZINP-based DIR) + DB 003H ; ZFLAG2 (original) + DB 03FH ; ZDIRMX (original) + DW 0368DH ; func[0] ZINIT + DW 0000FH ; func[1] ZRO (original) + DW 00100H ; func[2] ZWO + DW 00030H ; func[3] ZCL + DW 000FEH ; func[4] ZKL + DW 03705H ; func[5] ZINP (original restored) + DW 03708H ; func[6] ZOUT + DW 01F97H ; func[7] ZDELT + DW 01F97H ; func[8] ZWDIR + DW 01F97H ; func[9] ZFREE DB 000H L35AB: DB 000H L35AC: DB 000H @@ -6452,20 +6356,43 @@ L389B: CALL L388D POP BC RET -$QD: DB 05EH,00DH,051H,044H ; $QD - Quick Disk device descriptor - DS 2, 000H - DB "_@ ",0C2H,038H,001H,039H,01FH,039H,0DAH,038H,000H,004H,012H,"9)9" - DS 2, 000H - NOP - NOP - CP A - JR C,0386FH ; (-051H) - SCF - RET - - RET C +; --------------------------------------------------------------------------- +; $QD Device Descriptor (Quick Disk) +; --------------------------------------------------------------------------- +$QD: + IF BUILD_RFS = 1 + DW $RFS ; Next device = $RFS (RFS enhanced) + ELSE + DW $USR ; Next device = $USR (original) + ENDIF + DB "QD",000H,000H ; Device name + DB 05FH ; flags1: bit5=1 ZINP-based DIR, bit6=1 ZRO enum + DB 040H ; flags2 + DB 020H ; dirmx: 32 (max directory entries) + DW QDINIT ; ZINIT handler + DW QDRO ; ZRO handler + DW QDWO ; ZWO handler + DW QDCL ; ZCL handler + DW 00400H ; ZKL (constant) + DW QDINP ; ZINP handler + DW QDOUT ; ZOUT handler + DW 00000H ; ZDELT (not supported) + DW 00000H ; ZWDIR (not supported) + DW QDFREE ; ZFREE handler +; +; --------------------------------------------------------------------------- +; QDFREE - Free space query (returns carry = not supported) +; --------------------------------------------------------------------------- +QDFREE: XOR A + SCF + RET +; +; --------------------------------------------------------------------------- +; QDINIT - Quick Disk initialization +; --------------------------------------------------------------------------- +QDINIT: RET C CALL TEST1 - DB 059H + DB 059H ; Test for 'Y' JR Z,L38D0 ; (+007H) OR A JP NZ,L1F6A @@ -6476,8 +6403,11 @@ L38D0: CALL L3924 DB 010H LD C,002H JR L3919 ; (+03fH) - - OR A +; +; --------------------------------------------------------------------------- +; QDCL - Quick Disk close +; --------------------------------------------------------------------------- +QDCL: OR A JR NZ,L38FA ; (+01dH) RST 018H DB 010H @@ -6497,18 +6427,24 @@ L38EB: LD (L3954),HL L38FA: CALL SKPDE LD C,006H JR L3919 ; (+018H) - - LD BC,L0003 +; +; --------------------------------------------------------------------------- +; QDRO - Quick Disk read open (ZRO handler) +; --------------------------------------------------------------------------- +QDRO: LD BC,L0003 LD DE,00040H CALL L38EB RET NC CP 028H - SCF + SCF RET NZ LD A,000H - RET - - RST 018H + RET +; +; --------------------------------------------------------------------------- +; QDINP - Quick Disk input (ZINP handler) +; --------------------------------------------------------------------------- +QDINP: RST 018H DB 010H LD D,B LD E,C @@ -6516,14 +6452,20 @@ L38FA: CALL SKPDE L3919: CALL L38EB RST 018H DB 011H - RET - - LD A,037H + RET +; +; --------------------------------------------------------------------------- +; QDWO - Quick Disk write open (ZWO handler) +; --------------------------------------------------------------------------- +QDWO: LD A,037H LD (L392C),A L3924: LD BC,L0101 JR L38EB ; (-03eH) - - PUSH AF +; +; --------------------------------------------------------------------------- +; QDOUT - Quick Disk output (ZOUT handler) +; --------------------------------------------------------------------------- +QDOUT: PUSH AF RST 018H DB 010H L392C: XOR A @@ -6532,7 +6474,7 @@ L392C: XOR A LD (L392C),A CALL L1C2B LD (L3958),HL - LD HL,L1000 + LD HL,ELMD LD DE,00040H POP AF JR L3949 ; (+006H) @@ -7141,7 +7083,7 @@ L3D87: LD A,0E8H LD (L004F),A LD (03E5BH),SP XOR A - LD (L1091),A + LD (FILOUT),A L3DBB: LD SP,L0000 L3DBE: LD BC,L3DBE PUSH BC @@ -7219,7 +7161,7 @@ L3E06: LD E,D EXX LD (ELMD20),BC LD (ELMD22),DE - LD (L1018),HL + LD (ELMD24),HL RST 018H DB 031H RET @@ -7434,10 +7376,10 @@ L3F4B: RST 018H RET CALL L3E88 - LD A,(L1091) + LD A,(FILOUT) PUSH AF XOR A - LD (L1091),A + LD (FILOUT),A L3F59: RST 018H DB 002H CALL L3F27 @@ -7451,7 +7393,7 @@ L3F59: RST 018H CALL L3E67 JR NC,L3F59 ; (-014H) POP AF - LD (L1091),A + LD (FILOUT),A RET CALL L3E88 @@ -7541,7 +7483,7 @@ L3FE2: RST 018H RST 018H DB 02DH LD A,001H - LD (L1000),A + LD (ELMD),A RET L3FEC: LD A,(DE) @@ -7563,8 +7505,13 @@ L3FFC: POP HL POP BC RET -L4000: LD HL,085FFH - LD (L1070),HL +L4000: + IF BUILD_RFS = 1 + LD HL,RFS_END ; TEXTST: moved past RFS module + ELSE + LD HL,085FFH ; TEXTST: original end of BASIC code + ENDIF + LD (TEXTST),HL LD HL,L4046 LD (000E3H),HL LD A,B @@ -7577,9 +7524,13 @@ L4000: LD HL,085FFH L401B: LD DE,L84E7 RST 018H DB 005H - RST 018H + IF BUILD_RFS = 1 + JP MEMCLI_PATCH ; MEMCLI: call SVC 020H then set HL=RFS_END + ELSE + RST 018H ; Original: SVC 020H (boot beep + EI) DB 020H - EX DE,HL + EX DE,HL ; HL = DE (original TEXTST) + ENDIF L4023: LD (HL),000H INC HL LD A,H @@ -7590,13 +7541,18 @@ L402B: CALL L4902 CALL L5E1D JR L404A ; (+014H) -L4036: RRCA - DB "RUN ",022H,041H,055H ; AUTO RUN string -L403E: DB "TO RUN",022H,00DH -L4046: DB 03EH - DB 016H - DB 0DFH - DB 003H +; --------------------------------------------------------------------------- +; Auto-run command string (16 bytes, copied into F-key slot at startup) +; L403E overlaps: referenced as "TO RUN"\r (suffix of "AUTO RUN"\r) +; --------------------------------------------------------------------------- +L4036: DB 00FH,"RUN ",022H ; Length (15) + 'RUN "' +L403E: DB "AUTO RUN",022H,00DH ; 'AUTO RUN"\r' (also read as 'TO RUN"\r' via L403E+2) +; --------------------------------------------------------------------------- +; Hook snippet installed at 0x00E3 — executed in-place as Z80 code +; --------------------------------------------------------------------------- +L4046: LD A,016H ; 3E 16 + RST 018H ; DF + DB 003H ; SVC #3 L404A: LD HL,L4B85 LD (00188H),HL L4050: RST 018H @@ -7620,7 +7576,7 @@ L406B: LD HL,L0000 CALL L48B1 RST 018H DB 043H - LD DE,L11A4 + LD DE,KEYBUF RST 018H DB 00CH JR NC,L408D ; (+00cH) @@ -8291,7 +8247,7 @@ L4609: PUSH BC L460D: LD (04623H),BC PUSH DE EX DE,HL - LD HL,(L1070) + LD HL,(TEXTST) L4616: LD C,(HL) INC HL LD B,(HL) @@ -8415,7 +8371,7 @@ L46C0: LD A,(L473D) LD (L473D),A LD HL,L46E9 L46CC: LD (046E7H),HL - LD HL,(L1070) + LD HL,(TEXTST) DEC HL L46D3: INC HL LD A,(HL) @@ -8543,7 +8499,7 @@ L477C: LD A,(L48B0) L4794: LD (047F6H),HL PUSH BC LD BC,(0847FH) - LD HL,(L1070) + LD HL,(TEXTST) JR L47A5 ; (+004H) L47A1: CALL LDDEMD @@ -8730,7 +8686,7 @@ L48D5: EX DE,HL RST 018H DB 003H POP HL - LD DE,L11A4 + LD DE,KEYBUF PUSH DE CALL L68E0 POP DE @@ -8757,16 +8713,16 @@ L4902: PUSH DE LD DE,0FFF0H ADD HL,DE POP DE - LD (L107E),HL + LD (MEMLMT),HL DEC H - LD (L107C),HL + LD (INTFAC),HL XOR A LD (L849A),A RET -L4914: LD HL,(L1070) +L4914: LD HL,(TEXTST) CALL L4952 - LD (L1072),HL + LD (TEXTED),HL CALL L4821 JR L4928 ; (+006H) @@ -8780,19 +8736,19 @@ L4928: PUSH HL DB 028H RET -L4930: LD HL,(L1070) +L4930: LD HL,(TEXTST) CALL L4952 - LD (L1072),HL -L4939: LD HL,(L1072) + LD (TEXTED),HL +L4939: LD HL,(TEXTED) LD (HL),000H INC HL - LD (L1074),HL + LD (VARST),HL LD (HL),000H INC HL - LD (L1076),HL + LD (STRST),HL CALL L4952 - LD (L1078),HL - LD (L107A),HL + LD (VARED),HL + LD (TMPEND),HL RET L4952: LD (HL),000H @@ -8819,9 +8775,9 @@ L4971: LD A,000H OR A RET Z DEC A - LD (L1091),A + LD (FILOUT),A JR Z,L4982 ; (+007H) - LD A,(L1097) + LD A,(PNMODE) CP 002H JR Z,L4994 ; (+012H) L4982: PUSH HL @@ -8837,7 +8793,7 @@ L4982: PUSH HL DB 009H POP HL L4994: XOR A - LD (L1091),A + LD (FILOUT),A RET L4999: CALL L46A6 @@ -8862,7 +8818,7 @@ L49B9: PUSH AF CALL L46BA LD C,L LD B,H - LD HL,(L1070) + LD HL,(TEXTST) L49C5: CALL LDDEMI LD A,E OR D @@ -8987,7 +8943,7 @@ L4A81: PUSH HL SBC HL,DE JP C,04AF2H CALL L46AD - LD HL,(L1070) + LD HL,(TEXTST) L4A95: LD E,(HL) INC HL LD D,(HL) @@ -9080,9 +9036,9 @@ L4B2E: LD SP,(INTFAC) LD (08496H),SP L4B3A: JR L4B55 ; (+019H) -L4B3C: LD HL,(.$LPT) - LD IX,(.$CRT) - LD (L1044),HL +L4B3C: LD HL,(_LPT) + LD IX,(_CRT) + LD (ZEQT),HL XOR A LD (01051H),A LD A,0C4H @@ -9102,23 +9058,12 @@ L4B58: LD A,L DB 005H RET -L4B66: JR NZ,04BB1H ; (+049H) - LD C,(HL) - JR NZ,L4B6B ; (+000H) -L4B6B: LD B,D - DEC B - LD D,D - LD B,L - LD B,C - LD C,E - NOP -L4B72: LD D,D - DEC B - LD B,L - LD B,C - LD B,H - LD E,C -L4B78: NOP +L4B66: DB 020H,049H,04EH,020H,000H ; " IN \0" — error location text +L4B6B: DB 042H,005H ; "B\x05" — control prefix + DB 052H,045H,041H,04BH,000H ; "REAK\0" — BREAK message +L4B72: DB 052H,005H ; "R\x05" — control prefix + DB 045H,041H,044H,059H ; "EADY" — Ready prompt +L4B78: DB 000H ; NUL terminator NOP L4B7A: CALL L6E4B DEC A @@ -9301,7 +9246,7 @@ L4CD2: PUSH DE L4CD6: PUSH DE CALL L6E7E -L4CDA: LD HL,L11A3 +L4CDA: LD HL,KEYBM1 LD (HL),A LD B,A LD C,A @@ -9315,14 +9260,14 @@ L4CDA: LD HL,L11A3 OR A CALL NZ,L4D3B POP HL - LD A,(L11A3) + LD A,(KEYBM1) OR A JR Z,L4D28 ; (+033H) PUSH HL LD BC,(VARST) SBC HL,BC EX DE,HL - LD HL,(L1078) + LD HL,(VARED) DEC HL DEC HL LD (HL),E @@ -9342,12 +9287,12 @@ L4CDA: LD HL,L11A3 INC HL LD (HL),D POP HL - LD DE,L11A3 + LD DE,KEYBM1 INC DE CALL L74DC CALL L4952 - LD (L107A),HL - LD (L1078),HL + LD (TMPEND),HL + LD (VARED),HL RET L4D28: LD (HL),000H @@ -9357,9 +9302,9 @@ L4D2B: INC HL LD E,(HL) INC HL LD D,(HL) - LD HL,(L1076) + LD HL,(STRST) ADD HL,DE - LD DE,L11A3 + LD DE,KEYBM1 LD B,C INC DE JP L74DC @@ -9372,7 +9317,7 @@ L4D3E: INC BC LD E,(HL) INC HL LD D,(HL) - LD HL,(L1076) + LD HL,(STRST) ADD HL,DE DEC HL DEC HL @@ -9382,7 +9327,7 @@ L4D3E: INC BC PUSH BC PUSH DE EX DE,HL - LD HL,(L1078) + LD HL,(VARED) OR A SBC HL,DE LD C,L @@ -9394,10 +9339,10 @@ L4D3E: INC BC LDIR L4D5F: POP DE POP BC - LD HL,(L1078) + LD HL,(VARED) OR A SBC HL,BC - LD (L1078),HL + LD (VARED),HL EX DE,HL L4D6B: LD E,(HL) INC HL @@ -9405,7 +9350,7 @@ L4D6B: LD E,(HL) LD A,D OR E RET Z - LD HL,(L1074) + LD HL,(VARST) ADD HL,DE LD A,(HL) INC HL @@ -9422,7 +9367,7 @@ L4D6B: LD E,(HL) PUSH BC LD C,A LD B,000H - LD HL,(L1076) + LD HL,(STRST) ADD HL,DE ADD HL,BC POP BC @@ -9452,9 +9397,8 @@ L4DA6: LD E,(IX+000H) ADD IX,DE JR L4DA6 ; (-021H) -L4DC7: DB 011H - LD (DE),A - NOP +L4DC7: LD DE,00012H + ADD IX,DE LD SP,IX L4DCE: LD HL,(04E05H) @@ -9523,7 +9467,7 @@ L4E2F: PUSH AF LD (04E97H),HL LD E,(IX+006H) LD D,(IX+007H) - LD HL,(L1074) + LD HL,(VARST) ADD HL,DE LD BC,00008H ADD IX,BC @@ -9747,7 +9691,7 @@ L4FEF: CALL L7436 DB 00DH OR A JR Z,L5008 ; (+006H) - LD HL,(L107A) + LD HL,(TMPEND) LD (HL),A LD A,001H L5008: POP DE @@ -9815,7 +9759,7 @@ L5066: POP HL OR A SBC HL,DE JP C,L4B2C - LD HL,(L107A) + LD HL,(TMPEND) INC H INC H INC H @@ -9943,7 +9887,7 @@ L5143: POP DE L5147: CALL L45AA EX DE,HL JR NZ,L5150 ; (+003H) - LD HL,(L1070) + LD HL,(TEXTST) L5150: LD (L847D),HL XOR A LD (L4B78),A @@ -10205,9 +10149,9 @@ L52F2: CALL L4664 LD (05319H),DE LD (05327H),BC LD A,0FFH - LD (L1090),A + LD (DISPX),A CALL SKPDE - LD HL,(L1070) + LD HL,(TEXTST) L5308: CALL LDDEMI LD A,D OR E @@ -10241,7 +10185,7 @@ L5331: EX DE,HL CALL L5E66 RST 018H DB 017H - LD HL,L11A4 + LD HL,KEYBUF CALL LDHLDE LD (HL),020H INC HL @@ -10253,7 +10197,7 @@ L5331: EX DE,HL JR NZ,L5350 ; (+005H) CALL L5366 JR NC,L535A ; (+00aH) -L5350: LD DE,L11A4 +L5350: LD DE,KEYBUF RST 018H DB 017H RST 018H @@ -10550,7 +10494,7 @@ L54FD: CALL L6E6F OR A JR Z,L5513 ; (+00fH) PUSH HL - LD HL,L11A4 + LD HL,KEYBUF PUSH HL CALL LDHLDE LD (HL),00DH @@ -10583,7 +10527,7 @@ L5537: RST 018H RET DS 198, 000H -L5600: LD A,(L1042) +L5600: LD A,(ZLOG) CP 088H RET @@ -10606,7 +10550,7 @@ L5619: CALL L6E7E L561E: LD A,(L005D) LD (0574DH),A XOR A - LD (L1090),A + LD (DISPX),A CALL L5882 RST 018H DB 02EH @@ -10684,7 +10628,7 @@ L56AA: CALL L5600 LD A,013H JR Z,L56CE ; (+002H) L56CC: LD A,020H -L56CE: LD DE,L11A4 +L56CE: LD DE,KEYBUF PUSH BC PUSH DE CALL ?SETDE @@ -10698,7 +10642,7 @@ L56DA: INC HL OR A JP Z,04AF2H PUSH HL - LD HL,L11A4 + LD HL,KEYBUF PUSH HL PUSH BC CALL LDHLDE @@ -10766,7 +10710,7 @@ L5746: PUSH HL RET L5754: LD A,08AH - LD (L1042),A + LD (ZLOG),A JR L5792 ; (+037H) L575B: CALL L5882 @@ -10849,7 +10793,7 @@ L57E9: POP HL LD SP,L0000 RET -L57EE: LD A,(L1042) +L57EE: LD A,(ZLOG) CP 08AH JR Z,L5839 ; (+044H) RST 018H @@ -10858,12 +10802,12 @@ L57EE: LD A,(L1042) L57F8: CP 003H JR NZ,L5803 ; (+007H) - LD HL,(L107A) + LD HL,(TMPEND) LD A,B $START: JP L4CD2 ; $START - BASIC warm start / system entry L5803: PUSH DE - LD HL,(L107C) + LD HL,(INTFAC) LD DE,(TMPEND) EX DE,HL CALL HLFTCH @@ -10897,7 +10841,7 @@ L5839: PUSH HL POP HL RET -L5841: LD HL,(L1070) +L5841: LD HL,(TEXTST) CALL L5869 L5847: LD A,(L848F) CP 001H @@ -10971,19 +10915,39 @@ L58AD: CALL TEST1 LD A,080H RET -L58C2: LD A,(L1042) +L58C2: LD A,(ZLOG) OR A RET M JP L5E70 -L58CA: CALL L593A +L58CA: + IF BUILD_RFS = 1 + JP RFS_DIRCMD1 ; RFS: debug hook for DIR handler 1 + NOP + NOP + NOP + ELSE + CALL L593A ; Original: parse device name for DIR + LD B,A + XOR A + NOP + ENDIF +L58D0: + IF BUILD_RFS = 1 + JP RFS_DIRCMD2 ; RFS: debug hook for DIR handler 2 + NOP + NOP + NOP + NOP + NOP + ELSE + CALL L6E6F ; Original: evaluate string expression + PUSH HL RST 018H - DB 03AH - RET - -L58D0: CALL L413E - LD B,000H - CALL NZ,L6E6F + DB 02CH + RST 018H + DB 03CH + ENDIF L58D8: PUSH HL RST 018H DB 02CH @@ -10996,23 +10960,23 @@ L58DF: LD A,001H LD BC,0023EH LD BC,0043EH PUSH AF - LD (L1043),A + LD (ZRWX),A CALL L5882 CP 088H JR NZ,L58F4 ; (+002H) LD A,080H -L58F4: LD (L1042),A +L58F4: LD (ZLOG),A CALL L58C2 CALL L592D POP AF CP 004H JR Z,L5904 ; (+002H) L5902: LD A,003H -L5904: LD (L1000),A +L5904: LD (ELMD),A PUSH AF RST 018H DB 033H - LD A,(L1000) + LD A,(ELMD) POP BC CP B JP NZ,04B53H @@ -11060,21 +11024,39 @@ L593A: PUSH HL LD A,03AH LD (DE),A POP AF - LD DE,L5982 - JR L596B ; (+009H) + IF BUILD_RFS = 1 + JP RFS_DIR_FIX + NOP + NOP + ELSE + LD DE,L5982 ; Original: buffer for device name + INC HL ; Advance past ':' + ENDIF L5962: POP HL CALL L413E LD B,000H CALL NZ,L6E6F -L596B: PUSH HL +L596B: + IF BUILD_RFS = 1 + JP RFS_DIR_OPEN ; RFS: debug hook for SVC #2C DIR trace + NOP + NOP + NOP + NOP + NOP + NOP + NOP + ELSE + PUSH HL ; Original SVC #2C DIR handler RST 018H DB 02CH INC (HL) DEC (HL) - JP NZ,04B25H + JP NZ,04B1FH POP HL - RET + RET + ENDIF L5975: CP 041H RET C @@ -11154,8 +11136,8 @@ L59EA: CALL L5C08 CP 002H JP NZ,04B53H PUSH HL - LD HL,(L1078) - LD (L107A),HL + LD HL,(VARED) + LD (TMPEND),HL LD BC,003E8H ADD HL,BC JP C,L4B2C @@ -11209,9 +11191,9 @@ L5A47: CALL L5C08 DB 041H CALL 05E48H LD A,001H - LD (L1043),A + LD (ZRWX),A LD A,081H - LD (L1042),A + LD (ZLOG),A CALL L5902 POP AF PUSH AF @@ -11223,8 +11205,8 @@ L5A47: CALL L5C08 LD A,081H RST 018H DB 02EH - LD HL,(L1078) - LD (L107A),HL + LD HL,(VARED) + LD (TMPEND),HL LD BC,003E8H ADD HL,BC JP C,04AFBH @@ -11320,12 +11302,12 @@ L5B16: LD D,0C9H LD BC,0CF00H L5B2A: LD A,D LD (L5B93),A - LD HL,(L1014) + LD HL,(ELMD20) LD DE,(ELMD22) PUSH HL CALL L59CA POP DE - LD HL,(L1070) + LD HL,(TEXTST) LD BC,0FF00H CALL NC,L59CA JP C,L4B2C @@ -11333,11 +11315,11 @@ L5B2A: LD A,D CALL L4930 XOR A LD (L5C07),A - LD HL,(L1018) + LD HL,(ELMD24) PUSH HL LD DE,(ELMD20) PUSH DE - LD HL,(L107A) + LD HL,(TMPEND) RST 018H DB 030H LD A,004H @@ -11388,8 +11370,8 @@ L5B93: RET LD (HL),0C9H RET -L5BA4: LD HL,(L1078) - LD (L107A),HL +L5BA4: LD HL,(VARED) + LD (TMPEND),HL LD DE,(TEXTED) LD (05C01H),DE OR A @@ -11418,22 +11400,22 @@ L5BA4: LD HL,(L1078) L5BDC: CALL L5BA4 RST 018H DB 02FH - LD A,(L1000) + LD A,(ELMD) RET -L5BE5: LD HL,(L1078) +L5BE5: LD HL,(VARED) XOR A DEC HL LD (HL),A DEC HL LD (HL),A - LD (L1076),HL + LD (STRST),HL DEC HL LD (HL),A - LD (L1074),HL + LD (VARST),HL DEC HL LD (HL),A - LD (L1072),HL + LD (TEXTED),HL LD HL,00004H LD (L5C03),HL RET @@ -11453,7 +11435,7 @@ L5C08: PUSH AF L5C11: LD BC,(ELMD20) PUSH BC - LD HL,(L1072) + LD HL,(TEXTED) LD DE,(TEXTST) OR A SBC HL,DE @@ -11465,11 +11447,11 @@ L5C11: LD BC,(ELMD20) CALL L4821 LD HL,L0000 LD (L8483),HL - LD HL,(L1070) + LD HL,(TEXTST) RST 018H DB 030H POP BC - LD HL,(L1070) + LD HL,(TEXTST) ADD HL,BC LD (L5C01),HL RET @@ -11487,10 +11469,10 @@ L5C44: LD A,081H LD A,H OR L JR NZ,L5C5F ; (+006H) - LD HL,(L1070) + LD HL,(TEXTST) CALL L4952 L5C5F: EX DE,HL - LD HL,(L1072) + LD HL,(TEXTED) LD BC,(05C03H) LDIR EX DE,HL @@ -11510,7 +11492,7 @@ L5C71: PUSH HL DB 02FH CP 002H JP NZ,04B53H - LD HL,(L1070) + LD HL,(TEXTST) RST 018H DB 032H POP HL @@ -11525,13 +11507,13 @@ L5C88: PUSH HL JR Z,L5CB5 ; (+01fH) PUSH HL LD A,002H - LD (L1000),A - LD HL,(L1072) + LD (ELMD),A + LD HL,(TEXTED) LD DE,(TEXTST) OR A SBC HL,DE - LD (L1014),HL - LD A,(L1001) + LD (ELMD20),HL + LD A,(ELMD1) CP 00DH JP Z,04B50H RST 018H @@ -11543,9 +11525,9 @@ L5CB5: CALL TESTX DB 041H PUSH HL LD A,002H - LD (L1043),A + LD (ZRWX),A LD A,081H - LD (L1042),A + LD (ZLOG),A CALL L5902 POP HL CALL L52ED @@ -11567,7 +11549,14 @@ L5CD5: XOR A DB 03FH RET -L5CE3: CALL L5882 +L5CE3: + IF BUILD_RFS = 1 + JP RFS_DIR3 ; RFS: debug hook for DIR handler + ELSE + NOP ; Original: no hook (3 bytes NOP) + NOP + NOP + ENDIF PUSH AF RST 018H DB 02EH @@ -11655,17 +11644,17 @@ L5D65: LD A,(L849A) DB 02CH LD (05E1AH),DE LD (L5E1C),A - LD HL,(L1072) + LD HL,(TEXTED) LD DE,(TEXTST) XOR A SBC HL,DE - LD (L1014),HL + LD (ELMD20),HL RST 018H DB 044H POP HL CALL L592D CALL 05E48H - LD A,(L1050) + LD A,(ZFLAG1) BIT 5,A JP Z,057B7H PUSH HL @@ -11688,7 +11677,7 @@ L5DB2: LD SP,L0000 PUSH HL LD A,001H LD (L849A),A - LD HL,(L1070) + LD HL,(TEXTST) JP L40E4 L5DCB: XOR A @@ -11753,7 +11742,7 @@ L5E37: DB "CMT:TRS?:0,$8C,13",0CDH; XCMT device config string JP L4AEC L5E4F: XOR A - LD (L1091),A + LD (FILOUT),A CALL TEST1 DB FDPD RET NZ @@ -11761,7 +11750,7 @@ L5E4F: XOR A DB 050H CALL L6AC6 LD A,050H - LD (L1091),A + LD (FILOUT),A CP A RET @@ -12184,54 +12173,21 @@ L60E5: CCF LD HL,L0000 RET -L60EA: SBC A,E - LD A,0BCH - JR NZ,L60EF ; (+000H) -L60EF: SBC A,B - JR L6088 ; (-06aH) - - ADD A,B - NOP - SUB H - LD (HL),H - INC H - NOP - NOP - SUB C - LD B,E - LD D,B - NOP - NOP - ADC A,(HL) - INC E - LD B,B - NOP - NOP - ADC A,D - LD A,D - NOP - NOP - NOP - ADD A,A - LD C,B - NOP - NOP - NOP -L610D: ADD A,H - JR NZ,L6110 ; (+000H) -L6110: NOP - NOP -L6112: ADD A,C - NOP - NOP - NOP - NOP - LD A,L - LD C,H - CALL Z,0CDCCH -L611C: LD H,(HL) - DEC HL - CALL Z,L1277 +; --------------------------------------------------------------------------- +; Floating-point constant table — powers of 10 for number formatting +; Each entry is 5 bytes (1 exponent + 4 mantissa) in Sharp MZ FP format +; --------------------------------------------------------------------------- +L60EA: DB 09BH,03EH,0BCH,020H,000H ; FP 10^9 (1000000000) +L60EF: DB 098H,018H,096H,080H,000H ; FP 10^8 (100000000) + DB 094H,074H,024H,000H,000H ; FP 10^7 (10000000) + DB 091H,043H,050H,000H,000H ; FP 10^6 (1000000) + DB 08EH,01CH,040H,000H,000H ; FP 10^5 (100000) + DB 08AH,07AH,000H,000H,000H ; FP 10^4 (10000) + DB 087H,048H,000H,000H,000H ; FP 10^3 (1000) +L610D: DB 084H,020H,000H,000H,000H ; FP 10^2 (100) +L6112: DB 081H,000H,000H,000H,000H ; FP 10^1 (10) + DB 07DH,04CH,0CCH,0CCH,0CDH ; FP 10^-1 (0.1) +L611C: DB 066H,02BH,0CCH,077H,012H ; FP precision guard L6121: LD HL,(L6304) LD B,000H L6126: LD DE,L610D @@ -12885,8 +12841,8 @@ L6548: LD A,000H LD H,02DH JR L6532 ; (-021H) -L6553: DB 03EH -L6554: NOP +L6553: DB 03EH ; LD A,nn opcode (self-modifying: operand at L6554) +L6554: DB 000H ; Operand byte — patched by LD (L6554),A OR A JR Z,L656B ; (+013H) LD A,(DE) @@ -13089,7 +13045,7 @@ L6680: DEC HL LD (HL),A CP 03AH JR Z,0667AH ; (-015H) -L668F: LD HL,L11A3 +L668F: LD HL,KEYBM1 LD DE,L2000 L6695: LD (HL),D INC HL @@ -13099,7 +13055,7 @@ L6695: LD (HL),D PUSH HL LD E,H LD D,000H - LD HL,L11A4 + LD HL,KEYBUF ADD HL,DE PUSH HL LD HL,L84A3 @@ -13149,7 +13105,7 @@ L66E0: INC HL JR L66E0 ; (-009H) L66E9: LD (HL),000H - LD DE,L11A4 + LD DE,KEYBUF RET L66EF: PUSH DE @@ -13307,8 +13263,8 @@ L67FC: CP 02CH L680C: CALL L6756 JR L67F0 ; (-021H) -L6811: DB 02BH - LD (HL),03AH +L6811: DEC HL + LD (HL),03AH ; Store ':' at previous position INC HL LD (HL),A CALL L6758 @@ -13683,7 +13639,7 @@ L6A1D: LD A,(DE) L6A23: LD C,(HL) L6A24: CALL L6A2C XOR A - LD (L1095),A + LD (LPOSB),A RET L6A2C: LD A,(L004D) @@ -13695,7 +13651,7 @@ L6A2C: LD A,(L004D) CALL TESTX DB 054H LD A,001H - LD (L1097),A + LD (PNMODE),A CALL TEST1 DB 04EH JR Z,L6A52 ; (+00aH) @@ -13734,7 +13690,7 @@ L6A74: LD A,00AH L6A7C: INC HL CALL 05E48H LD A,002H - LD (L1097),A + LD (PNMODE),A JR L6A71 ; (-016H) L6A87: CALL L6AC6 @@ -13782,7 +13738,7 @@ L6AC6: LD B,001H JR L6ACC ; (+002H) L6ACA: LD B,002H -L6ACC: LD A,(L1097) +L6ACC: LD A,(PNMODE) CP B RET Z JP L4B3C @@ -13844,7 +13800,7 @@ L6B3F: CALL L6E4B CP 004H JP NC,04AF2H CALL 05E48H - LD A,(L1097) + LD A,(PNMODE) CP 002H JR Z,L6B5F ; (+00dH) CALL L6A74 @@ -14120,7 +14076,7 @@ L6D3C: LD A,044H L6D6B: LD DE,(INTFAC) LD HL,L6DC4 CALL L5E93 - LD HL,(L107C) + LD HL,(INTFAC) CALL L817C CALL L7FC2 LD DE,L6DBF @@ -14132,7 +14088,7 @@ L6D6B: LD DE,(INTFAC) LD DE,(INTFAC) LD HL,L6DC4 CALL L5E93 - LD HL,(L107C) + LD HL,(INTFAC) CALL L817C CALL L7FD2 LD DE,L6DBF @@ -14152,7 +14108,7 @@ L6DD3: DS 5, 000H L6DD8: DS 10, 000H L6DE2: PUSH AF PUSH HL - LD HL,(L107C) + LD HL,(INTFAC) CALL L5E99 CALL L6028 RST 018H @@ -14252,7 +14208,7 @@ L6E7E: LD B,(HL) LD E,(HL) INC HL LD D,(HL) - LD HL,(L1076) + LD HL,(STRST) ADD HL,DE EX DE,HL LD A,B @@ -14523,7 +14479,7 @@ L703B: CALL L413E JP HLFTCH L7047: PUSH HL - LD HL,(L107E) + LD HL,(MEMLMT) SCF SBC HL,DE JP C,04AFBH @@ -14593,7 +14549,7 @@ L70A4: CP 022H CALL L74D0 EX (SP),HL PUSH HL - LD HL,(L107A) + LD HL,(TMPEND) PUSH BC LD BC,(STRST) OR A @@ -14610,9 +14566,9 @@ L70A4: CP 022H INC HL POP DE PUSH HL - LD HL,(L107A) + LD HL,(TMPEND) CALL L74DC - LD (L107A),HL + LD (TMPEND),HL POP DE POP HL LD A,003H @@ -14733,11 +14689,7 @@ L718E: LD DE,(08487H) LD DE,L71A0 JP L7985 -L71A0: SUB C - NOP - NOP - NOP - NOP +L71A0: DB 091H,000H,000H,000H,000H ; FP constant (65536.0) L71A5: CALL L5E78 LD B,000H L71AA: PUSH BC @@ -14755,7 +14707,7 @@ L71AA: PUSH BC LD A,B EXX LD B,A - LD HL,(L107A) + LD HL,(TMPEND) CALL ADDHLA LD D,H LD E,L @@ -14797,7 +14749,7 @@ L71F6: PUSH HL L71FF: LD A,B OR A JR Z,L7213 ; (+010H) - LD HL,(L107A) + LD HL,(TMPEND) PUSH HL PUSH BC CALL L74DC @@ -14826,7 +14778,7 @@ L7219: PUSH HL JR L71FF ; (-02bH) L722A: CALL L60B7 - LD DE,L11A4 + LD DE,KEYBUF LD A,H OR A JP NZ,04AF2H @@ -14885,7 +14837,7 @@ L7280: POP HL L7284: PUSH HL CALL L6E7E - LD HL,(L107A) + LD HL,(TMPEND) PUSH HL CALL L74DC LD (HL),000H @@ -14984,7 +14936,7 @@ L7312: CALL L5E78 L7326: PUSH HL PUSH DE - LD HL,(L107A) + LD HL,(TMPEND) PUSH HL LD A,030H LD B,006H @@ -15029,7 +14981,7 @@ L7359: DEC DE LD A,C CP 034H JR NZ,L7377 ; (+00cH) - LD HL,(L107A) + LD HL,(TMPEND) LD A,030H LD B,006H CALL ?SETHL @@ -15044,11 +14996,11 @@ L7377: LD BC,L0258 LD A,030H ADD A,L LD (DE),A -L738D: LD HL,(L107A) +L738D: LD HL,(TMPEND) LD DE,L0006 EX DE,HL ADD HL,DE - LD (L107A),HL + LD (TMPEND),HL EX DE,HL LD DE,(STRST) OR A @@ -15179,7 +15131,7 @@ L7458: LD A,(DE) ADD A,002H PUSH BC EX DE,HL - LD HL,(L107A) + LD HL,(TMPEND) PUSH HL OR A SBC HL,DE @@ -15201,7 +15153,7 @@ L7458: LD A,(DE) DB 01AH POP HL POP BC - LD DE,L11A4 + LD DE,KEYBUF LD (HL),C INC HL SCF @@ -15226,7 +15178,7 @@ L7495: CALL HLFTCH SUB 041H CP 01AH JP NC,L4AEC - LD DE,L11A4 + LD DE,KEYBUF LD B,000H L74A4: INC DE LD A,(HL) @@ -15241,7 +15193,7 @@ L74A4: INC DE L74B3: INC HL JR L74A4 ; (-012H) -L74B6: LD DE,L11A4 +L74B6: LD DE,KEYBUF EX DE,HL LD (HL),B EX DE,HL @@ -15300,8 +15252,8 @@ L7503: LD B,000H POP HL PUSH HL PUSH HL - LD HL,(L107A) - LD DE,L11A4 + LD HL,(TMPEND) + LD DE,KEYBUF PUSH HL LD A,(DE) LD (HL),A @@ -15310,8 +15262,8 @@ L7503: LD B,000H LD B,A CALL L74DC POP DE - LD (L107A),HL - LD HL,(L1076) + LD (TMPEND),HL + LD HL,(STRST) EX DE,HL OR A SBC HL,DE @@ -15368,11 +15320,11 @@ L756C: POP BC PUSH DE PUSH HL EXX - LD HL,(L1076) + LD HL,(STRST) ADD HL,DE LD B,(HL) INC B - LD DE,L11A4 + LD DE,KEYBUF CALL LDDEHL EXX SET 7,C @@ -15498,11 +15450,11 @@ L7616: INC DE POP BC PUSH BC EX DE,HL - LD HL,(L107A) + LD HL,(TMPEND) LD L,(HL) LD H,000H ADD HL,HL - LD A,(L11A4) + LD A,(KEYBUF) ADD A,005H ADD A,L LD L,A @@ -15547,7 +15499,7 @@ L764C: JP C,L4B2C INC HL LD (HL),D INC HL - LD DE,L11A4 + LD DE,KEYBUF LD A,(DE) INC A LD B,A @@ -15656,8 +15608,8 @@ L7716: PUSH DE CALL L7495 PUSH HL INC B - LD DE,L11A4 - LD HL,(L107A) + LD DE,KEYBUF + LD HL,(TMPEND) CALL L74DC LD B,000H LD HL,(L7928) @@ -15679,8 +15631,8 @@ L7735: INC HL LD C,B INC C PUSH HL - LD HL,(L107A) - LD DE,L11A4 + LD HL,(TMPEND) + LD DE,KEYBUF CALL L7953 POP HL POP BC @@ -15692,8 +15644,8 @@ L7752: CALL HLFTCH JR Z,L7735 ; (-028H) L775D: JP L4AEC -L7760: LD HL,(L107A) - LD DE,L11A4 +L7760: LD HL,(TMPEND) + LD DE,KEYBUF LD A,(HL) LD (DE),A LD B,A @@ -15740,8 +15692,8 @@ L7797: EX DE,HL L77B2: PUSH DE JP L7446 -L77B6: LD HL,(L1074) -L77B9: LD DE,L11A4 +L77B6: LD HL,(VARST) +L77B9: LD DE,KEYBUF LD A,(HL) OR A RET Z @@ -15851,7 +15803,7 @@ L783E: POP DE PUSH HL INC HL SBC HL,DE - LD A,(L11A4) + LD A,(KEYBUF) ADD A,004H LD C,A LD B,000H @@ -15876,7 +15828,7 @@ L783E: POP DE POP BC POP DE POP HL - LD HL,(L107A) + LD HL,(TMPEND) PUSH HL ADD HL,BC EX (SP),HL @@ -15900,7 +15852,7 @@ L783E: POP DE INC HL LD (HL),D INC HL - LD DE,L11A4 + LD DE,KEYBUF LD A,(DE) LD (HL),A LD B,A @@ -16122,10 +16074,10 @@ L79D9: LD B,(HL) LD E,(HL) INC HL LD D,(HL) - LD HL,(L1076) + LD HL,(STRST) ADD HL,DE EX DE,HL - LD HL,(L107A) + LD HL,(TMPEND) CALL L74DC EX (SP),HL LD B,(HL) @@ -16133,7 +16085,7 @@ L79D9: LD B,(HL) LD E,(HL) INC HL LD D,(HL) - LD HL,(L1076) + LD HL,(STRST) ADD HL,DE EX DE,HL POP HL @@ -16145,7 +16097,7 @@ L79D9: LD B,(HL) OR A SBC HL,BC EX DE,HL - LD (L107A),HL + LD (TMPEND),HL POP HL LD (HL),A INC HL @@ -16180,7 +16132,7 @@ L7A2E: OR A LD E,(HL) INC HL LD D,(HL) - LD HL,(L1076) + LD HL,(STRST) EX DE,HL ADD HL,DE EX DE,HL @@ -17051,10 +17003,8 @@ L7F6E: LD DE,L7F91 CALL L7985 JP L7D9E -L7F91: LD A,A - LD D,H - INC DE - CALL Z,0C5D0H +L7F91: DB 07FH,054H,013H,0CCH,0D0H ; FP constant (used by EXP/LOG) + PUSH BC ; *** was misaligned: disassembler consumed D0+C5 as CALL Z *** PUSH HL CALL L7DB8 POP HL @@ -17225,118 +17175,36 @@ L80CB: PUSH HL POP BC RET -L80E7: LD A,(HL) -L80E8: XOR D - XOR D - XOR D - XOR E - LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C - LD (HL),H - RET NC - DEC C - NOP - RET NC -L80F6: LD L,(HL) - JR C,L80E8 ; (-011H) - DEC E - DEC HL - LD H,A - RST 010H - LD (L402B),A - LD H,B - JR NC,L8095 ; (-06eH) - JR NC,L80A2 ; (-063H) - LD E,B - RST 010H - CCF - SBC A,A - LD A,(04A50H) - SUB (HL) - DEC SP - ADD A,D -L810F: ADD A,B - ADD A,B - NOP - NOP - NOP - LD A,H - LD HL,(0AAAAH) - XOR E - LD (HL),A - OR (HL) - DEC BC - LD H,B - OR (HL) - LD (HL),C - LD D,B - DEC C - NOP - RET NC - LD L,E - SUB E - JP P,0BC7DH - LD H,H - RRCA - HALT - RST 000H -L812C: ADD A,B - LD E,H - RET - -L812F: RES 4,L - LD B,(HL) - LD D,H - LD D,A - CCF - SBC A,A - LD A,(0AA7FH) - XOR D - XOR D - XOR E - LD A,(HL) - LD C,H - CALL Z,0CDCCH - LD A,(HL) - SUB D - LD C,C - INC H - SUB D - LD A,L - LD H,E - ADC A,(HL) - JR C,L812F ; (-01cH) - LD A,L - CP D - LD L,08BH - AND E - LD A,L - DEC E - ADC A,C - RET C - SBC A,(HL) - LD A,L - ADC A,B - ADC A,B - ADC A,B - ADC A,C - LD A,H - LD (HL),B - RET P - RET P - POP AF - LD A,H - RST 010H - SUB H - DEC (HL) - PUSH HL - LD A,H - LD B,E - INC C - JR NC,L812C ; (-03dH) +; --------------------------------------------------------------------------- +; Floating-point polynomial coefficient tables for transcendental functions +; (SIN, COS, TAN, ATN, LOG, EXP, SQR). 5 bytes per FP constant. +; --------------------------------------------------------------------------- +L80E7: DB 07EH,0AAH,0AAH,0AAH,0ABH ; SIN/COS coeff 0 + DB 07AH,008H,088H,088H,089H ; SIN/COS coeff 1 + DB 074H,0D0H,00DH,000H,0D0H ; SIN/COS coeff 2 +L80F6: DB 06EH,038H,0EFH,01DH,02BH ; SIN/COS coeff 3 + DB 067H,0D7H,032H,02BH,040H ; SIN/COS coeff 4 + DB 060H,030H,092H,030H,09DH ; SIN/COS coeff 5 + DB 058H,0D7H,03FH,09FH,03AH ; SIN/COS coeff 6 + DB 050H,04AH,096H,03BH,082H ; SIN/COS coeff 7 +L810F: DB 080H,080H,000H,000H,000H ; FP 1.0 + DB 07CH,02AH,0AAH,0AAH,0ABH ; TAN coeff 0 + DB 077H,0B6H,00BH,060H,0B6H ; TAN coeff 1 + DB 071H,050H,00DH,000H,0D0H ; TAN coeff 2 + DB 06BH,093H,0F2H,07DH,0BCH ; TAN coeff 3 + DB 064H,00FH,076H,0C7H,080H ; TAN coeff 4 +L812C: DB 05CH,0C9H,0CBH,0A5H,046H ; TAN coeff 5 (NB: 0xC9=RET opcode in data) +L812F: DB 054H,057H,03FH,09FH,03AH ; ATN coeff 0 + DB 07FH,0AAH,0AAH,0AAH,0ABH ; ATN coeff 1 + DB 07EH,04CH,0CCH,0CCH,0CDH ; ATN coeff 2 + DB 07EH,092H,049H,024H,092H ; ATN coeff 3 + DB 07DH,063H,08EH,038H,0E4H ; ATN coeff 4 + DB 07DH,0BAH,02EH,08BH,0A3H ; ATN coeff 5 + DB 07DH,01DH,089H,0D8H,09EH ; ATN coeff 6 + DB 07DH,088H,088H,088H,089H ; ATN coeff 7 + DB 07CH,070H,0F0H,0F0H,0F1H ; ATN coeff 8 + DB 07CH,0D7H,094H,035H,0E5H ; ATN coeff 9 + DB 07CH,043H,00CH,030H,0C3H ; ATN coeff 10 L8169: LD DE,L0000 LD A,(HL) OR A @@ -17358,22 +17226,13 @@ L8184: PUSH BC POP BC RET -L818A: ADD A,E - LD C,C - RRCA - JP C,L82A2 - LD C,C - RRCA - JP C,L81A2 - LD C,C - RRCA - JP C,L80A2 - LD C,C - RRCA - JP C,07BA2H - LD C,FDPC - DEC (HL) -L81A2: INC DE +; FP constants for LOG/EXP computation +L818A: DB 083H,049H,00FH,0DAH,0A2H ; FP constant (log2(e)) + DB 082H,049H,00FH,0DAH,0A2H ; FP constant + DB 081H,049H,00FH,0DAH,0A2H ; FP constant + DB 080H,049H,00FH,0DAH,0A2H ; FP constant + DB 07BH,00EH,0FAH,035H,013H ; FP constant (ln(2)) +L81A2 EQU $-1 ; Last byte alias L81A3: PUSH HL CALL L60B7 LD A,000H @@ -17705,97 +17564,35 @@ L83A0: CALL L7BB3 POP BC RET -L83F8: NOP -L83F9: LD A,A - LD E,(HL) - LD E,E - RET C - XOR C -L83FE: LD A,A - LD C,H - CALL Z,0CDCCH -L8403: ADD A,C - LD D,L - LD D,L - LD D,L - LD D,(HL) -L8408: ADD A,C - DEC (HL) - INC B - DI - INC (HL) - ADD A,C - JR L8447 ; (+037H) - - RET P - LD D,D - ADD A,C - DEC BC -L8414: SUB L - POP BC - CALL PO,00581H - XOR D - JP 08168H - - LD (BC),A - CALL 09986H - ADD A,C - LD BC,0D164H - CALL P,L0081 - OR C - IN D,(C) - ADD A,C - NOP - LD E,B - RST 010H - OUT (080H),A - DEC (HL) - INC B - DI - INC (HL) - ADD A,B - LD D,A - LD B,H - CALL M,L80CB - LD L,D - RET NZ - ADD A,0E8H - ADD A,B - LD (HL),L - DEC H - LD A,L - LD D,080H - LD A,D - ADD A,E -L8447: OR D - CALL C,L7D80 - LD A,00CH - DEC C - ADD A,B - LD A,(HL) - SBC A,(HL) - LD DE,0805DH - LD A,A - LD C,(HL) - BIT 3,D -L8458: LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C -L845D: ADD A,B - LD SP,L1772 - RET M -L8462: ADD A,B - LD SP,L1772 - RET M -L8467: ADD A,C - JR C,L8414 ; (-056H) - DEC SP - LD HL,(03180H) - LD (HL),D - RLA - RET M +L83F8: DB 000H ; Exponent work variable +; --------------------------------------------------------------------------- +; Floating-point polynomial coefficient tables for SQR, LOG, EXP functions +; Each entry is 5 bytes (1 exponent + 4 mantissa) in Sharp MZ FP format +; --------------------------------------------------------------------------- +L83F9: DB 07FH,05EH,05BH,0D8H,0A9H ; 1/sqrt(2) approx +L83FE: DB 07FH,04CH,0CCH,0CCH,0CDH ; log10(2) approx +L8403: DB 081H,055H,055H,055H,056H ; Coeff +L8408: DB 081H,035H,004H,0F3H,034H ; LOG poly coeff 0 + DB 081H,018H,037H,0F0H,052H ; LOG poly coeff 1 + DB 081H,00BH,095H,0C1H,0E4H ; LOG poly coeff 2 + DB 081H,005H,0AAH,0C3H,068H ; LOG poly coeff 3 + DB 081H,002H,0CDH,086H,099H ; LOG poly coeff 4 + DB 081H,001H,064H,0D1H,0F4H ; LOG poly coeff 5 + DB 081H,000H,0B1H,0EDH,050H ; LOG poly coeff 6 + DB 081H,000H,058H,0D7H,0D3H ; LOG poly coeff 7 + DB 080H,035H,004H,0F3H,034H ; EXP poly coeff 0 + DB 080H,057H,044H,0FCH,0CBH ; EXP poly coeff 1 + DB 080H,06AH,0C0H,0C6H,0E8H ; EXP poly coeff 2 + DB 080H,075H,025H,07DH,016H ; EXP poly coeff 3 + DB 080H,07AH,083H,0B2H,0DCH ; EXP poly coeff 4 + DB 080H,07DH,03EH,00CH,00DH ; EXP poly coeff 5 + DB 080H,07EH,09EH,011H,05DH ; EXP poly coeff 6 + DB 080H,07FH,04EH,0CBH,05AH ; EXP poly coeff 7 +L8458: DB 07AH,008H,088H,088H,089H ; SQR constant +L845D: DB 080H,031H,072H,017H,0F8H ; SQR constant +L8462: DB 080H,031H,072H,017H,0F8H ; SQR constant +L8467: DB 081H,038H,0AAH,03BH,02AH ; SQR constant + DB 080H,031H,072H,017H,0F8H ; SQR constant L8471: DS 2, 000H L8473: DS 2, 000H L8475: DS 4, 000H @@ -17839,7 +17636,7 @@ L84E7: DB 016H DS 2, 020H DB 006H,"MZ-5Z" DS 2, 030H - DB "8 V1.0A ",00DH + DB "8 V1.1Z ",00DH DS 3, 020H DB 043H,005H,"OPYRIGHT ",006H,"(C) 1984 ",005H,"BY ",006H,"SHARP CORP." DS 5, 020H @@ -17849,23 +17646,2142 @@ L84E7: DB 016H DS 2, 00DH DS 93, 000H -EXECSTART: XOR A ; Execution entry point + IF BUILD_RFS = 1 +; ============================================================================= +; $RFS - ROM Filing System device module (Direct SD Card Access) +; +; V1.0Z: Bypasses the RFS ROM entirely. All SD card access is done via +; direct SPI through the picoZ80 hardware SPI emulation at EFFBh/EFFCh. +; +; Only OUT(E3H) is needed to map MMIO for SPI port access, and OUT(E1H) +; to return to DRAM. No ROM banking, no BNKSELUSER, no lower memory +; switching required. +; +; SPI protocol: +; SPIOUT: LD (HWSPIDATA),A ; LD (HWSPISTART),A (send byte) +; SPIIN: LD (HWSPISTART),A ; LD A,(HWSPIDATA) (receive byte) +; +; SD card sector read (CMD17): +; CS LOW -> CMD17(0x51) + 4-byte sector + 0xFF -> poll R1(0x00) -> +; poll data token(0xFE) -> read 512 bytes -> 2 CRC -> CS HIGH +; +; SD image layout: each drive = 0x8010 sectors (directory + file blocks). +; Drive 0 at sector 0, drive 1 at 0x8010, drive 2 at 0x10020, etc. +; RFS1: = SD drive 3, RFS7: = SD drive 9 (SDDRIVENO = ZCH + 3, offset +3 skips boot drives 0-2). +; +; Directory: 16 entries per sector, 32 bytes each: +; [0] FLAG1 (bit7=active), [1] ATRB, [2..18] NAME (17, null-term), +; [19..22] START_SECTOR (4 bytes, big-endian), +; [23..24] SIZE (2 bytes, LE), [25..26] DTADR (2 bytes, LE), +; [27..28] EXADR (2 bytes, LE), [29..31] reserved. +; +; Device chain: $QD -> $RFS -> $USR -> NULL +; ============================================================================= + +; --------------------------------------------------------------------------- +; $RFS Device Descriptor (29 bytes header + 22 bytes state = 51 bytes) +; --------------------------------------------------------------------------- + ENDIF ; (Glass: $RFS label must be outside IF) +$RFS: + IF BUILD_RFS = 1 + DW $USR ; Next device = $USR + DB "RFS",000H ; Device name + DB 05FH ; flags1: bit5=1 ZINP-based DIR, bit6=1 ZRO enum capable + DB 007H ; flags2: max channel 7 (bit7 must be 0, SVC #39 errors if set) + DB 0FFH ; dirmx: 255 (max directory entries) + DW RFSINIT ; ZINIT handler + DW RFSRO ; ZRO handler (LOAD: find file, extract header) + DW RFSWO ; ZWO handler (SAVE: sets ELMD20 SIZE) + DW RFSSTRT ; ZCL/ZSTRT handler + DW 00000H ; ZKL (not used) + DW RFSINP_DIR ; ZINP handler (DIR buffer fill + LOAD data) + DW RFSOUT ; ZOUT handler (triggers RFSWO on first call during SAVE) + DW 00000H ; ZDELT (not used) + DW RFSDIR ; ZWDIR handler (stub) + DW RFSFREE ; ZFREE handler +; Device state area (22 bytes) - BASIC reads/writes state at descriptor+29..+50. +; Without this, BASIC reads into code bytes causing "Disk mismatch" errors. +RFSST00: DB 000H ; +29: state byte 0 +RFSST01: DB 000H ; +30: state byte 1 +RFSST02: DB 000H ; +31: state byte 2 +RFSST03: DS 3, 000H ; +32..+34: state bytes 3-5 +RFSST06: DB 000H ; +35: state byte 6 +RFSST07: DS 2, 000H ; +36..+37: state bytes 7-8 +RFSST09: DB 000H ; +38: state byte 9 +RFSST10: DB 000H ; +39: state byte 10 +RFSST11: DB 000H ; +40: state byte 11 +RFSST12: DB 000H ; +41: state byte 12 +RFSST13: DS 4, 000H ; +42..+45: state bytes 13-16 +RFSST17: DS 4, 000H ; +46..+49: state bytes 17-20 +RFSST21: DB 000H ; +50: state byte 21 + +; --------------------------------------------------------------------------- +; RFSFREE - Free space query (not supported, return carry) +; --------------------------------------------------------------------------- +RFSFREE: XOR A + SCF + RET + +; --------------------------------------------------------------------------- +; RFSINIT - Initialize RFS device +; --------------------------------------------------------------------------- +RFSINIT: XOR A + LD (SAVE_PENDING),A ; Clear at start of any operation + LD (DIR_FILLED),A ; Clear so next ZINP does DIR fill + LD (DIR_ENTRY_IDX),A ; Reset directory entry enumerator + LD A,0FFH + LD (DIRSECBUF),A ; Invalidate sector cache + LD A,(ZCH) + ADD A,003H ; RFS1:=drive 3, skipping boot drives 0-2 + LD (SDDRIVENO),A + RET + +; --------------------------------------------------------------------------- +; RFSSTRT - Start/Open device (A=0 means open, A!=0 means close) +; --------------------------------------------------------------------------- +RFSSTRT: OR A + RET NZ ; Close = just return + LD A,(ZCH) + ADD A,003H ; RFS1:=drive 3, skipping boot drives 0-2 + LD (SDDRIVENO),A + ; + ; V1.1Y: Reset RFSRO state so file search starts from entry 0. + ; Without this, LOAD after DIR/SAVE fails: RFSRO resumes from + ; the post-DIR DIR_ENTRY_IDX position and misses files at earlier + ; directory indices ("File not found" for files that exist). + XOR A + LD (DIR_ENTRY_IDX),A + LD A,0FFH + LD (DIRSECBUF),A ; Invalidate sector cache (stale after SAVE) + RET + +; --------------------------------------------------------------------------- +; RFSDIR - ZWDIR handler (stub, not called with bit5=1 in flags1) +; --------------------------------------------------------------------------- +RFSDIR: XOR A + RET + +; --------------------------------------------------------------------------- +; RFSWO - Write Open (ZWO handler) +; +; BASIC calls ZWO from BOTH the OPEN handler and L1CE4 SAVE path, THEN +; calls ZOUT. If we do the actual write here, the file gets created +; multiple times and the premature directory entry triggers "Already exist" +; during BASIC's own duplicate check. +; +; RFSWO calculates SIZE = TEXTED - TEXTST and stores it in ELMD20. +; This is essential because the SAVE path for bit-5 devices never populates +; ELMD20, leaving RFSDOWRITE to read SIZE=0. The actual SD write is still +; deferred to RFSOUT (ZOUT) via the SAVE_PENDING one-shot flag. +; --------------------------------------------------------------------------- +RFSWO: LD HL,(TEXTED) ; End of BASIC text area + LD DE,(TEXTST) ; Start of BASIC text area + OR A + SBC HL,DE ; HL = program size in bytes + LD (ELMD20),HL ; Store SIZE for RFSDOWRITE + XOR A ; A=0, NC = success + RET + +; --------------------------------------------------------------------------- +; RFSDOWRITE - Actual SD card write (called from RFSOUT only) +; +; Performs the complete save operation: +; 1. Finds a free directory entry +; 2. Calculates the file's start sector from entry number +; 3. Writes file data sector-by-sector (toggling DRAM/MMIO) +; 4. Re-reads directory sector, fills entry, writes it back +; +; Entry: ELMD filled with file header (ATRB, NAME, SIZE, DTADR, EXADR) +; For type 2 (BASIC): ELMD20=SIZE, source data at TEXTST +; For type 1 (machine code): ELMD20=DTADR, ELMD18=SIZE +; Exit: NC = success, C = error +; --------------------------------------------------------------------------- +RFSDOWRITE: PUSH HL + PUSH DE + PUSH BC + ; + ; Get file info from ELMD — field mapping depends on file type. + ; BASIC SAVE (type 2) stores SIZE in ELMD20 and source is TEXTST. + ; Machine code SAVE (type 1) uses ELMD18=SIZE, ELMD20=DTADR. + LD A,(ELMD) + CP 002H + JR NZ,WO_NONBASIC + ; + ; Type 2 (BASIC): SIZE in ELMD20, source at TEXTST + LD HL,(ELMD20) ; SIZE (program length) + LD (FILE_SIZE),HL + LD HL,(TEXTST) ; Source = start of BASIC text + LD (FILE_LOADADDR),HL + JR WO_GOTINFO + ; +WO_NONBASIC: + ; Non-BASIC: SIZE in ELMD18, source at ELMD20 + LD HL,(ELMD18) ; SIZE + LD (FILE_SIZE),HL + LD HL,(ELMD20) ; DTADR (source address for data) + LD (FILE_LOADADDR),HL +WO_GOTINFO: + ; + ; Set up drive number + LD A,(ZCH) + ADD A,003H ; RFS1:=drive 3 + LD (SDDRIVENO),A + ; + ; Enter MMIO mode + CALL MMIO_ON + ; + ; Reset directory cache + LD A,0FFH + LD (DIRSECBUF),A + ; + ; --- Find free directory entry --- + LD E,000H + LD B,000H ; 256 entries (DJNZ wraps) +WO_SCAN: PUSH BC + PUSH DE + CALL GETSDDIRENT + POP DE + POP BC + OR A + JP NZ,WO_IOERR ; SD read error + LD A,(HL) + BIT 7,A + JR Z,WO_FOUND ; Bit 7 clear = free slot + INC E + DJNZ WO_SCAN + JP WO_IOERR ; Directory full + ; +WO_FOUND: ; E = free entry number + LD A,E + LD (SAVE_DIRENT),A + ; + ; --- Calculate start sector: E * 128 + 16 --- + ; E * 128 = E << 7, result fits 16 bits (max 255*128=32640) + LD H,000H + LD L,E ; HL = entry number + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + ADD HL,HL ; *16 + ADD HL,HL ; *32 + ADD HL,HL ; *64 + ADD HL,HL ; *128 + LD DE,00010H ; +16 (directory sectors) + ADD HL,DE + LD D,000H + LD E,000H ; DEHL = relative sector + CALL RFSGETSECTR ; DEHL = absolute sector + CALL SETLBAADDR ; Store in SDSTARTSEC + ; + ; --- Write file data sector-by-sector --- +WO_WLOOP: LD HL,(FILE_SIZE) + LD A,H + OR L + JR Z,WO_WDONE ; No data left + ; + ; Map DRAM to read source data + OUT (PORT_DRAM),A + ; + ; Calculate bytes to copy: min(FILE_SIZE, 512) + LD HL,(FILE_SIZE) + LD DE,00200H ; 512 + OR A + SBC HL,DE + JR C,WO_PARTIAL + ; + ; Full sector: remaining = HL + LD (FILE_SIZE),HL + LD BC,00200H + JR WO_COPY + ; +WO_PARTIAL: ; Less than 512 bytes left + ADD HL,DE ; Restore HL = FILE_SIZE + LD B,H + LD C,L ; BC = bytes to copy + PUSH BC ; Save actual byte count + LD HL,0 + LD (FILE_SIZE),HL + ; + ; Zero-fill SECTORBUF first for partial sector + LD HL,SECTORBUF + LD DE,SECTORBUF + 1 + PUSH BC + LD BC,001FFH ; 511 bytes + LD (HL),000H + LDIR + POP BC + POP BC ; Restore actual byte count + ; +WO_COPY: LD HL,(FILE_LOADADDR) + LD DE,SECTORBUF + LDIR ; Copy source data to SECTORBUF + LD (FILE_LOADADDR),HL ; Update source address + ; + ; Map MMIO for SPI write + OUT (PORT_MMIO),A + ; + ; Write SECTORBUF to current sector + CALL SD_WRITE + OR A + JP NZ,WO_IOERR + ; + ; Increment sector for next write + CALL INC_STARTSEC + JR WO_WLOOP + ; + ; --- Write directory entry --- +WO_WDONE: ; Ensure MMIO is active + OUT (PORT_MMIO),A + ; + ; Re-read the directory sector containing our entry + LD A,0FFH + LD (DIRSECBUF),A ; Force re-read + LD A,(SAVE_DIRENT) + LD E,A + PUSH DE + CALL GETSDDIRENT ; HL = entry in SECTORBUF + POP DE + OR A + JP NZ,WO_IOERR + ; + ; HL = 32-byte entry in SECTORBUF. Fill it. + ; FLAG1 = 0x80 (active) + LD (HL),080H + INC HL + ; + ; ATRB: remap type 02 -> 05 for SD storage + LD A,(ELMD) ; Disk BASIC type + CP 002H + JR NZ,WO_AT1 + LD A,005H ; BTX -> MZ-700 BASIC tape type +WO_AT1: LD (HL),A + INC HL + ; + ; NAME: 17 bytes from ELMD1, CR -> null + PUSH DE + LD DE,ELMD1 + LD B,17 +WO_NM: LD A,(DE) + CP 00DH ; CR? + JR NZ,WO_NM1 + XOR A ; CR -> null for SD +WO_NM1: LD (HL),A + INC HL + INC DE + DJNZ WO_NM + POP DE + ; + ; START_SECTOR: 4 bytes (calculate from entry number) + PUSH HL ; Save directory entry pointer + LD A,(SAVE_DIRENT) + LD H,000H + LD L,A + ADD HL,HL ; *2 + ADD HL,HL ; *4 + ADD HL,HL ; *8 + ADD HL,HL ; *16 + ADD HL,HL ; *32 + ADD HL,HL ; *64 + ADD HL,HL ; *128 + LD DE,00010H ; +16 + ADD HL,DE ; HL = relative start sector (16-bit) + ; Store as big-endian 32-bit (D=0, E=0, H, L) + EX DE,HL ; DE = sector + POP HL ; HL = entry pointer + LD (HL),000H ; Byte 0 (MSB) = 0 + INC HL + LD (HL),000H ; Byte 1 = 0 + INC HL + LD (HL),D ; Byte 2 + INC HL + LD (HL),E ; Byte 3 (LSB) + INC HL + ; + ; SIZE: 2 bytes LE — read original from ELMD (FILE_SIZE is 0 after write loop). + PUSH DE + LD A,(ELMD) + CP 002H + JR NZ,WO_SZ_NB + LD DE,(ELMD20) ; BASIC: SIZE in ELMD20 + JR WO_SZ_OK +WO_SZ_NB: LD DE,(ELMD18) ; Non-BASIC: SIZE in ELMD18 +WO_SZ_OK: LD (HL),E + INC HL + LD (HL),D + INC HL + ; + ; DTADR: 2 bytes LE — read original from ELMD/TEXTST. + LD A,(ELMD) + CP 002H + JR NZ,WO_DA_NB + LD DE,(TEXTST) ; BASIC: load address is TEXTST + JR WO_DA_OK +WO_DA_NB: LD DE,(ELMD20) ; Non-BASIC: DTADR in ELMD20 +WO_DA_OK: LD (HL),E + INC HL + LD (HL),D + INC HL + ; + ; EXADR: 2 bytes LE from ELMD22 + LD DE,(ELMD22) + LD (HL),E + INC HL + LD (HL),D + INC HL + ; + ; RESERVED: 3 bytes zero + LD (HL),000H + INC HL + LD (HL),000H + INC HL + LD (HL),000H + POP DE + ; + ; Write the directory sector back to SD + ; Calculate directory sector address + LD A,(SAVE_DIRENT) + SRL A + SRL A + SRL A + SRL A ; A = dir sector number (0-15) + LD DE,0 + LD H,0 + LD L,A + CALL RFSGETSECTR ; DEHL = absolute dir sector + CALL SETLBAADDR + CALL SD_WRITE + OR A + JR NZ,WO_IOERR + ; + ; Success + CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A ; NC = success + RET + ; +WO_IOERR: CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A + SCF ; C = error + RET + +; --------------------------------------------------------------------------- +; RFSOUT - Write Data (ZOUT handler for SAVE) +; +; BASIC's SAVE path calls ZOUT after ZWO. Since RFSWO is now a no-op, +; RFSOUT is the single entry point for the actual write. On the first +; call (SAVE_PENDING=0, cleared by RFSINIT), we call RFSDOWRITE to do +; the full SD card write in one shot (reading directly from DTADR in +; memory). Sets SAVE_PENDING=1 after, so subsequent calls are no-ops. +; --------------------------------------------------------------------------- +RFSOUT: LD A,(SAVE_PENDING) + OR A + JR NZ,RFSOUT_NOP ; Already written (1 = done), return success + INC A ; A = 1 + LD (SAVE_PENDING),A ; Mark as done (one-shot) + JP RFSDOWRITE ; Do the full SD write and return +RFSOUT_NOP: XOR A ; A=0, NC = success + RET + +; --------------------------------------------------------------------------- +; RFSRO - Read One directory entry (ZRO handler). +; +; V1.1V: Rewritten as directory entry enumerator. +; +; ZRO is called by BASIC for two purposes: +; 1. L1C0F file search loop (HL=KEYBUF) — enumerate entries, compare names +; 2. L1D53 DIR buffer fill loop (HL=L2000+offset) — fill 32-byte entries +; +; Each call returns one valid 32-byte MZF directory entry at the buffer +; pointed to by HL (the caller's HL passed through IOCALL). The internal +; DIR_ENTRY_IDX counter advances across calls; RFSINIT resets it to 0. +; +; Entry: HL = target buffer (32 bytes, set by caller before IOCALL) +; Exit: NC = valid entry written to (HL), A = entry type (ATRB byte) +; CF = no more entries (A=0) +; --------------------------------------------------------------------------- +RFSRO: + ; Save target buffer address for CONVERT_ENTRY + LD (DIR_BUFPTR),HL + ; + ; Save registers on BASIC stack (before MMIO_ON switches stacks) + PUSH HL + PUSH DE + PUSH BC + ; + ; Set up drive number + LD A,(ZCH) + ADD A,003H ; RFS1:=drive 3 + LD (SDDRIVENO),A + ; + ; Enter MMIO mode (switches to temp stack, enables SPI) + CALL MMIO_ON + ; + ; Clear 32 bytes at target buffer (below D000H, accessible in MMIO) + LD HL,(DIR_BUFPTR) + LD B,32 +RFSRO_CLR: LD (HL),000H + INC HL + DJNZ RFSRO_CLR + ; +RFSRO_NEXT: + ; Get current entry index + LD A,(DIR_ENTRY_IDX) + LD E,A + ; + ; Read directory entry from SD card + CALL GETSDDIRENT ; HL=entry in SECTORBUF, A=status + OR A + JR NZ,RFSRO_END ; SD read error → done + ; + ; Check if entry is active (FLAG1 bit 7 set) + LD A,(HL) + BIT 7,A + JR Z,RFSRO_SKIP ; Inactive, skip + ; + ; Check ATRB at offset 1 — reject 0x00 (empty) and 0xFF (uninit) + INC HL + LD A,(HL) + DEC HL ; HL back to entry start + OR A + JR Z,RFSRO_SKIP ; ATRB=0, skip + CP 0FFH + JR Z,RFSRO_SKIP ; ATRB=0xFF, skip + ; + ; Valid entry: convert SD format to MZF format at DIR_BUFPTR + ; (DIR_BUFPTR was set at RFSRO entry from caller's HL) + ; HL = SD entry in SECTORBUF + CALL CONVERT_ENTRY + ; + ; Advance entry index for next call + LD A,(DIR_ENTRY_IDX) + INC A + LD (DIR_ENTRY_IDX),A + ; + ; Debug: show entry delivered + PUSH AF + OUT (PORT_DRAM),A ; Switch to DRAM for debug I/O + LD A,(DIR_ENTRY_IDX) + DEC A ; Show the index we just returned + OUT (PORT_MMIO),A ; Back to MMIO + POP AF + ; + ; Success: exit MMIO, restore regs, return NC + CALL MMIO_OFF + POP BC + POP DE + POP HL + ; + ; Return ATRB value in A, NC = success + LD HL,(DIR_BUFPTR) + LD A,(HL) ; A = ATRB byte (first byte of MZF entry) + OR A ; Clear carry + RET + ; +RFSRO_SKIP: + ; Advance to next entry + LD A,(DIR_ENTRY_IDX) + INC A + LD (DIR_ENTRY_IDX),A + JR Z,RFSRO_END ; Wrapped 255->0: all 256 scanned + JR RFSRO_NEXT + ; +RFSRO_END: + ; No more entries (or SD error) + CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A ; A=0 + SCF ; CF = no more entries + RET + +; --------------------------------------------------------------------------- +; RFSINP_DIR - ZINP handler for $RFS device +; +; For bit-5 devices, BASIC calls ZINP for three purposes: +; 1. Disk identity read (H >= 28H) — returns zeros at 2800-28FF +; 2. DIR buffer fill (DIR_FILLED=0, H < 28H) — fills 2000-27FF +; 3. LOAD data transfer (DIR_FILLED=1, H < 28H) — reads from SD card +; +; IMPORTANT: H >= 28H MUST be checked first, before DIR_FILLED. +; BASIC's data transfer path (L2AD2 → L2FD1 → L2FE8 → L2E36 → L2E67) +; does an identity read (H=28H) AFTER the DIR buffer fill has set +; DIR_FILLED=1. If DIR_FILLED were checked first, this identity read +; would incorrectly dispatch to RFSINP_LD. +; +; Returns: carry clear, A=0 (success) +; --------------------------------------------------------------------------- +RFSINP_DIR: + ; Debug: trace every ZINP call + PUSH AF + LD A,H + POP AF + ; + ; LOAD data path: BASIC's LOAD for bit5=0 devices calls ZINP once + ; via JP 019BBH (XOR A; CALL L18B6; CALL L1929). Entry A=0 signals + ; "load file data now" — skip DIR fill and identity checks entirely. + ; The byte-at-a-time refill path (L19B4) enters with A=0xFF (OR 0AFH). + OR A + JP Z,RFSINP_LD ; A=0 → LOAD path: read file to DTADR + ; + ; Identity reads (H >= 28H) MUST go to RFSINP_DISKID regardless of + ; DIR_FILLED, because BASIC does identity validation (L2E36 → L2E67 → + ; L2FD4 → IOCALL) AFTER the DIR buffer fill has set DIR_FILLED=1. + ; If DIR_FILLED were checked first, the identity read would dispatch + ; to RFSINP_LD instead of RFSINP_DISKID → identity validation fails. + LD A,H + CP 028H + JP NC,RFSINP_DISKID ; H >= 28H → identity (always) + ; + ; H < 28H: DIR buffer fill or data transfer + LD A,(DIR_FILLED) + OR A + JP NZ,RFSINP_LD ; DIR already filled → data transfer + ; + ; --- DIR mode: enumerate files into 0x2000 buffer --- + ; + PUSH HL + PUSH DE + PUSH BC + ; + ; Clear DIR buffer 0x2000-0x27FF (2048 bytes = 64 entries x 32) + LD HL,L2000 + LD DE,L2000 + 1 + LD BC,007FFH + LD (HL),000H + LDIR + ; + ; Set up SD drive from channel number + LD A,(ZCH) + ADD A,003H ; RFS1:=drive 3, skipping boot drives 0-2 + LD (SDDRIVENO),A + ; + ; Entry 0 at 0x2000: skip marker (0x80) + LD HL,L2000 + LD (HL),080H + ; + ; Enter MMIO mode + CALL MMIO_ON + ; + ; Reset directory sector cache + LD A,0FFH + LD (DIRSECBUF),A + ; + ; Scan SD directory, fill MZF entries starting at 0x2020 + LD HL,L2000 + 020H + LD (DIR_BUFPTR),HL ; Current buffer write position + LD E,000H ; E = SD directory entry index (0-255) + LD D,03FH ; D = remaining buffer entries (max 63) + LD B,000H ; B = 256 entries to scan (DJNZ wraps) + ; +RDIR_LOOP: PUSH BC + PUSH DE + CALL GETSDDIRENT ; HL = entry in SECTORBUF, A = status + POP DE + POP BC + OR A + JR NZ,RDIR_DONE ; SD read error, stop + ; + ; Debug: dump first 4 entries (E=0..3) FLAG1+ATRB + LD A,E + CP 004H + JR NC,RDIR_NDBG ; Only dump entries 0-3 + PUSH HL + PUSH AF + LD A,E + POP AF + POP HL + PUSH HL + PUSH BC + ; Dump 8 bytes from entry + LD B,008H +RDIR_DBLP: LD A,(HL) + INC HL + DJNZ RDIR_DBLP + POP BC + POP HL + ; +RDIR_NDBG: + ; Check if entry is active (FLAG1 bit 7) AND has valid ATRB. + ; Uninitialized SD entries (0xFF fill) have bit 7 set but ATRB=0xFF, + ; so we reject ATRB=0x00 (empty) and ATRB=0xFF (uninitialized). + ; All other values (0x01-0xFE) are accepted, including non-standard + ; file types like 0x7E found on some partitions. + LD A,(HL) + BIT 7,A + JR Z,RDIR_NEXT ; Inactive (FLAG1 bit7=0), skip + INC HL + LD A,(HL) ; A = ATRB (offset 1) + DEC HL ; HL back to entry start + OR A + JR Z,RDIR_NEXT ; ATRB=0 → invalid, skip + CP 0FFH + JR Z,RDIR_NEXT ; ATRB=0xFF → uninitialized, skip + ; + ; Convert SD entry at HL to MZF format in DIR buffer + PUSH DE + PUSH BC + CALL CONVERT_ENTRY ; HL=SD entry, writes to (DIR_BUFPTR) + POP BC + POP DE + DEC D ; One fewer buffer slot + JR Z,RDIR_DONE ; Buffer full + ; +RDIR_NEXT: INC E ; Next SD directory entry + DJNZ RDIR_LOOP + ; +RDIR_DONE: CALL MMIO_OFF + ; Debug: show how many entries found (D started at 63, remaining = D) + PUSH AF + LD A,03FH ; 63 max + SUB D ; A = entries found + POP AF + ; + POP BC + POP DE + POP HL + LD A,001H + LD (DIR_FILLED),A ; Mark DIR buffer as filled + XOR A ; A=0, carry clear = success + RET + ; + ; --- Disk identity mode: zero L2800-L28FF --- + ; L2E36 validates: (L2800) exact + L2806-L28FF bitmask against + ; stored reference. L2E77/L2E84 modifies L2801-L2805 and writes + ; computed values at L2806+. By presenting all-zeros consistently, + ; L2E84 computes the same result each time → reference matches. + ; +RFSINP_DISKID: + PUSH HL + PUSH DE + PUSH BC + LD HL,02800H + LD DE,02801H + LD BC,000FFH ; 255 bytes: L2800-L28FF + LD (HL),000H + LDIR + POP BC + POP DE + POP HL + XOR A ; A=0, carry clear = success + RET + +; --------------------------------------------------------------------------- +; RFSINP_LD - LOAD data transfer (ZINP with ZLOG != 0) +; +; Reads file data sector-by-sector from SD card into the load address. +; For bit-5 devices, BASIC's LOAD path does NOT call ZRO and does not +; set ZLOG. RFSINP_DIR dispatches here when DIR_FILLED=1 (DIR buffer +; already populated). We find the file in the SD directory via FINDSD, +; extract SIZE, DTADR, and start sector directly from the SD entry. +; --------------------------------------------------------------------------- +RFSINP_LD: ; Debug: trace RFSINP_LD entry + PUSH AF + ; Dump ELMD1 first 8 chars + PUSH HL + PUSH BC + LD HL,ELMD1 + LD B,008H +ILD_DMP: LD A,(HL) + INC HL + DJNZ ILD_DMP + POP BC + POP HL + POP AF + ; + ; V1.1Y: Save entry A value (0=SVC #30 LOAD, nonzero=SVC #33 refill). + ; RLD_DONE needs this to skip status byte writes when L180B still points + ; at SVC #2C self-modifying code (0x1A85, set by prior DIR's SVC #2E). + LD (RFS_LD_A0),A + ; + PUSH HL + PUSH DE + PUSH BC + ; + ; Set up drive number + LD A,(ZCH) + ADD A,003H ; RFS1:=drive 3, skipping boot drives 0-2 + LD (SDDRIVENO),A + ; + ; Enter MMIO mode + CALL MMIO_ON + ; + ; Reset directory sector cache + LD A,0FFH + LD (DIRSECBUF),A + ; + ; Find file by name in SD directory to get start sector + LD DE,ELMD1 + CALL FINDSD + JP NZ,RLD_NFERR ; File not found + ; + ; HL = directory entry in SECTORBUF + ; Skip FLAG1(1) + ATRB(1) + NAME(17) = 19 bytes to START_SECTOR + LD DE,19 + ADD HL,DE + ; + ; Copy 4-byte start sector to FILE_STARTSEC (big-endian) + LD DE,FILE_STARTSEC + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + ; + ; HL now at offset 22 (last byte of START_SECTOR). + ; Read SIZE(2) and DTADR(2) from the SD directory entry + ; (offset 23..26) instead of ELMD, which may not be populated + ; for bit-5 device LOAD paths. + INC HL ; HL = offset 23 = SIZE low + LD E,(HL) + INC HL ; HL = offset 24 = SIZE high + LD D,(HL) + EX DE,HL ; HL = SIZE + LD (FILE_SIZE),HL + EX DE,HL ; HL = offset 24 again + INC HL ; HL = offset 25 = DTADR low + LD E,(HL) + INC HL ; HL = offset 26 = DTADR high + LD D,(HL) + EX DE,HL ; HL = DTADR + LD (FILE_LOADADDR),HL + ; + ; For BASIC programs (ELMD type 2/BTX), override FILE_LOADADDR + ; with TEXTST. The file's DTADR reflects whatever system it was + ; saved on and may point inside Disk BASIC code. BASIC's own + ; SVC 038H rechain (called in the LOAD command handler at L5C44) + ; rebuilds all next-line pointers from scratch, so the data just + ; needs to land at the current TEXTST. + LD A,(ELMD) ; File attribute byte + CP 002H ; Type 2 = BTX (BASIC text)? + JR NZ,RLD_NORLOC ; No → use DTADR as-is + LD HL,(TEXTST) ; Current text area start + LD (FILE_LOADADDR),HL +RLD_NORLOC: + ; + ; Convert FILE_STARTSEC to absolute sector (add drive offset) + LD A,(FILE_STARTSEC) + LD D,A + LD A,(FILE_STARTSEC+1) + LD E,A + LD A,(FILE_STARTSEC+2) + LD H,A + LD A,(FILE_STARTSEC+3) + LD L,A + CALL RFSGETSECTR ; DEHL += drive_offset + ; + ; Store absolute sector in SDSTARTSEC for SD_READ + LD A,D + LD (SDSTARTSEC),A + LD A,E + LD (SDSTARTSEC+1),A + LD A,H + LD (SDSTARTSEC+2),A + LD A,L + LD (SDSTARTSEC+3),A + ; + ; Debug: dump FILE_STARTSEC, absolute sector, SIZE, DTADR + ; Switch to DRAM for debug output (port 050H may need DRAM) + PUSH AF + OUT (PORT_DRAM),A + ; FILE_STARTSEC (4 bytes) + LD A,(FILE_STARTSEC) + LD A,(FILE_STARTSEC+1) + LD A,(FILE_STARTSEC+2) + LD A,(FILE_STARTSEC+3) + ; Absolute sector (SDSTARTSEC, 4 bytes) + LD A,(SDSTARTSEC) + LD A,(SDSTARTSEC+1) + LD A,(SDSTARTSEC+2) + LD A,(SDSTARTSEC+3) + ; SIZE + LD A,(FILE_SIZE+1) ; High byte + LD A,(FILE_SIZE) ; Low byte + ; DTADR + LD A,(FILE_LOADADDR+1) ; High byte + LD A,(FILE_LOADADDR) ; Low byte + ; Switch back to MMIO + OUT (PORT_MMIO),A + POP AF + ; +RLD_LOOP: ; Read one sector into SECTORBUF + CALL SD_READ + OR A + JR NZ,RLD_ERR + ; + ; Map DRAM to copy data (target may be >= D000H) + OUT (PORT_DRAM),A + ; + ; Calculate bytes to copy: min(FILE_SIZE, 512) + LD HL,(FILE_SIZE) + LD DE,00200H ; 512 + OR A + SBC HL,DE ; HL = FILE_SIZE - 512 + JR C,RLD_PARTIAL ; FILE_SIZE < 512 + ; + ; Full sector: remaining = HL, copy 512 bytes + LD (FILE_SIZE),HL + LD BC,00200H + JR RLD_COPY + ; +RLD_PARTIAL:; Partial sector: remaining = 0, copy FILE_SIZE bytes + ADD HL,DE ; Restore HL = FILE_SIZE + LD B,H + LD C,L ; BC = bytes to copy + LD HL,0 + LD (FILE_SIZE),HL ; Done after this + ; +RLD_COPY: LD HL,SECTORBUF + LD DE,(FILE_LOADADDR) + LDIR ; Copy sector data to target + LD (FILE_LOADADDR),DE ; Update target address + ; + ; Check if all data transferred + LD HL,(FILE_SIZE) + LD A,H + OR L + JR Z,RLD_DONE ; All done + ; + ; Increment SDSTARTSEC for next sector + CALL INC_STARTSEC + ; + ; Map MMIO for next sector read + OUT (PORT_MMIO),A + JR RLD_LOOP + ; +RLD_DONE: ; Map MMIO so MMIO_OFF can work (it expects temp stack) + OUT (PORT_MMIO),A + CALL MMIO_OFF + ; + ; V1.1Y: Only write status bytes when entered via SVC #33 refill path + ; (A≠0 at entry). The SVC #30 LOAD path (A=0) leaves L180B pointing at + ; 0x1A85 (set by prior DIR's SVC #2E), which is inside SVC #2C's + ; self-modifying LD HL,nnnn instruction (opcode 0x21 at 0x1A83). + ; Writing 0xFF there corrupts the opcode to RST 38H, breaking all + ; subsequent device-open calls ("Dev. name error" after LOAD). + ; SVC #30 callers don't read the status bytes, so skipping is safe. + LD A,(RFS_LD_A0) + OR A + JR Z,RLD_SKIP_STAT + ; + ; SVC #33 refill path: write status bytes at (L180B)-2 to 0xFF,0xFF + ; = "last block, all done". L1AEF already set L180B to a safe buffer. + LD HL,(L180B) + DEC HL + LD (HL),0FFH ; (L180B)-1 = 0xFF + DEC HL + LD (HL),0FFH ; (L180B)-2 = 0xFF + ; +RLD_SKIP_STAT: + POP BC + POP DE + POP HL + XOR A ; NC = success + RET + ; +RLD_ERR: CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A + SCF ; Carry = error + RET + ; +RLD_NFERR: CALL MMIO_OFF + POP BC + POP DE + POP HL + XOR A + SCF ; Carry = file not found + RET + +; =========================================================================== +; Low-level SD card access routines +; =========================================================================== + +; --------------------------------------------------------------------------- +; MMIO_ON - Enter MMIO mode for SPI access +; +; Saves BASIC stack pointer, switches to temp stack, disables interrupts, +; maps MMIO (D000-FFFF), and trains the upCntr latch. +; After return, caller is on temp stack and can access EFF8-EFFF. +; --------------------------------------------------------------------------- +MMIO_ON: POP HL ; Get return address (from BASIC stack) + LD (SAVE_SP),SP ; Save BASIC SP + LD SP,TEMP_STACK_TOP ; Switch to temp stack + PUSH HL ; Push return address on temp stack + DI + XOR A + OUT (PORT_MMIO),A ; Map D000-FFFF to MMIO + CALL TRAIN_UPCNTR ; Train latch (15 reads of EFF8H) + RET ; Return to caller (via temp stack) + +; --------------------------------------------------------------------------- +; MMIO_OFF - Leave MMIO mode, restore DRAM and BASIC stack +; +; Maps D000-FFFF back to DRAM, enables interrupts, restores BASIC stack. +; --------------------------------------------------------------------------- +MMIO_OFF: POP HL ; Get return address (from temp stack) + XOR A + OUT (PORT_DRAM),A ; Map D000-FFFF to DRAM + EI + LD SP,(SAVE_SP) ; Restore BASIC stack + JP (HL) ; Return to caller (on BASIC stack) + +; --------------------------------------------------------------------------- +; TRAIN_UPCNTR - Train the RFS register latch (upCntr) to 15 +; +; Reads BNKCTRLRST 15 times to enable control register writes. +; Entry: MMIO must be mapped (OUT E3H done) +; Exit: A = 0, HL and B modified +; --------------------------------------------------------------------------- +TRAIN_UPCNTR: + LD HL,BNKCTRLRST ; EFF8H + LD B,15 +TRAIN_LP: LD A,(HL) ; Each read increments upCntr + DJNZ TRAIN_LP + XOR A + RET + +; --------------------------------------------------------------------------- +; SPIOUT - Send one byte via hardware SPI +; Entry: A = byte to send +; Exit: A unchanged +; --------------------------------------------------------------------------- +SPIOUT: LD (HWSPIDATA),A ; Write data to SPI register + LD (HWSPISTART),A ; Start SPI transfer (clocks 8 bits) + RET + +; --------------------------------------------------------------------------- +; SPIIN - Receive one byte via hardware SPI +; Entry: (none) +; Exit: A = received byte +; --------------------------------------------------------------------------- +SPIIN: LD (HWSPISTART),A ; Clock 8 bits (sends whatever was in A) + LD A,(HWSPIDATA) ; Read received byte + RET + +; --------------------------------------------------------------------------- +; SPI_CS_LO - Activate SD card chip select (CS LOW) +; --------------------------------------------------------------------------- +SPI_CS_LO: LD A,SDCS_ACT ; CS LOW, clock enable + LD (BNKCTRL),A + RET + +; --------------------------------------------------------------------------- +; SPI_CS_HI - Deactivate SD card chip select (CS HIGH) +; --------------------------------------------------------------------------- +SPI_CS_HI: LD A,SDCS_DEACT ; CS HIGH, clock enable + LD (BNKCTRL),A + RET + +; --------------------------------------------------------------------------- +; SD_READ - Read one 512-byte sector from SD card into SECTORBUF +; +; Entry: SDSTARTSEC = 32-bit sector address (big-endian, 4 bytes) +; MMIO must be mapped, upCntr trained +; Exit: A = 0 success, A = 1 error +; SECTORBUF contains 512 bytes of sector data +; Modified: A, B, D, HL +; --------------------------------------------------------------------------- +SD_READ: CALL SPI_CS_LO ; CS LOW (activate card) + ; + ; Send CMD17 (Read Single Block): 0x51 + 4-byte sector + 0xFF + LD A,051H ; CMD17 + CALL SPIOUT + LD A,(SDSTARTSEC) ; Sector byte 0 (MSB) + CALL SPIOUT + LD A,(SDSTARTSEC+1) ; Sector byte 1 + CALL SPIOUT + LD A,(SDSTARTSEC+2) ; Sector byte 2 + CALL SPIOUT + LD A,(SDSTARTSEC+3) ; Sector byte 3 (LSB) + CALL SPIOUT + LD A,0FFH ; CRC (dummy, ignored by emulation) + CALL SPIOUT + ; + ; Poll for R1 response (should be 0x00, not 0xFF) + LD B,0FFH ; Max 255 retries +SDR_R1: CALL SPIIN + CP 0FFH + JR NZ,SDR_GOTR1 ; Got non-0xFF response + DJNZ SDR_R1 + JR SDR_ERR ; Timeout + ; +SDR_GOTR1: OR A ; R1 should be 0x00 (no error) + JR NZ,SDR_ERR + ; + ; Poll for data token (0xFE) + LD B,0FFH +SDR_TOK: CALL SPIIN + CP 0FEH ; Data token? + JR Z,SDR_DATA ; Yes, start reading data + CP 0FFH ; Still busy? + JR NZ,SDR_ERR ; Error token + DJNZ SDR_TOK + JR SDR_ERR ; Timeout + ; + ; Read 512 bytes into SECTORBUF (2 pages of 256 bytes) +SDR_DATA: LD HL,SECTORBUF + LD D,002H ; 2 pages +SDR_PG: LD B,000H ; 256 bytes per page (B=0 wraps DJNZ) +SDR_BYTE: CALL SPIIN + LD (HL),A + INC HL + DJNZ SDR_BYTE + DEC D + JR NZ,SDR_PG + ; + ; Skip 2 CRC bytes + CALL SPIIN + CALL SPIIN + ; + CALL SPI_CS_HI ; CS HIGH (deactivate) + XOR A ; A = 0, success + RET + ; +SDR_ERR: CALL SPI_CS_HI ; CS HIGH on error too + LD A,001H ; A = 1, error + RET + +; --------------------------------------------------------------------------- +; SD_WRITE - Write one 512-byte sector from SECTORBUF to SD card +; +; Entry: SDSTARTSEC = 32-bit sector address (big-endian, 4 bytes) +; SECTORBUF contains 512 bytes to write +; MMIO must be mapped, upCntr trained +; Exit: A = 0 success, A = 1 error +; Modified: A, B, D, HL +; --------------------------------------------------------------------------- +SD_WRITE: CALL SPI_CS_LO ; CS LOW (activate card) + ; + ; Send CMD24 (Write Single Block): 0x58 + 4-byte sector + 0xFF + LD A,058H ; CMD24 + CALL SPIOUT + LD A,(SDSTARTSEC) + CALL SPIOUT + LD A,(SDSTARTSEC+1) + CALL SPIOUT + LD A,(SDSTARTSEC+2) + CALL SPIOUT + LD A,(SDSTARTSEC+3) + CALL SPIOUT + LD A,0FFH ; Dummy CRC + CALL SPIOUT + ; + ; Poll for R1 response (should be 0x00) + LD B,0FFH +SDW_R1: CALL SPIIN + CP 0FFH + JR NZ,SDW_GOTR1 + DJNZ SDW_R1 + JR SDW_ERR ; Timeout + ; +SDW_GOTR1: OR A + JR NZ,SDW_ERR ; R1 error + ; + ; Send data token 0xFE + LD A,0FEH + CALL SPIOUT + ; + ; Send 512 bytes from SECTORBUF (2 pages of 256) + LD HL,SECTORBUF + LD D,002H +SDW_PG: LD B,000H ; 256 bytes per page +SDW_BYTE: LD A,(HL) + CALL SPIOUT + INC HL + DJNZ SDW_BYTE + DEC D + JR NZ,SDW_PG + ; + ; Send 2 dummy CRC bytes + LD A,0FFH + CALL SPIOUT + CALL SPIOUT + ; + ; Read data response token: xxx00101 = accepted (0x05) + CALL SPIIN + AND 01FH + CP 005H + JR NZ,SDW_ERR + ; + ; Wait for busy (card holds MISO low while writing) + LD D,040H ; Outer loop: 64 +SDW_BSY1: LD B,000H ; Inner loop: 256 -> 64*256=16384 polls +SDW_BSY2: CALL SPIIN + CP 0FFH ; 0xFF = not busy + JR Z,SDW_DONE + DJNZ SDW_BSY2 + DEC D + JR NZ,SDW_BSY1 + JR SDW_ERR ; Timeout + ; +SDW_DONE: CALL SPI_CS_HI + XOR A ; A = 0, success + RET + ; +SDW_ERR: CALL SPI_CS_HI + LD A,001H ; A = 1, error + RET + +; =========================================================================== +; Directory and file access routines +; =========================================================================== + +; --------------------------------------------------------------------------- +; ADD3216 - Add 16-bit BC to 32-bit DEHL +; +; Entry: DEHL = 32-bit number, BC = 16-bit addend +; Exit: DEHL = DEHL + BC +; Modified: BC (set to 0) +; --------------------------------------------------------------------------- +ADD3216: ADD HL,BC + EX DE,HL + LD BC,0 + ADC HL,BC ; Add carry to upper 16 bits + EX DE,HL + RET + +; --------------------------------------------------------------------------- +; RFSGETSECTR - Calculate absolute SD sector from drive-relative sector +; +; Adds (SDDRIVENO * 0x8010) to DEHL. +; Each drive image occupies 0x8010 sectors in the SD card image. +; +; Entry: DEHL = relative sector (32-bit) +; SDDRIVENO = drive number (0 = first drive, 1 = second, etc.) +; Exit: DEHL = absolute sector +; Modified: A, BC +; --------------------------------------------------------------------------- +RFSGETSECTR: + LD A,(SDDRIVENO) +GETSEC_LP: OR A + RET Z ; Drive 0 = no offset + DEC A + LD BC,08010H ; Sectors per drive image + CALL ADD3216 + JR GETSEC_LP + +; --------------------------------------------------------------------------- +; SETLBAADDR - Store DEHL into SDSTARTSEC (big-endian) +; +; Entry: DEHL = 32-bit sector (D=MSB, L=LSB) +; Exit: SDSTARTSEC updated +; Modified: A +; --------------------------------------------------------------------------- +SETLBAADDR: LD A,D + LD (SDSTARTSEC),A + LD A,E + LD (SDSTARTSEC+1),A + LD A,H + LD (SDSTARTSEC+2),A + LD A,L + LD (SDSTARTSEC+3),A + RET + +; --------------------------------------------------------------------------- +; INC_STARTSEC - Increment SDSTARTSEC by 1 (32-bit big-endian) +; Modified: HL +; --------------------------------------------------------------------------- +INC_STARTSEC: + LD HL,SDSTARTSEC+3 ; LSB + INC (HL) + RET NZ + DEC HL ; Byte 2 + INC (HL) + RET NZ + DEC HL ; Byte 1 + INC (HL) + RET NZ + DEC HL ; MSB + INC (HL) + RET + +; --------------------------------------------------------------------------- +; GETSDDIRENT - Get SD directory entry with sector caching +; +; Reads the directory sector containing entry E if not cached, then +; returns a pointer to the entry within SECTORBUF. +; +; Entry: E = directory entry number (0-255) +; MMIO mapped, upCntr trained +; Exit: HL = pointer to 32-byte entry in SECTORBUF +; A = 0 success, A = 1 error +; Modified: A, BC, DE, HL +; --------------------------------------------------------------------------- +GETSDDIRENT: + PUSH DE + ; + ; Calculate which sector this entry is in (E / 16) + LD A,E + SRL A + SRL A + SRL A + SRL A ; A = sector number within directory + ; + ; Check if this sector is already cached + LD C,A + LD A,(DIRSECBUF) + CP C + JR Z,GDIR_CACHED ; Same sector, use cached data + ; + ; Need to read a new sector + LD A,C + LD (DIRSECBUF),A ; Update cache tag + ; + ; Calculate absolute sector: drive_offset + dir_sector + LD DE,0 + LD H,0 + LD L,A ; DEHL = directory sector (relative) + CALL RFSGETSECTR ; DEHL = absolute sector + CALL SETLBAADDR ; Store in SDSTARTSEC + CALL SD_READ ; Read sector into SECTORBUF + OR A + JR NZ,GDIR_ERR + ; +GDIR_CACHED:; Calculate offset within sector: (E & 0x0F) * 32 + POP DE + PUSH DE + LD A,E + AND 00FH ; Entry within sector (0-15) + LD HL,SECTORBUF + OR A + JR Z,GDIR_DONE ; First entry, no offset needed + ; + ; Add A * 32 to HL + LD B,A + LD DE,00020H ; 32 bytes per entry +GDIR_ADD: ADD HL,DE + DJNZ GDIR_ADD + ; +GDIR_DONE: POP DE + XOR A ; A = 0, success + RET + ; +GDIR_ERR: POP DE + LD A,001H ; A = 1, error + RET + +; --------------------------------------------------------------------------- +; FINDSD - Find file by name in SD card directory +; +; Searches all 256 directory entries for an active entry whose filename +; matches the string at DE (prefix match: input terminated by CR or null). +; +; Entry: DE = filename string (CR or null terminated) +; MMIO mapped, upCntr trained, DIRSECBUF set to 0xFF +; Exit: Z flag set = found, HL = directory entry in SECTORBUF +; NZ flag = not found +; Modified: A, BC, DE, HL +; --------------------------------------------------------------------------- +FINDSD: LD (FINDSD_NAME),DE ; Save search name pointer + LD E,000H ; E = directory entry index + LD B,000H ; B = 256 entries (DJNZ wraps from 0) + ; +FSD_LOOP: PUSH BC + PUSH DE + CALL GETSDDIRENT ; HL = entry, A = status + POP DE + POP BC + OR A + JR NZ,FSD_NF ; Read error = not found + ; + ; Check if entry is active (FLAG1 bit 7) AND has valid ATRB. + ; Accept all non-zero, non-0xFF ATRB (01-FE). + LD A,(HL) + BIT 7,A + JR Z,FSD_NEXT ; Inactive, skip + INC HL + LD A,(HL) ; A = ATRB (offset 1) + DEC HL ; HL back to entry start + OR A + JR Z,FSD_NEXT ; ATRB=0 → invalid, skip + CP 0FFH + JR Z,FSD_NEXT ; ATRB=0xFF → uninitialized, skip + ; + ; Compare filename: dir entry name at HL+2 vs search name + PUSH HL ; Save entry start + PUSH DE + PUSH BC + INC HL + INC HL ; HL = directory entry name (offset 2) + LD DE,(FINDSD_NAME) ; DE = search name + LD B,17 ; Max filename length + ; +FSD_CMP: LD A,(DE) + CP 00DH ; CR terminator? + JR Z,FSD_MATCH ; Input ended = prefix match + OR A ; Null terminator? + JR Z,FSD_MATCH + CP (HL) ; Compare characters + JR NZ,FSD_NOMATCH + INC DE + INC HL + DJNZ FSD_CMP + ; All 17 characters matched + ; +FSD_MATCH: POP BC + POP DE + POP HL ; HL = entry start + XOR A ; Z flag = found + RET + ; +FSD_NOMATCH:POP BC + POP DE + POP HL + ; +FSD_NEXT: INC E ; Next directory entry + DJNZ FSD_LOOP + ; +FSD_NF: LD A,001H + OR A ; NZ flag = not found + RET + +; --------------------------------------------------------------------------- +; EXTRACT_HDR - Extract file header from SD directory entry +; +; Converts SD directory entry fields to MZF format in ELMD, and saves +; the file's absolute start sector in FILE_STARTSEC for data transfer. +; +; Entry: HL = directory entry in SECTORBUF (MMIO mapped) +; SDDRIVENO set for current drive +; Exit: ELMD filled with MZF header (ATRB, NAME, SIZE, DTADR, EXADR) +; FILE_STARTSEC set to absolute start sector +; Modified: A, BC, DE, HL +; --------------------------------------------------------------------------- +EXTRACT_HDR: + INC HL ; Skip FLAG1, HL = ATRB (offset 1) + ; + ; Copy ATRB to ELMD[0], remapping CMT type 05 -> Disk BASIC type 02 + LD DE,ELMD + LD A,(HL) + CP 005H ; CMT type 05 = MZ-700 BASIC text + JR NZ,EH_AT1 + LD A,002H ; Disk BASIC type 02 = BTX +EH_AT1: LD (DE),A + INC HL ; HL = NAME (offset 2) + INC DE ; DE = ELMD+1 + ; + ; Copy 17-byte filename, converting null to CR + LD B,17 +EH_NAME: LD A,(HL) + OR A + JR NZ,EH_NM1 + LD A,00DH ; Null -> CR for BASIC +EH_NM1: LD (DE),A + INC HL + INC DE + DJNZ EH_NAME + ; + ; HL at offset 19: START_SECTOR (4 bytes, big-endian) + ; DE at ELMD+18 + PUSH DE ; Save ELMD position + ; + ; Copy 4-byte start sector to FILE_STARTSEC + LD DE,FILE_STARTSEC + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + INC HL + INC DE + LD A,(HL) + LD (DE),A + INC HL ; HL at offset 23: SIZE + ; + ; Copy SIZE(2) + DTADR(2) + EXADR(2) = 6 bytes to ELMD + POP DE ; DE = ELMD+18 + LD BC,6 + LDIR + ; + ; Convert FILE_STARTSEC to absolute sector (add drive offset) + LD A,(FILE_STARTSEC) + LD D,A + LD A,(FILE_STARTSEC+1) + LD E,A + LD A,(FILE_STARTSEC+2) + LD H,A + LD A,(FILE_STARTSEC+3) + LD L,A + CALL RFSGETSECTR ; DEHL += drive_offset + ; + ; Store absolute sector back to FILE_STARTSEC + LD A,D + LD (FILE_STARTSEC),A + LD A,E + LD (FILE_STARTSEC+1),A + LD A,H + LD (FILE_STARTSEC+2),A + LD A,L + LD (FILE_STARTSEC+3),A + RET + +; --------------------------------------------------------------------------- +; CONVERT_ENTRY - Convert SD directory entry to Disk BASIC DIR buffer format +; +; Writes a 32-byte directory entry to the DIR buffer at (DIR_BUFPTR) +; and advances DIR_BUFPTR by 32. Format matches standard MZ Disk BASIC +; floppy directory layout so LOAD/SAVE work correctly. +; +; SD entry format: FLAG1(1), ATRB(1), NAME(17), SECTOR(4), SIZE(2), DTADR(2), EXADR(2), RESV(3) +; Disk BASIC format: ATRB(1), NAME(17), STARTSEC(2), SIZE(2), DTADR(2), EXADR(2), pad(6) +; +; Entry: HL = SD directory entry in SECTORBUF +; Exit: DIR_BUFPTR advanced by 32 +; Modified: A, BC, DE, HL +; --------------------------------------------------------------------------- +CONVERT_ENTRY: + INC HL ; Skip FLAG1 + ; + ; Copy ATRB to buffer, remapping CMT type 05 -> Disk BASIC type 02 + LD DE,(DIR_BUFPTR) + LD A,(HL) + CP 005H ; CMT type 05 = MZ-700 BASIC text + JR NZ,CE_AT1 + LD A,002H ; Disk BASIC type 02 = BTX +CE_AT1: LD (DE),A + INC HL ; HL = NAME (offset 2) + INC DE + ; + ; Copy 17-byte filename, null -> CR + LD B,17 +CE_NAME: LD A,(HL) + OR A + JR NZ,CE_NM1 + LD A,00DH +CE_NM1: LD (DE),A + INC HL + INC DE + DJNZ CE_NAME + ; + ; HL now at SD offset 19 = START_SECTOR (4 bytes, big-endian) + ; Write 2-byte start sector placeholder at DIR offset 18-19 + ; then SIZE(2)+DTADR(2)+EXADR(2) at DIR offsets 20-25. + ; BASIC reads SIZE from DIR offset 20 (IY+14H), DTADR from 22, + ; EXADR from 24. The 2-byte slot at 18 must exist for alignment. + INC HL ; Skip START_SECTOR[0] + INC HL ; Skip START_SECTOR[1] + LD A,(HL) + LD (DE),A ; DIR[18] = START_SECTOR[2] + INC HL + INC DE + LD A,(HL) + LD (DE),A ; DIR[19] = START_SECTOR[3] + INC HL + INC DE + ; + ; Copy SIZE(2) + DTADR(2) + EXADR(2) = 6 bytes to DIR offset 20-25 + LD BC,6 + LDIR + ; + ; Remaining 8 bytes already zeroed by buffer clear + ; Advance DIR_BUFPTR by 32 + LD HL,(DIR_BUFPTR) + LD DE,00020H + ADD HL,DE + LD (DIR_BUFPTR),HL + RET + +; --------------------------------------------------------------------------- +; MEMCLI_PATCH - Trampoline from L4020 (MEMCLI). +; Original code was: RST 018H / DB 020H / EX DE,HL +; SVC 020H programs the boot beep timer and (critically) enables interrupts. +; We must still call it, then load HL with RFS_END for the memory clear. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label must be outside IF) +MEMCLI_PATCH: + IF BUILD_RFS = 1 + RST 018H + DB 020H ; SVC 020H: boot beep + EI + LD HL,RFS_END + JP L4023 ; Continue with memory clear loop + +; --------------------------------------------------------------------------- +; RFS_LOAD_HOOK - Trampoline for L3153 data transfer +; +; Replaces CALL L32CB + CALL L3174 in L3153. Checks if the current device +; is $RFS (by comparing the ZINP handler pointer). For $RFS, performs SD +; card data transfer via RFSINP_LD instead of the FD/QD hardware path. +; For all other devices, calls the original L32CB + L3174 sequence. +; +; --------------------------------------------------------------------------- +; RFS_DIR_FIX — Trampoline for DIR device-name parsing. +; L593A's success path jumps here instead of directly to L596B. +; We advance HL past the ':' so the INC/DEC zero-test at L596B sees +; end-of-text (0x00) rather than ':' (0x3A). +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label must be outside IF) +RFS_DIR_FIX: + IF BUILD_RFS = 1 + LD DE,L5982 + INC HL ; Advance HL past ':'. + JP L596B +; +; --------------------------------------------------------------------------- +; RFS_DIR_STR — Hook for L5962 string expression path. +; Called instead of L6E6F when L593A's letter parsing fails (e.g., DIR "RFS1:"). +; Evaluates the string expression, then copies the device name (up to ':') +; into L5982 and sets B = length for SVC #2CH. +; Entry: HL = text pointer (at '"'), B = 0 +; Exit: HL advanced past expression, B = name length, DE = L5982 +; --------------------------------------------------------------------------- +RFS_DIR_STR: + CALL L6E6F ; Evaluate string expr. B=strlen, DE=strptr + PUSH HL ; Save text pointer (past closing quote) + EX DE,HL ; HL = string data pointer + LD DE,L5982 ; DE = name buffer + LD A,B ; A = string length + OR A + JR Z,DSTR_DONE ; Empty string → B stays 0 + LD C,A ; C = remaining chars + LD B,000H ; B = bytes copied +DSTR_LP: LD A,(HL) ; Get char from string + LD (DE),A ; Copy to name buffer + INC HL + INC DE + INC B ; Count + DEC C + CP 03AH ; ':' ? + JR Z,DSTR_DONE ; Stop after ':' + LD A,C + OR A + JR NZ,DSTR_LP ; Loop if more chars +DSTR_DONE: LD DE,L5982 ; DE = start of name buffer (for SVC #2CH) + POP HL ; Restore text pointer + RET +; +; Entry: BC = SIZE (file size to load), stack = L10F0 stack +; Exit: A=0 NC on success; carry on error. Registers preserved. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label must be outside IF) +RFS_LOAD_HOOK: + IF BUILD_RFS = 1 + ; Debug: trace L3153 hook entry + PUSH AF + ; Show BC (SIZE) + LD A,B + LD A,C + POP AF + ; + LD HL,(ZINP) ; Current device ZINP handler + PUSH DE + LD DE,RFSINP_DIR ; $RFS handler address + OR A + SBC HL,DE + POP DE + JR Z,RFLH_RFS + ; + ; Not $RFS — call original FD/QD transfer + CALL L32CB + JP L3174 + ; +RFLH_RFS: ; $RFS device: transfer file data from SD card. + ; Debug: show ELMD contents before RFSINP_LD + PUSH AF + PUSH HL + PUSH BC + ; Dump ELMD[0..7] (ATRB + first 7 chars of name) + LD HL,ELMD + LD B,008H +RFLH_DMP1: LD A,(HL) + INC HL + DJNZ RFLH_DMP1 + ; Dump ELMD18-ELMD23 (SIZE+DTADR+EXADR) + LD HL,ELMD18 + LD B,006H +RFLH_DMP2: LD A,(HL) + INC HL + DJNZ RFLH_DMP2 + POP BC + POP HL + POP AF + ; + CALL RFSINP_LD + ; Debug: show return status + PUSH AF + JR C,RFLH_ERR + JR RFLH_DONE +RFLH_ERR: LD A,'E' +RFLH_DONE: CALL RFS_CRLF + POP AF + JP L3101 + +; =========================================================================== +; RFS_DIRCMD1 — Debug wrapper for L58CA (DIR handler 1: device-name path). +; Outputs "1E\n" on port 050H as version/path marker, then original logic. +; =========================================================================== + ENDIF ; (Glass: label must be outside IF) +RFS_DIRCMD1: + IF BUILD_RFS = 1 + LD A,'1' ; DIR path 1 marker + LD A,'M' ; Version letter M + CALL L593A ; Original: parse device name + RST 018H + DB 03AH ; SVC #3A: list directory + RET + +; =========================================================================== +; RFS_DIRCMD2 — Debug wrapper for L58D0 (DIR handler 2: string-expr path). +; Outputs "2E\n" on port 050H as version/path marker, then original logic. +; =========================================================================== + ENDIF ; (Glass: label must be outside IF) +RFS_DIRCMD2: + IF BUILD_RFS = 1 + LD A,'2' ; DIR path 2 marker + LD A,'M' ; Version letter M + CALL L413E ; Original: check current char + LD B,000H + CALL NZ,L6E6F ; Evaluate string expression + JP L58D8 ; Continue at PUSH HL / SVC #2C / SVC #3C + +; =========================================================================== +; RFS_DIR_OPEN — Debug wrapper replacing L596B for DIR SVC #2C. +; Outputs trace info on port 050H, then performs the original SVC call and +; error check. Format: +; D:BB NAMESTR... (before SVC: B=count, name from DE) +; K:xx xx xx xx xx xx (after SVC: KEYBUF[0..5]) +; =HHHH:VV (after SVC: HL pointer and (HL) value) +; =========================================================================== + ENDIF ; (Glass: label must be outside IF) +RFS_DIR_OPEN: + IF BUILD_RFS = 1 + PUSH AF + ; --- Before SVC: output "D:" + B (hex) + space + name string --- + LD A,B + ; Output the name (B chars from DE) + PUSH BC + PUSH DE + LD A,B + OR A + JR Z,RFS_NN +RFS_NLP: LD A,(DE) + INC DE + DJNZ RFS_NLP +RFS_NN: POP DE + POP BC + POP AF + ; --- Call SVC #2C (original L596B logic) --- + PUSH HL + RST 018H + DB 02CH + ; --- After SVC: dump KEYBUF[0..7] --- + PUSH AF + PUSH BC + PUSH DE + PUSH HL ; save SVC result HL + LD HL,KEYBUF + LD B,008H +RFS_KLP: LD A,(HL) + INC HL + DJNZ RFS_KLP + POP HL ; restore SVC result HL + ; --- Output "=" + HL (4 hex) + ":" + (HL) (2 hex) --- + LD A,H + LD A,L + LD A,(HL) + POP DE + POP BC + POP AF + ; --- Original error check --- + INC (HL) + DEC (HL) + JP NZ,04B25H + POP HL + RET +; +; --------------------------------------------------------------------------- +; RFS_HEX — Output A as 2 hex ASCII digits to port 050H. +; Preserves BC, DE, HL. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +RFS_HEX: + IF BUILD_RFS = 1 + PUSH AF + RRCA + RRCA + RRCA + RRCA + AND 00FH + CALL RFS_NIB + POP AF + AND 00FH +RFS_NIB: CP 00AH + JR C,RFS_DIG + ADD A,037H ; 'A'..'F' + RET +RFS_DIG: ADD A,030H ; '0'..'9' + RET +; +; --------------------------------------------------------------------------- +; RFS_CRLF — Output CR+LF to port 050H. Preserves all registers. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +RFS_CRLF: + IF BUILD_RFS = 1 + PUSH AF + LD A,00DH ; CR + LD A,00AH ; LF + POP AF + RET + +; =========================================================================== +; RFS_DIR3 — Debug wrapper for L5CE3 (the real DIR command handler). +; Replicates the full DIR flow with debug markers around each SVC call. +; Output format on port 050H: +; D3:E (entry marker + version) +; 82:AA (L5882 result in A, hex) +; 2E:AA C=x B1=x (SVC #2E result: A, carry flag, bit1 of A) +; C2: (L58C2 done) +; 3A:AA (L593A result: channel in A) +; 39a: (SVC #39 with A=0 done) +; 3Ac:AA (SVC #3A with A=channel done) +; 39b:AA (SVC #39 with A=orig done) +; D3:X (exit marker) +; =========================================================================== + ENDIF ; (Glass: label must be outside IF) +RFS_DIR3: + IF BUILD_RFS = 1 + ; --- Entry marker --- + LD A,'M' ; Version M + ; --- Call L5882 (original first instruction) --- + CALL L5882 + ; --- Debug: show L5882 result --- + PUSH AF + ; --- PUSH AF (as original) --- + ; AF is already on stack from our PUSH above + ; --- SVC #2E --- + RST 018H + DB 02EH + ; --- Debug: show SVC #2E result --- + PUSH AF ; save flags from SVC #2E + JR C,RFS_D3_CY1 + LD A,'0' + JR RFS_D3_CY1D +RFS_D3_CY1: + LD A,'1' +RFS_D3_CY1D: + POP AF ; restore flags from SVC #2E + ; --- JP C,L57B4 (error 0x2C on carry) --- + JP C,L57B4 + ; --- BIT 1,A / JP Z,057B7H --- + BIT 1,A + PUSH AF + JR Z,RFS_D3_B0 + LD A,'1' + JR RFS_D3_B1D +RFS_D3_B0: + LD A,'0' +RFS_D3_B1D: + POP AF + JP Z,057B7H ; error 0xBB if bit1=0 + ; --- CALL L58C2 (check ZLOG) --- + CALL L58C2 + LD A,'K' ; OK + ; --- CALL L593A (parse device name) --- + CALL L593A + ; --- Debug: show L593A result (channel in A) --- + ; --- LD B,A / XOR A / SVC #39 (A=0) --- + LD B,A + ; + ; Debug V1.1J: dump ZINP pointer and ZFLAG1 before SVC #39 + PUSH BC + LD A,'I' ; "IP=" marker for ZINP + LD A,(ZINP+1) ; High byte of ZINP pointer + LD A,(ZINP) ; Low byte of ZINP pointer + LD A,'F' ; "F1=" marker for ZFLAG1 + LD A,(ZFLAG1) + POP BC + ; + ; Debug V1.1K: dump first 4 bytes at RFSINP_DIR (runtime) and 0x2000 + PUSH HL + PUSH BC + LD HL,RFSINP_DIR ; Point to RFSINP_DIR code in memory + LD B,004H +RFS_RDMP: LD A,(HL) + INC HL + DJNZ RFS_RDMP + ; Also dump first 4 bytes of DIR buffer at 0x2000 + LD HL,L2000 + LD B,004H +RFS_BDMP: LD A,(HL) + INC HL + DJNZ RFS_BDMP + POP BC + POP HL + ; + ; (V1.1L debug hook removed in V1.1Y — was calling RFSINP_DIR for + ; ALL devices, causing 20s delay + empty DIR for non-RFS devices) + ; + XOR A + XOR A ; A=0 again (debug output clobbered it) + RST 018H + DB 039H + ; --- Debug: after SVC #39 --- dump 0x2000 again + PUSH AF + PUSH HL + PUSH BC + LD HL,L2000 + LD B,004H +RFS_BDMP2: LD A,(HL) + INC HL + DJNZ RFS_BDMP2 + POP BC + POP HL + POP AF + ; --- original after-SVC debug --- + JR C,RFS_D3_CY2 + LD A,'0' + JR RFS_D3_CY2D +RFS_D3_CY2: + LD A,'1' +RFS_D3_CY2D: + ; --- LD A,B / SVC #3A (A=channel) --- + LD A,B + RST 018H + DB 03AH + ; --- Debug: after SVC #3A --- + JR C,RFS_D3_CY3 + LD A,'0' + JR RFS_D3_CY3D +RFS_D3_CY3: + LD A,'1' +RFS_D3_CY3D: + ; --- POP AF / SVC #39 (A=original from L5882) --- + POP AF + PUSH AF + RST 018H + DB 039H + ; --- Debug: after final SVC #39 --- + JR C,RFS_D3_CY4 + LD A,'0' + JR RFS_D3_CY4D +RFS_D3_CY4: + LD A,'1' +RFS_D3_CY4D: + ; --- Exit marker --- + ; --- Clean up and return --- + POP AF ; balance the PUSH AF from after L5882 + RET + +; =========================================================================== +; Data area +; =========================================================================== + ENDIF ; (Glass: label outside IF) +SDSTARTSEC: + IF BUILD_RFS = 1 + DS 4, 000H ; Current sector address for SD_READ (big-endian) + ENDIF ; (Glass: label outside IF) +DIRSECBUF: + IF BUILD_RFS = 1 + DB 0FFH ; Cached directory sector number (0xFF = none) + ENDIF ; (Glass: label outside IF) +FILE_STARTSEC: + IF BUILD_RFS = 1 + DS 4, 000H ; Saved file start sector (absolute, big-endian) + ENDIF ; (Glass: label outside IF) +FILE_LOADADDR: + IF BUILD_RFS = 1 + + DW 00000H ; Current load address during LOAD transfer +; =========================================================================== +; RFS_L1C5B_WRAP — Wrapper around CALL L1C5B to dump ZFLAG1 before and after. +; This reveals whether L1C5B modifies ZFLAG1 (specifically bit 5). +; Output format: "F1:xx>xx\r\n" where xx=before, xx=after +; =========================================================================== + ENDIF ; (Glass: label must be outside IF) +RFS_L1C5B_WRAP: + IF BUILD_RFS = 1 + PUSH AF + PUSH HL + ; --- Print "F1:" --- + ; --- Dump ZFLAG1 before --- + LD A,(ZFLAG1) + POP HL + POP AF + ; --- Call the real L1C5B --- + CALL L1C5B + ; --- Save return flags --- + PUSH AF + PUSH HL + ; --- Print ">" --- + ; --- Dump ZFLAG1 after --- + LD A,(ZFLAG1) + POP HL + POP AF + RET + +; =========================================================================== +; RFS_FLAGS_TEST — Replaces the LD HL,ZFLAG1 / BIT 7 / BIT 5 sequence. +; V1.1Q: Workaround for suspected Z80 emulator bug where AND immediate +; does not correctly set the Z flag (0x5F AND 0x20 = 0x20 yet Z is set). +; Instead of testing ZFLAG1 bit 5, check device name for "$RFS" and force +; the ZINP path directly. This is safe because this code point is only +; reached when A=0 (DIR enumeration) in SVC #39. +; =========================================================================== + ENDIF ; (Glass: label must be outside IF) +RFS_FLAGS_TEST: + IF BUILD_RFS = 1 + LD HL,ZFLAG1 + ; --- Check bit 7 first (error condition, applies to all devices) --- + LD A,(HL) + AND 080H + JR Z,RFS_FT_NO7 + POP DE ; discard CALL return address + JP 01F97H +RFS_FT_NO7: + ; --- Check if this is the $RFS device by name --- + LD A,(ZDEVNM) ; first char of device name + CP 'R' + JR NZ,RFS_FT_NORFS + LD A,(ZDEVNM+1) ; second char + CP 'F' + JR NZ,RFS_FT_NORFS + ; --- This IS $RFS — force ZINP/DIR path --- + POP DE ; discard CALL return address + JP RFS_BIT5PATH_DIR +RFS_FT_NORFS: + ; --- Not $RFS: fall through to ZRO path --- + ; HL = ZFLAG1 (correct for INC HL that follows the NOPs) + RET + +; =========================================================================== +; RFS_BIT5PATH_DIR — Replacement for the SVC #39 bit-5 path at 0x2F38. +; Instead of calling through L2FD1 → IOCALL, this calls RFSINP_DIR directly +; to bypass the broken IOCALL dispatch. Also traces the path. +; Original bit-5 path: XOR A / LD HL,L2000 / LD DE,800 / LD BC,10 / CALL L2FD1 +; L2FD1 does TWO ZINP calls: +; 1st: L2FE8 → disk identity (H=0x28) +; 2nd: L2FD4 → DIR fill (H=0x20) +; We replicate both calls directly to RFSINP_DIR. +; =========================================================================== +RFS_BIT5PATH_DIR: + ; --- Marker --- + ; + ; --- 1st ZINP call: disk identity (H=0x28) --- + LD HL,02800H ; H=0x28 → DISKID path + LD A,(ZCH) ; Channel number + CALL RFSINP_DIR + ; + ; --- 2nd ZINP call: DIR fill (H=0x20) --- + LD HL,L2000 ; H=0x20 → DIR fill + LD A,(ZCH) + CALL RFSINP_DIR + ; + ; --- After both calls, check DIR buffer --- + PUSH HL + PUSH BC + LD HL,L2000 + LD B,008H +RFS_B5DMP: LD A,(HL) + INC HL + DJNZ RFS_B5DMP + POP BC + POP HL + ; + ; --- Replicate original return logic --- + ; Original: LD A,(HL) / OR A / JP P,01F70H / RET + ; After L2FD1 returns, HL=0x2000 (restored by wrappers). + ; We set HL=0x2000 explicitly since we bypassed the wrappers. + LD HL,L2000 + LD A,(HL) + OR A + JP P,01F70H + ; + ; Clear DIR_FILLED for next DIR call + XOR A + LD (DIR_FILLED),A + ; + ; Return — will go through SKPDE cleanup from SVC #39 handler + RET + + ENDIF ; (Glass: label outside IF) +FILE_SIZE: + IF BUILD_RFS = 1 + DW 00000H ; Remaining bytes during LOAD transfer + ENDIF ; (Glass: label outside IF) +RFS_LD_A0: + IF BUILD_RFS = 1 + DB 000H ; V1.1Y: Entry A for RFSINP_LD (0=SVC #30, else SVC #33) + ENDIF ; (Glass: label outside IF) +DIR_BUFPTR: + IF BUILD_RFS = 1 + DW 00000H ; Current write position in DIR buffer + ENDIF ; (Glass: label outside IF) +FINDSD_NAME: + IF BUILD_RFS = 1 + DW 00000H ; Saved filename pointer for FINDSD + ENDIF ; (Glass: label outside IF) +SAVE_DIRENT: + IF BUILD_RFS = 1 + DB 000H ; Saved directory entry number for SAVE + ENDIF ; (Glass: label outside IF) +SAVE_PENDING: + IF BUILD_RFS = 1 + DB 000H ; 1 = SAVE in progress, trigger RFSWO on first RFSOUT call + ENDIF ; (Glass: label outside IF) +DIR_FILLED: + IF BUILD_RFS = 1 + DB 000H ; 1 = DIR buffer filled, next ZINP call is data transfer + ENDIF ; (Glass: label outside IF) +SAVE_SP: + IF BUILD_RFS = 1 + DW 00000H ; Saved BASIC stack pointer + ENDIF ; (Glass: label outside IF) +DIR_ENTRY_IDX: + IF BUILD_RFS = 1 + DB 000H ; Current SD directory entry index for RFSRO (0-255) + ENDIF ; (Glass: label outside IF) +SECTORBUF: + IF BUILD_RFS = 1 + DS 512, 000H ; SD card sector buffer (was EQU 0CE00H, moved here + ; to avoid overlap with BASIC stack at ~0xCFFF) + DS 128, 000H ; Temp stack (64 levels) + ENDIF ; (Glass: labels must be outside IF) +TEMP_STACK_TOP: ; SP points here (grows downward) +RFS_END EQU TEMP_STACK_TOP ; End of RFS code = new TEXTST + IF BUILD_RFS = 1 + + ENDIF ; END BUILD_RFS = 1 + +; =========================================================================== +; Tape/CMT bootstrap (only for BUILD_TAPE=1) +; This code loads at TAPECOPY (0x1200) and copies the BASIC ROM to 0x0000, +; then jumps to the cold start entry point. +; =========================================================================== + IF BUILD_TAPE = 1 +EXECSTART: XOR A ; Execution entry point (runs at TAPECOPY+offset) LD DE,L0000 - CALL TIMST - ;LD HL,(DTEFG) - ;PUSH HL - LD DE,L0000 - LD HL,BASICEND - L0000 + CALL TIMST ; Stop timer + LD DE,L0000 ; Destination: 0x0000 + LD HL,BASICEND - L0000 ; Size of BASIC ROM OR A SBC HL,DE LD C,L - LD B,H - LD HL,TAPECOPY - OUT (LSE0),A - LDIR - ;POP HL - ;LD (L0054),HL - JP L0000 - - DS 0,11 + LD B,H ; BC = byte count + LD HL,TAPECOPY ; Source: where tape loaded the image + OUT (LSE0),A ; Map 0000-0FFF to DRAM + LDIR ; Copy BASIC ROM to 0x0000 + JP L0000 ; Jump to cold start BASICEND: + ENDIF diff --git a/asm/mz5z008_orig.asm b/asm/mz5z008_orig.asm new file mode 100644 index 0000000..49cb0ed --- /dev/null +++ b/asm/mz5z008_orig.asm @@ -0,0 +1,12 @@ +; =========================================================================== +; Build configuration — set these flags to select the build variant: +; +; BUILD_RFS=0, BUILD_TAPE=0 : Original BASIC (QD boot, no RFS) +; BUILD_RFS=0, BUILD_TAPE=1 : Original BASIC (Tape/CMT/RFS ROM boot) +; BUILD_RFS=1, BUILD_TAPE=0 : RFS Enhanced BASIC (QD boot) +; BUILD_RFS=1, BUILD_TAPE=1 : RFS Enhanced BASIC (Tape/CMT/RFS ROM boot) +; =========================================================================== +BUILD_RFS EQU 0 ; 0 = original BASIC, 1 = RFS enhancements +BUILD_TAPE EQU 1 ; 0 = QD boot, 1 = Tape/CMT/RFS ROM boot + + INCLUDE "mz5z008.asm" diff --git a/asm/mz5z008_rfs.asm b/asm/mz5z008_rfs.asm index 50e0935..4fc4a9a 100644 --- a/asm/mz5z008_rfs.asm +++ b/asm/mz5z008_rfs.asm @@ -1,20226 +1,12 @@ -; Disassembly of the file "mz5z008.bin" -; -; CPU Type: Z80 -; -; Created with dZ80 2.1 -; -; on Monday, 16 of March 2026 at 07:23 PM -; -LSD0 EQU 0D0H -LSD1 EQU 0D1H -LSD2 EQU 0D2H -LSD3 EQU 0D3H -LSE0 EQU 0E0H -LSE1 EQU 0E1H -LSE2 EQU 0E2H -LSE3 EQU 0E3H -LSE4 EQU 0E4H -LSE5 EQU 0E5H -LSE6 EQU 0E6H -QDPA EQU 0F2H -QDPB EQU 0F3H -QDPC EQU 0F4H -QDPD EQU 0F5H -FDPA EQU 0F8H -FDPB EQU 0F9H -FDPC EQU 0FAH -FDPD EQU 0FBH -LSFC EQU 0FCH -TMCNT EQU 01195H -CSMDT EQU 01199H -TEMPW EQU 0119EH -KEY262 EQU 012AAH -KEY264 EQU 012ACH -KEY266 EQU 012AEH -FUNBUF EQU 012B2H -INBUFC EQU 01352H -INBUFL EQU 01353H -INBUF EQU 01354H -TIMST EQU 00033H -LINLIM EQU 01364H -KEYDAT EQU 01365H -AMPM EQU 01366H -SECD EQU 01367H -XS EQU 01369H -XE EQU 0136AH -CWIDTH EQU 0136BH -CSIZE EQU 0136DH -YS EQU 0136FH -YE EQU 01370H -YW EQU 01371H -SOF EQU 01372H -SW EQU 01374H -SSA EQU 01375H -SEA EQU 01376H -SSW EQU 01377H -CRTMD1 EQU 01379H -CRTMD2 EQU 0137AH -SELCOL EQU 0137BH -PAIWED EQU 0137CH -PALBK EQU 0137EH -PALAD EQU 0137FH -PALTBL EQU 01381H -PAL2T EQU 01385H -PAL4T EQU 01389H -PAL16T EQU 0138DH -CURDT1 EQU 01391H -CURDT2 EQU 01399H -CURDT3 EQU 013A1H -SCRNT0 EQU 013A9H -EMFLG EQU 013C3H -EMPTR EQU 013C4H -EMWP0 EQU 013C6H -EMWP1 EQU 013C8H -PBCN EQU 013CEH -HERRF EQU 013D9H -CTABLE EQU 013DAH -FONTBF EQU 01000H -TEXTBF EQU 02000H -BITBUF EQU 08000H -IBUFE EQU 010F0H -ERRTXT EQU 0FDA0H -VRAM EQU 0D000H -ARAM EQU 0D800H -MMIO EQU 0E000H -TEMPO_ EQU 0E008H -PPI_PA EQU 0E010H -PPI_PB EQU 0E011H -PPI_PC EQU 0E012H -PPI_CTL EQU 0E013H -ATRB EQU 010F0H -PRGSTART EQU 00000H - -; RFS (ROM Filing System) constants for picoZ80 -PORT_LODRAM EQU 0E0H ; OUT: map 0000-0FFF to DRAM -PORT_DRAM EQU 0E1H ; OUT: map D000-FFFF to DRAM -PORT_LOROM EQU 0E2H ; OUT: map 0000-0FFF to Monitor ROM -PORT_MMIO EQU 0E3H ; OUT: map D000-FFFF to VRAM/MMIO/ROM -BNKCTRLRST EQU 0EFF8H ; RFS bank control reset register -BNKCTRL EQU 0EFFFH ; Bank Control register (CS, CLK bits) -HWSPIDATA EQU 0EFFBH ; Hardware SPI Data register (read/write) -HWSPISTART EQU 0EFFCH ; Start SPI transfer register -; SECTORBUF relocated to RFS data area — was EQU 0CE00H (overlapped BASIC stack) -SDCS_ACT EQU 001H ; BNKCTRL: CS LOW (active), BBCLK enable -SDCS_DEACT EQU 003H ; BNKCTRL: CS HIGH (inactive), BBCLK enable -HDRLEN EQU 00040H ; File header length (64 bytes) - -; Tape and build configuration. -TAPECOPY EQU 01200H -BUILD_ORIG EQU 1 -BUILD_RFS EQU 0 - - ; Create an MZF Tape header. - ORG ATRB - - ; Declare the MZF header to bootstrap BASIC from tape/SD. -BOOTATRB: DB 01h ; Code Type, 01 = Machine Code. -BOOTNAME: IF BUILD_ORIG = 1 - DB "BASIC 5Z-008B ", 0Dh ; Title/Name (17 bytes). - ENDIF - IF BUILD_RFS = 1 - DB "BASIC 5Z-008BRFS", 0Dh ; Title/Name (17 bytes). - ENDIF -BOOTSIZE: DW BASICEND - L0000 ; Size of program. -BOOTDTADR: DW TAPECOPY ; Load address of program. -BOOTEXADR: DW EXECSTART + TAPECOPY ; Exec address of program. -BOOTCOMNT: DS 104 - - ORG PRGSTART - -L0000: JP L0CAF ; Cold start entry - JP to initialization - -L0003: JP L028C - -L0006: JP L05EC - - JP L05E8 - -L000C: JP L0BFD - -L000F: JP L05F1 - -L0012: JP L0BFF - -L0015: JP L0BEE - -SVC_ENTRY: JP SVC_DISP ; RST 18H - SVC (Supervisor Call) dispatcher - - JP L041C - -BRKCHK: JP L05C1 - - JP L30CB - - JP L30D2 - -L0027: JP L3114 - - JP L311B - - JP L3153 - -L0030: JP L14BC - - JP L0955 - -L0036: LD B,B - NOP -RST38: JP BREAKZ ; RST 38H - Interrupt handler - - JP L098F - -L003E: JP L0D3F - -L0041: JP L0D30 - - JP L0D05 - - JP L0D20 - - JP L028C - -L004D: DB 000H ; System status / work area -L004E: DB 000H -L004F: DB 0FFH -L0050: DB 000H - DB 0C3H - DB 0EEH - DB 00BH -L0054: DS 2, 000H -L0056: DB 000H -L0057: DB 018H - DB 0C3H - DB 08AH - DB 003H -L005B: DB 000H - DB 027H -L005D: DB 071H - DB 000H -L005F: DB 000H -L0060: DB 0EFH - DB 0C3H - DB 037H - DB 00AH -L0064: DB 000H -L0065: DB 000H -L0066: DB 000H -L0067: DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB 0ADH - DB 007H - DB 0F1H - DB 008H -L0071: DB 015H - DB 008H - DB 012H - DB 008H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 -L0080: DB 000H -L0081: DB 0ADH - DB 007H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB 01EH - DB 008H - DB 0CCH - DB 007H - DB 0F0H - DB 007H - DB LSD1 - DB 007H - DB QDPD - DB 007H - DB 054H - DB 007H - DB 074H - DB 007H - DB 018H - DB 008H - DB 0BAH - DB 008H - DB 012H - DB 008H - DB LSE5 - DB 000H - DB 0ADH - DB 007H - DB LSE5 -L00A0: DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 -.NOP: DB 000H -.HL: DS 11, 000H -.RET: DS 8, 000H -PUSHRA: DS 6, 000H -L00C0: DS 7, 000H -PUSHR: DS 18, 000H -L00D9: DB 000H -L00DA: DI - LD SP,L0000 - IM 1 - OUT (LSE1),A - JP L1800 - -BREAKZ: RET - -BREAKX: DI - OUT (LSE3),A -L00E9: LD A,(HL) - OUT (LSE1),A - EI -ERRORJ: RET - -POPRA: DI - OUT (LSE3),A - LD (HL),A - OUT (LSE1),A - EI - RET - - JP L026A - -L00F9: NOP -L00FA: JP (HL) - -IOOUT: EX (SP),IX - PUSH HL - PUSH BC - PUSH DE -L0100: PUSH AF -L0101: PUSH HL - LD HL,L0114 - EX (SP),HL - JP (IX) - -SKPDE: EX (SP),IX - PUSH HL - PUSH BC - PUSH DE -DEVASC: PUSH HL - LD HL,L0115 - EX (SP),HL - JP (IX) - -L0114: POP AF -L0115: POP DE - POP BC - POP HL - POP IX - RET - -CHKACC: EX (SP),HL - PUSH BC - LD B,(HL) -L011E: INC HL - CP (HL) - JR Z,L0127 ; (+005H) - DJNZ L011E ; (-006H) - INC HL - JR L012A ; (+003H) - -L0127: INC HL - DJNZ L0127 ; (-003H) -L012A: POP BC - EX (SP),HL - RET - -LDDEMI: LD E,(HL) - INC HL - LD D,(HL) - INC HL - RET - -LDDEMD: LD E,(HL) - INC HL - LD D,(HL) - DEC HL - RET - -?CLRHL: XOR A -?SETHL: LD (HL),A - INC HL - DJNZ ?SETHL ; (-004H) - RET - -?CLRDE: XOR A -?SETDE: LD (DE),A - INC DE -L0140: DJNZ ?SETDE ; (-004H) - RET - -LDDEHL: LD A,(HL) - LD (DE),A - INC HL - INC DE - DJNZ LDDEHL ; (-006H) - RET - -LDHLDE: LD A,(DE) - LD (HL),A - INC HL - INC DE - DJNZ LDHLDE ; (-006H) - RET - -INDRCT: PUSH AF - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - POP AF - RET - -ADDHLA: ADD A,L - LD L,A - RET NC - INC H - RET - -INCHLF: INC HL -HLFTCH: LD A,(HL) - CP 020H - JR Z,INCHLF ; (-006H) - RET - -TEST1: CALL HLFTCH - EX (SP),HL -L0168: CP (HL) - INC HL - EX (SP),HL - RET NZ - INC HL - RET - -TESTX: CALL HLFTCH - EX (SP),HL - CP (HL) - INC HL - EX (SP),HL - INC HL - RET Z - LD A,001H - JR L0182 ; (+007H) - -L017B: XOR A - LD HL,L803E - LD HL,L80F6 -L0182: PUSH AF - CALL L0D20 - POP AF - JP L0000 - -; --------------------------------------------------------------------------- -; SVC Dispatch Table (L018A - ~0x0201) -; -; This is a lookup table of 2-byte handler addresses indexed by SVC number. -; SVC_DISP uses: handler = word[L018A + SVC*2]. -; NOTE: The bytes in this table also serve as executable code — several -; labels within the table (L01A2, L01CE, L01D9, L01E0) are jump targets -; from nearby code. This dual-purpose layout prevents conversion to DW. -; -; Key entries: -; SVC #00=3D9D #02=05E8 #05=0908 #20=0D3E #29=1EDB #2A=1F1D -; SVC #2E=19E0 #33=1AE1 #39=1D1B #3A=14DD -; --------------------------------------------------------------------------- -L018A: SBC A,L - DEC A - CALL PE,0E805H - DEC B - RST 038H - DEC BC - LD B,E - INC C - EX AF,AF' - ADD HL,BC - XOR C - RRCA - LD A,00FH - RET Z - DEC BC - JP Z,0D80BH - DEC BC - AND 00BH -L01A2: ADC A,H - LD (BC),A - ADC A,D - INC BC - POP BC - DEC B - AND B - INC D - ADD A,A - LD A,(BC) - ADC A,C - LD A,(BC) - SCF - LD A,(BC) - LD B,(HL) - INC D - HALT - INC D - SUB C - INC D - LD B,014H - LD E,H - LD (BC),A - POP HL - INC C - RET PE - INC C - RST 028H - INC C - PUSH HL - INC D - AND H - INC DE - LD (HL),D - INC DE - LD C,E - LD B,LSE5 - NOP - LD A,00DH - JR NC,L01CE ; (+000H) -L01CE: PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - ADC A,A - ADD HL,BC - LD D,L - ADD HL,BC - SUB B -L01D9: DEC C - RET PE - DEC DE - IN A,(01EH) - DEC E - RRA -L01E0: POP AF - LD E,03DH - LD A,(DE) - CP B - LD A,(DE) - RET PO - ADD HL,DE - LD (HL),C - DEC DE - OR H - INC E - RET C - INC E - RET - - INC E - POP HL - LD A,(DE) - RET NC - JR L01D9 ; (-01cH) - - JR 00243H ; (+04cH) - - ADD HL,DE - RRCA - JR L01A2 ; (-059H) - - DEC DE - DEC DE - DEC E - DB 0DDH - INC D -L0200: PUSH HL - NOP - LD E,B - LD E,067H - INC L - OR (HL) - INC L - LD B,(HL) - INC L - NOP - ADD HL,HL - SBC A,L - LD HL,(02925H) - XOR E - RRA - CALL M,L742A - RLCA - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP -SVC_DISP: EX (SP),HL - PUSH AF - LD A,(HL) - INC HL - PUSH HL - LD HL,L018A - ADD A,A - ADD A,L - JR NC,L0237 ; (+001H) - INC H -L0237: LD L,A - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - LD (00243H),HL - POP HL - POP AF - EX (SP),HL - JP L0000 - -IOCALL: PUSH HL - PUSH DE - LD (00251H),IX - LD IX,00180H - OR A - CALL L0000 - POP DE - POP HL - RET NC - OR A - SCF -L0258: RET Z - JP 00180H - - PUSH DE - LD B,000H -L025F: LD A,(DE) - OR A - JR Z,L0268 ; (+005H) - INC DE - INC B - JR NZ,L025F ; (-008H) - DEC B -L0268: POP DE - RET - -L026A: PUSH HL - LD HL,(L0054) - PUSH HL - PUSH DE - CALL PUSHW - POP DE - LD (HL),000H - POP HL - CALL L028C - JR C,L028A ; (+00eH) - LD A,(L005B) - SUB L - JR NC,L028A ; (+008H) - NEG - LD L,A - LD H,000H - ADD HL,DE - EX DE,HL - OR A -L028A: POP HL - RET - -L028C: PUSH BC - PUSH HL - PUSH DE -L028F: CALL L0391 - CP 00DH - JP Z,L0311 - CP 01BH - JR Z,L02E8 ; (+04dH) - PUSH AF - CP 020H -DEASC: JR C,L02CD ; (+02dH) - JR L02C8 ; (+026H) - -L02A2: LD A,(L004D) - OR A - JR NZ,L02C8 ; (+020H) - LD A,(00B18H) - RRCA - JR C,L02C8 ; (+01aH) - LD A,(L004E) - OR A - JR NZ,L02C8 ; (+014H) - POP AF - LD HL,L06C1 - CP 011H - JR Z,L02C3 ; (+007H) - LD HL,L06E7 - CP 012H - JR NZ,L02C9 ; (+006H) -L02C3: CALL L00FA - JR L028F ; (-039H) - -L02C8: POP AF -L02C9: RST 018H - DB 003H - JR L028F ; (-03eH) - -L02CD: LD A,(L0060) - CP 0FFH - JR NZ,L02A2 ; (-032H) - POP AF - CP 017H - JR NC,L02C9 ; (-010H) - CP 011H - JR C,L02C9 ; (-014H) - LD HL,(00B18H) - BIT 6,L - JR Z,L02C9 ; (-01bH) - RST 018H - DB 004H - JR L028F ; (-059H) - -L02E8: SCF -CKHEX: PUSH AF - LD A,00DH - RST 018H - DB 003H - POP AF - POP DE - POP HL - POP BC - RET - -L02F3: CALL PUSHW -L02F6: LD A,(HL) - OR A -MHALT: RET Z - DEC HL - DEC E - LD A,(L0056) - CP E - JR C,L02F6 ; (-00bH) - RET - -L0302: CALL PUSHW -L0305: INC E - INC HL - LD A,(HL) - OR A - RET Z - LD A,(L0057) - CP E - JR NC,L0305 ; (-00bH) - RET - -L0311: LD HL,(L0054) -SETDFL: CALL L02F3 - LD D,E - CALL L0305 - LD A,(L005B) - LD L,A - LD A,E - SUB D - LD E,A - LD H,D -ADDP1: LD D,L - RST 018H - DB 01EH - LD A,(0005CH) - SUB D -ADDP2: INC A - LD D,A - POP BC - PUSH BC - EXX - PUSH HL - LD HL,(L004F) - EXX -L0334: PUSH DE - PUSH HL -L0336: CALL BREAKX - RST 018H - DB 01CH - INC HL - LD (BC),A - INC BC -L033E: EXX - DEC L -ERRX: JR Z,L0354 ; (+012H) - EXX - DEC D - JR NZ,L0336 ; (-010H) - POP HL - PUSH BC - LD BC,00028H - ADD HL,BC - POP BC - POP DE - DEC E - JR NZ,L0334 ; (-01dH) - PUSH DE - PUSH HL - EXX -L0354: EXX - POP HL - POP DE - EXX - POP HL - EXX - XOR A - LD (BC),A - LD L,C - LD H,B - POP DE - PUSH DE - PUSH HL - OR A - SBC HL,DE - LD B,L - POP HL - LD A,020H - LD D,A - JP Z,CKHEX - DEC HL -L036D: LD A,(HL) - OR A - JR Z,L0376 ; (+005H) - CP D - JR NZ,L037D ; (+009H) - LD (HL),000H -L0376: DEC HL - DJNZ L036D ; (-00cH) - OR A - JP CKHEX - -L037D: LD A,(HL) - OR A - JR NZ,L0383 ; (+002H) - LD (HL),020H -L0383: DEC HL - DJNZ L037D ; (-009H) - OR A - JP CKHEX - - INC A - JR Z,L0406 ; (+079H) - DEC A - JP Z,L041C -L0391: CALL L0426 - CALL SKPDE -SETDNM: CALL L0648 - CALL BREAKX - LD D,A - LD A,(L0060) - LD E,A - CALL POPRA - XOR A - DI - OUT (LSE3),A - LD (MMIO),A - CPL - LD (MMIO),A - OUT (LSE1),A - EI - LD C,000H - EX AF,AF' - PUSH AF - CALL L0459 - LD A,000H -L03BC: EX AF,AF' -L03BD: LD B,010H -L03BF: CALL L043C - CALL L0459 - BIT 1,A - JR NZ,L03BD ; (-00cH) - DJNZ L03BF ; (-00cH) - BIT 0,A - JR Z,L03DB ; (+00cH) - BIT 2,A - JR NZ,L03EC ; (+019H) - EX AF,AF' - DEC A - JR NZ,L03BC ; (-01bH) - LD A,006H - JR L03EE ; (+013H) - -L03DB: PUSH HL - PUSH DE - PUSH BC - LD HL,INKEY1 - LD DE,L0B17 - LD BC,0000AH -L03E7: LDIR - POP BC - POP DE - POP HL -L03EC: LD A,040H -L03EE: LD (003BBH),A -L03F1: CALL L043C - CALL L0494 - OR A - JR Z,L03F1 ; (-009H) - LD (L005F),A - LD C,A - LD A,D - CALL POPRA - POP AF - EX AF,AF' - LD A,C - RET - -L0406: CALL L0426 - PUSH HL - CALL L0494 - LD HL,L005F - OR A - JR Z,L0419 ; (+006H) - CP (HL) - JR NZ,L0419 ; (+003H) - POP HL - XOR A - RET - -L0419: LD (HL),A - POP HL - RET - -L041C: CALL L0426 - CALL L0494 - LD (L005F),A - RET - -L0426: PUSH HL - LD HL,(L1360) - LD A,L - CP H - POP HL - RET Z - EX (SP),HL - INC A - LD (L1360),A - LD HL,L1361 - CALL ADDHLA - LD A,(HL) - POP HL - RET - -L043C: DI - OUT (LSE3),A - LD A,(0E002H) - OUT (LSE1),A - EI - RLCA - RLCA - LD A,C - JR C,L0451 ; (+007H) - OR A - RET Z - LD C,000H - LD A,D -DPALBK: JR L0456 ; (+005H) - -L0451: DEC A - RET Z - LD C,001H - LD A,E -L0456: JP POPRA - -L0459: CALL SKPDE - LD DE,INKEY1 - LD HL,L0B17 - LD BC,L0A00 - DI - OUT (LSE3),A -L0468: LD A,B - ADD A,0EFH - LD (MMIO),A - CP FDPA - LD A,(0E001H) - JR NZ,L0477 ; (+002H) - OR 07FH -L0477: CP 0FFH - JR Z,L047D ; (+002H) - SET 0,C -L047D: EX DE,HL - CP (HL) - LD (HL),A - EX DE,HL - JR Z,L0485 ; (+002H) - SET 1,C -L0485: CPL - AND (HL) - JR Z,L048B ; (+002H) - SET 2,C -L048B: INC HL - INC DE - DJNZ L0468 ; (-027H) - LD A,C -L0490: OUT (LSE1),A - EI -DGCOL: RET - -L0494: CALL SKPDE - LD HL,L0B17 - LD DE,INKEY1 - PUSH HL - PUSH DE - LD BC,0000AH - LDIR - POP HL - POP DE - LD BC,L0AF9 - DI - OUT (LSE3),A - LD A,C - LD (MMIO),A - NOP - LD A,(0E001H) - LD (DE),A -L04B5: LD A,C - LD (MMIO),A - CP FDPA - LD A,(0E001H) - LD (DE),A - JR Z,L04E4 ; (+023H) - CPL - AND (HL) -L04C3: LD (HL),A - INC DE - INC HL - DEC C - DJNZ L04B5 ; (-014H) - OUT (LSE1),A - EI - LD BC,L0A00 -L04CF: DEC HL - LD A,(HL) - OR A - JR NZ,L0507 ; (+033H) - INC C - DJNZ L04CF ; (-008H) - LD B,00AH -L04D9: DEC DE - LD A,(DE) - CP 0FFH - JR NZ,L04E7 ; (+008H) -L04DF: DJNZ L04D9 ; (-008H) -L04E1: XOR A - JR L0490 ; (-054H) - -L04E4: XOR A - JR L04C3 ; (-024H) - -L04E7: LD A,B - CP 002H - JR NZ,L04F5 ; (+009H) -L04EC: LD A,(DE) - AND 081H -DWIDTH: JR NZ,L04DF ; (-012H) - LD A,01BH - JR L0490 ; (-065H) - -L04F5: CP 001H - JR Z,L04E1 ; (-018H) - CP 000H - JR NZ,L04DF ; (-01eH) - LD A,(DE) - AND 001H - JR NZ,L04DF ; (-023H) - LD A,(L005F) - JR L0490 ; (-077H) - -L0507: PUSH AF - LD A,B - LD (004FAH),A - LD A,(HL) - LD (004FFH),A - POP AF - DEC B - JR NZ,L054A ; (+036H) - CALL L05B7 - LD A,(00B18H) - BIT 6,A - JR Z,L04E1 ; (-03dH) - BIT 0,A - LD A,B - JR NZ,L0525 ; (+002H) - ADD A,005H -L0525: CP 00AH - JR NC,L04E1 ; (-048H) - LD L,A - LD H,000H - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,L12C0 - ADD HL,BC - LD A,(HL) - OR A - JR Z,L04E1 ; (-057H) - LD DE,L1360 - LD A,001H - LD (DE),A -L053E: INC DE - LD BC,00010H - LDIR - LD A,(01362H) - JP L0490 - -L054A: CALL L05B7 - LD A,C - ADD A,A - ADD A,A - ADD A,A - ADD A,B - LD L,A - LD H,000H - LD A,(00B18H) - BIT 6,A - LD BC,L0B2B - JR Z,L058E ; (+02fH) - PUSH AF - LD A,(L0060) - CP 043H - JR NZ,L056B ; (+004H) - POP AF - XOR 001H - PUSH AF -L056B: POP AF - BIT 0,A - JR NZ,L0573 ; (+003H) - LD BC,L0B3D -L0573: LD A,(L0060) - CP 0FFH - JR NZ,L0587 ; (+00dH) - LD BC,L0B4F - LD A,(00B18H) - BIT 0,A - JR Z,L0587 ; (+003H) - LD BC,L0B61 -L0587: CALL L13E0 - LD A,C - JP L0490 - -L058E: CALL L13E0 - LD A,C - CP 020H - JP C,L0490 - LD HL,L0B73 - LD B,005H -L059C: CP (HL) - JR Z,L05B1 ; (+012H) - INC HL - DJNZ L059C ; (-006H) - CP 040H - JP C,L04E1 - CP 05BH - JP NC,L04E1 - SUB 040H - JP L0490 - -L05B1: LD A,020H - SUB B - JP L0490 - -L05B7: LD B,008H -L05B9: RRCA - JR C,L05BF ; (+003H) - DJNZ L05B9 ; (-005H) - RET - -L05BF: DEC B - RET - -L05C1: LD A,0E8H - DI - OUT (LSE3),A - LD (MMIO),A - NOP - LD A,(0E001H) - OUT (LSE1),A - EI - AND 081H - RET Z - RLCA - RET C - JR L05C1 ; (-016H) - -L05D7: CALL SKPDE - LD HL,(L0054) - LD A,(L005B) - CP L - RET C - CALL PUSHW - LD A,(HL) - OR A - RET - -L05E8: CALL L05D7 - RET Z -L05EC: LD A,00DH - JP L0BFF - -L05F1: CALL L0BFD - LD A,(L0054) -L05F7: SUB 00AH -LBOUND: JR NC,L05F7 ; (-004H) - ADD A,00AH - RET Z - JR L05F1 ; (-00fH) - -L0600: CALL IOOUT - LD HL,(L0054) - PUSH HL - PUSH AF - RST 018H - DB 01EH - POP AF - RST 018H - DB 01DH - CALL POPRA - SET 3,H - LD DE,(0005DH) - LD A,E - OR D - CALL POPRA - POP HL - INC L -HCLSW: LD A,(0005CH) - CP L - JP NC,L07EC -L0624: LD A,(L005B) - LD L,A - INC H - PUSH HL - CALL PUSHW - LD (HL),001H - POP HL - LD A,(L0057) - CP H - JP NC,L07EC - LD H,A - PUSH HL - CALL L0730 - POP HL - JP L07EC - -PUSHW: LD E,H - LD D,000H - LD HL,.HL - ADD HL,DE - RET - -L0648: LD HL,(L0054) - PUSH DE - PUSH AF - LD D,LSD0 - LD E,L - LD A,H - ADD A,A -HCLS: ADD A,A - ADD A,H - LD L,A - LD H,000H - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,DE -L065B: POP AF - POP DE - RET - -L065E: ADD A,A - LD HL,L0067 - CALL ADDHLA - CALL INDRCT - JP (HL) - -L0669: LD B,D - LD C,E -L066B: LD DE,00028H - EX DE,HL - ADD HL,DE - DEC B - JR Z,L067E ; (+00bH) - PUSH HL - PUSH BC - LD B,000H - CALL L069E - POP BC - POP HL - JR L066B ; (-013H) - -L067E: EX DE,HL - LD E,C -L0680: LD A,(L005D) - LD D,A - LD A,(0005EH) - OR D - LD D,A -L0689: DI - OUT (LSE3),A - LD (HL),000H - SET 3,H - LD (HL),D - RES 3,H - OUT (LSE1),A - EI - INC HL - DEC E - JR NZ,L0689 ; (-011H) - RET - -L069B: LD BC,00028H -L069E: LD A,0B0H - JR L06A4 ; (+002H) - -L06A2: LD A,0B8H -L06A4: LD (006BCH),A - PUSH HL - PUSH DE - PUSH BC - RES 3,H - RES 3,D - CALL L06B8 - POP BC - POP DE - POP HL - SET 3,H - SET 3,D -L06B8: DI - OUT (LSE3),A - LDIR - OUT (LSE1),A - EI - RET - -L06C1: LD HL,VRAM - LD DE,0D7D0H - CALL L069B - LD HL,0D028H - LD DE,VRAM - LD B,032H -L06D2: PUSH BC - CALL L069B - POP BC - DJNZ L06D2 ; (-007H) - LD HL,.HL - LD D,H - LD E,L - LD A,(HL) - INC HL - LD BC,00031H - LDIR - LD (DE),A - RET - -L06E7: LD HL,0D7CFH - LD DE,0D7F7H - LD B,032H -L06EF: PUSH BC - LD BC,00028H - CALL L06A2 - POP BC - DJNZ L06EF ; (-00aH) - LD HL,0D7D0H - LD DE,VRAM - CALL L069B - LD HL,L00D9 - LD D,H - LD E,L - DEC HL - LD A,(DE) - LD BC,00031H - LDDR - LD (DE),A - RET - -L0710: LD HL,0D3E8H - XOR A - CALL POPRA - SET 3,H - LD A,(L005D) - CALL POPRA - LD DE,0D3E9H - LD BC,L0027 - CALL L069E - CALL L06C1 - XOR A - LD (L00C0),A - RET - -L0730: LD A,(L004E) - OR A - JR Z,L0710 ; (-026H) - CALL L075F - CALL L0669 - LD A,(L0056) - LD H,A - CALL PUSHW - LD A,(L0057) - SUB E - LD B,A - LD (HL),000H - INC HL - LD D,H - LD E,L - INC DE - CALL NZ,LDHLDE - LD (HL),000H - RET - -L0754: LD A,(L005B) - LD L,A - LD A,(L0056) - LD H,A - JP L07EC - -L075F: LD HL,(L005B) - LD DE,(00056H) - LD A,D -L0767: SUB E - INC A - LD D,A - LD A,H - SUB L - INC A -L076D: LD E,A - CALL L0754 - JP L0648 - - CALL SKPDE - LD A,(L004E) -L077A: OR A - JR NZ,L078B ; (+00eH) - LD A,031H - LD (L0057),A - CALL L078B - LD A,018H - LD (L0057),A - RET - -L078B: CALL L075F -L078E: PUSH DE - PUSH HL - CALL L0680 - POP HL - LD BC,00028H - ADD HL,BC - POP DE - DEC D - JR NZ,L078E ; (-00eH) - LD A,(L0056) - LD H,A - CALL PUSHW - LD A,(L0057) - SUB E - ADD A,002H - LD B,A - JP ?CLRHL - - XOR A - LD (0091FH),A - LD HL,(L0054) - PUSH HL - INC H - CALL PUSHW - LD A,(L0057) - LD D,A -L07BD: LD A,(HL) - OR A - JR Z,L07C7 ; (+006H) - INC HL - INC E - LD A,D - CP E - JR NC,L07BD ; (-00aH) -L07C7: DEC E - POP HL - LD H,E - JR L07DB ; (+00fH) - - LD HL,(L0054) - JR L07DF ; (+00eH) - - LD HL,(L0054) - INC L - LD A,(0005CH) - CP L - JR NC,L07EC ; (+011H) -L07DB: LD A,(L005B) - LD L,A -L07DF: INC H - LD A,(L0057) - CP H - JR NC,L07EC ; (+006H) - LD H,A - PUSH HL - CALL L0730 - POP HL -L07EC: LD (L0054),HL - RET - - LD HL,(L0054) - JR L0802 ; (+00dH) - - LD HL,(L0054) - LD A,(L005B) - CP L - JR C,0080DH ; (+00fH) - LD A,(0005CH) - LD L,A -L0802: LD A,(L0056) - CP H - JR C,0080FH ; (+007H) - LD A,(L0056) - LD H,A - LD A,02DH - LD A,025H - JR L07EC ; (-026H) - - LD A,0EFH - LD HL,L433E - LD HL,0FF3EH - LD (L0060),A - RET - - LD HL,(L0054) - LD BC,(0005BH) - LD A,L - DEC L - INC C - CP C - JR NC,L0837 ; (+00cH) - PUSH HL - CALL PUSHW - LD A,(HL) - POP HL - INC L - OR A - JR Z,L0874 ; (+03fH) - LD L,B - DEC H -L0837: LD DE,(00054H) - LD (L0054),HL -L083E: EX DE,HL - LD A,(L005B) - CP L - JR C,L086D ; (+028H) -L0845: PUSH HL - CALL PUSHW - LD A,(HL) - POP HL - OR A - JR Z,L085D ; (+00fH) - CALL L0882 - PUSH HL - LD A,(0005CH) - LD L,A - DEC H - CALL L089A - POP HL - JR L0874 ; (+017H) - -L085D: LD A,(0005CH) - LD L,A - DEC H -L0862: LD DE,(0005DH) - LD A,E - OR D - LD E,A - LD D,000H - JR L089A ; (+02dH) - -L086D: CALL L0882 - DEC BC - CALL L0895 -L0874: INC L - LD A,(0005CH) - CP L - JR NC,L086D ; (-00eH) - LD A,(L005B) - LD L,A - INC H - JR L0845 ; (-03dH) - -L0882: PUSH HL - RST 018H - DB 01EH - SET 3,H - CALL BREAKX - LD E,A - RES 3,H - CALL BREAKX - LD D,A - LD B,H - LD C,L - POP HL - RET - -L0895: PUSH HL - LD H,B - LD L,C - JR L089D ; (+003H) - -L089A: PUSH HL - RST 018H - DB 01EH -L089D: SET 3,H - LD A,E - CALL POPRA - RES 3,H - LD A,D - CALL POPRA - LD B,H - LD C,L - POP HL - RET - -L08AD: LD HL,(L0054) - CALL L0302 - DEC E - LD H,E - LD A,(0005CH) - LD L,A - RET - - CALL L08AD - CALL L0882 - LD A,0F0H - CP D - JR Z,L08C8 ; (+003H) - XOR A - CP D - RET NZ -L08C8: LD BC,(0005BH) - EX DE,HL - LD HL,(L0054) - OR A - SBC HL,DE - EX DE,HL - JR Z,L0862 ; (-074H) - LD A,C - CP L - JR NC,L08E4 ; (+00aH) - DEC L - CALL L0882 - INC BC - CALL L0895 - JR L08C8 ; (-01cH) - -L08E4: PUSH HL - LD L,B - DEC H - CALL L0882 - EX (SP),HL - CALL L089A - POP HL - JR L08C8 ; (-029H) - - LD HL,L0071 - LD (L005D),HL -L08F7: LD HL,L1800 - LD (L0056),HL - LD HL,L2700 - LD (L005B),HL - XOR A - LD (L004E),A - RET - - CALL SKPDE -L090B: LD A,(DE) - INC DE - OR A - RET Z - LD C,A - CP 005H - JR Z,L0933 ; (+01fH) - CP 006H - JR Z,L0932 ; (+01aH) - SUB 041H - CP 01AH - JR NC,HCURON ; (+00dH) - LD A,000H - OR A - JR Z,HCURON ; (+008H) - LD A,C - LD HL,L08F7 - CALL ADDHLA - LD C,(HL) -HCURON: LD A,C - RST 018H - DB 003H - CP 00DH - JR NZ,L090B ; (-027H) -L0932: XOR A -L0933: LD (0091FH),A - JR L090B ; (-02dH) - - AND C - SBC A,D - SBC A,A -HCUROF: SBC A,H - SUB D - XOR D - SUB A - SBC A,B - AND (HL) - XOR A - XOR C - CP B - OR E -FLASH: OR B - OR A - SBC A,(HL) - AND B - SBC A,L - AND H - SUB (HL) - AND L -CURMOV: XOR E - AND E - SBC A,E - CP L - AND D - NOP - NOP -L0954: NOP -L0955: PUSH DE - PUSH HL - LD (L0954),A - LD (00952H),DE - LD HL,0E007H - DI - OUT (LSE3),A - LD (HL),0B4H - LD (HL),074H - DEC HL - LD (HL),0C0H - LD (HL),0A8H - DEC HL - LD (HL),002H - LD (HL),000H -L0972: LD HL,0E007H - LD (HL),080H -PONTCB: DEC HL - LD E,(HL) - LD D,(HL) -PONTB: LD HL,0A8C0H - OR A - SBC HL,DE - JR NZ,L0972 ; (-010H) - LD HL,0E005H - LD (HL),0F6H - LD (HL),079H - OUT (LSE1),A - EI - POP HL - POP DE - RET - -L098F: PUSH BC - PUSH HL - DI - OUT (LSE3),A - LD HL,0E007H - LD (HL),080H - LD (HL),040H - DEC HL - LD E,(HL) - LD D,(HL) - DEC HL - LD C,(HL) - LD B,(HL) - OUT (LSE1),A - EI - PUSH BC - LD A,D -L09A6: OR E - JR NZ,L09AC ; (+003H) - LD DE,0A8C0H -L09AC: LD HL,0A8C0H - LD A,(L0954) - OR A - SBC HL,DE - LD DE,L5460 - CALL L09EB - OR A - LD DE,(00952H) - RR D - RR E - PUSH AF - ADD HL,DE - LD DE,L5460 - CALL L09EB - LD C,A - ADD HL,HL - EX DE,HL - POP AF - LD A,C - POP BC - PUSH AF - OR A - LD HL,L3CFB - SBC HL,BC - JR C,L09DC ; (+001H) - INC DE -L09DC: POP AF - JR NC,L09E0 ; (+001H) - INC DE -L09E0: EX DE,HL - LD DE,0A8C0H - CALL L09EB - EX DE,HL - POP HL - POP BC - RET - -L09EB: OR A - SBC HL,DE - JR NC,L09F2 ; (+002H) - ADD HL,DE - RET - -L09F2: XOR 001H - RET - -L09F5: LD A,04EH - DEC L - RET Z - LD A,056H - DEC L - RET Z - LD A,05EH - DEC L -L0A00: RET Z -L0A01: LD A,066H - DEC L - RET - -L0A05: PUSH DE - LD (00A23H),A - LD DE,0FFFFH - LD HL,0E002H - DI - OUT (LSE3),A -L0A12: BIT 7,(HL) - JR Z,L0A12 ; (-004H) -L0A16: BIT 7,(HL) - JR NZ,L0A16 ; (-004H) -L0A1A: LD L,008H - LD A,011H -L0A1E: DEC A - JR NZ,L0A1E ; (-003H) -L0A21: INC DE - BIT 0,(HL) - JR Z,L0A21 ; (-005H) - OUT (LSE1),A - EI - LD A,D - OR A - LD A,E - JR Z,L0A30 ; (+002H) - LD A,0FFH -L0A30: LD (L0066),A - POP DE - POP HL - SCF - RET - - INC A - PUSH HL - LD L,A - CALL L09F5 - JR Z,L0A05 ; (-03aH) - CALL L09F5 - LD (00A75H),A - LD (00A55H),A - LD HL,0E002H - DI - OUT (LSE3),A -L0A4E: BIT 7,(HL) - JR Z,L0A4E ; (-004H) - LD L,008H - BIT 0,(HL) - LD A,L - JR Z,L0A5A ; (+001H) - XOR A -L0A5A: LD (00A7CH),A - OUT (LSE1),A - LD A,009H -L0A61: PUSH AF - XOR A -L0A63: DEC A - JR NZ,L0A63 ; (-003H) - POP AF -BINPUT: DEC A - JR NZ,L0A61 ; (-009H) - OUT (LSE3),A - LD L,002H -L0A6E: BIT 7,(HL) - JR Z,L0A6E ; (-004H) - LD L,008H - BIT 0,(HL) - LD A,L - JR Z,L0A7A ; (+001H) - XOR A -L0A7A: LD L,A - LD A,000H - AND L - LD (L0065),A - OUT (LSE1),A - EI -GETL: POP HL - OR A - RET - - DI - RET - - EI - RET - - DS 110, 000H -L0AF9: DS 30, 000H -L0B17: DS 3, 000H -INKEY$: DS 7, 000H -INKEY1: DS 10, 000H -L0B2B: JP PE,0900BH - RLA - CALL M,00019H - DEC SP - LD A,(L180D) - DJNZ L0B4A ; (+012H) - LD DE,01413H - CCF - CPL -L0B3D: LD HL,(0900CH) - RLA - EI - DEC B - NOP - DEC HL - LD HL,(0160DH) - DEC D - LD (DE),A -L0B4A: LD DE,01413H - ADD A,05FH -L0B4F: JP (HL) - - INC C - SUB B - RLA - LD L,B - DEC B - NOP - ADD A,H - JP (HL) - - DEC C - LD D,015H - LD (DE),A - LD DE,01413H - ADC A,A - ADC A,E -L0B61: LD L,D - INC C - SUB B - RLA - LD L,H - ADD HL,DE - NOP - CP 089H - DEC C - LD D,015H - LD (DE),A - LD DE,01413H - ADC A,D - LD A,E -L0B73: LD E,E - LD E,H - LD E,L - LD E,(HL) - CPL -$CRT: DB 091H,00BH,"CRT",000H,08AH ; $CRT - CRT device descriptor - DS 2, 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H -INKEYF: DB 0AAH - DB 00BH - DB 0B5H - DB 00BH - DB 0C4H - DB 00BH -$KB_: DB 000H ; $KB - Keyboard device descriptor - DB 00FH - DB 04BH - DB 042H - DS 2, 000H - DB 081H - DS 2, 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 -INKEY0: DB 000H - DB LSE5 - DB 000H - DB 0AAH - DB 00BH - DB LSE5 - DB 000H - DB LSE5 - DB 000H - RST 018H - DB 00CH - LD A,080H - RET C - JP C,0017DH - RST 018H - DB 017H - RET - - EX AF,AF' - LD HL,L0BFF -L0BB9: LD A,(DISPX) - OR A - JR Z,L0BC2 ; (+003H) - LD HL,L0C43 -L0BC2: EX AF,AF' - JP (HL) - - LD A,(L0054) - RET - - LD A,00DH -L0BCA: PUSH AF - LD A,(FILOUT) -L0BCE: OR A - JR NZ,L0BD4 ; (+003H) - POP AF - JR L0BFF ; (+02bH) - -L0BD4: POP AF - JP L0F3E - - PUSH AF - LD A,(FILOUT) - OR A - JR NZ,L0BE2 ; (+003H) - POP AF - JR L0C43 ; (+061H) - -L0BE2: POP AF - JP L0F2E - - CALL SKPDE - LD HL,L0BCA - JR L0BF4 ; (+006H) - -L0BEE: CALL SKPDE - LD HL,L0BFF -L0BF4: LD A,(DE) - OR A - RET Z - CALL L00FA - INC DE - JR L0BF4 ; (-009H) - -L0BFD: LD A,020H -L0BFF: CALL IOOUT -L0C02: LD C,A - LD A,(L004D) - OR A - JR Z,L0C3A ; (+031H) - LD A,C - CP 020H - JR NC,L0C37 ; (+029H) - LD DE,(00054H) - LD HL,(L005B) - CP 014H - JR Z,L0C21 ; (+008H) - CP 012H - JR NZ,L0C26 ; (+009H) - LD HL,(L0056) - LD E,D -L0C21: LD A,L - CP E - JP NC,L0D3F -L0C26: LD A,C - LD HL,L0C8F - ADD A,L - LD L,A - JR NC,L0C2F ; (+001H) - INC H -L0C2F: LD A,(HL) - INC A - JR Z,L0C3A ; (+007H) - DEC A - JP Z,L0D3F -L0C37: CALL L0C60 -L0C3A: LD A,C - CP 020H - JP C,L065E - JP L0600 - -L0C43: CALL IOOUT - LD C,A - CP 00DH - JR Z,L0C02 ; (-049H) - CALL L0600 - LD A,(L004D) - OR A - RET Z - LD A,C - CP 011H - JR C,L0C8A ; (+032H) - CP 017H - JR C,L0C8C ; (+030H) - CP 020H - JR C,L0C8A ; (+02aH) -L0C60: CP 060H - JR C,L0C8C ; (+028H) - CALL CHKACC - ADD HL,BC - ADD A,B - LD A,E - ADD A,08BH - RST 010H - RST 008H - CALL M,0FFFBH - JR Z,L0C8C ; (+019H) - CP 092H - JR C,L0C8A ; (+013H) - CALL CHKACC - ADD HL,BC - SBC A,C - SUB L - XOR H - AND A - OR H - OR C - OR (HL) - OR L - CP H - JR Z,L0C8A ; (+004H) - CP 0BFH - JR C,L0C8C ; (+002H) -L0C8A: LD A,02EH -L0C8C: JP L0FA9 - -; --------------------------------------------------------------------------- -; Control character translation table (indexed by char code 0x00-0x1F) -; Used by L0C26: HL = L0C8F + C, A = (HL). -; 0x00 → handle via L0D3F, 0xFF → skip, other → translate via L0C60 -; --------------------------------------------------------------------------- -L0C8F: DB 000H,000H,000H,000H ; 00-03: NUL,SOH,STX,ETX → L0D3F - DB 0FFH,0FFH,0FFH,01DH ; 04-07: EOT,ENQ,ACK → skip; BEL → 0x1D - DB 000H,000H,000H,000H ; 08-0B: BS,HT,LF,VT → L0D3F - DB 000H,00DH,000H,000H ; 0C-0F: FF → L0D3F; CR → 0x0D; SO,SI → L0D3F - DB 000H,00AH,003H,020H ; 10-13: DLE → L0D3F; DC1 → 0x0A; DC2 → 0x03; DC3 → 0x20 - DB 00EH,000H,000H,0FFH ; 14-17: DC4 → 0x0E; NAK,SYN → L0D3F; ETB → skip - DB 000H,0FFH,0FFH,00DH ; 18-1B: CAN → L0D3F; EM,SUB → skip; ESC → 0x0D - DB 0FFH,000H,000H,000H ; 1C-1F: FS → skip; GS,RS,US → L0D3F -L0CAF: DI - XOR A - LD (L004D),A - LD (FILOUT),A - LD SP,L0000 - OUT (LSE1),A - LD A,004H - RST 018H - DB 003H -L0CC0: LD HL,L1B18 - XOR A - LD (L0CC0),A - LD D,A - LD E,A - RST 018H - DB 026H - LD DE,$CMT - LD A,B - DEC A - JR Z,L0CDB ; (+009H) - LD DE,$FD - DEC A - JR Z,L0CDB ; (+003H) - LD DE,$QD -L0CDB: LD A,C - RST 018H - DB 03AH - JP L00DA - - LD HL,(TEXTED) - ADD HL,DE - LD (TEXTED),HL - LD HL,(VARST) - ADD HL,DE - LD (VARST),HL - LD HL,(STRST) - ADD HL,DE - LD (STRST),HL - LD HL,(VARED) - ADD HL,DE - LD (VARED),HL - LD HL,(TMPEND) - ADD HL,DE - LD (TMPEND),HL - RET - -L0D05: LD HL,(00B15H) -L0D08: LD A,H - OR L - JR Z,L0D20 ; (+014H) - PUSH DE - EX DE,HL - LD HL,0E004H - DI - OUT (LSE3),A - LD (HL),E - LD (HL),D - LD A,001H - LD (TEMPO_),A - OUT (LSE1),A - EI - POP DE - RET - -L0D20: LD A,036H -BRKEY: DI - OUT (LSE3),A - LD (0E007H),A - XOR A - LD (TEMPO_),A - OUT (LSE1),A - EI - RET - -L0D30: PUSH AF - PUSH BC - AND 00FH - LD B,A - LD A,008H - SUB B - LD (0119EH),A - POP BC - POP AF - RET - -L0D3E: XOR A -L0D3F: PUSH HL - LD HL,L04EC - JR Z,L0D4E ; (+009H) - CP 001H -L0D47: JR Z,L0D59 ; (+010H) - CALL L0D08 - POP HL - RET - -L0D4E: CALL L0D08 - LD HL,L2710 -L0D54: DEC HL - LD A,H - OR L - JR NZ,L0D54 ; (-005H) -L0D59: CALL L0D20 - POP HL - RET - -; --------------------------------------------------------------------------- -; $USR Device Descriptor (User-defined device) -; -; Handlers pointing to 0x00E5 (monitor ROM) are stubs (no-op/error). -; ZRO and ZWO share the same handler (USR_RO). -; ZINP and ZOUT share the same handler (USR_IO). -; ZWDIR and ZFREE are not emitted explicitly — USR_RO code at 0x0D77 -; overlaps these 2 DW fields (the first 4 bytes of USR_RO: 21 01 10 DF -; encode ZWDIR=0x0121, ZFREE=0xDF10). Neither is called (flags1 bit7=1). -; --------------------------------------------------------------------------- -$USR: DW 00000H ; Next device = NULL (end of chain) -L0D60: DB "USR",000H ; Device name - DB 09FH ; flags1: bit7=1 (no dir/free), bit4-0=0x1F - DB 000H ; flags2 - DB 000H ; dirmx: 0 - DW 000E5H ; ZINIT (monitor ROM stub) - DW USR_RO ; ZRO handler (read/write open) - DW USR_RO ; ZWO handler (same as ZRO) - DW 000E5H ; ZCL (monitor ROM stub) - DW 000E5H ; ZKL (monitor ROM stub) - DW USR_IO ; ZINP handler (user I/O dispatch) - DW USR_IO ; ZOUT handler (same as ZINP) - DW 000E5H ; ZDELT (monitor ROM stub) -; ZWDIR/ZFREE implicit — next 4 bytes are USR_RO code, read as DW pointers -; -; --------------------------------------------------------------------------- -; USR_RO - User device open (ZRO/ZWO handler) -; -; Calls SVC #13H to find the USR device entry point, stores it in ZWRK1. -; --------------------------------------------------------------------------- -USR_RO: LD HL,ELMD1 - RST 018H - DB 013H - LD A,D - OR E - JP Z,01F9AH - LD (ZWRK1),DE - RET -; -; --------------------------------------------------------------------------- -; USR_IO - User device I/O (ZINP/ZOUT handler) -; -; Dispatches to the user-supplied routine address stored in ZWRK1. -; --------------------------------------------------------------------------- -USR_IO: LD HL,(ZWRK1) - JP (HL) - - NOP - NOP - NOP - NOP - NOP - NOP - LD A,(ZFLAG1) - BIT 7,A - JP NZ,01F97H - JP L1989 - -L0D9B: LD B,(IY+000H) - CALL L1C39 - LD A,(ELMD) - CP B - JP NZ,01F9DH - RET - -L0DA9: LD A,(L004D) - OR A - LD A,(LPOSB) - RET Z - LD A,(L0054) - RET - - DS 40, 000H -EQTBL: DS 25, 000H -$KB: DS 10, 000H -L0E00: DS 16, 000H -L0E10: DS 46, 000H -L0E3E: DS 35, 000H -CRT1C: DS 82, 000H -PLTOTX: DS 77, 000H -$LPT: DB 0F7H,"/LPT",000H,08AH ; $LPT - Line printer device descriptor - DS 2, 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DS 3, 000H - DB 027H - DB 00FH - DB 019H - DB 00FH - JP L0DA9 - - RET - -L0F1D: LD A,00DH - CALL L0FA9 - XOR A - LD (LPOSB),A - RET - - LD HL,DISPX - BIT 0,(HL) - JR Z,L0F3E ; (+010H) -L0F2E: CALL IOOUT - LD B,A - LD A,(L004D) - OR A - LD A,B - LD E,0FFH - JR Z,L0F4E ; (+013H) - RST 018H - DB 004H - RET - -L0F3E: CALL IOOUT - LD B,A - LD A,(L004D) - OR A - LD A,B - LD E,000H - JR Z,L0F4E ; (+003H) - RST 018H - DB 003H - RET - -L0F4E: LD A,(PNMODE) - CP 001H - LD A,044H - JP NZ,00180H - LD A,B - CP 00DH - JR Z,L0F1D ; (-040H) - LD HL,LPOSB - INC (HL) - SUB 005H - CP 002H - JR C,L0F7C ; (+015H) - LD A,B - CP 020H - JR NC,L0FB0 ; (+044H) - BIT 0,E - JR Z,L0F80 ; (+010H) - SUB 011H - CP 006H - JR C,L0FB1 ; (+03bH) - SUB QDPC - CP 002H - JR NC,L0FAE ; (+032H) -L0F7C: LD A,02EH - JR L0FB0 ; (+030H) - -L0F80: LD HL,LPOSB - DEC (HL) - LD A,B - CP 015H - LD B,00FH - JR Z,L0FB1 ; (+026H) - CP 011H - LD B,009H - JR Z,L0FB1 ; (+020H) - CP 012H - LD B,00BH - JR Z,L0FB1 ; (+01aH) - CP 016H - JR NZ,L0FB0 ; (+015H) - LD A,00CH - CALL L0FB0 - LD A,00AH - CALL L0FB0 - LD A,003H - JR L0FB0 ; (+007H) - -L0FA9: CALL IOOUT - JR L0FB0 ; (+002H) - -L0FAE: LD A,020H -L0FB0: LD B,A -L0FB1: CALL L0FCA - LD A,B - DI - CALL L0FBB - EI - RET - -L0FBB: OUT (0FFH),A - LD A,080H - OUT (0FEH),A - LD A,001H - CALL L0FCB -L0FC6: XOR A - OUT (0FEH),A - RET - -L0FCA: XOR A -L0FCB: CALL SKPDE - LD C,A - LD B,00EH -L0FD1: LD HL,0E678H -L0FD4: IN A,(0FEH) - AND 00DH - CP C - RET Z - DEC HL - LD A,H - OR L - NOP - NOP - JR NZ,L0FD4 ; (-00dH) - DJNZ L0FD1 ; (-012H) - XOR A - LD (L004D),A - CALL L0FC6 - LD A,041H - JP L0182 - - DS 17, 000H ; =========================================================================== -; BASIC System Workspace (0x1000-0x109F) +; Build configuration — set these flags to select the build variant: +; +; BUILD_RFS=0, BUILD_TAPE=0 : Original BASIC (QD boot, no RFS) +; BUILD_RFS=0, BUILD_TAPE=1 : Original BASIC (Tape/CMT/RFS ROM boot) +; BUILD_RFS=1, BUILD_TAPE=0 : RFS Enhanced BASIC (QD boot) +; BUILD_RFS=1, BUILD_TAPE=1 : RFS Enhanced BASIC (Tape/CMT/RFS ROM boot) ; =========================================================================== -; -; --- ELMD: File header / element data (0x1000-0x103F) --- -ELMD: DB 000H ; File type (0=obj, 1=BTX, 2=BASIC, 3=data, 5=MZF) -ELMD1: DS 17, 000H ; Filename (17 bytes, null-padded) -ELMD18: DW 00000H ; File size (bytes) -ELMD20: DW 00000H ; Load address / BASIC program size -ELMD22: DW 00000H ; Execution address -ELMD24: DW 00000H ; Reserved -ELMD26: DW 00000H ; Reserved - DS 2, 000H -ELMD30: DW 00000H ; Reserved -ELMD32: DW 00000H ; Reserved - DS 6, 000H -SDDRIVENO: DB 000H ; SD drive number (numeric 0-9) -CMTFILENO: DB 000H ; Sequential file counter - DS 20, 000H -L103E: DS 2, 000H -; -; --- Device workspace (0x1040-0x106F) --- -ZTOP: DW 00002H ; Top of device chain pointer -ZLOG: DB 000H ; Logical unit number -ZRWX: DB 000H ; Read/write mode -ZEQT: DW 00000H ; Equipment/device type -ZCH: DB 000H ; Channel number -ZEOF: DB 000H ; End of file flag -ZWRK1: DW 00000H ; Work area 1 (16-bit) -ZNXT: DW 00000H ; Next byte pointer -ZDEVNM: DS 4, 000H ; Active device name (4 bytes) -ZFLAG1: DB 001H ; Active device flags1 -ZFLAG2: DB 000H ; Active device flags2 -ZDIRMX: DB 000H ; Active device max dir entries -ZINIT: DW 00000H ; Active ZINIT function pointer -ZRO: DW 00000H ; Active ZRO function pointer -ZWO: DW 00000H ; Active ZWO function pointer -ZCL: DW 00000H ; Active ZCL function pointer -ZKL: DW 00000H ; Active ZKL function pointer -ZINP: DW 00000H ; Active ZINP function pointer -ZOUT: DW 00000H ; Active ZOUT function pointer -ZDELT: DW 00000H ; Active ZDELT function pointer -ZWDIR: DW 00000H ; Active ZWDIR function pointer -ZFREE: DW 00000H ; Active ZFREE function pointer - DS 2, 000H -DCHAN: DB 000H ; Default channel -DDEV: DW 00000H ; Default device descriptor pointer -_CRT: DW 00B78H ; CRT device descriptor pointer -_LPT: DW 00F00H ; LPT device descriptor pointer -; -; --- BASIC memory pointers (0x1070-0x109F) --- -TEXTST: DW 00000H ; Start of BASIC text -TEXTED: DW 00000H ; End of BASIC text -VARST: DW 00000H ; Start of variables -STRST: DW 00000H ; Start of string space -VARED: DW 00000H ; End of variables -TMPEND: DW 00000H ; End of temporary area -INTFAC: DW 00000H ; Integer accumulator -MEMLMT: DW 00000H ; Memory limit -MEMMAX: DW 0FF00H ; Maximum memory -CURXY: DW 00000H ; Cursor X,Y position -POSADR: DW 00000H ; Cursor VRAM address -BITADR: DW 00000H ; Bit address -POINTX: DW 00000H ; Graphics point X -POINTY: DW 00000H ; Graphics point Y -CURFLG: DB 000H ; Cursor flag -CURMAK: DB 000H ; Cursor make flag -CMTMSG: DB 000H ; CMT message flag -INPFLG: DB 000H ; Input flag -DISPX: DB 000H ; Display X position -FILOUT: DB 000H ; File output flag -PSEL: DB 001H ; Printer select -PCRLF: DB 000H ; Printer CR/LF mode -LPT_TM: DB 00EH ; LPT timeout -LPOSB: DB 000H ; LPT position -PSMAL: DB 000H ; Printer small flag -PNMODE: DB 001H ; Printer mode -DMD: DB 000H ; Display mode -MEMOP: DB 000H ; Memory operation flag -PWMODE: DB 000H ; Power mode -CMODE: DB 000H ; Color mode -CPLANE: DB 000H ; Color plane -MAXCF: DB 000H ; Max color flag -PMASK: DB 000H ; Plane mask -GMODE: DB 000H ; Graphics mode - DS 80, 000H ; 0x10A0-0x10EF (padding to L10F0) -L10F0: DS 78, 000H -L113E: DS 84, 000H - RST 028H - NOP - NOP - NOP - NOP -SUMDT: NOP - NOP - NOP - NOP - NOP - NOP - LD BC,00504H - DS 3, 000H -KEYBM1: DB 000H -KEYBUF: DS 154, 000H -L123E: DS 57, 000H -L1277: DS 73, 000H -; --------------------------------------------------------------------------- -; Function key definition table (F1-F10 defaults, stored in RAM) -; Each entry: 1 byte length + string + zero-padded to 16 bytes total. -; Loaded at startup, modifiable via DEF KEY statement. -; --------------------------------------------------------------------------- -L12C0: DB 007H,"RUN",020H,020H,020H,00DH ; F1: RUN - DS 8, 000H - DB 005H,"LIST",020H ; F2: LIST - DS 10, 000H - DB 005H,"AUTO",020H ; F3: AUTO - DS 10, 000H - DB 006H,"RENUM",020H ; F4: RENUM - DS 9, 000H - DB 004H,"DIR",020H ; F5: DIR - DS 11, 000H - DB 005H,"CHR$(" ; F6: CHR$( - DS 10, 000H - DB 008H,"DEF KEY(" ; F7: DEF KEY( - DS 7, 000H - DB 004H,"CONT" ; F8: CONT - DS 9, 000H -L133E: DS 2, 000H ; (last 2 bytes of F8 entry, used as workspace) - DB 006H,"SAVE",020H,020H ; F9: SAVE - DS 9, 000H - DB 006H,"LOAD",020H,020H ; F10: LOAD - DS 9, 000H -L1360: DB 000H ; F11: (empty/unused) -L1361: DS 15, 000H ; (F11 padding, used as workspace) - DB 000H ; End marker -L1371: DB 000H ; End marker - CALL L13D8 - JR Z,L1385 ; (+00eH) -L1377: CP 010H - JR C,L139B ; (+020H) - CP 080H - JR Z,L13A1 ; (+022H) - CP 0C0H - JR Z,L13A1 ; (+01eH) - JR L1391 ; (+00cH) +BUILD_RFS EQU 1 ; 0 = original BASIC, 1 = RFS enhancements +BUILD_TAPE EQU 1 ; 0 = QD boot, 1 = Tape/CMT/RFS ROM boot -L1385: CP 003H - JR Z,L139B ; (+012H) - CP 005H - JR Z,L139E ; (+011H) - CP 006H - JR Z,L139E ; (+00dH) -L1391: DI - OUT (LSE2),A - CALL L0BB9 - OUT (LSE0),A - EI - RET - -L139B: LD A,0F0H - RET - -L139E: ADD A,0C9H - RET - -L13A1: SUB 040H - RET - -L13A4: CP 0F0H - JR NC,L13CF ; (+027H) - CP 073H - JR Z,L139B ; (-011H) - CALL L13D8 - JR Z,L13BB ; (+00aH) - CP 040H - JR Z,L13D5 ; (+020H) - CP 080H - JR Z,L13D5 ; (+01cH) - JR L13C3 ; (+008H) - -L13BB: CP 0CEH - JR Z,L13D2 ; (+013H) - CP 0CFH - JR Z,L13D2 ; (+00fH) -L13C3: DI - OUT (LSE2),A - CALL L0BCE - OUT (LSE0),A - EI - CP 0F0H - RET NZ -L13CF: LD A,020H - RET - -L13D2: SUB 0C9H - RET - -L13D5: ADD A,040H - RET - -L13D8: PUSH HL - LD HL,L0036 - BIT 6,(HL) - POP HL - RET - -L13E0: PUSH AF - LD A,L - SUB 008H - JR C,L13EA ; (+004H) - SUB 030H - JR C,L13F1 ; (+007H) -L13EA: ADD A,00AH - LD L,A - ADD HL,BC - LD C,(HL) - POP AF - RET - -L13F1: LD A,(BC) - PUSH AF - INC BC - LD A,(BC) - LD B,A - POP AF - LD C,A - ADD HL,BC - DI - OUT (LSE2),A - LD A,(HL) - OUT (LSE0),A - EI - CALL L13A4 - LD C,A - POP AF - RET - - PUSH HL - PUSH BC - PUSH DE - LD DE,L2710 - CALL L142C - LD DE,003E8H - CALL L142C - LD DE,L0064 - CALL L142C - LD DE,0000AH - CALL L142C - LD A,L - POP DE - OR 030H - LD (DE),A - INC DE - XOR A - LD (DE),A - POP BC - POP HL - RET - -L142C: LD A,0FFH -L142E: INC A - OR A - SBC HL,DE - JR NC,L142E ; (-006H) - ADD HL,DE - OR A - JR NZ,L143B ; (+003H) - OR B - RET Z - XOR A -L143B: LD B,001H - OR 030H - POP DE - EX (SP),HL - LD (HL),A - INC HL - EX (SP),HL - PUSH DE - RET - - CALL TEST1 - DB 024H - JR Z,L1476 ; (+02aH) - LD DE,L0000 -L144F: CALL HLFTCH - SUB 030H - CP 00AH - RET NC - INC HL - PUSH HL - LD H,D - LD L,E - ADD HL,HL - JR C,L1471 ; (+013H) - ADD HL,HL - JR C,L1471 ; (+010H) - ADD HL,DE - JR C,L1471 ; (+00dH) - ADD HL,HL - JR C,L1471 ; (+00aH) - LD E,A - LD D,000H - ADD HL,DE - JR C,L1471 ; (+004H) - EX DE,HL - POP HL - JR L144F ; (-022H) - -L1471: LD A,002H - JP L0182 - -L1476: LD DE,L0000 -L1479: LD A,(HL) - CALL L1491 - RET C - INC HL - EX DE,HL - ADD HL,HL - JR C,L1471 ; (-012H) - ADD HL,HL - JR C,L1471 ; (-015H) - ADD HL,HL - JR C,L1471 ; (-018H) - ADD HL,HL - JR C,L1471 ; (-01bH) - ADD A,L - LD L,A - EX DE,HL - JR L1479 ; (-018H) - -L1491: SUB 030H - CP 00AH - CCF - RET NC - SUB 011H - CP 006H - CCF - RET C - ADD A,00AH - RET - - CALL L14AD - CP 020H - RET NZ -L14A6: CALL L14AD - OR A - JR Z,L14A6 ; (-006H) - RET - -L14AD: RST 018H - DB 00EH - JR Z,L14B8 ; (+007H) - LD A,0FFH - RST 018H - DB 00DH - CP 01BH - RET NZ -L14B8: JP 0017DH - - RET - -L14BC: CALL SKPDE - LD HL,KEYBUF - LD B,000H - PUSH HL - CALL LDHLDE - POP DE - LD (014DAH),SP - LD SP,L10F0 - DI - OUT (LSE4),A - RST 030H - OUT (LSE0),A - OUT (LSE1),A - EI - LD SP,L0000 - RET - - LD (DDEV),DE - LD (DCHAN),A - RET - - LD C,A - RST 018H - DB 020H - RST 018H - DB 002H - BIT 7,C - JR Z,L14F8 ; (+00aH) - LD HL,KEYBUF - PUSH HL - CALL L1535 - POP DE - RST 018H - DB 005H -L14F8: LD A,C - AND 07FH - JR L14FF ; (+002H) - -L14FD: LD A,045H -L14FF: LD DE,L1554 -L1502: DEC A - JR Z,L150F ; (+00aH) - EX AF,AF' -L1506: LD A,(DE) - INC DE - OR A - JP P,L1506 - EX AF,AF' - JR L1502 ; (-00dH) - -L150F: LD A,(DE) - CP 080H - JR Z,L14FD ; (-017H) -L1514: LD A,(DE) - OR A - JP M,L151F - CALL L152A - INC DE - JR L1514 ; (-00bH) - -L151F: AND 07FH - CALL L152A - LD DE,L179E - RST 018H - DB 005H - RET - -L152A: PUSH DE - LD DE,L1533 - LD (DE),A - RST 018H - DB 005H - POP DE - RET - -L1533: NOP - NOP -L1535: LD DE,(ZEQT) - INC DE - INC DE - RST 018H - DB 017H - CALL LDHLDE - LD A,(ZCH) - ADD A,031H - LD (HL),A - LD A,(01051H) - AND 00FH - JR Z,L154E ; (+001H) - INC HL -L154E: LD (HL),03AH - INC HL - LD (HL),000H - RET - -L1554: DB 053H,005H,"YNTA",0D8H,04FH,005H,"VER FLO",0D7H,049H,005H ; Error message table (bit-7 terminated) - DS 2, 04CH - DB "EGAL DAT",0C1H,054H,005H,"YPE MISMATC",0C8H,053H,005H,"TRING LENGT",0C8H,04DH,005H,"EMORY CAPACIT",0D9H,041H,005H - DS 2, 052H - DB "AY DEF",0AEH,04CH,005H,"INELENGT",0C8H,080H,"GOSUB ",005H,"NESTIN",0C7H,"FOR-NEX",0D4H,"DEF FN ",005H,"NESTIN",0C7H,"NEX",0D4H,"RETUR",0CEH,055H,005H,"N DEF. FUNCTIO",0CEH,055H,005H,"N DEF. LIN",0C5H,043H,005H,"AN'T ",006H,"CON",0D4H,04DH,005H,"EMORY PROTECTIO",0CEH,049H,005H,"NSTRUCTIO",0CEH,043H,005H,"AN'T ",006H,"RESUM",0C5H,"RESUM",0C5H - DS 2, 080H - DB "REA",0C4H,"SWAP ",005H,"LEVE",0CCH - DS 2, 080H - DB 053H,005H,"YSTEM I",0C4H,046H,005H,"RAMIN",0C7H,04FH,005H,056H,045H - DS 2, 052H - DB 055H,0CEH,050H,005H,"ARIT",0D9H - DS 8, 080H - DB 046H,005H,"ILE NOT FOUN",0C4H,048H,005H,"ARDWAR",0C5H,041H,005H,"LREADY EXIS",0D4H,041H,005H,"LREADY OPE",0CEH,04EH,005H,"OT OPE",0CEH,080H,057H,005H,"RITE PROTEC",0D4H - DS 3, 080H - DB 04EH,005H,"OT READ",0D9H,054H,005H - DS 2, 04FH - DB " MANY FILE" - DB LSD3 - DB 044H,005H,"ISK MISMATC",0C8H,04EH,005H,"O FILE SPAC",0C5H,055H,005H,"NFORMA",0D4H,054H,005H - DS 2, 04FH - DB " LONG FIL",0C5H - DS 2, 080H - DB 044H,005H,"EV. NAM",0C5H,043H,005H,"AN'T EXECUT",0C5H,049H,005H - DS 2, 04CH - DB "EGAL FILENAM",0C5H,049H,005H - DS 2, 04CH - DB "EGAL FILEMOD",0C5H,080H,04FH,005H,"UT OF FIL",0C5H,04CH,005H,"OGICAL NUMBE" - DB LSD2 - DB "LPT:" -L1772: DB 04EH,005H,"OT READ",0D9H - DS 2, 080H - DB 044H,005H,"EV. MOD",0C5H,055H,005H,"NPRINTABL",0C5H,043H,005H,"HECK SU",0CDH -L179E: DB 020H - DB 005H - DB 045H - DS 2, 052H - DB 04FH - DB 052H - DS 91, 000H -L1800: JP L4000 - -L1803: LD A,(ZLOG) - CP 088H - RET - -L1809: NOP - NOP -L180B: NOP - NOP -L180D: NOP - NOP - CALL L181A - CALL L1821 -L1815: XOR A - LD (L1FC0),A - RET - -L181A: LD A,(ZLOG) - LD (L1FC0),A - RET - -L1821: CALL SKPDE - LD A,(ZFLAG1) - BIT 7,A - LD HL,L1848 -L182C: JR Z,L183D ; (+00fH) - BIT 3,A - LD HL,L1835 - JR NZ,L183D ; (+008H) -L1835: LD IX,(ZOUT) - CALL IOCALL - RET - -L183D: LD A,B -L183E: OR A - RET Z - LD A,(DE) - CALL L00FA - INC DE - DEC B - JR L183D ; (-00bH) - -L1848: CALL SKPDE - LD E,(IY+040H) - LD D,(IY+041H) - LD HL,(L180B) - ADD HL,DE - LD (HL),A - INC DE - LD HL,(ZKL) - OR A - SBC HL,DE - CALL Z,L1871 - LD (IY+040H),E - LD (IY+041H),D - INC (IY+014H) - RET NZ - INC (IY+015H) - RET NZ - JP 01F91H - -L1871: PUSH BC - LD B,002H -L1874: CALL L1D15 - LD IX,L1835 - JR Z,L1881 ; (+004H) - LD IX,L2907 -L1881: LD A,B - CALL L18B6 - CALL L1890 - INC (IY+04EH) - LD DE,L0000 - POP BC - RET - -L1890: JP (IX) - -L1892: LD A,01AH - LD E,(IY+040H) - LD D,(IY+041H) -L189A: LD HL,(L180B) - ADD HL,DE - LD (HL),A - INC DE - LD HL,(ZKL) - XOR A - SBC HL,DE - JR NZ,L189A ; (-00eH) - PUSH BC - LD HL,(L180B) - DEC HL - LD (HL),0FFH - DEC HL - LD (HL),0FFH - LD B,006H - JR L1874 ; (-042H) - -L18B6: LD BC,(ZKL) - INC BC - INC BC - LD HL,(L180B) - DEC HL - DEC HL - LD DE,(01809H) - RET - -L18C6: OR 0AFH - LD IX,(ZCL) - CALL IOCALL - RET - - CALL L1803 - RET NZ - PUSH DE - LD DE,KEYBUF - CALL L026A - LD (0193CH),DE - POP DE - RET NC - JP 0017DH - - PUSH HL - PUSH DE - CALL L181A - LD HL,(ZTOP) - INC HL - BIT 7,(HL) - PUSH HL - LD B,000H - SCF - CALL Z,L1913 - POP HL - CALL C,L1908 - POP DE - PUSH AF - CALL L1815 - LD L,B - LD H,000H - ADD HL,DE - LD (HL),000H - POP AF - POP HL - RET - -L1908: SET 7,(HL) - LD HL,01051H - BIT 4,(HL) - RET Z - JP 01FA0H - -L1913: CALL L1803 - JR Z,L193B ; (+023H) - LD A,(ZFLAG1) - BIT 7,A - LD HL,L1989 - JR Z,L1975 ; (+053H) - BIT 2,A - LD HL,L1929 - JR NZ,L1975 ; (+04cH) -L1929: LD IX,(ZINP) - CALL IOCALL - RET - -L1931: LD A,03FH - RST 018H - DB 003H - LD A,020H - RST 018H - DB 003H - RST 018H - DB 034H -L193B: LD HL,L0000 -L193E: CALL HLFTCH - OR A - JR Z,L1931 ; (-013H) - LD C,000H - RST 018H - DB 036H - LD (0193CH),HL - RET - - LD B,000H - CALL TEST1 - DB 022H - JR NZ,L1967 ; (+013H) -L1954: LD A,(HL) - OR A - RET Z - INC HL - CP 022H - JR Z,L1961 ; (+005H) - LD (DE),A - INC DE - INC B - JR L1954 ; (-00dH) - -L1961: CALL TEST1 - DB 02CH - OR A - RET - -L1967: LD A,(HL) - OR A - RET Z - CP C - RET Z - INC HL - CP 02CH - RET Z - LD (DE),A - INC DE - INC B - JR L1967 ; (-00eH) - -L1975: LD (0197BH),HL - LD B,000H -L197A: CALL L0000 - RET C - CP 00DH - RET Z - LD (DE),A - INC DE - INC B - JR NZ,L197A ; (-00cH) - JP 01F76H - -L1989: CALL SKPDE - LD E,(IY+040H) - LD D,(IY+041H) - LD HL,(ZKL) - OR A - SBC HL,DE - CALL Z,L19B4 - RET C - LD L,(IY+04EH) - LD H,(IY+04FH) - XOR A - SBC HL,DE - SCF - RET Z - LD HL,(L180B) - ADD HL,DE - LD A,(HL) - INC DE - LD (IY+040H),E - LD (IY+041H),D - RET - -L19B4: CALL L1D15 - JP NZ,L2A4C - OR 0AFH - CALL L18B6 - CALL L1929 - RET C - LD A,(HL) - INC HL - AND (HL) - LD (HL),0FFH - INC A - LD DE,L0000 - RET NZ - PUSH HL - LD HL,(L180D) - LD BC,(ZKL) -L19D5: DEC HL - DEC BC - LD A,(HL) - OR A - JR Z,L19D5 ; (-006H) - POP HL - LD (HL),B - DEC HL - LD (HL),C - RET - - CALL SKPDE - LD HL,L1A2D - CP 088H - JR Z,L19F4 ; (+00aH) - LD HL,L1A35 - CP 089H - JR Z,L19F4 ; (+003H) - RST 018H - DB 029H - RET C -L19F4: LD (ZTOP),HL - LD DE,ZLOG - LD BC,00008H - LDIR - LD (L1809),HL - PUSH HL - POP IY - LD DE,ELMD - CALL L1C54 - PUSH HL - LD HL,(ZEQT) - LD DE,ZNXT - LD BC,0001DH - LDIR - POP HL - LD BC,00010H - ADD HL,BC - LD (L180B),HL - LD BC,(ZKL) - ADD HL,BC - LD (L180D),HL - LD A,(ZRWX) - AND 00FH - RET - -L1A2D: ADC A,B - INC BC - LD A,B - DEC BC - NOP - NOP - NOP - NOP -L1A35: ADC A,C - LD (BC),A - NOP - RRCA - NOP - NOP - NOP - NOP - LD HL,KEYBUF - PUSH HL - LD A,B - OR A - CALL NZ,LDHLDE - LD (HL),000H - LD HL,$CRT - JR L1A50 ; (+003H) - -L1A4D: LD HL,L0000 -L1A50: LD A,L - OR H - JR Z,L1A89 ; (+035H) - LD (01A84H),HL - CALL LDDEMI - LD (01A4EH),DE - LD DE,KEYBUF - EX DE,HL -L1A62: LD A,(DE) - OR A - JR Z,L1A6D ; (+007H) - CP (HL) - JR NZ,L1A4D ; (-01cH) - INC HL - INC DE - JR L1A62 ; (-00bH) - -L1A6D: LD A,(HL) - INC HL - CP 03AH - LD C,000H - JR Z,L1A82 ; (+00dH) - SUB 031H - CP 009H - JR NC,L1A4D ; (-02eH) - LD C,A - LD A,(HL) - INC HL - CP 03AH - JR NZ,L1A4D ; (-035H) -L1A82: EX (SP),HL - LD HL,L0000 - LD A,C - JR L1A9B ; (+012H) - -L1A89: POP HL - PUSH HL -L1A8B: LD A,(HL) - INC HL - CP 03AH - JP Z,01F94H - OR A - JR NZ,L1A8B ; (-00aH) - LD HL,(DDEV) - LD A,(DCHAN) -L1A9B: LD (ZEQT),HL - PUSH HL - LD (ZCH),A - LD DE,ZNXT - LD BC,0001DH - LDIR - LD B,A - LD A,(01051H) - AND 007H - CP B - JP C,01F94H - LD A,B - POP DE - POP HL - RET - - CALL SKPDE - RST 018H - DB 02CH - EX DE,HL - LD HL,ELMD1 - LD B,01FH - CALL ?CLRHL - LD HL,ELMD - RST 018H - DB 017H - CALL L1EB4 - LD HL,ZFLAG1 - BIT 4,(HL) - RET Z - INC HL - BIT 7,(HL) - RET NZ - LD A,(ELMD1) - CP 00DH - JP Z,01F9AH - RET - - CALL SKPDE - CALL L1AEF - LD B,000H - CALL L1B97 - JP L2D08 - -L1AEF: LD A,(ZLOG) - RST 018H - DB 029H - JP NC,01F7CH - CALL L1C5B - LD HL,L005D - LD A,(ZFLAG1) - LD DE,(ZKL) - INC DE - INC DE - BIT 7,A - JR NZ,L1B0B ; (+001H) - ADD HL,DE -L1B0B: LD A,(ZRWX) - BIT 2,A - JR Z,L1B13 ; (+001H) - ADD HL,DE -L1B13: EX DE,HL - LD A,(ZLOG) - RST 018H -L1B18: DB 02AH - LD (L1FC0),A - LD (ZTOP),HL - EX DE,HL - LD HL,ZLOG - LD BC,00008H - LDIR - LD (01809H),DE - PUSH DE - POP IY - LD HL,ELMD - CALL L1C54 - LD HL,00010H - ADD HL,DE - LD (L180B),HL - LD DE,(ZKL) - ADD HL,DE - LD (L180D),HL - CALL L1D15 - JP NZ,L2B7F - LD A,(ZRWX) - BIT 2,A - JP NZ,01F97H - BIT 1,A - LD IX,(ZWO) - JR NZ,L1B65 ; (+00bH) - LD A,(ZFLAG1) - BIT 7,A - JR Z,L1B6B ; (+00aH) - LD IX,(ZRO) -L1B65: LD HL,ELMD - JP IOCALL - -L1B6B: CALL L0D9B - JP 019BBH - - CALL SKPDE - LD IY,L0100 - LD (ZLOG),IY - LD IY,ELMD - CALL L1D15 - LD HL,L2B7A - JR NZ,L1B8B ; (+003H) - LD HL,L1C39 -L1B8B: CALL L00FA - LD B,080H - CALL L1B97 - LD A,(ELMD) - RET - -L1B97: LD A,(ELMD) - CP 005H - RET C - LD A,(ELMD18) - AND 080H - CP B - RET Z - JP 01F9DH - -L1BA7: CALL SKPDE - OR A - JR Z,L1BED ; (+040H) - CALL L1BB3 - JP L2D08 - -L1BB3: RST 018H - DB 02EH - RET C - CALL L181A - PUSH AF - CALL L1D15 - JR NZ,L1BE1 ; (+022H) - BIT 7,A - LD A,B - JR Z,L1BD4 ; (+010H) - OR A - LD IX,(ZKL) - JR Z,L1BCF ; (+004H) - LD IX,(ZCL) -L1BCF: CALL IOCALL - JR L1BE4 ; (+010H) - -L1BD4: OR A - JR Z,L1BE4 ; (+00dH) - LD A,(ZRWX) - BIT 1,A - CALL NZ,L1892 - JR L1BE4 ; (+003H) - -L1BE1: CALL L2BEC -L1BE4: POP AF - RST 018H - DB 02BH - RET - - CALL SKPDE - LD B,000H -L1BED: LD C,08EH -L1BEF: LD A,C - PUSH BC - RST 018H - DB 029H - CALL NC,L1BB3 - POP BC - DEC C - JR NZ,L1BEF ; (-00bH) - JP L1FAB - -L1BFD: CALL SKPDE - LD A,(ZFLAG1) - BIT 6,A - JP Z,01F97H - CALL 018C7H - LD A,(ZDIRMX) - LD B,A -L1C0F: LD HL,KEYBUF - PUSH BC - LD IX,(ZRO) - CALL IOCALL - POP BC - SET 0,A - RET C - PUSH IY - POP DE - CALL L1E9D - LD A,(HL) - RET Z - DJNZ L1C0F ; (-019H) - XOR A - SCF - RET - -L1C2B: CALL L1C5B - CALL L1BFD - JP NC,01F79H - OR A - JP Z,01F85H - RET - -L1C39: CALL L1C5B - CALL L1BFD - JP C,01F73H - CALL SKPDE - LD HL,KEYBUF - PUSH IY - POP DE - PUSH HL - CALL L1C54 - POP HL - LD DE,ELMD - LD A,(HL) -L1C54: LD BC,00040H - LDIR - OR A - RET - -L1C5B: LD IX,L1C9D -L1C5F: LD (01C99H),IX - CALL SKPDE - LD A,(ZLOG) - LD C,A - LD HL,(TEXTED) - PUSH HL -L1C6E: POP HL - LD A,(HL) - OR A - RET Z - LD B,A - INC HL - CALL LDDEMI - PUSH HL - ADD HL,DE - EX (SP),HL - CP 08FH - JR NC,L1C6E ; (-010H) - CP C - JR Z,L1C6E ; (-013H) - INC HL - LD A,(HL) - EX AF,AF' - INC HL - LD DE,ZEQT - PUSH BC - LD BC,00300H -L1C8C: LD A,(DE) - SUB (HL) - OR C - LD C,A - INC DE - INC HL - DJNZ L1C8C ; (-008H) - POP BC - JR NZ,L1C6E ; (-029H) - LD A,B - CALL L0000 - JR L1C6E ; (-02fH) - -L1C9D: LD A,(01051H) - BIT 6,A - JP NZ,01F7CH - BIT 5,A - RET Z - EX AF,AF' - LD B,A - LD A,(ZRWX) - AND B - BIT 1,A - RET Z - JP 01F7CH - - CALL L1D15 - JP NZ,L2AD2 - LD BC,(ELMD20) - PUSH BC - XOR A - LD IX,(ZINP) - CALL IOCALL - POP BC - RET - - LD A,(01051H) - BIT 7,A - JP Z,01F97H - LD BC,(ELMD20) - JP L313A - - LD A,(ELMD) - CP 005H - JR C,L1CE4 ; (+005H) - LD A,080H - LD (ELMD18),A -L1CE4: CALL L1D15 - JP NZ,L2AE0 - BIT 7,A - JP NZ,01F97H - PUSH DE - LD HL,L0200 - LD (ZLOG),HL - CALL L1C5B - LD HL,ELMD - PUSH HL - POP IY - LD IX,(ZWO) - CALL IOCALL - LD BC,(ELMD20) - POP HL - LD A,004H - LD IX,(ZOUT) - CALL IOCALL - RET - -L1D15: LD A,(ZFLAG1) - BIT 5,A - RET - - CALL SKPDE - OR A - JR NZ,L1D6B ; (+04aH) - LD HL,L0100 - LD (ZLOG),HL - CALL DBG_L1C5B_WRAP - CALL DBG_FLAGS_TEST - ; - ; V1.1Z: Restore original ZFLAG1/ZFLAG2 bit tests. - ; DBG_FLAGS_TEST returns HL=ZFLAG1 for non-$RFS devices - ; (and already handles the ZFLAG1 bit7 error check). - ; Original code: BIT 7,ZFLAG1 / BIT 5,ZFLAG1 / INC HL / - ; BIT 7,ZFLAG2. bit5 of ZFLAG1 (not ZFLAG2!) flags block - ; devices ($FD, $QD) for the ZINP-based DIR path at 02F38H. - ; - BIT 5,(HL) ; ZFLAG1 bit5 = block device - JP NZ,02F38H ; Block device DIR path (ZINP-based) - INC HL ; HL = ZFLAG2 - BIT 7,(HL) ; ZFLAG2 bit7 = error - JP NZ,01F97H - NOP - NOP - NOP - NOP - NOP - LD HL,L2000 - LD BC,00008H -L1D43: CALL ?CLRHL - DEC C - JR NZ,L1D43 ; (-006H) - CALL 018C7H - LD A,(ZDIRMX) - LD B,A - LD HL,L2000 -L1D53: PUSH BC - LD IX,(ZRO) - CALL IOCALL - PUSH AF - LD BC,00020H - ADD HL,BC - LD (HL),000H - POP AF - POP BC - JR C,L1D68 ; (+002H) - DJNZ L1D53 ; (-015H) -L1D68: JP L18C6 - -L1D6B: LD (01E13H),A - XOR A - LD (DISPX),A - LD HL,KEYBUF - PUSH HL - LD DE,L1E1D - LD B,00EH - CALL LDHLDE - CALL L1535 - LD (HL),020H - INC HL - LD (HL),020H - INC HL - EX DE,HL - CALL L1D15 - LD IX,(ZFREE) - JR Z,L1D95 ; (+004H) - LD IX,L2F4B -L1D95: CALL IOCALL - JR C,L1DA8 ; (+00eH) - LD H,B - LD L,C - LD B,000H - RST 018H - DB 016H - LD HL,L1E2B - LD B,009H - CALL LDDEHL -L1DA8: EX DE,HL - LD (HL),00DH - INC HL - LD (HL),000H - POP DE - CALL L1E12 - LD B,040H - LD HL,L2000 -L1DB7: CALL L1DC3 - LD DE,00020H - ADD HL,DE - DJNZ L1DB7 ; (-009H) - JP L2D08 - -L1DC3: CALL SKPDE - LD A,(HL) - OR A - RET Z - RET M - LD DE,KEYBUF - PUSH DE - LD A,020H - LD B,026H - CALL ?SETDE - LD A,(HL) - CP 00CH - JR C,L1DDC ; (+002H) - LD A,00CH -L1DDC: PUSH HL - POP IY - POP DE - PUSH DE - INC DE - LD HL,L1E31 - LD BC,L0003 -L1DE8: ADD HL,BC - DEC A - JR NZ,L1DE8 ; (-004H) - LDIR - EX DE,HL - BIT 0,(IY+012H) - JR Z,L1DF7 ; (+002H) - LD (HL),02AH -L1DF7: INC HL - INC HL - LD (HL),022H - INC HL -L1DFC: LD A,(IY+001H) - CP 00DH - JR Z,L1E09 ; (+006H) - LD (HL),A - INC IY - INC HL - JR L1DFC ; (-00dH) - -L1E09: LD (HL),022H - INC HL - LD (HL),00DH - INC HL - LD (HL),000H - POP DE -L1E12: LD A,000H - RST 018H - DB 02EH - RST 018H - DB 017H - RST 018H - DB 037H - RST 018H - DB 00FH - RET - -L1E1D: DB 00DH,"DIRECTORY OF " ; Directory/file type strings -L1E2B: DB " KB FR" -L1E31: DS 2, 045H - DB ".OBJBTXBSDBRDRB" - DS 2, 020H - DB "? LIB ?" - DS 2, 020H - DB "? SYSGR" - DS 2, 020H - DB 03FH - DB 020H -; --------------------------------------------------------------------------- -; Subroutine at 0x1E58: Opens device I/O channel (saves/restores SP and IX) -; --------------------------------------------------------------------------- - PUSH HL ; E5 -L1E59: XOR A ; AF - LD (01042H),A ; 32 42 10 — clear I/O flag - LD IX,01E71H ; DD 21 71 1E — IX = workspace - LD (01E72H),SP ; ED 73 72 1E — save stack pointer - CALL L1C5F ; CD 5F 1C — open channel - POP HL ; E1 - LD IX,(01053H) ; DD 2A 53 10 — restore IX - CALL IOCALL ; CD 45 02 - RET ; C9 -; Workspace area (0x1E71-0x1E73, used by above subroutine) - DB 031H ; 0x1E71 data (IX-based structure) - DS 2, 000H ; 0x1E72-73 SP save area -; --------------------------------------------------------------------------- -; Subroutine at 0x1E74: Confirm prompt — SVC #38 + "OK ? [Y/N]" -; --------------------------------------------------------------------------- - LD B,000H ; 06 00 - RST 018H ; DF - DB 038H ; SVC #38 - JR L1E59 ; 18 DF — loop back to XOR A at 0x1E59 -; --------------------------------------------------------------------------- -; Subroutine at 0x1E7A: Ask "OK ? [Y/N]" and return Z if 'Y' -; --------------------------------------------------------------------------- -L1E7A: CALL 00164H ; CD 64 01 - DB 059H ; inline param 'Y' for CALL 0164H - RET Z ; C8 — return if match - LD DE,01E8EH ; 11 8E 1E — DE → "OK ? [Y/N]" string - RST 018H ; DF - DB 005H ; SVC #5 — display string - LD A,001H ; 3E 01 - RST 018H ; DF - DB 00DH ; SVC #0D — read key - CP 059H ; FE 59 — compare with 'Y' - RET Z ; C8 — return Z if 'Y' - JP 0017DH ; C3 7D 01 — jump to error/cancel handler - DB "OK ? [Y/N]",019H,000H ; Inline string at 0x1E8E -; --------------------------------------------------------------------------- -; L1E9D: Filename comparison — compares entry name (HL) with search name (DE). -; Skips ATRB byte in both, compares up to 17 chars, CR terminates/matches. -; --------------------------------------------------------------------------- -L1E9A: LD DE,01000H -L1E9D: CALL SKPDE ; Skip DE past device name - INC HL ; Skip ATRB byte in directory entry - INC DE ; Skip ATRB byte in search name - LD A,(DE) - CP 00DH - RET Z - LD B,011H -L1EA8: LD A,(DE) - CP (HL) - RET NZ - CP 00DH - RET Z - INC HL - INC DE - DJNZ L1EA8 ; (-00aH) - OR A - RET - -L1EB4: INC HL - LD C,010H -L1EB7: LD A,B - OR A - JR Z,L1ECF ; (+014H) - LD A,(DE) - INC DE - DEC B - OR A - JR Z,L1ECF ; (+00eH) - CP 022H - JR Z,L1EB7 ; (-00eH) - CP 03AH - JP Z,01F9AH - LD (HL),A - INC HL - DEC C - JR NZ,L1EB7 ; (-018H) -L1ECF: LD (HL),00DH - INC HL -L1ED2: LD A,C - OR A - RET Z - LD (HL),020H - INC HL - DEC C - JR L1ED2 ; (-009H) - - LD HL,(TEXTED) -L1EDE: INC (HL) - DEC (HL) - SCF - RET Z - CP (HL) - INC HL - JR Z,L1EEE ; (+008H) - PUSH DE - CALL LDDEMI - ADD HL,DE - POP DE - JR L1EDE ; (-010H) - -L1EEE: INC HL - INC HL - RET - -L1EF1: CALL SKPDE - RST 018H - DB 029H - RET C - DEC HL - LD B,(HL) - DEC HL - LD C,(HL) - DEC HL - LD D,H - LD E,L - INC BC - INC BC - INC BC - PUSH BC - ADD HL,BC - PUSH HL - LD B,H - LD C,L - LD HL,(TMPEND) - OR A - SBC HL,BC - LD B,H - LD C,L - POP HL - LDIR - POP DE - LD HL,L0000 - OR A - SBC HL,DE - EX DE,HL - RST 018H - DB 019H - OR A - RET - - PUSH AF - PUSH BC - PUSH DE - PUSH DE - INC DE - INC DE - INC DE - LD HL,(TMPEND) - EX DE,HL - ADD HL,DE - EX DE,HL - JP C,01F6DH - PUSH HL - LD HL,0FE00H - ADD HL,SP - SBC HL,DE - JR C,01F6DH ; (+037H) - LD HL,(MEMLMT) - DEC H - DEC H - SBC HL,DE - JR C,01F6DH ; (+02eH) - POP HL - PUSH HL - LD BC,(VARST) - OR A - SBC HL,BC - LD B,H - LD C,L - POP HL - INC BC - LDDR - POP DE - LD (HL),A - INC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - PUSH HL - INC DE - PUSH DE -L1F58: LD (HL),000H - INC HL - DEC DE - LD A,D - OR E - JR NZ,L1F58 ; (-008H) - POP DE - INC DE - INC DE - RST 018H - DB 019H - POP HL - POP DE - POP BC - POP AF - RET - -L1F6A: LD A,003H - LD HL,0063EH - LD HL,09C3EH - LD HL,0A83EH - LD HL,0A93EH - LD HL,0AA3EH - LD HL,0AB3EH - LD HL,0AE3EH - LD HL,0B23EH - LD HL,0B33EH - LD HL,0B43EH - LD HL,0B53EH - LD HL,0B63EH - LD HL,0B73EH - LD HL,L3A3E - LD HL,0BB3EH - LD HL,0BC3EH - LD HL,0BD3EH - LD HL,0BF3EH - LD HL,L403E - LD HL,0C43EH - JP L0182 - -L1FAB: LD A,(L1FC0) - OR A - LD B,000H - CALL NZ,L1BA7 - CALL L368D - CALL L38FA - CALL L2D08 - JP L0D20 - -L1FC0: DS 64, 000H -L2000: DS 38, 000H -L2026: DS 263, 000H -L212D: DS 211, 000H -L2200: DS 294, 000H -L2326: DS 986, 000H -L2700: DS 16, 000H -L2710: DS 240, 000H -L2800: DS 256, 000H - LD (02905H),DE - RET - -L2905: NOP - NOP -L2907: LD BC,L0000 - LD DE,00001H - BIT 2,A - CALL Z,L2ED0 - LD HL,(L180D) - LD A,(HL) - LD (HL),C - LD C,A - INC HL - LD A,(HL) - LD (HL),B - LD B,A - LD HL,(L180B) - LD DE,L0100 - JP L2FCF - - CALL SKPDE - CALL L181A - LD HL,KEYBUF - PUSH HL - LD A,B - OR A - CALL NZ,LDHLDE - LD B,020H - LD A,020H - CALL ?SETHL - LD A,(IY+012H) - OR A - JP NZ,01F7FH - CALL L29DF - JR NC,L2964 ; (+01dH) - LD (IY+014H),E - LD (IY+015H),D - LD (IY+046H),001H - JR Z,L2964 ; (+011H) - CALL L29C2 - CALL L2A08 - CALL L297C - LD (IY+040H),L - LD (IY+041H),H - JR L296A ; (+006H) - -L2964: CALL L297C - CALL L29AB -L296A: POP HL - CALL L2E24 - LD (IY+044H),001H -L2972: LD HL,(L2905) - INC HL - LD (L2905),HL - JP L1815 - -L297C: LD HL,(L2905) - DEC HL - PUSH HL - ADD HL,HL - LD E,H - LD D,000H - LD HL,(L180B) - ADD HL,DE - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) - POP HL - LD A,L - PUSH AF - RRA - RRA - RRA - AND 00FH - LD L,A - LD H,000H - ADD HL,DE - POP AF - AND 007H - ADD A,A - ADD A,A - ADD A,A - ADD A,A - ADD A,A - LD DE,(0180BH) - INC D - ADD A,E - LD E,A - RET NC - INC D - RET - -L29AB: LD A,(IY+040H) - CP L - JR NZ,L29B6 ; (+005H) - LD A,(IY+041H) - CP H - RET Z -L29B6: CALL L29C2 - LD (IY+040H),L - LD (IY+041H),H - XOR A - JR L29CC ; (+00aH) - -L29C2: XOR A - CP (IY+044H) - RET Z - LD (IY+044H),A - LD A,003H -L29CC: CALL SKPDE - LD C,(IY+040H) - LD B,(IY+041H) - LD DE,L0100 - LD HL,(L180B) - INC H - JP L2FD1 - -L29DF: LD L,(IY+014H) - LD H,(IY+015H) - LD DE,(02905H) - LD A,H - OR L - JR NZ,L29F1 ; (+004H) - OR 0FFH - SCF - RET - -L29F1: CALL L2FC9 - RET NC - CALL SKPDE - DEC HL - DEC DE - LD A,L - AND 080H - LD L,A - LD A,E - AND 080H - LD E,A - CALL L2FC9 - RET C - SCF - RET - -L2A08: CALL SKPDE - LD HL,(L2905) - DEC HL - ADD HL,HL - LD B,H - INC B - LD HL,(L180B) -L2A15: LD A,(HL) - INC HL - OR (HL) - CALL Z,L2A23 - INC HL - DJNZ L2A15 ; (-009H) - LD (IY+046H),001H - RET - -L2A23: CALL SKPDE - PUSH HL - LD DE,00010H - CALL L2ED0 - POP HL - LD (HL),B - DEC HL - LD (HL),C - LD HL,(L180B) - INC H - XOR A -L2A36: LD (HL),020H - INC HL - DEC A - JR NZ,L2A36 ; (-006H) - DEC H - LD DE,L0100 - LD A,010H -L2A42: PUSH AF - CALL L2FCF - POP AF - INC BC - DEC A - JR NZ,L2A42 ; (-009H) - RET - -L2A4C: LD L,(IY+014H) - LD H,(IY+015H) - LD A,H - OR L - SCF - RET Z - LD DE,0FF02H - PUSH HL - ADD HL,DE - JR C,L2A60 ; (+003H) - LD HL,L0000 -L2A60: LD (IY+014H),L - LD (IY+015H),H - POP DE - LD HL,(L180B) - DEC HL - LD (HL),D - DEC HL - LD (HL),E - CALL L2A88 - OR A - LD A,(ZRWX) - BIT 2,A - RET NZ - LD HL,(L180D) - LD A,(HL) - LD (IY+01EH),A - INC HL - LD A,(HL) - LD (IY+01FH),A - LD DE,L0000 - RET - -L2A88: LD C,(IY+01EH) - LD B,(IY+01FH) - LD A,B - OR C - JP Z,01F76H - LD DE,L0100 - LD HL,(L180B) - JP 02FD0H - - RET - - XOR A - LD (DE),A - PUSH HL - PUSH DE - PUSH DE - CALL L29DF - POP DE - JR C,L2AC7 ; (+01fH) - CALL L181A - PUSH DE - CALL L297C - CALL L29AB - EX DE,HL - POP DE - CALL L2E24 - XOR A - LD (DE),A - CALL L2972 - LD B,020H - XOR A - LD HL,(ZTOP) - INC HL - RES 7,(HL) - JR L2ACF ; (+008H) - -L2AC7: XOR A - LD B,A - LD HL,(ZTOP) - INC HL - SET 7,(HL) -L2ACF: POP DE - POP HL - RET - -L2AD2: LD DE,(ELMD20) - LD BC,(ELMD30) - CALL 02FD0H - JP L2D08 - -L2AE0: CALL L2AEA - LD IY,ELMD - JP L2C07 - -L2AEA: PUSH DE - CALL L2DD0 - CALL L2ED0 - LD (ELMD30),BC - LD D,E - LD E,000H - POP HL - JP L2FCF - - OR A - JR NZ,L2B34 ; (+035H) - PUSH DE - CALL L2B6A - LD A,000H - CALL Z,L2B51 - POP DE - CALL L2AEA - LD HL,ELMD - OR 0FFH - CALL L2B51 - CALL L2E2A - LD HL,L2000 - LD (HL),081H - PUSH HL - POP IY - LD HL,(ELMD20) - LD (IY+014H),L - LD (IY+015H),H - LD HL,(ELMD30) - LD (IY+01EH),L - LD (IY+01FH),H - JP L2F37 - -L2B34: PUSH HL - CALL L2B6A - JP NZ,01F88H - DEC (HL) - LD DE,ELMD - CALL L2E24 - CALL L2F37 -L2B45: XOR A - LD HL,L2000 - CALL L2B51 - CALL L2E2A - POP HL - RET - -L2B51: CALL SKPDE - PUSH AF - LD DE,00014H - ADD HL,DE - CALL LDDEMI - LD BC,00008H - ADD HL,BC - LD C,(HL) - INC HL - LD B,(HL) - CALL L2DD8 - POP AF - JP L2E77 - -L2B6A: CALL L1D15 - JP Z,01F97H - CALL L2E36 - CALL 02F38H - LD A,(HL) - CP 081H - RET - -L2B7A: LD A,009H - LD (ZRWX),A -L2B7F: CALL L2F6E - XOR B - DEC HL - LD A,(ZRWX) - BIT 0,A - JP NZ,01F73H - PUSH AF - LD DE,00001H - CALL L2ED0 - LD (IY+01EH),C - LD (IY+01FH),B - LD (IY+046H),001H - POP AF - BIT 1,A - RET Z - LD HL,(L180D) - LD (HL),C - INC HL - LD (HL),B - RET - - RET M - RET Z - CALL L1E9A - RET NZ - POP AF - LD A,(ZRWX) - BIT 1,A - JP NZ,01F79H - PUSH HL - CALL L2E24 - LD B,020H - CALL ?CLRDE - POP HL - LD A,(HL) - PUSH IY - POP DE - CALL L2E24 - LD HL,ZRWX - BIT 3,(HL) - RET NZ - BIT 0,(HL) - JP NZ,L2A4C - CALL L2E5E - CALL L2A88 - LD D,H - LD E,L -L2BDB: LD A,(HL) - INC HL - OR (HL) - INC HL - JR NZ,L2BDB ; (-006H) - DEC HL - DEC HL - SBC HL,DE - LD (IY+042H),L - LD (IY+043H),H - RET - -L2BEC: LD A,B - OR A - RET Z - LD A,(ZRWX) - BIT 0,A - RET NZ - BIT 2,A - JR NZ,L2C20 ; (+027H) - LD A,006H - CALL L2907 - PUSH IY - POP HL - LD DE,ELMD - CALL L2E24 -L2C07: CALL L2F6E - RLA - INC L - JP Z,01F85H -L2C0F: LD A,001H - LD B,(IY+000H) - JP L2D6A - - RET M - RET Z - CALL L1E9A - RET NZ - JP 01F79H - -L2C20: CALL L29C2 - LD A,(IY+046H) - OR A - RET Z - CALL L2F6E - LD (0CA2CH),A - ADD A,L - RRA - JR L2C0F ; (-023H) - - RET M - RET Z - CALL L1E9A - RET NZ - POP AF - LD (IY+045H),001H - LD A,(HL) - CP (IY+000H) - JP NZ,01F9DH - JR L2C0F ; (-037H) - - CALL SKPDE - LD (02C60H),A - CALL L2F6E - LD D,H - INC L - JP 01F73H - - RET Z - RET M - CALL L1E9A - RET NZ - POP AF - LD BC,L0012 - ADD HL,BC - LD (HL),0FFH -L2C61: CALL L2F37 - JP L2D08 - - CALL SKPDE - CALL L2F6E - LD (HL),D - INC L - JP 01F73H - - RET Z - RET M - CALL L1E9A - RET NZ - POP AF - CALL L2CFB - PUSH HL - LD DE,ELMD - CALL L2E24 - XOR A - LD (ZLOG),A - LD IX,L2C9B - CALL L1C5F - XOR A - LD (ELMD),A - POP HL -L2C93: LD B,(HL) - LD IY,ELMD - JP L2D6A - -L2C9B: INC HL - INC HL - INC HL - CALL L1E9A - JP Z,01F7CH -L2CA4: RET - -L2CA5: DS 16, 000H - DEC C - CALL SKPDE - LD HL,L2CA4 - CALL L1EB4 - XOR A -L2CC0: LD (02CE3H),A - CALL L2F6E - JP Z,L182C - JR L2C93 ; (-038H) - - RET M - LD DE,L2CA4 - CALL L1E9D - JP Z,01F79H - CALL L1E9A - RET NZ - LD (02CE9H),HL - LD A,001H - LD (02CE3H),A - RET - - LD A,0FFH - OR A - JP Z,01F73H - LD HL,0FFFFH - CALL L2CFB - LD DE,L2CA5 - INC HL - EX DE,HL - LD BC,00011H - LDIR - JP L2C61 - -L2CFB: CALL SKPDE - LD DE,L0012 - ADD HL,DE - LD A,(HL) - OR A - RET Z - JP 01F7FH - -L2D08: CALL IOOUT - XOR A - LD (L1FC0),A - LD A,LSE0 -L2D11: PUSH AF - RST 018H - DB 02BH - POP AF - INC A - JR NZ,L2D11 ; (-007H) - LD HL,(ZEQT) - LD DE,$FD - CALL L2FC9 - RET NZ - LD A,(ZCH) - EXX - LD H,A - LD D,000H - LD B,003H - EXX - XOR A - LD (ZLOG),A -L2D30: EXX - LD A,B - LD (ZCH),A - ADD A,090H - LD L,A - LD E,000H - EXX - LD IX,L2D5C - CALL L1C5F - EXX - BIT 7,E - LD A,L - EXX - CALL Z,L1EF1 - EXX - DEC B - EXX - JP P,L2D30 - EXX - LD A,H - LD (ZCH),A - BIT 7,D - EXX - CALL Z,L368D - RET - -L2D5C: EXX - LD DE,0FFFFH - EXX - RET - -L2D62: LD A,(ZCH) - ADD A,090H - RST 018H - DB 029H - RET - -L2D6A: LD (L2DCF),A - LD A,B - PUSH AF - EX DE,HL - LD HL,ELMD - CALL L2E24 - CALL L2E36 - POP AF - CP 005H - JR C,L2D88 ; (+00aH) - LD A,(ELMD18) - RLA - LD A,003H - JR NC,L2D88 ; (+002H) - LD A,001H -L2D88: LD HL,02D9CH - ADD A,A - CALL ADDHLA - CALL INDRCT - CALL L00FA - CALL L2F37 - CALL L2E2A - JP L2D08 - - ADD A,02DH - ADD A,02DH - AND (HL) - DEC L - JP PO,L212D - JR NZ,02DB9H ; (+010H) -L2DA9: DEC HL - LD B,(HL) - DEC HL - LD C,(HL) - LD A,B - OR C - RET Z - LD DE,L0100 - LD HL,KEYBUF - PUSH HL - PUSH DE - CALL 02FD0H - LD DE,00001H - CALL L2DC9 - POP DE - POP HL - ADD HL,DE - JR L2DA9 ; (-01dH) - - CALL L2DD0 -L2DC9: LD A,(L2DCF) - JP L2E77 - -L2DCF: NOP -L2DD0: LD DE,(ELMD20) - LD BC,(ELMD30) -L2DD8: LD A,E - OR D - JR Z,L2DDD ; (+001H) - DEC DE -L2DDD: INC D - LD E,D - LD D,000H - RET - - LD DE,L0100 - LD BC,(ELMD30) - LD A,(L2DCF) - OR A - LD HL,KEYBUF - JR Z,L2DF5 ; (+003H) - LD HL,(L180B) -L2DF5: PUSH HL - PUSH AF - CALL L2FD1 - POP AF - PUSH AF - JR Z,L2E02 ; (+004H) - LD A,(IY+045H) - OR A -L2E02: LD DE,00001H - CALL Z,L2DC9 - POP AF - POP HL - JR Z,L2E13 ; (+007H) - LD E,(IY+042H) - LD D,(IY+043H) - ADD HL,DE -L2E13: LD C,(HL) - INC HL - LD B,(HL) - INC HL - LD A,B - OR C - RET Z - PUSH HL - LD DE,00010H - CALL L2DC9 - POP HL - JR L2E13 ; (-011H) - -L2E24: LD BC,00020H - LDIR - RET - -L2E2A: LD HL,L2800 - LD DE,L0100 - LD BC,L000F - JP L2FCF - -L2E36: LD HL,L2800 - CALL L2E67 - PUSH HL - CALL L2D62 - EX DE,HL - POP HL - RET C - PUSH HL - LD A,(DE) - CP (HL) - JP NZ,01F88H - LD BC,L0006 - ADD HL,BC - EX DE,HL - ADD HL,BC - EX DE,HL - LD B,FDPC -L2E52: LD A,(DE) - CPL - AND (HL) - JP NZ,01F88H - INC HL - INC DE - DJNZ L2E52 ; (-00aH) - POP HL - RET - -L2E5E: CALL L2D62 - RET NC - LD DE,L0100 - RST 018H - DB 02AH -L2E67: LD BC,L000F - LD DE,L0100 - XOR A - CALL L2FD4 - LD A,(HL) - OR A - JP M,01F70H - RET - -L2E77: LD HL,L2800 - CALL L2E84 - OR A - RET NZ - CALL L2D62 - RET C - XOR A -L2E84: CALL IOOUT - OR A - PUSH HL - LD HL,0B600H - LD A,013H - JR NZ,L2E95 ; (+005H) - LD HL,0A62FH - LD A,01BH -L2E95: LD (L2EB2),A - LD (L2EC8),HL - POP HL -L2E9C: CALL L2EA4 - INC BC - DEC E - JR NZ,L2E9C ; (-007H) - RET - -L2EA4: CALL SKPDE - INC HL - LD A,C - SUB (HL) - LD C,A - JR NC,L2EAE ; (+001H) - DEC B -L2EAE: INC HL - LD E,(HL) - INC HL - LD D,(HL) -L2EB2: NOP - DEC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - INC HL - INC HL - LD A,C - LD E,003H -L2EBD: SRL B - RR C - DEC E - JR NZ,L2EBD ; (-007H) - ADD HL,BC - CALL L2F2B -L2EC8: NOP - NOP - CP (HL) - LD (HL),A - RET NZ - JP 01F88H - -L2ED0: PUSH DE - CALL L2E5E - POP DE - PUSH HL - CALL L2EDE - POP HL - LD A,001H - JR L2E84 ; (-05aH) - -L2EDE: LD A,E - EXX - LD E,A - LD D,A - LD B,001H - EXX - INC HL - LD E,(HL) - LD D,000H - INC HL - INC HL - INC HL - LD C,(HL) - INC HL - LD B,(HL) - DEC BC - LD (02EFCH),BC - INC HL - PUSH HL - EXX - POP HL - EXX - LD B,D - LD C,E -L2EFB: LD HL,L0000 - OR A - SBC HL,DE - JP C,01F8BH - EXX - LD A,B - AND (HL) - EXX - CALL L2F15 - INC DE - EXX - RLC B - JR NC,L2F12 ; (+001H) - INC HL -L2F12: EXX - JR L2EFB ; (-01aH) - -L2F15: JR NZ,L2F24 ; (+00dH) - EXX - DEC E - EXX - RET NZ - POP AF - EXX - LD A,D - EXX - LD E,A - LD D,000H - OR A - RET - -L2F24: EXX - LD E,D - EXX - LD B,D - LD C,E - INC BC - RET - -L2F2B: PUSH BC - AND 007H - INC A - LD B,A - XOR A - SCF -L2F32: ADC A,A - DJNZ L2F32 ; (-003H) - POP BC - RET - -L2F37: OR 0AFH - LD HL,L2000 - LD DE,00800H - LD BC,00010H - CALL L2FD1 - LD A,(HL) - OR A - JP P,01F70H - RET - -L2F4B: PUSH HL - PUSH DE - CALL L2E36 - INC HL - INC HL - CALL LDDEMI - CALL INDRCT - XOR A - SBC HL,DE - JP C,01F70H - SRL H - RR L - SRL H - RR L - LD B,H - LD C,L - POP DE - POP HL - OR A - JP L368D - -L2F6E: CALL L1D15 - JP Z,01F97H - POP HL - CALL LDDEMI - LD (02FB1H),HL - LD (02F97H),DE - XOR A - LD (L2FC3),A - CALL 02F38H - LD (L2FC7),HL - LD A,040H - LD (L2FC6),A -L2F8E: LD HL,(L2FC7) - LD A,(HL) - OR A - CALL Z,L2FB3 - CALL 0FFFFH - LD HL,(L2FC7) - LD BC,00020H - ADD HL,BC - LD (L2FC7),HL - LD HL,L2FC6 - DEC (HL) - JR NZ,L2F8E ; (-01bH) - LD A,(L2FC3) - LD HL,(L2FC4) - OR A - JP 0FFFFH - -L2FB3: PUSH AF - LD A,(L2FC3) - OR A - JR NZ,L2FC1 ; (+007H) - INC A - LD (L2FC3),A - LD (L2FC4),HL -L2FC1: POP AF - RET - -L2FC3: NOP -L2FC4: NOP - NOP -L2FC6: NOP -L2FC7: NOP - NOP -L2FC9: PUSH HL - OR A - SBC HL,DE - POP HL - RET - -L2FCF: OR 0AFH -L2FD1: CALL L2FE8 -L2FD4: CALL SKPDE - OR A - LD IX,(ZINP) - JR Z,L2FE2 ; (+004H) - LD IX,(ZOUT) -L2FE2: LD A,(ZCH) - JP IOCALL - -L2FE8: CALL IOOUT - LD A,(L35B5) - OR A - RET M - CALL L2D62 - RET C - JP L2E36 - -; --------------------------------------------------------------------------- -; $CMT - Cassette Tape device descriptor (same format as $RFS, $FD, etc.) -; --------------------------------------------------------------------------- -$CMT: DW 03359H ; Next device = $RS - DB "CMT",000H ; Device name - DB 05FH ; flags1: bit5=0, bit6=1 -L2FFE: DB 0C0H ; flags2 (bit 4 toggled by CMT handler) - DB 000H ; dirmx = 0 - DW 03014H ; ZINIT - DW 03064H ; ZRO - DW 03022H ; ZWO - DW 000E5H ; ZCL (= NOP stub) - DW 00100H ; ZKL - DW 030AAH ; ZINP - DW 0305DH ; ZOUT - DW 01F97H ; ZDELT (= error handler) - DW 01F97H ; ZWDIR (= error handler) - DW 01F97H ; ZFREE (= error handler) - CALL TEST1 - DB 054H - LD HL,L2FFE - SET 4,(HL) - RET Z - RES 4,(HL) - OR A - RET - - CALL SKPDE - LD DE,L10F0 - LD A,(HL) - LD C,005H - CP 002H - JR Z,L303D ; (+00eH) - LD C,004H -L3031: CP 003H - JR Z,L303D ; (+008H) - LD C,A -L3036: SUB 004H - CP 002H - JP C,01F9DH -L303D: LD A,C - LD (DE),A - INC HL - INC DE - LD BC,00011H - LDIR - INC HL - INC HL - LD BC,L0006 - LDIR - LD B,068H - CALL ?CLRDE - LD HL,L10F0 - LD BC,L0080 - CALL L30CB - JR L3060 ; (+003H) - - CALL L30D2 -L3060: JP C,L017B - RET - - LD A,037H - LD (L30AA),A - PUSH HL - LD HL,L10F0 - LD BC,L0080 - CALL L3114 - JR C,L30C1 ; (+04cH) - LD DE,L3332 - CALL L3301 - POP DE - LD A,(HL) - LD C,002H - CP 005H - JR Z,L3091 ; (+00eH) - LD C,003H - CP 004H - JR Z,L3091 ; (+008H) - LD C,A - SUB 002H - CP 002H - JP C,01F9DH -L3091: LD A,C - LD (DE),A - INC HL - INC DE - LD BC,00011H - LDIR - XOR A - LD B,002H - CALL ?CLRDE - LD BC,L0006 - LDIR - LD B,006H - JP ?CLRDE - -L30AA: XOR A - JR NC,L30BD ; (+010H) - LD A,0AFH - LD (L30AA),A - PUSH HL - LD HL,ELMD - LD DE,L333F - CALL L3301 - POP HL -L30BD: CALL L311B - RET NC -L30C1: CP 002H - JP NZ,L017B - LD A,0C6H - JP L0182 - -L30CB: CALL L32D4 - LD A,0CCH - JR L30D4 ; (+002H) - -L30D2: LD A,053H -L30D4: LD (03109H),SP - LD SP,L10F0 - PUSH DE - LD E,A - LD D,0D7H - LD A,B - OR C - JR Z,L3107 ; (+024H) - CALL L32CB - CALL L3174 - JR C,L3101 ; (+016H) - LD A,E - CP 0CCH - JR NZ,L30F8 ; (+008H) - PUSH DE - LD DE,L3325 - CALL L3301 - POP DE -L30F8: DI - OUT (LSE4),A - CALL 00780H - CALL NC,L31DD -L3101: DI - OUT (LSE4),A - CALL 00700H -L3107: POP DE - LD SP,L0000 - OUT (LSE0),A - OUT (LSE1),A - PUSH AF - RST 018H - DB 011H - POP AF - RET - -L3114: CALL L32D4 - LD A,0CCH - JR L311D ; (+002H) - -L311B: LD A,053H -L311D: LD (03109H),SP - LD SP,L10F0 - PUSH DE - LD D,LSD2 - LD E,A - LD A,B - OR C - JR Z,L3107 ; (-025H) - CALL L3174 - DI - OUT (LSE4),A - CALL NC,L065B - CALL NC,L3220 - JR L3101 ; (-039H) - -L313A: PUSH HL - LD DE,L334C - LD HL,ELMD - CALL L3301 - POP HL - CALL L3153 - RET NC - CP 002H - JP NZ,L017B - LD A,083H - JP L0182 - -L3153: LD (03109H),SP - LD SP,L10F0 - PUSH DE - LD D,LSD2 - LD E,053H - LD A,B - OR C - JR Z,L3107 ; (-05cH) - CALL RFS_LOAD_HOOK - NOP - NOP - NOP - DI - OUT (LSE4),A - CALL NC,L065B - CALL NC,L3274 - JR L3101 ; (-073H) - -L3174: CALL SKPDE - RST 018H - DB 010H - LD HL,MMIO - LD A,FDPA - CALL POPRA - LD B,00AH -L3183: LD HL,0E002H - CALL BREAKX - AND 010H - JR Z,L319A ; (+00dH) -L318D: LD B,0FFH - OUT (LSE2),A -L3191: CALL L09A6 - DJNZ L3191 ; (-005H) - OUT (LSE0),A - XOR A - RET - -L319A: LD HL,0E003H - LD A,006H - CALL POPRA - INC A - CALL POPRA - DJNZ L3183 ; (-025H) - LD A,(L0050) - OR A - JR NZ,L31C7 ; (+019H) - RST 018H - DB 002H - LD A,07FH - RST 018H - DB 004H - LD A,020H - RST 018H - DB 003H - LD A,D - CP 0D7H - LD DE,L32BC - JR Z,L31C3 ; (+003H) - LD DE,L32C3 -L31C3: RST 018H - DB 005H - RST 018H - DB 002H -L31C7: LD HL,0E002H - CALL BREAKX - AND 010H - JR NZ,L318D ; (-044H) - LD HL,0E001H - CALL BREAKX - AND 080H - JR NZ,L31C7 ; (-014H) - SCF - RET - -L31DD: PUSH DE - PUSH BC - PUSH HL - LD D,002H - LD A,FDPA - LD (MMIO),A -L31E7: OUT (LSE1),A - LD A,(HL) - OUT (LSE3),A - CALL L32C8 - LD A,(0E001H) - AND 080H - SCF - JR Z,L321C ; (+025H) - INC HL - DEC BC - LD A,B - OR C - JR NZ,L31E7 ; (-016H) - LD HL,(SUMDT) - LD A,H - CALL L32C8 - LD A,L - CALL L32C8 - CALL L0D60 - XOR A - DEC D - JR Z,L321C ; (+00dH) - LD B,000H -L3211: CALL L0D47 - DJNZ L3211 ; (-005H) - POP HL - POP BC - PUSH BC - PUSH HL - JR L31E7 ; (-035H) - -L321C: POP HL - POP BC - POP DE - RET - -L3220: PUSH DE - PUSH BC - PUSH HL - LD H,002H -L3225: LD BC,0E001H - LD DE,0E002H -L322B: CALL 00601H - JR C,L3267 ; (+037H) - CALL 00A4AH - LD A,(DE) - AND 020H - JR Z,L322B ; (-00dH) - LD D,H - LD HL,L0000 - LD (SUMDT),HL - POP HL - POP BC - PUSH BC - PUSH HL -L3243: CALL L0624 - JR C,L3267 ; (+01fH) - OUT (LSE1),A - LD (HL),A - OUT (LSE3),A - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3243 ; (-010H) - LD HL,(SUMDT) - CALL L0624 - JR C,L3267 ; (+00cH) - CP H - JR NZ,L326B ; (+00dH) - CALL L0624 - JR C,L3267 ; (+004H) - CP L - JR NZ,L326B ; (+005H) -L3266: XOR A -L3267: POP HL - POP BC - POP DE - RET - -L326B: DEC D - LD H,D - JR NZ,L3225 ; (-04aH) -L326F: LD A,002H - SCF - JR L3267 ; (-00dH) - -L3274: PUSH DE - PUSH BC - PUSH HL - LD H,002H -L3279: LD BC,0E001H - LD DE,0E002H -L327F: CALL 00601H - JR C,L3267 ; (-01dH) - CALL 00A4AH - LD A,(DE) - AND 020H - JR Z,L327F ; (-00dH) - LD D,H - POP HL - POP BC - PUSH BC - PUSH HL -L3291: CALL L0624 - JR C,L3267 ; (-02fH) - OUT (LSE1),A - CP (HL) - OUT (LSE3),A - JR NZ,L326F ; (-02eH) - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3291 ; (-012H) - LD HL,(CSMDT) - CALL L0624 - JR C,L3267 ; (-044H) - CP H - JR NZ,L326F ; (-03fH) - CALL L0624 - JR C,L3267 ; (-04cH) - CP L - JR NZ,L326F ; (-047H) - DEC D - LD H,D - JR NZ,L3279 ; (-041H) - JR L3266 ; (-056H) - -L32BC: DB "RECORD." ; CMT status strings (RECORD/PLAY) -L32C3: DB "PLAY",000H -L32C8: JP L076D - -L32CB: DI - OUT (LSE2),A - CALL 0071AH - OUT (LSE0),A - RET - -L32D4: CALL SKPDE - LD A,0C9H - LD (L32D4),A - LD HL,L0036 - BIT 6,(HL) - RET Z - LD HL,L0767 - LD (032C9H),HL - LD HL,L077A - LD (030FCH),HL - LD HL,00996H - LD (03192H),HL - LD HL,L0A01 - LD (03212H),HL - LD HL,L0A1A - LD (03209H),HL - RET - -L3301: LD A,(L0050) - OR A - RET NZ - RST 018H - DB 002H - RST 018H - DB 005H - PUSH HL - INC HL - LD A,022H - RST 018H - DB 003H - LD D,010H -L3312: LD A,(HL) - CP 00DH - JR Z,L331D ; (+006H) - RST 018H - DB 003H - INC HL - DEC D - JR NZ,L3312 ; (-00bH) -L331D: LD A,022H - RST 018H - DB 003H - RST 018H - DB 002H - POP HL - RET - -L3325: DB 057H,005H,"RITING" ; CMT status strings (WRITING/FOUND/LOADING/VERIFYING) - DS 3, 020H - DB 006H - DB 000H -L3332: DB 046H,005H,"OUND" - DS 5, 020H - DB 006H - DB 000H -L333F: DB 04CH,005H,"OADING" - DS 3, 020H - DB 006H - DB 000H -L334C: DB 056H,005H,"ERIFYING ",006H - NOP -; --------------------------------------------------------------------------- -; $RS - RS-232C device descriptor -; flags1 bit7=1: ZWDIR/ZFREE not used, overlap with RS_INIT code below. -; --------------------------------------------------------------------------- -$RS: DW $FD ; Next device = $FD (0x358D) - DB "RS",000H,000H ; Device name - DB 08FH ; flags1: bit7=1 (no dir/free) - DB 001H ; flags2 - DB 000H ; dirmx = 0 - DW 03372H ; ZINIT - DW 033A4H ; ZRO - DW 033A4H ; ZWO (same handler as ZRO) - DW 033B5H ; ZCL - DW 033B5H ; ZKL (same handler as ZCL) - DW 033C6H ; ZINP - DW 033DBH ; ZOUT - DW 000E5H ; ZDELT (= monitor ROM stub) -; ZWDIR/ZFREE implicit — next 4 bytes are ZINIT code, read as DW pointers -; (flags1 bit 7=1 → ZWDIR/ZFREE never called) -RS_INIT: RET C - PUSH IY - CALL L33EC - CALL L3380 - CALL L3435 - JR L33D8 ; (+058H) - -L3380: RST 018H - DB 013H - LD (IY-003H),E - CALL TEST1 - DB 02CH - JP NZ,L1F6A - RST 018H - DB 013H - LD (IY-002H),E - LD (IY-008H),00DH - CALL TEST1 - DB 000H - RET Z - CALL TEST1 - DB 02CH - RST 018H - DB 013H - LD (IY-008H),E - RET - - PUSH IY - CALL L33EC - LD A,(IY-001H) - INC (IY-001H) - OR A - CALL Z,L3497 - JR L33D8 ; (+023H) - - PUSH IY - CALL L33EC - DEC (IY-001H) - LD A,(IY-001H) - OR A - CALL Z,L347F - JR L33D7 ; (+011H) - - PUSH IY - CALL L33EC - CALL L34E6 - JR C,L33D8 ; (+008H) - CP (IY-008H) - JR NZ,L33D7 ; (+002H) - LD A,00DH -L33D7: OR A -L33D8: POP IY - RET - - PUSH IY - CALL L33EC - CP 00DH - JR NZ,L33E7 ; (+003H) - LD A,(IY-008H) -L33E7: CALL L352B - JR L33D8 ; (-014H) - -L33EC: PUSH AF - PUSH DE - LD A,(ZCH) - INC A - LD IY,033F7H - LD DE,L0015 -L33F9: ADD IY,DE - DEC A - JR NZ,L33F9 ; (-005H) - LD C,(IY+000H) - POP DE - POP AF - RET - - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - OR C - OR B - NOP - DJNZ L3421 ; (+010H) - INC B - LD B,B - INC BC - RET NZ - DEC B - LD H,B - JR NC,L341C ; (+003H) - NOP - NOP - NOP -L341C: NOP - NOP - NOP - NOP - NOP -L3421: OR E - OR D - NOP - DJNZ 03436H ; (+010H) - INC B - LD B,B - INC BC - RET NZ - DEC B - LD H,B - JR NC,L3431 ; (+003H) -L342E: CALL BRKCHK -L3431: RET NZ - JP 0017DH - -L3435: LD A,018H - OUT (C),A - LD A,030H - OUT (C),A - LD A,(IY-002H) - AND 00CH - JR NZ,L3448 ; (+004H) - SET 2,(IY-002H) -L3448: LD A,(IY-002H) - LD B,A - AND 00FH - OR 040H - LD (IY+006H),A - LD A,B - AND 080H - OR 040H - LD (IY+008H),A - RRA - AND 07FH - OR 00AH - LD (IY+00AH),A - LD A,B - OR 07FH - LD (IY+002H),A - CALL L348B -L346C: IN A,(C) - RRCA - RET NC - DEC C - IN A,(C) - INC C - LD A,001H - OUT (C),A - IN A,(C) - AND 070H - JR Z,L346C ; (-012H) - RET - -L347F: RES 0,(IY+008H) - RES 7,(IY+00AH) - LD (IY-001H),000H -L348B: LD B,00AH - PUSH IY - POP HL - LD DE,L0003 - ADD HL,DE - OTIR - RET - -L3497: LD A,030H - OUT (C),A - RET - -L349C: SET 0,(IY+008H) - LD A,013H - OUT (C),A - LD A,(IY+008H) - OUT (C),A - LD A,035H - OUT (C),A - LD A,(IY+00AH) - OR 088H - LD (IY+00AH),A - OUT (C),A - RET - - LD A,003H - OUT (C),A - RES 0,(IY+008H) - LD A,(IY+008H) - OUT (C),A -L34C5: RES 7,(IY+00AH) - JR L34DB ; (+010H) - -L34CB: SET 1,(IY+00AH) - JR L34DB ; (+00aH) - -L34D1: RES 1,(IY+00AH) - JR L34DB ; (+004H) - - SET 7,(IY+00AH) -L34DB: LD A,005H - OUT (C),A - LD A,(IY+00AH) - OUT (C),A - OR A - RET - -L34E6: CALL SKPDE - LD C,(IY+000H) -L34EC: CALL L342E - CALL L3564 - JR C,L34EC ; (-008H) - CALL L349C -L34F7: CALL L342E - IN A,(C) - RRCA - JR NC,L34F7 ; (-008H) - DEC C - IN A,(C) - INC C - AND (IY+002H) - PUSH AF - LD A,001H - OUT (C),A - IN A,(C) - AND 070H - JR NZ,L3516 ; (+005H) - CALL L34C5 - POP AF - RET - -L3516: LD B,A - POP AF - PUSH BC - CALL L3435 - POP BC - LD A,01DH - RLC B - RLC B - RET C - INC A - RLC B - RET C - INC A - SCF - RET - -L352B: CALL SKPDE - LD C,(IY+000H) - LD D,A - CALL L34CB -L3535: CALL L342E - CALL L356B - CALL NC,L357C -L353E: JR C,L3535 ; (-00bH) - IN A,(C) - BIT 2,A - JR Z,L3535 ; (-011H) - BIT 7,(IY-003H) - JR Z,L3555 ; (+009H) - LD A,001H - OUT (C),A - IN A,(C) - RRCA - JR NC,L3535 ; (-020H) -L3555: DEC C - OUT (C),D - INC C - BIT 6,(IY-003H) - JR Z,L3562 ; (+003H) - CALL L34D1 -L3562: OR A - RET - -L3564: OR A - BIT 0,(IY-003H) - JR L3570 ; (+005H) - -L356B: OR A - BIT 1,(IY-003H) -L3570: RET Z - LD A,010H - OUT (C),A - IN A,(C) - AND 008H - RET NZ - SCF - RET - -L357C: OR A - BIT 2,(IY-003H) - RET Z - LD A,010H - OUT (C),A - IN A,(C) - AND 020H - RET NZ - SCF - RET - -; $FD descriptor (original, restored) -$FD: DW $QD ; Next device = $QD - DB "FD",000H,000H ; Device name - DB 03FH ; ZFLAG1 (original, bit5=1 = ZINP-based DIR) - DB 003H ; ZFLAG2 (original) - DB 03FH ; ZDIRMX (original) - DW 0368DH ; func[0] ZINIT - DW 0000FH ; func[1] ZRO (original) - DW 00100H ; func[2] ZWO - DW 00030H ; func[3] ZCL - DW 000FEH ; func[4] ZKL - DW 03705H ; func[5] ZINP (original restored) - DW 03708H ; func[6] ZOUT - DW 01F97H ; func[7] ZDELT - DW 01F97H ; func[8] ZWDIR - DW 01F97H ; func[9] ZFREE - DB 000H -L35AB: DB 000H -L35AC: DB 000H -L35AD: DS 3, 000H -L35B0: DB 000H -L35B1: DS 2, 000H -L35B3: DB 000H -L35B4: DB 000H -L35B5: DB 000H -L35B6: DB 000H -L35B7: DS 4, 000H -L35BB: DS 4, 000H -L35BF: DB 000H -L35C0: PUSH BC - LD A,L - LD B,004H -L35C4: SRL H - RR L - DJNZ L35C4 ; (-006H) - AND 00FH - INC A - LD H,A - POP BC - RET - -L35D0: LD A,H - LD H,000H - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - DEC A - ADD A,L - LD L,A - RET - -L35DB: CALL SKPDE - LD HL,L35B5 - BIT 7,(HL) - JR NZ,L35EB ; (+006H) - CALL L367C - CALL L3898 -L35EB: LD A,(L35AC) - BIT 2,A - SET 2,A - JR Z,L35F6 ; (+002H) - SET 5,A -L35F6: SET 7,A - LD HL,L35B5 - BIT 6,(HL) - JR Z,L3601 ; (+002H) - SET 6,A -L3601: CALL L361C - LD (HL),A - LD HL,L35B7 - CALL L3614 - BIT 0,(HL) - CALL Z,L3695 - RET C - SET 0,(HL) - RET - -L3614: LD A,(L35AC) - AND 003H - JP ADDHLA - -L361C: OUT (0DCH),A - PUSH AF - RLCA - RLCA - OUT (0DDH),A - RLCA - OUT (0DEH),A - POP AF - RET - -L3628: CALL SKPDE - LD D,000H - LD A,(L35B3) - SRL A - CPL - OUT (0DBH),A - LD B,A - LD A,(L35B5) - RES 6,A - BIT 5,A - JR Z,L3640 ; (+001H) - CCF -L3640: JR C,L3644 ; (+002H) - SET 6,A -L3644: CALL L361C - LD HL,L35B5 - CP (HL) - LD (HL),A - JR Z,L364F ; (+001H) - INC D -L364F: LD HL,L35BB - CALL L3614 - LD A,(HL) - OUT (0D9H),A - CP B - JR Z,L3666 ; (+00bH) - INC D - CALL L3673 - PUSH AF - IN A,(0D9H) - LD (HL),A - POP AF - RET C - RET NZ -L3666: LD A,(L35B4) - CPL - OUT (0DAH),A - LD A,D - OR A - CALL NZ,L388D - XOR A - RET - -L3673: LD A,018H - CALL L36C2 - RET C - AND 099H - RET - -L367C: LD HL,L35B5 - SET 7,(HL) - LD A,(HL) - CALL L361C - LD HL,L35B7 - LD B,004H - JP ?CLRHL - -L368D: XOR A - CALL L361C - LD (L35B5),A - RET - -L3695: CALL SKPDE - LD HL,L35BB - CALL L3614 - LD (HL),0FFH - LD A,008H - CALL L36C2 - RET C - AND 085H - XOR 004H - RET Z - JP L385A - -L36AE: PUSH AF - LD A,LSD0 - CALL L36BB - JR C,L36B8 ; (+002H) - POP AF - RET - -L36B8: POP HL - POP HL - RET - -L36BB: CALL SKPDE - LD D,000H - JR L36DC ; (+01aH) - -L36C2: CALL SKPDE - LD B,A - LD A,(035AAH) - CPL - AND 003H - OR B - LD D,000H - JR L36D6 ; (+005H) - -L36D1: CALL SKPDE - LD D,001H -L36D6: CALL L36AE - LD (L35B6),A -L36DC: CPL - OUT (0D8H),A - CALL L3887 - LD E,007H -L36E4: LD HL,L2710 -L36E7: DEC HL - LD A,H - OR L - JP Z,L36F9 - IN A,(0D8H) - CPL - LD B,A - AND 081H - CP D - JR NZ,L36E7 ; (-00fH) - LD A,B - OR A - RET - -L36F9: DEC E - JP Z,L385A - LD A,(L35B6) - CPL - OUT (0D8H),A - JR L36E4 ; (-021H) - - DB 037H - JR L3709 ; (+001H) - - OR A -L3709: EX AF,AF' - PUSH AF - EX AF,AF' - LD (L35B1),HL - PUSH HL - LD HL,L35AB - RL (HL) - RRC (HL) - LD H,(HL) - LD L,A - AND 007H - LD (L35AC),A - CALL L35DB - JR NC,L3728 ; (+005H) - POP HL - EX AF,AF' - POP AF - EX AF,AF' - RET - -L3728: BIT 7,H - LD A,L - POP HL - PUSH HL - CALL Z,L37E7 - LD (035AFH),DE - PUSH DE - OR A - PUSH AF - LD H,B - LD L,C - CALL P,L35C0 - LD (L35AD),HL - LD A,009H - LD (L35BF),A - PUSH IY - CALL L375C - EX AF,AF' - POP IY - LD HL,(L35B3) - POP AF - CALL P,L35D0 - LD B,H - LD C,L - POP DE - POP HL - POP AF - EX AF,AF' - JP L37E7 - -L375C: LD E,000H - LD HL,(035AFH) - LD A,(L35B5) - BIT 5,A - JR Z,L376B ; (+003H) - ADD HL,HL - LD E,080H -L376B: LD A,L - OR A - JR Z,L3770 ; (+001H) - INC H -L3770: LD A,H - LD (L35B0),A -L3774: CALL L37FA - CALL NC,L3628 - RET C - JR NZ,L37E1 ; (+064H) - DI - LD A,(L35AB) - BIT 7,A - LD A,090H - LD IY,0A2EDH - JR NZ,L3791 ; (+006H) - LD A,0B4H - LD IY,0A3EDH -L3791: LD (L37A8),IY - CALL L36D1 - RET C -L3799: LD B,E - PUSH DE - LD DE,0FE7CH -L379E: IN A,(0D8H) - OR E - CP D - JR Z,L379E ; (-006H) - CP LSFC - JR NZ,L37AD ; (+005H) -L37A8: NOP - NOP - JP NZ,L379E -L37AD: POP DE - IN A,(0D8H) - RRA - JP C,L385A - LD A,(L35B4) - INC A - LD (L35B4),A - CP 011H - JR Z,L37C4 ; (+005H) - DEC D - JR NZ,L3799 ; (-029H) - JR L37C5 ; (+001H) - -L37C4: DEC D -L37C5: CALL L36AE - EI - IN A,(0D8H) - CPL - OR A - JR NZ,L37E1 ; (+012H) - LD A,(L35AB) - OR A - CALL Z,L3830 - JR C,L37E1 ; (+009H) - CALL L3818 - LD A,D - OR A - JR NZ,L3774 ; (-06bH) - XOR A - RET - -L37E1: CALL L380B - RET C - JR L3774 ; (-073H) - -L37E7: CALL IOOUT - LD A,(L35B5) - BIT 5,A - RET Z -L37F0: LD A,(HL) - CPL - LD (HL),A - INC HL - DEC DE - LD A,D - OR E - JR NZ,L37F0 ; (-009H) - RET - -L37FA: LD HL,(L35AD) - LD (L35B3),HL - LD HL,(L35B1) - LD A,(L35B0) - LD D,A - LD C,0DBH - OR A - RET - -L380B: CALL SKPDE - LD HL,L35BF - DEC (HL) - JP Z,L385A - JP L3695 - -L3818: LD (L35B1),HL - LD A,D - LD (L35B0),A - LD HL,(L35B3) - LD A,H - CP 011H - RET NZ - LD H,001H - INC L - LD (L35AD),HL - LD (L35B3),HL - RET - -L3830: LD A,(035AEH) - CPL - OUT (0DAH),A - LD A,090H - CALL L36D1 - RET C - LD A,(L35B4) - LD B,A -L3840: IN A,(0D8H) - CPL - AND 081H - CP 001H - JR NZ,L3852 ; (+009H) - IN A,(0DAH) - CPL - CP B - JR NZ,L3840 ; (-00fH) - CALL L36AE -L3852: IN A,(0D8H) - CPL - AND 099H - RET Z - SCF - RET - -L385A: LD A,(L35B6) - RLA - IN A,(0D8H) - CPL - JR NC,L3878 ; (+015H) - RLA - JR C,L387B ; (+015H) - RLA - JR NC,L3870 ; (+007H) - LD HL,L35AB - BIT 7,(HL) - JR Z,L387F ; (+00fH) -L3870: AND 0C0H - JR NZ,L3883 ; (+00fH) -L3874: LD A,029H - SCF - RET - -L3878: RLA - JR NC,L3874 ; (-007H) -L387B: LD A,032H - SCF - RET - -L387F: LD A,02EH - SCF - RET - -L3883: LD A,036H - SCF - RET - -L3887: PUSH DE - LD DE,L000F - JR L3891 ; (+004H) - -L388D: PUSH DE - LD DE,L2026 -L3891: DEC DE - LD A,E - OR D - JR NZ,L3891 ; (-005H) - POP DE - RET - -L3898: PUSH BC - LD B,011H -L389B: CALL L388D - DJNZ L389B ; (-005H) - POP BC - RET - -; --------------------------------------------------------------------------- -; $QD Device Descriptor (Quick Disk) -; --------------------------------------------------------------------------- -$QD: DW $RFS ; Next device = $RFS (was $USR at 0D5EH) - DB "QD",000H,000H ; Device name - DB 05FH ; flags1: bit5=1 ZINP-based DIR, bit6=1 ZRO enum - DB 040H ; flags2 - DB 020H ; dirmx: 32 (max directory entries) - DW QDINIT ; ZINIT handler - DW QDRO ; ZRO handler - DW QDWO ; ZWO handler - DW QDCL ; ZCL handler - DW 00400H ; ZKL (constant) - DW QDINP ; ZINP handler - DW QDOUT ; ZOUT handler - DW 00000H ; ZDELT (not supported) - DW 00000H ; ZWDIR (not supported) - DW QDFREE ; ZFREE handler -; -; --------------------------------------------------------------------------- -; QDFREE - Free space query (returns carry = not supported) -; --------------------------------------------------------------------------- -QDFREE: XOR A - SCF - RET -; -; --------------------------------------------------------------------------- -; QDINIT - Quick Disk initialization -; --------------------------------------------------------------------------- -QDINIT: RET C - CALL TEST1 - DB 059H ; Test for 'Y' - JR Z,L38D0 ; (+007H) - OR A - JP NZ,L1F6A - CALL L1E7A -L38D0: CALL L3924 - RET C - RST 018H - DB 010H - LD C,002H - JR L3919 ; (+03fH) -; -; --------------------------------------------------------------------------- -; QDCL - Quick Disk close -; --------------------------------------------------------------------------- -QDCL: OR A - JR NZ,L38FA ; (+01dH) - RST 018H - DB 010H - XOR A - LD (L395E),A - LD C,005H - CALL L38EB - LD BC,00001H -L38EB: LD (L3954),HL - LD (03956H),DE - LD HL,L3953 - LD (HL),B - DEC HL - LD (HL),C - JR L3968 ; (+06eH) - -L38FA: CALL SKPDE - LD C,006H - JR L3919 ; (+018H) -; -; --------------------------------------------------------------------------- -; QDRO - Quick Disk read open (ZRO handler) -; --------------------------------------------------------------------------- -QDRO: LD BC,L0003 - LD DE,00040H - CALL L38EB - RET NC - CP 028H - SCF - RET NZ - LD A,000H - RET -; -; --------------------------------------------------------------------------- -; QDINP - Quick Disk input (ZINP handler) -; --------------------------------------------------------------------------- -QDINP: RST 018H - DB 010H - LD D,B - LD E,C - LD BC,00103H -L3919: CALL L38EB - RST 018H - DB 011H - RET -; -; --------------------------------------------------------------------------- -; QDWO - Quick Disk write open (ZWO handler) -; --------------------------------------------------------------------------- -QDWO: LD A,037H - LD (L392C),A -L3924: LD BC,L0101 - JR L38EB ; (-03eH) -; -; --------------------------------------------------------------------------- -; QDOUT - Quick Disk output (ZOUT handler) -; --------------------------------------------------------------------------- -QDOUT: PUSH AF - RST 018H - DB 010H -L392C: XOR A - JR NC,L3943 ; (+014H) - LD A,0AFH - LD (L392C),A - CALL L1C2B - LD (L3958),HL - LD HL,ELMD - LD DE,00040H - POP AF - JR L3949 ; (+006H) - -L3943: LD (L3958),HL - POP AF - SET 0,A -L3949: LD (0395AH),BC - LD B,A - LD C,004H - JR L3919 ; (-039H) - - DB 000H -L3953: DB 000H -L3954: DS 4, 000H -L3958: DS 4, 000H -L395C: DB 000H -L395D: DB 000H -L395E: DB 000H -L395F: DB 000H -L3960: DB 000H -L3961: DB 000H -L3962: DB 000H -L3963: DB 000H -L3964: DB 000H -L3965: DS 3, 000H -L3968: LD A,005H - LD (L3964),A -L396D: DI - CALL L39BC - EI - RET NC - PUSH AF - CP 028H - JR Z,L39BA ; (+042H) - CALL L3C37 - LD A,(03952H) - CP 004H - JR NZ,L399F ; (+01dH) - LD A,(L3960) - OR A - JR Z,L399F ; (+017H) - XOR A - LD (L3960),A - LD A,(L3961) - PUSH HL - LD (03966H),SP - POP HL - DI - CALL L3BB7 - EI - JR C,L39B4 ; (+018H) - CALL L3C37 -L399F: POP AF - PUSH AF - CP 029H - JR NZ,L39B4 ; (+00fH) - LD HL,L3964 - DEC (HL) - JR Z,L39B4 ; (+009H) - POP AF - LD A,(L395F) - LD (L395E),A - JR L396D ; (-047H) - -L39B4: CALL L3B29 - CALL L39D5 -L39BA: POP AF - RET - -L39BC: LD (03966H),SP - LD A,(03952H) - DEC A - JR Z,L39DC ; (+016H) - DEC A - JR Z,L39E2 ; (+019H) - DEC A - JR Z,L3A2C ; (+060H) - DEC A - JP Z,L3A9C - DEC A - JR Z,L39D5 ; (+002H) - JR L3A25 ; (+050H) - -L39D5: PUSH AF - XOR A - LD (L395C),A - POP AF - RET - -L39DC: LD A,(L3953) - JP L3B8B - -L39E2: XOR A - CALL L3BB7 - CALL L3CB5 - LD BC,0EFFFH - LD A,0AAH -L39EE: CPL - LD D,A - CALL L3D2C - DEC BC - LD A,B - OR C - JR Z,L39FB ; (+003H) - LD A,D - JR L39EE ; (-00dH) - -L39FB: CALL L3D02 - CALL L3C37 - CALL L3BEA - LD A,(L3962) - DEC A - JR NZ,L3A28 ; (+01eH) - CALL L3C4C - LD BC,0EFFFH - LD E,055H -L3A12: CP E - JR NZ,L3A28 ; (+013H) - DEC BC - LD A,B - OR C - JR Z,L3A22 ; (+008H) - LD A,E - CPL - LD E,A - CALL L3D42 - JR L3A12 ; (-010H) - -L3A22: CALL L3D14 -L3A25: JP L3C37 - -L3A28: LD A,029H - SCF - RET - -L3A2C: LD A,(L3963) - OR A - CALL Z,L3BEA - CALL L3A62 - RET C - CALL L3D87 - CALL L3D42 - LD C,A -L3A3E: CALL L3D42 - LD B,A - LD HL,(03956H) - SBC HL,BC - JP C,L3B33 - LD HL,(L3954) -L3A4D: CALL L3D42 - LD (HL),A - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3A4D ; (-00aH) - CALL L3D14 - LD A,(L3953) - BIT 0,A - JR NZ,L3A25 ; (-03cH) - RET - -L3A62: LD HL,L3962 - DEC (HL) - JR Z,L3A98 ; (+030H) - CALL L3C4C - LD C,A - LD A,(L395C) - LD HL,L395D - CP (HL) - JR NZ,L3A95 ; (+020H) - INC A - LD (L395C),A - LD (HL),A - LD A,(L3953) - XOR C - RRA - RET NC -L3A80: CALL L3D42 - LD C,A - CALL L3D42 - LD B,A -L3A88: CALL L3D42 - DEC BC - LD A,B - OR C - JR NZ,L3A88 ; (-008H) - CALL L3D14 - JR L3A62 ; (-033H) - -L3A95: INC (HL) - JR L3A80 ; (-018H) - -L3A98: LD A,028H - SCF - RET - -L3A9C: LD A,(L395E) - LD (L395F),A - LD A,(L3963) - OR A - JR NZ,L3ABF ; (+017H) - CALL L3BEA - LD A,(L395E) - LD HL,L3962 - ADD A,(HL) - LD (L3962),A - INC A - LD (L395C),A - CALL L3A62 - JP NC,L3B33 -L3ABF: LD A,(L3953) - LD B,A - AND 001H - JR NZ,L3AD3 ; (+00cH) - LD DE,L3954 - LD A,B - RES 2,A - CALL L3B3C - CALL L3D87 -L3AD3: LD DE,L3958 - LD A,(L3953) - SET 0,A - CALL L3B3C - CALL L3C37 - CALL L3D87 - LD A,(L3953) - AND 004H - JR Z,L3B37 ; (+04cH) - LD A,(L3961) - LD HL,L395E - ADD A,(HL) - CALL L3BB7 - LD A,001H - LD (L3960),A -L3AFA: LD A,(L3961) - LD HL,L395F - ADD A,(HL) - INC A - LD (L3962),A - INC A - LD (L395C),A - CALL L3A62 - JR NC,L3B33 ; (+025H) - LD A,(L3953) - AND 001H - JR NZ,L3B1C ; (+007H) - LD DE,L3954 - CALL L3B6A - RET C -L3B1C: LD DE,L3958 - CALL L3B6A - RET C - LD A,(L3960) - OR A - JR Z,L3B30 ; (+007H) -L3B29: XOR A - LD (L395E),A - LD (L3960),A -L3B30: JP L3C37 - -L3B33: LD A,029H - SCF - RET - -L3B37: CALL L3BEA - JR L3AFA ; (-042H) - -L3B3C: PUSH AF - LD HL,L395E - INC (HL) - CALL L3CB5 - POP AF - CALL L3D2C - CALL L3B60 - LD A,C - CALL L3D2C - LD A,B - CALL L3D2C -L3B53: LD A,(HL) - CALL L3D2C - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3B53 ; (-00aH) - JP L3D02 - -L3B60: EX DE,HL - LD E,(HL) - INC HL - LD D,(HL) - INC HL - LD C,(HL) - INC HL - LD B,(HL) - EX DE,HL - RET - -L3B6A: CALL L3C4C - CALL L3B60 - CALL L3D42 - CP C - JR NZ,L3B33 ; (-043H) - CALL L3D42 - CP B - JR NZ,L3B33 ; (-049H) -L3B7C: CALL L3D42 - CP (HL) - JR NZ,L3B33 ; (-04fH) - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3B7C ; (-00cH) - JP L3D14 - -L3B8B: LD B,A - LD A,002H - OUT (0F7H),A - LD A,081H - OUT (0F7H),A - LD A,002H - OUT (0F7H),A - IN A,(0F7H) - AND 0F0H - CP 080H - JP NZ,03D58H - LD A,010H - OUT (0F6H),A - IN A,(0F6H) - LD C,A - AND 008H - JP Z,03D58H - LD A,B - OR A - RET Z - LD A,C - AND 020H - RET NZ - JP 03D55H - -L3BB7: PUSH AF - LD HL,03D7EH - LD B,009H - CALL L3C27 -L3BC0: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 008H - JP Z,03D58H - LD A,010H - OUT (0F7H),A - IN A,(0F7H) - AND 008H - JR Z,L3BC0 ; (-015H) - LD BC,L00E9 - CALL L3D66 - CALL L3CEA - CALL L3CCE - POP AF - CALL L3D2C - CALL L3D02 - JR L3C1D ; (+033H) - -L3BEA: LD HL,L3D73 - LD B,00BH - CALL L3C27 -L3BF2: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 008H - JP Z,03D58H - CALL L3D87 - LD A,010H - OUT (0F7H),A - IN A,(0F7H) - AND 008H - JR Z,L3BF2 ; (-018H) - LD BC,L00E9 - CALL L3D66 - CALL L3C62 - LD (L3961),A - INC A - LD (L3962),A - CALL L3D14 -L3C1D: LD HL,L3965 - SET 3,(HL) - XOR A - LD (L395D),A - RET - -L3C27: LD C,0F6H - OTIR - LD A,005H - LD (L3963),A - OUT (0F7H),A - LD A,080H - OUT (0F7H),A - RET - -L3C37: PUSH AF - LD A,005H - OUT (0F6H),A - LD A,060H - OUT (0F6H),A - LD A,005H - OUT (0F7H),A - XOR A - LD (L3963),A - OUT (0F7H),A - POP AF - RET - -L3C4C: LD A,058H - LD B,00BH - LD HL,L3D73 - CALL L3CF3 - LD HL,L3965 - BIT 3,(HL) - LD BC,L0003 - JR Z,L3C65 ; (+005H) - RES 3,(HL) -L3C62: LD BC,L00A0 -L3C65: CALL L3D66 - LD A,005H - OUT (0F7H),A - LD A,082H - OUT (0F7H),A - LD A,003H - OUT (0F6H),A - LD A,LSD3 - OUT (0F6H),A - LD BC,L2CC0 -L3C7B: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 010H - JR Z,L3C8D ; (+008H) - DEC BC - LD A,B - OR C - JR NZ,L3C7B ; (-00fH) - JP 03D5EH - -L3C8D: LD A,003H - OUT (0F6H),A - LD A,0C3H - OUT (0F6H),A - LD B,09FH -L3C97: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 001H - JR NZ,L3CA7 ; (+006H) - DEC B - JR NZ,L3C97 ; (-00dH) - JP 03D5EH - -L3CA7: LD A,003H - OUT (0F6H),A - LD A,0C9H - OUT (0F6H),A - CALL L3D42 - JP L3D42 - -L3CB5: LD A,098H - LD B,009H - LD HL,03D7EH - CALL L3CF3 - CALL L3CEA - LD HL,L3965 - BIT 3,(HL) - LD BC,0001DH - JR Z,L3CD1 ; (+005H) - RES 3,(HL) -L3CCE: LD BC,L0140 -L3CD1: CALL L3D66 - LD A,005H - OUT (0F6H),A - LD A,0EFH - OUT (0F6H),A - LD BC,00001H - CALL L3D66 - LD A,0C0H - OUT (0F6H),A - LD A,0A5H - JR L3D2C ; (+042H) - -L3CEA: LD A,005H - OUT (0F6H),A - LD A,0FFH - OUT (0F6H),A - RET - -L3CF3: LD C,0F6H - OUT (C),A - LD A,005H - OUT (0F7H),A -L3CFB: LD A,080H - OUT (0F7H),A - OTIR - RET - -L3D02: LD BC,00001H - CALL L3D66 - LD A,010H - OUT (0F7H),A - IN A,(0F7H) - AND 008H - RET NZ - JP 03D5BH - -L3D14: LD B,003H -L3D16: CALL L3D42 - DJNZ L3D16 ; (-005H) -L3D1B: IN A,(0F6H) - RRCA - JR NC,L3D1B ; (-005H) - LD A,001H - OUT (0F6H),A - IN A,(0F6H) - AND 040H - JR NZ,L3D52 ; (+028H) - OR A - RET - -L3D2C: PUSH AF -L3D2D: IN A,(0F6H) - AND 004H - JR Z,L3D2D ; (-006H) - POP AF - OUT (QDPC),A -L3D36: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 008H - JP Z,03D58H - RET - -L3D42: CALL L3D36 - IN A,(0F6H) - RLCA - JR C,L3D52 ; (+008H) - RRCA - RRCA - JR NC,L3D42 ; (-00cH) - IN A,(QDPC) - OR A - RET - -L3D52: LD A,029H - LD HL,02E3EH - LD HL,0323EH - LD HL,L353E - LD HL,0363EH - LD SP,(03966H) - SCF - RET - -L3D66: PUSH AF -L3D67: LD A,096H -L3D69: DEC A - JR NZ,L3D69 ; (-003H) - DEC BC - LD A,B - OR C - JR NZ,L3D67 ; (-00aH) - POP AF - RET - -L3D73: LD E,B - INC B - DJNZ L3D7C ; (+005H) - INC B - INC BC - RET NC - LD B,016H -L3D7C: RLCA - LD D,098H - INC B - DJNZ 03D88H ; (+006H) - LD D,007H - LD D,005H - LD L,L -L3D87: LD A,0E8H - OUT (LSE3),A - LD (MMIO),A - NOP - LD A,(0E001H) - OUT (LSE1),A - AND 081H - RET NZ - CALL L3B29 - JP L017B - - PUSH HL - LD DE,(00188H) - PUSH DE - LD DE,L3DE4 - LD (00188H),DE - LD A,(L004F) - PUSH AF - LD A,064H - LD (L004F),A - LD (03E5BH),SP - XOR A - LD (FILOUT),A -L3DBB: LD SP,L0000 -L3DBE: LD BC,L3DBE - PUSH BC - RST 018H - DB 002H - LD A,02AH - RST 018H - DB 003H -L3DC8: CALL L3E67 - JR NC,L3DC8 ; (-005H) - LD A,(DE) - CP 02AH - RET NZ - INC DE - LD A,(DE) - INC DE - EXX - LD HL,L3DF6 - LD B,00AH -L3DDA: CP (HL) - INC HL - JR Z,L3DF0 ; (+012H) - INC HL - INC HL - DJNZ L3DDA ; (-008H) - EXX - RET - -L3DE4: LD C,A - AND 07FH - JR Z,L3DBB ; (-02eH) - LD A,C - RST 018H - DB 01BH - RST 018H - DB 043H - JR L3DBB ; (-035H) - -L3DF0: LD E,(HL) - INC HL - LD D,(HL) - PUSH DE - EXX - RET - -L3DF6: LD B,H - CALL C,L4D3E - LD C,(HL) - CCF - LD D,B - INC D - LD A,047H - RST 010H - LD A,046H - LD (HL),D - CCF - LD D,D -L3E06: LD E,D - LD A,053H - DEC E - LD A,04CH - INC (HL) - LD A,056H - LD D,C - LD A,054H - JP NZ,03A3FH - SUB C - DJNZ L3E06 ; (-012H) - LD BC,09132H - DJNZ 03DE6H ; (-037H) - CALL L3FAB - RET C - EXX - CALL L3FD9 - EXX - LD (ELMD20),BC - LD (ELMD22),DE - LD (ELMD24),HL - RST 018H - DB 031H - RET - - CALL L3E88 - PUSH HL - PUSH AF - CALL L3E46 - POP AF - POP HL - JR NC,L3E43 ; (+003H) - LD HL,(ELMD22) -L3E43: RST 018H - DB 030H - RET - -L3E46: CALL L3FD9 - RST 018H - DB 02FH - CP 001H - RET Z - JP 01F9DH - - CALL L3E46 - LD HL,(ELMD22) - RST 018H - DB 032H - RET - - LD SP,L0000 - POP AF - LD (L004F),A - POP HL - LD (00188H),HL - POP HL - RET - -L3E67: LD DE,0FF00H - RST 018H - DB 00CH - JR C,L3E86 ; (+018H) - LD A,(DE) - CP 03AH - SCF - RET NZ - INC DE - CALL L3E88 - RET C - LD A,(DE) - INC DE - XOR 03DH - RET NZ -L3E7D: CALL L3EAD - CCF - RET NC - LD (HL),A - INC HL - JR L3E7D ; (-009H) - -L3E86: LD (DE),A - RET - -L3E88: PUSH HL - CALL L3EA2 - PUSH DE - CALL L3EB4 - JR C,L3E9D ; (+00bH) - LD H,A - CALL L3EB4 - JR C,L3E9D ; (+005H) - LD L,A - POP AF - POP AF - XOR A - RET - -L3E9D: POP DE - POP HL - SCF - RET - -L3EA1: INC DE -L3EA2: LD A,(DE) - CP 020H - JR Z,L3EA1 ; (-006H) - RET - -L3EA8: LD A,(DE) - RST 018H - DB 015H - INC DE - RET - -L3EAD: CALL L3EA2 - CP 03BH - JR Z,L3ED2 ; (+01eH) -L3EB4: PUSH BC - PUSH DE - CALL L3EA8 - JR C,L3ECE ; (+013H) - LD C,A - CALL L3EA8 - JR C,L3ECE ; (+00dH) - LD B,A - LD A,C - RLCA - RLCA - RLCA - RLCA - ADD A,B - LD C,A - LD A,C - POP BC - POP BC - OR A - RET - -L3ECE: POP DE - POP BC - SCF - RET - -L3ED2: INC DE - LD A,(DE) - INC DE - OR A - RET - - CALL L3E88 - RET C - JP (HL) - - CALL L3E88 - JR C,L3EEC ; (+00bH) - PUSH HL - CALL L3E88 - JR C,L3EEB ; (+004H) - POP DE - EX DE,HL - JR L3EF2 ; (+007H) - -L3EEB: POP HL -L3EEC: EX DE,HL - LD HL,L0080 - ADD HL,DE - EX DE,HL -L3EF2: LD C,008H - CALL L3EFF - RET C - PUSH HL - SBC HL,DE - POP HL - RET NC - JR L3EF2 ; (-00dH) - -L3EFF: CALL L3F27 - LD B,C - PUSH HL -L3F04: LD A,(HL) - CALL L3F38 - INC HL - LD A,020H - RST 018H - DB 009H - DJNZ L3F04 ; (-00bH) - POP HL - LD A,02FH - RST 018H - DB 009H - LD B,C -L3F15: LD A,(HL) - CP 020H - JR NC,L3F1C ; (+002H) - LD A,02EH -L3F1C: RST 018H - DB 009H - INC HL - DJNZ L3F15 ; (-00cH) - RST 018H - DB 008H - RST 018H - DB 00FH - OR A - RET - -L3F27: LD A,03AH - RST 018H - DB 009H - LD A,H - CALL L3F38 - LD A,L - CALL L3F38 - LD A,03DH - RST 018H - DB 009H - RET - -L3F38: PUSH AF - RLCA - RLCA - RLCA - RLCA - CALL L3F41 - POP AF -L3F41: AND 00FH - ADD A,030H - CP 03AH - JR C,L3F4B ; (+002H) - ADD A,007H -L3F4B: RST 018H - DB 009H - RET - - CALL L3E88 - LD A,(FILOUT) - PUSH AF - XOR A - LD (FILOUT),A -L3F59: RST 018H - DB 002H - CALL L3F27 - LD A,(HL) - CALL L3F38 - LD A,014H - RST 018H - DB 003H - RST 018H - DB 003H - CALL L3E67 - JR NC,L3F59 ; (-014H) - POP AF - LD (FILOUT),A - RET - - CALL L3E88 - RET C - PUSH HL - CALL L3E88 - POP BC - RET C - PUSH HL - PUSH BC - LD HL,0FF00H - CALL L3E7D - LD DE,0FF00H - OR A - SBC HL,DE - LD C,L - POP HL - PUSH HL - EXX - POP HL - POP DE - EXX - RET Z -L3F92: CALL L3FEC - JR NZ,L3F9B ; (+004H) - CALL L3EFF - RET C -L3F9B: RST 018H - DB 00EH - RET Z - EXX - INC HL - PUSH HL - SCF - SBC HL,DE - POP HL - RET NC - PUSH HL - EXX - POP HL - JR L3F92 ; (-019H) - -L3FAB: CALL L3E88 - PUSH HL - CALL NC,L3E88 - POP BC - RET C - SBC HL,BC - INC HL - PUSH HL - PUSH BC - CALL L3E88 - PUSH HL - EXX - POP HL - POP DE - POP BC - RET - - CALL L3FAB - RET C - EX DE,HL - PUSH HL - SBC HL,DE - POP HL - JR C,L3FD0 ; (+003H) - LDIR - RET - -L3FD0: ADD HL,BC - DEC HL - EX DE,HL - ADD HL,BC - DEC HL - EX DE,HL - LDDR - RET - -L3FD9: LD A,(DE) - OR A - JR Z,L3FE2 ; (+005H) - INC DE - CP 03AH - JR NZ,L3FD9 ; (-009H) -L3FE2: RST 018H - DB 017H - RST 018H - DB 02DH - LD A,001H - LD (ELMD),A - RET - -L3FEC: LD A,(DE) - CP (HL) - RET NZ - PUSH BC - PUSH DE - PUSH HL - LD B,C -L3FF3: LD A,(DE) - CP (HL) - JR NZ,L3FFC ; (+005H) - INC DE - INC HL - DJNZ L3FF3 ; (-008H) - XOR A -L3FFC: POP HL - POP DE - POP BC - RET - -L4000: LD HL,RFS_END ; TEXTST: moved past RFS module (was 085FFH) - LD (TEXTST),HL - LD HL,L4046 - LD (000E3H),HL - LD A,B - OR A - JR Z,L401B ; (+00bH) - LD HL,L4036 - LD DE,L1361 - LD BC,00010H - LDIR -L401B: LD DE,L84E7 - RST 018H - DB 005H - JP MEMCLI_PATCH ; MEMCLI: call SVC 020H then set HL=RFS_END (was SVC 020H + EX DE,HL) -L4023: LD (HL),000H - INC HL - LD A,H - CP 0FFH - JR C,L4023 ; (-008H) -L402B: CALL L4902 - CALL L4914 - CALL L5E1D - JR L404A ; (+014H) - -; --------------------------------------------------------------------------- -; Auto-run command string (16 bytes, copied into F-key slot at startup) -; L403E overlaps: referenced as "TO RUN"\r (suffix of "AUTO RUN"\r) -; --------------------------------------------------------------------------- -L4036: DB 00FH,"RUN ",022H ; Length (15) + 'RUN "' -L403E: DB "AUTO RUN",022H,00DH ; 'AUTO RUN"\r' (also read as 'TO RUN"\r' via L403E+2) -; --------------------------------------------------------------------------- -; Hook snippet installed at 0x00E3 — executed in-place as Z80 code -; --------------------------------------------------------------------------- -L4046: LD A,016H ; 3E 16 - RST 018H ; DF - DB 003H ; SVC #3 -L404A: LD HL,L4B85 - LD (00188H),HL -L4050: RST 018H - DB 002H - LD DE,L4B72 - RST 018H - DB 005H - RST 018H - DB 001H -L4059: LD A,(L4B78) - OR A - JR NZ,L406B ; (+00cH) - LD SP,(INTFAC) - LD HL,0FFFFH - PUSH HL - LD (08496H),SP -L406B: LD HL,L0000 - LD (L8483),HL - XOR A - LD (L0050),A - CALL L48B1 - RST 018H - DB 043H - LD DE,KEYBUF - RST 018H - DB 00CH - JR NC,L408D ; (+00cH) -L4081: LD HL,L48B0 - LD A,(HL) - OR A - LD (HL),000H - JR NZ,L4050 ; (-03aH) - JR L4059 ; (-033H) - -L408C: INC DE -L408D: LD A,(DE) - CP 020H - JR Z,L408C ; (-006H) - OR A - JR Z,L4059 ; (-03cH) - CALL L5EC4 - JP NC,L473E - LD HL,L84E7 - PUSH HL - CALL L66EF - INC HL - LD (L847D),HL - CALL L4952 - POP HL - JR L40AF ; (+003H) - -L40AC: CALL 05E48H -L40AF: LD (08496H),SP -L40B3: LD DE,L40AC - PUSH DE -L40B7: LD (L8498),HL - CALL BRKCHK - JP Z,0017DH -L40C0: LD A,(HL) - INC HL - CP 080H - JR NC,L411A ; (+054H) - CP 027H - JP Z,L4F8A - CP 020H - JR Z,L40C0 ; (-00fH) - CP 03AH - JR Z,L40B7 ; (-01cH) - OR A - JR Z,L40E1 ; (+00bH) - DEC HL - SUB 041H - CP 01AH - JP C,L4C99 - JP L4AEC - -L40E1: LD HL,(L847D) -L40E4: LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - JR Z,L4103 ; (+018H) - LD (L0050),A - EX DE,HL - ADD HL,DE - DEC HL - LD (L847D),HL - EX DE,HL - INC HL - CALL LDDEMI - LD (08483H),DE - CALL L4971 - POP DE - JR L40AF ; (-054H) - -L4103: POP HL - CALL L4146 - JP Z,L4050 - XOR A - LD (L4B78),A - LD A,(L8486) - CP 002H - JP Z,04B19H - PUSH HL - JP L484D - -L411A: CP 0FFH - JP Z,L4CCB - LD DE,L44AC - CP 0FEH - JR NZ,L412A ; (+004H) - LD A,(HL) - INC HL - JR L4132 ; (+008H) - -L412A: CP LSE0 - JP NC,L4AEC - LD DE,L43EC -L4132: ADD A,A - PUSH HL - EX DE,HL - LD E,A - LD D,000H - ADD HL,DE - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - EX (SP),HL -L413E: CALL HLFTCH -L4141: OR A - RET Z - CP 03AH - RET - -L4146: PUSH HL - LD HL,(L8483) - LD A,L - OR H - POP HL - RET - - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -STMTWORDTBL:DB "GOT", "O" | 080H ; BASIC statement keyword text table - DB "GOSU", "B" | 080H - DB 080H - DB "RU", "N" | 080H - DB "RETUR", "N" | 080H - DB "RESTOR", "E" | 080H - DB "RESUM", "E" | 080H - DB "LIS", "T" | 080H - DB 080H - DB "DELET", "E" | 080H - DB "RENU", "M" | 080H - DB "AUT", "O" | 080H - DB "EDI", "T" | 080H -L4193: DB "FO", "R" | 080H - DB "NEX", "T" | 080H - DB "PRIN", "T" | 080H - DB 080H - DB "INPU", "T" | 080H - DB 080H - DB "I", "F" | 080H - DB "DAT", "A" | 080H - DB "REA", "D" | 080H - DB "DI", "M" | 080H - DB "RE", "M" | 080H - DB "EN", "D" | 080H - DB "STO", "P" | 080H - DB "CON", "T" | 080H - DB "CL", "S" | 080H - DB 080H - DB "O", "N" | 080H - DB "LE", "T" | 080H - DB "NE", "W" | 080H - DB "POK", "E" | 080H - DB "OF", "F" | 080H - DB "MOD", "E" | 080H - DB "SKI", "P" | 080H - DB "PLO", "T" | 080H - DB "LIN", "E" | 080H - DB "RLIN", "E" | 080H - DB "MOV", "E" | 080H - DB "RMOV", "E" | 080H - DB "TRO", "N" | 080H - DB "TROF", "F" | 080H - DB "INP", "@" | 080H - DB "DEFAUL", "T" | 080H - DB "GE", "T" | 080H - DB "PCOLO", "R" | 080H - DB "PHOM", "E" | 080H - DB "HSE", "T" | 080H - DB "GPRIN", "T" | 080H - DB "KE", "Y" | 080H - DB "AXI", "S" | 080H - DB "LOA", "D" | 080H - DB "SAV", "E" | 080H - DB "MERG", "E" | 080H - DB "CHAI", "N" | 080H - DB "CONSOL", "E" | 080H - DB "SEARC", "H" | 080H - DB "OUT", "@" | 080H - DB "CIRCL", "E" | 080H - DB "TES", "T" | 080H - DB "PAG", "E" | 080H - DB "WAI", "T" | 080H - DB "SWA", "P" | 080H - DB 080H - DB "ERRO", "R" | 080H - DB "ELS", "E" | 080H - DB "US", "R" | 080H - DB "BY", "E" | 080H - DB 080H - DB 080H - DB "DE", "F" | 080H - DB 080H - DB 080H - DB "LABE", "L" | 080H - DB 080H - DB 080H - DB 080H - DB "WOPE", "N" | 080H - DB "CLOS", "E" | 080H - DB "ROPE", "N" | 080H - DB "XOPE", "N" | 080H - DB 080H - DB 080H - DB 080H - DB "DI", "R" | 080H - DB 080H - DB 080H - DB "RENAM", "E" | 080H - DB "KIL", "L" | 080H - DB "LOC", "K" | 080H - DB "UNLOC", "K" | 080H - DB "INI", "T" | 080H - DB 080H - DB 080H - DB "RMO", "V" | 080H - DB "T", "O" | 080H - DB "STE", "P" | 080H - DB "THE", "N" | 080H - DB "USIN", "G" | 080H - DB 080H - DB 080H - DB "TA", "B" | 080H - DB "SP", "C" | 080H - DB 080H - DB 080H - DB ".XO", "R" | 080H - DB ".O", "R" | 080H - DB ".AN", "D" | 080H - DB ".NO", "T" | 080H - DB ">", "<" | 080H - DB "<", ">" | 080H - DB "=", "<" | 080H - DB "<", "=" | 080H - DB "=", ">" | 080H - DB ">", "=" | 080H - DB "=" | 080H - DB ">" | 080H - DB "<" | 080H - DB "+" | 080H - DB "-" | 080H - DB 080H - DB 080H - DB "/" | 080H - DB "*" | 080H - DB "^" | 080H - DB 0FFH -EXTWORDTBL: DB 080H ; BASIC extended keyword text table - DB "SE", "T" | 080H - DB "RESE", "T" | 080H - DB "COLO", "R" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "BEE", "P" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "MUSI", "C" | 080H - DB "TEMP", "O" | 080H - DB "CURSO", "R" | 080H - DB "VERIF", "Y" | 080H - DB "CL", "R" | 080H -L433E: DB "LIMI", "T" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "BOO", "T" | 080H - DB 0FFH -FUNCWORDTBL:DB "IN", "T" | 080H ; BASIC function keyword text table - DB "AB", "S" | 080H - DB "SI", "N" | 080H - DB "CO", "S" | 080H - DB "TA", "N" | 080H - DB "L", "N" | 080H - DB "EX", "P" | 080H - DB "SQ", "R" | 080H - DB "RN", "D" | 080H - DB "PEE", "K" | 080H - DB "AT", "N" | 080H - DB "SG", "N" | 080H - DB "LO", "G" | 080H - DB "FRA", "C" | 080H - DB "PA", "I" | 080H - DB "RA", "D" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "JO", "Y" | 080H - DB 080H - DB "CHR", "$" | 080H - DB "STR", "$" | 080H - DB "HEX", "$" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "SPACE", "$" | 080H - DB 080H - DB 080H - DB "AS", "C" | 080H - DB "LE", "N" | 080H - DB "VA", "L" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "ER", "N" | 080H - DB "ER", "L" | 080H - DB "SIZ", "E" | 080H - DB "CSR", "H" | 080H - DB "CSR", "V" | 080H - DB 080H - DB 080H - DB "LEFT", "$" | 080H - DB "RIGHT", "$" | 080H - DB "MID", "$" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "TI", "$" | 080H - DB 080H - DB "EO", "F" | 080H - DB "F", "N" | 080H - DB 0FFH -L43EC: DW L5147 ; Keyword dispatch address table - DW L50C2 - DW L4AEC - DW L47FF - DW L5091 - DW L5828 - DW L4C38 - DW 052C2H - DW L4AEC - DW L4999 - DW L4A38 - DW L485E - DW L48B9 - DW L4D8E - DW L4E25 - DW L561E - DW L4AEC - DW L575B - DW L4AEC - DW L515A - DW L4F8A - DW L5754 - DW L76AC - DW L4F8A - DW L484D - DW L4BEA - DW L4C1B - DW L5537 - DW L4AEC - DW L50EA - DW L4C99 - DW L4922 - DW L5024 - DW L4AEC - DW L6A24 - DW L6A87 - DW L6E22 - DW L6AD4 - DW 06AD7H - DW 06ADAH - DW 06ADDH - DW L4959 - DW L496C - DW L4FAB - DW L58CA - DW L4FEF - DW L6B3F - DW L6B71 - DW L6B7B - DW L6B85 - DW L53A9 - DW L6BEA - DW L5986 - DW L5C88 - DW L59EA - DW L59D5 - DW L5260 - DW L52C0 - DW L4F96 - DW L6C2A - DW L6DF8 - DW L6E03 - DW L4F7A - DW L5D65 - DW L4AEC - DW L4B7A - DW L517C - DW L4F30 - DW L5258 - DW L4AEC - DW L4AEC - DW L5456 - DW L4AEC - DW L4AEC - DW L4F8A - DW L4AEC - DW L4AEC - DW L4AEC - DW 058E2H - DW L5913 - DW L58DF - DW 058E5H - DW L4AEC - DW L4AEC - DW L4AEC - DW L5CE3 - DW L4AEC - DW L4AEC - DW L5D0A - DW 05914H - DW 05CD7H - DW L5CD5 - DW L58D0 - DW L4AEC - DW L4AEC - DW L4AEC -L44AC: DW L4AEC - DW L51EE - DW 051EFH - DW L54A6 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L5255 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L54FD - DW L551F - DW L4FC7 - DW L5C71 - DW L4928 - DW L504D - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L52BA -L450A: DW L7E8B - DW L7E86 - DW L7FD2 - DW L7FC2 - DW L80B1 - DW L8320 - DW L81FC - DW L7EE8 - DW L81B7 - DW L81A3 - DW L7F06 - DW L8169 - DW L8314 - DW L608D - DW L8181 - DW L817C - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L792C - DW L4AEC - DW L4AEC - DW L7237 - DW L71F6 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L7219 - DW L4AEC - DW L4AEC - DW L7272 - DW L727C - DW L7284 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L7180 - DW L718E - DW L7164 - DW L7176 - DW L717B - DW L4AEC - DW L4AEC - DW L7296 - DW L72B3 - DW L72D0 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L7326 - DW L4AEC - DW L7245 - DW L789F - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC -L45AA: CALL TEST1 - DB 00CH - JR NZ,L45B6 ; (+006H) - CALL LDDEMI - OR 0FFH - RET - -L45B6: INC HL - CP 00BH - JR NZ,L45DA ; (+01fH) - LD E,(HL) - INC HL - LD D,(HL) - INC HL - LD A,E - OR D - RET Z - EX DE,HL - CALL L4609 - JP C,04B0DH - EX DE,HL - DEC HL - LD (HL),D - DEC HL - LD (HL),E - DEC HL - LD (HL),00CH - INC HL - INC HL - INC HL - OR 0FFH - LD (L473D),A - RET - -L45DA: CP 022H - JP NZ,L4AEC - LD (04650H),HL - LD B,000H -L45E4: LD A,(HL) - OR A - JR Z,L45F0 ; (+008H) - INC HL - CP 022H - JR Z,L45F0 ; (+003H) - INC B - JR L45E4 ; (-00cH) - -L45F0: LD A,B - OR A - JP Z,L4AEC - LD (0464EH),A - EX DE,HL - CALL L4603 - JP C,04B0DH - EX DE,HL - OR 0FFH - RET - -L4603: PUSH BC - LD BC,L463C - JR L460D ; (+004H) - -L4609: PUSH BC - LD BC,L4630 -L460D: LD (04623H),BC - PUSH DE - EX DE,HL - LD HL,(TEXTST) -L4616: LD C,(HL) - INC HL - LD B,(HL) - LD A,B - OR C - SCF - JR Z,L462D ; (+00fH) - DEC HL - PUSH HL - ADD HL,BC - EX (SP),HL - CALL L0000 - JR C,L462C ; (+005H) - JR Z,L462C ; (+003H) - POP HL - JR L4616 ; (-016H) - -L462C: POP DE -L462D: POP DE - POP BC - RET - -L4630: INC HL - INC HL - INC HL - LD A,D - CP (HL) - RET NZ - DEC HL - LD A,E - CP (HL) - DEC HL - DEC HL - RET - -L463C: PUSH HL - INC HL - INC HL - INC HL - INC HL - CALL TEST1 - DB 0CAH - JR NZ,L4660 ; (+019H) - CALL TEST1 - DB 022H - JR NZ,L4660 ; (+013H) - LD B,000H - LD DE,L0000 -L4652: LD A,(DE) - CP (HL) - JR NZ,L4660 ; (+00aH) - INC HL - INC DE - DJNZ L4652 ; (-008H) - LD A,(HL) - CP 022H - JR Z,L4660 ; (+001H) - OR A -L4660: SCF - CCF - POP HL - RET - -L4664: LD DE,L0000 - LD BC,0FFFFH - CALL L46A6 - RET Z - CP 02DH - JR Z,L468E ; (+01cH) - CP 02EH - LD DE,(0847FH) - JR Z,L4681 ; (+007H) - CALL TESTX - DB 00BH - LD E,(HL) - INC HL - LD D,(HL) -L4681: INC HL - CALL L46A6 - JR Z,L468B ; (+004H) - CP 02DH - JR Z,L468E ; (+003H) -L468B: LD C,E - LD B,D - RET - -L468E: INC HL - CALL L46A6 - RET Z - CP 02EH - JR NZ,L469D ; (+006H) - LD BC,(0847FH) - INC HL - RET - -L469D: CALL TESTX - DB 00BH - LD C,(HL) - INC HL - LD B,(HL) - INC HL - RET - -L46A6: CALL L413E - RET Z - CP 02CH - RET - -L46AD: CALL SKPDE - LD A,0FFH - LD (L473D),A - LD HL,L4703 - JR L46CC ; (+012H) - -L46BA: CALL SKPDE - CALL L4836 -L46C0: LD A,(L473D) - OR A - RET Z - XOR A - LD (L473D),A - LD HL,L46E9 -L46CC: LD (046E7H),HL - LD HL,(TEXTST) - DEC HL -L46D3: INC HL - LD A,(HL) - INC HL - OR (HL) - RET Z - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD (04732H),DE -L46E0: CALL L51A2 - OR A - JR Z,L46D3 ; (-013H) - JP L0000 - -L46E9: CP 00CH - JR NZ,L46E0 ; (-00dH) - DEC HL - LD E,(HL) - INC HL - LD D,(HL) - PUSH HL - EX DE,HL - INC HL - INC HL - LD E,(HL) - INC HL - LD D,(HL) - POP HL - LD (HL),D - DEC HL - LD (HL),E - DEC HL - LD (HL),00BH - INC HL - INC HL - JR L46E0 ; (-023H) - -L4703: CP 00BH - JR NZ,L46E0 ; (-027H) - DEC HL - PUSH HL - CALL INDRCT - LD E,L - LD D,H - LD A,L - OR H - JR Z,L4739 ; (+027H) - CALL L4609 - JR C,L4722 ; (+00bH) - EX DE,HL - POP HL - DEC HL - LD (HL),00CH - INC HL - LD (HL),E - INC HL - LD (HL),D - JR L46E0 ; (-042H) - -L4722: PUSH DE - LD A,010H - RST 018H - DB 01BH - LD A,020H - RST 018H - DB 003H - POP HL - CALL L5E66 - RST 018H - DB 005H - LD HL,L0000 - CALL L4B58 - RST 018H - DB 002H -L4739: POP HL - INC HL - JR L46E0 ; (-05dH) - -L473D: NOP -L473E: RST 018H - DB 028H - CALL L46BA - CALL L6A11 - LD A,B - OR C - JP Z,L4059 - LD (0847FH),BC - LD A,(DE) - CP 020H - JR NZ,L4755 ; (+001H) - INC DE -L4755: PUSH AF - LD HL,L84E7 - CALL L66EF - PUSH HL - LD HL,(L847F) - LD E,L - LD D,H - CALL L49B9 - POP HL - POP AF - OR A - JR Z,L477C ; (+012H) - LD DE,L84E7 - OR A - SBC HL,DE - LD DE,00005H - ADD HL,DE - LD B,H - LD C,L - LD HL,L84E7 - CALL L4794 -L477C: LD A,(L48B0) - OR A - JP Z,L4059 - LD DE,(08481H) - LD HL,(L847F) - ADD HL,DE - LD (L847F),HL - JP NC,L4059 - JP L4081 - -L4794: LD (047F6H),HL - PUSH BC - LD BC,(0847FH) - LD HL,(TEXTST) - JR L47A5 ; (+004H) - -L47A1: CALL LDDEMD - ADD HL,DE -L47A5: CALL LDDEMD - LD A,D - OR E - JR Z,L47B9 ; (+00dH) - INC HL - INC HL - CALL LDDEMD - EX DE,HL - SBC HL,BC - DEC DE - DEC DE - EX DE,HL - JR C,L47A1 ; (-018H) -L47B9: POP DE - PUSH HL - PUSH DE - LD HL,00028H - ADD HL,DE - LD BC,(VARED) - LD (TMPEND),BC - ADD HL,BC - JP C,L4B2C - EX DE,HL - CALL L74E8 - POP DE - RST 018H - DB 018H - POP HL - PUSH DE - PUSH BC - EX (SP),HL - POP BC - PUSH HL - OR A - SBC HL,BC - LD B,H - LD C,L - POP HL - LD DE,(VARED) - INC BC - LDDR - INC HL - POP BC - LD (HL),C - INC HL - LD (HL),B - INC HL - LD DE,(0847FH) - LD (HL),E - INC HL - LD (HL),D - INC HL - EX DE,HL - LD HL,L84E7 - DEC BC - DEC BC - DEC BC - DEC BC - LDIR - RET - -L47FF: JR Z,L480A ; (+009H) - CALL L5176 - JP Z,L5147 - JP L5AED - -L480A: CALL L4928 -L480D: CALL L4821 - LD DE,(TEXTST) - LD SP,(INTFAC) - LD HL,0FFFFH - PUSH HL - PUSH HL - EX DE,HL - JP L40E4 - -L4821: PUSH HL - PUSH DE - CALL L4836 - XOR A - LD (L48B0),A - LD HL,0000AH - LD (L847F),HL - LD (L8481),HL - POP DE - POP HL - RET - -L4836: CALL L5825 - LD HL,L0000 - LD (L8487),HL - XOR A - LD (L4B78),A - LD (L8486),A - LD (L8485),A - LD (L849A),A - RET - -L484D: LD A,(L849A) - OR A - JP NZ,L5DCB - RST 018H - DB 028H - XOR A - LD (L4B78),A - POP BC - JP L4050 - -L485E: CALL L5C08 - LD DE,0000AH - LD BC,0000AH - JR Z,L4897 ; (+02eH) - CP 02CH - JR NZ,L4878 ; (+00bH) - INC HL - CALL L6E5F - LD B,D - LD C,E - LD DE,0000AH - JR L4897 ; (+01fH) - -L4878: CP 02EH - LD DE,(0847FH) - JR Z,L4889 ; (+009H) - CP 00BH - JP NZ,L4AEC - INC HL - LD E,(HL) - INC HL - LD D,(HL) -L4889: INC HL - CALL TEST1 - DB 02CH - JR NZ,L4897 ; (+007H) - PUSH DE - CALL L6E5F - LD C,E - LD B,D - POP DE -L4897: CALL 05E48H - LD A,C - OR B - JP Z,04AF2H - LD (0847FH),DE - LD (08481H),BC - LD A,001H - LD (L48B0),A - POP AF - JP L4059 - -L48B0: NOP -L48B1: LD A,(L48B0) - OR A - RET Z - XOR A - JR L48BF ; (+006H) - -L48B9: CALL L48BF - JP L4059 - -L48BF: LD DE,(0847FH) - CALL NZ,L4664 - PUSH DE - EX DE,HL - CALL L4609 - POP DE - INC HL - INC HL - INC HL - INC HL - JR NC,L48D5 ; (+003H) - LD HL,L00F9 -L48D5: EX DE,HL - PUSH DE - LD (L847F),HL - CALL L5E66 - RST 018H - DB 005H - LD A,020H - RST 018H - DB 003H - POP HL - LD DE,KEYBUF - PUSH DE - CALL L68E0 - POP DE - LD B,000H -L48EE: LD A,(DE) - OR A - JR Z,L48F8 ; (+006H) - INC B - RST 018H - DB 004H - INC DE - JR L48EE ; (-00aH) - -L48F8: LD A,B - OR A - RET Z - LD A,014H - RST 018H - DB 003H - DJNZ 048FCH ; (-005H) - RET - -L4902: PUSH DE - LD DE,0FFF0H - ADD HL,DE - POP DE - LD (MEMLMT),HL - DEC H - LD (INTFAC),HL - XOR A - LD (L849A),A - RET - -L4914: LD HL,(TEXTST) - CALL L4952 - LD (TEXTED),HL - CALL L4821 - JR L4928 ; (+006H) - -L4922: CALL L4914 - JP L404A - -L4928: PUSH HL - CALL L4939 - POP HL - RST 018H - DB 028H - RET - -L4930: LD HL,(TEXTST) - CALL L4952 - LD (TEXTED),HL -L4939: LD HL,(TEXTED) - LD (HL),000H - INC HL - LD (VARST),HL - LD (HL),000H - INC HL - LD (STRST),HL - CALL L4952 - LD (VARED),HL - LD (TMPEND),HL - RET - -L4952: LD (HL),000H - INC HL - LD (HL),000H - INC HL - RET - -L4959: CALL L413E - LD A,001H - JR Z,L496D ; (+00dH) - CALL TESTX - DB FDPD - CALL TESTX - DB 050H - LD A,002H - JR L496D ; (+001H) - -L496C: XOR A -L496D: LD (04972H),A - RET - -L4971: LD A,000H - OR A - RET Z - DEC A - LD (FILOUT),A - JR Z,L4982 ; (+007H) - LD A,(PNMODE) - CP 002H - JR Z,L4994 ; (+012H) -L4982: PUSH HL - LD A,05BH - RST 018H - DB 009H - LD HL,(L8483) - CALL L5E66 - RST 018H - DB 00BH - LD A,05DH - RST 018H - DB 009H - POP HL -L4994: XOR A - LD (FILOUT),A - RET - -L4999: CALL L46A6 - JP Z,L4AEC - CALL L5176 - JR Z,L49AD ; (+009H) - CP 02DH - JR Z,L49AD ; (+005H) - CP 02EH - JP NZ,L5D02 -L49AD: CALL L4664 - EX DE,HL - LD E,C - LD D,B - CALL L49B9 - JP L4050 - -L49B9: PUSH AF - PUSH BC - PUSH HL - PUSH DE - CALL L46BA - LD C,L - LD B,H - LD HL,(TEXTST) -L49C5: CALL LDDEMI - LD A,E - OR D - JR NZ,L49D4 ; (+008H) -L49CC: POP DE - POP HL - POP BC - POP AF - RET - -L49D1: POP DE - JR L49CC ; (-008H) - -L49D4: EX DE,HL - ADD HL,DE - DEC HL - DEC HL - EX DE,HL - PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - EX DE,HL - LD (049EEH),HL - SBC HL,BC - POP HL - JR C,L49C5 ; (-021H) - DB 01BH - DEC DE - DEC DE - POP BC - PUSH BC - PUSH DE - PUSH HL - LD HL,L0000 - SBC HL,BC - POP HL - JR Z,L4A13 ; (+01eH) - JR NC,L49D1 ; (-026H) -L49F7: CALL LDDEMI - LD A,D - OR E - JR Z,L4A11 ; (+013H) - EX DE,HL - ADD HL,DE - EX DE,HL - DEC DE - DEC DE - PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - EX DE,HL - SBC HL,BC - POP HL - JR C,L49F7 ; (-016H) - JR Z,L4A13 ; (+004H) - EX DE,HL - DEC HL -L4A11: DEC HL - DEC HL -L4A13: POP DE - PUSH DE - PUSH HL - OR A - EX DE,HL - SBC HL,DE - EX DE,HL - LD BC,(VARED) - RST 018H - DB 018H - POP DE - LD H,B - LD L,C - OR A - SBC HL,DE - LD B,H - LD C,L - EX DE,HL - POP DE - LDIR - JR L49CC ; (-063H) - -L4A2F: CALL L6E5F - LD A,D - OR E - RET NZ - JP 04AF2H - -L4A38: CALL L5C08 - LD DE,0000AH - LD (04AB7H),DE - LD (04AC9H),DE - LD E,000H - LD (04AA6H),DE - JR Z,L4A81 ; (+033H) - CP 02CH - JR Z,L4A62 ; (+010H) - CALL L4A2F - LD (04AB7H),DE - CALL L413E - JR Z,L4A81 ; (+023H) - CALL L5E70 - DEC HL -L4A62: CALL INCHLF - CP 02CH - JR Z,L4A79 ; (+010H) - CALL L4A2F - LD (04AA6H),DE - CALL L413E - JR Z,L4A81 ; (+00cH) - CALL L5E70 - DEC HL -L4A79: INC HL - CALL L4A2F - LD (04AC9H),DE -L4A81: PUSH HL - LD HL,(04AA6H) - EX DE,HL - LD HL,(04AB7H) - OR A - SBC HL,DE - JP C,04AF2H - CALL L46AD - LD HL,(TEXTST) -L4A95: LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - JR Z,L4AD3 ; (+037H) - EX DE,HL - ADD HL,DE - DEC HL - EX DE,HL - INC HL - LD C,(HL) - INC HL - LD B,(HL) - PUSH HL - LD HL,L0000 - OR A - SBC HL,BC - POP HL - JR Z,L4AB3 ; (+005H) - JR C,L4AB3 ; (+003H) - EX DE,HL - JR L4A95 ; (-01eH) - -L4AB3: DEC HL - DEC HL - DEC HL - LD BC,L0000 -L4AB9: LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - JR Z,L4AD3 ; (+013H) - EX DE,HL - ADD HL,DE - DEC HL - EX DE,HL - INC HL - LD (HL),C - INC HL - LD (HL),B - LD HL,L0000 - ADD HL,BC - JR C,L4AD8 ; (+00aH) - LD C,L - LD B,H - EX DE,HL - JR L4AB9 ; (-01aH) - -L4AD3: CALL L46C0 - POP HL - RET - -L4AD8: LD HL,0000AH - LD (04AC9H),HL - LD (04AB7H),HL - LD L,000H - LD (04AA6H),HL - CALL L4A81 - JP 04AF2H - -L4AEC: LD A,001H - LD HL,0023EH - LD HL,L033E - LD HL,0043EH - LD HL,L053E - LD HL,0063EH - LD HL,0073EH - LD HL,L083E - LD HL,L0D3E - LD HL,L0E3E - LD HL,L0F3E - LD HL,L103E - LD HL,L113E - LD HL,L123E - LD HL,L133E - LD HL,0143EH - LD HL,0153EH - LD HL,L183E - LD HL,L193E - LD HL,L3A3E - LD HL,L403E - JR L4B3A ; (+00eH) - -L4B2C: LD A,006H -L4B2E: LD SP,(INTFAC) - LD HL,0FFFFH - PUSH HL - LD (08496H),SP -L4B3A: JR L4B55 ; (+019H) - -L4B3C: LD HL,(_LPT) - LD IX,(_CRT) - LD (ZEQT),HL - XOR A - LD (01051H),A - LD A,0C4H - LD HL,0BB3EH - LD HL,0BC3EH - LD HL,0BD3EH -L4B55: JP L0182 - -L4B58: LD A,L - OR H - RET Z - LD DE,L4B66 - RST 018H - DB 005H - CALL L5E66 - RST 018H - DB 005H - RET - -L4B66: JR NZ,04BB1H ; (+049H) - LD C,(HL) - JR NZ,L4B6B ; (+000H) -L4B6B: LD B,D - DEC B - LD D,D - LD B,L - LD B,C - LD C,E - NOP -L4B72: LD D,D - DEC B - LD B,L - LD B,C - LD B,H - LD E,C -L4B78: NOP - NOP -L4B7A: CALL L6E4B - DEC A - CP 046H - JR C,L4B84 ; (+002H) - LD A,044H -L4B84: INC A -L4B85: LD SP,(08496H) - PUSH AF - RST 018H - DB 043H - CALL L5C44 - POP AF - OR A - JR Z,L4BE5 ; (+052H) - CP 080H - JR Z,L4BE3 ; (+04cH) - LD C,A - LD HL,L0000 - LD (L7928),HL - CALL L4146 - LD A,C - JR Z,L4BCE ; (+02aH) - LD HL,(L8483) - LD (L8487),HL - LD (L847F),HL - LD HL,(L847D) - LD (L8489),HL - LD HL,(L8498) - LD (L848B),HL - AND 07FH - LD (L8485),A - LD A,(L8486) - INC A - CP 002H - JR Z,L4BD9 ; (+013H) - XOR A - LD (L4B78),A - LD (L849A),A - LD A,C -L4BCE: RST 018H - DB 01BH -L4BD0: LD HL,(L8483) - CALL L4B58 - JP L4050 - -L4BD9: LD (L8486),A - LD HL,(0848DH) - PUSH HL - JP L40E4 - -L4BE3: LD A,02EH -L4BE5: LD HL,(L8498) - JR L4BED ; (+003H) - -L4BEA: LD A,02EH - POP DE -L4BED: PUSH AF - PUSH HL - RST 018H - DB 002H - RST 018H - DB 020H - LD DE,L4B6B - RST 018H - DB 005H - POP HL - CALL L4146 - JR Z,L4C17 ; (+019H) - LD (04C33H),HL - LD HL,(L847D) - LD (04C2DH),HL - LD HL,(L8483) - LD (04C27H),HL - LD (L847F),HL - POP AF - LD (L4B78),A - JP L4BD0 - -L4C17: POP AF - JP L4050 - -L4C1B: POP DE - LD HL,L4B78 - LD A,(HL) - OR A - JP Z,04B10H - LD (HL),000H - LD HL,L0000 - LD (L8483),HL - LD HL,L0000 - LD (L847D),HL - LD HL,L0000 - JP L40AF - -L4C38: LD A,(L8486) - CP 002H - JP C,04B1CH - DEC A - LD (L8486),A - CALL L413E - EX DE,HL - LD HL,(L8487) - LD (L8483),HL - LD HL,(L8489) - LD (L847D),HL - LD HL,(L848B) - JR NZ,L4C5D ; (+004H) - POP BC - JP L40B3 - -L4C5D: CP 08EH - JP Z,L4F8A - EX DE,HL - JP L5147 - -L4C66: CALL TEST1 - DB 080H - JR Z,L4C74 ; (+008H) - CALL TESTX - DB 082H - CALL TESTX - DB LSE0 -L4C74: CALL L45AA - JR Z,L4C83 ; (+00aH) - LD (0848DH),DE - LD A,001H -L4C7F: LD (L8486),A - RET - -L4C83: LD A,(L8486) - DEC A - JR Z,L4C7F ; (-00aH) - XOR A - LD (L8486),A - LD HL,(L8487) - LD (L8483),HL - LD A,(L8485) - JP L4B85 - -L4C99: CALL TEST1 - DB 0FFH - JP Z,L4CCB - CALL L7436 - PUSH BC - PUSH BC - PUSH AF - CALL TESTX - DB QDPC - CALL L6E8A - POP BC - LD A,(L84CE) - CP B - JP NZ,04AF5H - EX (SP),HL - EX DE,HL - CP 005H - JR Z,L4CC3 ; (+008H) - PUSH BC - CALL L4CD6 - POP AF - POP HL - POP BC - RET - -L4CC3: LD C,A - LD B,000H - LDIR - POP HL - POP BC - RET - -L4CCB: CALL TESTX - DB 0C4H - JP L73C2 - -L4CD2: PUSH DE - EX DE,HL - JR L4CDA ; (+004H) - -L4CD6: PUSH DE - CALL L6E7E -L4CDA: LD HL,KEYBM1 - LD (HL),A - LD B,A - LD C,A - INC HL - CALL LDHLDE - POP HL - LD A,(HL) - CP C - JR Z,L4D2B ; (+042H) - PUSH HL - OR A - CALL NZ,L4D3B - POP HL - LD A,(KEYBM1) - OR A - JR Z,L4D28 ; (+033H) - PUSH HL - LD BC,(VARST) - SBC HL,BC - EX DE,HL - LD HL,(VARED) - DEC HL - DEC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - LD BC,(STRST) - OR A - POP DE - PUSH HL - SBC HL,BC - EX DE,HL - LD (HL),A - LD B,A - INC HL - LD (HL),E - INC HL - LD (HL),D - POP HL - LD DE,KEYBM1 - INC DE - CALL L74DC - CALL L4952 - LD (TMPEND),HL - LD (VARED),HL - RET - -L4D28: LD (HL),000H - RET - -L4D2B: INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(STRST) - ADD HL,DE - LD DE,KEYBM1 - LD B,C - INC DE - JP L74DC - -L4D3B: LD C,(HL) - LD B,000H -L4D3E: INC BC - INC BC - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(STRST) - ADD HL,DE - DEC HL - DEC HL - LD E,L - LD D,H - ADD HL,BC - PUSH BC - PUSH DE - EX DE,HL - LD HL,(VARED) - OR A - SBC HL,DE - LD C,L - LD B,H - EX DE,HL - POP DE - PUSH DE - JR Z,L4D5F ; (+002H) - LDIR -L4D5F: POP DE - POP BC - LD HL,(VARED) - OR A - SBC HL,BC - LD (VARED),HL - EX DE,HL -L4D6B: LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - RET Z - LD HL,(VARST) - ADD HL,DE - LD A,(HL) - INC HL - LD E,(HL) - INC HL - LD D,(HL) - OR A - EX DE,HL - SBC HL,BC - EX DE,HL - LD (HL),D - DEC HL - LD (HL),E - PUSH BC - LD C,A - LD B,000H - LD HL,(STRST) - ADD HL,DE - ADD HL,BC - POP BC - JR L4D6B ; (-023H) - -L4D8E: POP BC - LD (04E23H),BC - CALL L4C99 - LD IX,L0000 - ADD IX,SP - LD (04E05H),HL - CALL L4EFE - LD (04E01H),BC -L4DA6: LD E,(IX+000H) - LD D,(IX+001H) - LD HL,0FF12H - OR A - SBC HL,DE - JR NZ,L4DCE ; (+01aH) - LD E,(IX+006H) - LD D,(IX+007H) - EX DE,HL - OR A - SBC HL,BC - JR Z,L4DC7 ; (+007H) - LD DE,L0012 - ADD IX,DE - JR L4DA6 ; (-021H) - -L4DC7: LD DE,00012H - - ADD IX,DE - LD SP,IX -L4DCE: LD HL,(04E05H) - CALL TESTX - DB LSE0 - CALL L6E8A - PUSH AF - PUSH HL - EX DE,HL - LD DE,L4F0A - CALL L5E93 - POP HL - POP AF - CP LSE1 - LD DE,L6112 - JR NZ,L4DEE ; (+004H) - INC HL - CALL L6E8A -L4DEE: LD (04E05H),HL - LD HL,0FFF6H - ADD HL,SP - LD SP,HL - EX DE,HL - CALL L5E93 - LD HL,L4F0A - CALL L5E93 - LD HL,L0000 - PUSH HL - LD HL,L0000 - PUSH HL - LD HL,(L847D) - PUSH HL - LD HL,0FF12H - PUSH HL - LD HL,0FE00H - ADD HL,SP - LD DE,(TMPEND) - SBC HL,DE - LD A,00BH - JP C,L4B2E - LD HL,(04E05H) - JP L0000 - -L4E25: LD A,005H - LD (L84CE),A - POP BC - LD (04E9AH),BC -L4E2F: PUSH AF - POP BC - LD (04E05H),HL - LD IX,L0000 - ADD IX,SP - LD (04E89H),IX - LD E,(IX+000H) - LD D,(IX+001H) - LD HL,0FF12H - OR A - SBC HL,DE - JP NZ,04B04H - PUSH BC - POP AF - JR NZ,L4EB0 ; (+05fH) - LD E,(IX+004H) - LD D,(IX+005H) - EX DE,HL - LD (04E97H),HL - LD E,(IX+006H) - LD D,(IX+007H) - LD HL,(VARST) - ADD HL,DE - LD BC,00008H - ADD IX,BC - PUSH IX - POP DE - CALL L7985 - INC DE - LD A,(DE) - LD IX,(04E89H) - LD DE,0000DH - ADD IX,DE - PUSH IX - POP DE - BIT 7,A - JR NZ,L4E83 ; (+001H) - EX DE,HL -L4E83: CALL L7A1C - JR C,L4E9C ; (+014H) - LD SP,L0000 - LD HL,00002H - ADD HL,SP - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - LD (L847D),HL - LD HL,L0000 -L4E99: JP L0000 - -L4E9C: LD DE,L0012 - LD HL,(04E89H) - ADD HL,DE - LD SP,HL - LD HL,(04E05H) - CALL TEST1 - DB 02CH - JR NZ,L4E99 ; (-014H) - LD (04E05H),HL -L4EB0: LD IX,L0000 - ADD IX,SP - LD (04E89H),IX - LD HL,(04E05H) - CALL TEST1 - DB 02CH - JP Z,L4E2F - CALL L7436 - LD (04E05H),HL - CALL L4EFE - LD IX,(04E89H) -L4ED1: LD E,(IX+000H) - LD D,(IX+001H) - LD HL,0FF12H - OR A - SBC HL,DE - JP NZ,04B04H - LD L,(IX+006H) - LD H,(IX+007H) - OR A - SBC HL,BC - LD HL,(04E05H) - JP Z,L4E2F - LD DE,L0012 - ADD IX,DE - LD (04E89H),IX - LD SP,(04E89H) - JR L4ED1 ; (-02dH) - -L4EFE: LD H,B - LD L,C - LD BC,(VARST) - OR A - SBC HL,BC - LD B,H - LD C,L - RET - -L4F0A: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L4F13: CALL L51A2 - OR A - RET NZ - INC HL - PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - INC HL - LD (04F12H),DE - LD E,(HL) - INC HL - LD D,(HL) - LD (04F10H),DE - POP DE - SCF - RET Z - JR L4F13 ; (-01dH) - -L4F30: CALL L5E7B - CALL L6E5F - LD (04F69H),DE - CALL TEST1 - DB 02CH - JR NZ,L4F5B ; (+01bH) - CALL L6E8A - CALL L7916 - LD (04F5EH),DE - CALL TEST1 - DB 02CH - JR NZ,L4F5B ; (+00bH) - CALL L7436 - CALL L7916 - LD (04F71H),BC - XOR A -L4F5B: PUSH HL - PUSH AF - LD HL,L0000 - CALL L6E7E - LD IX,L0182 - XOR A - CALL L0000 - POP AF - JR NZ,L4F76 ; (+008H) - LD A,B - EX DE,HL - LD DE,L0000 - CALL L4CD2 -L4F76: POP HL - JP L5E7F - -L4F7A: CALL L6E5F -L4F7D: LD A,D - OR E - RET Z - LD B,000H -L4F82: DJNZ L4F82 ; (-002H) - RST 018H - DB 00EH - RET Z - DEC DE - JR L4F7D ; (-00dH) - -L4F8A: DEC HL -L4F8B: CALL L51A2 - OR A - SCF - RET Z - CP 03AH - RET Z - JR L4F8B ; (-00bH) - -L4F96: CALL L6E4B - SUB LSE0 - CP 007H - JP C,04AF2H - CALL L5E70 - PUSH DE - CALL L6E4B - POP BC - OUT (C),A - RET - -L4FAB: CALL L6E4B - CALL L5E70 - PUSH DE - CALL L7436 - CP 005H - JP NZ,04AF5H - EX (SP),HL - PUSH BC - EX (SP),HL - POP BC - IN E,(C) - LD D,000H - CALL L5E99 - POP HL - RET - -L4FC7: CALL L4FCF - LD (00054H),DE - RET - -L4FCF: LD B,018H - LD C,027H - CALL L4FDA - JP C,04AF2H - RET - -L4FDA: PUSH BC - CALL L6E4B - PUSH AF - CALL L5E70 - CALL L6E4B - LD D,E - POP AF - LD E,A - POP BC - LD A,C - CP E - RET C - LD A,B - CP D - RET - -L4FEF: CALL L7436 - LD (L84CE),A - CP 005H - JR Z,L500E ; (+015H) - PUSH HL - PUSH BC - LD A,0FFH - RST 018H - DB 00DH - OR A - JR Z,L5008 ; (+006H) - LD HL,(TMPEND) - LD (HL),A - LD A,001H -L5008: POP DE - CALL L4CD2 - POP HL - RET - -L500E: PUSH HL - PUSH BC - LD A,0FFH - RST 018H - DB 00DH - SUB 030H - CP 00AH - JR C,L501B ; (+001H) - XOR A -L501B: LD E,A - LD D,000H - POP HL - CALL L5E99 - POP HL - RET - -L5024: CP 040H - LD BC,POPRA - JR NZ,L502F ; (+004H) - INC HL - LD BC,L504B -L502F: LD (05040H),BC - CALL L6E5F - CALL L5E73 -L5039: PUSH DE - CALL L6E4B - POP DE - EX DE,HL - CALL POPRA - EX DE,HL - INC DE - CALL TEST1 - DB 02CH - RET NZ - JR L5039 ; (-012H) - -L504B: LD (HL),A - RET - -L504D: PUSH HL - CALL TEST1 - DB 04DH - JR NZ,L5066 ; (+012H) - CALL TEST1 - DB 041H - JR NZ,L5066 ; (+00cH) - CALL TEST1 - DB 058H - JR NZ,L5066 ; (+006H) - EX (SP),HL - LD HL,(MEMMAX) - JR L5082 ; (+01cH) - -L5066: POP HL - CALL L6E5F - PUSH HL - LD HL,(MEMMAX) - OR A - SBC HL,DE - JP C,L4B2C - LD HL,(TMPEND) - INC H - INC H - INC H - INC H - OR A - SBC HL,DE - JP NC,04AF2H - EX DE,HL -L5082: CALL L4902 - POP HL - POP DE - LD SP,(INTFAC) - LD BC,0FFFFH - PUSH BC - PUSH DE - RET - -L5091: POP IX -L5093: POP BC - PUSH BC - LD A,B - INC A - JP NZ,04B07H - LD A,C - CP 012H - JR Z,L50B9 ; (+01aH) - CP 0FEH - JP NZ,04B07H - POP BC - CALL L413E - EX DE,HL - POP HL - LD (L8483),HL - POP HL - LD (L847D),HL - POP HL - PUSH IX - RET Z - EX DE,HL - JP L5147 - -L50B9: EX DE,HL - LD HL,L0012 - ADD HL,SP - LD SP,HL - EX DE,HL - JR L5093 ; (-02fH) - -L50C2: PUSH HL - CALL L4F8A - EX DE,HL - POP HL - POP BC - PUSH DE - EXX - LD HL,(L847D) - PUSH HL - LD HL,(L8483) - PUSH HL - LD HL,0FFFEH - PUSH HL - LD HL,0FE00H - ADD HL,SP - LD DE,(TMPEND) - SBC HL,DE - LD A,00AH - JP C,L4B2E - EXX - PUSH BC - JR L5147 ; (+05dH) - -L50EA: CALL TEST1 - DB 0C1H - JP Z,L4C66 - CALL L6E5F - LD C,E - LD B,D - CP 087H - JP NC,L4AEC - CP 082H - JR NZ,L510F ; (+010H) - CALL INCHLF - LD E,081H - CP LSE4 - JR Z,L510E ; (+006H) - CP LSE0 - JP NZ,L4AEC - DEC E -L510E: LD A,E -L510F: PUSH HL - LD HL,L43EC - SUB 080H - ADD A,A - LD E,A - LD D,000H - ADD HL,DE - CALL INDRCT - EX (SP),HL - INC HL - LD A,B - OR A - JR NZ,L5143 ; (+020H) - LD A,C - OR A - JR Z,L5143 ; (+01cH) - LD B,A -L5128: DEC B - RET Z - CALL HLFTCH - CALL L5173 - JP NZ,L4AEC - CALL L51A8 - OR A - RET Z - INC HL - CALL TEST1 - DB 02CH - JR Z,L5128 ; (-017H) - POP DE - JP 05E48H - -L5143: POP DE - JP L4F8A - -L5147: CALL L45AA - EX DE,HL - JR NZ,L5150 ; (+003H) - LD HL,(TEXTST) -L5150: LD (L847D),HL - XOR A - LD (L4B78),A - JP L40E4 - -L515A: CALL L6E8A - EX AF,AF' - LD A,(DE) - OR A - JR Z,L5182 ; (+020H) - EX AF,AF' - CP LSE2 - JR NZ,L516F ; (+008H) -L5167: CALL INCHLF - CALL L5173 - JR Z,L5147 ; (-028H) -L516F: POP AF - JP L40AF - -L5173: CP 022H - RET Z -L5176: CP 00BH - RET Z - CP 00CH - RET - -L517C: CALL L518B - JR NC,L517C ; (-005H) - RET - -L5182: DEC HL - CALL L518B - JR NC,L5167 ; (-021H) - DB 0C3H - POP HL - LD B,B -L518B: CALL L51A2 - OR A - SCF - RET Z - CP 0C2H - RET Z - CP 093H - JR NZ,L518B ; (-00dH) - CALL L518B - RET C - JR L518B ; (-013H) - -L519E: INC HL - LD A,(HL) - JR L51A8 ; (+006H) - -L51A2: INC HL - LD A,(HL) - CP 094H - JR Z,L51C7 ; (+01fH) -L51A8: OR A - RET Z - CP 022H - JR Z,L51E5 ; (+037H) - CP 0FEH - JR NC,L51C5 ; (+013H) - CP 097H - JR Z,L51C7 ; (+011H) - CP 027H - JR Z,L51C7 ; (+00dH) - CP 020H - RET NC - CP 00BH - RET C - CP 015H - JR NC,L51DC ; (+018H) - INC HL -L51C5: INC HL - RET - -L51C7: LD A,(HL) - OR A - RET Z - CP 03AH - RET Z - CP 022H - JR Z,L51D4 ; (+003H) - INC HL - JR L51C7 ; (-00dH) - -L51D4: CALL L51E5 - OR A - RET Z - INC HL - JR L51C7 ; (-015H) - -L51DC: AND 00FH - ADD A,L - LD L,A - LD A,020H - RET NC - INC H - RET - -L51E5: INC HL - LD A,(HL) - OR A - RET Z - CP 022H - RET Z - JR L51E5 ; (-009H) - -L51EE: OR 0AFH - PUSH AF - LD B,031H - LD C,04FH - CALL L4FDA - PUSH AF - CALL L523F - POP AF - JR C,L523D ; (+03eH) - LD A,C - LD (0522BH),A - LD B,001H - SRL E - JR NC,L520B ; (+002H) - SLA B -L520B: SRL D - JR NC,L5213 ; (+004H) - SLA B - SLA B -L5213: EX DE,HL - RST 018H - DB 01EH - CALL BREAKX - CP 0F0H - JR NC,L521F ; (+002H) - LD A,0F0H -L521F: LD C,A - POP AF - JR Z,L5235 ; (+012H) - SET 3,H - CALL BREAKX - AND 08FH - OR 000H - CALL POPRA - RES 3,H - LD A,C - OR B - JR L5238 ; (+003H) - -L5235: LD A,B - CPL - AND C -L5238: CALL POPRA - EX DE,HL - RET - -L523D: POP AF - RET - -L523F: LD A,(L005D) - AND 070H - LD C,A - CALL TEST1 - DB 02CH - RET NZ - PUSH DE - CALL L552C - POP DE - RLCA - RLCA - RLCA - RLCA - LD C,A - RET - -L5255: RST 018H - DB 020H - RET - -L5258: CALL 05E48H - RST 018H - DB 028H - RST 018H - DB 000H - RET - -L5260: JR Z,L5285 ; (+023H) - LD A,001H - LD (L004E),A - LD A,(L0056) - LD B,019H - CALL L5298 - LD (00056H),BC - CALL TEST1 - DB 02CH - RET NZ - LD B,028H - LD A,(L005B) - CALL L5298 - LD (0005BH),BC - RET - -L5285: XOR A - LD (L004E),A - LD BC,L1800 - LD (00056H),BC - LD BC,L2700 - LD (0005BH),BC - RET - -L5298: LD D,000H - LD E,A - CALL TEST1 - DB 02CH - JR Z,L52A9 ; (+008H) - PUSH BC - CALL L6E4B - POP BC - CALL L5E70 -L52A9: LD C,E - PUSH BC - CALL L6E4B - POP BC - DEC A - JP M,04AF2H - ADD A,C - CP B - JP NC,04AF2H - LD B,A - RET - -L52BA: DI - OUT (LSE4),A - JP L0000 - -L52C0: XOR A - LD BC,?SETDE - LD (L53A8),A - PUSH AF - CALL L5882 - RST 018H - DB 02EH - JP C,04B28H - BIT 1,A - JP Z,04B28H - CALL TEST1 - DB 02CH - POP AF - OR A - JR NZ,L52F2 ; (+015H) - CALL L6E6F - LD A,B - LD (L53A3),A - LD (053A4H),DE - CALL 05E48H - JR L52F2 ; (+005H) - -L52ED: LD A,002H - LD (L53A8),A -L52F2: CALL L4664 - LD (05319H),DE - LD (05327H),BC - LD A,0FFH - LD (DISPX),A - CALL SKPDE - LD HL,(TEXTST) -L5308: CALL LDDEMI - LD A,D - OR E - RET Z - EX DE,HL - ADD HL,DE - DEC HL - DEC HL - EX DE,HL - PUSH DE - CALL LDDEMI - PUSH HL - LD HL,L0000 - OR A - SBC HL,DE - JR C,L5326 ; (+006H) - JR Z,L5326 ; (+004H) - POP HL - POP HL - JR L5308 ; (-01eH) - -L5326: LD HL,L0000 - OR A - SBC HL,DE - JR NC,L5331 ; (+003H) - POP HL - POP HL - RET - -L5331: EX DE,HL - CALL L5E66 - RST 018H - DB 017H - LD HL,KEYBUF - CALL LDHLDE - LD (HL),020H - INC HL - EX DE,HL - POP HL - CALL L68E0 - LD A,(L53A8) - OR A - JR NZ,L5350 ; (+005H) - CALL L5366 - JR NC,L535A ; (+00aH) -L5350: LD DE,KEYBUF - RST 018H - DB 017H - RST 018H - DB 037H - CALL L5733 -L535A: POP HL - LD A,(L53A8) - CP 002H - JR Z,L5308 ; (-05aH) - RST 018H - DB 00FH - JR L5308 ; (-05eH) - -L5366: EX DE,HL -L5367: PUSH HL - CALL L5371 - POP HL - RET C - RET Z - INC HL - JR L5367 ; (-00aH) - -L5371: LD A,(L53A3) - LD B,A - LD DE,(053A4H) -L5379: LD A,(HL) - INC HL - OR A - RET Z - CP 005H - JR Z,L5385 ; (+004H) - CP 006H - JR NZ,L5387 ; (+002H) -L5385: JR L5379 ; (-00eH) - -L5387: PUSH HL - LD C,A -L5389: LD A,(DE) - INC DE - CP 005H - JR Z,L5393 ; (+004H) - CP 006H - JR NZ,L539A ; (+007H) -L5393: DEC B - SCF - POP HL - RET Z - PUSH HL - JR L5389 ; (-011H) - -L539A: SUB C - POP HL - OR A - RET NZ - DEC B - SCF - RET Z - JR L5379 ; (-02aH) - -L53A3: NOP - NOP - NOP - NOP - NOP -L53A8: NOP -L53A9: CALL TESTX - DB 087H - CALL L5E4F - PUSH HL - LD C,000H -L53B3: RST 018H - DB 008H - LD A,C - ADD A,031H - LD D,A - LD E,020H - CP 03AH - JR NZ,L53C2 ; (+003H) - LD DE,L3031 -L53C2: LD (05445H),DE - LD DE,L543D - RST 018H - DB 00BH - LD A,C - CALL L549C - LD B,(HL) - INC HL - PUSH BC - CALL L53E0 - POP BC - INC C - LD A,C - CP 00AH - JR NZ,L53B3 ; (-029H) - RST 018H - DB 008H - POP HL - RET - -L53E0: LD A,B - OR A - LD C,000H - JR NZ,L53ED ; (+007H) - LD A,022H - RST 018H - DB 00AH - RST 018H - DB 00AH - RET - -L53ED: LD A,(HL) - CP 020H - JR C,L5412 ; (+020H) - CP 022H - JR Z,L5412 ; (+01cH) - LD A,C - CP 001H - JR Z,L5405 ; (+00aH) - OR A - LD DE,L544A - JR NZ,L5403 ; (+002H) - INC DE - INC DE -L5403: RST 018H - DB 00BH -L5405: LD A,(HL) - RST 018H - DB 00AH - INC HL - LD C,001H - DJNZ L53ED ; (-020H) - LD A,022H -L540F: RST 018H - DB 00AH - RET - -L5412: LD A,C - CP 0FFH - JR Z,L5437 ; (+020H) - OR A - LD DE,0544EH - JR NZ,L541F ; (+002H) - INC DE - INC DE -L541F: RST 018H - DB 00BH -L5421: PUSH BC - PUSH HL - LD L,(HL) - LD H,000H - CALL L5E66 - RST 018H - DB 00BH - POP HL - POP BC - INC HL - LD C,0FFH - DJNZ L53ED ; (-045H) - LD A,029H - JP L540F - -L5437: LD A,02CH - RST 018H - DB 00AH - JR L5421 ; (-01cH) - -L543D: LD B,H - LD B,L - LD B,(HL) - JR NZ,L548D ; (+04bH) - LD B,L - LD E,C - JR Z,L5446 ; (+000H) -L5446: NOP - ADD HL,HL - DEC A - NOP -L544A: ADD HL,HL - DEC HL - LD (L2200),HL - DEC HL - LD B,E - LD C,B - LD D,D - INC H - JR Z,L5456 ; (+000H) -L5456: CALL TEST1 - DB 0B2H - JR Z,L5467 ; (+00bH) - CALL TESTX - DB 0FFH -L5460: CALL TESTX - DB 0C7H - JP L7824 - -L5467: CALL TESTX - DB 028H - CALL L6E4B - CALL TESTX - DB 029H - CALL TESTX - DB QDPC - LD A,E - DEC A - CP 00AH - JP NC,04AF2H - PUSH HL - CALL L549C - EX (SP),HL - CALL L6E6F - EX (SP),HL - LD A,B - CP 010H - JR C,L548D ; (+002H) - LD A,00FH -L548D: LD (HL),A - OR A - JR Z,L5499 ; (+008H) - LD B,A - INC HL -L5493: LD A,(DE) - LD (HL),A - INC DE - INC HL - DJNZ L5493 ; (-006H) -L5499: POP HL - EI - RET - -L549C: ADD A,A - ADD A,A - ADD A,A - ADD A,A - LD HL,L12C0 - JP ADDHLA - -L54A6: CALL TEST1 - DB 02CH - JR NZ,L54B4 ; (+008H) - CALL L5E70 - LD DE,L005D - JR L54C0 ; (+00cH) - -L54B4: CALL L4FCF - CALL L5E70 - EX DE,HL - RST 018H - DB 01EH - SET 3,H - EX DE,HL -L54C0: EX DE,HL - CALL BREAKX - EX DE,HL - PUSH DE - CALL L54D0 - POP DE - EX DE,HL - CALL POPRA - EX DE,HL - RET - -L54D0: LD C,A - CALL TEST1 - DB 02CH - JR Z,L54E9 ; (+012H) - CALL L552C - ADD A,A - ADD A,A - ADD A,A - ADD A,A - XOR C - AND 070H - XOR C - LD C,A - CALL TEST1 - DB 02CH - JR NZ,L54FA ; (+011H) -L54E9: CALL L413E - JR Z,L54FA ; (+00cH) - CP 05DH - JR Z,L54FA ; (+008H) - CALL L552C - XOR C - AND 007H - XOR C - RET - -L54FA: LD A,C - RET - -L54FC: INC HL -L54FD: CALL L6E6F - LD A,B - OR A - JR Z,L5513 ; (+00fH) - PUSH HL - LD HL,KEYBUF - PUSH HL - CALL LDHLDE - LD (HL),00DH - POP DE - CALL L0030 - POP HL -L5513: CALL HLFTCH - CP 03BH - JR Z,L54FC ; (-01eH) - CP 02CH - JR Z,L54FC ; (-022H) - RET - -L551F: CALL L6E4B - DEC A - CP 007H - JP NC,04AF2H - INC A - JP L0041 - -L552C: PUSH BC - CALL L6E4B - POP BC - CP 008H - JP NC,04AF2H - RET - -L5537: RST 018H - DB 045H - RET - - DS 198, 000H -L5600: LD A,(ZLOG) - CP 088H - RET - -L5606: CALL L6E8A - LD A,(L84CE) - CP 003H - PUSH HL - EX DE,HL - JR Z,L5619 ; (+007H) - CALL L6028 - POP HL - RST 018H - DB 017H - RET - -L5619: CALL L6E7E - POP HL - RET - -L561E: LD A,(L005D) - LD (0574DH),A - XOR A - LD (DISPX),A - CALL L5882 - RST 018H - DB 02EH - JP C,L57B4 - BIT 2,A - JP NZ,L5D18 - BIT 1,A - JP Z,057B7H - CALL L58C2 - CALL L5600 - JR NZ,L5655 ; (+013H) - CALL TEST1 - DB 05BH - JR NZ,L5655 ; (+00dH) - LD A,(0574DH) - CALL L54D0 - LD (0574DH),A - CALL TESTX - DB 05DH -L5655: CALL L413E - JP Z,L5733 -L565B: LD A,(HL) - CP LSE3 - JR Z,L56DA ; (+07aH) - LD BC,L5674 - PUSH BC - CP 03BH - RET Z - CP 02CH - RET Z - CP LSE6 - JR Z,L56AA ; (+03cH) - CALL L5606 - JP L573E - -L5674: CALL L413E - JP Z,L5733 - CP 02CH - JR NZ,L569A ; (+01cH) - CALL L5600 - JR C,L5697 ; (+014H) - LD IX,(ZDELT) - CALL IOCALL - LD B,A -L568B: SUB 00AH - JR NC,L568B ; (-004H) - NEG - LD B,A - CALL L56CC - JR L569A ; (+003H) - -L5697: CALL L5733 -L569A: LD A,(HL) - CP 02CH - JR Z,L56A1 ; (+002H) - CP 03BH -L56A1: JR NZ,L56A4 ; (+001H) - INC HL -L56A4: CALL L413E - RET Z - JR L565B ; (-04fH) - -L56AA: CALL L5600 - JP C,057B7H - CALL L5E77 - CALL L6E4B - CALL L5E7F - LD IX,(ZDELT) - CALL IOCALL - SUB E - RET NC - NEG - LD B,A - CALL L5600 - LD A,013H - JR Z,L56CE ; (+002H) -L56CC: LD A,020H -L56CE: LD DE,KEYBUF - PUSH BC - PUSH DE - CALL ?SETDE - POP DE - POP BC - JR L573E ; (+064H) - -L56DA: INC HL - CALL L6E6F - LD A,B - OR A - JP Z,04AF2H - PUSH HL - LD HL,KEYBUF - PUSH HL - PUSH BC - CALL LDHLDE - POP BC - LD A,0F0H - LD E,B - LD D,000H - INC DE - RST 018H - DB 02AH - LD (L6306),HL - LD (L6308),HL - POP DE - CALL LDHLDE - LD (HL),000H - POP HL -L5702: CALL L413E - JR Z,L5729 ; (+022H) - INC HL - CP 02CH - JR Z,L5711 ; (+005H) - CP 03BH - JP NZ,L4AEC -L5711: CALL L413E - JR Z,L572C ; (+016H) - CALL L6E92 - PUSH HL - LD BC,(TMPEND) - PUSH BC - CALL L630A - POP DE - CALL L573C - POP HL - JR L5702 ; (-027H) - -L5729: CALL L5733 -L572C: LD A,0F0H - RST 018H - DB 02BH - RET - -L5731: DEC C - NOP -L5733: LD A,(L005D) - LD (0574DH),A - LD DE,L5731 -L573C: RST 018H - DB 017H -L573E: CALL L5600 - JR Z,L5746 ; (+003H) - RST 018H - DB 037H - RET - -L5746: PUSH HL - PUSH BC - LD HL,L005D - LD C,(HL) - LD (HL),070H - RST 018H - DB 037H - LD (HL),C - POP BC - POP HL - RET - -L5754: LD A,08AH - LD (ZLOG),A - JR L5792 ; (+037H) - -L575B: CALL L5882 - RST 018H - DB 02EH - JP C,L57B4 - BIT 2,A - JP NZ,L5D29 - BIT 0,A - JP Z,057B7H - CALL L58C2 - CALL L5600 - JR NZ,L5792 ; (+01dH) - CALL HLFTCH - CP 022H - LD DE,L57BC - LD B,002H - JR NZ,L5788 ; (+007H) - CALL L6E6F - CALL TESTX - DB 03BH -L5788: LD A,B - OR A - JR Z,L5792 ; (+006H) -L578C: LD A,(DE) - INC DE - RST 018H - DB 003H - DJNZ L578C ; (-006H) -L5792: LD (057EBH),SP - LD DE,(VARED) - LD (TMPEND),DE -L579E: LD DE,(TMPEND) - CALL L74E8 - CALL L7436 - PUSH AF - PUSH BC - CALL L413E - JR Z,057BEH ; (+00fH) - CALL L5E73 - JR L579E ; (-016H) - -L57B4: LD A,02CH - LD HL,0BB3EH - JP L0182 - -L57BC: CCF - JR NZ,0576EH ; (-051H) - PUSH AF - PUSH HL - RST 018H - DB 034H - LD HL,(057EBH) - DEC HL -L57C7: LD A,(HL) - OR A - JR Z,L57E9 ; (+01eH) - DEC HL - DEC HL - LD B,(HL) - DEC HL - LD C,(HL) - DEC HL - PUSH HL - PUSH AF - PUSH BC - LD DE,(TMPEND) - CALL L57EE - LD H,000H - LD L,B - ADD HL,DE - LD (HL),000H - POP DE - POP AF - CALL L57F8 - POP HL - JR L57C7 ; (-022H) - -L57E9: POP HL - LD SP,L0000 - RET - -L57EE: LD A,(ZLOG) - CP 08AH - JR Z,L5839 ; (+044H) - RST 018H - DB 035H - RET - -L57F8: CP 003H - JR NZ,L5803 ; (+007H) - LD HL,(TMPEND) - LD A,B -$START: JP L4CD2 ; $START - BASIC warm start / system entry - -L5803: PUSH DE - LD HL,(INTFAC) - LD DE,(TMPEND) - EX DE,HL - CALL HLFTCH - CP 045H - JP Z,04AF2H - EX DE,HL - CALL L5EDC - EX DE,HL - CALL TEST1 - DB 000H - JP NZ,04AF2H - EX DE,HL - POP DE - JP L5E93 - -L5825: XOR A - JR L587E ; (+056H) - -L5828: CALL L5825 - CALL L413E - CALL NZ,L45AA - EX DE,HL - CALL NZ,L5869 - EX DE,HL - JP L4F8A - -L5839: PUSH HL - PUSH DE - CALL L5847 - POP DE - POP HL - RET - -L5841: LD HL,(TEXTST) - CALL L5869 -L5847: LD A,(L848F) - CP 001H - JP Z,04B1FH - JR C,L5841 ; (-010H) - LD HL,(L8490) - LD C,03AH - RST 018H - DB 036H - LD (L8490),HL - CALL L413E - SCF - CCF - RET NZ - DEC HL -L5862: CALL L519E - OR A - JR NZ,L5874 ; (+00cH) - INC HL -L5869: LD A,(HL) - INC HL - OR (HL) - LD A,001H - JR Z,L587E ; (+00eH) - INC HL - INC HL - JR L5862 ; (-012H) - -L5874: CP 094H - JR NZ,L5862 ; (-016H) - INC HL - LD (L8490),HL - LD A,002H -L587E: LD (L848F),A - RET - -L5882: CALL TEST1 - DB 023H - JR NZ,L58AD ; (+025H) - CALL HLFTCH - CP 020H - JP NC,L4AEC - PUSH DE - PUSH BC - LD DE,L84CF - PUSH DE - CALL L705A - EX (SP),HL - CALL L60B7 - LD A,H - OR A - JP NZ,04B28H - OR L - JP Z,04B28H - JP M,04B28H - POP HL - POP BC - POP DE - RET - -L58AD: CALL TEST1 - DB FDPD - LD A,088H - RET NZ - CALL TEST1 - DB 050H - LD A,089H - RET Z - CALL TESTX - DB 054H - LD A,080H - RET - -L58C2: LD A,(ZLOG) - OR A - RET M - JP L5E70 - -L58CA: JP DBG_DIRCMD1 ; Debug hook: DIR handler 1 (via L593A) - NOP - NOP - NOP - -L58D0: JP DBG_DIRCMD2 ; Debug hook: DIR handler 2 (via L6E6F) - NOP - NOP - NOP - NOP - NOP -L58D8: PUSH HL - RST 018H - DB 02CH - RST 018H - DB 03CH - POP HL - RET - -L58DF: LD A,001H - LD BC,0023EH - LD BC,0043EH - PUSH AF - LD (ZRWX),A - CALL L5882 - CP 088H - JR NZ,L58F4 ; (+002H) - LD A,080H -L58F4: LD (ZLOG),A - CALL L58C2 - CALL L592D - POP AF - CP 004H - JR Z,L5904 ; (+002H) -L5902: LD A,003H -L5904: LD (ELMD),A - PUSH AF - RST 018H - DB 033H - LD A,(ELMD) - POP BC - CP B - JP NZ,04B53H - RET - -L5913: OR 0AFH - LD B,A - CALL L413E - JR Z,L5929 ; (+00eH) -L591B: CALL L5882 - CP 088H - RET NC - RST 018H - DB 038H - CALL TEST1 - DB 02CH - JR L591B ; (-00eH) - -L5929: XOR A - RST 018H - DB 038H - RET - -L592D: CALL L46A6 - LD B,000H - CALL NZ,L6E6F - PUSH HL - RST 018H - DB 02DH - POP HL - RET - -L593A: PUSH HL - CALL HLFTCH - LD DE,L5982 - LD B,001H - CALL L5975 - CALL NC,L5975 - JR C,L5962 ; (+017H) - CALL L5975 - CALL L5EC4 - CALL L597B - CALL L413E - JR NZ,L5962 ; (+009H) - LD A,03AH - LD (DE),A - POP AF - JP RFS_DIR_FIX - NOP - NOP - -L5962: POP HL - CALL L413E - LD B,000H - CALL NZ,L6E6F -L596B: JP DBG_DIR ; Debug hook: trace SVC #2C for DIR - NOP ; (was: PUSH HL / RST 018H / DB 02CH / INC(HL) / DEC(HL) / JP NZ / POP HL / RET) - NOP - NOP - NOP - NOP - NOP - NOP - -L5975: CP 041H - RET C - CP 05BH - CCF -L597B: RET C - LD (DE),A - INC HL - INC DE - LD A,(HL) - INC B - RET - -L5982: NOP - NOP - NOP - NOP -L5986: CALL L592D - CALL TEST1 - DB 02CH - JP Z,L5A47 - PUSH HL - CALL L5BDC - DEC A - JR Z,L59A9 ; (+012H) - DEC A - JP NZ,04B53H - CALL L5C08 - CALL L5BE5 - CALL L5C11 - CALL L5C44 - POP HL - RET - -L59A9: LD HL,(ELMD22) - PUSH HL - LD DE,(MEMLMT) - CALL L59CF - LD DE,(ELMD20) - LD BC,(MEMMAX) - CALL NC,L59CA - JP C,04B13H - POP HL - RST 018H - DB 030H - CALL L5C44 - POP HL - RET - -L59CA: ADD HL,DE - RET C - EX DE,HL - LD H,B - LD L,C -L59CF: PUSH HL - OR A - SBC HL,DE - POP HL - RET - -L59D5: CALL L592D - CALL L5BDC - CP 002H - JP NZ,04B53H - LD A,(L849A) - OR A - JP Z,L5B0D - JP L5DB2 - -L59EA: CALL L5C08 - CALL L592D - CALL TEST1 - DB 02CH - JR Z,05A4DH ; (+057H) - RST 018H - DB 02FH - CP 002H - JP NZ,04B53H - PUSH HL - LD HL,(VARED) - LD (TMPEND),HL - LD BC,003E8H - ADD HL,BC - JP C,L4B2C - PUSH HL - LD BC,(ELMD20) - INC B - ADD HL,BC - JP C,L4B2C - SBC HL,SP - JP NC,L4B2C - POP HL - PUSH HL - RST 018H - DB 030H - POP HL - CALL L5A24 - POP HL - RET - -L5A24: CALL LDDEMI - LD A,D - OR E - RET Z - PUSH DE - CALL LDDEMI - PUSH HL - LD H,D - LD L,E - LD (L847F),HL - CALL L49B9 - POP HL - POP BC - PUSH BC - PUSH HL - CALL L4794 - POP HL - POP BC - ADD HL,BC - DEC HL - DEC HL - DEC HL - DEC HL - JR L5A24 ; (-023H) - -L5A47: CALL L5C08 - LD A,001H - LD BC,L003E - LD BC,0023EH - PUSH AF - CALL TESTX - DB 041H - CALL 05E48H - LD A,001H - LD (ZRWX),A - LD A,081H - LD (ZLOG),A - CALL L5902 - POP AF - PUSH AF - PUSH HL - LD HL,L0000 - LD DE,0FFFFH - OR A - CALL NZ,L49B9 - LD A,081H - RST 018H - DB 02EH - LD HL,(VARED) - LD (TMPEND),HL - LD BC,003E8H - ADD HL,BC - JP C,04AFBH - PUSH HL - LD (L5AEB),HL -L5A89: LD HL,0FE00H - ADD HL,SP - LD DE,(05AEBH) - SBC HL,DE - JP C,04AFBH - LD DE,(TMPEND) - RST 018H - DB 035H - LD A,B - OR A - JR Z,L5AD6 ; (+036H) - CALL L6A11 - LD A,B - OR C - JP Z,04AF2H - LD HL,(L5AEB) - PUSH HL - INC HL - INC HL - LD (HL),C - INC HL - LD (HL),B - INC HL - PUSH HL - LD H,D - LD L,E - CALL TEST1 - DB 000H - JP Z,04AF2H - POP HL - LD A,(DE) - CP 020H - JR NZ,L5AC3 ; (+001H) - INC DE -L5AC3: CALL L66EF - LD (HL),000H - INC HL - LD (L5AEB),HL - POP DE - OR A - SBC HL,DE - EX DE,HL - LD (HL),E - INC HL - LD (HL),D - JR L5A89 ; (-04dH) - -L5AD6: LD HL,(L5AEB) - CALL L4952 - CALL L4928 - POP HL - CALL L5A24 - POP HL - POP AF - CP 002H - RET NZ - JP L480D - -L5AEB: NOP - NOP -L5AED: CALL L592D - PUSH HL - CALL TEST1 - DB 02CH - JR NZ,L5AFF ; (+008H) - CALL HLFTCH - CP 041H - JP Z,05A50H -L5AFF: CALL L5BDC - POP HL - DEC A - JR Z,L5B16 ; (+010H) - DEC A - JP NZ,04B53H - CALL L5BE5 -L5B0D: CALL L5C11 - CALL L5C44 - JP L480D - -L5B16: LD D,0C9H - LD BC,0FF00H - CALL TEST1 - DB 02CH - JR NZ,L5B2A ; (+009H) - CALL TESTX - DB 052H - LD D,000H - LD BC,0CF00H -L5B2A: LD A,D - LD (L5B93),A - LD HL,(ELMD20) - LD DE,(ELMD22) - PUSH HL - CALL L59CA - POP DE - LD HL,(TEXTST) - LD BC,0FF00H - CALL NC,L59CA - JP C,L4B2C - LD SP,L0000 - CALL L4930 - XOR A - LD (L5C07),A - LD HL,(ELMD24) - PUSH HL - LD DE,(ELMD20) - PUSH DE - LD HL,(TMPEND) - RST 018H - DB 030H - LD A,004H - RST 018H - DB 003H - LD A,016H - RST 018H - DB 003H - POP BC - PUSH BC - LD DE,(ELMD22) - CALL L59CF - LD A,0B0H - JR NC,L5B7B ; (+008H) - EX DE,HL - ADD HL,BC - DEC HL - EX DE,HL - ADD HL,BC - DEC HL - LD A,0B8H -L5B7B: LD (05B92H),A - DI - PUSH HL - PUSH DE - LD BC,00016H - LD HL,L5B8E - LD DE,0FF80H - PUSH DE - LDIR - RET - -L5B8E: POP DE - POP HL - POP BC - LDIR -L5B93: RET - - POP BC - LD SP,VRAM - EX DE,HL - PUSH BC - PUSH HL - LD (HL),LSD3 - INC HL - LD (HL),LSE4 - INC HL - LD (HL),0C9H - RET - -L5BA4: LD HL,(VARED) - LD (TMPEND),HL - LD DE,(TEXTED) - LD (05C01H),DE - OR A - SBC HL,DE - LD (L5C03),HL - LD HL,0FF00H - ADD HL,SP - LD (L5C05),HL - LD DE,(VARED) - PUSH HL - OR A - SBC HL,DE - JP C,L4B2C - EX (SP),HL - EX DE,HL - LD BC,(05C03H) - INC BC - LDDR - POP DE - RST 018H - DB 018H - LD A,001H - LD (L5C07),A - RET - -L5BDC: CALL L5BA4 - RST 018H - DB 02FH - LD A,(ELMD) - RET - -L5BE5: LD HL,(VARED) - XOR A - DEC HL - LD (HL),A - DEC HL - LD (HL),A - LD (STRST),HL - DEC HL - LD (HL),A - LD (VARST),HL - DEC HL - LD (HL),A - LD (TEXTED),HL - LD HL,00004H - LD (L5C03),HL - RET - -L5C01: NOP - NOP -L5C03: NOP - NOP -L5C05: NOP - NOP -L5C07: NOP -L5C08: PUSH AF - CALL L4146 - JP NZ,04B16H - POP AF - RET - -L5C11: LD BC,(ELMD20) - PUSH BC - LD HL,(TEXTED) - LD DE,(TEXTST) - OR A - SBC HL,DE - LD L,000H - SBC HL,BC - JP C,L4B2C - LD HL,L0000 - LD (L5C01),HL - CALL L4821 - LD HL,L0000 - LD (L8483),HL - LD HL,(TEXTST) - RST 018H - DB 030H - POP BC - LD HL,(TEXTST) - ADD HL,BC - LD (L5C01),HL - RET - -L5C44: LD A,081H - LD B,000H - RST 018H - DB 038H - LD HL,L5C07 - LD A,(HL) - OR A - RET Z - LD (HL),000H - LD HL,(L5C01) - LD A,H - OR L - JR NZ,L5C5F ; (+006H) - LD HL,(TEXTST) - CALL L4952 -L5C5F: EX DE,HL - LD HL,(TEXTED) - LD BC,(05C03H) - LDIR - EX DE,HL - OR A - SBC HL,DE - EX DE,HL - RST 018H - DB 018H - RET - -L5C71: PUSH HL - CALL L46C0 - POP HL - CALL L592D - PUSH HL - RST 018H - DB 02FH - CP 002H - JP NZ,04B53H - LD HL,(TEXTST) - RST 018H - DB 032H - POP HL - RET - -L5C88: PUSH HL - CALL L46C0 - POP HL - CALL L592D - CALL TEST1 - DB 02CH - JR Z,L5CB5 ; (+01fH) - PUSH HL - LD A,002H - LD (ELMD),A - LD HL,(TEXTED) - LD DE,(TEXTST) - OR A - SBC HL,DE - LD (ELMD20),HL - LD A,(ELMD1) - CP 00DH - JP Z,04B50H - RST 018H - DB 031H - POP HL - RET - -L5CB5: CALL TESTX - DB 041H - PUSH HL - LD A,002H - LD (ZRWX),A - LD A,081H - LD (ZLOG),A - CALL L5902 - POP HL - CALL L52ED - CALL L5733 - LD B,001H - LD A,081H - RST 018H - DB 038H - RET - -L5CD5: XOR A - LD BC,?SETDE - PUSH AF - CALL L6E6F - RST 018H - DB 02DH - POP AF - RST 018H - DB 03FH - RET - -L5CE3: JP DBG_DIR3 ; Debug hook: trace full DIR handler - PUSH AF - RST 018H - DB 02EH - JP C,L57B4 - BIT 1,A - JP Z,057B7H - CALL L58C2 - CALL L593A - LD B,A - XOR A - RST 018H - DB 039H - LD A,B - RST 018H - DB 03AH - POP AF - RST 018H - DB 039H - RET - -L5D02: CALL L6E6F - RST 018H - DB 02DH - RST 018H - DB 03DH - RET - -L5D0A: CALL L6E6F - RST 018H - DB 02DH - CALL L5E70 - CALL L6E6F - RST 018H - DB 03EH - RET - -L5D18: CALL L5D4E -L5D1B: CALL L5606 - RST 018H - DB 042H - CALL L413E - RET Z - CALL L5E73 - JR L5D1B ; (-00eH) - -L5D29: CALL L5D4E - LD DE,(TMPEND) - CALL L74E8 -L5D33: CALL L7436 - PUSH HL - PUSH AF - PUSH BC - LD DE,(TMPEND) - RST 018H - DB 041H - POP DE - POP AF - CALL L57F8 - POP HL - CALL L413E - RET Z - CALL L5E73 - JR L5D33 ; (-01bH) - -L5D4E: CALL TEST1 - DB 028H - RET NZ - CALL L6E5F - LD A,D - OR E - JP Z,04AF2H - RST 018H - DB 040H - CALL L5E7F - CALL TEST1 - DB 02CH - RET - -L5D65: LD A,(L849A) - OR A - JP NZ,04B22H - PUSH HL - LD B,000H - RST 018H - DB 02CH - LD (05E1AH),DE - LD (L5E1C),A - LD HL,(TEXTED) - LD DE,(TEXTST) - XOR A - SBC HL,DE - LD (ELMD20),HL - RST 018H - DB 044H - POP HL - CALL L592D - CALL 05E48H - LD A,(ZFLAG1) - BIT 5,A - JP Z,057B7H - PUSH HL - LD HL,(08494H) - ADD HL,SP - LD SP,HL - EX DE,HL - LD HL,L847D - LD BC,(08492H) - LDIR - CALL L5BDC - CP 002H - JP NZ,04B53H - LD (05DB3H),SP -L5DB2: LD SP,L0000 - CALL L5C11 - CALL L5C44 - LD HL,0FFFDH - PUSH HL - PUSH HL - LD A,001H - LD (L849A),A - LD HL,(TEXTST) - JP L40E4 - -L5DCB: XOR A - LD (L849A),A - POP IX -L5DD1: POP BC - LD A,B - CP 0FFH - JP NZ,04B22H - LD A,C - CP 0FDH - JR Z,L5DF0 ; (+013H) - CP 0FEH - LD HL,00004H - JR Z,L5DEC ; (+008H) - CP 012H - LD HL,00010H - JP NZ,04B22H -L5DEC: ADD HL,SP - LD SP,HL - JR L5DD1 ; (-01fH) - -L5DF0: LD DE,(05E1AH) - LD A,(L5E1C) - RST 018H - DB 03AH - LD B,000H - RST 018H - DB 02CH - CALL L5BA4 - OR 0FFH - RST 018H - DB 044H - CALL L5C11 - CALL L5C44 - LD HL,L0000 - ADD HL,SP - LD DE,L847D - LD BC,(08492H) - LDIR - LD SP,HL - POP HL - RET - - NOP - NOP -L5E1C: NOP -L5E1D: LD DE,L5E37 - LD B,005H - CALL L58D8 - LD A,031H - CALL L5E2C - LD A,032H -L5E2C: LD (05E3EH),A - LD DE,05E3CH - LD B,00CH - JP L58D8 - -L5E37: DB "CMT:TRS?:0,$8C,13",0CDH; XCMT device config string - LD A,041H - RET Z - JP L4AEC - -L5E4F: XOR A - LD (FILOUT),A - CALL TEST1 - DB FDPD - RET NZ - CALL TESTX - DB 050H - CALL L6AC6 - LD A,050H - LD (FILOUT),A - CP A - RET - -L5E66: LD DE,L849C - LD B,000H - PUSH DE - RST 018H - DB 016H - POP DE - RET - -L5E70: CALL HLFTCH -L5E73: CP 02CH - JR L5E84 ; (+00dH) - -L5E77: INC HL -L5E78: CALL HLFTCH -L5E7B: CP 028H - JR L5E84 ; (+005H) - -L5E7F: CALL HLFTCH -L5E82: CP 029H -L5E84: INC HL - RET Z - JP L4AEC - -L5E89: LD A,(DE) - CP 020H - INC DE - JR Z,L5E89 ; (-006H) - RET - -L5E90: LD HL,L6112 -L5E93: LD BC,00005H - LDIR - RET - -L5E99: CALL L7967 - LD A,E - OR D - RET Z - BIT 7,D - LD A,07FH - JR Z,L5EAE ; (+009H) - LD A,D - CPL - LD D,A - LD A,E - CPL - LD E,A - INC DE - LD A,0FFH -L5EAE: LD B,091H -L5EB0: DEC B - BIT 7,D - JR NZ,L5EBB ; (+006H) - RL E - RL D - JR L5EB0 ; (-00bH) - -L5EBB: LD (HL),B - INC HL - AND D - LD (HL),A - INC HL - LD (HL),E - DEC HL - DEC HL - RET - -L5EC4: CP 030H - RET C - CP 03AH - CCF - RET - -L5ECB: CP 05FH - RET Z - CP 030H - RET C - CP 05BH - CCF - RET C - CP 03AH - CCF - RET NC - CP 041H - RET - -L5EDC: CALL L7967 - LD (L6301),A - LD (L6302),A - LD (L6303),A - LD (05F83H),A - LD A,005H - LD (L84CE),A -L5EF0: CALL L5E89 - CP 02BH - JR Z,L5EF0 ; (-007H) - CP 02DH - JR NZ,L5F01 ; (+006H) - CALL L5EF0 - JP L7972 - -L5F01: CP 024H - JR NZ,L5F11 ; (+00cH) - PUSH HL - EX DE,HL - RST 018H - DB 014H - EX (SP),HL - CALL L5E99 - POP DE - LD A,005H - RET - -L5F11: CP 030H - JR NZ,L5F1B ; (+006H) - LD A,(DE) - INC DE - JR L5F11 ; (-008H) - -L5F19: LD A,(DE) - INC DE -L5F1B: CP 020H - JR Z,L5F19 ; (-006H) - CP 02EH - JR Z,L5F3E ; (+01bH) - CALL L5EC4 - JR C,L5F78 ; (+050H) - SUB 030H - CALL L60AA - CALL L6014 - LD A,001H - LD (L6302),A - LD A,(L6301) - INC A - LD (L6301),A - JR L5F19 ; (-025H) - -L5F3E: LD A,001H - LD (05F83H),A - LD C,A -L5F44: LD A,(DE) - INC DE - CP 020H - JR Z,L5F44 ; (-006H) - CALL L5EC4 - JR C,L5F70 ; (+021H) - INC C - SUB 030H - JR Z,L5F5B ; (+007H) - PUSH AF - LD A,001H - LD (L6302),A - POP AF -L5F5B: PUSH AF - LD A,(L6302) - LD B,A - LD A,(L6301) - ADD A,B - LD (L6301),A - POP AF - CALL L60AA - CALL L6014 - JR L5F44 ; (-02cH) - -L5F70: DEC C - JR Z,L5F78 ; (+005H) - CALL L5FFE - JR L5F70 ; (-008H) - -L5F78: CP 045H - JR Z,L5F89 ; (+00dH) -L5F7C: DEC DE - LD A,(L6303) - OR A - RET NZ - LD A,000H - OR A - RET NZ - LD A,005H - RET - -L5F89: LD A,(DE) - CP 02DH - JR Z,L5F97 ; (+009H) - CP 02BH - JR Z,L5F97 ; (+005H) - CALL L5EC4 - JR C,L5F7C ; (-01bH) -L5F97: LD A,001H - LD (05F83H),A - PUSH HL - LD HL,L7BB3 - LD (05FF7H),HL - LD HL,L0000 - LD A,(DE) - INC DE - CP 02BH - JR Z,L5FB8 ; (+00cH) - CP 02DH - JR NZ,L5FBA ; (+00aH) - PUSH HL - LD HL,L7C9E - LD (05FF7H),HL - POP HL -L5FB8: LD A,(DE) - INC DE -L5FBA: SUB 030H - JR C,L5FDA ; (+01cH) - CP 00AH - JR NC,L5FDA ; (+018H) - PUSH DE - CALL L600F - LD E,L - LD D,H - CALL L600F - CALL L600F - CALL L600B - LD E,A - LD D,000H - CALL L600B - POP DE - JR L5FB8 ; (-022H) - -L5FDA: LD A,H - OR A - JR NZ,L6011 ; (+033H) - LD A,L - POP HL - PUSH DE - PUSH BC - PUSH HL - LD DE,L84CF - PUSH DE - CALL L5E90 - POP HL - LD B,A - INC B - JR L5FF2 ; (+003H) - -L5FEF: CALL L60AA -L5FF2: DJNZ L5FEF ; (-005H) - EX DE,HL - POP HL - CALL L0000 - POP BC - POP DE - JP L5F7C - -L5FFE: PUSH AF - PUSH BC - PUSH DE - LD DE,L610D - CALL L7C9E - POP DE - POP BC - POP AF - RET - -L600B: ADD HL,DE - RET NC - JR L6011 ; (+002H) - -L600F: ADD HL,HL - RET NC -L6011: JP 04AEFH - -L6014: PUSH DE - PUSH HL - LD HL,L84CF - LD E,A - LD D,000H - CALL L5E99 - EX DE,HL - POP HL - PUSH BC - CALL L7985 - POP BC - POP DE - RET - -L6028: LD A,005H - LD (L84CE),A - LD A,(HL) - OR A - JR Z,L6035 ; (+004H) - INC HL - LD A,(HL) - DEC HL - RLCA -L6035: LD A,020H - JR NC,L603E ; (+005H) - CALL L7972 - LD A,02DH -L603E: PUSH AF - CALL L61AD - CALL L623A - POP AF - DEC DE - LD (DE),A - RET - -L6049: PUSH BC - CALL L7A1C - POP BC - RET - -L604F: CALL SKPDE - LD A,(HL) - CP 081H - JP C,L7967 - LD A,(HL) - CP 0A0H - RET NC - INC HL - CALL L6086 - PUSH HL - LD L,(HL) - LD B,000H -L6064: SRL E - RR D - RR C - RR L - INC A - INC B - CP 0A0H - JR NZ,L6064 ; (-00eH) -L6072: SLA L - RL C - RL D - RL E - DJNZ L6072 ; (-00aH) - LD A,L - POP HL - LD (HL),A - DEC HL - LD (HL),C - DEC HL - LD (HL),D - DEC HL - LD (HL),E - RET - -L6086: LD E,(HL) - INC HL -L6088: LD D,(HL) - INC HL - LD C,(HL) - INC HL - RET - -L608D: LD A,(HL) - CP 081H - RET C - PUSH DE - PUSH HL - LD DE,L60A5 - PUSH DE - CALL L5E93 - POP HL - CALL L604F - EX DE,HL - POP HL - CALL L797C - POP DE - RET - -L60A5: NOP - NOP - NOP - NOP - NOP -L60AA: PUSH AF - PUSH BC - PUSH DE - LD DE,L610D - CALL L7BB3 - POP DE - POP BC - POP AF - RET - -L60B7: INC HL - BIT 7,(HL) - JR Z,L60C7 ; (+00bH) - CALL L60C7 - LD A,H - CPL - LD H,A - LD A,L - CPL - LD L,A - INC HL - RET - -L60C7: DEC HL - LD A,(HL) - CP 091H - JP NC,04AEFH - CP 081H - JR C,L60E5 ; (+013H) - PUSH AF - INC HL - LD A,(HL) - INC HL - LD L,(HL) - LD H,A - POP AF - SET 7,H -L60DB: CP 090H - RET Z - INC A - SRL H - RR L - JR L60DB ; (-00aH) - -L60E5: CCF - LD HL,L0000 - RET - -L60EA: SBC A,E - LD A,0BCH - JR NZ,L60EF ; (+000H) -L60EF: SBC A,B - JR L6088 ; (-06aH) - - ADD A,B - NOP - SUB H - LD (HL),H - INC H - NOP - NOP - SUB C - LD B,E - LD D,B - NOP - NOP - ADC A,(HL) - INC E - LD B,B - NOP - NOP - ADC A,D - LD A,D - NOP - NOP - NOP - ADD A,A - LD C,B - NOP - NOP - NOP -L610D: ADD A,H - JR NZ,L6110 ; (+000H) -L6110: NOP - NOP -L6112: ADD A,C - NOP - NOP - NOP - NOP - LD A,L - LD C,H - CALL Z,0CDCCH -L611C: LD H,(HL) - DEC HL - CALL Z,L1277 -L6121: LD HL,(L6304) - LD B,000H -L6126: LD DE,L610D - CALL L6049 - JR C,L6134 ; (+006H) - CALL L5FFE - INC B - JR L6126 ; (-00eH) - -L6134: LD DE,L6112 - CALL L6049 - JR NC,L6142 ; (+006H) - CALL L60AA - DEC B - JR L6134 ; (-00eH) - -L6142: PUSH BC - CALL L61AD - CALL L623A - POP BC - PUSH DE - EX DE,HL -L614C: LD A,(HL) - OR A - JR Z,L6153 ; (+003H) - INC HL - JR L614C ; (-007H) - -L6153: DEC HL - LD A,(HL) - INC HL - CP 030H - JR NZ,L615C ; (+002H) - INC B - DEC HL -L615C: LD A,045H - LD (HL),A - INC HL - LD A,B - LD B,02BH - BIT 7,A - JR Z,L616B ; (+004H) - NEG - LD B,02DH -L616B: LD (HL),B - INC HL - LD (HL),030H -L616F: SUB 00AH - JR C,L6176 ; (+003H) - INC (HL) - JR L616F ; (-007H) - -L6176: ADD A,03AH - INC HL - LD (HL),A - INC HL - LD (HL),000H - POP DE - RET - -L617F: PUSH HL - CALL L60B7 - LD DE,L84A7 - PUSH DE - LD B,001H - RST 018H - DB 016H - POP HL - LD A,030H - LD B,005H -L6190: CP (HL) - JR NZ,L6198 ; (+005H) - INC HL - DJNZ L6190 ; (-006H) - JR L61A1 ; (+009H) - -L6198: LD A,B - LD (L6301),A - LD A,001H - LD (L6302),A -L61A1: LD A,02EH - LD (L84AC),A - POP HL - CALL L608D - JP L61FD - -L61AD: LD (L6304),HL - XOR A - LD (L6301),A - LD (L6302),A - PUSH HL - LD HL,L84A3 - LD (HL),0FFH - LD B,021H - LD A,030H -L61C1: INC HL - LD (HL),A - DJNZ L61C1 ; (-004H) - LD A,02EH - LD (L84AC),A - POP HL - LD A,(HL) - OR A - RET Z - LD DE,L60EA - CALL L7A1C - CCF - RET C - LD DE,L611C - CALL L7A1C - RET C - LD DE,L84D7 - PUSH DE - CALL L5E93 - POP HL - LD A,(HL) - CP 081H - JR C,L61FD ; (+013H) - CP 090H - JP C,L617F - LD IX,L84A4 - LD DE,L60EF - CALL L62C4 - CALL L62F8 - RET NC -L61FD: LD IX,L84AD -L6201: LD DE,L60EA - PUSH BC - PUSH IX - CALL L7BB3 - POP IX - POP BC - INC DE - INC DE - INC DE - INC DE - INC DE - CALL L62C4 - CALL L62F8 - JR C,L6201 ; (-019H) - RET - -L621B: LD A,005H - LD (L84CE),A - PUSH HL - LD DE,L84DF - PUSH DE - CALL L5E93 - POP HL - CALL L61AD - CALL L6237 - POP HL - RET - -L6231: LD DE,L84AC - LD (DE),A - DEC DE - RET - -L6237: JP C,L6121 -L623A: LD HL,(L6304) - LD A,(HL) - OR A - JR Z,L6231 ; (-010H) - LD DE,L84A4 - DEC DE - EX DE,HL - LD DE,00001H -L6249: INC HL - LD A,(HL) - CP 02EH - JR NZ,L6254 ; (+005H) - LD DE,L0000 - JR L6249 ; (-00bH) - -L6254: CP 030H - JR Z,L6249 ; (-00fH) - ADD HL,DE - LD DE,00008H - ADD HL,DE - LD A,(HL) -L625E: LD (HL),030H - CP 035H - JR C,L6273 ; (+00fH) -L6264: DEC HL - LD A,(HL) - CP 02EH - JR Z,L6264 ; (-006H) - INC A - JR Z,L62AD ; (+040H) - LD (HL),A - CP 03AH - JR Z,L625E ; (-014H) - INC HL -L6273: LD DE,L84AC - EX DE,HL - OR A - SBC HL,DE - EX DE,HL - JR C,L6282 ; (+005H) - LD HL,L84AC - JR L6299 ; (+017H) - -L6282: DEC HL - LD A,(HL) - CP 02EH - DEC HL - JR Z,L6298 ; (+00fH) - INC HL - CP 030H - JR Z,L6273 ; (-01bH) - PUSH HL - LD DE,L84B5 - SBC HL,DE - POP HL - JP NC,L6121 -L6298: INC HL -L6299: LD (HL),000H - LD DE,L84A4 -L629E: LD A,(DE) - CP 030H - JR NZ,L62A6 ; (+003H) - INC DE - JR L629E ; (-008H) - -L62A6: OR A - RET NZ - DEC DE - LD A,030H - LD (DE),A - RET - -L62AD: LD HL,L849C - LD DE,L62BE - PUSH BC - LD BC,L0006 - LDIR - POP BC - LD DE,L849C - RET - -L62BE: LD SP,L2B45 - JR NC,L62FB ; (+038H) - NOP -L62C4: LD A,(DE) - CP 07DH - RET Z -L62C8: CALL L7A1C - JR C,L62E0 ; (+013H) - INC (IX+000H) - PUSH IX - PUSH BC - CALL L797C - POP BC - POP IX - LD A,001H - LD (L6302),A - JR L62C8 ; (-018H) - -L62E0: INC IX - INC DE - INC DE - INC DE - INC DE - INC DE - LD A,(L6302) - LD B,A - LD A,(L6301) - ADD A,B - LD (L6301),A - CALL L62F8 - RET NC - JR L62C4 ; (-034H) - -L62F8: LD A,(HL) - OR A - RET Z -L62FB: LD A,(L6301) - CP 009H - RET - -L6301: NOP -L6302: NOP -L6303: NOP -L6304: NOP - NOP -L6306: NOP - NOP -L6308: NOP - NOP -L630A: LD HL,(L6308) - PUSH DE -L630E: LD A,(HL) - OR A - JP Z,04AF2H - CALL L63AC - JR Z,L631D ; (+005H) - LD (BC),A - INC BC - INC HL - JR L630E ; (-00fH) - -L631D: EX AF,AF' - LD A,(L84CE) - CP 003H - JP NZ,L63D5 - EX AF,AF' - CP 021H - JP Z,L6334 - CP 026H - JP Z,L635B - JP 04AF5H - -L6334: EX (SP),HL - PUSH BC - CALL L6E7E - OR A - LD A,020H - JR Z,L633F ; (+001H) - LD A,(DE) -L633F: POP BC - LD (BC),A - INC BC -L6342: POP HL - INC HL -L6344: LD A,(HL) - OR A - JR Z,L6352 ; (+00aH) - CALL L63AC - JR Z,L6355 ; (+008H) - LD (BC),A - INC BC - INC HL - JR L6344 ; (-00eH) - -L6352: LD HL,(L6306) -L6355: LD (L6308),HL - XOR A - LD (BC),A - RET - -L635B: LD D,002H -L635D: INC HL - LD A,(HL) - CP 026H - JR Z,L636B ; (+008H) - INC D - CP 020H - JR Z,L635D ; (-00bH) - JP 04AF2H - -L636B: EX (SP),HL - LD A,(HL) - CP D - JR C,L6385 ; (+015H) - INC HL - CALL INDRCT - PUSH BC - LD BC,(STRST) - ADD HL,BC - POP BC -L637B: LD A,(HL) - LD (BC),A - INC BC - INC HL - DEC D - JR NZ,L637B ; (-007H) - JP L6342 - -L6385: LD E,(HL) - INC HL - CALL INDRCT - LD A,E - OR A - JR Z,L63A2 ; (+014H) - PUSH BC - LD BC,(STRST) - ADD HL,BC - POP BC -L6395: LD A,(HL) - LD (BC),A - INC BC - INC HL - DEC E - JR Z,L63A6 ; (+00aH) - DEC D - JR NZ,L6395 ; (-00aH) - JP L6342 - -L63A2: LD A,020H - LD (BC),A - INC BC -L63A6: DEC D - JR NZ,L63A2 ; (-007H) - JP L6342 - -L63AC: CALL CHKACC - INC B - LD HL,L2326 - DEC HL - RET Z - LD E,A - CP 02AH - JR Z,L63CF ; (+015H) - CALL L65AC - JR Z,L63CF ; (+010H) - CP 02EH - LD E,023H - JR Z,L63CF ; (+00aH) - CP 0C4H - RET NZ - INC HL - LD A,(HL) - OR A - JP Z,04AF2H - RET - -L63CF: INC HL - LD A,(HL) - CP E - DEC HL - LD A,(HL) - RET - -L63D5: XOR A - LD (0651CH),A - LD (0656CH),A - LD (L6554),A - LD (06512H),A - LD (064CCH),A - LD (064F9H),A - LD (06517H),A - LD (064C5H),A - DEC A - LD (064C2H),A - EX AF,AF' - LD D,000H - CP 023H - JP Z,L6431 - CP 02AH - JP Z,L6412 - CALL L65AC - JP Z,L6423 - CP 02EH - JP Z,L6433 - CP 02BH - JP Z,L642C - JP 04AF5H - -L6412: LD A,001H - LD (0656CH),A - INC HL - INC D - INC HL - INC D - LD A,(HL) - CALL L65AC - JR NZ,L6433 ; (+012H) - JR L6425 ; (+002H) - -L6423: INC HL - INC D -L6425: INC HL - INC D - LD (L6554),A - JR L6433 ; (+007H) - -L642C: LD A,001H - LD (0651CH),A -L6431: INC HL - INC D -L6433: EX DE,HL - DEC H -L6435: INC H - LD A,(DE) - INC DE - CP 023H - JR Z,L6435 ; (-007H) - CP 02CH - JR NZ,L6447 ; (+007H) - LD A,001H - LD (064CCH),A - JR L6435 ; (-012H) - -L6447: CP 02EH - JR Z,L646E ; (+023H) - CP 02DH - JR NZ,L6457 ; (+008H) - LD A,001H - LD (06512H),A - INC DE - JR L6467 ; (+010H) - -L6457: CP 02BH - JR NZ,L6467 ; (+00cH) - LD A,(0651CH) - OR A - JR NZ,L6467 ; (+006H) - LD A,001H - LD (06517H),A - INC DE -L6467: DEC DE - LD A,H - LD (064F9H),A - JR L64A1 ; (+033H) - -L646E: LD A,H - LD (064F9H),A - LD H,0FFH -L6474: INC H - LD A,(DE) - INC DE - CP 023H - JR Z,L6474 ; (-007H) - CP 02DH - JR NZ,L6487 ; (+008H) - LD A,001H - LD (06512H),A - INC DE - JR L6497 ; (+010H) - -L6487: CP 02BH - JR NZ,L6497 ; (+00cH) - LD A,(0651CH) - OR A - JR NZ,L6497 ; (+006H) - LD A,001H - LD (06517H),A - INC DE -L6497: DEC DE - LD A,H - LD (064C2H),A - JR L64A1 ; (+003H) - -L649E: POP DE - JR L64B3 ; (+012H) - -L64A1: LD H,004H - PUSH DE -L64A4: LD A,(DE) - INC DE - CP 05EH - JR NZ,L649E ; (-00cH) - DEC H - JR NZ,L64A4 ; (-009H) - POP AF - LD A,001H - LD (064C5H),A -L64B3: POP HL - PUSH DE - INC HL - LD A,(HL) - RES 7,(HL) - DEC HL - LD (06549H),A - LD A,(064F9H) - LD D,A - LD A,000H - LD E,A - LD A,000H - PUSH BC - CALL L65BE - POP BC - LD A,000H - OR A - JR Z,L6511 ; (+041H) - PUSH BC - PUSH DE - LD A,(064F9H) - LD L,A - LD H,000H - ADD HL,DE - LD DE,L849C - LD C,000H - DEC HL -L64DF: LD B,003H -L64E1: LD A,(HL) - CP 020H - JR Z,L64F8 ; (+012H) - INC C - LD (DE),A - INC DE - DEC HL - DJNZ L64E1 ; (-00bH) - LD A,(HL) - CP 020H - JR Z,L64F8 ; (+007H) - LD A,02CH - LD (DE),A - INC DE - INC C - JR L64DF ; (-019H) - -L64F8: LD A,000H - CP C - JP C,04AEFH - LD B,C - LD L,A - LD H,000H - POP DE - PUSH DE - ADD HL,DE - LD DE,L849C - DEC HL -L6509: LD A,(DE) - LD (HL),A - DEC HL - INC DE - DJNZ L6509 ; (-006H) - POP DE - POP BC -L6511: LD A,000H - OR A - JR NZ,L6553 ; (+03dH) - LD A,000H - OR A - JR NZ,L6553 ; (+038H) - LD A,000H - OR A - JR NZ,L6548 ; (+028H) - LD A,(06549H) - RLCA - JR NC,L6553 ; (+02dH) - LD A,(DE) - CP 020H - LD H,02DH - JR Z,L6532 ; (+005H) - CP 030H - JP NZ,04AEFH -L6532: PUSH DE -L6533: LD A,(DE) - INC DE - CP 020H - JR Z,L6533 ; (-006H) - CP 030H - JR Z,L6533 ; (-00aH) - OR A - JR NZ,L6541 ; (+001H) - DEC DE -L6541: DEC DE - DEC DE - LD A,H - LD (DE),A - POP DE - JR L6553 ; (+00bH) - -L6548: LD A,000H - RLCA - LD H,02BH - JR NC,L6532 ; (-01dH) - LD H,02DH - JR L6532 ; (-021H) - -L6553: DB 03EH ; LD A,nn opcode (self-modifying: operand at L6554) -L6554: DB 000H ; Operand byte — patched by LD (L6554),A - OR A - JR Z,L656B ; (+013H) - LD A,(DE) - CP 020H - JR NZ,L656B ; (+00eH) - PUSH DE -L655E: LD A,(DE) - INC DE - CP 020H - JR Z,L655E ; (-006H) - DEC DE - DEC DE - LD A,(L6554) - LD (DE),A - POP DE -L656B: LD A,000H - OR A - JR Z,L657D ; (+00dH) - PUSH DE -L6571: LD A,(DE) - CP 020H - JR NZ,L657C ; (+006H) - LD A,02AH - LD (DE),A - INC DE - JR L6571 ; (-00bH) - -L657C: POP DE -L657D: LD A,(DE) - OR A - JR Z,L6586 ; (+005H) - LD (BC),A - INC BC - INC DE - JR L657D ; (-009H) - -L6586: LD A,(06517H) - OR A - JR Z,L659A ; (+00eH) - LD A,(06549H) - RLCA - LD A,02BH -L6592: JR NC,L6596 ; (+002H) - LD A,02DH -L6596: LD (BC),A - INC BC - JR L65A8 ; (+00eH) - -L659A: LD A,(06512H) - OR A - JR Z,L65A8 ; (+008H) - LD A,(06549H) - RLCA - LD A,020H - JR L6592 ; (-016H) - -L65A8: POP HL - JP L6344 - -L65AC: PUSH HL - LD HL,L0036 - BIT 6,(HL) - POP HL - JR NZ,L65B8 ; (+003H) - CP 07DH - RET - -L65B8: CP FDPD - RET Z - CP 024H - RET - -L65BE: OR A - JP Z,L6649 - PUSH DE - LD A,(HL) - OR A - JR Z,L6606 ; (+03fH) - PUSH HL - LD A,D - LD DE,L84D7 - PUSH AF - CALL L5E90 - POP AF - OR A - JR Z,L65DF ; (+00bH) - LD B,A - LD HL,L84D7 - JR L65DD ; (+003H) - -L65DA: CALL L60AA -L65DD: DJNZ L65DA ; (-005H) -L65DF: POP HL - LD B,000H -L65E2: LD DE,L84D7 - CALL L6049 - JR C,L65F0 ; (+006H) - CALL L5FFE - INC B - JR L65E2 ; (-00eH) - -L65F0: PUSH HL - LD HL,L84D7 - CALL L5FFE - POP HL -L65F8: LD DE,L84D7 - CALL L6049 - JR NC,L6606 ; (+006H) - CALL L60AA - DEC B - JR L65F8 ; (-00eH) - -L6606: POP DE - PUSH BC - CALL L6663 - POP BC - PUSH DE - LD A,(DE) - CP 02EH - JR NZ,L6624 ; (+012H) - LD DE,L84AC - DEC DE - LD A,(DE) - CP 031H - POP DE - PUSH DE - JR NZ,L6640 ; (+023H) - EX DE,HL - INC HL - LD (HL),031H - DEC HL - JR L663E ; (+01aH) - -L6624: LD A,(DE) - CP 031H - JR NZ,L6640 ; (+017H) - EX DE,HL - INC HL - LD A,(HL) - DEC HL - CP 02EH - LD A,030H - JR Z,L6635 ; (+002H) - LD A,020H -L6635: LD (HL),A -L6636: INC HL - LD A,(HL) - CP 02EH - JR Z,L6636 ; (-006H) - LD (HL),031H -L663E: EX DE,HL - INC B -L6640: LD A,(DE) - INC DE - OR A - JR NZ,L6640 ; (-005H) - DEC DE - JP L615C - -L6649: PUSH DE - CALL L6663 - POP AF - OR A - RET NZ - PUSH HL - LD HL,L84AC - DEC HL - LD A,030H - CP (HL) -L6658: JP NZ,04AEFH - DEC HL - LD A,020H - CP (HL) - JR NZ,L6658 ; (-009H) - POP HL - RET - -L6663: PUSH DE - CALL L61AD - JP C,04AEFH - POP HL - PUSH HL - LD H,000H - INC L - JR Z,L6672 ; (+001H) - DEC L -L6672: LD DE,L84AD - ADD HL,DE - LD A,(HL) - LD (HL),000H - LD DE,L3036 - CP 035H - JR C,L668F ; (+00fH) -L6680: DEC HL - LD A,(HL) - CP 02EH - JR Z,L6680 ; (-006H) - INC A - JP Z,04AEFH - LD (HL),A - CP 03AH - JR Z,0667AH ; (-015H) -L668F: LD HL,KEYBM1 - LD DE,L2000 -L6695: LD (HL),D - INC HL - DEC E - JR NZ,L6695 ; (-005H) - POP HL - PUSH HL - LD E,H - LD D,000H - LD HL,KEYBUF - ADD HL,DE - PUSH HL - LD HL,L84A3 - LD (HL),020H - INC HL - LD D,007H -L66AC: LD A,(HL) - CP 030H - JR NZ,L66B7 ; (+006H) - LD (HL),020H - INC HL - DEC D - JR NZ,L66AC ; (-00bH) -L66B7: POP HL - PUSH HL - LD B,E - LD A,B - OR A - JR Z,L66D5 ; (+017H) - LD DE,L84AC -L66C1: DEC HL - DEC DE - LD A,(DE) - LD (HL),A - CP 020H - JR Z,L66D5 ; (+00cH) - DJNZ L66C1 ; (-00aH) - DEC DE - LD A,(DE) - CP 020H - JR Z,L66D5 ; (+004H) - INC A - JP NZ,04AEFH -L66D5: POP HL - POP DE - INC E - JR Z,L66E9 ; (+00fH) - LD B,E - LD DE,L84AD - LD (HL),02EH -L66E0: INC HL - DEC B - JR Z,L66E9 ; (+005H) - LD A,(DE) - INC DE - LD (HL),A - JR L66E0 ; (-009H) - -L66E9: LD (HL),000H - LD DE,KEYBUF - RET - -L66EF: PUSH DE - PUSH BC - LD C,000H - DEC DE -L66F4: INC DE -L66F5: CALL L687B - OR A - JR Z,L672C ; (+031H) - CP 0FFH - JR Z,L6730 ; (+031H) - CP 060H - JP NC,L4AEC - CP 020H - JR C,L66F4 ; (-014H) - LD IX,L66F5 - PUSH IX - CP 022H - JR Z,L674B ; (+039H) - CP 027H - JR Z,L673E ; (+028H) - CP 03FH - JR Z,L6737 ; (+01dH) - CP 02EH - JP Z,L689E - CP 024H - JP Z,L68B8 - CALL L5EC4 - JR C,L6773 ; (+04aH) - JP L6885 - -L672C: LD (HL),A - POP BC - POP DE - RET - -L6730: LD (HL),LSE4 - CALL L6757 - JR L66F5 ; (-042H) - -L6737: LD A,08FH - CALL L6756 - JR L67B4 ; (+076H) - -L673E: LD (HL),03AH - CALL L6757 - LD (HL),027H - CALL L6758 - JP L681B - -L674B: LD (HL),A - CALL L6757 -L674F: LD A,(DE) - OR A - RET Z - CP 022H - JR NZ,L674B ; (-00bH) -L6756: LD (HL),A -L6757: INC DE -L6758: INC HL -L6759: INC C - RET NZ - JP 04B01H - -L675E: POP BC - LD A,(DE) - CALL L5ECB - JR C,L6756 ; (-00fH) -L6765: CALL L6756 - LD A,(DE) - CP 024H - JR Z,L6756 ; (-017H) - CALL L5EC4 - RET C - JR L6765 ; (-00eH) - -L6773: PUSH BC - LD BC,STMTWORDTBL - CALL L682A - JR NC,L67AA ; (+02eH) - LD BC,EXTWORDTBL - CALL L682A - LD C,0FEH - JR NC,L6790 ; (+00aH) - LD BC,FUNCWORDTBL - CALL L682A - LD C,0FFH - JR C,L675E ; (-032H) -L6790: LD (HL),C - INC HL - LD (HL),A - POP BC - CALL L6759 - CALL L6758 - CP 0B4H - RET NZ - CALL L687B - CP 03DH - RET NZ - LD (HL),QDPC - CALL L6757 - JR L67F0 ; (+046H) - -L67AA: POP BC - CP 0DFH - DB 020H - LD (BC),A - LD (HL),0A8H - CALL L6758 -L67B4: CP 097H - JR Z,L681B ; (+063H) - CP 094H - JR Z,L681B ; (+05fH) - CP 0C2H - JR Z,L6811 ; (+051H) - CP LSE2 - JR Z,L67F0 ; (+02cH) - CP LSE0 - RET NC - PUSH AF - CALL L687B - CP 02FH - JR NZ,L67DC ; (+00dH) - LD (HL),FDPD - CALL L6757 - CALL L6A1D - CALL L6756 - JR L67EC ; (+010H) - -L67DC: CP 023H - JR NZ,L67EC ; (+00cH) - CALL L6756 - CALL L6A1D - CALL L5EC4 - CALL NC,L6885 -L67EC: POP AF - CP 08DH - RET NC -L67F0: CALL L687B - CP 022H - JR NZ,L67FC ; (+005H) - CALL L674B - JR L67F0 ; (-00cH) - -L67FC: CP 02CH - RET C - CP 02FH - JR C,L680C ; (+009H) - CALL L5EC4 - RET C - CALL L68AF - JR L67F0 ; (-01cH) - -L680C: CALL L6756 - JR L67F0 ; (-021H) - -L6811: DEC HL - LD (HL),03AH ; Store ':' at previous position - INC HL - LD (HL),A - CALL L6758 - JR L67F0 ; (-02bH) - -L681B: LD A,(DE) - CALL L4141 - RET Z - CALL L6756 - CP 022H - CALL Z,L674F - JR L681B ; (-00fH) - -L682A: PUSH HL - PUSH DE - LD H,B - LD L,C - LD B,07FH -L6830: POP DE - PUSH DE - INC B - LD A,(HL) - CP 0FFH - JR NZ,L683C ; (+004H) - POP DE - POP HL - SCF - RET - -L683C: CP 02EH - JR NZ,L6849 ; (+009H) - INC HL - DEC DE - LD A,(DE) - INC DE - CALL L5ECB - JR NC,L6868 ; (+01fH) -L6849: LD A,(DE) - CP 020H - JR NZ,L685A ; (+00cH) - LD A,(HL) - AND 07FH - SUB 041H - CP 01AH - JR C,L6868 ; (+011H) - CALL L6A1C -L685A: LD C,(HL) - INC HL - INC DE - CP 02EH - JR Z,L6870 ; (+00fH) - SUB C - JR Z,L6849 ; (-01bH) - CP 080H - JR Z,L6876 ; (+00eH) -L6868: DEC HL -L6869: BIT 7,(HL) - INC HL - JR Z,L6869 ; (-005H) - JR L6830 ; (-040H) - -L6870: LD A,B - CP 0E8H - JR NC,L6868 ; (-00dH) - CCF -L6876: POP HL - POP HL - LD (HL),B - LD A,B - RET - -L687B: LD A,(DE) - CP 020H - RET NZ - LD (HL),A - CALL L6757 - JR L687B ; (-00aH) - -L6885: EX AF,AF' - PUSH DE - CALL L6A1C - POP DE - CALL L5EC4 - JR NC,L689E ; (+00eH) - CP 02EH - JR Z,L689E ; (+00aH) - CP 045H - JR Z,L689E ; (+006H) - EX AF,AF' - SUB 02FH - JP L689E - -L689E: PUSH BC - LD (HL),015H - INC HL - PUSH HL - CALL L5EDC - POP HL - LD BC,00005H - ADD HL,BC - LD A,006H - JR L68D2 ; (+023H) - -L68AF: PUSH BC - CALL L6A11 - LD (HL),00BH - INC HL - JR L68CC ; (+014H) - -L68B8: LD (HL),A - INC DE - LD A,(DE) - RST 018H - DB 015H - JP C,L6758 - PUSH BC - LD (HL),011H - INC HL - PUSH HL - EX DE,HL - RST 018H - DB 014H - LD B,D - LD C,E - EX DE,HL - POP HL -L68CC: LD A,003H - LD (HL),C - INC HL - LD (HL),B - INC HL -L68D2: POP BC - ADD A,C - JP C,04B01H - LD C,A -L68D8: DEC DE - LD A,(DE) - CP 020H - JR Z,L68D8 ; (-006H) - INC DE - RET - -L68E0: PUSH HL - PUSH DE - PUSH BC - EXX - LD B,000H - EXX - LD C,000H -L68E9: LD A,(HL) - OR A - JR Z,L691D ; (+030H) - LD BC,L68E9 - PUSH BC - CP 027H - JR Z,L6937 ; (+042H) - INC HL - LD BC,STMTWORDTBL - CP 020H - JR C,L695F ; (+062H) - CP 022H - JR Z,L6948 ; (+047H) - CP 03AH - JR Z,L6955 ; (+050H) - CP 097H - JR Z,L6933 ; (+02aH) - CP 094H - JR Z,L6933 ; (+026H) - CP LSE4 - JR Z,L6922 ; (+011H) - CP 0FEH - JR NC,L6927 ; (+012H) - CP 080H - JP NC,L69A3 - JP L69C0 - -L691D: LD (DE),A - POP BC - POP DE - POP HL - RET - -L6922: LD A,0FFH - JP L69C0 - -L6927: LD BC,FUNCWORDTBL - JR NZ,L692F ; (+003H) - LD BC,EXTWORDTBL -L692F: LD A,(HL) - INC HL - JR L69A3 ; (+070H) - -L6933: CALL L69A3 - RET Z -L6937: LD A,(HL) - CALL L4141 - RET Z - CALL L69C0 - LD A,(HL) - INC HL - CP 022H - CALL Z,L694B - JR L6937 ; (-011H) - -L6948: CALL L69C0 -L694B: LD A,(HL) - OR A - RET Z - INC HL - CP 022H - JR NZ,L6948 ; (-00bH) - JR L69C0 ; (+06bH) - -L6955: LD (DE),A - LD A,(HL) - CP 0C2H - RET Z - CP 027H - RET Z - JR L69C3 ; (+064H) - -L695F: CP 015H - JR Z,L6993 ; (+030H) - CP 00BH - JR NC,L696C ; (+005H) - DEC A - OR 030H - JR L69C0 ; (+054H) - -L696C: PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - INC HL - PUSH HL - CP 012H - JR Z,L6982 ; (+00cH) - CP 00CH - JR C,L6982 ; (+008H) - JR NZ,L69CF ; (+053H) - EX DE,HL - INC HL - INC HL - LD E,(HL) - INC HL - LD D,(HL) -L6982: EX DE,HL - CALL L5E66 - LD B,D - LD C,E - POP HL - POP DE -L698A: LD A,(BC) - OR A - RET Z - CALL L69C0 - INC BC - JR L698A ; (-009H) - -L6993: PUSH HL - PUSH DE - CALL L621B - LD B,D - LD C,E - POP DE - POP HL - INC HL - INC HL - INC HL - INC HL - INC HL - JR L698A ; (-019H) - -L69A3: CP 080H - JR Z,L69B1 ; (+00aH) - EX AF,AF' -L69A8: LD A,(BC) - RLCA - INC BC - JR NC,L69A8 ; (-005H) - EX AF,AF' - DEC A - JR L69A3 ; (-00eH) - -L69B1: LD A,(BC) - BIT 7,A - JR NZ,L69BE ; (+008H) - CP 02EH - CALL NZ,L69C0 - INC BC - JR L69B1 ; (-00dH) - -L69BE: AND 07FH -L69C0: LD (DE),A - OR A - RET Z -L69C3: INC DE - EXX - INC B - EXX - RET NZ - XOR A - LD (DE),A - DEC DE - EXX - DEC B - EXX - RET - -L69CF: LD A,024H - EX AF,AF' - EX DE,HL - CALL L69E0 - LD B,D - LD C,E - POP HL - POP DE - EX AF,AF' - CALL L69C0 - JR L698A ; (-056H) - -L69E0: LD DE,L84A8 - PUSH DE - LD A,H - CALL L69F9 - LD A,L - CALL L69F9 - XOR A - LD (DE),A - POP DE - LD B,003H -L69F1: LD A,(DE) - CP 030H - RET NZ - INC DE - DJNZ L69F1 ; (-007H) - RET - -L69F9: PUSH AF - RRCA - RRCA - RRCA - RRCA - AND 00FH - CALL L6A06 - POP AF - AND 00FH -L6A06: ADD A,030H - CP 03AH - JR C,L6A0E ; (+002H) - ADD A,007H -L6A0E: LD (DE),A - INC DE - RET - -L6A11: PUSH HL - EX DE,HL - RST 018H - DB 013H - LD B,D - LD C,E - EX DE,HL - POP HL - JP L68D8 - -L6A1C: INC DE -L6A1D: LD A,(DE) - CP 020H - JR Z,L6A1C ; (-006H) - RET - -L6A23: LD C,(HL) -L6A24: CALL L6A2C - XOR A - LD (LPOSB),A - RET - -L6A2C: LD A,(L004D) - OR A - JP NZ,L4B3C - CALL TEST1 - DB 047H - JR Z,L6A7C ; (+043H) - CALL TESTX - DB 054H - LD A,001H - LD (PNMODE),A - CALL TEST1 - DB 04EH - JR Z,L6A52 ; (+00aH) - CALL TEST1 - DB 04CH - JR Z,L6A52 ; (+004H) - CALL TESTX - DB 053H -L6A52: LD (L6A23),A - CALL 05E48H - CALL L6A74 -L6A5B: LD A,001H - RST 018H - DB 006H - LD A,(L6A23) - CP 04EH - RET Z - CP 04CH - LD A,00BH - JR Z,L6A71 ; (+006H) - LD A,009H - RST 018H - DB 006H - RST 018H - DB 006H -L6A71: RST 018H - DB 006H - RET - -L6A74: LD A,00AH - RST 018H - DB 006H - LD A,003H - JR L6A71 ; (-00bH) - -L6A7C: INC HL - CALL 05E48H - LD A,002H - LD (PNMODE),A - JR L6A71 ; (-016H) - -L6A87: CALL L6AC6 - CALL L6E5F - LD A,E - OR A - RET Z - CP 0ECH - JR NC,L6A99 ; (+005H) - CP 015H - JP NC,04AF2H -L6A99: CALL 05E48H - BIT 7,E - JR NZ,L6AA8 ; (+008H) -L6AA0: LD A,00AH - RST 018H - DB 006H - DEC E - JR NZ,L6AA0 ; (-007H) - RET - -L6AA8: LD A,003H - RST 018H - DB 006H - INC E - JR NZ,L6AA8 ; (-007H) - RET - -L6AB0: PUSH HL - LD HL,L03E7 - JR L6ABA ; (+004H) - -L6AB6: PUSH HL - LD HL,L01E0 -L6ABA: PUSH HL - ADD HL,DE - POP HL - JR C,L6AC4 ; (+005H) - SBC HL,DE - JP C,04AF2H -L6AC4: POP HL - RET - -L6AC6: LD B,001H - JR L6ACC ; (+002H) - -L6ACA: LD B,002H -L6ACC: LD A,(PNMODE) - CP B - RET Z - JP L4B3C - -L6AD4: LD C,044H - LD DE,04A0EH - LD DE,04D0EH - LD DE,0520EH - CALL L6ACA - LD A,C - LD (06B26H),A - CP 04DH - JR NC,L6B0C ; (+022H) - CALL TEST1 - DB 025H - JR NZ,L6B0C ; (+01cH) - CALL L6E4B - LD A,E - DEC A - CP 010H - JP NC,04AF2H - DEC DE - LD A,04CH - RST 018H - DB 006H - CALL L6DE2 - CALL L6B68 - CALL L413E - RET Z - CALL L5E73 -L6B0C: CALL L6E5F - CALL L5E73 - CALL L6AB6 - PUSH DE - CALL L6E5F - CP 02CH - JR Z,L6B20 ; (+003H) - CALL 05E48H -L6B20: CALL L6AB0 - POP BC - PUSH DE - LD A,000H - RST 018H - DB 006H - LD E,C - LD D,B - CALL L6DE2 - CALL L6B6C - POP DE - CALL L6DE2 - CALL L6B68 - CALL L413E - RET Z - INC HL - JR L6B0C ; (-033H) - -L6B3F: CALL L6E4B - LD A,E - CP 004H - JP NC,04AF2H - CALL 05E48H - LD A,(PNMODE) - CP 002H - JR Z,L6B5F ; (+00dH) - CALL L6A74 - LD A,002H - RST 018H - DB 006H - CALL L6B5F - JP L6A5B - -L6B5F: LD A,043H - RST 018H - DB 006H - LD A,E - OR 030H - RST 018H - DB 006H -L6B68: LD A,00DH - JR L6B6E ; (+002H) - -L6B6C: LD A,02CH -L6B6E: RST 018H - DB 006H - RET - -L6B71: CALL L6ACA - CALL 05E48H - LD A,048H - JR L6B6E ; (-00dH) - -L6B7B: CALL L6ACA - CALL 05E48H - LD A,049H - JR L6B6E ; (-017H) - -L6B85: CALL L6ACA - CALL TEST1 - DB 05BH - JR NZ,L6BC6 ; (+038H) - CALL L6E4B - CP 040H - JP NC,04AF2H - PUSH DE - CALL L5E70 - CALL L6E4B - CP 004H - JP NC,04AF2H - PUSH DE - CALL TESTX - DB 05DH - POP BC - POP DE - PUSH BC - LD A,053H - RST 018H - DB 006H - CALL L6DE2 - CALL L6B6C - POP DE - LD A,051H - RST 018H - DB 006H - CALL L6DE2 - CALL L6B68 - CALL L413E - RET Z - CALL L5E73 -L6BC6: CALL L6E6F - CALL L413E - JR Z,L6BD2 ; (+004H) - CALL L5E73 - DEC HL -L6BD2: LD A,B - OR A - JR Z,L6BE3 ; (+00dH) - LD A,050H - RST 018H - DB 006H -L6BDA: LD A,(DE) - RST 018H - DB 006H - INC DE - DJNZ L6BDA ; (-006H) - CALL L6B68 -L6BE3: CALL L413E - RET Z - INC HL - JR L6BC6 ; (-024H) - -L6BEA: CALL L6ACA - CALL L6E4B - CP 002H - JP NC,04AF2H - PUSH AF - CALL L5E70 - CALL L6E5F - PUSH DE - CALL L5E73 - CALL L6E4B - OR A - JP Z,04AF2H - CALL 05E48H - LD A,058H - RST 018H - DB 006H - POP BC - POP AF - PUSH DE - PUSH BC - OR 030H - RST 018H - DB 006H - CALL L6B6C - POP DE - CALL L6AB0 - CALL L6DE2 - CALL L6B6C - POP DE - CALL L6DE2 - JP L6B68 - -L6C2A: CALL L6ACA - PUSH HL - LD DE,L0000 - LD HL,L6DC4 - CALL L5E99 - LD DE,L0168 - LD HL,L6DC9 - CALL L5E99 - LD HL,L610D - LD DE,L6DCE - CALL L5E93 - POP HL - CALL L6E8A - CALL L5E73 - PUSH HL - LD HL,L6DB5 - EX DE,HL - CALL L5E93 - POP HL - CALL L6E8A - CALL L5E73 - PUSH HL - LD HL,L6DBA - EX DE,HL - CALL L5E93 - POP HL - CALL L6E8A - PUSH HL - PUSH AF - LD HL,L6DBF - EX DE,HL - CALL L5E93 - LD A,(06DC0H) - RLCA - JP C,04AF2H - POP AF - CP 02CH - JR NZ,L6CBA ; (+03aH) - POP HL - INC HL - CALL L6E8A - PUSH HL - PUSH AF - LD HL,L6DC4 - EX DE,HL - CALL L5E93 - POP AF - CP 02CH - JR NZ,L6CBA ; (+027H) - POP HL - INC HL - CALL L6E8A - PUSH HL - PUSH AF - LD HL,L6DC9 - EX DE,HL - CALL L5E93 - POP AF - CP 02CH - JR NZ,L6CBA ; (+014H) - POP HL - INC HL - CALL L6E8A - PUSH HL - LD HL,L6DCE - EX DE,HL - CALL L5E93 - LD A,(06DCFH) - RLCA - JP C,04AF2H -L6CBA: POP HL - CALL 05E48H - PUSH HL - LD HL,L6DC9 - LD DE,L6DC4 - LD A,(L6DCE) - OR A - CALL NZ,L7A1C - JP C,04AF2H - CALL L6D6B - LD HL,L6DD3 - LD (06D43H),HL - LD HL,L6DD8 - LD (06D4EH),HL - CALL 06D3FH - LD A,(L6DCE) - OR A - JR Z,L6D19 ; (+032H) -L6CE7: LD HL,L6DC4 - LD DE,L6DCE - CALL L7985 - LD DE,L6DC9 - CALL L7A1C - JR NC,L6D04 ; (+00cH) - CALL L6D6B - CALL L6D3C - RST 018H - DB 00EH - JR NZ,L6CE7 ; (-01bH) - POP HL - RET - -L6D04: CALL L6D0C - CALL L6D3C - POP HL - RET - -L6D0C: LD HL,L6DC9 - LD DE,L6DC4 - LD BC,00005H - LDIR - JR L6D6B ; (+052H) - -L6D19: LD HL,L6DB5 - LD (06D43H),HL - LD HL,L6DBA - LD (06D4EH),HL - CALL L6D3C - CALL L6D0C - LD HL,L6DD3 - LD (06D43H),HL - LD HL,L6DD8 - LD (06D4EH),HL - CALL L6D3C - POP HL - RET - -L6D3C: LD A,044H - LD HL,L4D3E - PUSH AF - LD HL,L6DB5 - CALL L60B7 - PUSH HL - EX DE,HL - CALL L6AB0 - LD HL,L6DBA - CALL L60B7 - PUSH HL - EX DE,HL - CALL L6AB0 - POP HL - POP DE - POP AF - RST 018H - DB 006H - PUSH HL - CALL L6DE2 - CALL L6B6C - POP DE - CALL L6DE2 - JP L6B68 - -L6D6B: LD DE,(INTFAC) - LD HL,L6DC4 - CALL L5E93 - LD HL,(INTFAC) - CALL L817C - CALL L7FC2 - LD DE,L6DBF - CALL L7BB3 - LD DE,L6DB5 - CALL L7985 - LD DE,L6DD3 - CALL L5E93 - LD DE,(INTFAC) - LD HL,L6DC4 - CALL L5E93 - LD HL,(INTFAC) - CALL L817C - CALL L7FD2 - LD DE,L6DBF - CALL L7BB3 - LD DE,L6DBA - CALL L7985 - LD DE,L6DD8 - JP L5E93 - -L6DB5: DS 5, 000H -L6DBA: DS 5, 000H -L6DBF: DS 5, 000H -L6DC4: DS 5, 000H -L6DC9: DS 5, 000H -L6DCE: DS 5, 000H -L6DD3: DS 5, 000H -L6DD8: DS 10, 000H -L6DE2: PUSH AF - PUSH HL - LD HL,(INTFAC) - CALL L5E99 - CALL L6028 - RST 018H - DB 017H -L6DEF: LD A,(DE) - RST 018H - DB 006H - INC DE - DJNZ L6DEF ; (-006H) - POP HL - POP AF - RET - -L6DF8: CALL L6AC6 - CALL 05E48H - LD A,004H - RST 018H - DB 006H - RET - -L6E03: CALL L6AC6 - CALL L6E5F - LD A,E - OR A - JP Z,04AF2H - CP 049H - JP NC,04AF2H - CALL 05E48H - LD A,009H - RST 018H - DB 006H - RST 018H - DB 006H - CALL L6DE2 - JP L6B68 - -L6E22: CP 09DH - JR Z,L6E31 ; (+00bH) - CP 0A1H - JP NZ,L4AEC - XOR A -L6E2C: LD (L004D),A - INC HL - RET - -L6E31: CALL L6AC6 - LD A,(L6A23) - CP 04EH - JP NZ,L4B3C - LD A,(L004D) - OR A - JR NZ,L6E2C ; (-016H) - CALL L5285 - LD A,016H - RST 018H - DB 003H - JR L6E2C ; (-01fH) - -L6E4B: CALL L6E5F -L6E4E: LD A,D - OR A - JP NZ,04AF2H - LD A,E - RET - -L6E55: CALL L6E9C - DEC DE - DEC DE - DEC DE - DEC DE - DEC DE - JR L6E62 ; (+003H) - -L6E5F: CALL L6E8A -L6E62: PUSH AF - PUSH HL - EX DE,HL - CALL L791F - CALL L60B7 - EX DE,HL - POP HL - POP AF - RET - -L6E6F: CALL L6E8A - PUSH AF - CALL L7916 - PUSH HL - EX DE,HL - CALL L6E7E - POP HL - POP AF - RET - -L6E7E: LD B,(HL) - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(STRST) - ADD HL,DE - EX DE,HL - LD A,B - RET - -L6E8A: LD DE,(VARED) - LD (TMPEND),DE -L6E92: LD DE,(INTFAC) - PUSH DE - CALL L6E9C - POP DE - RET - -L6E9C: PUSH DE - LD DE,(TMPEND) - CALL L74E8 - POP DE - CALL L6EC0 -L6EA8: CP 0EAH - RET NZ - LD A,(L84CE) - PUSH AF - INC HL - CALL L6EC0 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL 07E65H - POP HL - POP AF - JR L6EA8 ; (-018H) - -L6EC0: CALL L6EDB -L6EC3: CP 0EBH - RET NZ - LD A,(L84CE) - PUSH AF - INC HL - CALL L6EDB - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL 07E62H - POP HL - POP AF - JR L6EC3 ; (-018H) - -L6EDB: CALL L6EF6 -L6EDE: CP 0ECH - RET NZ - LD A,(L84CE) - PUSH AF - INC HL - CALL L6EF6 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7E5F - POP HL - POP AF - JR L6EDE ; (-018H) - -L6EF6: CALL TEST1 - DB 0EDH - JR NZ,L6F0B ; (+00fH) - CALL L6F0B - PUSH AF - PUSH HL - LD HL,0FFFBH - ADD HL,DE - CALL L7E4F - POP HL - POP AF - RET - -L6F0B: CALL L6F75 -L6F0E: CP 0EEH - RET C - PUSH AF - LD A,(L84CE) - PUSH AF - INC HL - CALL L6F75 - POP BC - EX (SP),HL - PUSH AF - PUSH HL - CALL L74C5 - CALL L7A1C - EX AF,AF' - POP AF - CP 0F6H - JR NZ,L6F48 ; (+01eH) - EX AF,AF' - JR C,L6F43 ; (+016H) -L6F2D: LD BC,L0000 -L6F30: LD (HL),C - INC HL - LD (HL),B - INC HL - XOR A - LD (HL),A - INC HL - LD (HL),A - INC HL - LD (HL),A - LD A,005H - LD (L84CE),A - POP AF - POP HL - JR L6F0E ; (-035H) - -L6F43: LD BC,08081H - JR L6F30 ; (-018H) - -L6F48: CP QDPD - JR NZ,L6F53 ; (+007H) - EX AF,AF' - JR Z,L6F2D ; (-022H) - JR C,L6F2D ; (-024H) - JR L6F43 ; (-010H) - -L6F53: CP QDPC - JR NZ,L6F5C ; (+005H) - EX AF,AF' - JR Z,L6F43 ; (-017H) - JR L6F2D ; (-02fH) - -L6F5C: CP QDPA - JR C,L6F65 ; (+005H) - EX AF,AF' - JR NC,L6F43 ; (-020H) - JR L6F2D ; (-038H) - -L6F65: CP 0F0H - JR C,L6F70 ; (+007H) - EX AF,AF' - JR Z,L6F43 ; (-029H) - JR C,L6F43 ; (-02bH) - JR L6F2D ; (-043H) - -L6F70: EX AF,AF' - JR Z,L6F2D ; (-046H) - JR L6F43 ; (-032H) - -L6F75: CALL L6FA0 -L6F78: CP 0F7H - RET C - LD A,(L84CE) - PUSH AF - INC HL - JR Z,L6F92 ; (+010H) - CALL L6FA0 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L797C -L6F8E: POP HL - POP AF - JR L6F78 ; (-01aH) - -L6F92: CALL L6FA0 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7985 - JR L6F8E ; (-012H) - -L6FA0: CALL L6FCB -L6FA3: CP FDPB - RET C - LD A,(L84CE) - PUSH AF - INC HL - JR Z,L6FBD ; (+010H) - CALL L6FCB - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7EBB -L6FB9: POP HL - POP AF - JR L6FA3 ; (-01aH) - -L6FBD: CALL L6FCB - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7EDA - JR L6FB9 ; (-012H) - -L6FCB: CALL L6FF6 -L6FCE: CP FDPD - RET C - LD A,(L84CE) - PUSH AF - INC HL - JR Z,L6FE8 ; (+010H) - CALL L6FF6 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7BB3 -L6FE4: POP HL - POP AF - JR L6FCE ; (-01aH) - -L6FE8: CALL L6FF6 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7C9E - JR L6FE4 ; (-012H) - -L6FF6: CALL TEST1 - DB 0F7H - JR Z,L6FF6 ; (-006H) - CP FDPA - JR NZ,L7006 ; (+006H) - INC HL - CALL L7006 - JR L702F ; (+029H) - -L7006: CALL L703B -L7009: CP 0FDH - RET NZ - LD A,(L84CE) - PUSH AF - INC HL - CALL L7021 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7DD3 - POP HL - POP AF - JR L7009 ; (-018H) - -L7021: CALL TEST1 - DB 0F7H - JR Z,L7021 ; (-006H) - CP FDPA - JR NZ,L703B ; (+010H) - INC HL - CALL L703B -L702F: PUSH AF - PUSH HL - LD HL,0FFFBH - ADD HL,DE - CALL L796F - POP HL - POP AF - RET - -L703B: CALL L413E - JP Z,L4AEC - CALL L7047 - JP HLFTCH - -L7047: PUSH HL - LD HL,(MEMLMT) - SCF - SBC HL,DE - JP C,04AFBH - POP HL - CP LSE4 - JR Z,L7064 ; (+00eH) - CP 020H - JR NC,L70A4 ; (+04aH) -L705A: INC HL - CP 015H - JR C,L7073 ; (+014H) - CALL L5E93 - JR L706D ; (+009H) - -L7064: INC HL - PUSH HL - LD HL,0818FH - CALL L5E93 - POP HL -L706D: LD A,005H -L706F: LD (L84CE),A - RET - -L7073: CP 00BH - JR NC,L7080 ; (+009H) - DEC A - JP M,L4AEC - LD B,000H - LD C,A - JR L7091 ; (+011H) - -L7080: LD C,(HL) - INC HL - LD B,(HL) - INC HL - CP 00CH - JR NZ,L7091 ; (+009H) - INC BC - INC BC - LD A,(BC) - INC BC - EX AF,AF' - LD A,(BC) - LD B,A - EX AF,AF' - LD C,A -L7091: PUSH HL - PUSH DE - EX DE,HL - LD E,C - LD D,B - CALL L5E99 - POP DE - POP HL - LD A,005H -L709D: INC DE - INC DE - INC DE - INC DE - INC DE - JR L706F ; (-035H) - -L70A4: CP 022H - JR NZ,L70D7 ; (+02fH) - INC HL - PUSH HL - CALL L74D0 - EX (SP),HL - PUSH HL - LD HL,(TMPEND) - PUSH BC - LD BC,(STRST) - OR A - SBC HL,BC - POP BC - EX DE,HL - LD (HL),B - INC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - INC HL - INC HL - POP DE - PUSH HL - LD HL,(TMPEND) - CALL L74DC - LD (TMPEND),HL - POP DE - POP HL - LD A,003H - LD (L84CE),A - RET - -L70D7: CP 028H - JR NZ,L70E2 ; (+007H) - INC HL - CALL L6E9C - JP L5E82 - -L70E2: OR A - JP P,L76F5 - CP 0E7H - INC HL - JR NZ,L70F0 ; (+005H) - LD A,0A8H - PUSH AF - JR L7125 ; (+035H) - -L70F0: CP 0FFH - JP NZ,L4AEC - LD A,(HL) - INC HL - CP 0A0H - JP Z,L71A5 - CP 0C8H - JP NC,L4AEC - CP 0BAH - JR NC,L7155 ; (+050H) - PUSH AF - CP 0B3H - JR NC,L7146 ; (+03cH) - LD B,003H - CP 0AAH - JR Z,L7125 ; (+015H) - CP 0ABH - JR NC,L7125 ; (+011H) - LD B,005H - CP 088H - JR Z,L7140 ; (+026H) - CP 089H - JR NZ,L7125 ; (+007H) - CALL TEST1 - DB 040H - LD (081A8H),A -L7125: CALL L5E78 -L7128: PUSH BC - CALL L6E9C - CALL L5E82 - POP AF - CALL L7912 -L7133: POP AF - PUSH DE - PUSH HL - LD HL,0FFFBH - ADD HL,DE - CALL L7155 - POP HL - POP DE - RET - -L7140: CALL TEST1 - DB 028H - JR Z,L7128 ; (-01eH) -L7146: LD A,005H - LD (L84CE),A - PUSH HL - LD HL,L6112 - CALL L5E93 - POP HL - JR L7133 ; (-022H) - -L7155: PUSH HL - ADD A,A - LD L,A - LD H,000H - LD BC,L450A - ADD HL,BC - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - EX (SP),HL - RET - -L7164: EX DE,HL - LD HL,0FDF1H - ADD HL,SP - LD BC,(TMPEND) - OR A - SBC HL,BC - EX DE,HL - JR NC,L7186 ; (+013H) - XOR A - JR L7183 ; (+00dH) - -L7176: LD A,(L0054) - JR L7183 ; (+008H) - -L717B: LD A,(00055H) - JR L7183 ; (+003H) - -L7180: LD A,(L8485) -L7183: LD E,A - LD D,000H -L7186: LD A,005H - LD (L84CE),A - JP L5E99 - -L718E: LD DE,(08487H) - CALL L5E99 - INC HL - BIT 7,(HL) - DEC HL - RET Z - LD DE,L71A0 - JP L7985 - -L71A0: SUB C - NOP - NOP - NOP - NOP -L71A5: CALL L5E78 - LD B,000H -L71AA: PUSH BC - PUSH DE - CALL L6E55 - CALL L6E4E - POP DE - POP BC - PUSH AF - INC B - CALL TEST1 - DB 02CH - JR Z,L71AA ; (-012H) - CALL L5E82 - LD A,B - EXX - LD B,A - LD HL,(TMPEND) - CALL ADDHLA - LD D,H - LD E,L - CALL L74E8 -L71CD: DEC HL - POP AF - LD (HL),A - DJNZ L71CD ; (-005H) - EXX - LD A,B - EXX - LD B,A -L71D6: LD (TMPEND),DE - LD DE,(STRST) - OR A - SBC HL,DE - PUSH HL - LD A,B - EXX - EX DE,HL - LD (HL),A - INC HL - POP BC - LD (HL),C - INC HL - LD (HL),B - LD BC,L0003 - ADD HL,BC -L71EF: EX DE,HL - LD A,003H - LD (L84CE),A - RET - -L71F6: PUSH HL - CALL L60B7 - CALL L69E0 - RST 018H - DB 017H -L71FF: LD A,B - OR A - JR Z,L7213 ; (+010H) - LD HL,(TMPEND) - PUSH HL - PUSH BC - CALL L74DC - POP BC - EX DE,HL - POP HL - EXX - POP DE - EXX - JR L71D6 ; (-03dH) - -L7213: POP HL - CALL L7967 - JR L71EF ; (-02aH) - -L7219: PUSH HL - CALL L722A - LD B,A - LD C,A - OR A - LD A,020H - PUSH DE - CALL NZ,?SETDE - POP DE - LD B,C - JR L71FF ; (-02bH) - -L722A: CALL L60B7 - LD DE,KEYBUF - LD A,H - OR A - JP NZ,04AF2H - LD A,L - RET - -L7237: PUSH HL - CALL L6028 - LD A,(DE) - CP 020H - JR NZ,L7241 ; (+001H) - INC DE -L7241: RST 018H - DB 017H - JR L71FF ; (-046H) - -L7245: CALL L5E78 - CALL L5882 - LD B,A - CALL L5E7F - LD A,B - PUSH HL - PUSH DE - RST 018H - DB 029H - LD DE,0FFFFH - JR C,L7261 ; (+008H) - INC HL - BIT 7,(HL) - JR NZ,L7261 ; (+003H) - LD DE,L0000 -L7261: POP HL - CALL L5E99 - LD A,005H - LD (L84CE),A - INC HL - INC HL - INC HL - INC HL - INC HL - EX DE,HL - POP HL - RET - -L7272: PUSH HL - CALL L6E7E - OR A - JR Z,L727A ; (+001H) - LD A,(DE) -L727A: JR L7280 ; (+004H) - -L727C: PUSH HL - CALL L6E7E -L7280: POP HL - JP L7183 - -L7284: PUSH HL - CALL L6E7E - LD HL,(TMPEND) - PUSH HL - CALL L74DC - LD (HL),000H - POP DE - POP HL - JP L5EDC - -L7296: CALL L7312 - CALL L5E82 - CALL L730B - EX DE,HL - LD A,(HL) - CP C - JR NC,L72A5 ; (+001H) - LD C,A -L72A5: LD (HL),C - LD BC,00005H -L72A9: LD A,003H - ADD HL,BC - EX DE,HL - LD (L84CE),A - JP HLFTCH - -L72B3: CALL L7312 - CALL L5E82 - CALL L730B - EX DE,HL - LD A,(HL) - SUB C - JR NC,L72C3 ; (+002H) - XOR A - LD C,(HL) -L72C3: LD (HL),C - INC HL - ADD A,(HL) - LD (HL),A - INC HL - JR NC,L72CB ; (+001H) - INC (HL) -L72CB: LD BC,L0003 - JR L72A9 ; (-027H) - -L72D0: CALL L7312 - CALL L730B - OR A - JP Z,04AF2H - PUSH AF - CALL TEST1 - DB 029H - LD A,0FFH - JR Z,L72F7 ; (+014H) - CALL L5E70 - PUSH DE - EX DE,HL - LD BC,00005H - ADD HL,BC - EX DE,HL - CALL L6E55 - CALL L5E82 - CALL L6E4E - POP DE -L72F7: POP BC - LD C,A - EX DE,HL - LD A,(HL) - SUB B - JR C,L7307 ; (+009H) - INC A - CP C - JR NC,L7303 ; (+001H) - LD C,A -L7303: LD A,B - DEC A - JR L72C3 ; (-044H) - -L7307: XOR A - LD C,A - JR L72C3 ; (-048H) - -L730B: LD A,B - OR A - JP NZ,04AF2H - LD A,C - RET - -L7312: CALL L5E78 - PUSH DE - CALL L6E9C - CALL L5E73 - CALL L7916 - CALL L6E55 - LD C,E - LD B,D - POP DE - RET - -L7326: PUSH HL - PUSH DE - LD HL,(TMPEND) - PUSH HL - LD A,030H - LD B,006H - CALL ?SETHL - RST 018H - DB 025H - POP HL - OR A - JR Z,L733E ; (+005H) - INC (HL) - INC HL - INC (HL) - INC (HL) - DEC HL -L733E: EX DE,HL - LD BC,08CA0H - CALL L73B5 - LD BC,L0E10 - CALL L73B5 - CP 03AH - JR C,L7359 ; (+00aH) - SUB 00AH - DEC DE - LD (DE),A - DEC DE - LD A,(DE) - INC A - LD (DE),A - INC DE - INC DE -L7359: DEC DE - DEC DE - LD A,(DE) - INC DE - LD B,A - LD A,(DE) - INC DE - LD C,A - LD A,B - CP 032H - JR NZ,L7377 ; (+011H) - LD A,C - CP 034H - JR NZ,L7377 ; (+00cH) - LD HL,(TMPEND) - LD A,030H - LD B,006H - CALL ?SETHL - JR L738D ; (+016H) - -L7377: LD BC,L0258 - CALL L73B5 - LD BC,0003CH - CALL L73B5 - LD BC,0000AH - CALL L73B5 - LD A,030H - ADD A,L - LD (DE),A -L738D: LD HL,(TMPEND) - LD DE,L0006 - EX DE,HL - ADD HL,DE - LD (TMPEND),HL - EX DE,HL - LD DE,(STRST) - OR A - SBC HL,DE - EX DE,HL - POP HL - LD (HL),006H - INC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - INC HL - INC HL - EX DE,HL - POP HL - LD A,003H - LD (L84CE),A - JP HLFTCH - -L73B5: OR A - SBC HL,BC - JR C,L73BF ; (+005H) - LD A,(DE) - INC A - LD (DE),A - JR L73B5 ; (-00aH) - -L73BF: ADD HL,BC - INC DE - RET - -L73C2: CALL TESTX - DB QDPC - CALL L6E6F - LD A,B - CP 006H - JP NZ,04AF2H - PUSH HL - PUSH DE - LD HL,L0000 - CALL L7403 - CP 018H - JP NC,04AF2H - CP 00CH - LD A,000H - JR C,L73EB ; (+009H) - PUSH DE - LD DE,L000C - OR A - SBC HL,DE - POP DE - INC A -L73EB: PUSH AF - CALL L7403 - CP 03CH - JP NC,04AF2H - CALL L7403 - CP 03CH - JP NC,04AF2H - POP AF - EX DE,HL - RST 018H - DB 026H - POP DE - POP HL - RET - -L7403: PUSH DE - LD D,H - LD E,L - ADD HL,HL - ADD HL,HL - ADD HL,DE - LD D,H - LD E,L - ADD HL,HL - ADD HL,DE - ADD HL,HL - ADD HL,HL - POP DE - LD A,(DE) - INC DE - SUB 030H - JP C,04AF2H - CP 00AH - JP NC,04AF2H - PUSH BC - LD C,A - ADD A,A - ADD A,A - ADD A,C - ADD A,A - LD C,A - LD A,(DE) - INC DE - SUB 030H - JP C,04AF2H -L742A: CP 00AH - JP NC,04AF2H - ADD A,C - LD C,A - LD B,000H - ADD HL,BC - POP BC - RET - -L7436: LD DE,(VARED) - LD (TMPEND),DE - LD DE,(INTFAC) -L7442: PUSH DE - CALL L7495 -L7446: LD A,(HL) - CP 028H - JP Z,L74FB - PUSH HL - CALL L77B6 - JR NC,L7458 ; (+006H) - LD A,C - LD C,L - LD B,H - POP HL - POP DE - RET - -L7458: LD A,(DE) - ADD A,C - ADD A,002H - PUSH BC - EX DE,HL - LD HL,(TMPEND) - PUSH HL - OR A - SBC HL,DE - INC HL - LD C,L - LD B,H - POP HL - PUSH DE - EX DE,HL - LD L,A - LD H,000H - ADD HL,DE - EX DE,HL - CALL L74E8 - LDDR - LD E,A - LD D,000H - RST 018H - DB 01AH - POP HL - POP BC - LD DE,KEYBUF - LD (HL),C - INC HL - SCF - SBC A,C - LD B,A -L7484: LD A,(DE) - LD (HL),A - INC DE - INC HL - DJNZ L7484 ; (-006H) - PUSH HL - LD B,C - CALL ?CLRHL - LD (HL),A - LD A,C - POP BC - POP HL - POP DE - RET - -L7495: CALL HLFTCH - SUB 041H - CP 01AH - JP NC,L4AEC - LD DE,KEYBUF - LD B,000H -L74A4: INC DE - LD A,(HL) - CALL L5ECB - JR C,L74B6 ; (+00bH) - LD (DE),A - INC B - LD A,B - CP 003H - JR C,L74B3 ; (+001H) - DEC B -L74B3: INC HL - JR L74A4 ; (-012H) - -L74B6: LD DE,KEYBUF - EX DE,HL - LD (HL),B - EX DE,HL - LD C,005H - CP 024H - RET NZ - LD C,003H - INC HL - RET - -L74C5: LD HL,0FFFBH - EX DE,HL - ADD HL,DE - EX DE,HL - ADD HL,DE - LD A,B - JP L7912 - -L74D0: LD B,0FFH -L74D2: INC B - LD A,(HL) - OR A - RET Z - INC HL - CP 022H - RET Z - JR L74D2 ; (-00aH) - -L74DC: LD A,B - OR A - RET Z - CALL LDHLDE - EX DE,HL - CALL L74E8 - EX DE,HL - RET - -L74E8: PUSH HL - LD HL,0FE00H - ADD HL,SP - SBC HL,DE - POP HL - RET NC - JP L4B2C - -L74F4: LD DE,(INTFAC) - PUSH DE - JR L7503 ; (+008H) - -L74FB: XOR A - LD (L76F4),A - INC HL - LD (L76F2),HL -L7503: LD B,000H - EXX - POP HL - PUSH HL - PUSH HL - LD HL,(TMPEND) - LD DE,KEYBUF - PUSH HL - LD A,(DE) - LD (HL),A - INC DE - INC HL - LD B,A - CALL L74DC - POP DE - LD (TMPEND),HL - LD HL,(STRST) - EX DE,HL - OR A - SBC HL,DE - EX (SP),HL - PUSH HL - EXX -L7526: POP DE - PUSH DE - PUSH BC - LD BC,(076F2H) - LD A,(L76F4) - PUSH BC - PUSH AF - LD BC,(0849CH) - PUSH BC - CALL L6E55 - BIT 7,D - JP NZ,04AF2H - EX AF,AF' - POP BC - LD (0849CH),BC - POP AF - LD (L76F4),A - POP BC - LD (076F2H),BC - EX AF,AF' - INC HL - CP 029H - JR Z,L756C ; (+018H) - CP 02CH - JP NZ,L4AEC - POP BC - INC B - LD A,B - CP 004H - JP NC,04AF2H - EXX - POP HL - POP DE - EXX - PUSH DE - EXX - PUSH DE - PUSH HL - EXX - JR L7526 ; (-046H) - -L756C: POP BC - EXX - POP HL - POP DE - EXX - INC B - PUSH DE - PUSH HL - EXX - LD HL,(STRST) - ADD HL,DE - LD B,(HL) - INC B - LD DE,KEYBUF - CALL LDDEHL - EXX - SET 7,C - CALL L77B6 - RES 7,C - JR NC,L75E1 ; (+056H) - LD A,B - CP (HL) - JP NZ,04AFEH - INC HL - EX DE,HL - POP HL - LD (L849C),HL - EXX - LD HL,L0000 - EXX - EX DE,HL -L759C: LD E,(HL) - INC HL - LD D,(HL) - INC HL - EX (SP),HL - PUSH DE - EXX - POP DE - CALL L76C8 - EXX - PUSH HL - OR A - SBC HL,DE - JP NC,04AF2H - EXX - POP DE - CALL L76C4 - EXX - POP HL - DJNZ L759C ; (-01cH) - PUSH HL - EXX - LD A,C - LD D,B - BIT 6,A - JR NZ,L75D4 ; (+014H) - AND 00FH - LD E,A - PUSH AF - CALL L76C8 - PUSH HL - EXX - POP BC - POP AF - POP HL - ADD HL,BC - LD C,L - LD B,H -L75CF: LD HL,(L849C) - POP DE - RET - -L75D4: LD E,(HL) - INC HL - LD D,(HL) - POP HL - LD C,L - LD B,H - LD (HL),E - INC HL - LD (HL),D - AND 00FH - JR L75CF ; (-012H) - -L75E1: EXX - LD A,(L76F4) - OR A - JP Z,04AF2H - POP HL - LD (L849C),HL - EXX - LD DE,(TMPEND) - LD L,B - LD H,000H - ADD HL,HL - ADD HL,DE - EX DE,HL - INC DE - CALL L74E8 - LD (HL),B - INC HL - EXX - LD HL,00001H - EXX -L7603: POP DE - LD A,(L76F4) - OR A - JR NZ,L7616 ; (+00cH) - PUSH HL - EX DE,HL - LD DE,0000AH - SCF - SBC HL,DE - JP NC,04AF2H - POP HL -L7616: INC DE - LD (HL),E - INC HL - LD (HL),D - INC HL - PUSH DE - EXX - POP DE - CALL L76C8 - EXX - DJNZ L7603 ; (-021H) - DB 059H - LD D,000H - PUSH BC - PUSH DE - EXX - POP DE - CALL L76C8 - PUSH HL - EXX - POP BC - PUSH BC - EX DE,HL - LD HL,(TMPEND) - LD L,(HL) - LD H,000H - ADD HL,HL - LD A,(KEYBUF) - ADD A,005H - ADD A,L - LD L,A - LD A,000H - ADC A,H - LD H,A - JR C,L764C ; (+005H) - ADD HL,BC - JR C,L764C ; (+002H) - PUSH HL - ADD HL,DE -L764C: JP C,L4B2C - EX DE,HL - CALL L74E8 - PUSH HL - EXX - POP HL - LD BC,(STRST) - DEC BC - OR A - SBC HL,BC - PUSH HL - EXX - POP BC - LDDR - POP DE - RST 018H - DB 01AH - POP BC - PUSH DE - EXX - POP DE - LD H,B - LD L,C - POP BC - LD A,C - OR 080H - LD (HL),A - INC HL - DEC DE - LD (HL),E - INC HL - LD (HL),D - INC HL - LD DE,KEYBUF - LD A,(DE) - INC A - LD B,A - CALL LDHLDE - LD DE,(TMPEND) - LD A,(DE) - LD (HL),A - INC HL - INC DE - ADD A,A - LD B,A - CALL LDHLDE - PUSH HL - EXX - POP HL -L7690: XOR A - LD (HL),A - INC HL - DEC BC - LD A,B - OR C - JR NZ,L7690 ; (-008H) - LD (HL),A - EXX - POP DE - LD A,(L76F4) - OR A - JR Z,L76A5 ; (+004H) - LD HL,(L849C) - RET - -L76A5: LD HL,(L76F2) - PUSH DE - JP L7503 - -L76AC: LD A,0FFH - LD (L76F4),A -L76B1: CALL L7495 - LD A,(HL) - CALL L5E7B - CALL L74F4 - CALL HLFTCH - CP 02CH - RET NZ - INC HL - JR L76B1 ; (-013H) - -L76C4: ADD HL,DE - RET NC - JR L76EF ; (+027H) - -L76C8: PUSH BC - EX DE,HL - LD C,L - LD A,H - LD HL,L0000 - CALL L76D8 - LD A,C - CALL L76D8 - POP BC - RET - -L76D8: OR A - JR Z,L76E9 ; (+00eH) - LD B,008H -L76DD: ADD HL,HL - JR C,L76EF ; (+00fH) - RLCA - JR NC,L76E6 ; (+003H) - ADD HL,DE - JR C,L76EF ; (+009H) -L76E6: DJNZ L76DD ; (-00bH) - RET - -L76E9: LD A,H - LD H,L - LD L,000H - OR A - RET Z -L76EF: JP 04AFBH - -L76F2: NOP - NOP -L76F4: NOP -L76F5: SUB 041H - CP 01AH - JP NC,L4AEC - LD BC,(07928H) - LD A,B - OR C - JR NZ,L7716 ; (+012H) - CALL L7442 -L7707: PUSH DE - PUSH HL - LD L,C - LD H,B - LD B,A - LD C,A - CALL LDDEHL - POP HL - LD A,C - POP DE - JP L709D - -L7716: PUSH DE - CALL L7495 - PUSH HL - INC B - LD DE,KEYBUF - LD HL,(TMPEND) - CALL L74DC - LD B,000H - LD HL,(L7928) - CALL HLFTCH - CP QDPC - JR Z,L7760 ; (+02fH) - CP 028H - JR NZ,L775D ; (+028H) -L7735: INC HL - INC B - PUSH BC - CALL L7495 - LD A,C - POP DE - CP E - LD C,E - JR NZ,L7752 ; (+011H) - PUSH DE - LD C,B - INC C - PUSH HL - LD HL,(TMPEND) - LD DE,KEYBUF - CALL L7953 - POP HL - POP BC - JR Z,L7776 ; (+024H) -L7752: CALL HLFTCH - CP 029H - JR Z,L7760 ; (+007H) - CP 02CH - JR Z,L7735 ; (-028H) -L775D: JP L4AEC - -L7760: LD HL,(TMPEND) - LD DE,KEYBUF - LD A,(HL) - LD (DE),A - LD B,A -L7769: INC HL - INC DE - LD A,(HL) - LD (DE),A - DJNZ L7769 ; (-006H) - POP HL - POP DE - CALL L77B2 - JR L7707 ; (-06fH) - -L7776: LD HL,(L792A) - CALL L5E78 - DEC B - JR Z,L7797 ; (+018H) - DEC HL -L7780: PUSH BC -L7781: CALL L51A2 - CALL L413E - JP Z,L4AEC - CP 029H - JP Z,L4AEC - CP 02CH - JR NZ,L7781 ; (-012H) - POP BC - DJNZ L7780 ; (-016H) - INC HL -L7797: EX DE,HL - POP HL - EX (SP),HL - EX DE,HL - LD BC,(07928H) - PUSH BC - LD BC,L0000 - LD (07928H),BC - CALL L6E9C - POP HL - LD (L7928),HL - POP HL - JP HLFTCH - -L77B2: PUSH DE - JP L7446 - -L77B6: LD HL,(VARST) -L77B9: LD DE,KEYBUF - LD A,(HL) - OR A - RET Z - CP 040H - JR NC,L77EA ; (+027H) - CP C - JR NZ,L77DF ; (+019H) - INC HL - LD A,(DE) - CP (HL) - JR NZ,L77DD ; (+012H) - LD B,A -L77CC: INC DE - INC HL - LD A,(DE) - CP (HL) - JR NZ,L77D7 ; (+005H) - DJNZ L77CC ; (-008H) - INC HL - SCF - RET - -L77D7: INC HL - DJNZ L77D7 ; (-003H) - LD A,C - JR L77E4 ; (+007H) - -L77DD: LD A,C - DEC HL -L77DF: AND 00FH - INC HL - ADD A,(HL) - INC HL -L77E4: LD E,A - LD D,000H - ADD HL,DE - JR L77B9 ; (-031H) - -L77EA: CP C - JR Z,L7801 ; (+014H) - INC HL -L77EE: LD E,(HL) - INC HL - LD D,(HL) - DEC HL - ADD HL,DE - JR L77B9 ; (-03cH) - -L77F5: LD A,C - SUB B - CPL - LD C,A - LD B,0FFH - ADD HL,BC - POP BC -L77FD: DEC HL - DEC HL - JR L77EE ; (-013H) - -L7801: LD A,(HL) - EXX - LD C,A - LD B,000H - EXX - INC HL - PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - INC HL - EX DE,HL - ADD HL,DE - EX DE,HL - POP DE - LD A,(DE) - CP (HL) - JR NZ,L77FD ; (-018H) - PUSH BC - LD B,A - LD C,A -L7818: INC HL - INC DE - LD A,(DE) - CP (HL) - JR NZ,L77F5 ; (-029H) - DJNZ L7818 ; (-008H) - INC HL - POP BC - SCF - RET - -L7824: CALL L7495 - SET 6,C - PUSH HL - CALL L77B6 - JP C,04AFEH - LD (HL),C - EX (SP),HL - PUSH HL - DEC HL -L7834: CALL L51A2 - OR A - JR Z,L783E ; (+004H) - CP 03AH - JR NZ,L7834 ; (-00aH) -L783E: POP DE - PUSH HL - INC HL - SBC HL,DE - LD A,(KEYBUF) - ADD A,004H - LD C,A - LD B,000H - LD A,L - ADD HL,BC - LD B,A - PUSH HL - EXX - POP BC - PUSH BC - PUSH HL - PUSH DE - PUSH BC - LD HL,L0000 - ADD HL,SP - LD DE,(TMPEND) - DEC H - OR A - SBC HL,DE - LD A,00CH - JP C,L4B2E - POP BC - POP DE - POP HL - LD HL,(TMPEND) - PUSH HL - ADD HL,BC - EX (SP),HL - PUSH HL - LD DE,(STRST) - OR A - SBC HL,DE - LD C,L - LD B,H - POP HL - POP DE - LDDR - POP DE - RST 018H - DB 01AH - DEC DE - POP HL - EX (SP),HL - INC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - LD DE,KEYBUF - LD A,(DE) - LD (HL),A - LD B,A -L788E: INC DE - INC HL - LD A,(DE) - LD (HL),A - DJNZ L788E ; (-006H) - INC HL - PUSH HL - EXX - POP HL - CALL LDHLDE - LD (HL),000H - POP HL - RET - -L789F: PUSH DE - CALL L7495 - POP IX - PUSH BC - SET 6,C - LD DE,(0792AH) - LD (L792A),HL - PUSH DE - CALL L77B6 - JP NC,04B0AH - LD DE,(07928H) - LD (L7928),HL - PUSH DE - PUSH IX - DEC HL -L78C1: CALL L51A2 - CALL L413E - JP Z,L4AEC - CP QDPC - JR NZ,L78C1 ; (-00dH) - INC HL - POP DE - PUSH DE - CALL L6E9C - POP DE - LD HL,(L792A) - POP BC - LD (07928H),BC - POP BC - LD (0792AH),BC - EX DE,HL - POP BC - LD A,C - CALL L7912 - LD BC,00005H - ADD HL,BC - EX DE,HL - CALL HLFTCH - CP 028H - RET NZ - PUSH DE - LD B,001H -L78F6: PUSH BC - CALL L51A2 - POP BC - CALL L4141 - JP Z,L4AEC - CP 028H - JR NZ,L7906 ; (+001H) - INC B -L7906: CP 029H - JR NZ,L78F6 ; (-014H) - DJNZ L78F6 ; (-016H) - INC HL - CALL HLFTCH - POP DE - RET - -L7912: CP 003H - JR NZ,L791F ; (+009H) -L7916: LD A,(L84CE) - CP 003H - RET Z - JP 04AF5H - -L791F: LD A,(L84CE) - CP 003H - RET NZ - JP 04AF5H - -L7928: NOP - NOP -L792A: NOP - NOP -L792C: PUSH HL - CALL L60B7 - LD A,H - OR A - JP NZ,04AF2H - LD A,L - CP 008H - JP NC,04AF2H - RST 018H - DB 012H - POP HL - JR C,L794E ; (+00eH) - JR Z,L794E ; (+00cH) - LD DE,0FFFFH -L7945: CALL L5E99 - LD A,005H - LD (L84CE),A - RET - -L794E: LD E,A - LD D,000H - JR L7945 ; (-00eH) - -L7953: LD A,(DE) - CP (HL) - RET NZ - PUSH BC - PUSH DE - PUSH HL - LD B,C -L795A: LD A,(DE) - CP (HL) - JR NZ,L7963 ; (+005H) - INC DE - INC HL - DJNZ L795A ; (-008H) - XOR A -L7963: POP HL - POP DE - POP BC - RET - -L7967: PUSH HL - LD B,005H - CALL ?CLRHL - POP HL - RET - -L796F: CALL L791F -L7972: LD A,(HL) - OR A - RET Z - INC HL - LD A,(HL) - XOR 080H - LD (HL),A - DEC HL - RET - -L797C: CALL L791F - LD C,A - LD A,080H - JP L798F - -L7985: LD A,(L84CE) - CP 003H - JP Z,L79D9 - LD C,A - XOR A -L798F: LD (L7D89),HL - PUSH DE - PUSH HL - LD (07D8CH),SP - INC HL - INC DE - LD B,(HL) - XOR (HL) - EX DE,HL - XOR (HL) - DEC HL - DEC DE - EX DE,HL - RLCA - LD A,B - LD (L7D8B),A - JP C,L7A9A - XOR A - CP (HL) - JP Z,L79CE - LD A,(DE) - OR A - JR Z,L79B6 ; (+004H) - SUB (HL) - JP L7ADD - -L79B6: LD SP,(07D8CH) - POP HL - POP DE - EI - LD A,(HL) - OR A - JP Z,L7E86 - LD A,(L7D8B) - AND 080H - INC HL - RES 7,(HL) - OR (HL) - LD (HL),A - DEC HL - RET - -L79CE: LD B,000H - LD A,005H - LD C,A - EX DE,HL - LDIR - JP L79B6 - -L79D9: LD B,(HL) - LD A,(DE) - ADD A,B - JP C,04AF8H - LD C,A - PUSH DE - PUSH HL - PUSH DE - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(STRST) - ADD HL,DE - EX DE,HL - LD HL,(TMPEND) - CALL L74DC - EX (SP),HL - LD B,(HL) - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(STRST) - ADD HL,DE - EX DE,HL - POP HL - CALL L74DC - LD A,C - LD DE,(TMPEND) - LD BC,(STRST) - EX DE,HL - OR A - SBC HL,BC - EX DE,HL - LD (TMPEND),HL - POP HL - LD (HL),A - INC HL - LD (HL),E - INC HL - LD (HL),D - DEC HL - DEC HL - POP DE - RET - -L7A1C: LD A,(L84CE) - CP 003H - JR NZ,L7A57 ; (+034H) - PUSH DE - PUSH HL - LD A,(DE) - OR (HL) - JR Z,L7A54 ; (+02bH) - LD A,(DE) - CP (HL) - JR C,L7A2E ; (+001H) - LD A,(HL) -L7A2E: OR A - JR Z,L7A4E ; (+01dH) - INC HL - LD C,(HL) - INC HL - LD B,(HL) - EX DE,HL - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(STRST) - EX DE,HL - ADD HL,DE - EX DE,HL - ADD HL,BC - EX DE,HL - LD B,A - OR A - JR Z,L7A54 ; (+00eH) -L7A46: LD A,(DE) - CP (HL) - JR NZ,L7A54 ; (+00aH) - INC DE - INC HL - DJNZ L7A46 ; (-008H) -L7A4E: POP DE - POP HL - LD A,(DE) - CP (HL) - EX DE,HL - RET - -L7A54: POP HL - POP DE - RET - -L7A57: INC DE - INC HL - LD A,(DE) - DEC DE - XOR (HL) - RLCA - JR NC,L7A63 ; (+004H) - LD A,(HL) - DEC HL - RLCA - RET - -L7A63: LD A,(HL) - DEC HL - RLCA - JR NC,L7A6E ; (+006H) - CALL L7A6E - RET Z - CCF - RET - -L7A6E: PUSH DE - PUSH HL - EX DE,HL - LD A,(DE) - CP (HL) - JR NZ,L7A8F ; (+01aH) - INC DE - INC HL - LD A,(HL) - OR 080H - LD B,A - LD A,(DE) - OR 080H - CP B - JR NZ,L7A8F ; (+00eH) - LD A,(L84CE) - LD B,A - DEC B - DEC B -L7A87: INC DE - INC HL - LD A,(DE) - CP (HL) - JR NZ,L7A8F ; (+002H) - DJNZ L7A87 ; (-008H) -L7A8F: POP HL - POP DE - RET - -L7A92: POP HL - PUSH HL - CALL L7967 - JP L79B6 - -L7A9A: CALL L7A6E - JR Z,L7A92 ; (-00dH) - JR NC,L7AAA ; (+009H) - LD A,(L7D8B) - XOR 080H - LD (L7D8B),A - SCF -L7AAA: EX AF,AF' - LD A,(HL) - OR A - JP Z,L79CE - LD A,(DE) - OR A - JP Z,L79B6 - SUB (HL) - JR C,L7ABF ; (+007H) - CP 020H - JP NC,L79CE - JR L7AC6 ; (+007H) - -L7ABF: NEG - CP 020H - JP NC,L79B6 -L7AC6: EX AF,AF' - JR C,L7ACA ; (+001H) - EX DE,HL -L7ACA: EX AF,AF' - JP L7B64 - -L7ACE: LD SP,(07D8CH) - EI - POP HL - POP DE - LD A,(07D93H) - OR A - JP Z,04AEFH - RET - -L7ADD: JR NC,L7AE9 ; (+00aH) - NEG - CP 020H - JP NC,L79B6 - EX DE,HL - JR L7AEE ; (+005H) - -L7AE9: CP 020H - JP NC,L79CE -L7AEE: CALL L7B24 - LD A,H - EXX - ADC A,H - EXX - LD H,A - LD A,L - EXX - ADC A,L - EXX - LD L,A - LD A,D - EXX - ADC A,D - EXX - LD D,A - LD A,E - EXX - ADC A,E - EXX - JR NC,L7B11 ; (+00bH) - RRA - RR D - RR L - RR H - INC C - JP Z,L7ACE -L7B11: LD E,A - LD A,C - EXX - LD BC,00005H - LD HL,(L7D89) - LD (HL),A - ADD HL,BC - DI - LD SP,HL - EXX - PUSH HL - PUSH DE - JP L79B6 - -L7B24: DI - LD (07D8EH),SP - EX AF,AF' - INC HL - LD SP,HL - EXX - POP DE - SET 7,E - POP HL - OR A -L7B32: EX AF,AF' - CP 008H - JR C,L7B43 ; (+00cH) - SUB 008H - EX AF,AF' - RL H - LD H,L - LD L,D - LD D,E - LD E,000H - JR L7B32 ; (-011H) - -L7B43: OR A - JR Z,L7B54 ; (+00eH) -L7B46: EX AF,AF' - OR A - RR E - RR D - RR L - RR H - EX AF,AF' - DEC A - JR NZ,L7B46 ; (-00eH) -L7B54: EXX - EX DE,HL - LD C,(HL) - INC HL - LD SP,HL - POP DE - SET 7,E - POP HL - EX AF,AF' - LD SP,(07D8EH) - EI - RET - -L7B64: CP 020H - JP NC,L79B6 - CALL L7B24 - LD A,H - EXX - SBC A,H - EXX - LD H,A - LD A,L - EXX - SBC A,L - EXX - LD L,A - LD A,D - EXX - SBC A,D - EXX - LD D,A - LD A,E - EXX - SBC A,E - EXX -L7B7F: OR A - JR Z,L7B98 ; (+016H) -L7B82: BIT 7,A - JR NZ,L7B94 ; (+00eH) - RL H - RL L - RL D - RLA - DEC C - JP NZ,L7B82 - JP L7A92 - -L7B94: LD E,A - JP L7B11 - -L7B98: LD A,C - SUB 008H - LD C,A - LD A,D - LD D,L - LD L,H - LD H,000H - JR Z,L7BA5 ; (+002H) - JR NC,L7B7F ; (-026H) -L7BA5: JP L7A92 - -L7BA8: LD C,A - INC HL - INC DE - LD A,(DE) - XOR (HL) - LD (L7D8B),A - DEC HL - DEC DE - RET - -L7BB3: CALL L791F - CALL L7BA8 - PUSH DE - PUSH HL - LD (07D8CH),SP - LD A,(HL) - OR A - JP Z,L7A92 - LD A,(DE) - OR A - JP Z,L7A92 - INC DE - PUSH DE - POP IX - ADD A,(HL) - LD E,A - LD A,000H - ADC A,A - LD D,A - LD (07D91H),DE - INC HL - XOR A - LD (L7D90),A - LD D,(HL) - SET 7,D - INC HL - LD E,(HL) - INC HL - PUSH HL - LD H,A - LD L,A - EXX - POP HL - LD D,(HL) - INC HL - LD E,(HL) - LD B,A - LD C,A - LD H,A - LD L,A - EXX - LD A,(IX+000H) - OR 080H - LD C,004H -L7BF6: LD B,008H - OR A - JP Z,L7C8B -L7BFC: RLCA - JR NC,L7C11 ; (+012H) - EX AF,AF' - EXX - LD A,C - ADD A,B - LD C,A - ADC HL,DE - EXX - ADC HL,DE - JR NC,L7C10 ; (+005H) - LD A,001H - LD (L7D90),A -L7C10: EX AF,AF' -L7C11: SRL D - RR E - EXX - RR D - RR E - RR B - EXX - DJNZ L7BFC ; (-023H) -L7C1F: INC IX - LD A,(IX+000H) - DEC C - JR NZ,L7BF6 ; (-031H) - EXX - LD A,(L7D90) - OR A - JR Z,L7C44 ; (+016H) - LD DE,(07D91H) - INC DE - LD (07D91H),DE - EXX - SCF - RR H - RR L - EXX - RR H - RR L - RR C -L7C44: BIT 7,C - JR Z,L7C62 ; (+01aH) - LD DE,00001H - ADD HL,DE - EXX - LD DE,L0000 - ADC HL,DE - EXX - JR NC,L7C62 ; (+00dH) - LD DE,(07D91H) - INC DE - LD (07D91H),DE - EXX - LD H,080H - EXX -L7C62: POP IX - PUSH IX - LD (IX+004H),L - LD (IX+003H),H - EXX - LD (IX+002H),L - LD (IX+001H),H - LD HL,(07D91H) - OR A - LD DE,L0081 - SBC HL,DE - LD A,H - ADD A,000H - JP M,L7C97 - JP NZ,L7ACE - LD (IX+000H),L - JP L79B6 - -L7C8B: LD A,E - EXX - LD B,E - LD E,D - LD D,A - EXX - LD E,D - LD D,000H - JP L7C1F - -L7C97: LD SP,(07D8CH) - JP L7A92 - -L7C9E: CALL L791F - CALL L7BA8 - PUSH DE - PUSH HL - LD (07D8CH),SP - LD A,(DE) - OR A - JP Z,04AEFH - EX AF,AF' - LD A,(HL) - OR A - JP Z,L7A92 - EXX - ADD A,081H - LD B,A - LD A,000H - ADC A,A - EX AF,AF' - LD C,A - LD A,B - SUB C - LD C,A - EX AF,AF' - LD B,A - EX AF,AF' - LD A,B - SBC A,000H - JP C,L7C97 - JP NZ,L7ACE - LD A,C - PUSH AF - EXX - INC DE - INC HL - LD B,(HL) - SET 7,B - INC HL - LD C,(HL) - INC HL - PUSH HL - EX DE,HL - LD D,(HL) - SET 7,D - INC HL - LD E,(HL) - INC HL - PUSH HL - LD H,B - LD L,C - EXX - POP HL - LD D,(HL) - INC HL - LD E,(HL) - POP HL - LD A,(HL) - INC HL - LD L,(HL) - LD H,A - EXX - LD C,005H -L7CF0: LD B,008H - XOR A -L7CF3: BIT 7,H - JR NZ,L7D07 ; (+010H) - OR A -L7CF8: RLA - EXX - ADD HL,HL - EXX - ADC HL,HL - DJNZ L7CF3 ; (-00dH) - PUSH AF - DEC C - JR NZ,L7CF0 ; (-014H) - JP L7D41 - -L7D07: OR A - EXX - SBC HL,DE - EXX - SBC HL,DE - CCF - JR C,L7CF8 ; (-019H) - EXX - ADD HL,DE - EXX - ADC HL,DE - OR A - RLA - EXX - ADD HL,HL - EXX - ADC HL,HL - DJNZ L7D26 ; (+007H) - PUSH AF - LD B,008H - DEC C - JP Z,L7D41 -L7D26: EXX - OR A - SBC HL,DE - EXX - SBC HL,DE - SCF - RLA - DJNZ L7D37 ; (+006H) - PUSH AF - LD B,008H - DEC C - JR Z,L7D41 ; (+00aH) -L7D37: EXX - ADD HL,HL - EXX - ADC HL,HL - JR C,L7D26 ; (-018H) - JP L7CF3 - -L7D41: POP AF - LD H,A - EXX - POP AF - LD E,A - POP AF - LD D,A - POP AF - LD C,A - POP AF - LD B,A - POP AF -L7D4D: BIT 7,B - JR NZ,L7D64 ; (+013H) - EXX - SLA H - EXX - RL E - RL D - RL C - RL B - DEC A - JP NZ,L7D4D - JP L7A92 - -L7D64: EXX - RL H - EXX - JR NC,L7D7B ; (+011H) - LD HL,00001H - ADD HL,DE - EX DE,HL - LD HL,L0000 - ADC HL,BC - LD B,H - LD C,L - JR NC,L7D7B ; (+003H) - LD B,080H - INC A -L7D7B: POP HL - PUSH HL - LD (HL),A - INC HL - LD (HL),B -L7D80: INC HL - LD (HL),C - INC HL - LD (HL),D - INC HL - LD (HL),E - JP L79B6 - -L7D89: NOP - NOP -L7D8B: NOP - NOP - NOP - NOP - NOP -L7D90: NOP - NOP - NOP - NOP -L7D94: INC HL - BIT 7,(HL) - DEC HL - RET - -L7D99: INC (HL) - RET NZ - JP 04AEFH - -L7D9E: LD A,(HL) - OR A - RET Z - DEC (HL) - RET NZ - JP L7967 - -L7DA6: PUSH HL - INC HL - INC HL - INC HL - INC HL - INC HL - EX DE,HL - LD HL,(MEMMAX) - DEC HL - SBC HL,DE - JP C,04AFBH - POP HL - RET - -L7DB8: PUSH HL - LD (L8471),HL - CALL L7DA6 - EX DE,HL - LD (L8473),HL - CALL L7DA6 - EX DE,HL - LD (L8475),HL - CALL L7DA6 - LD (08477H),DE - POP HL - RET - -L7DD3: CALL L791F - EX DE,HL - LD A,(HL) - OR A - JP Z,L7E35 - EX DE,HL - LD A,(HL) - OR A - JP Z,L7967 - CALL L7D94 - JR Z,L7E0F ; (+028H) - CALL L7972 - EX DE,HL - PUSH DE - PUSH HL - LD DE,L84D7 - CALL L5E93 - LD HL,L84D7 - CALL L608D - LD A,(HL) - OR A - JP NZ,04AF2H - POP HL - PUSH HL - CALL L60B7 - BIT 0,L - POP DE - POP HL - JR Z,L7E0F ; (+006H) - CALL L7E0F - JP L7972 - -L7E0F: EX DE,HL - LD A,(HL) - OR A - JR Z,L7E35 ; (+021H) - CALL L7D94 - JR Z,L7E3B ; (+022H) - CALL L7972 - CALL L7E3B - PUSH DE - PUSH HL - LD DE,L84D7 - CALL L5E90 - LD HL,L84D7 - POP DE - CALL L7C9E - PUSH DE - CALL L5E93 - POP HL - POP DE - RET - -L7E35: PUSH DE - CALL L5E90 - POP HL - RET - -L7E3B: PUSH DE - LD DE,L84D7 - CALL L5E93 - POP HL - CALL L8320 - LD DE,L84D7 - CALL L7BB3 - JP L81FC - -L7E4F: CALL L791F - PUSH DE - PUSH HL - CALL L60B7 - LD A,L - CPL - LD E,A - LD A,H - CPL - LD D,A - JR L7E80 ; (+021H) - -L7E5F: LD A,0A2H - LD BC,0B23EH - LD BC,0AA3EH - LD (L7E7B),A - INC A - LD (L7E7E),A - CALL L791F - PUSH DE - PUSH HL - CALL L60B7 - EX DE,HL - CALL L60B7 - LD A,H -L7E7B: AND D - LD D,A - LD A,L -L7E7E: AND E - LD E,A -L7E80: POP HL - CALL L5E99 - POP DE - RET - -L7E86: INC HL - RES 7,(HL) - DEC HL - RET - -L7E8B: CALL L7D94 - JP Z,L604F - CALL L7EB0 - CALL L604F - LD DE,L84D7 - CALL L7A1C - RET Z -L7E9E: LD DE,L6112 - JP L797C - -L7EA4: LD DE,L6112 - JP L7985 - -L7EAA: LD DE,L6112 - JP L7A1C - -L7EB0: PUSH HL - PUSH DE - LD DE,L84D7 - CALL L5E93 - POP DE - POP HL - RET - -L7EBB: CALL L604F - EX DE,HL - CALL L604F - EX DE,HL - CALL L7EB0 - CALL L7C9E - CALL L604F - CALL L7BB3 - PUSH DE - LD DE,L84D7 - CALL L797C - POP DE - JP L7972 - -L7EDA: CALL L604F - EX DE,HL - CALL L604F - EX DE,HL - CALL L7C9E - JP L604F - -L7EE8: LD A,(HL) - OR A - RET Z - CALL L7D94 - JP NZ,04AF2H - CALL L8320 - CALL L7D9E - JP L81FC - -L7EFA: PUSH HL - EX DE,HL - CALL L5E90 - POP HL - POP BC - RET - -L7F02: LD A,(HL) - LD C,H -L7F04: ADD A,B - DEC HL -L7F06: PUSH BC - INC HL - LD A,(HL) - RES 7,(HL) - DEC HL - PUSH AF - CALL L7F17 - POP AF - POP BC - RLCA - RET NC - JP L7972 - -L7F17: CALL L7EAA - JR C,L7F3A ; (+01eH) - CALL L7DA6 - PUSH DE - PUSH HL - CALL L5E93 - POP DE - PUSH DE - CALL L5E90 - POP HL - POP DE - CALL L7C9E - CALL L7F3A - LD DE,08194H - CALL L797C - JP L7E86 - -L7F3A: LD A,0FFH - LD (L80B0),A - LD DE,L7F02 - CALL L7A1C - JR C,07F96H ; (+04fH) - LD DE,L7F04 - CALL L7A1C - PUSH AF - CALL L7DA6 - POP AF - PUSH HL - PUSH DE - CALL L5E93 - POP HL - JR C,L7F6E ; (+014H) - CALL L7EA4 - EX (SP),HL - CALL L797C - POP DE - CALL L7C9E - CALL 07F96H - LD DE,08199H - JP L7985 - -L7F6E: LD DE,L7F91 - CALL L7BB3 - CALL L7EA4 - EX (SP),HL - LD DE,L7F91 - CALL L797C - POP DE - CALL L7C9E - CALL 07F96H - CALL L7D99 - LD DE,08199H - CALL L7985 - JP L7D9E - -L7F91: LD A,A - LD D,H - INC DE - CALL Z,0C5D0H - PUSH HL - CALL L7DB8 - POP HL - PUSH HL - PUSH DE - CALL L5E93 - POP HL - LD E,L - LD D,H - CALL L7BB3 - LD DE,(08475H) - POP HL - PUSH HL - CALL L5E93 - LD A,(L84CE) - DEC A - CP 004H - LD B,A - LD HL,08137H - JP Z,L803D - LD B,00AH - JP L803D - -L7FC2: PUSH BC - LD A,(HL) - OR A - JP Z,L7EFA - LD DE,08194H - CALL L797C - CALL L7972 - POP BC -L7FD2: PUSH BC - INC HL - LD A,(HL) - RES 7,(HL) - AND 080H - CPL - LD (L80B0),A - DEC HL - LD DE,L818A - PUSH HL - CALL L7A1C - JR C,L7FF0 ; (+009H) - CALL L7C9E - CALL L608D - CALL L7BB3 -L7FF0: LD DE,0818FH - CALL L7A1C - JR C,L8003 ; (+00bH) - CALL L797C - LD A,(L80B0) - XOR 080H - LD (L80B0),A -L8003: LD DE,08194H - CALL L7A1C - JR C,L8014 ; (+009H) - LD DE,0818FH - CALL L797C - CALL L7E86 -L8014: CALL L7DB8 - POP HL - PUSH DE - LD DE,08199H - CALL L7A1C - JR NC,L8086 ; (+065H) - POP DE - PUSH HL - PUSH DE - CALL L5E93 - POP HL - LD E,L - LD D,H - CALL L7BB3 - LD DE,(08475H) - POP HL - PUSH HL - CALL L5E93 - LD A,(L84CE) - LD B,A - LD HL,L80E7 -L803D: PUSH BC -L803E: PUSH HL - LD HL,(L8475) - LD DE,(08477H) - CALL L7BB3 - POP HL - PUSH HL - LD DE,(08473H) - PUSH DE - CALL L5E93 - POP HL - LD DE,(08475H) - CALL L7BB3 - EX DE,HL - LD HL,(L8471) - CALL L7985 - POP HL - LD DE,00005H - ADD HL,DE - POP BC - DJNZ L803D ; (-02dH) - POP HL - POP BC - LD A,(L80B0) - INC HL - XOR (HL) - CPL - LD (HL),A - DEC HL - LD A,(L84CE) - CP 008H - LD A,(HL) - JR Z,L8082 ; (+006H) - CP 05CH -L807E: RET NC - JP L7967 - -L8082: CP 04DH - JR L807E ; (-008H) - -L8086: LD DE,08194H - CALL L797C - CALL L7E86 - POP DE - PUSH HL - PUSH DE - CALL L5E93 -L8095: POP HL - LD E,L - LD D,H - CALL L7BB3 - LD DE,(08475H) - CALL L5E90 -L80A2: POP DE - PUSH DE - CALL L5E90 - LD A,(L84CE) - LD B,A - LD HL,L810F - JR L803D ; (-073H) - -L80B0: NOP -L80B1: PUSH BC - PUSH HL - CALL L7DA6 - EX DE,HL - LD (L8479),HL - CALL L7DA6 - LD (0847BH),DE - POP HL - PUSH HL - CALL L5E93 - LD HL,(L8479) - EX DE,HL - POP HL -L80CB: PUSH HL - CALL L5E93 - LD HL,(0847BH) - CALL L7FD2 - POP DE - PUSH DE - CALL L5E93 - LD HL,(L8479) - CALL L7FC2 - EX DE,HL - POP HL - CALL L7C9E - POP BC - RET - -L80E7: LD A,(HL) -L80E8: XOR D - XOR D - XOR D - XOR E - LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C - LD (HL),H - RET NC - DEC C - NOP - RET NC -L80F6: LD L,(HL) - JR C,L80E8 ; (-011H) - DEC E - DEC HL - LD H,A - RST 010H - LD (L402B),A - LD H,B - JR NC,L8095 ; (-06eH) - JR NC,L80A2 ; (-063H) - LD E,B - RST 010H - CCF - SBC A,A - LD A,(04A50H) - SUB (HL) - DEC SP - ADD A,D -L810F: ADD A,B - ADD A,B - NOP - NOP - NOP - LD A,H - LD HL,(0AAAAH) - XOR E - LD (HL),A - OR (HL) - DEC BC - LD H,B - OR (HL) - LD (HL),C - LD D,B - DEC C - NOP - RET NC - LD L,E - SUB E - JP P,0BC7DH - LD H,H - RRCA - HALT - RST 000H -L812C: ADD A,B - LD E,H - RET - -L812F: RES 4,L - LD B,(HL) - LD D,H - LD D,A - CCF - SBC A,A - LD A,(0AA7FH) - XOR D - XOR D - XOR E - LD A,(HL) - LD C,H - CALL Z,0CDCCH - LD A,(HL) - SUB D - LD C,C - INC H - SUB D - LD A,L - LD H,E - ADC A,(HL) - JR C,L812F ; (-01cH) - LD A,L - CP D - LD L,08BH - AND E - LD A,L - DEC E - ADC A,C - RET C - SBC A,(HL) - LD A,L - ADC A,B - ADC A,B - ADC A,B - ADC A,C - LD A,H - LD (HL),B - RET P - RET P - POP AF - LD A,H - RST 010H - SUB H - DEC (HL) - PUSH HL - LD A,H - LD B,E - INC C - JR NC,L812C ; (-03dH) -L8169: LD DE,L0000 - LD A,(HL) - OR A - JR Z,L8178 ; (+008H) - CALL L7D94 - INC DE - JR Z,L8178 ; (+002H) - DEC DE - DEC DE -L8178: CALL L5E99 - RET - -L817C: LD DE,0819EH - JR L8184 ; (+003H) - -L8181: LD DE,0818FH -L8184: PUSH BC - CALL L7BB3 - POP BC - RET - -L818A: ADD A,E - LD C,C - RRCA - JP C,L82A2 - LD C,C - RRCA - JP C,L81A2 - LD C,C - RRCA - JP C,L80A2 - LD C,C - RRCA - JP C,07BA2H - LD C,FDPC - DEC (HL) -L81A2: INC DE -L81A3: PUSH HL - CALL L60B7 - LD A,000H - CP 040H - LD A,(HL) - CALL NZ,BREAKX - LD E,A - LD D,000H - POP HL - CALL L5E99 - RET - -L81B7: LD A,(HL) - OR A - JR Z,L81C0 ; (+005H) - CALL L7D94 - JR Z,L81CB ; (+00bH) -L81C0: PUSH HL - LD HL,L4193 - LD (L81FA),HL - POP HL - XOR A - LD R,A -L81CB: PUSH BC - LD DE,(081FAH) - LD A,R - XOR D - RRC A - RRC A - RRC A - LD D,A - LD A,R - XOR E - RLC A - RLC A - LD E,D - LD D,A - LD (081FAH),DE - PUSH HL - INC HL - RES 7,D - LD (HL),D - INC HL - LD (HL),E - INC HL - LD A,R - LD (HL),A - POP HL - LD (HL),081H - CALL L7E9E - POP BC - RET - -L81FA: SUB E - LD B,C -L81FC: PUSH BC - LD A,(HL) - OR A - JP Z,L7EFA - INC HL - LD A,(HL) - LD (L8312),A - RES 7,(HL) - DEC HL - LD DE,L8467 - CALL L7BB3 - PUSH HL - CALL L7DA6 - PUSH DE - CALL L5E93 - POP HL - CALL L604F - PUSH HL - CALL L60B7 - XOR A - CP H - JP NZ,04AEFH - LD A,L - LD (L8311),A - POP DE - POP HL - PUSH HL - CALL L797C - PUSH DE - PUSH HL - CALL L5E90 - POP DE - POP HL - CALL L7D9E - EX DE,HL - XOR A - LD B,008H -L823D: PUSH BC - PUSH AF - CALL L7A1C - JR C,L824B ; (+007H) - CALL L797C - POP AF - SET 7,A - PUSH AF -L824B: POP AF - RLC A - EX DE,HL - PUSH AF - CALL L7D9E - POP AF - EX DE,HL - POP BC - DJNZ L823D ; (-01bH) - LD (L8313),A - PUSH DE - LD DE,L845D - LD A,(L84CE) - BIT 3,A - JR NZ,L8269 ; (+003H) - LD DE,L8462 -L8269: CALL L7BB3 - POP DE - PUSH DE - CALL L5E93 - POP HL - LD A,(L84CE) - BIT 3,A - JP Z,L8301 - CALL L7D99 - LD DE,L610D - CALL L7985 - CALL L7D9E - POP DE - PUSH DE - CALL L7BB3 - LD DE,L610D - CALL L7D9E - CALL L7985 - CALL L7D99 - POP DE - PUSH DE - CALL L7BB3 - LD DE,L8458 - CALL L7BB3 -L82A2: CALL L7D99 - CALL L7EA4 - CALL L7D9E - POP DE - PUSH DE - CALL L7BB3 - CALL L7EA4 - POP DE - PUSH DE - CALL L7BB3 -L82B8: CALL L7EA4 - EX (SP),HL - EX DE,HL - PUSH DE - CALL L5E90 - POP HL - LD DE,L8408 - LD A,(L8313) - LD B,008H -L82CA: RLC A - JR NC,L82D5 ; (+007H) - PUSH AF - PUSH BC - CALL L7BB3 - POP BC - POP AF -L82D5: INC DE - INC DE - INC DE - INC DE - INC DE - DJNZ L82CA ; (-012H) - LD A,(L8311) - ADD A,(HL) - JP C,04AEFH - LD (HL),A - POP DE - CALL L7BB3 - POP BC - LD A,(L8312) - RLC A - RET NC - PUSH BC - PUSH DE - PUSH HL - CALL L5E93 - POP DE - PUSH DE - CALL L5E90 - POP HL - POP DE - CALL L7C9E - POP BC - RET - -L8301: POP DE - PUSH DE - CALL L7BB3 - LD A,(HL) - OR A - CALL NZ,L7D9E - CALL L7985 - JP L82B8 - -L8311: NOP -L8312: NOP -L8313: NOP -L8314: PUSH BC - CALL L8320 - LD DE,L83F9 - CALL L7BB3 - POP BC - RET - -L8320: PUSH BC - CALL L7D94 - JP NZ,04AF2H - LD A,(HL) - OR A - JP Z,04AF2H - SUB 081H - LD (L83F8),A - LD (HL),081H - XOR A - LD B,008H - LD DE,L8408 -L8339: PUSH BC - PUSH AF - CALL L7A1C - JR C,L834F ; (+00fH) - PUSH HL - LD HL,00028H - ADD HL,DE - EX DE,HL - EX (SP),HL - CALL L7BB3 - POP DE - POP AF - SET 7,A - PUSH AF -L834F: POP AF - RLC A - INC DE - INC DE - INC DE - INC DE - INC DE - POP BC - DJNZ L8339 ; (-021H) - DB 022H - LD (HL),C - ADD A,H - CALL L7DA6 - EX DE,HL - LD E,A - LD D,000H - CALL L5E99 - LD A,(HL) - OR A - JR Z,L836E ; (+003H) - SUB 008H - LD (HL),A -L836E: LD A,(L83F8) - CP 080H - JR C,L8377 ; (+002H) - NEG -L8377: PUSH HL - CALL L7DA6 - EX DE,HL - LD (L8473),HL - LD E,A - LD D,000H - CALL L5E99 - LD A,(L83F8) - AND 080H - INC HL - OR (HL) - LD (HL),A - DEC HL - EX DE,HL - POP HL - CALL L7985 - LD A,(L84CE) - LD DE,0846CH - CP 005H - JR Z,L83A0 ; (+003H) - LD DE,L845D -L83A0: CALL L7BB3 - PUSH HL - LD DE,(08473H) - LD HL,(L8471) - PUSH HL - PUSH DE - CALL L5E93 - POP HL - CALL L7EA4 - EX (SP),HL - CALL L797C - POP DE - CALL L7C9E - PUSH DE - CALL L5E93 - POP HL - PUSH DE - LD E,L - LD D,H - CALL L7BB3 - POP DE - PUSH HL - PUSH DE - CALL L5E93 - POP HL - LD DE,L8403 - CALL L7985 - EX DE,HL - POP HL - CALL L7BB3 - LD DE,L610D - CALL L7D99 - CALL L7985 - CALL L7D9E - EX DE,HL - LD HL,(L8471) - CALL L7BB3 - LD DE,L83FE - CALL L7BB3 - POP DE - CALL L7985 - POP BC - RET - -L83F8: NOP -L83F9: LD A,A - LD E,(HL) - LD E,E - RET C - XOR C -L83FE: LD A,A - LD C,H - CALL Z,0CDCCH -L8403: ADD A,C - LD D,L - LD D,L - LD D,L - LD D,(HL) -L8408: ADD A,C - DEC (HL) - INC B - DI - INC (HL) - ADD A,C - JR L8447 ; (+037H) - - RET P - LD D,D - ADD A,C - DEC BC -L8414: SUB L - POP BC - CALL PO,00581H - XOR D - JP 08168H - - LD (BC),A - CALL 09986H - ADD A,C - LD BC,0D164H - CALL P,L0081 - OR C - IN D,(C) - ADD A,C - NOP - LD E,B - RST 010H - OUT (080H),A - DEC (HL) - INC B - DI - INC (HL) - ADD A,B - LD D,A - LD B,H - CALL M,L80CB - LD L,D - RET NZ - ADD A,0E8H - ADD A,B - LD (HL),L - DEC H - LD A,L - LD D,080H - LD A,D - ADD A,E -L8447: OR D - CALL C,L7D80 - LD A,00CH - DEC C - ADD A,B - LD A,(HL) - SBC A,(HL) - LD DE,0805DH - LD A,A - LD C,(HL) - BIT 3,D -L8458: LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C -L845D: ADD A,B - LD SP,L1772 - RET M -L8462: ADD A,B - LD SP,L1772 - RET M -L8467: ADD A,C - JR C,L8414 ; (-056H) - DEC SP - LD HL,(03180H) - LD (HL),D - RLA - RET M -L8471: DS 2, 000H -L8473: DS 2, 000H -L8475: DS 4, 000H -L8479: DS 4, 000H -L847D: DS 2, 000H -L847F: DS 2, 000H -L8481: DS 2, 000H -L8483: DS 2, 000H -L8485: DB 000H -L8486: DB 000H -L8487: DS 2, 000H -L8489: DS 2, 000H -L848B: DS 4, 000H -L848F: DB 000H -L8490: DS 2, 000H - DB 015H - DB 000H - DB 0EBH - DB 0FFH - DS 2, 000H -L8498: DS 2, 000H -L849A: DS 2, 000H -L849C: DS 7, 000H -L84A3: DB 000H -L84A4: DS 3, 000H -L84A7: DB 000H -L84A8: DS 4, 000H -L84AC: DB 000H -L84AD: DS 8, 000H -L84B5: DS 25, 000H -L84CE: DB 008H ; Splash screen / banner text -L84CF: DS 8, 000H -L84D7: DS 8, 000H -L84DF: DS 8, 000H -L84E7: DB 016H - DB 00DH - DB 020H - DS 38, 0D7H - DS 4, 020H - DB "BASIC ",005H,"INTERPRETER" - DS 2, 020H - DB 006H,"MZ-5Z" - DS 2, 030H - DB "8 V1.1Z ",00DH - DS 3, 020H - DB 043H,005H,"OPYRIGHT ",006H,"(C) 1984 ",005H,"BY ",006H,"SHARP CORP." - DS 5, 020H - DS 38, 0CFH - DB 020H,00DH,020H,005H,"30134 BYTES FR" - DS 2, 045H - DS 2, 00DH - DS 93, 000H - -; ============================================================================= -; $RFS - ROM Filing System device module (Direct SD Card Access) -; -; V1.0Z: Bypasses the RFS ROM entirely. All SD card access is done via -; direct SPI through the picoZ80 hardware SPI emulation at EFFBh/EFFCh. -; -; Only OUT(E3H) is needed to map MMIO for SPI port access, and OUT(E1H) -; to return to DRAM. No ROM banking, no BNKSELUSER, no lower memory -; switching required. -; -; SPI protocol: -; SPIOUT: LD (HWSPIDATA),A ; LD (HWSPISTART),A (send byte) -; SPIIN: LD (HWSPISTART),A ; LD A,(HWSPIDATA) (receive byte) -; -; SD card sector read (CMD17): -; CS LOW -> CMD17(0x51) + 4-byte sector + 0xFF -> poll R1(0x00) -> -; poll data token(0xFE) -> read 512 bytes -> 2 CRC -> CS HIGH -; -; SD image layout: each drive = 0x8010 sectors (directory + file blocks). -; Drive 0 at sector 0, drive 1 at 0x8010, drive 2 at 0x10020, etc. -; RFS1: = SD drive 3, RFS7: = SD drive 9 (SDDRIVENO = ZCH + 3, offset +3 skips boot drives 0-2). -; -; Directory: 16 entries per sector, 32 bytes each: -; [0] FLAG1 (bit7=active), [1] ATRB, [2..18] NAME (17, null-term), -; [19..22] START_SECTOR (4 bytes, big-endian), -; [23..24] SIZE (2 bytes, LE), [25..26] DTADR (2 bytes, LE), -; [27..28] EXADR (2 bytes, LE), [29..31] reserved. -; -; Device chain: $QD -> $RFS -> $USR -> NULL -; ============================================================================= - -; --------------------------------------------------------------------------- -; $RFS Device Descriptor (29 bytes header + 22 bytes state = 51 bytes) -; --------------------------------------------------------------------------- -$RFS: DW $USR ; Next device = $USR - DB "RFS",000H ; Device name - DB 05FH ; flags1: bit5=1 ZINP-based DIR, bit6=1 ZRO enum capable - DB 007H ; flags2: max channel 7 (bit7 must be 0, SVC #39 errors if set) - DB 0FFH ; dirmx: 255 (max directory entries) - DW RFSINIT ; ZINIT handler - DW RFSRO ; ZRO handler (LOAD: find file, extract header) - DW RFSWO ; ZWO handler (SAVE: sets ELMD20 SIZE) - DW RFSSTRT ; ZCL/ZSTRT handler - DW 00000H ; ZKL (not used) - DW RFSINP_DIR ; ZINP handler (DIR buffer fill + LOAD data) - DW RFSOUT ; ZOUT handler (triggers RFSWO on first call during SAVE) - DW 00000H ; ZDELT (not used) - DW RFSDIR ; ZWDIR handler (stub) - DW RFSFREE ; ZFREE handler -; Device state area (22 bytes) - BASIC reads/writes state at descriptor+29..+50. -; Without this, BASIC reads into code bytes causing "Disk mismatch" errors. -RFSST00: DB 000H ; +29: state byte 0 -RFSST01: DB 000H ; +30: state byte 1 -RFSST02: DB 000H ; +31: state byte 2 -RFSST03: DS 3, 000H ; +32..+34: state bytes 3-5 -RFSST06: DB 000H ; +35: state byte 6 -RFSST07: DS 2, 000H ; +36..+37: state bytes 7-8 -RFSST09: DB 000H ; +38: state byte 9 -RFSST10: DB 000H ; +39: state byte 10 -RFSST11: DB 000H ; +40: state byte 11 -RFSST12: DB 000H ; +41: state byte 12 -RFSST13: DS 4, 000H ; +42..+45: state bytes 13-16 -RFSST17: DS 4, 000H ; +46..+49: state bytes 17-20 -RFSST21: DB 000H ; +50: state byte 21 - -; --------------------------------------------------------------------------- -; RFSFREE - Free space query (not supported, return carry) -; --------------------------------------------------------------------------- -RFSFREE: XOR A - SCF - RET - -; --------------------------------------------------------------------------- -; RFSINIT - Initialize RFS device -; --------------------------------------------------------------------------- -RFSINIT: XOR A - LD (SAVE_PENDING),A ; Clear at start of any operation - LD (DIR_FILLED),A ; Clear so next ZINP does DIR fill - LD (DIR_ENTRY_IDX),A ; Reset directory entry enumerator - LD A,0FFH - LD (DIRSECBUF),A ; Invalidate sector cache - LD A,(ZCH) - ADD A,003H ; RFS1:=drive 3, skipping boot drives 0-2 - LD (SDDRIVENO),A - RET - -; --------------------------------------------------------------------------- -; RFSSTRT - Start/Open device (A=0 means open, A!=0 means close) -; --------------------------------------------------------------------------- -RFSSTRT: OR A - RET NZ ; Close = just return - LD A,(ZCH) - ADD A,003H ; RFS1:=drive 3, skipping boot drives 0-2 - LD (SDDRIVENO),A - ; - ; V1.1Y: Reset RFSRO state so file search starts from entry 0. - ; Without this, LOAD after DIR/SAVE fails: RFSRO resumes from - ; the post-DIR DIR_ENTRY_IDX position and misses files at earlier - ; directory indices ("File not found" for files that exist). - XOR A - LD (DIR_ENTRY_IDX),A - LD A,0FFH - LD (DIRSECBUF),A ; Invalidate sector cache (stale after SAVE) - RET - -; --------------------------------------------------------------------------- -; RFSDIR - ZWDIR handler (stub, not called with bit5=1 in flags1) -; --------------------------------------------------------------------------- -RFSDIR: XOR A - RET - -; --------------------------------------------------------------------------- -; RFSWO - Write Open (ZWO handler) -; -; BASIC calls ZWO from BOTH the OPEN handler and L1CE4 SAVE path, THEN -; calls ZOUT. If we do the actual write here, the file gets created -; multiple times and the premature directory entry triggers "Already exist" -; during BASIC's own duplicate check. -; -; RFSWO calculates SIZE = TEXTED - TEXTST and stores it in ELMD20. -; This is essential because the SAVE path for bit-5 devices never populates -; ELMD20, leaving RFSDOWRITE to read SIZE=0. The actual SD write is still -; deferred to RFSOUT (ZOUT) via the SAVE_PENDING one-shot flag. -; --------------------------------------------------------------------------- -RFSWO: LD HL,(TEXTED) ; End of BASIC text area - LD DE,(TEXTST) ; Start of BASIC text area - OR A - SBC HL,DE ; HL = program size in bytes - LD (ELMD20),HL ; Store SIZE for RFSDOWRITE - XOR A ; A=0, NC = success - RET - -; --------------------------------------------------------------------------- -; RFSDOWRITE - Actual SD card write (called from RFSOUT only) -; -; Performs the complete save operation: -; 1. Finds a free directory entry -; 2. Calculates the file's start sector from entry number -; 3. Writes file data sector-by-sector (toggling DRAM/MMIO) -; 4. Re-reads directory sector, fills entry, writes it back -; -; Entry: ELMD filled with file header (ATRB, NAME, SIZE, DTADR, EXADR) -; For type 2 (BASIC): ELMD20=SIZE, source data at TEXTST -; For type 1 (machine code): ELMD20=DTADR, ELMD18=SIZE -; Exit: NC = success, C = error -; --------------------------------------------------------------------------- -RFSDOWRITE: PUSH HL - PUSH DE - PUSH BC - ; - ; Get file info from ELMD — field mapping depends on file type. - ; BASIC SAVE (type 2) stores SIZE in ELMD20 and source is TEXTST. - ; Machine code SAVE (type 1) uses ELMD18=SIZE, ELMD20=DTADR. - LD A,(ELMD) - CP 002H - JR NZ,WO_NONBASIC - ; - ; Type 2 (BASIC): SIZE in ELMD20, source at TEXTST - LD HL,(ELMD20) ; SIZE (program length) - LD (FILE_SIZE),HL - LD HL,(TEXTST) ; Source = start of BASIC text - LD (FILE_LOADADDR),HL - JR WO_GOTINFO - ; -WO_NONBASIC: - ; Non-BASIC: SIZE in ELMD18, source at ELMD20 - LD HL,(ELMD18) ; SIZE - LD (FILE_SIZE),HL - LD HL,(ELMD20) ; DTADR (source address for data) - LD (FILE_LOADADDR),HL -WO_GOTINFO: - ; - ; Set up drive number - LD A,(ZCH) - ADD A,003H ; RFS1:=drive 3 - LD (SDDRIVENO),A - ; - ; Enter MMIO mode - CALL MMIO_ON - ; - ; Reset directory cache - LD A,0FFH - LD (DIRSECBUF),A - ; - ; --- Find free directory entry --- - LD E,000H - LD B,000H ; 256 entries (DJNZ wraps) -WO_SCAN: PUSH BC - PUSH DE - CALL GETSDDIRENT - POP DE - POP BC - OR A - JP NZ,WO_IOERR ; SD read error - LD A,(HL) - BIT 7,A - JR Z,WO_FOUND ; Bit 7 clear = free slot - INC E - DJNZ WO_SCAN - JP WO_IOERR ; Directory full - ; -WO_FOUND: ; E = free entry number - LD A,E - LD (SAVE_DIRENT),A - ; - ; --- Calculate start sector: E * 128 + 16 --- - ; E * 128 = E << 7, result fits 16 bits (max 255*128=32640) - LD H,000H - LD L,E ; HL = entry number - ADD HL,HL ; *2 - ADD HL,HL ; *4 - ADD HL,HL ; *8 - ADD HL,HL ; *16 - ADD HL,HL ; *32 - ADD HL,HL ; *64 - ADD HL,HL ; *128 - LD DE,00010H ; +16 (directory sectors) - ADD HL,DE - LD D,000H - LD E,000H ; DEHL = relative sector - CALL RFSGETSECTR ; DEHL = absolute sector - CALL SETLBAADDR ; Store in SDSTARTSEC - ; - ; --- Write file data sector-by-sector --- -WO_WLOOP: LD HL,(FILE_SIZE) - LD A,H - OR L - JR Z,WO_WDONE ; No data left - ; - ; Map DRAM to read source data - OUT (PORT_DRAM),A - ; - ; Calculate bytes to copy: min(FILE_SIZE, 512) - LD HL,(FILE_SIZE) - LD DE,00200H ; 512 - OR A - SBC HL,DE - JR C,WO_PARTIAL - ; - ; Full sector: remaining = HL - LD (FILE_SIZE),HL - LD BC,00200H - JR WO_COPY - ; -WO_PARTIAL: ; Less than 512 bytes left - ADD HL,DE ; Restore HL = FILE_SIZE - LD B,H - LD C,L ; BC = bytes to copy - PUSH BC ; Save actual byte count - LD HL,0 - LD (FILE_SIZE),HL - ; - ; Zero-fill SECTORBUF first for partial sector - LD HL,SECTORBUF - LD DE,SECTORBUF + 1 - PUSH BC - LD BC,001FFH ; 511 bytes - LD (HL),000H - LDIR - POP BC - POP BC ; Restore actual byte count - ; -WO_COPY: LD HL,(FILE_LOADADDR) - LD DE,SECTORBUF - LDIR ; Copy source data to SECTORBUF - LD (FILE_LOADADDR),HL ; Update source address - ; - ; Map MMIO for SPI write - OUT (PORT_MMIO),A - ; - ; Write SECTORBUF to current sector - CALL SD_WRITE - OR A - JP NZ,WO_IOERR - ; - ; Increment sector for next write - CALL INC_STARTSEC - JR WO_WLOOP - ; - ; --- Write directory entry --- -WO_WDONE: ; Ensure MMIO is active - OUT (PORT_MMIO),A - ; - ; Re-read the directory sector containing our entry - LD A,0FFH - LD (DIRSECBUF),A ; Force re-read - LD A,(SAVE_DIRENT) - LD E,A - PUSH DE - CALL GETSDDIRENT ; HL = entry in SECTORBUF - POP DE - OR A - JP NZ,WO_IOERR - ; - ; HL = 32-byte entry in SECTORBUF. Fill it. - ; FLAG1 = 0x80 (active) - LD (HL),080H - INC HL - ; - ; ATRB: remap type 02 -> 05 for SD storage - LD A,(ELMD) ; Disk BASIC type - CP 002H - JR NZ,WO_AT1 - LD A,005H ; BTX -> MZ-700 BASIC tape type -WO_AT1: LD (HL),A - INC HL - ; - ; NAME: 17 bytes from ELMD1, CR -> null - PUSH DE - LD DE,ELMD1 - LD B,17 -WO_NM: LD A,(DE) - CP 00DH ; CR? - JR NZ,WO_NM1 - XOR A ; CR -> null for SD -WO_NM1: LD (HL),A - INC HL - INC DE - DJNZ WO_NM - POP DE - ; - ; START_SECTOR: 4 bytes (calculate from entry number) - PUSH HL ; Save directory entry pointer - LD A,(SAVE_DIRENT) - LD H,000H - LD L,A - ADD HL,HL ; *2 - ADD HL,HL ; *4 - ADD HL,HL ; *8 - ADD HL,HL ; *16 - ADD HL,HL ; *32 - ADD HL,HL ; *64 - ADD HL,HL ; *128 - LD DE,00010H ; +16 - ADD HL,DE ; HL = relative start sector (16-bit) - ; Store as big-endian 32-bit (D=0, E=0, H, L) - EX DE,HL ; DE = sector - POP HL ; HL = entry pointer - LD (HL),000H ; Byte 0 (MSB) = 0 - INC HL - LD (HL),000H ; Byte 1 = 0 - INC HL - LD (HL),D ; Byte 2 - INC HL - LD (HL),E ; Byte 3 (LSB) - INC HL - ; - ; SIZE: 2 bytes LE — read original from ELMD (FILE_SIZE is 0 after write loop). - PUSH DE - LD A,(ELMD) - CP 002H - JR NZ,WO_SZ_NB - LD DE,(ELMD20) ; BASIC: SIZE in ELMD20 - JR WO_SZ_OK -WO_SZ_NB: LD DE,(ELMD18) ; Non-BASIC: SIZE in ELMD18 -WO_SZ_OK: LD (HL),E - INC HL - LD (HL),D - INC HL - ; - ; DTADR: 2 bytes LE — read original from ELMD/TEXTST. - LD A,(ELMD) - CP 002H - JR NZ,WO_DA_NB - LD DE,(TEXTST) ; BASIC: load address is TEXTST - JR WO_DA_OK -WO_DA_NB: LD DE,(ELMD20) ; Non-BASIC: DTADR in ELMD20 -WO_DA_OK: LD (HL),E - INC HL - LD (HL),D - INC HL - ; - ; EXADR: 2 bytes LE from ELMD22 - LD DE,(ELMD22) - LD (HL),E - INC HL - LD (HL),D - INC HL - ; - ; RESERVED: 3 bytes zero - LD (HL),000H - INC HL - LD (HL),000H - INC HL - LD (HL),000H - POP DE - ; - ; Write the directory sector back to SD - ; Calculate directory sector address - LD A,(SAVE_DIRENT) - SRL A - SRL A - SRL A - SRL A ; A = dir sector number (0-15) - LD DE,0 - LD H,0 - LD L,A - CALL RFSGETSECTR ; DEHL = absolute dir sector - CALL SETLBAADDR - CALL SD_WRITE - OR A - JR NZ,WO_IOERR - ; - ; Success - CALL MMIO_OFF - POP BC - POP DE - POP HL - XOR A ; NC = success - RET - ; -WO_IOERR: CALL MMIO_OFF - POP BC - POP DE - POP HL - XOR A - SCF ; C = error - RET - -; --------------------------------------------------------------------------- -; RFSOUT - Write Data (ZOUT handler for SAVE) -; -; BASIC's SAVE path calls ZOUT after ZWO. Since RFSWO is now a no-op, -; RFSOUT is the single entry point for the actual write. On the first -; call (SAVE_PENDING=0, cleared by RFSINIT), we call RFSDOWRITE to do -; the full SD card write in one shot (reading directly from DTADR in -; memory). Sets SAVE_PENDING=1 after, so subsequent calls are no-ops. -; --------------------------------------------------------------------------- -RFSOUT: LD A,(SAVE_PENDING) - OR A - JR NZ,RFSOUT_NOP ; Already written (1 = done), return success - INC A ; A = 1 - LD (SAVE_PENDING),A ; Mark as done (one-shot) - JP RFSDOWRITE ; Do the full SD write and return -RFSOUT_NOP: XOR A ; A=0, NC = success - RET - -; --------------------------------------------------------------------------- -; RFSRO - Read One directory entry (ZRO handler). -; -; V1.1V: Rewritten as directory entry enumerator. -; -; ZRO is called by BASIC for two purposes: -; 1. L1C0F file search loop (HL=KEYBUF) — enumerate entries, compare names -; 2. L1D53 DIR buffer fill loop (HL=L2000+offset) — fill 32-byte entries -; -; Each call returns one valid 32-byte MZF directory entry at the buffer -; pointed to by HL (the caller's HL passed through IOCALL). The internal -; DIR_ENTRY_IDX counter advances across calls; RFSINIT resets it to 0. -; -; Entry: HL = target buffer (32 bytes, set by caller before IOCALL) -; Exit: NC = valid entry written to (HL), A = entry type (ATRB byte) -; CF = no more entries (A=0) -; --------------------------------------------------------------------------- -RFSRO: - ; Save target buffer address for CONVERT_ENTRY - LD (DIR_BUFPTR),HL - ; - ; Save registers on BASIC stack (before MMIO_ON switches stacks) - PUSH HL - PUSH DE - PUSH BC - ; - ; Set up drive number - LD A,(ZCH) - ADD A,003H ; RFS1:=drive 3 - LD (SDDRIVENO),A - ; - ; Enter MMIO mode (switches to temp stack, enables SPI) - CALL MMIO_ON - ; - ; Clear 32 bytes at target buffer (below D000H, accessible in MMIO) - LD HL,(DIR_BUFPTR) - LD B,32 -RFSRO_CLR: LD (HL),000H - INC HL - DJNZ RFSRO_CLR - ; -RFSRO_NEXT: - ; Get current entry index - LD A,(DIR_ENTRY_IDX) - LD E,A - ; - ; Read directory entry from SD card - CALL GETSDDIRENT ; HL=entry in SECTORBUF, A=status - OR A - JR NZ,RFSRO_END ; SD read error → done - ; - ; Check if entry is active (FLAG1 bit 7 set) - LD A,(HL) - BIT 7,A - JR Z,RFSRO_SKIP ; Inactive, skip - ; - ; Check ATRB at offset 1 — reject 0x00 (empty) and 0xFF (uninit) - INC HL - LD A,(HL) - DEC HL ; HL back to entry start - OR A - JR Z,RFSRO_SKIP ; ATRB=0, skip - CP 0FFH - JR Z,RFSRO_SKIP ; ATRB=0xFF, skip - ; - ; Valid entry: convert SD format to MZF format at DIR_BUFPTR - ; (DIR_BUFPTR was set at RFSRO entry from caller's HL) - ; HL = SD entry in SECTORBUF - CALL CONVERT_ENTRY - ; - ; Advance entry index for next call - LD A,(DIR_ENTRY_IDX) - INC A - LD (DIR_ENTRY_IDX),A - ; - ; Debug: show entry delivered - PUSH AF - OUT (PORT_DRAM),A ; Switch to DRAM for debug I/O - LD A,'R' - OUT (050H),A - LD A,'O' - OUT (050H),A - LD A,':' - OUT (050H),A - LD A,(DIR_ENTRY_IDX) - DEC A ; Show the index we just returned - CALL DBG_HEX - CALL DBG_CRLF - OUT (PORT_MMIO),A ; Back to MMIO - POP AF - ; - ; Success: exit MMIO, restore regs, return NC - CALL MMIO_OFF - POP BC - POP DE - POP HL - ; - ; Return ATRB value in A, NC = success - LD HL,(DIR_BUFPTR) - LD A,(HL) ; A = ATRB byte (first byte of MZF entry) - OR A ; Clear carry - RET - ; -RFSRO_SKIP: - ; Advance to next entry - LD A,(DIR_ENTRY_IDX) - INC A - LD (DIR_ENTRY_IDX),A - JR Z,RFSRO_END ; Wrapped 255->0: all 256 scanned - JR RFSRO_NEXT - ; -RFSRO_END: - ; No more entries (or SD error) - CALL MMIO_OFF - POP BC - POP DE - POP HL - XOR A ; A=0 - SCF ; CF = no more entries - RET - -; --------------------------------------------------------------------------- -; RFSINP_DIR - ZINP handler for $RFS device -; -; For bit-5 devices, BASIC calls ZINP for three purposes: -; 1. Disk identity read (H >= 28H) — returns zeros at 2800-28FF -; 2. DIR buffer fill (DIR_FILLED=0, H < 28H) — fills 2000-27FF -; 3. LOAD data transfer (DIR_FILLED=1, H < 28H) — reads from SD card -; -; IMPORTANT: H >= 28H MUST be checked first, before DIR_FILLED. -; BASIC's data transfer path (L2AD2 → L2FD1 → L2FE8 → L2E36 → L2E67) -; does an identity read (H=28H) AFTER the DIR buffer fill has set -; DIR_FILLED=1. If DIR_FILLED were checked first, this identity read -; would incorrectly dispatch to RFSINP_LD. -; -; Returns: carry clear, A=0 (success) -; --------------------------------------------------------------------------- -RFSINP_DIR: - ; Debug: trace every ZINP call - PUSH AF - LD A,'Z' - OUT (050H),A - LD A,H - CALL DBG_HEX - CALL DBG_CRLF - POP AF - ; - ; LOAD data path: BASIC's LOAD for bit5=0 devices calls ZINP once - ; via JP 019BBH (XOR A; CALL L18B6; CALL L1929). Entry A=0 signals - ; "load file data now" — skip DIR fill and identity checks entirely. - ; The byte-at-a-time refill path (L19B4) enters with A=0xFF (OR 0AFH). - OR A - JP Z,RFSINP_LD ; A=0 → LOAD path: read file to DTADR - ; - ; Identity reads (H >= 28H) MUST go to RFSINP_DISKID regardless of - ; DIR_FILLED, because BASIC does identity validation (L2E36 → L2E67 → - ; L2FD4 → IOCALL) AFTER the DIR buffer fill has set DIR_FILLED=1. - ; If DIR_FILLED were checked first, the identity read would dispatch - ; to RFSINP_LD instead of RFSINP_DISKID → identity validation fails. - LD A,H - CP 028H - JP NC,RFSINP_DISKID ; H >= 28H → identity (always) - ; - ; H < 28H: DIR buffer fill or data transfer - LD A,(DIR_FILLED) - OR A - JP NZ,RFSINP_LD ; DIR already filled → data transfer - ; - ; --- DIR mode: enumerate files into 0x2000 buffer --- - ; - PUSH HL - PUSH DE - PUSH BC - ; - ; Clear DIR buffer 0x2000-0x27FF (2048 bytes = 64 entries x 32) - LD HL,L2000 - LD DE,L2000 + 1 - LD BC,007FFH - LD (HL),000H - LDIR - ; - ; Set up SD drive from channel number - LD A,(ZCH) - ADD A,003H ; RFS1:=drive 3, skipping boot drives 0-2 - LD (SDDRIVENO),A - ; - ; Entry 0 at 0x2000: skip marker (0x80) - LD HL,L2000 - LD (HL),080H - ; - ; Enter MMIO mode - CALL MMIO_ON - ; - ; Reset directory sector cache - LD A,0FFH - LD (DIRSECBUF),A - ; - ; Scan SD directory, fill MZF entries starting at 0x2020 - LD HL,L2000 + 020H - LD (DIR_BUFPTR),HL ; Current buffer write position - LD E,000H ; E = SD directory entry index (0-255) - LD D,03FH ; D = remaining buffer entries (max 63) - LD B,000H ; B = 256 entries to scan (DJNZ wraps) - ; -RDIR_LOOP: PUSH BC - PUSH DE - CALL GETSDDIRENT ; HL = entry in SECTORBUF, A = status - POP DE - POP BC - OR A - JR NZ,RDIR_DONE ; SD read error, stop - ; - ; Debug: dump first 4 entries (E=0..3) FLAG1+ATRB - LD A,E - CP 004H - JR NC,RDIR_NDBG ; Only dump entries 0-3 - PUSH HL - PUSH AF - LD A,'[' - OUT (050H),A - LD A,E - CALL DBG_HEX ; Entry number - LD A,']' - OUT (050H),A - POP AF - POP HL - PUSH HL - PUSH BC - ; Dump 8 bytes from entry - LD B,008H -RDIR_DBLP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - INC HL - DJNZ RDIR_DBLP - CALL DBG_CRLF - POP BC - POP HL - ; -RDIR_NDBG: - ; Check if entry is active (FLAG1 bit 7) AND has valid ATRB. - ; Uninitialized SD entries (0xFF fill) have bit 7 set but ATRB=0xFF, - ; so we reject ATRB=0x00 (empty) and ATRB=0xFF (uninitialized). - ; All other values (0x01-0xFE) are accepted, including non-standard - ; file types like 0x7E found on some partitions. - LD A,(HL) - BIT 7,A - JR Z,RDIR_NEXT ; Inactive (FLAG1 bit7=0), skip - INC HL - LD A,(HL) ; A = ATRB (offset 1) - DEC HL ; HL back to entry start - OR A - JR Z,RDIR_NEXT ; ATRB=0 → invalid, skip - CP 0FFH - JR Z,RDIR_NEXT ; ATRB=0xFF → uninitialized, skip - ; - ; Convert SD entry at HL to MZF format in DIR buffer - PUSH DE - PUSH BC - CALL CONVERT_ENTRY ; HL=SD entry, writes to (DIR_BUFPTR) - POP BC - POP DE - DEC D ; One fewer buffer slot - JR Z,RDIR_DONE ; Buffer full - ; -RDIR_NEXT: INC E ; Next SD directory entry - DJNZ RDIR_LOOP - ; -RDIR_DONE: CALL MMIO_OFF - ; Debug: show how many entries found (D started at 63, remaining = D) - PUSH AF - LD A,'F' - OUT (050H),A - LD A,'=' - OUT (050H),A - LD A,03FH ; 63 max - SUB D ; A = entries found - CALL DBG_HEX - CALL DBG_CRLF - POP AF - ; - POP BC - POP DE - POP HL - LD A,001H - LD (DIR_FILLED),A ; Mark DIR buffer as filled - XOR A ; A=0, carry clear = success - RET - ; - ; --- Disk identity mode: zero L2800-L28FF --- - ; L2E36 validates: (L2800) exact + L2806-L28FF bitmask against - ; stored reference. L2E77/L2E84 modifies L2801-L2805 and writes - ; computed values at L2806+. By presenting all-zeros consistently, - ; L2E84 computes the same result each time → reference matches. - ; -RFSINP_DISKID: - PUSH HL - PUSH DE - PUSH BC - LD HL,02800H - LD DE,02801H - LD BC,000FFH ; 255 bytes: L2800-L28FF - LD (HL),000H - LDIR - POP BC - POP DE - POP HL - XOR A ; A=0, carry clear = success - RET - -; --------------------------------------------------------------------------- -; RFSINP_LD - LOAD data transfer (ZINP with ZLOG != 0) -; -; Reads file data sector-by-sector from SD card into the load address. -; For bit-5 devices, BASIC's LOAD path does NOT call ZRO and does not -; set ZLOG. RFSINP_DIR dispatches here when DIR_FILLED=1 (DIR buffer -; already populated). We find the file in the SD directory via FINDSD, -; extract SIZE, DTADR, and start sector directly from the SD entry. -; --------------------------------------------------------------------------- -RFSINP_LD: ; Debug: trace RFSINP_LD entry - PUSH AF - LD A,'I' - OUT (050H),A - LD A,'L' - OUT (050H),A - LD A,':' - OUT (050H),A - ; Dump ELMD1 first 8 chars - PUSH HL - PUSH BC - LD HL,ELMD1 - LD B,008H -ILD_DMP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - INC HL - DJNZ ILD_DMP - CALL DBG_CRLF - POP BC - POP HL - POP AF - ; - ; V1.1Y: Save entry A value (0=SVC #30 LOAD, nonzero=SVC #33 refill). - ; RLD_DONE needs this to skip status byte writes when L180B still points - ; at SVC #2C self-modifying code (0x1A85, set by prior DIR's SVC #2E). - LD (RFS_LD_A0),A - ; - PUSH HL - PUSH DE - PUSH BC - ; - ; Set up drive number - LD A,(ZCH) - ADD A,003H ; RFS1:=drive 3, skipping boot drives 0-2 - LD (SDDRIVENO),A - ; - ; Enter MMIO mode - CALL MMIO_ON - ; - ; Reset directory sector cache - LD A,0FFH - LD (DIRSECBUF),A - ; - ; Find file by name in SD directory to get start sector - LD DE,ELMD1 - CALL FINDSD - JP NZ,RLD_NFERR ; File not found - ; - ; HL = directory entry in SECTORBUF - ; Skip FLAG1(1) + ATRB(1) + NAME(17) = 19 bytes to START_SECTOR - LD DE,19 - ADD HL,DE - ; - ; Copy 4-byte start sector to FILE_STARTSEC (big-endian) - LD DE,FILE_STARTSEC - LD A,(HL) - LD (DE),A - INC HL - INC DE - LD A,(HL) - LD (DE),A - INC HL - INC DE - LD A,(HL) - LD (DE),A - INC HL - INC DE - LD A,(HL) - LD (DE),A - ; - ; HL now at offset 22 (last byte of START_SECTOR). - ; Read SIZE(2) and DTADR(2) from the SD directory entry - ; (offset 23..26) instead of ELMD, which may not be populated - ; for bit-5 device LOAD paths. - INC HL ; HL = offset 23 = SIZE low - LD E,(HL) - INC HL ; HL = offset 24 = SIZE high - LD D,(HL) - EX DE,HL ; HL = SIZE - LD (FILE_SIZE),HL - EX DE,HL ; HL = offset 24 again - INC HL ; HL = offset 25 = DTADR low - LD E,(HL) - INC HL ; HL = offset 26 = DTADR high - LD D,(HL) - EX DE,HL ; HL = DTADR - LD (FILE_LOADADDR),HL - ; - ; For BASIC programs (ELMD type 2/BTX), override FILE_LOADADDR - ; with TEXTST. The file's DTADR reflects whatever system it was - ; saved on and may point inside Disk BASIC code. BASIC's own - ; SVC 038H rechain (called in the LOAD command handler at L5C44) - ; rebuilds all next-line pointers from scratch, so the data just - ; needs to land at the current TEXTST. - LD A,(ELMD) ; File attribute byte - CP 002H ; Type 2 = BTX (BASIC text)? - JR NZ,RLD_NORLOC ; No → use DTADR as-is - LD HL,(TEXTST) ; Current text area start - LD (FILE_LOADADDR),HL -RLD_NORLOC: - ; - ; Convert FILE_STARTSEC to absolute sector (add drive offset) - LD A,(FILE_STARTSEC) - LD D,A - LD A,(FILE_STARTSEC+1) - LD E,A - LD A,(FILE_STARTSEC+2) - LD H,A - LD A,(FILE_STARTSEC+3) - LD L,A - CALL RFSGETSECTR ; DEHL += drive_offset - ; - ; Store absolute sector in SDSTARTSEC for SD_READ - LD A,D - LD (SDSTARTSEC),A - LD A,E - LD (SDSTARTSEC+1),A - LD A,H - LD (SDSTARTSEC+2),A - LD A,L - LD (SDSTARTSEC+3),A - ; - ; Debug: dump FILE_STARTSEC, absolute sector, SIZE, DTADR - ; Switch to DRAM for debug output (port 050H may need DRAM) - PUSH AF - OUT (PORT_DRAM),A - LD A,'I' - OUT (050H),A - LD A,'S' - OUT (050H),A - LD A,':' - OUT (050H),A - ; FILE_STARTSEC (4 bytes) - LD A,(FILE_STARTSEC) - CALL DBG_HEX - LD A,(FILE_STARTSEC+1) - CALL DBG_HEX - LD A,(FILE_STARTSEC+2) - CALL DBG_HEX - LD A,(FILE_STARTSEC+3) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - ; Absolute sector (SDSTARTSEC, 4 bytes) - LD A,'A' - OUT (050H),A - LD A,':' - OUT (050H),A - LD A,(SDSTARTSEC) - CALL DBG_HEX - LD A,(SDSTARTSEC+1) - CALL DBG_HEX - LD A,(SDSTARTSEC+2) - CALL DBG_HEX - LD A,(SDSTARTSEC+3) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - ; SIZE - LD A,'Z' - OUT (050H),A - LD A,':' - OUT (050H),A - LD A,(FILE_SIZE+1) ; High byte - CALL DBG_HEX - LD A,(FILE_SIZE) ; Low byte - CALL DBG_HEX - LD A,' ' - OUT (050H),A - ; DTADR - LD A,'D' - OUT (050H),A - LD A,':' - OUT (050H),A - LD A,(FILE_LOADADDR+1) ; High byte - CALL DBG_HEX - LD A,(FILE_LOADADDR) ; Low byte - CALL DBG_HEX - CALL DBG_CRLF - ; Switch back to MMIO - OUT (PORT_MMIO),A - POP AF - ; -RLD_LOOP: ; Read one sector into SECTORBUF - CALL SD_READ - OR A - JR NZ,RLD_ERR - ; - ; Map DRAM to copy data (target may be >= D000H) - OUT (PORT_DRAM),A - ; - ; Calculate bytes to copy: min(FILE_SIZE, 512) - LD HL,(FILE_SIZE) - LD DE,00200H ; 512 - OR A - SBC HL,DE ; HL = FILE_SIZE - 512 - JR C,RLD_PARTIAL ; FILE_SIZE < 512 - ; - ; Full sector: remaining = HL, copy 512 bytes - LD (FILE_SIZE),HL - LD BC,00200H - JR RLD_COPY - ; -RLD_PARTIAL:; Partial sector: remaining = 0, copy FILE_SIZE bytes - ADD HL,DE ; Restore HL = FILE_SIZE - LD B,H - LD C,L ; BC = bytes to copy - LD HL,0 - LD (FILE_SIZE),HL ; Done after this - ; -RLD_COPY: LD HL,SECTORBUF - LD DE,(FILE_LOADADDR) - LDIR ; Copy sector data to target - LD (FILE_LOADADDR),DE ; Update target address - ; - ; Check if all data transferred - LD HL,(FILE_SIZE) - LD A,H - OR L - JR Z,RLD_DONE ; All done - ; - ; Increment SDSTARTSEC for next sector - CALL INC_STARTSEC - ; - ; Map MMIO for next sector read - OUT (PORT_MMIO),A - JR RLD_LOOP - ; -RLD_DONE: ; Map MMIO so MMIO_OFF can work (it expects temp stack) - OUT (PORT_MMIO),A - CALL MMIO_OFF - ; - ; V1.1Y: Only write status bytes when entered via SVC #33 refill path - ; (A≠0 at entry). The SVC #30 LOAD path (A=0) leaves L180B pointing at - ; 0x1A85 (set by prior DIR's SVC #2E), which is inside SVC #2C's - ; self-modifying LD HL,nnnn instruction (opcode 0x21 at 0x1A83). - ; Writing 0xFF there corrupts the opcode to RST 38H, breaking all - ; subsequent device-open calls ("Dev. name error" after LOAD). - ; SVC #30 callers don't read the status bytes, so skipping is safe. - LD A,(RFS_LD_A0) - OR A - JR Z,RLD_SKIP_STAT - ; - ; SVC #33 refill path: write status bytes at (L180B)-2 to 0xFF,0xFF - ; = "last block, all done". L1AEF already set L180B to a safe buffer. - LD HL,(L180B) - DEC HL - LD (HL),0FFH ; (L180B)-1 = 0xFF - DEC HL - LD (HL),0FFH ; (L180B)-2 = 0xFF - ; -RLD_SKIP_STAT: - POP BC - POP DE - POP HL - XOR A ; NC = success - RET - ; -RLD_ERR: CALL MMIO_OFF - POP BC - POP DE - POP HL - XOR A - SCF ; Carry = error - RET - ; -RLD_NFERR: CALL MMIO_OFF - POP BC - POP DE - POP HL - XOR A - SCF ; Carry = file not found - RET - -; =========================================================================== -; Low-level SD card access routines -; =========================================================================== - -; --------------------------------------------------------------------------- -; MMIO_ON - Enter MMIO mode for SPI access -; -; Saves BASIC stack pointer, switches to temp stack, disables interrupts, -; maps MMIO (D000-FFFF), and trains the upCntr latch. -; After return, caller is on temp stack and can access EFF8-EFFF. -; --------------------------------------------------------------------------- -MMIO_ON: POP HL ; Get return address (from BASIC stack) - LD (SAVE_SP),SP ; Save BASIC SP - LD SP,TEMP_STACK_TOP ; Switch to temp stack - PUSH HL ; Push return address on temp stack - DI - XOR A - OUT (PORT_MMIO),A ; Map D000-FFFF to MMIO - CALL TRAIN_UPCNTR ; Train latch (15 reads of EFF8H) - RET ; Return to caller (via temp stack) - -; --------------------------------------------------------------------------- -; MMIO_OFF - Leave MMIO mode, restore DRAM and BASIC stack -; -; Maps D000-FFFF back to DRAM, enables interrupts, restores BASIC stack. -; --------------------------------------------------------------------------- -MMIO_OFF: POP HL ; Get return address (from temp stack) - XOR A - OUT (PORT_DRAM),A ; Map D000-FFFF to DRAM - EI - LD SP,(SAVE_SP) ; Restore BASIC stack - JP (HL) ; Return to caller (on BASIC stack) - -; --------------------------------------------------------------------------- -; TRAIN_UPCNTR - Train the RFS register latch (upCntr) to 15 -; -; Reads BNKCTRLRST 15 times to enable control register writes. -; Entry: MMIO must be mapped (OUT E3H done) -; Exit: A = 0, HL and B modified -; --------------------------------------------------------------------------- -TRAIN_UPCNTR: - LD HL,BNKCTRLRST ; EFF8H - LD B,15 -TRAIN_LP: LD A,(HL) ; Each read increments upCntr - DJNZ TRAIN_LP - XOR A - RET - -; --------------------------------------------------------------------------- -; SPIOUT - Send one byte via hardware SPI -; Entry: A = byte to send -; Exit: A unchanged -; --------------------------------------------------------------------------- -SPIOUT: LD (HWSPIDATA),A ; Write data to SPI register - LD (HWSPISTART),A ; Start SPI transfer (clocks 8 bits) - RET - -; --------------------------------------------------------------------------- -; SPIIN - Receive one byte via hardware SPI -; Entry: (none) -; Exit: A = received byte -; --------------------------------------------------------------------------- -SPIIN: LD (HWSPISTART),A ; Clock 8 bits (sends whatever was in A) - LD A,(HWSPIDATA) ; Read received byte - RET - -; --------------------------------------------------------------------------- -; SPI_CS_LO - Activate SD card chip select (CS LOW) -; --------------------------------------------------------------------------- -SPI_CS_LO: LD A,SDCS_ACT ; CS LOW, clock enable - LD (BNKCTRL),A - RET - -; --------------------------------------------------------------------------- -; SPI_CS_HI - Deactivate SD card chip select (CS HIGH) -; --------------------------------------------------------------------------- -SPI_CS_HI: LD A,SDCS_DEACT ; CS HIGH, clock enable - LD (BNKCTRL),A - RET - -; --------------------------------------------------------------------------- -; SD_READ - Read one 512-byte sector from SD card into SECTORBUF -; -; Entry: SDSTARTSEC = 32-bit sector address (big-endian, 4 bytes) -; MMIO must be mapped, upCntr trained -; Exit: A = 0 success, A = 1 error -; SECTORBUF contains 512 bytes of sector data -; Modified: A, B, D, HL -; --------------------------------------------------------------------------- -SD_READ: CALL SPI_CS_LO ; CS LOW (activate card) - ; - ; Send CMD17 (Read Single Block): 0x51 + 4-byte sector + 0xFF - LD A,051H ; CMD17 - CALL SPIOUT - LD A,(SDSTARTSEC) ; Sector byte 0 (MSB) - CALL SPIOUT - LD A,(SDSTARTSEC+1) ; Sector byte 1 - CALL SPIOUT - LD A,(SDSTARTSEC+2) ; Sector byte 2 - CALL SPIOUT - LD A,(SDSTARTSEC+3) ; Sector byte 3 (LSB) - CALL SPIOUT - LD A,0FFH ; CRC (dummy, ignored by emulation) - CALL SPIOUT - ; - ; Poll for R1 response (should be 0x00, not 0xFF) - LD B,0FFH ; Max 255 retries -SDR_R1: CALL SPIIN - CP 0FFH - JR NZ,SDR_GOTR1 ; Got non-0xFF response - DJNZ SDR_R1 - JR SDR_ERR ; Timeout - ; -SDR_GOTR1: OR A ; R1 should be 0x00 (no error) - JR NZ,SDR_ERR - ; - ; Poll for data token (0xFE) - LD B,0FFH -SDR_TOK: CALL SPIIN - CP 0FEH ; Data token? - JR Z,SDR_DATA ; Yes, start reading data - CP 0FFH ; Still busy? - JR NZ,SDR_ERR ; Error token - DJNZ SDR_TOK - JR SDR_ERR ; Timeout - ; - ; Read 512 bytes into SECTORBUF (2 pages of 256 bytes) -SDR_DATA: LD HL,SECTORBUF - LD D,002H ; 2 pages -SDR_PG: LD B,000H ; 256 bytes per page (B=0 wraps DJNZ) -SDR_BYTE: CALL SPIIN - LD (HL),A - INC HL - DJNZ SDR_BYTE - DEC D - JR NZ,SDR_PG - ; - ; Skip 2 CRC bytes - CALL SPIIN - CALL SPIIN - ; - CALL SPI_CS_HI ; CS HIGH (deactivate) - XOR A ; A = 0, success - RET - ; -SDR_ERR: CALL SPI_CS_HI ; CS HIGH on error too - LD A,001H ; A = 1, error - RET - -; --------------------------------------------------------------------------- -; SD_WRITE - Write one 512-byte sector from SECTORBUF to SD card -; -; Entry: SDSTARTSEC = 32-bit sector address (big-endian, 4 bytes) -; SECTORBUF contains 512 bytes to write -; MMIO must be mapped, upCntr trained -; Exit: A = 0 success, A = 1 error -; Modified: A, B, D, HL -; --------------------------------------------------------------------------- -SD_WRITE: CALL SPI_CS_LO ; CS LOW (activate card) - ; - ; Send CMD24 (Write Single Block): 0x58 + 4-byte sector + 0xFF - LD A,058H ; CMD24 - CALL SPIOUT - LD A,(SDSTARTSEC) - CALL SPIOUT - LD A,(SDSTARTSEC+1) - CALL SPIOUT - LD A,(SDSTARTSEC+2) - CALL SPIOUT - LD A,(SDSTARTSEC+3) - CALL SPIOUT - LD A,0FFH ; Dummy CRC - CALL SPIOUT - ; - ; Poll for R1 response (should be 0x00) - LD B,0FFH -SDW_R1: CALL SPIIN - CP 0FFH - JR NZ,SDW_GOTR1 - DJNZ SDW_R1 - JR SDW_ERR ; Timeout - ; -SDW_GOTR1: OR A - JR NZ,SDW_ERR ; R1 error - ; - ; Send data token 0xFE - LD A,0FEH - CALL SPIOUT - ; - ; Send 512 bytes from SECTORBUF (2 pages of 256) - LD HL,SECTORBUF - LD D,002H -SDW_PG: LD B,000H ; 256 bytes per page -SDW_BYTE: LD A,(HL) - CALL SPIOUT - INC HL - DJNZ SDW_BYTE - DEC D - JR NZ,SDW_PG - ; - ; Send 2 dummy CRC bytes - LD A,0FFH - CALL SPIOUT - CALL SPIOUT - ; - ; Read data response token: xxx00101 = accepted (0x05) - CALL SPIIN - AND 01FH - CP 005H - JR NZ,SDW_ERR - ; - ; Wait for busy (card holds MISO low while writing) - LD D,040H ; Outer loop: 64 -SDW_BSY1: LD B,000H ; Inner loop: 256 -> 64*256=16384 polls -SDW_BSY2: CALL SPIIN - CP 0FFH ; 0xFF = not busy - JR Z,SDW_DONE - DJNZ SDW_BSY2 - DEC D - JR NZ,SDW_BSY1 - JR SDW_ERR ; Timeout - ; -SDW_DONE: CALL SPI_CS_HI - XOR A ; A = 0, success - RET - ; -SDW_ERR: CALL SPI_CS_HI - LD A,001H ; A = 1, error - RET - -; =========================================================================== -; Directory and file access routines -; =========================================================================== - -; --------------------------------------------------------------------------- -; ADD3216 - Add 16-bit BC to 32-bit DEHL -; -; Entry: DEHL = 32-bit number, BC = 16-bit addend -; Exit: DEHL = DEHL + BC -; Modified: BC (set to 0) -; --------------------------------------------------------------------------- -ADD3216: ADD HL,BC - EX DE,HL - LD BC,0 - ADC HL,BC ; Add carry to upper 16 bits - EX DE,HL - RET - -; --------------------------------------------------------------------------- -; RFSGETSECTR - Calculate absolute SD sector from drive-relative sector -; -; Adds (SDDRIVENO * 0x8010) to DEHL. -; Each drive image occupies 0x8010 sectors in the SD card image. -; -; Entry: DEHL = relative sector (32-bit) -; SDDRIVENO = drive number (0 = first drive, 1 = second, etc.) -; Exit: DEHL = absolute sector -; Modified: A, BC -; --------------------------------------------------------------------------- -RFSGETSECTR: - LD A,(SDDRIVENO) -GETSEC_LP: OR A - RET Z ; Drive 0 = no offset - DEC A - LD BC,08010H ; Sectors per drive image - CALL ADD3216 - JR GETSEC_LP - -; --------------------------------------------------------------------------- -; SETLBAADDR - Store DEHL into SDSTARTSEC (big-endian) -; -; Entry: DEHL = 32-bit sector (D=MSB, L=LSB) -; Exit: SDSTARTSEC updated -; Modified: A -; --------------------------------------------------------------------------- -SETLBAADDR: LD A,D - LD (SDSTARTSEC),A - LD A,E - LD (SDSTARTSEC+1),A - LD A,H - LD (SDSTARTSEC+2),A - LD A,L - LD (SDSTARTSEC+3),A - RET - -; --------------------------------------------------------------------------- -; INC_STARTSEC - Increment SDSTARTSEC by 1 (32-bit big-endian) -; Modified: HL -; --------------------------------------------------------------------------- -INC_STARTSEC: - LD HL,SDSTARTSEC+3 ; LSB - INC (HL) - RET NZ - DEC HL ; Byte 2 - INC (HL) - RET NZ - DEC HL ; Byte 1 - INC (HL) - RET NZ - DEC HL ; MSB - INC (HL) - RET - -; --------------------------------------------------------------------------- -; GETSDDIRENT - Get SD directory entry with sector caching -; -; Reads the directory sector containing entry E if not cached, then -; returns a pointer to the entry within SECTORBUF. -; -; Entry: E = directory entry number (0-255) -; MMIO mapped, upCntr trained -; Exit: HL = pointer to 32-byte entry in SECTORBUF -; A = 0 success, A = 1 error -; Modified: A, BC, DE, HL -; --------------------------------------------------------------------------- -GETSDDIRENT: - PUSH DE - ; - ; Calculate which sector this entry is in (E / 16) - LD A,E - SRL A - SRL A - SRL A - SRL A ; A = sector number within directory - ; - ; Check if this sector is already cached - LD C,A - LD A,(DIRSECBUF) - CP C - JR Z,GDIR_CACHED ; Same sector, use cached data - ; - ; Need to read a new sector - LD A,C - LD (DIRSECBUF),A ; Update cache tag - ; - ; Calculate absolute sector: drive_offset + dir_sector - LD DE,0 - LD H,0 - LD L,A ; DEHL = directory sector (relative) - CALL RFSGETSECTR ; DEHL = absolute sector - CALL SETLBAADDR ; Store in SDSTARTSEC - CALL SD_READ ; Read sector into SECTORBUF - OR A - JR NZ,GDIR_ERR - ; -GDIR_CACHED:; Calculate offset within sector: (E & 0x0F) * 32 - POP DE - PUSH DE - LD A,E - AND 00FH ; Entry within sector (0-15) - LD HL,SECTORBUF - OR A - JR Z,GDIR_DONE ; First entry, no offset needed - ; - ; Add A * 32 to HL - LD B,A - LD DE,00020H ; 32 bytes per entry -GDIR_ADD: ADD HL,DE - DJNZ GDIR_ADD - ; -GDIR_DONE: POP DE - XOR A ; A = 0, success - RET - ; -GDIR_ERR: POP DE - LD A,001H ; A = 1, error - RET - -; --------------------------------------------------------------------------- -; FINDSD - Find file by name in SD card directory -; -; Searches all 256 directory entries for an active entry whose filename -; matches the string at DE (prefix match: input terminated by CR or null). -; -; Entry: DE = filename string (CR or null terminated) -; MMIO mapped, upCntr trained, DIRSECBUF set to 0xFF -; Exit: Z flag set = found, HL = directory entry in SECTORBUF -; NZ flag = not found -; Modified: A, BC, DE, HL -; --------------------------------------------------------------------------- -FINDSD: LD (FINDSD_NAME),DE ; Save search name pointer - LD E,000H ; E = directory entry index - LD B,000H ; B = 256 entries (DJNZ wraps from 0) - ; -FSD_LOOP: PUSH BC - PUSH DE - CALL GETSDDIRENT ; HL = entry, A = status - POP DE - POP BC - OR A - JR NZ,FSD_NF ; Read error = not found - ; - ; Check if entry is active (FLAG1 bit 7) AND has valid ATRB. - ; Accept all non-zero, non-0xFF ATRB (01-FE). - LD A,(HL) - BIT 7,A - JR Z,FSD_NEXT ; Inactive, skip - INC HL - LD A,(HL) ; A = ATRB (offset 1) - DEC HL ; HL back to entry start - OR A - JR Z,FSD_NEXT ; ATRB=0 → invalid, skip - CP 0FFH - JR Z,FSD_NEXT ; ATRB=0xFF → uninitialized, skip - ; - ; Compare filename: dir entry name at HL+2 vs search name - PUSH HL ; Save entry start - PUSH DE - PUSH BC - INC HL - INC HL ; HL = directory entry name (offset 2) - LD DE,(FINDSD_NAME) ; DE = search name - LD B,17 ; Max filename length - ; -FSD_CMP: LD A,(DE) - CP 00DH ; CR terminator? - JR Z,FSD_MATCH ; Input ended = prefix match - OR A ; Null terminator? - JR Z,FSD_MATCH - CP (HL) ; Compare characters - JR NZ,FSD_NOMATCH - INC DE - INC HL - DJNZ FSD_CMP - ; All 17 characters matched - ; -FSD_MATCH: POP BC - POP DE - POP HL ; HL = entry start - XOR A ; Z flag = found - RET - ; -FSD_NOMATCH:POP BC - POP DE - POP HL - ; -FSD_NEXT: INC E ; Next directory entry - DJNZ FSD_LOOP - ; -FSD_NF: LD A,001H - OR A ; NZ flag = not found - RET - -; --------------------------------------------------------------------------- -; EXTRACT_HDR - Extract file header from SD directory entry -; -; Converts SD directory entry fields to MZF format in ELMD, and saves -; the file's absolute start sector in FILE_STARTSEC for data transfer. -; -; Entry: HL = directory entry in SECTORBUF (MMIO mapped) -; SDDRIVENO set for current drive -; Exit: ELMD filled with MZF header (ATRB, NAME, SIZE, DTADR, EXADR) -; FILE_STARTSEC set to absolute start sector -; Modified: A, BC, DE, HL -; --------------------------------------------------------------------------- -EXTRACT_HDR: - INC HL ; Skip FLAG1, HL = ATRB (offset 1) - ; - ; Copy ATRB to ELMD[0], remapping CMT type 05 -> Disk BASIC type 02 - LD DE,ELMD - LD A,(HL) - CP 005H ; CMT type 05 = MZ-700 BASIC text - JR NZ,EH_AT1 - LD A,002H ; Disk BASIC type 02 = BTX -EH_AT1: LD (DE),A - INC HL ; HL = NAME (offset 2) - INC DE ; DE = ELMD+1 - ; - ; Copy 17-byte filename, converting null to CR - LD B,17 -EH_NAME: LD A,(HL) - OR A - JR NZ,EH_NM1 - LD A,00DH ; Null -> CR for BASIC -EH_NM1: LD (DE),A - INC HL - INC DE - DJNZ EH_NAME - ; - ; HL at offset 19: START_SECTOR (4 bytes, big-endian) - ; DE at ELMD+18 - PUSH DE ; Save ELMD position - ; - ; Copy 4-byte start sector to FILE_STARTSEC - LD DE,FILE_STARTSEC - LD A,(HL) - LD (DE),A - INC HL - INC DE - LD A,(HL) - LD (DE),A - INC HL - INC DE - LD A,(HL) - LD (DE),A - INC HL - INC DE - LD A,(HL) - LD (DE),A - INC HL ; HL at offset 23: SIZE - ; - ; Copy SIZE(2) + DTADR(2) + EXADR(2) = 6 bytes to ELMD - POP DE ; DE = ELMD+18 - LD BC,6 - LDIR - ; - ; Convert FILE_STARTSEC to absolute sector (add drive offset) - LD A,(FILE_STARTSEC) - LD D,A - LD A,(FILE_STARTSEC+1) - LD E,A - LD A,(FILE_STARTSEC+2) - LD H,A - LD A,(FILE_STARTSEC+3) - LD L,A - CALL RFSGETSECTR ; DEHL += drive_offset - ; - ; Store absolute sector back to FILE_STARTSEC - LD A,D - LD (FILE_STARTSEC),A - LD A,E - LD (FILE_STARTSEC+1),A - LD A,H - LD (FILE_STARTSEC+2),A - LD A,L - LD (FILE_STARTSEC+3),A - RET - -; --------------------------------------------------------------------------- -; CONVERT_ENTRY - Convert SD directory entry to Disk BASIC DIR buffer format -; -; Writes a 32-byte directory entry to the DIR buffer at (DIR_BUFPTR) -; and advances DIR_BUFPTR by 32. Format matches standard MZ Disk BASIC -; floppy directory layout so LOAD/SAVE work correctly. -; -; SD entry format: FLAG1(1), ATRB(1), NAME(17), SECTOR(4), SIZE(2), DTADR(2), EXADR(2), RESV(3) -; Disk BASIC format: ATRB(1), NAME(17), STARTSEC(2), SIZE(2), DTADR(2), EXADR(2), pad(6) -; -; Entry: HL = SD directory entry in SECTORBUF -; Exit: DIR_BUFPTR advanced by 32 -; Modified: A, BC, DE, HL -; --------------------------------------------------------------------------- -CONVERT_ENTRY: - INC HL ; Skip FLAG1 - ; - ; Copy ATRB to buffer, remapping CMT type 05 -> Disk BASIC type 02 - LD DE,(DIR_BUFPTR) - LD A,(HL) - CP 005H ; CMT type 05 = MZ-700 BASIC text - JR NZ,CE_AT1 - LD A,002H ; Disk BASIC type 02 = BTX -CE_AT1: LD (DE),A - INC HL ; HL = NAME (offset 2) - INC DE - ; - ; Copy 17-byte filename, null -> CR - LD B,17 -CE_NAME: LD A,(HL) - OR A - JR NZ,CE_NM1 - LD A,00DH -CE_NM1: LD (DE),A - INC HL - INC DE - DJNZ CE_NAME - ; - ; HL now at SD offset 19 = START_SECTOR (4 bytes, big-endian) - ; Write 2-byte start sector placeholder at DIR offset 18-19 - ; then SIZE(2)+DTADR(2)+EXADR(2) at DIR offsets 20-25. - ; BASIC reads SIZE from DIR offset 20 (IY+14H), DTADR from 22, - ; EXADR from 24. The 2-byte slot at 18 must exist for alignment. - INC HL ; Skip START_SECTOR[0] - INC HL ; Skip START_SECTOR[1] - LD A,(HL) - LD (DE),A ; DIR[18] = START_SECTOR[2] - INC HL - INC DE - LD A,(HL) - LD (DE),A ; DIR[19] = START_SECTOR[3] - INC HL - INC DE - ; - ; Copy SIZE(2) + DTADR(2) + EXADR(2) = 6 bytes to DIR offset 20-25 - LD BC,6 - LDIR - ; - ; Remaining 8 bytes already zeroed by buffer clear - ; Advance DIR_BUFPTR by 32 - LD HL,(DIR_BUFPTR) - LD DE,00020H - ADD HL,DE - LD (DIR_BUFPTR),HL - RET - -; --------------------------------------------------------------------------- -; MEMCLI_PATCH - Trampoline from L4020 (MEMCLI). -; Original code was: RST 018H / DB 020H / EX DE,HL -; SVC 020H programs the boot beep timer and (critically) enables interrupts. -; We must still call it, then load HL with RFS_END for the memory clear. -; --------------------------------------------------------------------------- -MEMCLI_PATCH: - RST 018H - DB 020H ; SVC 020H: boot beep + EI - LD HL,RFS_END - JP L4023 ; Continue with memory clear loop - -; --------------------------------------------------------------------------- -; RFS_LOAD_HOOK - Trampoline for L3153 data transfer -; -; Replaces CALL L32CB + CALL L3174 in L3153. Checks if the current device -; is $RFS (by comparing the ZINP handler pointer). For $RFS, performs SD -; card data transfer via RFSINP_LD instead of the FD/QD hardware path. -; For all other devices, calls the original L32CB + L3174 sequence. -; -; --------------------------------------------------------------------------- -; RFS_DIR_FIX — Trampoline for DIR device-name parsing. -; L593A's success path jumps here instead of directly to L596B. -; We advance HL past the ':' so the INC/DEC zero-test at L596B sees -; end-of-text (0x00) rather than ':' (0x3A). -; --------------------------------------------------------------------------- -RFS_DIR_FIX: - LD DE,L5982 - INC HL ; Advance HL past ':'. - JP L596B -; -; --------------------------------------------------------------------------- -; RFS_DIR_STR — Hook for L5962 string expression path. -; Called instead of L6E6F when L593A's letter parsing fails (e.g., DIR "RFS1:"). -; Evaluates the string expression, then copies the device name (up to ':') -; into L5982 and sets B = length for SVC #2CH. -; Entry: HL = text pointer (at '"'), B = 0 -; Exit: HL advanced past expression, B = name length, DE = L5982 -; --------------------------------------------------------------------------- -RFS_DIR_STR: - CALL L6E6F ; Evaluate string expr. B=strlen, DE=strptr - PUSH HL ; Save text pointer (past closing quote) - EX DE,HL ; HL = string data pointer - LD DE,L5982 ; DE = name buffer - LD A,B ; A = string length - OR A - JR Z,DSTR_DONE ; Empty string → B stays 0 - LD C,A ; C = remaining chars - LD B,000H ; B = bytes copied -DSTR_LP: LD A,(HL) ; Get char from string - LD (DE),A ; Copy to name buffer - INC HL - INC DE - INC B ; Count - DEC C - CP 03AH ; ':' ? - JR Z,DSTR_DONE ; Stop after ':' - LD A,C - OR A - JR NZ,DSTR_LP ; Loop if more chars -DSTR_DONE: LD DE,L5982 ; DE = start of name buffer (for SVC #2CH) - POP HL ; Restore text pointer - RET -; -; Entry: BC = SIZE (file size to load), stack = L10F0 stack -; Exit: A=0 NC on success; carry on error. Registers preserved. -; --------------------------------------------------------------------------- -RFS_LOAD_HOOK: - ; Debug: trace L3153 hook entry - PUSH AF - LD A,'L' - OUT (050H),A - LD A,'H' - OUT (050H),A - LD A,':' - OUT (050H),A - ; Show BC (SIZE) - LD A,B - CALL DBG_HEX - LD A,C - CALL DBG_HEX - CALL DBG_CRLF - POP AF - ; - LD HL,(ZINP) ; Current device ZINP handler - PUSH DE - LD DE,RFSINP_DIR ; $RFS handler address - OR A - SBC HL,DE - POP DE - JR Z,RFLH_RFS - ; - ; Not $RFS — call original FD/QD transfer - CALL L32CB - JP L3174 - ; -RFLH_RFS: ; $RFS device: transfer file data from SD card. - ; Debug: show ELMD contents before RFSINP_LD - PUSH AF - PUSH HL - PUSH BC - LD A,'L' - OUT (050H),A - LD A,'D' - OUT (050H),A - LD A,':' - OUT (050H),A - ; Dump ELMD[0..7] (ATRB + first 7 chars of name) - LD HL,ELMD - LD B,008H -RFLH_DMP1: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - INC HL - DJNZ RFLH_DMP1 - CALL DBG_CRLF - ; Dump ELMD18-ELMD23 (SIZE+DTADR+EXADR) - LD A,'E' - OUT (050H),A - LD A,'M' - OUT (050H),A - LD A,':' - OUT (050H),A - LD HL,ELMD18 - LD B,006H -RFLH_DMP2: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - INC HL - DJNZ RFLH_DMP2 - CALL DBG_CRLF - POP BC - POP HL - POP AF - ; - CALL RFSINP_LD - ; Debug: show return status - PUSH AF - LD A,'L' - OUT (050H),A - LD A,'R' - OUT (050H),A - LD A,'=' - OUT (050H),A - JR C,RFLH_ERR - LD A,'K' - OUT (050H),A - JR RFLH_DONE -RFLH_ERR: LD A,'E' - OUT (050H),A -RFLH_DONE: CALL DBG_CRLF - POP AF - JP L3101 - -; =========================================================================== -; DBG_DIRCMD1 — Debug wrapper for L58CA (DIR handler 1: device-name path). -; Outputs "1E\n" on port 050H as version/path marker, then original logic. -; =========================================================================== -DBG_DIRCMD1: - LD A,'1' ; DIR path 1 marker - OUT (050H),A - LD A,'M' ; Version letter M - OUT (050H),A - CALL DBG_CRLF - CALL L593A ; Original: parse device name - RST 018H - DB 03AH ; SVC #3A: list directory - RET - -; =========================================================================== -; DBG_DIRCMD2 — Debug wrapper for L58D0 (DIR handler 2: string-expr path). -; Outputs "2E\n" on port 050H as version/path marker, then original logic. -; =========================================================================== -DBG_DIRCMD2: - LD A,'2' ; DIR path 2 marker - OUT (050H),A - LD A,'M' ; Version letter M - OUT (050H),A - CALL DBG_CRLF - CALL L413E ; Original: check current char - LD B,000H - CALL NZ,L6E6F ; Evaluate string expression - JP L58D8 ; Continue at PUSH HL / SVC #2C / SVC #3C - -; =========================================================================== -; DBG_DIR — Debug wrapper replacing L596B for DIR SVC #2C. -; Outputs trace info on port 050H, then performs the original SVC call and -; error check. Format: -; D:BB NAMESTR... (before SVC: B=count, name from DE) -; K:xx xx xx xx xx xx (after SVC: KEYBUF[0..5]) -; =HHHH:VV (after SVC: HL pointer and (HL) value) -; =========================================================================== -DBG_DIR: - PUSH AF - ; --- Before SVC: output "D:" + B (hex) + space + name string --- - LD A,'D' - OUT (050H),A - LD A,':' - OUT (050H),A - LD A,B - CALL DBG_HEX - LD A,' ' - OUT (050H),A - ; Output the name (B chars from DE) - PUSH BC - PUSH DE - LD A,B - OR A - JR Z,DBG_NN -DBG_NLP: LD A,(DE) - OUT (050H),A - INC DE - DJNZ DBG_NLP -DBG_NN: POP DE - POP BC - CALL DBG_CRLF - POP AF - ; --- Call SVC #2C (original L596B logic) --- - PUSH HL - RST 018H - DB 02CH - ; --- After SVC: dump KEYBUF[0..7] --- - PUSH AF - PUSH BC - PUSH DE - PUSH HL ; save SVC result HL - LD A,'K' - OUT (050H),A - LD A,':' - OUT (050H),A - LD HL,KEYBUF - LD B,008H -DBG_KLP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - INC HL - DJNZ DBG_KLP - CALL DBG_CRLF - POP HL ; restore SVC result HL - ; --- Output "=" + HL (4 hex) + ":" + (HL) (2 hex) --- - LD A,'=' - OUT (050H),A - LD A,H - CALL DBG_HEX - LD A,L - CALL DBG_HEX - LD A,':' - OUT (050H),A - LD A,(HL) - CALL DBG_HEX - CALL DBG_CRLF - POP DE - POP BC - POP AF - ; --- Original error check --- - INC (HL) - DEC (HL) - JP NZ,04B25H - POP HL - RET -; -; --------------------------------------------------------------------------- -; DBG_HEX — Output A as 2 hex ASCII digits to port 050H. -; Preserves BC, DE, HL. -; --------------------------------------------------------------------------- -DBG_HEX: PUSH AF - RRCA - RRCA - RRCA - RRCA - AND 00FH - CALL DBG_NIB - POP AF - AND 00FH -DBG_NIB: CP 00AH - JR C,DBG_DIG - ADD A,037H ; 'A'..'F' - OUT (050H),A - RET -DBG_DIG: ADD A,030H ; '0'..'9' - OUT (050H),A - RET -; -; --------------------------------------------------------------------------- -; DBG_CRLF — Output CR+LF to port 050H. Preserves all registers. -; --------------------------------------------------------------------------- -DBG_CRLF: PUSH AF - LD A,00DH ; CR - OUT (050H),A - LD A,00AH ; LF - OUT (050H),A - POP AF - RET - -; =========================================================================== -; DBG_DIR3 — Debug wrapper for L5CE3 (the real DIR command handler). -; Replicates the full DIR flow with debug markers around each SVC call. -; Output format on port 050H: -; D3:E (entry marker + version) -; 82:AA (L5882 result in A, hex) -; 2E:AA C=x B1=x (SVC #2E result: A, carry flag, bit1 of A) -; C2: (L58C2 done) -; 3A:AA (L593A result: channel in A) -; 39a: (SVC #39 with A=0 done) -; 3Ac:AA (SVC #3A with A=channel done) -; 39b:AA (SVC #39 with A=orig done) -; D3:X (exit marker) -; =========================================================================== -DBG_DIR3: - ; --- Entry marker --- - LD A,'D' - OUT (050H),A - LD A,'3' - OUT (050H),A - LD A,':' - OUT (050H),A - LD A,'M' ; Version M - OUT (050H),A - CALL DBG_CRLF - ; --- Call L5882 (original first instruction) --- - CALL L5882 - ; --- Debug: show L5882 result --- - PUSH AF - PUSH AF - LD A,'8' - OUT (050H),A - LD A,'2' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show A from L5882 - CALL DBG_CRLF - POP AF - ; --- PUSH AF (as original) --- - ; AF is already on stack from our PUSH above - ; --- SVC #2E --- - RST 018H - DB 02EH - ; --- Debug: show SVC #2E result --- - PUSH AF ; save flags from SVC #2E - PUSH AF - LD A,'2' - OUT (050H),A - LD A,'E' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show A from SVC #2E - LD A,' ' - OUT (050H),A - LD A,'C' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - JR C,DBG_D3_CY1 - LD A,'0' - JR DBG_D3_CY1D -DBG_D3_CY1: - LD A,'1' -DBG_D3_CY1D: - OUT (050H),A - CALL DBG_CRLF - POP AF ; restore flags from SVC #2E - ; --- JP C,L57B4 (error 0x2C on carry) --- - JP C,L57B4 - ; --- BIT 1,A / JP Z,057B7H --- - PUSH AF - LD A,'B' - OUT (050H),A - LD A,'1' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - BIT 1,A - PUSH AF - JR Z,DBG_D3_B0 - LD A,'1' - JR DBG_D3_B1D -DBG_D3_B0: - LD A,'0' -DBG_D3_B1D: - OUT (050H),A - CALL DBG_CRLF - POP AF - JP Z,057B7H ; error 0xBB if bit1=0 - ; --- CALL L58C2 (check ZLOG) --- - CALL L58C2 - LD A,'C' - OUT (050H),A - LD A,'2' - OUT (050H),A - LD A,':' - OUT (050H),A - LD A,'K' ; OK - OUT (050H),A - CALL DBG_CRLF - ; --- CALL L593A (parse device name) --- - CALL L593A - ; --- Debug: show L593A result (channel in A) --- - PUSH AF - LD A,'3' - OUT (050H),A - LD A,'A' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show channel - CALL DBG_CRLF - POP AF - ; --- LD B,A / XOR A / SVC #39 (A=0) --- - LD B,A - ; - ; Debug V1.1J: dump ZINP pointer and ZFLAG1 before SVC #39 - PUSH BC - LD A,'I' ; "IP=" marker for ZINP - OUT (050H),A - LD A,'P' - OUT (050H),A - LD A,'=' - OUT (050H),A - LD A,(ZINP+1) ; High byte of ZINP pointer - CALL DBG_HEX - LD A,(ZINP) ; Low byte of ZINP pointer - CALL DBG_HEX - LD A,' ' - OUT (050H),A - LD A,'F' ; "F1=" marker for ZFLAG1 - OUT (050H),A - LD A,'1' - OUT (050H),A - LD A,'=' - OUT (050H),A - LD A,(ZFLAG1) - CALL DBG_HEX - CALL DBG_CRLF - POP BC - ; - ; Debug V1.1K: dump first 4 bytes at RFSINP_DIR (runtime) and 0x2000 - PUSH HL - PUSH BC - LD A,'R' - OUT (050H),A - LD A,'@' - OUT (050H),A - LD HL,RFSINP_DIR ; Point to RFSINP_DIR code in memory - LD B,004H -DBG_RDMP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - INC HL - DJNZ DBG_RDMP - CALL DBG_CRLF - ; Also dump first 4 bytes of DIR buffer at 0x2000 - LD A,'B' - OUT (050H),A - LD A,'@' - OUT (050H),A - LD HL,L2000 - LD B,004H -DBG_BDMP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - INC HL - DJNZ DBG_BDMP - CALL DBG_CRLF - POP BC - POP HL - ; - ; (V1.1L debug hook removed in V1.1Y — was calling RFSINP_DIR for - ; ALL devices, causing 20s delay + empty DIR for non-RFS devices) - ; - XOR A - LD A,'S' - OUT (050H),A - LD A,'9' - OUT (050H),A - LD A,'a' - OUT (050H),A - LD A,':' - OUT (050H),A - CALL DBG_CRLF - XOR A ; A=0 again (debug output clobbered it) - RST 018H - DB 039H - ; --- Debug: after SVC #39 --- dump 0x2000 again - PUSH AF - PUSH HL - PUSH BC - LD A,'B' - OUT (050H),A - LD A,'=' - OUT (050H),A - LD HL,L2000 - LD B,004H -DBG_BDMP2: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - INC HL - DJNZ DBG_BDMP2 - CALL DBG_CRLF - POP BC - POP HL - POP AF - ; --- original after-SVC debug --- - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'9' - OUT (050H),A - LD A,'a' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show A result - LD A,' ' - OUT (050H),A - LD A,'C' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - JR C,DBG_D3_CY2 - LD A,'0' - JR DBG_D3_CY2D -DBG_D3_CY2: - LD A,'1' -DBG_D3_CY2D: - OUT (050H),A - CALL DBG_CRLF - ; --- LD A,B / SVC #3A (A=channel) --- - LD A,B - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'A' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show channel being sent - CALL DBG_CRLF - POP AF - RST 018H - DB 03AH - ; --- Debug: after SVC #3A --- - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'A' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX - LD A,' ' - OUT (050H),A - LD A,'C' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - JR C,DBG_D3_CY3 - LD A,'0' - JR DBG_D3_CY3D -DBG_D3_CY3: - LD A,'1' -DBG_D3_CY3D: - OUT (050H),A - CALL DBG_CRLF - ; --- POP AF / SVC #39 (A=original from L5882) --- - POP AF - PUSH AF - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'9' - OUT (050H),A - LD A,'b' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show original A being sent - CALL DBG_CRLF - POP AF - RST 018H - DB 039H - ; --- Debug: after final SVC #39 --- - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'9' - OUT (050H),A - LD A,'b' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX - LD A,' ' - OUT (050H),A - LD A,'C' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - JR C,DBG_D3_CY4 - LD A,'0' - JR DBG_D3_CY4D -DBG_D3_CY4: - LD A,'1' -DBG_D3_CY4D: - OUT (050H),A - CALL DBG_CRLF - ; --- Exit marker --- - LD A,'D' - OUT (050H),A - LD A,'3' - OUT (050H),A - LD A,':' - OUT (050H),A - LD A,'X' - OUT (050H),A - CALL DBG_CRLF - ; --- Clean up and return --- - POP AF ; balance the PUSH AF from after L5882 - RET - -; =========================================================================== -; Data area -; =========================================================================== -SDSTARTSEC: DS 4, 000H ; Current sector address for SD_READ (big-endian) -DIRSECBUF: DB 0FFH ; Cached directory sector number (0xFF = none) -FILE_STARTSEC: - DS 4, 000H ; Saved file start sector (absolute, big-endian) -FILE_LOADADDR: - DW 00000H ; Current load address during LOAD transfer -; =========================================================================== -; DBG_L1C5B_WRAP — Wrapper around CALL L1C5B to dump ZFLAG1 before and after. -; This reveals whether L1C5B modifies ZFLAG1 (specifically bit 5). -; Output format: "F1:xx>xx\r\n" where xx=before, xx=after -; =========================================================================== -DBG_L1C5B_WRAP: - PUSH AF - PUSH HL - ; --- Print "F1:" --- - LD A,'F' - OUT (050H),A - LD A,'1' - OUT (050H),A - LD A,':' - OUT (050H),A - ; --- Dump ZFLAG1 before --- - LD A,(ZFLAG1) - CALL DBG_HEX - POP HL - POP AF - ; --- Call the real L1C5B --- - CALL L1C5B - ; --- Save return flags --- - PUSH AF - PUSH HL - ; --- Print ">" --- - LD A,'>' - OUT (050H),A - ; --- Dump ZFLAG1 after --- - LD A,(ZFLAG1) - CALL DBG_HEX - CALL DBG_CRLF - POP HL - POP AF - RET - -; =========================================================================== -; DBG_FLAGS_TEST — Replaces the LD HL,ZFLAG1 / BIT 7 / BIT 5 sequence. -; V1.1Q: Workaround for suspected Z80 emulator bug where AND immediate -; does not correctly set the Z flag (0x5F AND 0x20 = 0x20 yet Z is set). -; Instead of testing ZFLAG1 bit 5, check device name for "$RFS" and force -; the ZINP path directly. This is safe because this code point is only -; reached when A=0 (DIR enumeration) in SVC #39. -; =========================================================================== -DBG_FLAGS_TEST: - LD HL,ZFLAG1 - ; --- Check bit 7 first (error condition, applies to all devices) --- - LD A,(HL) - AND 080H - JR Z,DBG_FT_NO7 - POP DE ; discard CALL return address - JP 01F97H -DBG_FT_NO7: - ; --- Check if this is the $RFS device by name --- - LD A,(ZDEVNM) ; first char of device name - CP 'R' - JR NZ,DBG_FT_NORFS - LD A,(ZDEVNM+1) ; second char - CP 'F' - JR NZ,DBG_FT_NORFS - ; --- This IS $RFS — force ZINP/DIR path --- - PUSH AF - LD A,'R' - OUT (050H),A - LD A,'!' - OUT (050H),A - CALL DBG_CRLF - POP AF - POP DE ; discard CALL return address - JP DBG_BIT5PATH -DBG_FT_NORFS: - ; --- Not $RFS: fall through to ZRO path --- - ; HL = ZFLAG1 (correct for INC HL that follows the NOPs) - RET - -; =========================================================================== -; DBG_BIT5PATH — Replacement for the SVC #39 bit-5 path at 0x2F38. -; Instead of calling through L2FD1 → IOCALL, this calls RFSINP_DIR directly -; to bypass the broken IOCALL dispatch. Also traces the path. -; Original bit-5 path: XOR A / LD HL,L2000 / LD DE,800 / LD BC,10 / CALL L2FD1 -; L2FD1 does TWO ZINP calls: -; 1st: L2FE8 → disk identity (H=0x28) -; 2nd: L2FD4 → DIR fill (H=0x20) -; We replicate both calls directly to RFSINP_DIR. -; =========================================================================== -DBG_BIT5PATH: - ; --- Marker --- - LD A,'B' - OUT (050H),A - LD A,'5' - OUT (050H),A - LD A,':' - OUT (050H),A - CALL DBG_CRLF - ; - ; --- 1st ZINP call: disk identity (H=0x28) --- - LD HL,02800H ; H=0x28 → DISKID path - LD A,(ZCH) ; Channel number - CALL RFSINP_DIR - ; - ; --- 2nd ZINP call: DIR fill (H=0x20) --- - LD HL,L2000 ; H=0x20 → DIR fill - LD A,(ZCH) - CALL RFSINP_DIR - ; - ; --- After both calls, check DIR buffer --- - PUSH HL - PUSH BC - LD A,'D' - OUT (050H),A - LD A,'R' - OUT (050H),A - LD A,'=' - OUT (050H),A - LD HL,L2000 - LD B,008H -DBG_B5DMP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A - INC HL - DJNZ DBG_B5DMP - CALL DBG_CRLF - POP BC - POP HL - ; - ; --- Replicate original return logic --- - ; Original: LD A,(HL) / OR A / JP P,01F70H / RET - ; After L2FD1 returns, HL=0x2000 (restored by wrappers). - ; We set HL=0x2000 explicitly since we bypassed the wrappers. - LD HL,L2000 - LD A,(HL) - OR A - JP P,01F70H - ; - ; Clear DIR_FILLED for next DIR call - XOR A - LD (DIR_FILLED),A - ; - ; Return — will go through SKPDE cleanup from SVC #39 handler - RET - -FILE_SIZE: DW 00000H ; Remaining bytes during LOAD transfer -RFS_LD_A0: DB 000H ; V1.1Y: Entry A for RFSINP_LD (0=SVC #30, else SVC #33) -DIR_BUFPTR: DW 00000H ; Current write position in DIR buffer -FINDSD_NAME:DW 00000H ; Saved filename pointer for FINDSD -SAVE_DIRENT:DB 000H ; Saved directory entry number for SAVE -SAVE_PENDING:DB 000H ; 1 = SAVE in progress, trigger RFSWO on first RFSOUT call -DIR_FILLED: DB 000H ; 1 = DIR buffer filled, next ZINP call is data transfer -SAVE_SP: DW 00000H ; Saved BASIC stack pointer -DIR_ENTRY_IDX: DB 000H ; Current SD directory entry index for RFSRO (0-255) -SECTORBUF: DS 512, 000H ; SD card sector buffer (was EQU 0CE00H, moved here - ; to avoid overlap with BASIC stack at ~0xCFFF) - DS 128, 000H ; Temp stack (64 levels) -TEMP_STACK_TOP: ; SP points here (grows downward) -RFS_END EQU TEMP_STACK_TOP ; End of RFS code = new TEXTST - -EXECSTART: XOR A ; Execution entry point - LD DE,L0000 - CALL TIMST - LD DE,L0000 - LD HL,BASICEND - L0000 - OR A - SBC HL,DE - LD C,L - LD B,H - LD HL,TAPECOPY - OUT (LSE0),A - LDIR - JP L0000 - - DS 0,11 -BASICEND: + INCLUDE "mz5z008.asm" diff --git a/dis/MZ-2Z009E/mz2z009e_dz80.asm b/dis/MZ-2Z009E/mz2z009e_dz80.asm index 4b67352..1434e18 100644 --- a/dis/MZ-2Z009E/mz2z009e_dz80.asm +++ b/dis/MZ-2Z009E/mz2z009e_dz80.asm @@ -159,9 +159,28 @@ BITBUF EQU 08000H IBUFE EQU 010F0H ERRTXT EQU 0FDA0H PRGSTART EQU 00000H + +; =========================================================================== +; Build configuration — set these flags to select the build variant: ; +; BUILD_RFS=0, BUILD_TAPE=0 : Original BASIC (FD boot BIN) +; BUILD_RFS=0, BUILD_TAPE=1 : Original BASIC (Tape/CMT/RFS ROM boot) +; BUILD_RFS=1, BUILD_TAPE=0 : RFS Enhanced BASIC (FD boot BIN) +; BUILD_RFS=1, BUILD_TAPE=1 : RFS Enhanced BASIC (Tape/CMT/RFS ROM boot) +; =========================================================================== +BUILD_RFS EQU 1 ; 0 = original BASIC, 1 = RFS enhancements +BUILD_TAPE EQU 0 ; 0 = FD/BIN, 1 = Tape/CMT/RFS ROM boot + +; Tape/CMT boot constants +ATRB EQU 010F0H ; MZF header location (= ELMD area) +TAPECOPY EQU 01200H ; Load address for tape bootstrap +TIMST EQU 00033H ; Timer stop routine in Monitor ROM +HDRLEN EQU 00040H ; MZF header length (64 bytes) + ; RFS (ROM Filing System) hardware registers and constants +PORT_LODRAM EQU 0E0H ; OUT: map 0000-0FFF to DRAM PORT_DRAM EQU 0E1H ; OUT: map D000-FFFF to DRAM +PORT_LOROM EQU 0E2H ; OUT: map 0000-0FFF to Monitor ROM PORT_MMIO EQU 0E3H ; OUT: map D000-FFFF to VRAM/MMIO/ROM BNKCTRLRST EQU 0EFF8H ; RFS bank control reset register BNKCTRL EQU 0EFFFH ; Bank Control register (CS, CLK bits) @@ -171,6 +190,23 @@ SDCS_ACT EQU 001H ; BNKCTRL: CS LOW (active), BBCLK enable SDCS_DEACT EQU 003H ; BNKCTRL: CS HIGH (inactive), BBCLK enable L8CA0 EQU 08CA0H ; Color attribute buffer address (was DS padding) +; --------------------------------------------------------------------------- +; MZF tape header (only for BUILD_TAPE=1) +; --------------------------------------------------------------------------- + IF BUILD_TAPE = 1 + ORG ATRB +BOOTATRB: DB 001H ; File type: 01 = Machine Code + IF BUILD_RFS = 1 +BOOTNAME: DB "BASIC 2Z-009ERFS", 00DH ; Title (17 bytes + CR) + ELSE +BOOTNAME: DB "BASIC 2Z-009E ", 00DH ; Title (17 bytes + CR) + ENDIF +BOOTSIZE: DW BASICEND - L0000 ; Size of program +BOOTDTADR: DW TAPECOPY ; Load address +BOOTEXADR: DW EXECSTART + TAPECOPY ; Exec address (relocated) +BOOTCOMNT: DS 104 ; Comment area (unused) + ENDIF + ORG PRGSTART L0000: JP L0CAF ; Cold start entry - JP to initialization @@ -466,9 +502,9 @@ L017B: XOR A LD HL,0803EH LD HL,L80F6 L0182: PUSH AF - CALL L0D20 - POP AF - JP RFS_ERR_HOOK + JP RFS_ERR_HOOK ; Hook BEFORE L0D20 (Monitor ROM overlay at 0000-0FFF) + POP AF ; Dead code — original bytes for Monitor ROM compatibility + JP L0000 ; Dead code — original warm restart target ; --------------------------------------------------------------------------- ; SVC Dispatch Table — 80 entries (#00-#4F), each a 16-bit handler address. @@ -3759,8 +3795,8 @@ L1A9B: LD (L1044),HL RET NZ LD A,(L1001) CP 00DH - JP Z,01F9AH - RET + JP Z,BC_ERR_HOOK ; !BC hook: L1F6A cascade path + RET CALL SKPDE CALL L1AEF @@ -3810,7 +3846,7 @@ L1B18: DB 02AH JP NZ,L2B7F LD A,(L1043) BIT 2,A - JP NZ,01F97H + JP NZ,YP_HOOK_A ; !Y source A: L1043 bit2 BIT 1,A LD IX,(ZWO) JR NZ,L1B65 ; (+00bH) @@ -3899,7 +3935,7 @@ L1BEF: LD A,C L1BFD: CALL SKPDE LD A,(L1050) BIT 6,A - JP Z,01F97H + JP Z,YP_HOOK_B ; !Y source B: L1050 bit6=0 CALL 018C7H LD A,(ZDIRMX) LD B,A @@ -4010,7 +4046,7 @@ SVC30_FD: LD BC,(ELMD20) POP BC RET - JP SVC32_DBG ; Was: LD A,(01051H) / BIT 7,A / JP Z,01F97H + JP SVC32_FIX ; Was: LD A,(01051H) / BIT 7,A / JP Z,01F97H NOP ; Padding (original was 8 bytes, now 3+1+1=5+...) NOP NOP @@ -4027,7 +4063,7 @@ SVC30_FD: LD BC,(ELMD20) L1CE4: CALL L1D15 JP NZ,L2AE0 BIT 7,A - JP NZ,01F97H + JP NZ,YP_HOOK_C ; !Y source C: device setup bit7 PUSH DE LD HL,L0200 LD (L1042),HL @@ -4056,12 +4092,12 @@ L1D15: LD A,(L1050) CALL L1C5B LD HL,L1050 BIT 7,(HL) - JP NZ,01F97H + JP NZ,YP_HOOK_D ; !Y source D: L1050 bit7 BIT 5,(HL) JP NZ,RFS_BIT5PATH INC HL BIT 7,(HL) - JP NZ,01F97H + JP NZ,YP_HOOK_E ; !Y source E: L1051 bit7 LD HL,L2000 LD BC,00008H L1D43: CALL ?CLRHL @@ -4101,7 +4137,7 @@ L1D6B: LD (01E13H),A CALL L1D15 LD IX,(ZFREE) JR Z,L1D95 ; (+004H) - LD IX,L2F4B + LD IX,RFS_FREE_HOOK L1D95: CALL IOCALL JR C,L1DA8 ; (+00eH) LD H,B @@ -4761,7 +4797,7 @@ L2B51: CALL SKPDE JP L2E77 L2B6A: CALL L1D15 - JP Z,01F97H + JP Z,YP_HOOK_F ; !Y source F: L1D15 bit5=0 CALL L2E36 CALL 02F38H LD A,(HL) @@ -5369,7 +5405,7 @@ L2F4B: PUSH HL JP L368D L2F6E: CALL L1D15 - JP Z,01F97H + JP Z,SVC2F_YP_DBG ; Was: JP Z,01F97H — hook to trace !Y cause POP HL CALL LDDEMI LD (02FB1H),HL @@ -5420,7 +5456,7 @@ L2FC9: PUSH HL RET L2FCF: OR 0AFH -L2FD1: CALL L2FE8 +L2FD1: CALL L2FE8 ; Patched at runtime by L4000 cold start → CALL L2FE8_FIX L2FD4: CALL SKPDE OR A LD IX,(ZINP) @@ -5616,10 +5652,8 @@ L3153: LD (03109H),SP LD A,B OR C JR Z,L3107 ; (-05cH) - CALL RFS_LOAD_HOOK ; Was: CALL L32CB / CALL L3174 - NOP - NOP - NOP + CALL L32CB + CALL L3174 DI OUT (LSE4),A CALL NC,L065B @@ -6643,7 +6677,12 @@ L389B: CALL L388D RET ; $QD - Quick Disk device descriptor (29 bytes) -$QD: DW $RFS ; Next device = $RFS (was $USR) +$QD: + IF BUILD_RFS = 1 + DW $RFS ; Next device = $RFS (RFS enhanced) + ELSE + DW $USR ; Next device = $USR (original) + ENDIF DB "QD",000H,000H ; Device name DB 05FH ; flags1 DB 040H ; flags2 @@ -7744,7 +7783,12 @@ L3FDB: POP HL RET DS 33, 000H -L4000: LD HL,RFS_END ; Was L85FE; now points past RFS code +L4000: + IF BUILD_RFS = 1 + LD HL,RFS_END ; TEXTST: moved past RFS module + ELSE + LD HL,085FEH ; TEXTST: original end of BASIC code + ENDIF LD (L1070),HL LD HL,L4052 LD (000E3H),HL @@ -7763,7 +7807,13 @@ L401B: LD A,(L0036) L4027: LD DE,L84E0 RST 018H L402B: DB 005H - JP MEMCLI_PATCH ; Was: RST 018H / DB 020H / EX DE,HL + IF BUILD_RFS = 1 + JP MEMCLI_PATCH ; RFS: call SVC 020H then set HL=RFS_END + ELSE + RST 018H ; Original: SVC 020H (boot beep + EI) + DB 020H + EX DE,HL + ENDIF L402F: LD (HL),000H INC HL LD A,H @@ -9335,24 +9385,13 @@ L4B4E: LD A,L DB 005H RET -L4B5C: JR NZ,04BA7H ; (+049H) - LD C,(HL) - JR NZ,L4B61 ; (+000H) -L4B61: LD B,D - DEC B - LD D,D - LD B,L - LD B,C - LD C,E - NOP -L4B68: LD D,D - DEC B - LD B,L - LD B,C - LD B,H - LD E,C -L4B6E: NOP - NOP +L4B5C: DB 020H,049H,04EH,020H,000H ; " IN \0" — error location text +L4B61: DB 042H,005H ; "B\x05" — control prefix + DB 052H,045H,041H,04BH,000H ; "REAK\0" — BREAK message +L4B68: DB 052H,005H ; "R\x05" — control prefix + DB 045H,041H,044H,059H ; "EADY" — Ready prompt +L4B6E: DB 000H ; NUL terminator + DB 000H ; padding L4B70: CALL L6E43 DEC A CP 046H @@ -11764,11 +11803,11 @@ L5C86: PUSH HL LD (L1014),HL LD A,(L1001) CP 00DH - JP Z,04B46H + JP Z,BC_ERR_HOOK ; !BC hook: dump ELMD before error 0xBC RST 018H DB 031H POP HL - RET + RET L5CB3: CALL TESTX DB 041H @@ -12415,54 +12454,21 @@ L60E3: CCF LD HL,L0000 RET -L60E8: SBC A,E - LD A,0BCH - JR NZ,L60ED ; (+000H) -L60ED: SBC A,B - JR L6086 ; (-06aH) - - ADD A,B - NOP - SUB H - LD (HL),H - INC H - NOP - NOP - SUB C - LD B,E - LD D,B - NOP - NOP - ADC A,(HL) - INC E - LD B,B - NOP - NOP - ADC A,D - LD A,D - NOP - NOP - NOP - ADD A,A - LD C,B - NOP - NOP - NOP -L610B: ADD A,H - JR NZ,L610E ; (+000H) -L610E: NOP - NOP -L6110: ADD A,C - NOP - NOP - NOP - NOP - LD A,L - LD C,H - CALL Z,0CDCCH -L611A: LD H,(HL) - DEC HL - CALL Z,L1277 +; --------------------------------------------------------------------------- +; Floating-point constant table — powers of 10 for number formatting +; Each entry is 5 bytes (1 exponent + 4 mantissa) in Sharp MZ FP format +; --------------------------------------------------------------------------- +L60E8: DB 09BH,03EH,0BCH,020H,000H ; FP 10^9 +L60ED: DB 098H,018H,096H,080H,000H ; FP 10^8 + DB 094H,074H,024H,000H,000H ; FP 10^7 + DB 091H,043H,050H,000H,000H ; FP 10^6 + DB 08EH,01CH,040H,000H,000H ; FP 10^5 + DB 08AH,07AH,000H,000H,000H ; FP 10^4 + DB 087H,048H,000H,000H,000H ; FP 10^3 +L610B: DB 084H,020H,000H,000H,000H ; FP 10^2 +L6110: DB 081H,000H,000H,000H,000H ; FP 10^1 + DB 07DH,04CH,0CCH,0CCH,0CDH ; FP 0.1 +L611A: DB 066H,02BH,0CCH,077H,012H ; FP precision guard L611F: LD HL,(L6302) LD B,000H L6124: LD DE,L610B @@ -14961,11 +14967,7 @@ L7181: LD A,005H LD DE,L719B JP L797E -L719B: SUB C - NOP - NOP - NOP - NOP +L719B: DB 091H,000H,000H,000H,000H ; FP constant (65536.0) L71A0: CALL L5E76 LD BC,(TMPEND) PUSH BC @@ -17277,10 +17279,8 @@ L7F67: LD DE,L7F8A CALL L797E JP L7D97 -L7F8A: LD A,A - LD D,H - INC DE - CALL Z,0C5D0H +L7F8A: DB 07FH,054H,013H,0CCH,0D0H ; FP constant (used by EXP/LOG) + PUSH BC ; *** was misaligned: disassembler consumed D0+C5 as CALL Z *** PUSH HL CALL L7DB1 POP HL @@ -17451,118 +17451,36 @@ L80CB: CALL L7FCB POP BC RET -L80E0: LD A,(HL) -L80E1: XOR D - XOR D - XOR D - XOR E - LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C - LD (HL),H - RET NC - DEC C - NOP - RET NC - LD L,(HL) - JR C,L80E1 ; (-011H) - DEC E - DEC HL - LD H,A - RST 010H -L80F6: LD (L402B),A - LD H,B - JR NC,L808E ; (-06eH) - JR NC,L809B ; (-063H) - LD E,B - RST 010H - CCF - SBC A,A - LD A,(04A50H) - SUB (HL) - DEC SP - ADD A,D -L8108: ADD A,B - ADD A,B - NOP - NOP - NOP - LD A,H - LD HL,(0AAAAH) - XOR E - LD (HL),A - OR (HL) - DEC BC - LD H,B - OR (HL) - LD (HL),C - LD D,B - DEC C - NOP - RET NC - LD L,E - SUB E - JP P,0BC7DH - LD H,H - RRCA - HALT - RST 000H -L8125: ADD A,B - LD E,H - RET - -L8128: RES 4,L - LD B,(HL) - LD D,H - LD D,A - CCF - SBC A,A - LD A,(0AA7FH) - XOR D - XOR D - XOR E - LD A,(HL) - LD C,H - CALL Z,0CDCCH - LD A,(HL) - SUB D - LD C,C - INC H - SUB D - LD A,L - LD H,E - ADC A,(HL) - JR C,L8128 ; (-01cH) - LD A,L - CP D - LD L,08BH - AND E - LD A,L - DEC E - ADC A,C - RET C - SBC A,(HL) - LD A,L - ADC A,B - ADC A,B - ADC A,B - ADC A,C - LD A,H - LD (HL),B - RET P - RET P - POP AF - LD A,H - RST 010H - SUB H - DEC (HL) - PUSH HL - LD A,H - LD B,E - INC C - JR NC,L8125 ; (-03dH) +; --------------------------------------------------------------------------- +; Floating-point polynomial coefficient tables for transcendental functions +; (SIN, COS, TAN, ATN, LOG, EXP, SQR). 5 bytes per FP constant. +; --------------------------------------------------------------------------- +L80E0: DB 07EH,0AAH,0AAH,0AAH,0ABH ; SIN/COS coeff 0 + DB 07AH,008H,088H,088H,089H ; SIN/COS coeff 1 + DB 074H,0D0H,00DH,000H,0D0H ; SIN/COS coeff 2 +L80EF: DB 06EH,038H,0EFH,01DH,02BH ; SIN/COS coeff 3 + DB 067H,0D7H,032H,02BH,040H ; SIN/COS coeff 4 +L80F6: DB 060H,030H,092H,030H,09DH ; SIN/COS coeff 5 + DB 058H,0D7H,03FH,09FH,03AH ; SIN/COS coeff 6 + DB 050H,04AH,096H,03BH,082H ; SIN/COS coeff 7 +L8108: DB 080H,080H,000H,000H,000H ; FP 1.0 + DB 07CH,02AH,0AAH,0AAH,0ABH ; TAN coeff 0 + DB 077H,0B6H,00BH,060H,0B6H ; TAN coeff 1 + DB 071H,050H,00DH,000H,0D0H ; TAN coeff 2 + DB 06BH,093H,0F2H,07DH,0BCH ; TAN coeff 3 + DB 064H,00FH,076H,0C7H,080H ; TAN coeff 4 +L8125: DB 05CH,0C9H,0CBH,0A5H,046H ; TAN coeff 5 +L8128: DB 054H,057H,03FH,09FH,03AH ; ATN coeff 0 + DB 07FH,0AAH,0AAH,0AAH,0ABH ; ATN coeff 1 + DB 07EH,04CH,0CCH,0CCH,0CDH ; ATN coeff 2 + DB 07EH,092H,049H,024H,092H ; ATN coeff 3 + DB 07DH,063H,08EH,038H,0E4H ; ATN coeff 4 + DB 07DH,0BAH,02EH,08BH,0A3H ; ATN coeff 5 + DB 07DH,01DH,089H,0D8H,09EH ; ATN coeff 6 + DB 07DH,088H,088H,088H,089H ; ATN coeff 7 + DB 07CH,070H,0F0H,0F0H,0F1H ; ATN coeff 8 + DB 07CH,0D7H,094H,035H,0E5H ; ATN coeff 9 + DB 07CH,043H,00CH,030H,0C3H ; ATN coeff 10 LD DE,L0000 LD A,(HL) OR A @@ -17584,22 +17502,12 @@ L817D: PUSH BC POP BC RET -L8183: ADD A,E - LD C,C - RRCA - JP C,082A2H - LD C,C - RRCA - JP C,L81A2 - LD C,C - RRCA - JP C,080A2H - LD C,C - RRCA - JP C,L7BA2 - LD C,FDPC - DEC (HL) - INC DE +; FP constants for LOG/EXP computation +L8183: DB 083H,049H,00FH,0DAH,0A2H ; FP log2(e) + DB 082H,049H,00FH,0DAH,0A2H ; FP constant + DB 081H,049H,00FH,0DAH,0A2H ; FP constant + DB 080H,049H,00FH,0DAH,0A2H ; FP constant + DB 07BH,00EH,0FAH,035H,013H ; FP ln(2) PUSH HL CALL L60B5 LD A,000H @@ -17931,97 +17839,34 @@ L8399: CALL L7BAC POP BC RET -L83F1: NOP -L83F2: LD A,A - LD E,(HL) - LD E,E - RET C - XOR C -L83F7: LD A,A - LD C,H - CALL Z,0CDCCH -L83FC: ADD A,C - LD D,L - LD D,L - LD D,L - LD D,(HL) -L8401: ADD A,C - DEC (HL) - INC B - DI - INC (HL) - ADD A,C - JR L8440 ; (+037H) - - RET P - LD D,D - ADD A,C - DEC BC -L840D: SUB L - POP BC - CALL PO,00581H - XOR D - JP 08168H - - LD (BC),A - CALL 09986H - ADD A,C - LD BC,0D164H - CALL P,L0081 - OR C - IN D,(C) - ADD A,C - NOP - LD E,B - RST 010H - OUT (080H),A - DEC (HL) - INC B - DI - INC (HL) - ADD A,B - LD D,A - LD B,H - CALL M,L80CB - LD L,D - RET NZ - ADD A,0E8H - ADD A,B - LD (HL),L - DEC H - LD A,L - LD D,080H - LD A,D - ADD A,E -L8440: OR D - CALL C,07D80H - LD A,00CH - DEC C - ADD A,B - LD A,(HL) - SBC A,(HL) - LD DE,0805DH - LD A,A - LD C,(HL) - BIT 3,D -L8451: LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C -L8456: ADD A,B - LD SP,L1772 - RET M -L845B: ADD A,B - LD SP,L1772 - RET M -L8460: ADD A,C - JR C,L840D ; (-056H) - DEC SP - LD HL,(03180H) - LD (HL),D - RLA - RET M +L83F1: DB 000H ; Exponent work variable +; --------------------------------------------------------------------------- +; Floating-point polynomial coefficient tables for SQR, LOG, EXP functions +; --------------------------------------------------------------------------- +L83F2: DB 07FH,05EH,05BH,0D8H,0A9H ; 1/sqrt(2) approx +L83F7: DB 07FH,04CH,0CCH,0CCH,0CDH ; log10(2) approx +L83FC: DB 081H,055H,055H,055H,056H ; Coeff +L8401: DB 081H,035H,004H,0F3H,034H ; LOG poly coeff 0 + DB 081H,018H,037H,0F0H,052H ; LOG poly coeff 1 + DB 081H,00BH,095H,0C1H,0E4H ; LOG poly coeff 2 + DB 081H,005H,0AAH,0C3H,068H ; LOG poly coeff 3 + DB 081H,002H,0CDH,086H,099H ; LOG poly coeff 4 + DB 081H,001H,064H,0D1H,0F4H ; LOG poly coeff 5 + DB 081H,000H,0B1H,0EDH,050H ; LOG poly coeff 6 + DB 081H,000H,058H,0D7H,0D3H ; LOG poly coeff 7 + DB 080H,035H,004H,0F3H,034H ; EXP poly coeff 0 + DB 080H,057H,044H,0FCH,0CBH ; EXP poly coeff 1 + DB 080H,06AH,0C0H,0C6H,0E8H ; EXP poly coeff 2 + DB 080H,075H,025H,07DH,016H ; EXP poly coeff 3 + DB 080H,07AH,083H,0B2H,0DCH ; EXP poly coeff 4 + DB 080H,07DH,03EH,00CH,00DH ; EXP poly coeff 5 + DB 080H,07EH,09EH,011H,05DH ; EXP poly coeff 6 + DB 080H,07FH,04EH,0CBH,05AH ; EXP poly coeff 7 +L8451: DB 07AH,008H,088H,088H,089H ; SQR constant +L8456: DB 080H,031H,072H,017H,0F8H ; SQR constant +L845B: DB 080H,031H,072H,017H,0F8H ; SQR constant +L8460: DB 081H,038H,0AAH,03BH,02AH ; SQR constant + DB 080H,031H,072H,017H,0F8H ; SQR constant L846A: DS 2, 000H L846C: DS 2, 000H L846E: DS 4, 000H @@ -18065,7 +17910,7 @@ L84E0: DB 016H DS 2, 030H DB 039H L852E: DS 2, 020H - DB "V1.0Q ",00DH + DB "V1.1T ",00DH DS 3, 020H DB 043H,005H,"OPYRIGHT ",006H,"(C) 1984 ",005H,"BY ",006H,"SHARP ",005H,"CORP." DS 5, 020H @@ -18111,6 +17956,13 @@ L852E: DS 2, 020H DS 2, 045H DS 2, 00DH DS 93, 000H + IF BUILD_RFS = 0 +; Dummy EQUs for BUILD_RFS=0: labels referenced from conditional hooks +; but defined inside the RFS module. Never called when BUILD_RFS=0. +$RFS EQU $USR + ENDIF + + IF BUILD_RFS = 1 ; =========================================================================== ; RFS (ROM Filing System) support for MZ-2Z009E Disk BASIC ; Version 1.0B - March 2026 @@ -18126,7 +17978,7 @@ L852E: DS 2, 020H ; --------------------------------------------------------------------------- $RFS: DW $USR ; Next device = $USR DB "RFS",000H ; Device name "RFS" - DB 05FH ; flags1: bit5=0 sequential, bit6=1 ZRO-based DIR + DB 05FH ; flags1: bit5=1 block device, bit6=1 ZRO-based DIR DB 007H ; flags2 DB 0FFH ; dirmx: 255 max directory entries DW RFSINIT ; ZINIT handler @@ -18493,36 +18345,29 @@ RFSRO_END: ; --------------------------------------------------------------------------- ; RFSINP_DIR - ZINP handler for $RFS device -; With sequential protocol (flags1 bit5=0), this is ONLY called from -; SVC #30's sequential path for data transfer. DIR uses RFSRO (ZRO). -; Dispatches directly to RFSINP_LD to load file data from SD. +; Called from multiple paths: +; - SVC#2F dir search (02F38H) with H>=28H for disk ID check +; - SVC#2F dir search (02F38H) with H<28H for directory entry read +; - SVC#39 via RFS_BIT5PATH with H=20H for DIR enumeration +; - (SVC#30 no longer reaches here — RFS_SVC30_HOOK calls RFSINP_LD directly) +; Dispatch: +; H >= 28H → RFSINP_DISKID (returns valid-disk marker at L2800) +; H < 28H, DIR_FILLED=0 → fill DIR buffer at L2000 +; H < 28H, DIR_FILLED=1 → RET (buffer already filled, NOP for remaining iterations) ; --------------------------------------------------------------------------- RFSINP_DIR: - ; Debug: trace every ZINP call — show H register + ; Debug: entry marker "D" PUSH AF - LD A,'Z' + LD A,'D' OUT (050H),A - LD A,H - CALL DBG_HEX - LD A,' ' - OUT (050H),A - LD A,(ZCH) - CALL DBG_HEX - CALL DBG_CRLF POP AF - ; - ; $RFS is a sequential device (flags1 bit5=0). RFSINP_DIR is only - ; called from SVC #30's sequential path for data transfer, so always - ; go directly to RFSINP_LD. (DIR uses RFSRO via ZRO, not ZINP.) - JP RFSINP_LD - ; - ; --- Dead code below (block-device dispatch, kept for reference) --- + ; Dispatch based on H and DIR_FILLED state LD A,H CP 028H JP NC,RFSINP_DISKID LD A,(DIR_FILLED) OR A - JP NZ,RFSINP_LD + RET NZ ; DIR already filled — NOP for remaining SVC#2F iterations ; DIR mode: enumerate files into 0x2000 buffer PUSH HL PUSH DE @@ -18581,27 +18426,19 @@ RDIR_DONE: CALL MMIO_OFF RET ; --------------------------------------------------------------------------- -; RFSINP_DISKID - Identity read: fill L2800-L28FF with zeros except byte 0 -; Byte 0 at L2800 is set to 080H (bit 7 = valid disk marker) so that -; 02F38H's identity check (LD A,(HL) / OR A / JP P,error) passes. +; RFSINP_DISKID - Identity read: fill L2800-L28FF with zeros +; All-zero is safe: L2E67's JP M check passes (bit7=0), and L2E36's +; bitmask comparison (CPL/AND) produces 0 for every byte. +; RFS_BIT5PATH sets L2800[0]=0x80 separately before the DIR fill call. ; --------------------------------------------------------------------------- RFSINP_DISKID: - ; Debug: identity read - PUSH AF - LD A,'I' - OUT (050H),A - LD A,'D' - OUT (050H),A - CALL DBG_CRLF - POP AF - ; PUSH HL PUSH DE PUSH BC LD HL,02800H LD DE,02801H LD BC,000FFH - LD (HL),080H ; Bit 7 set = valid disk marker for 02F38H + LD (HL),000H ; Zero-fill: safe for L2E67 and L2E52 LDIR POP BC POP DE @@ -18673,8 +18510,16 @@ RLD_FOUND: CALL DBG_CRLF OUT (PORT_MMIO),A POP AF - ; HL = directory entry; skip to START_SECTOR - LD DE,19 + ; HL = directory entry + ; Read file type from SD entry (offset 1) and update ELMD + INC HL ; HL = entry + 1 = type byte + LD A,(HL) + CP 005H + JR NZ,RLD_TYPOK + LD A,002H ; SD type 5 → MZ type 2 (BASIC) +RLD_TYPOK: LD (ELMD),A ; Update ELMD[0] with actual file type + ; Skip to START_SECTOR (entry + 19; we're at entry + 1) + LD DE,18 ADD HL,DE ; Copy 4-byte start sector LD DE,FILE_STARTSEC @@ -18692,22 +18537,25 @@ RLD_FOUND: INC DE LD A,(HL) LD (DE),A - ; Read SIZE and DTADR from SD entry + ; Read SIZE from SD entry and update ELMD20 INC HL LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (FILE_SIZE),HL + LD (ELMD20),HL ; Update ELMD with actual file size EX DE,HL + ; Read DTADR from SD entry and update ELMD22 INC HL LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (FILE_LOADADDR),HL + LD (ELMD22),HL ; Update ELMD with actual DTADR ; For BASIC (type 2), override load addr with TEXTST - LD A,(ELMD) + LD A,(ELMD) ; Now reads correct type (set above) CP 002H JR NZ,RLD_NORLOC LD HL,(TEXTST) @@ -19177,7 +19025,18 @@ CE_NM1: LD (DE),A ; MEMCLI_PATCH - Trampoline for memory clear init ; Original: RST 018H / DB 020H / EX DE,HL ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) MEMCLI_PATCH: + IF BUILD_RFS = 1 + ; Runtime patch: L2FD1 must call L2FE8_FIX instead of L2FE8. + ; Binary keeps original bytes (CD E8 2F) at 0x2FD1 so the LOAD + ; from MZ-5Z008 doesn't corrupt its own L2FD1 mid-transfer. + ; We patch here because cold start runs ONCE after full load. + LD A,L2FE8_FIX & 0FFH ; Low byte of L2FE8_FIX address + LD (L2FD1+1),A ; Patch CALL operand low byte + LD A,L2FE8_FIX >> 8 ; High byte + LD (L2FD1+2),A ; Patch CALL operand high byte + ; RST 018H DB 020H ; SVC 020H: boot beep + EI LD HL,RFS_END @@ -19186,11 +19045,14 @@ MEMCLI_PATCH: ; --------------------------------------------------------------------------- ; RFS_ERR_HOOK - Debug: show error code before BASIC warm restart ; A = error code from error table (L1F6A or L4AE6) +; NOTE: L0182 must JP here BEFORE calling L0D20, because L0D20 maps +; Monitor ROM at 0000-0FFF which overlays L0182's code. The original +; JP RFS_ERR_HOOK at 0x0187 was invisible (Monitor ROM's JP L0000 ran). ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) RFS_ERR_HOOK: - PUSH AF - PUSH HL - PUSH AF + IF BUILD_RFS = 1 + ; AF on stack from L0182's PUSH AF LD A,'!' OUT (050H),A LD A,'E' @@ -19198,51 +19060,28 @@ RFS_ERR_HOOK: LD A,':' OUT (050H),A POP AF - CALL DBG_HEX - ; Output stack return addresses: SP+4 (first return addr), SP+6 (second) - ; Stack now: [HL, AF, ret1, ret2, ...] - ; SP SP+2 SP+4 SP+6 - LD A,' ' - OUT (050H),A - LD A,'S' - OUT (050H),A - LD HL,(00004H) ; can't use this... - ; Use SP-relative addressing: SP currently points to pushed HL - ; ret1 is at SP+4, ret2 at SP+6 - LD HL,00004H - ADD HL,SP ; HL = address of ret1 on stack - LD A,(HL) - INC HL - PUSH AF ; save low byte - LD A,(HL) ; high byte of ret1 - CALL DBG_HEX - POP AF - CALL DBG_HEX - LD A,' ' - OUT (050H),A - LD HL,00006H - ADD HL,SP ; HL = address of ret2 on stack - LD A,(HL) - INC HL PUSH AF - LD A,(HL) - CALL DBG_HEX - POP AF CALL DBG_HEX CALL DBG_CRLF - POP HL - POP AF - JP L0000 + CALL L0D20 ; Bank reset (maps Monitor ROM at 0000-0FFF) + JP 00186H ; Jump to Monitor ROM's handler (POP AF + JP L0000) ; --------------------------------------------------------------------------- ; SVC30_DBG - Debug wrapper for SVC #30 handler ; Shows L1050 (device flags) and ZINP for every SVC #30 call, then dispatches. ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) SVC30_DBG: - ; Original logic: CALL L1D15 + JP NZ,RFS_SVC30_HOOK - CALL L1D15 - JP NZ,RFS_SVC30_HOOK - JP SVC30_FD + IF BUILD_RFS = 1 + ; Check ZINP high byte for $RFS + LD A,(ZINP+1) + CP 080H ; RFS handlers are at >= 0x8000 + JP NC,RFS_SVC30_HOOK ; $RFS + ; Not $RFS: use flags1 bit5 for block-device detection + LD A,(L1050) ; flags1 + AND 020H ; bit5 = block device + JP Z,SVC30_FD ; not block device → direct IOCALL + JP L2AD2 ; $FD/$QD block device ; --------------------------------------------------------------------------- ; RFS_BIT5PATH - Block-device DIR handler for $RFS @@ -19250,82 +19089,116 @@ SVC30_DBG: ; RFSINP_DIR because L2FD1 always calls ZINP with HL=L2800 (H>=28H), ; which triggers RFSINP_DISKID instead of the DIR fill path. ; For non-$RFS block devices ($FD/$QD), falls through to the original path. +; Detects $RFS by device name (ZDEVNM), not flags — $QD also has 0x5F. ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) RFS_BIT5PATH: - ; Check if current device is $RFS - PUSH HL - LD HL,(ZINP) - LD DE,RFSINP_DIR - OR A - SBC HL,DE - POP HL - JP NZ,02F38H ; Not $RFS → original block-device path + IF BUILD_RFS = 1 + ; Detect $RFS by device name (flags1 bits 5+6 cannot distinguish + ; $QD from $RFS — both have 0x5F). Same approach as MZ-5Z008. + LD A,(ZDEVNM) ; First char of device name + CP 'R' + JP NZ,02F38H ; Not 'R' → not $RFS → original path + LD A,(ZDEVNM+1) ; Second char + CP 'F' + JP NZ,02F38H ; Not 'F' → not $RFS → original path ; - ; $RFS custom DIR handler: - ; 1. Set L2800[0]=0x80 (valid disk marker for caller's check) - LD A,080H - LD (02800H),A - ; 2. Fill DIR buffer at L2000 (H=0x20 triggers DIR fill) - LD HL,L2000 + ; $RFS custom DIR handler — replicates the TWO ZINP calls that the + ; standard 02F38H→L2FD1 path makes (L2FE8 identity + L2FD4 DIR fill). + ; MZ-5Z008 DBG_BIT5PATH does exactly this. + ; + ; 1st ZINP call: disk identity (H=0x28 → RFSINP_DISKID → zeros L2800) + LD HL,02800H ; H=0x28 triggers DISKID path LD A,(ZCH) - OR 001H ; Ensure A is non-zero (avoids RFSINP_LD dispatch) CALL RFSINP_DIR - ; 3. Clear DIR_FILLED so next DIR re-enumerates - XOR A - LD (DIR_FILLED),A - ; 4. Set HL=L2000 and check first byte (original returns HL=L2800 - ; but we use L2000 where DIR data lives) + ; + ; 2nd ZINP call: DIR fill (H=0x20 → fills L2000-L27FF) + LD HL,L2000 ; H=0x20 triggers DIR fill path + LD A,(ZCH) + CALL RFSINP_DIR + ; + ; Check DIR buffer and clean up (same as MZ-5Z008 DBG_BIT5PATH) LD HL,L2000 LD A,(HL) OR A JP P,01F70H ; If bit7=0 → no entries (error) - RET + ; Clear DIR_FILLED so next DIR re-enumerates + XOR A + LD (DIR_FILLED),A + ; Reset FDC to known state after MMIO bank switching. + ; L2D08 normally calls L368D for $FD cleanup, but skips it when + ; L1044=$RFS. The MMIO OUT(E3H)/OUT(E1H) bank switch during + ; RFSINP_DIR may leave the emulated FDC I/O ports in an undefined + ; state. L368D resets FDC select ports (DC/DD/DE) to 0 and clears + ; L35B5, ensuring the next FD access does a full identity check. + JP L368D ; XOR A + L361C(OUT DC/DD/DE) + LD (L35B5),A + RET ; --------------------------------------------------------------------------- -; RFS_SVC30_HOOK - Intercept SVC #30 block-device read for $RFS -; SVC #30's block device path (L2AD2) calls 02FD0H → L2FE8 which sets -; HL=L2800 (H>=28H). IOCALL → RFSINP_DIR then sees H>=28H and takes -; the RFSINP_DISKID path (zeros L2800), never reaching RFSINP_LD. -; Fix: if ZINP = RFSINP_DIR, call RFSINP_LD directly and RET to SVC. -; For all other block devices ($FD/$QD), fall through to original L2AD2. +; RFS_SVC30_HOOK - Direct RFSINP_LD call for $RFS +; Device already identified as $RFS by bit6 test in SVC30_DBG. +; Calls RFSINP_LD directly (the SVC#30 block path would go through +; L2AD2 → L2FE8 → IOCALL → RFSINP_DIR with H>=28H → RFSINP_DISKID, +; which zeros L2800 instead of loading the file). ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) RFS_SVC30_HOOK: - PUSH HL - LD HL,(ZINP) - PUSH DE - LD DE,RFSINP_DIR - OR A - SBC HL,DE - POP DE - POP HL - JP NZ,L2AD2 ; Not $RFS → original block device path + IF BUILD_RFS = 1 ; $RFS: call RFSINP_LD directly (A=0 for read) + ; RFSINP_LD updates ELMD[0], ELMD20, ELMD22 from SD entry. XOR A CALL RFSINP_LD + JR C,SH_FAIL ; RFSINP_LD failed → don't patch stack + ; + ; Fix stacked file size for L5C0F. + ; L5C0F pushed BC=ELMD20 (was 0) BEFORE SVC#30. + ; RFSINP_LD wrote the actual size to ELMD20. + ; Stack: SP → [ret_addr, old_BC=0, ...]. Patch old_BC. + POP HL ; HL=ret_addr, SP → [old_BC, ...] + EX (SP),HL ; HL=old_BC, SP → [ret_addr, ...] + LD HL,(ELMD20) ; HL=actual file size + EX (SP),HL ; HL=ret_addr, SP → [actual_size, ...] + PUSH HL ; SP → [ret_addr, actual_size, ...] + JR SH_CLEANUP +SH_FAIL: +SH_CLEANUP: + ; Cleanup after RFS LOAD (success or fail): + ; 1. Clear L1FC0 dirty flag — prevents L1FAB infinite loop. + ; 2. Set SAVE_PENDING=1 — prevents spurious RFSDOWRITE. + XOR A + LD (L1FC0),A + LD A,001H + LD (SAVE_PENDING),A RET ; --------------------------------------------------------------------------- -; RFS_LOAD_HOOK - Trampoline for L3153 data transfer -; Checks if current device is $RFS; if so, uses RFSINP_LD. +; L2FE8_FIX - Skip FD-specific identity check for $RFS in L2FD1 +; L2FE8 calls IOOUT→L2D62(SVC#29 seek)→L2E36(identity check), all of which +; operate on FD hardware state (L35B5, track positioning, disk identity at +; L2800). For $RFS, these are meaningless and leave stale FD state that +; corrupts the next LOAD "FD1:" after DIR "RFSx:". +; By returning immediately for $RFS, L2FD1 skips straight to L2FD4 (ZINP +; dispatch) which calls RFSINP_DIR for the DIR fill — exactly what's needed. ; --------------------------------------------------------------------------- -RFS_LOAD_HOOK: - LD HL,(ZINP) - PUSH DE - LD DE,RFSINP_DIR - OR A - SBC HL,DE - POP DE - JR Z,RFLH_RFS - ; Not $RFS — call original FD/QD transfer - CALL L32CB - JP L3174 -RFLH_RFS: CALL RFSINP_LD - JP L3101 ; Standard cleanup path (matches MZ-5Z008) + ENDIF ; (Glass: label outside IF) +L2FE8_FIX: + IF BUILD_RFS = 1 + PUSH AF ; MUST preserve A (caller set A=0 for ZINP select + ; at L2FD4; IOOUT saves/restores AF via trampoline) + LD A,(ZINP+1) ; High byte of current ZINP handler + CP 080H ; RFS handlers are at >= 0x8000 + JR NC,L2FE8_SKIP ; $RFS → skip identity check + POP AF ; Restore A=0 for IOOUT save + JP L2FE8 ; $FD/$QD → original identity check path +L2FE8_SKIP: + POP AF ; Restore A + RET ; $RFS → return to L2FD4 (skip L2FE8 entirely) ; --------------------------------------------------------------------------- ; RFS_DIR_FIX - Advance HL past ':' for DIR device-name parsing ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) RFS_DIR_FIX: + IF BUILD_RFS = 1 LD DE,DEVNAMEBUF INC HL JP L596B @@ -19334,7 +19207,9 @@ RFS_DIR_FIX: ; RFS_DIR_STR - Handle string expressions in DIR for device names ; Called instead of L6E67 to properly parse "RF1:" strings ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) RFS_DIR_STR: + IF BUILD_RFS = 1 CALL L6E67 ; Evaluate string expr. B=strlen, DE=strptr PUSH HL EX DE,HL @@ -19360,66 +19235,141 @@ DSTR_DONE: LD DE,DEVNAMEBUF RET ; --------------------------------------------------------------------------- -; SVC32_DBG - Debug wrapper for SVC #32 (file data transfer) -; Outputs "S32 L1050=xx L1051=yy" then executes original SVC #32 logic. +; SVC32_FIX - Fixed SVC #32 (file data transfer) +; Original code only supported CMT (checks L1051 bit7). Block devices +; (FD, QD, RFS) have bit7=0 and always failed with !Y error. +; Fix: call ZINP directly via IOCALL, bypassing L2FE8 sector management. +; L2FE8's L2D62→L2E36 chain repositions the FD driver to directory sectors +; (via SVC#29), corrupting the file data position set by SVC#2F. +; HL (load address) passes through IOCALL to ZINP as the buffer address. +; DE=file size, BC=sector position from ELMD area (set by SVC#2F). +; L2D08 cleanup is essential: clears L1FC0, closes channels. Without it, +; L1FAB sees dirty L1FC0 and tries SVC#2E write-back → WRITE_SECTOR hang. ; --------------------------------------------------------------------------- -SVC32_DBG: - PUSH AF - PUSH HL - LD A,'S' - OUT (050H),A - LD A,'3' - OUT (050H),A - LD A,'2' - OUT (050H),A - LD A,' ' - OUT (050H),A - ; Output L1050 (flags1) - LD A,(L1050) - CALL DBG_HEX - LD A,',' - OUT (050H),A - ; Output L1051 (flags2) - LD A,(01051H) - CALL DBG_HEX - LD A,',' - OUT (050H),A - ; Output L1044 (device pointer) - LD HL,(L1044) - LD A,H - CALL DBG_HEX - LD A,L - CALL DBG_HEX - CALL DBG_CRLF - POP HL - POP AF - ; Original SVC #32 logic + ENDIF ; (Glass: label outside IF) +SVC32_FIX: + IF BUILD_RFS = 1 LD A,(01051H) BIT 7,A - JP Z,01F97H + JR NZ,SVC32_CMT + ; Non-CMT: check if block device (bit5 of flags1) + LD A,(L1050) + BIT 5,A + JP Z,YP_HOOK_G ; !Y source G: SVC32 L1050 bit5=0 + ; Block device (FD/QD/RFS): skip L2FE8 sector management, + ; enter at L2FD4 (SKPDE→IOCALL chain) with L2D08 on stack. + ; L2FE8 repositions FD to directory sectors, corrupting position + ; set by SVC#2F. QD is immune (L35B5 bit7=1), FD is not. + LD DE,(ELMD20) ; File size + LD BC,(ELMD30) ; Sector position + PUSH HL ; Save load address + LD HL,L2D08 ; Cleanup return address + EX (SP),HL ; Stack=[L2D08,...], HL=load addr restored + XOR A ; A=0, Z=1 → selects ZINP at L2FD4 + JP L2FD4 ; SKPDE→IOCALL→RET→L2D08 cleanup +SVC32_CMT: LD BC,(ELMD20) JP L313A +; --------------------------------------------------------------------------- +; SVC2F_YP_DBG - Diagnostic: L2F6E's L1D15 returned Z (bit5=0) → !Y error +; Prints "2F:XX YYYY" where XX=L1050 (flags1), YYYY=L1044 (device pointer). +; This tells us what device descriptor is active when !Y fires. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +SVC2F_YP_DBG: + IF BUILD_RFS = 1 + PUSH AF + LD A,'2' + OUT (050H),A + LD A,'F' + OUT (050H),A + LD A,':' + OUT (050H),A + LD A,(L1050) ; flags1 — bit5 should be 1 for block device + CALL DBG_HEX + LD A,' ' + OUT (050H),A + LD A,(L1044+1) ; device pointer high byte + CALL DBG_HEX + LD A,(L1044) ; device pointer low byte + CALL DBG_HEX + CALL DBG_CRLF + POP AF + JP 01F97H ; Continue to !Y error handler + +; --------------------------------------------------------------------------- +; RFS_FREE_HOOK - Intercept L2F4B free space query for $RFS +; During DIR display (2nd SVC#39 call), L1D6B sets IX=L2F4B (block device +; free space) and calls IOCALL. L2F4B → L2E36 → L2E67 reads "disk identity" +; via ZINP. For $RFS, RFSINP_DISKID fills L2800 with 0x80 (bit7=1), but +; L2E67 expects bit7=0 → fires JP M,01F70H → error table → JP 0x0182 → +; warm restart via 0x0D20 which resets SP, discarding pending stack frames +; from L2F4B/L2E36/IOCALL — corrupting system state for subsequent commands. +; Fix: detect $RFS and return carry (= no free space info). The caller at +; L1D95+3 does JR C,L1DA8 which skips free space display gracefully. +; For non-$RFS block devices ($FD/$QD), fall through to original L2F4B. +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +RFS_FREE_HOOK: + IF BUILD_RFS = 1 + ; Detect $RFS by device name (flags1 bits 5+6 cannot distinguish + ; $QD from $RFS — both have 0x5F). Same fix as RFS_BIT5PATH. + LD A,(ZDEVNM) ; First char of device name + CP 'R' + JP NZ,L2F4B ; Not 'R' → not $RFS → original free space + LD A,(ZDEVNM+1) ; Second char + CP 'F' + JP NZ,L2F4B ; Not 'F' → not $RFS → original free space + XOR A ; A=0 (IOCALL checks: OR A / SCF / RET Z) + SCF ; Carry = skip free space display + RET + ; =========================================================================== ; RFS Data Variables ; =========================================================================== -DEVNAMEBUF: DS 8, 000H ; Device name buffer for DIR/LOAD parsing + ENDIF ; (Glass: label outside IF) +DEVNAMEBUF: + IF BUILD_RFS = 1 + DS 8, 000H ; Device name buffer for DIR/LOAD parsing ; (replaces L5982 4-byte buffer which overflowed ; for 3-letter device names like "RFS1:") -SDSTARTSEC: DS 4, 000H ; Current sector address (big-endian) -DIRSECBUF: DB 0FFH ; Cached directory sector number + ENDIF ; (Glass: label outside IF) +SDSTARTSEC: + IF BUILD_RFS = 1 + DS 4, 000H ; Current sector address (big-endian) + ENDIF ; (Glass: label outside IF) +DIRSECBUF: + IF BUILD_RFS = 1 + DB 0FFH ; Cached directory sector number + ENDIF ; (Glass: label outside IF) FILE_STARTSEC: + IF BUILD_RFS = 1 DS 4, 000H ; File start sector (big-endian) + ENDIF ; (Glass: label outside IF) FILE_LOADADDR: + IF BUILD_RFS = 1 DW 00000H ; Current load/store address -FILE_SIZE: DW 00000H ; Remaining bytes during transfer -RFS_LD_A0: DB 000H ; Entry A for RFSINP_LD -DIR_BUFPTR: DW 00000H ; Current DIR buffer write position + ENDIF ; (Glass: label outside IF) +FILE_SIZE: + IF BUILD_RFS = 1 + DW 00000H ; Remaining bytes during transfer + ENDIF ; (Glass: label outside IF) +RFS_LD_A0: + IF BUILD_RFS = 1 + DB 000H ; Entry A for RFSINP_LD + ENDIF ; (Glass: label outside IF) +DIR_BUFPTR: + IF BUILD_RFS = 1 + DW 00000H ; Current DIR buffer write position ; --------------------------------------------------------------------------- ; DBG_HEX — Output A as 2 hex ASCII digits to port 050H. ; Preserves BC, DE, HL. ; --------------------------------------------------------------------------- -DBG_HEX: PUSH AF + ENDIF ; (Glass: label outside IF) +DBG_HEX: + IF BUILD_RFS = 1 + PUSH AF RRCA RRCA RRCA @@ -19440,7 +19390,10 @@ DBG_DIG: ADD A,030H ; '0'..'9' ; --------------------------------------------------------------------------- ; DBG_CRLF — Output CR+LF to port 050H. Preserves all registers. ; --------------------------------------------------------------------------- -DBG_CRLF: PUSH AF + ENDIF ; (Glass: label outside IF) +DBG_CRLF: + IF BUILD_RFS = 1 + PUSH AF LD A,00DH ; CR OUT (050H),A LD A,00AH ; LF @@ -19449,19 +19402,133 @@ DBG_CRLF: PUSH AF RET ; ; --------------------------------------------------------------------------- +; YP_HOOK — Identify which code path triggers !Y error. +; Each entry loads a letter (A-F) into A via the cascade trick (DB 021H). +; Output: single letter + CRLF, then continues to !Y error table at 01F97H. +; A = line 3813 (L1B55, BIT 2 of L1043) +; B = line 3902 (L1BFD, BIT 6 of L1050) +; C = line 4030 (device setup) +; D = line 4059 (BIT 7 of L1050) +; E = line 4064 (BIT 5 of L1050, DIR non-RFS) +; F = line 4764 (L2B6A, L1D15 bit5) +; G = SVC32_FIX (L1050 bit5=0, non-block device in SVC#32) +; --------------------------------------------------------------------------- + ENDIF ; (Glass: label outside IF) +YP_HOOK_A: + IF BUILD_RFS = 1 + LD A,'A' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_B: + IF BUILD_RFS = 1 + LD A,'B' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_C: + IF BUILD_RFS = 1 + LD A,'C' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_D: + IF BUILD_RFS = 1 + LD A,'D' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_E: + IF BUILD_RFS = 1 + LD A,'E' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_F: + IF BUILD_RFS = 1 + LD A,'F' + DB 021H + ENDIF ; (Glass: label outside IF) +YP_HOOK_G: + IF BUILD_RFS = 1 + LD A,'G' + OUT (050H),A + CALL DBG_CRLF + JP 01F97H +; +; BC_ERR_HOOK - Debug: show ELMD[0..1] when error 0xBC fires + ENDIF ; (Glass: label outside IF) +BC_ERR_HOOK: + IF BUILD_RFS = 1 + PUSH AF + LD A,'B' + OUT (050H),A + LD A,(L1000) ; File mode byte + CALL DBG_HEX + LD A,(L1001) ; File type (should be 0x0D here) + CALL DBG_HEX + CALL DBG_CRLF + POP AF + JP 01F9AH ; L1F6A cascade: error 0xBC +; +; --------------------------------------------------------------------------- ; Data area ; --------------------------------------------------------------------------- -FINDSD_NAME:DW 00000H ; Saved filename pointer for FINDSD -SAVE_DIRENT:DB 000H ; Directory entry number for SAVE -SAVE_PENDING:DB 000H ; 1 = SAVE done flag -DIR_FILLED: DB 000H ; 1 = DIR buffer filled -SAVE_SP: DW 00000H ; Saved BASIC stack pointer -DIR_ENTRY_IDX: DB 000H ; Current directory entry index -SDDRIVENO: DB 000H ; SD drive number -SECTORBUF: DS 512, 000H ; SD card sector buffer (512 bytes) - DS 32, 000H ; Temp stack space (grows downward) + ENDIF ; (Glass: label outside IF) +FINDSD_NAME: + IF BUILD_RFS = 1 + DW 00000H ; Saved filename pointer for FINDSD + ENDIF ; (Glass: label outside IF) +SAVE_DIRENT: + IF BUILD_RFS = 1 + DB 000H ; Directory entry number for SAVE + ENDIF ; (Glass: label outside IF) +SAVE_PENDING: + IF BUILD_RFS = 1 + DB 000H ; 1 = SAVE done flag + ENDIF ; (Glass: label outside IF) +DIR_FILLED: + IF BUILD_RFS = 1 + DB 000H ; 1 = DIR buffer filled + ENDIF ; (Glass: label outside IF) +SAVE_SP: + IF BUILD_RFS = 1 + DW 00000H ; Saved BASIC stack pointer + ENDIF ; (Glass: label outside IF) +DIR_ENTRY_IDX: + IF BUILD_RFS = 1 + DB 000H ; Current directory entry index + ENDIF ; (Glass: label outside IF) +SDDRIVENO: + IF BUILD_RFS = 1 + DB 000H ; SD drive number + ENDIF ; (Glass: label outside IF) +SECTORBUF: + IF BUILD_RFS = 1 + DS 512, 000H ; SD card sector buffer (512 bytes) + DS 14, 000H ; Temp stack space (grows downward, 7 levels = exact max depth) + ENDIF ; (Glass: labels outside IF) TEMP_STACK_TOP: ; SP points here RFS_END EQU TEMP_STACK_TOP ; End of RFS code = new TEXTST + IF BUILD_RFS = 1 ; ; Pad remaining space to maintain original binary size (0x9000 bytes) DS 09000H - RFS_END, 0FFH + + ENDIF ; END BUILD_RFS = 1 + +; =========================================================================== +; Tape/CMT bootstrap (only for BUILD_TAPE=1) +; Loads at TAPECOPY (0x1200), copies BASIC ROM to 0x0000, jumps to cold start. +; =========================================================================== + IF BUILD_TAPE = 1 +EXECSTART: XOR A + LD DE,L0000 + CALL TIMST ; Stop timer + LD DE,L0000 + LD HL,BASICEND - L0000 + OR A + SBC HL,DE + LD C,L + LD B,H + LD HL,TAPECOPY + OUT (LSE0),A ; Map 0000-0FFF to DRAM + LDIR ; Copy BASIC ROM to 0x0000 + JP L0000 ; Jump to cold start +BASICEND: + ENDIF diff --git a/dis/MZ-5Z008/mz5z008.asm b/dis/MZ-5Z008/mz5z008.asm deleted file mode 100644 index 2ca83d1..0000000 --- a/dis/MZ-5Z008/mz5z008.asm +++ /dev/null @@ -1,17821 +0,0 @@ -; Disassembly of the file "mz5z008.bin" -; -; CPU Type: Z80 -; -; Created with dZ80 2.1 -; -; on Friday, 20 of March 2026 at 02:41 PM -; -LSD0 EQU 0D0H -LSD1 EQU 0D1H -LSD2 EQU 0D2H -LSD3 EQU 0D3H -LSE0 EQU 0E0H -LSE1 EQU 0E1H -LSE2 EQU 0E2H -LSE3 EQU 0E3H -LSE4 EQU 0E4H -LSE5 EQU 0E5H -LSE6 EQU 0E6H -QDPA EQU 0F2H -QDPB EQU 0F3H -QDPC EQU 0F4H -QDPD EQU 0F5H -FDPA EQU 0F8H -FDPB EQU 0F9H -FDPC EQU 0FAH -FDPD EQU 0FBH -LSFC EQU 0FCH -ELMD EQU 01000H -ELMD1 EQU 01001H -ELMD18 EQU 01012H -ELMD20 EQU 01014H -ELMD22 EQU 01016H -ELMD24 EQU 01018H -ELMD26 EQU 0101AH -ELMD30 EQU 0101EH -ELMD32 EQU 01020H -ZTOP EQU 01040H -ZLOG EQU 01042H -ZRWX EQU 01043H -ZEQT EQU 01044H -ZCH EQU 01046H -ZEOF EQU 01047H -ZWRK1 EQU 01048H -ZWRK2 EQU 01049H -ZNXT EQU 0104AH -ZDEVNM EQU 0104CH -ZFLAG1 EQU 01050H -ZFLAG2 EQU 01051H -ZDIRMX EQU 01052H -ZINIT EQU 01053H -ZRO EQU 01055H -ZWO EQU 01057H -ZCL EQU 01059H -ZKL EQU 0105BH -ZINP EQU 0105DH -ZOUT EQU 0105FH -ZDELT EQU 01061H -ZWDIR EQU 01063H -ZFREE EQU 01065H -DCHAN EQU 01069H -DDEV EQU 0106AH -.$CRT EQU 0106CH -.$LPT EQU 0106EH -TEXTST EQU 01070H -TEXTED EQU 01072H -VARST EQU 01074H -STRST EQU 01076H -VARED EQU 01078H -TMPEND EQU 0107AH -INTFAC EQU 0107CH -MEMLMT EQU 0107EH -MEMMAX EQU 01080H -CURXY EQU 01082H -POSADR EQU 01084H -BITADR EQU 01086H -POINTX EQU 01088H -POINTY EQU 0108AH -CURFLG EQU 0108CH -CURMAK EQU 0108DH -CMTMSG EQU 0108EH -INPFLG EQU 0108FH -DISPX EQU 01090H -FILOUT EQU 01091H -PSEL EQU 01092H -PCRLF EQU 01093H -LPT_TM EQU 01094H -LPOSB EQU 01095H -PSMAL EQU 01096H -PNMODE EQU 01097H -DMD EQU 01098H -MEMOP EQU 01099H -PWMODE EQU 0109AH -CMODE EQU 0109BH -CPLANE EQU 0109CH -MAXCF EQU 0109DH -PMASK EQU 0109EH -GMODE EQU 0109FH -TMCNT EQU 01195H -SUMDT EQU 01197H -CSMDT EQU 01199H -TEMPW EQU 0119EH -KEYBM1 EQU 011A3H -KEYBUF EQU 011A4H -KEY262 EQU 012AAH -KEY264 EQU 012ACH -KEY266 EQU 012AEH -FUNBUF EQU 012B2H -INBUFC EQU 01352H -INBUFL EQU 01353H -INBUF EQU 01354H -LINLIM EQU 01364H -KEYDAT EQU 01365H -AMPM EQU 01366H -SECD EQU 01367H -XS EQU 01369H -XE EQU 0136AH -CWIDTH EQU 0136BH -CSIZE EQU 0136DH -YS EQU 0136FH -YE EQU 01370H -YW EQU 01371H -SOF EQU 01372H -SW EQU 01374H -SSA EQU 01375H -SEA EQU 01376H -SSW EQU 01377H -CRTMD1 EQU 01379H -CRTMD2 EQU 0137AH -SELCOL EQU 0137BH -PAIWED EQU 0137CH -PALBK EQU 0137EH -PALAD EQU 0137FH -PALTBL EQU 01381H -PAL2T EQU 01385H -PAL4T EQU 01389H -PAL16T EQU 0138DH -CURDT1 EQU 01391H -CURDT2 EQU 01399H -CURDT3 EQU 013A1H -SCRNT0 EQU 013A9H -EMFLG EQU 013C3H -EMPTR EQU 013C4H -EMWP0 EQU 013C6H -EMWP1 EQU 013C8H -PBCN EQU 013CEH -HERRF EQU 013D9H -CTABLE EQU 013DAH -FONTBF EQU 01000H -TEXTBF EQU 02000H -BITBUF EQU 08000H -IBUFE EQU 010F0H -ERRTXT EQU 0FDA0H -VRAM EQU 0D000H -ARAM EQU 0D800H -MMIO EQU 0E000H -TEMPO_ EQU 0E008H -PPI_PA EQU 0E010H -PPI_PB EQU 0E011H -PPI_PC EQU 0E012H -PPI_CTL EQU 0E013H -PRGSTART EQU 00000H - - ORG PRGSTART - -L0000: JP L0CAF ; Cold start entry - JP to initialization - -L0003: JP L028C - -L0006: JP L05EC - - JP L05E8 - -L000C: JP L0BFD - -L000F: JP L05F1 - -L0012: JP L0BFF - -L0015: JP L0BEE - -SVC_ENTRY: JP SVC_DISP ; RST 18H - SVC (Supervisor Call) dispatcher - - JP L041C - -BRKCHK: JP L05C1 - - JP L30CB - - JP L30D2 - -L0027: JP L3114 - - JP L311B - - JP L3153 - -L0030: JP L14BC - - JP L0955 - -L0036: LD B,B - NOP -RST38: JP BREAKZ ; RST 38H - Interrupt handler - - JP L098F - -L003E: JP L0D3F - -L0041: JP L0D30 - - JP L0D05 - - JP L0D20 - - JP L028C - -L004D: DB 000H ; System status / work area -L004E: DB 000H -L004F: DB 0FFH -L0050: DB 000H - DB 0C3H - DB 0EEH - DB 00BH -L0054: DS 2, 000H -L0056: DB 000H -L0057: DB 018H - DB 0C3H - DB 08AH - DB 003H -L005B: DB 000H - DB 027H -L005D: DB 071H - DB 000H -L005F: DB 000H -L0060: DB 0EFH - DB 0C3H - DB 037H - DB 00AH -L0064: DB 000H -L0065: DB 000H -L0066: DB 000H -L0067: DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB 0ADH - DB 007H - DB 0F1H - DB 008H -L0071: DB 015H - DB 008H - DB 012H - DB 008H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 -L0080: DB 000H -L0081: DB 0ADH - DB 007H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB 01EH - DB 008H - DB 0CCH - DB 007H - DB 0F0H - DB 007H - DB LSD1 - DB 007H - DB QDPD - DB 007H - DB 054H - DB 007H - DB 074H - DB 007H - DB 018H - DB 008H - DB 0BAH - DB 008H - DB 012H - DB 008H - DB LSE5 - DB 000H - DB 0ADH - DB 007H - DB LSE5 -L00A0: DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 -.NOP: DB 000H -.HL: DS 11, 000H -.RET: DS 8, 000H -PUSHRA: DS 6, 000H -L00C0: DS 7, 000H -PUSHR: DS 18, 000H -L00D9: DB 000H -L00DA: DI - LD SP,L0000 - IM 1 - OUT (LSE1),A - JP L1800 - -BREAKZ: RET - -BREAKX: DI - OUT (LSE3),A -L00E9: LD A,(HL) - OUT (LSE1),A - EI -ERRORJ: RET - -POPRA: DI - OUT (LSE3),A - LD (HL),A - OUT (LSE1),A - EI - RET - - JP L026A - -L00F9: NOP -L00FA: JP (HL) - -IOOUT: EX (SP),IX - PUSH HL - PUSH BC - PUSH DE -L0100: PUSH AF -L0101: PUSH HL - LD HL,L0114 - EX (SP),HL - JP (IX) - -SKPDE: EX (SP),IX - PUSH HL - PUSH BC - PUSH DE -DEVASC: PUSH HL - LD HL,L0115 - EX (SP),HL - JP (IX) - -L0114: POP AF -L0115: POP DE - POP BC - POP HL - POP IX - RET - -CHKACC: EX (SP),HL - PUSH BC - LD B,(HL) -L011E: INC HL - CP (HL) - JR Z,L0127 ; (+005H) - DJNZ L011E ; (-006H) - INC HL - JR L012A ; (+003H) - -L0127: INC HL - DJNZ L0127 ; (-003H) -L012A: POP BC - EX (SP),HL - RET - -LDDEMI: LD E,(HL) - INC HL - LD D,(HL) - INC HL - RET - -LDDEMD: LD E,(HL) - INC HL - LD D,(HL) - DEC HL - RET - -?CLRHL: XOR A -?SETHL: LD (HL),A - INC HL - DJNZ ?SETHL ; (-004H) - RET - -?CLRDE: XOR A -?SETDE: LD (DE),A - INC DE -L0140: DJNZ ?SETDE ; (-004H) - RET - -LDDEHL: LD A,(HL) - LD (DE),A - INC HL - INC DE - DJNZ LDDEHL ; (-006H) - RET - -LDHLDE: LD A,(DE) - LD (HL),A - INC HL - INC DE - DJNZ LDHLDE ; (-006H) - RET - -INDRCT: PUSH AF - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - POP AF - RET - -ADDHLA: ADD A,L - LD L,A - RET NC - INC H - RET - -INCHLF: INC HL -HLFTCH: LD A,(HL) - CP 020H - JR Z,INCHLF ; (-006H) - RET - -TEST1: CALL HLFTCH - EX (SP),HL -L0168: CP (HL) - INC HL - EX (SP),HL - RET NZ - INC HL - RET - -TESTX: CALL HLFTCH - EX (SP),HL - CP (HL) - INC HL - EX (SP),HL - INC HL - RET Z - LD A,001H - JR L0182 ; (+007H) - -L017B: XOR A - LD HL,L803E - LD HL,L80F6 -L0182: PUSH AF - CALL L0D20 - POP AF - JP L0000 - -L018A: SBC A,L - DEC A - CALL PE,0E805H - DEC B - RST 038H - DEC BC - LD B,E - INC C - EX AF,AF' - ADD HL,BC - XOR C -FDDIR: RRCA - LD A,00FH - RET Z - DEC BC - JP Z,0D80BH - DEC BC - AND 00BH -L01A2: ADC A,H - LD (BC),A - ADC A,D - INC BC - POP BC - DEC B - AND B - INC D - ADD A,A - LD A,(BC) - ADC A,C - LD A,(BC) - SCF - LD A,(BC) - LD B,(HL) - INC D - HALT - INC D - SUB C - INC D - LD B,014H - LD E,H - LD (BC),A - POP HL - INC C - RET PE - INC C - RST 028H - INC C - PUSH HL - INC D - AND H - INC DE - LD (HL),D - INC DE - LD C,E - LD B,LSE5 - NOP - LD A,00DH - JR NC,L01CE ; (+000H) -L01CE: PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - ADC A,A - ADD HL,BC - LD D,L - ADD HL,BC - SUB B -L01D9: DEC C - RET PE - DEC DE - IN A,(01EH) - DEC E - RRA -L01E0: POP AF - LD E,03DH - LD A,(DE) - CP B - LD A,(DE) - RET PO - ADD HL,DE - LD (HL),C - DEC DE - OR H - INC E - RET C - INC E - RET - - INC E - POP HL - LD A,(DE) - RET NC - JR L01D9 ; (-01cH) - - JR 00243H ; (+04cH) - - ADD HL,DE - RRCA - JR L01A2 ; (-059H) - - DEC DE - DEC DE - DEC E - DB 0DDH - INC D -L0200: PUSH HL - NOP - LD E,B - LD E,067H - INC L - OR (HL) - INC L - LD B,(HL) - INC L - NOP - ADD HL,HL - SBC A,L - LD HL,(02925H) - XOR E - RRA - CALL M,L742A - RLCA - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP - PUSH HL - NOP -SVC_DISP: EX (SP),HL - PUSH AF - LD A,(HL) - INC HL - PUSH HL - LD HL,L018A - ADD A,A - ADD A,L - JR NC,L0237 ; (+001H) - INC H -L0237: LD L,A - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - LD (00243H),HL - POP HL - POP AF - EX (SP),HL - JP L0000 - -IOCALL: PUSH HL - PUSH DE - LD (00251H),IX - LD IX,00180H - OR A - CALL L0000 - POP DE - POP HL - RET NC - OR A - SCF -L0258: RET Z - JP 00180H - - PUSH DE - LD B,000H -L025F: LD A,(DE) - OR A - JR Z,L0268 ; (+005H) - INC DE - INC B - JR NZ,L025F ; (-008H) - DEC B -L0268: POP DE - RET - -L026A: PUSH HL - LD HL,(L0054) - PUSH HL - PUSH DE - CALL PUSHW - POP DE - LD (HL),000H - POP HL - CALL L028C - JR C,L028A ; (+00eH) - LD A,(L005B) - SUB L - JR NC,L028A ; (+008H) - NEG - LD L,A - LD H,000H - ADD HL,DE - EX DE,HL - OR A -L028A: POP HL - RET - -L028C: PUSH BC - PUSH HL - PUSH DE -L028F: CALL L0391 - CP 00DH - JP Z,L0311 - CP 01BH - JR Z,L02E8 ; (+04dH) - PUSH AF - CP 020H -DEASC: JR C,L02CD ; (+02dH) - JR L02C8 ; (+026H) - -L02A2: LD A,(L004D) - OR A - JR NZ,L02C8 ; (+020H) - LD A,(00B18H) - RRCA - JR C,L02C8 ; (+01aH) - LD A,(L004E) - OR A - JR NZ,L02C8 ; (+014H) - POP AF - LD HL,L06C1 - CP 011H - JR Z,L02C3 ; (+007H) - LD HL,L06E7 - CP 012H - JR NZ,L02C9 ; (+006H) -L02C3: CALL L00FA - JR L028F ; (-039H) - -L02C8: POP AF -L02C9: RST 018H - DB 003H - JR L028F ; (-03eH) - -L02CD: LD A,(L0060) - CP 0FFH - JR NZ,L02A2 ; (-032H) - POP AF - CP 017H - JR NC,L02C9 ; (-010H) - CP 011H - JR C,L02C9 ; (-014H) - LD HL,(00B18H) - BIT 6,L - JR Z,L02C9 ; (-01bH) - RST 018H - DB 004H - JR L028F ; (-059H) - -L02E8: SCF -CKHEX: PUSH AF - LD A,00DH - RST 018H - DB 003H - POP AF - POP DE - POP HL - POP BC - RET - -L02F3: CALL PUSHW -L02F6: LD A,(HL) - OR A -MHALT: RET Z - DEC HL - DEC E - LD A,(L0056) - CP E - JR C,L02F6 ; (-00bH) - RET - -L0302: CALL PUSHW -L0305: INC E - INC HL - LD A,(HL) - OR A - RET Z - LD A,(L0057) - CP E - JR NC,L0305 ; (-00bH) - RET - -L0311: LD HL,(L0054) -SETDFL: CALL L02F3 - LD D,E - CALL L0305 - LD A,(L005B) - LD L,A - LD A,E - SUB D - LD E,A - LD H,D -ADDP1: LD D,L - RST 018H - DB 01EH - LD A,(0005CH) - SUB D -ADDP2: INC A - LD D,A - POP BC - PUSH BC - EXX - PUSH HL - LD HL,(L004F) - EXX -L0334: PUSH DE - PUSH HL -L0336: CALL BREAKX - RST 018H - DB 01CH - INC HL - LD (BC),A - INC BC -L033E: EXX - DEC L -ERRX: JR Z,L0354 ; (+012H) - EXX - DEC D - JR NZ,L0336 ; (-010H) - POP HL - PUSH BC - LD BC,00028H - ADD HL,BC - POP BC - POP DE - DEC E - JR NZ,L0334 ; (-01dH) - PUSH DE - PUSH HL - EXX -L0354: EXX - POP HL - POP DE - EXX - POP HL - EXX - XOR A - LD (BC),A - LD L,C - LD H,B - POP DE - PUSH DE - PUSH HL - OR A - SBC HL,DE - LD B,L - POP HL - LD A,020H - LD D,A - JP Z,CKHEX - DEC HL -L036D: LD A,(HL) - OR A - JR Z,L0376 ; (+005H) - CP D - JR NZ,L037D ; (+009H) - LD (HL),000H -L0376: DEC HL - DJNZ L036D ; (-00cH) - OR A - JP CKHEX - -L037D: LD A,(HL) - OR A - JR NZ,L0383 ; (+002H) - LD (HL),020H -L0383: DEC HL - DJNZ L037D ; (-009H) - OR A - JP CKHEX - - INC A - JR Z,L0406 ; (+079H) - DEC A - JP Z,L041C -L0391: CALL L0426 - CALL SKPDE -SETDNM: CALL L0648 - CALL BREAKX - LD D,A - LD A,(L0060) - LD E,A - CALL POPRA - XOR A - DI - OUT (LSE3),A - LD (MMIO),A - CPL - LD (MMIO),A - OUT (LSE1),A - EI - LD C,000H - EX AF,AF' - PUSH AF - CALL L0459 - LD A,000H -L03BC: EX AF,AF' -L03BD: LD B,010H -L03BF: CALL L043C - CALL L0459 - BIT 1,A - JR NZ,L03BD ; (-00cH) - DJNZ L03BF ; (-00cH) - BIT 0,A - JR Z,L03DB ; (+00cH) - BIT 2,A - JR NZ,L03EC ; (+019H) - EX AF,AF' - DEC A - JR NZ,L03BC ; (-01bH) - LD A,006H - JR L03EE ; (+013H) - -L03DB: PUSH HL - PUSH DE - PUSH BC - LD HL,INKEY1 - LD DE,L0B17 - LD BC,0000AH -L03E7: LDIR - POP BC - POP DE - POP HL -L03EC: LD A,040H -L03EE: LD (003BBH),A -L03F1: CALL L043C - CALL L0494 - OR A - JR Z,L03F1 ; (-009H) - LD (L005F),A - LD C,A - LD A,D - CALL POPRA - POP AF - EX AF,AF' - LD A,C - RET - -L0406: CALL L0426 - PUSH HL - CALL L0494 - LD HL,L005F - OR A - JR Z,L0419 ; (+006H) - CP (HL) - JR NZ,L0419 ; (+003H) - POP HL - XOR A - RET - -L0419: LD (HL),A - POP HL - RET - -L041C: CALL L0426 - CALL L0494 - LD (L005F),A - RET - -L0426: PUSH HL - LD HL,(L1360) - LD A,L - CP H - POP HL - RET Z - EX (SP),HL - INC A - LD (L1360),A - LD HL,L1361 - CALL ADDHLA - LD A,(HL) - POP HL - RET - -L043C: DI - OUT (LSE3),A - LD A,(0E002H) - OUT (LSE1),A - EI - RLCA - RLCA - LD A,C - JR C,L0451 ; (+007H) - OR A - RET Z - LD C,000H - LD A,D -DPALBK: JR L0456 ; (+005H) - -L0451: DEC A - RET Z - LD C,001H - LD A,E -L0456: JP POPRA - -L0459: CALL SKPDE - LD DE,INKEY1 - LD HL,L0B17 - LD BC,L0A00 - DI - OUT (LSE3),A -L0468: LD A,B - ADD A,0EFH - LD (MMIO),A - CP FDPA - LD A,(0E001H) - JR NZ,L0477 ; (+002H) - OR 07FH -L0477: CP 0FFH - JR Z,L047D ; (+002H) - SET 0,C -L047D: EX DE,HL - CP (HL) - LD (HL),A - EX DE,HL - JR Z,L0485 ; (+002H) - SET 1,C -L0485: CPL - AND (HL) - JR Z,L048B ; (+002H) - SET 2,C -L048B: INC HL - INC DE - DJNZ L0468 ; (-027H) - LD A,C -L0490: OUT (LSE1),A - EI -DGCOL: RET - -L0494: CALL SKPDE - LD HL,L0B17 - LD DE,INKEY1 - PUSH HL - PUSH DE - LD BC,0000AH - LDIR - POP HL - POP DE - LD BC,L0AF9 - DI - OUT (LSE3),A - LD A,C - LD (MMIO),A - NOP - LD A,(0E001H) - LD (DE),A -L04B5: LD A,C - LD (MMIO),A - CP FDPA - LD A,(0E001H) - LD (DE),A - JR Z,L04E4 ; (+023H) - CPL - AND (HL) -L04C3: LD (HL),A - INC DE - INC HL - DEC C - DJNZ L04B5 ; (-014H) - OUT (LSE1),A - EI - LD BC,L0A00 -L04CF: DEC HL - LD A,(HL) - OR A - JR NZ,L0507 ; (+033H) - INC C - DJNZ L04CF ; (-008H) - LD B,00AH -L04D9: DEC DE - LD A,(DE) - CP 0FFH - JR NZ,L04E7 ; (+008H) -L04DF: DJNZ L04D9 ; (-008H) -L04E1: XOR A - JR L0490 ; (-054H) - -L04E4: XOR A - JR L04C3 ; (-024H) - -L04E7: LD A,B - CP 002H - JR NZ,L04F5 ; (+009H) -L04EC: LD A,(DE) - AND 081H -DWIDTH: JR NZ,L04DF ; (-012H) - LD A,01BH - JR L0490 ; (-065H) - -L04F5: CP 001H - JR Z,L04E1 ; (-018H) - CP 000H - JR NZ,L04DF ; (-01eH) - LD A,(DE) - AND 001H - JR NZ,L04DF ; (-023H) - LD A,(L005F) - JR L0490 ; (-077H) - -L0507: PUSH AF - LD A,B - LD (004FAH),A - LD A,(HL) - LD (004FFH),A - POP AF - DEC B - JR NZ,L054A ; (+036H) - CALL L05B7 - LD A,(00B18H) - BIT 6,A - JR Z,L04E1 ; (-03dH) - BIT 0,A - LD A,B - JR NZ,L0525 ; (+002H) - ADD A,005H -L0525: CP 00AH - JR NC,L04E1 ; (-048H) - LD L,A - LD H,000H - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,L12C0 - ADD HL,BC - LD A,(HL) - OR A - JR Z,L04E1 ; (-057H) - LD DE,L1360 - LD A,001H - LD (DE),A -L053E: INC DE - LD BC,00010H - LDIR - LD A,(01362H) - JP L0490 - -L054A: CALL L05B7 - LD A,C - ADD A,A - ADD A,A - ADD A,A - ADD A,B - LD L,A - LD H,000H - LD A,(00B18H) - BIT 6,A - LD BC,L0B2B - JR Z,L058E ; (+02fH) - PUSH AF - LD A,(L0060) - CP 043H - JR NZ,L056B ; (+004H) - POP AF - XOR 001H - PUSH AF -L056B: POP AF - BIT 0,A - JR NZ,L0573 ; (+003H) - LD BC,L0B3D -L0573: LD A,(L0060) - CP 0FFH - JR NZ,L0587 ; (+00dH) - LD BC,L0B4F - LD A,(00B18H) - BIT 0,A - JR Z,L0587 ; (+003H) - LD BC,L0B61 -L0587: CALL L13E0 - LD A,C - JP L0490 - -L058E: CALL L13E0 - LD A,C - CP 020H - JP C,L0490 - LD HL,L0B73 - LD B,005H -L059C: CP (HL) - JR Z,L05B1 ; (+012H) - INC HL - DJNZ L059C ; (-006H) - CP 040H - JP C,L04E1 - CP 05BH - JP NC,L04E1 - SUB 040H - JP L0490 - -L05B1: LD A,020H - SUB B - JP L0490 - -L05B7: LD B,008H -L05B9: RRCA - JR C,L05BF ; (+003H) - DJNZ L05B9 ; (-005H) - RET - -L05BF: DEC B - RET - -L05C1: LD A,0E8H - DI - OUT (LSE3),A - LD (MMIO),A - NOP - LD A,(0E001H) - OUT (LSE1),A - EI - AND 081H - RET Z - RLCA - RET C - JR L05C1 ; (-016H) - -L05D7: CALL SKPDE - LD HL,(L0054) - LD A,(L005B) - CP L - RET C - CALL PUSHW - LD A,(HL) - OR A - RET - -L05E8: CALL L05D7 - RET Z -L05EC: LD A,00DH - JP L0BFF - -L05F1: CALL L0BFD - LD A,(L0054) -L05F7: SUB 00AH -LBOUND: JR NC,L05F7 ; (-004H) - ADD A,00AH - RET Z - JR L05F1 ; (-00fH) - -L0600: CALL IOOUT - LD HL,(L0054) - PUSH HL - PUSH AF - RST 018H - DB 01EH - POP AF - RST 018H - DB 01DH - CALL POPRA - SET 3,H - LD DE,(0005DH) - LD A,E - OR D - CALL POPRA - POP HL - INC L -HCLSW: LD A,(0005CH) - CP L - JP NC,L07EC -L0624: LD A,(L005B) - LD L,A - INC H - PUSH HL - CALL PUSHW - LD (HL),001H - POP HL - LD A,(L0057) - CP H - JP NC,L07EC - LD H,A - PUSH HL - CALL L0730 - POP HL - JP L07EC - -PUSHW: LD E,H - LD D,000H - LD HL,.HL - ADD HL,DE - RET - -L0648: LD HL,(L0054) - PUSH DE - PUSH AF - LD D,LSD0 - LD E,L - LD A,H - ADD A,A -HCLS: ADD A,A - ADD A,H - LD L,A - LD H,000H - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,DE -L065B: POP AF - POP DE - RET - -L065E: ADD A,A - LD HL,L0067 - CALL ADDHLA - CALL INDRCT - JP (HL) - -L0669: LD B,D - LD C,E -L066B: LD DE,00028H - EX DE,HL - ADD HL,DE - DEC B - JR Z,L067E ; (+00bH) - PUSH HL - PUSH BC - LD B,000H - CALL L069E - POP BC - POP HL - JR L066B ; (-013H) - -L067E: EX DE,HL - LD E,C -L0680: LD A,(L005D) - LD D,A - LD A,(0005EH) - OR D - LD D,A -L0689: DI - OUT (LSE3),A - LD (HL),000H - SET 3,H - LD (HL),D - RES 3,H - OUT (LSE1),A - EI - INC HL - DEC E - JR NZ,L0689 ; (-011H) - RET - -L069B: LD BC,00028H -L069E: LD A,0B0H - JR L06A4 ; (+002H) - -L06A2: LD A,0B8H -L06A4: LD (006BCH),A - PUSH HL - PUSH DE - PUSH BC - RES 3,H - RES 3,D - CALL L06B8 - POP BC - POP DE - POP HL - SET 3,H - SET 3,D -L06B8: DI - OUT (LSE3),A - LDIR - OUT (LSE1),A - EI - RET - -L06C1: LD HL,VRAM - LD DE,0D7D0H - CALL L069B - LD HL,0D028H - LD DE,VRAM - LD B,032H -L06D2: PUSH BC - CALL L069B - POP BC - DJNZ L06D2 ; (-007H) - LD HL,.HL - LD D,H - LD E,L - LD A,(HL) - INC HL - LD BC,00031H - LDIR - LD (DE),A - RET - -L06E7: LD HL,0D7CFH - LD DE,0D7F7H - LD B,032H -L06EF: PUSH BC - LD BC,00028H - CALL L06A2 - POP BC - DJNZ L06EF ; (-00aH) - LD HL,0D7D0H - LD DE,VRAM - CALL L069B - LD HL,L00D9 - LD D,H - LD E,L - DEC HL - LD A,(DE) - LD BC,00031H - LDDR - LD (DE),A - RET - -L0710: LD HL,0D3E8H - XOR A - CALL POPRA - SET 3,H - LD A,(L005D) - CALL POPRA - LD DE,0D3E9H - LD BC,L0027 - CALL L069E - CALL L06C1 - XOR A - LD (L00C0),A - RET - -L0730: LD A,(L004E) - OR A - JR Z,L0710 ; (-026H) - CALL L075F - CALL L0669 - LD A,(L0056) - LD H,A - CALL PUSHW - LD A,(L0057) - SUB E - LD B,A - LD (HL),000H - INC HL - LD D,H - LD E,L - INC DE - CALL NZ,LDHLDE - LD (HL),000H - RET - -L0754: LD A,(L005B) - LD L,A - LD A,(L0056) - LD H,A - JP L07EC - -L075F: LD HL,(L005B) - LD DE,(00056H) - LD A,D -L0767: SUB E - INC A - LD D,A - LD A,H - SUB L - INC A -L076D: LD E,A - CALL L0754 - JP L0648 - - CALL SKPDE - LD A,(L004E) -L077A: OR A - JR NZ,L078B ; (+00eH) - LD A,031H - LD (L0057),A - CALL L078B - LD A,018H - LD (L0057),A - RET - -L078B: CALL L075F -L078E: PUSH DE - PUSH HL - CALL L0680 - POP HL - LD BC,00028H - ADD HL,BC - POP DE - DEC D - JR NZ,L078E ; (-00eH) - LD A,(L0056) - LD H,A - CALL PUSHW - LD A,(L0057) - SUB E - ADD A,002H - LD B,A - JP ?CLRHL - - XOR A - LD (0091FH),A - LD HL,(L0054) - PUSH HL - INC H - CALL PUSHW - LD A,(L0057) - LD D,A -L07BD: LD A,(HL) - OR A - JR Z,L07C7 ; (+006H) - INC HL - INC E - LD A,D - CP E - JR NC,L07BD ; (-00aH) -L07C7: DEC E - POP HL - LD H,E - JR L07DB ; (+00fH) - - LD HL,(L0054) - JR L07DF ; (+00eH) - - LD HL,(L0054) - INC L - LD A,(0005CH) - CP L - JR NC,L07EC ; (+011H) -L07DB: LD A,(L005B) - LD L,A -L07DF: INC H - LD A,(L0057) - CP H - JR NC,L07EC ; (+006H) - LD H,A - PUSH HL - CALL L0730 - POP HL -L07EC: LD (L0054),HL - RET - - LD HL,(L0054) - JR L0802 ; (+00dH) - - LD HL,(L0054) - LD A,(L005B) - CP L - JR C,0080DH ; (+00fH) - LD A,(0005CH) - LD L,A -L0802: LD A,(L0056) - CP H - JR C,0080FH ; (+007H) - LD A,(L0056) - LD H,A - LD A,02DH - LD A,025H - JR L07EC ; (-026H) - - LD A,0EFH - LD HL,L433E - LD HL,0FF3EH - LD (L0060),A - RET - - LD HL,(L0054) - LD BC,(0005BH) - LD A,L - DEC L - INC C - CP C - JR NC,L0837 ; (+00cH) - PUSH HL - CALL PUSHW - LD A,(HL) - POP HL - INC L - OR A - JR Z,L0874 ; (+03fH) - LD L,B - DEC H -L0837: LD DE,(00054H) - LD (L0054),HL -L083E: EX DE,HL - LD A,(L005B) - CP L - JR C,L086D ; (+028H) -L0845: PUSH HL - CALL PUSHW - LD A,(HL) - POP HL - OR A - JR Z,L085D ; (+00fH) - CALL L0882 - PUSH HL - LD A,(0005CH) - LD L,A - DEC H - CALL L089A - POP HL - JR L0874 ; (+017H) - -L085D: LD A,(0005CH) - LD L,A - DEC H -L0862: LD DE,(0005DH) - LD A,E - OR D - LD E,A - LD D,000H - JR L089A ; (+02dH) - -L086D: CALL L0882 - DEC BC - CALL L0895 -L0874: INC L - LD A,(0005CH) - CP L - JR NC,L086D ; (-00eH) - LD A,(L005B) - LD L,A - INC H - JR L0845 ; (-03dH) - -L0882: PUSH HL - RST 018H - DB 01EH - SET 3,H - CALL BREAKX - LD E,A - RES 3,H - CALL BREAKX - LD D,A - LD B,H - LD C,L - POP HL - RET - -L0895: PUSH HL - LD H,B - LD L,C - JR L089D ; (+003H) - -L089A: PUSH HL - RST 018H - DB 01EH -L089D: SET 3,H - LD A,E - CALL POPRA - RES 3,H - LD A,D - CALL POPRA - LD B,H - LD C,L - POP HL - RET - -L08AD: LD HL,(L0054) - CALL L0302 - DEC E - LD H,E - LD A,(0005CH) - LD L,A - RET - - CALL L08AD - CALL L0882 - LD A,0F0H - CP D - JR Z,L08C8 ; (+003H) - XOR A - CP D - RET NZ -L08C8: LD BC,(0005BH) - EX DE,HL - LD HL,(L0054) - OR A - SBC HL,DE - EX DE,HL - JR Z,L0862 ; (-074H) - LD A,C - CP L - JR NC,L08E4 ; (+00aH) - DEC L - CALL L0882 - INC BC - CALL L0895 - JR L08C8 ; (-01cH) - -L08E4: PUSH HL - LD L,B - DEC H - CALL L0882 - EX (SP),HL - CALL L089A - POP HL - JR L08C8 ; (-029H) - - LD HL,L0071 - LD (L005D),HL -L08F7: LD HL,L1800 - LD (L0056),HL - LD HL,L2700 - LD (L005B),HL - XOR A - LD (L004E),A - RET - - CALL SKPDE -L090B: LD A,(DE) - INC DE - OR A - RET Z - LD C,A - CP 005H - JR Z,L0933 ; (+01fH) - CP 006H - JR Z,L0932 ; (+01aH) - SUB 041H - CP 01AH - JR NC,HCURON ; (+00dH) - LD A,000H - OR A - JR Z,HCURON ; (+008H) - LD A,C - LD HL,L08F7 - CALL ADDHLA - LD C,(HL) -HCURON: LD A,C - RST 018H - DB 003H - CP 00DH - JR NZ,L090B ; (-027H) -L0932: XOR A -L0933: LD (0091FH),A - JR L090B ; (-02dH) - - AND C - SBC A,D - SBC A,A -HCUROF: SBC A,H - SUB D - XOR D - SUB A - SBC A,B - AND (HL) - XOR A - XOR C - CP B - OR E -FLASH: OR B - OR A - SBC A,(HL) - AND B - SBC A,L - AND H - SUB (HL) - AND L -CURMOV: XOR E - AND E - SBC A,E - CP L - AND D - NOP - NOP -L0954: NOP -L0955: PUSH DE - PUSH HL - LD (L0954),A - LD (00952H),DE - LD HL,0E007H - DI - OUT (LSE3),A - LD (HL),0B4H - LD (HL),074H - DEC HL - LD (HL),0C0H - LD (HL),0A8H - DEC HL - LD (HL),002H - LD (HL),000H -L0972: LD HL,0E007H - LD (HL),080H -PONTCB: DEC HL - LD E,(HL) - LD D,(HL) -PONTB: LD HL,0A8C0H - OR A - SBC HL,DE - JR NZ,L0972 ; (-010H) - LD HL,0E005H - LD (HL),0F6H - LD (HL),079H - OUT (LSE1),A - EI - POP HL - POP DE - RET - -L098F: PUSH BC - PUSH HL - DI - OUT (LSE3),A - LD HL,0E007H - LD (HL),080H - LD (HL),040H - DEC HL - LD E,(HL) - LD D,(HL) - DEC HL - LD C,(HL) - LD B,(HL) - OUT (LSE1),A - EI - PUSH BC - LD A,D -L09A6: OR E - JR NZ,L09AC ; (+003H) - LD DE,0A8C0H -L09AC: LD HL,0A8C0H - LD A,(L0954) - OR A - SBC HL,DE - LD DE,L5460 - CALL L09EB - OR A - LD DE,(00952H) - RR D - RR E - PUSH AF - ADD HL,DE - LD DE,L5460 - CALL L09EB - LD C,A - ADD HL,HL - EX DE,HL - POP AF - LD A,C - POP BC - PUSH AF - OR A - LD HL,L3CFB - SBC HL,BC - JR C,L09DC ; (+001H) - INC DE -L09DC: POP AF - JR NC,L09E0 ; (+001H) - INC DE -L09E0: EX DE,HL - LD DE,0A8C0H - CALL L09EB - EX DE,HL - POP HL - POP BC - RET - -L09EB: OR A - SBC HL,DE - JR NC,L09F2 ; (+002H) - ADD HL,DE - RET - -L09F2: XOR 001H - RET - -L09F5: LD A,04EH - DEC L - RET Z - LD A,056H - DEC L - RET Z - LD A,05EH - DEC L -L0A00: RET Z -L0A01: LD A,066H - DEC L - RET - -L0A05: PUSH DE - LD (00A23H),A - LD DE,0FFFFH - LD HL,0E002H - DI - OUT (LSE3),A -L0A12: BIT 7,(HL) - JR Z,L0A12 ; (-004H) -L0A16: BIT 7,(HL) - JR NZ,L0A16 ; (-004H) -L0A1A: LD L,008H - LD A,011H -L0A1E: DEC A - JR NZ,L0A1E ; (-003H) -L0A21: INC DE - BIT 0,(HL) - JR Z,L0A21 ; (-005H) - OUT (LSE1),A - EI - LD A,D - OR A - LD A,E - JR Z,L0A30 ; (+002H) - LD A,0FFH -L0A30: LD (L0066),A - POP DE - POP HL - SCF - RET - - INC A - PUSH HL - LD L,A - CALL L09F5 - JR Z,L0A05 ; (-03aH) - CALL L09F5 - LD (00A75H),A - LD (00A55H),A - LD HL,0E002H - DI - OUT (LSE3),A -L0A4E: BIT 7,(HL) - JR Z,L0A4E ; (-004H) - LD L,008H - BIT 0,(HL) - LD A,L - JR Z,L0A5A ; (+001H) - XOR A -L0A5A: LD (00A7CH),A - OUT (LSE1),A - LD A,009H -L0A61: PUSH AF - XOR A -L0A63: DEC A - JR NZ,L0A63 ; (-003H) - POP AF -BINPUT: DEC A - JR NZ,L0A61 ; (-009H) - OUT (LSE3),A - LD L,002H -L0A6E: BIT 7,(HL) - JR Z,L0A6E ; (-004H) - LD L,008H - BIT 0,(HL) - LD A,L - JR Z,L0A7A ; (+001H) - XOR A -L0A7A: LD L,A - LD A,000H - AND L - LD (L0065),A - OUT (LSE1),A - EI -GETL: POP HL - OR A - RET - - DI - RET - - EI - RET - - DS 110, 000H -L0AF9: DS 30, 000H -L0B17: DS 3, 000H -INKEY$: DS 7, 000H -INKEY1: DS 10, 000H -L0B2B: JP PE,0900BH - RLA - CALL M,00019H - DEC SP - LD A,(L180D) - DJNZ L0B4A ; (+012H) - LD DE,01413H - CCF - CPL -L0B3D: LD HL,(0900CH) - RLA - EI - DEC B - NOP - DEC HL - LD HL,(0160DH) - DEC D - LD (DE),A -L0B4A: LD DE,01413H - ADD A,05FH -L0B4F: JP (HL) - - INC C - SUB B - RLA - LD L,B - DEC B - NOP - ADD A,H - JP (HL) - - DEC C - LD D,015H - LD (DE),A - LD DE,01413H - ADC A,A - ADC A,E -L0B61: LD L,D - INC C - SUB B - RLA - LD L,H - ADD HL,DE - NOP - CP 089H - DEC C - LD D,015H - LD (DE),A - LD DE,01413H - ADC A,D - LD A,E -L0B73: LD E,E - LD E,H - LD E,L - LD E,(HL) - CPL -$CRT: DB 091H,00BH,"CRT",000H,08AH ; $CRT - CRT device descriptor - DS 2, 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H -INKEYF: DB 0AAH - DB 00BH - DB 0B5H - DB 00BH - DB 0C4H - DB 00BH -$KB_: DB 000H ; $KB - Keyboard device descriptor - DB 00FH - DB 04BH - DB 042H - DS 2, 000H - DB 081H - DS 2, 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 -INKEY0: DB 000H - DB LSE5 - DB 000H - DB 0AAH - DB 00BH - DB LSE5 - DB 000H - DB LSE5 - DB 000H - RST 018H - DB 00CH - LD A,080H - RET C - JP C,0017DH - RST 018H - DB 017H - RET - - EX AF,AF' - LD HL,L0BFF -L0BB9: LD A,(L1090) - OR A - JR Z,L0BC2 ; (+003H) - LD HL,L0C43 -L0BC2: EX AF,AF' - JP (HL) - - LD A,(L0054) - RET - - LD A,00DH -L0BCA: PUSH AF - LD A,(L1091) -L0BCE: OR A - JR NZ,L0BD4 ; (+003H) - POP AF - JR L0BFF ; (+02bH) - -L0BD4: POP AF - JP L0F3E - - PUSH AF - LD A,(L1091) - OR A - JR NZ,L0BE2 ; (+003H) - POP AF - JR L0C43 ; (+061H) - -L0BE2: POP AF - JP L0F2E - - CALL SKPDE - LD HL,L0BCA - JR L0BF4 ; (+006H) - -L0BEE: CALL SKPDE - LD HL,L0BFF -L0BF4: LD A,(DE) - OR A - RET Z - CALL L00FA - INC DE - JR L0BF4 ; (-009H) - -L0BFD: LD A,020H -L0BFF: CALL IOOUT -L0C02: LD C,A - LD A,(L004D) - OR A - JR Z,L0C3A ; (+031H) - LD A,C - CP 020H - JR NC,L0C37 ; (+029H) - LD DE,(00054H) - LD HL,(L005B) - CP 014H - JR Z,L0C21 ; (+008H) - CP 012H - JR NZ,L0C26 ; (+009H) - LD HL,(L0056) - LD E,D -L0C21: LD A,L - CP E - JP NC,L0D3F -L0C26: LD A,C - LD HL,L0C8F - ADD A,L - LD L,A - JR NC,L0C2F ; (+001H) - INC H -L0C2F: LD A,(HL) - INC A - JR Z,L0C3A ; (+007H) - DEC A - JP Z,L0D3F -L0C37: CALL L0C60 -L0C3A: LD A,C - CP 020H - JP C,L065E - JP L0600 - -L0C43: CALL IOOUT - LD C,A - CP 00DH - JR Z,L0C02 ; (-049H) - CALL L0600 - LD A,(L004D) - OR A - RET Z - LD A,C - CP 011H - JR C,L0C8A ; (+032H) - CP 017H - JR C,L0C8C ; (+030H) - CP 020H - JR C,L0C8A ; (+02aH) -L0C60: CP 060H - JR C,L0C8C ; (+028H) - CALL CHKACC - ADD HL,BC - ADD A,B - LD A,E - ADD A,08BH - RST 010H - RST 008H - CALL M,0FFFBH - JR Z,L0C8C ; (+019H) - CP 092H - JR C,L0C8A ; (+013H) - CALL CHKACC - ADD HL,BC - SBC A,C - SUB L - XOR H - AND A - OR H - OR C - OR (HL) - OR L - CP H - JR Z,L0C8A ; (+004H) - CP 0BFH - JR C,L0C8C ; (+002H) -L0C8A: LD A,02EH -L0C8C: JP L0FA9 - -L0C8F: NOP - NOP - NOP - NOP - RST 038H - RST 038H - RST 038H - DEC E - NOP - NOP - NOP - NOP - NOP - DEC C - NOP - NOP - NOP - LD A,(BC) - INC BC - JR NZ,00CB2H ; (+00eH) - NOP - NOP - RST 038H - NOP - RST 038H - RST 038H - DEC C - RST 038H - NOP - NOP - NOP -L0CAF: DI - XOR A - LD (L004D),A - LD (L1091),A - LD SP,L0000 - OUT (LSE1),A - LD A,004H - RST 018H - DB 003H -L0CC0: LD HL,L1B18 - XOR A - LD (L0CC0),A - LD D,A - LD E,A - RST 018H - DB 026H - LD DE,$CMT - LD A,B - DEC A - JR Z,L0CDB ; (+009H) - LD DE,$FD - DEC A - JR Z,L0CDB ; (+003H) - LD DE,$QD -L0CDB: LD A,C - RST 018H - DB 03AH - JP L00DA - - LD HL,(L1072) - ADD HL,DE - LD (L1072),HL - LD HL,(L1074) - ADD HL,DE - LD (L1074),HL - LD HL,(L1076) - ADD HL,DE - LD (L1076),HL - LD HL,(L1078) - ADD HL,DE - LD (L1078),HL - LD HL,(L107A) - ADD HL,DE - LD (L107A),HL - RET - -L0D05: LD HL,(00B15H) -L0D08: LD A,H - OR L - JR Z,L0D20 ; (+014H) - PUSH DE - EX DE,HL - LD HL,0E004H - DI - OUT (LSE3),A - LD (HL),E - LD (HL),D - LD A,001H - LD (TEMPO_),A - OUT (LSE1),A - EI - POP DE - RET - -L0D20: LD A,036H -BRKEY: DI - OUT (LSE3),A - LD (0E007H),A - XOR A - LD (TEMPO_),A - OUT (LSE1),A - EI - RET - -L0D30: PUSH AF - PUSH BC - AND 00FH - LD B,A - LD A,008H - SUB B - LD (0119EH),A - POP BC - POP AF - RET - -L0D3E: XOR A -L0D3F: PUSH HL - LD HL,L04EC - JR Z,L0D4E ; (+009H) - CP 001H -L0D47: JR Z,L0D59 ; (+010H) - CALL L0D08 - POP HL - RET - -L0D4E: CALL L0D08 - LD HL,L2710 -L0D54: DEC HL - LD A,H - OR L - JR NZ,L0D54 ; (-005H) -L0D59: CALL L0D20 - POP HL - RET - -$USR: DS 2, 000H ; $USR - User device descriptor -L0D60: DB "USR",000H,09FH - DS 2, 000H - DB LSE5 - DB 000H - DB 077H - DB 00DH - DB 077H - DB 00DH - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB 086H - DB 00DH - DB 086H - DB 00DH - DB LSE5 - DB 000H - LD HL,L1001 - RST 018H - DB 013H - LD A,D - OR E - JP Z,01F9AH - LD (ZWRK1),DE - RET - - LD HL,(ZWRK1) - JP (HL) - - NOP - NOP - NOP - NOP - NOP - NOP - LD A,(L1050) - BIT 7,A - JP NZ,01F97H - JP L1989 - -L0D9B: LD B,(IY+000H) - CALL L1C39 - LD A,(L1000) - CP B - JP NZ,01F9DH - RET - -L0DA9: LD A,(L004D) - OR A - LD A,(L1095) - RET Z - LD A,(L0054) - RET - - DS 40, 000H -EQTBL: DS 25, 000H -$KB: DS 10, 000H -L0E00: DS 16, 000H -L0E10: DS 46, 000H -L0E3E: DS 35, 000H -CRT1C: DS 82, 000H -PLTOTX: DS 77, 000H -$LPT: DB 0F7H,"/LPT",000H,08AH ; $LPT - Line printer device descriptor - DS 2, 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DB 000H - DB LSE5 - DS 3, 000H - DB 027H - DB 00FH - DB 019H - DB 00FH - JP L0DA9 - - RET - -L0F1D: LD A,00DH - CALL L0FA9 - XOR A - LD (L1095),A - RET - - LD HL,L1090 - BIT 0,(HL) - JR Z,L0F3E ; (+010H) -L0F2E: CALL IOOUT - LD B,A - LD A,(L004D) - OR A - LD A,B - LD E,0FFH - JR Z,L0F4E ; (+013H) - RST 018H - DB 004H - RET - -L0F3E: CALL IOOUT - LD B,A - LD A,(L004D) - OR A - LD A,B - LD E,000H - JR Z,L0F4E ; (+003H) - RST 018H - DB 003H - RET - -L0F4E: LD A,(L1097) - CP 001H - LD A,044H - JP NZ,00180H - LD A,B - CP 00DH - JR Z,L0F1D ; (-040H) - LD HL,L1095 - INC (HL) - SUB 005H - CP 002H - JR C,L0F7C ; (+015H) - LD A,B - CP 020H - JR NC,L0FB0 ; (+044H) - BIT 0,E - JR Z,L0F80 ; (+010H) - SUB 011H - CP 006H - JR C,L0FB1 ; (+03bH) - SUB QDPC - CP 002H - JR NC,L0FAE ; (+032H) -L0F7C: LD A,02EH - JR L0FB0 ; (+030H) - -L0F80: LD HL,L1095 - DEC (HL) - LD A,B - CP 015H - LD B,00FH - JR Z,L0FB1 ; (+026H) - CP 011H - LD B,009H - JR Z,L0FB1 ; (+020H) - CP 012H - LD B,00BH - JR Z,L0FB1 ; (+01aH) - CP 016H - JR NZ,L0FB0 ; (+015H) - LD A,00CH - CALL L0FB0 - LD A,00AH - CALL L0FB0 - LD A,003H - JR L0FB0 ; (+007H) - -L0FA9: CALL IOOUT - JR L0FB0 ; (+002H) - -L0FAE: LD A,020H -L0FB0: LD B,A -L0FB1: CALL L0FCA - LD A,B - DI - CALL L0FBB - EI - RET - -L0FBB: OUT (0FFH),A - LD A,080H - OUT (0FEH),A - LD A,001H - CALL L0FCB -L0FC6: XOR A - OUT (0FEH),A - RET - -L0FCA: XOR A -L0FCB: CALL SKPDE - LD C,A - LD B,00EH -L0FD1: LD HL,0E678H -L0FD4: IN A,(0FEH) - AND 00DH - CP C - RET Z - DEC HL - LD A,H - OR L - NOP - NOP - JR NZ,L0FD4 ; (-00dH) - DJNZ L0FD1 ; (-012H) - XOR A - LD (L004D),A - CALL L0FC6 - LD A,041H - JP L0182 - - DS 17, 000H -L1000: DB 000H -L1001: DS 17, 000H -L1012: DS 2, 000H -L1014: DS 4, 000H -L1018: DS 38, 000H -L103E: DS 2, 000H -L1040: LD (BC),A - NOP -L1042: NOP -L1043: NOP -L1044: NOP - NOP -L1046: NOP - NOP - NOP - NOP -L104A: NOP - NOP - NOP - NOP - NOP - NOP -L1050: LD BC,L0000 - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L1069: NOP - NOP - NOP - LD A,B - DEC BC - NOP - RRCA -L1070: NOP - NOP -L1072: NOP - NOP -L1074: NOP - NOP -L1076: NOP - NOP -L1078: NOP - NOP -L107A: NOP - NOP -L107C: NOP - NOP -L107E: NOP - NOP - NOP - RST 038H - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L1090: NOP -L1091: NOP - LD BC,L0E00 -L1095: NOP - NOP -L1097: LD BC,L0000 - DS 86, 000H -L10F0: DS 78, 000H -L113E: DS 84, 000H - RST 028H - NOP - NOP - NOP - NOP -L1197: NOP - NOP - NOP - NOP - NOP - NOP - LD BC,00504H - DS 3, 000H -L11A3: DB 000H -L11A4: DS 154, 000H -L123E: DS 57, 000H -L1277: DS 73, 000H -L12C0: RLCA - LD D,D - LD D,L - LD C,(HL) - JR NZ,012E6H ; (+020H) - JR NZ,L12D5 ; (+00dH) - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - DEC B - LD C,H - LD C,C - LD D,E - LD D,H -L12D5: JR NZ,L12D7 ; (+000H) -L12D7: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - DEC B - LD B,C - LD D,L - LD D,H - LD C,A - JR NZ,L12E7 ; (+000H) -L12E7: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - LD B,052H - LD B,L - LD C,(HL) - LD D,L - LD C,L - JR NZ,L12F8 ; (+000H) -L12F8: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - INC B - LD B,H - LD C,C - LD D,D - JR NZ,L1306 ; (+000H) -L1306: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - DEC B - LD B,E - LD C,B - LD D,D - INC H - JR Z,L1317 ; (+000H) -L1317: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - EX AF,AF' - LD B,H - LD B,L -L1323: LD B,(HL) - JR NZ,L1371 ; (+04bH) - LD B,L - LD E,C - JR Z,L132A ; (+000H) -L132A: NOP - NOP - NOP - NOP - NOP - NOP - INC B - LD B,E - LD C,A - LD C,(HL) - LD D,H - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L133E: NOP - NOP - LD B,053H - LD B,C - LD D,(HL) - LD B,L - JR NZ,L1367 ; (+020H) - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - LD B,04CH - LD C,A - LD B,C - LD B,H - JR NZ,L1377 ; (+020H) - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L1360: NOP -L1361: NOP - NOP - NOP - NOP - NOP - NOP -L1367: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L1371: NOP - CALL L13D8 - JR Z,L1385 ; (+00eH) -L1377: CP 010H - JR C,L139B ; (+020H) - CP 080H - JR Z,L13A1 ; (+022H) - CP 0C0H - JR Z,L13A1 ; (+01eH) - JR L1391 ; (+00cH) - -L1385: CP 003H - JR Z,L139B ; (+012H) - CP 005H - JR Z,L139E ; (+011H) - CP 006H - JR Z,L139E ; (+00dH) -L1391: DI - OUT (LSE2),A - CALL L0BB9 - OUT (LSE0),A - EI - RET - -L139B: LD A,0F0H - RET - -L139E: ADD A,0C9H - RET - -L13A1: SUB 040H - RET - -L13A4: CP 0F0H - JR NC,L13CF ; (+027H) - CP 073H - JR Z,L139B ; (-011H) - CALL L13D8 - JR Z,L13BB ; (+00aH) - CP 040H - JR Z,L13D5 ; (+020H) - CP 080H - JR Z,L13D5 ; (+01cH) - JR L13C3 ; (+008H) - -L13BB: CP 0CEH - JR Z,L13D2 ; (+013H) - CP 0CFH - JR Z,L13D2 ; (+00fH) -L13C3: DI - OUT (LSE2),A - CALL L0BCE - OUT (LSE0),A - EI - CP 0F0H - RET NZ -L13CF: LD A,020H - RET - -L13D2: SUB 0C9H - RET - -L13D5: ADD A,040H - RET - -L13D8: PUSH HL - LD HL,L0036 - BIT 6,(HL) - POP HL - RET - -L13E0: PUSH AF - LD A,L - SUB 008H - JR C,L13EA ; (+004H) - SUB 030H - JR C,L13F1 ; (+007H) -L13EA: ADD A,00AH - LD L,A - ADD HL,BC - LD C,(HL) - POP AF - RET - -L13F1: LD A,(BC) - PUSH AF - INC BC - LD A,(BC) - LD B,A - POP AF - LD C,A - ADD HL,BC - DI - OUT (LSE2),A - LD A,(HL) - OUT (LSE0),A - EI - CALL L13A4 - LD C,A - POP AF - RET - - PUSH HL - PUSH BC - PUSH DE - LD DE,L2710 - CALL L142C - LD DE,003E8H - CALL L142C - LD DE,L0064 - CALL L142C - LD DE,0000AH - CALL L142C - LD A,L - POP DE - OR 030H - LD (DE),A - INC DE - XOR A - LD (DE),A - POP BC - POP HL - RET - -L142C: LD A,0FFH -L142E: INC A - OR A - SBC HL,DE - JR NC,L142E ; (-006H) - ADD HL,DE - OR A - JR NZ,L143B ; (+003H) - OR B - RET Z - XOR A -L143B: LD B,001H - OR 030H - POP DE - EX (SP),HL - LD (HL),A - INC HL - EX (SP),HL - PUSH DE - RET - - CALL TEST1 - DB 024H - JR Z,L1476 ; (+02aH) - LD DE,L0000 -L144F: CALL HLFTCH - SUB 030H - CP 00AH - RET NC - INC HL - PUSH HL - LD H,D - LD L,E - ADD HL,HL - JR C,L1471 ; (+013H) - ADD HL,HL - JR C,L1471 ; (+010H) - ADD HL,DE - JR C,L1471 ; (+00dH) - ADD HL,HL - JR C,L1471 ; (+00aH) - LD E,A - LD D,000H - ADD HL,DE - JR C,L1471 ; (+004H) - EX DE,HL - POP HL - JR L144F ; (-022H) - -L1471: LD A,002H - JP L0182 - -L1476: LD DE,L0000 -L1479: LD A,(HL) - CALL L1491 - RET C - INC HL - EX DE,HL - ADD HL,HL - JR C,L1471 ; (-012H) - ADD HL,HL - JR C,L1471 ; (-015H) - ADD HL,HL - JR C,L1471 ; (-018H) - ADD HL,HL - JR C,L1471 ; (-01bH) - ADD A,L - LD L,A - EX DE,HL - JR L1479 ; (-018H) - -L1491: SUB 030H - CP 00AH - CCF - RET NC - SUB 011H - CP 006H - CCF - RET C - ADD A,00AH - RET - - CALL L14AD - CP 020H - RET NZ -L14A6: CALL L14AD - OR A - JR Z,L14A6 ; (-006H) - RET - -L14AD: RST 018H - DB 00EH - JR Z,L14B8 ; (+007H) - LD A,0FFH - RST 018H - DB 00DH - CP 01BH - RET NZ -L14B8: JP 0017DH - - RET - -L14BC: CALL SKPDE - LD HL,L11A4 - LD B,000H - PUSH HL - CALL LDHLDE - POP DE - LD (014DAH),SP - LD SP,L10F0 - DI - OUT (LSE4),A - RST 030H - OUT (LSE0),A - OUT (LSE1),A - EI - LD SP,L0000 - RET - - LD (DDEV),DE - LD (L1069),A - RET - - LD C,A - RST 018H - DB 020H - RST 018H - DB 002H - BIT 7,C - JR Z,L14F8 ; (+00aH) - LD HL,L11A4 - PUSH HL - CALL L1535 - POP DE - RST 018H - DB 005H -L14F8: LD A,C - AND 07FH - JR L14FF ; (+002H) - -L14FD: LD A,045H -L14FF: LD DE,L1554 -L1502: DEC A - JR Z,L150F ; (+00aH) - EX AF,AF' -L1506: LD A,(DE) - INC DE - OR A - JP P,L1506 - EX AF,AF' - JR L1502 ; (-00dH) - -L150F: LD A,(DE) - CP 080H - JR Z,L14FD ; (-017H) -L1514: LD A,(DE) - OR A - JP M,L151F - CALL L152A - INC DE - JR L1514 ; (-00bH) - -L151F: AND 07FH - CALL L152A - LD DE,L179E - RST 018H - DB 005H - RET - -L152A: PUSH DE - LD DE,L1533 - LD (DE),A - RST 018H - DB 005H - POP DE - RET - -L1533: NOP - NOP -L1535: LD DE,(ZEQT) - INC DE - INC DE - RST 018H - DB 017H - CALL LDHLDE - LD A,(L1046) - ADD A,031H - LD (HL),A - LD A,(01051H) - AND 00FH - JR Z,L154E ; (+001H) - INC HL -L154E: LD (HL),03AH - INC HL - LD (HL),000H - RET - -L1554: DB 053H,005H,"YNTA",0D8H,04FH,005H,"VER FLO",0D7H,049H,005H ; Error message table (bit-7 terminated) - DS 2, 04CH - DB "EGAL DAT",0C1H,054H,005H,"YPE MISMATC",0C8H,053H,005H,"TRING LENGT",0C8H,04DH,005H,"EMORY CAPACIT",0D9H,041H,005H - DS 2, 052H - DB "AY DEF",0AEH,04CH,005H,"INELENGT",0C8H,080H,"GOSUB ",005H,"NESTIN",0C7H,"FOR-NEX",0D4H,"DEF FN ",005H,"NESTIN",0C7H,"NEX",0D4H,"RETUR",0CEH,055H,005H,"N DEF. FUNCTIO",0CEH,055H,005H,"N DEF. LIN",0C5H,043H,005H,"AN'T ",006H,"CON",0D4H,04DH,005H,"EMORY PROTECTIO",0CEH,049H,005H,"NSTRUCTIO",0CEH,043H,005H,"AN'T ",006H,"RESUM",0C5H,"RESUM",0C5H - DS 2, 080H - DB "REA",0C4H,"SWAP ",005H,"LEVE",0CCH - DS 2, 080H - DB 053H,005H,"YSTEM I",0C4H,046H,005H,"RAMIN",0C7H,04FH,005H,056H,045H - DS 2, 052H - DB 055H,0CEH,050H,005H,"ARIT",0D9H - DS 8, 080H - DB 046H,005H,"ILE NOT FOUN",0C4H,048H,005H,"ARDWAR",0C5H,041H,005H,"LREADY EXIS",0D4H,041H,005H,"LREADY OPE",0CEH,04EH,005H,"OT OPE",0CEH,080H,057H,005H,"RITE PROTEC",0D4H - DS 3, 080H - DB 04EH,005H,"OT READ",0D9H,054H,005H - DS 2, 04FH - DB " MANY FILE" - DB LSD3 - DB 044H,005H,"ISK MISMATC",0C8H,04EH,005H,"O FILE SPAC",0C5H,055H,005H,"NFORMA",0D4H,054H,005H - DS 2, 04FH - DB " LONG FIL",0C5H - DS 2, 080H - DB 044H,005H,"EV. NAM",0C5H,043H,005H,"AN'T EXECUT",0C5H,049H,005H - DS 2, 04CH - DB "EGAL FILENAM",0C5H,049H,005H - DS 2, 04CH - DB "EGAL FILEMOD",0C5H,080H,04FH,005H,"UT OF FIL",0C5H,04CH,005H,"OGICAL NUMBE" - DB LSD2 - DB "LPT:" -L1772: DB 04EH,005H,"OT READ",0D9H - DS 2, 080H - DB 044H,005H,"EV. MOD",0C5H,055H,005H,"NPRINTABL",0C5H,043H,005H,"HECK SU",0CDH -L179E: DB 020H - DB 005H - DB 045H - DS 2, 052H - DB 04FH - DB 052H - DS 91, 000H -L1800: JP L4000 - -L1803: LD A,(L1042) - CP 088H - RET - -L1809: NOP - NOP -L180B: NOP - NOP -L180D: NOP - NOP - CALL L181A - CALL L1821 -L1815: XOR A - LD (L1FC0),A - RET - -L181A: LD A,(L1042) - LD (L1FC0),A - RET - -L1821: CALL SKPDE - LD A,(L1050) - BIT 7,A - LD HL,L1848 -L182C: JR Z,L183D ; (+00fH) - BIT 3,A - LD HL,L1835 - JR NZ,L183D ; (+008H) -L1835: LD IX,(ZOUT) - CALL IOCALL - RET - -L183D: LD A,B -L183E: OR A - RET Z - LD A,(DE) - CALL L00FA - INC DE - DEC B - JR L183D ; (-00bH) - -L1848: CALL SKPDE - LD E,(IY+040H) - LD D,(IY+041H) - LD HL,(L180B) - ADD HL,DE - LD (HL),A - INC DE - LD HL,(ZKL) - OR A - SBC HL,DE - CALL Z,L1871 - LD (IY+040H),E - LD (IY+041H),D - INC (IY+014H) - RET NZ - INC (IY+015H) - RET NZ - JP 01F91H - -L1871: PUSH BC - LD B,002H -L1874: CALL L1D15 - LD IX,L1835 - JR Z,L1881 ; (+004H) - LD IX,L2907 -L1881: LD A,B - CALL L18B6 - CALL L1890 - INC (IY+04EH) - LD DE,L0000 - POP BC - RET - -L1890: JP (IX) - -L1892: LD A,01AH - LD E,(IY+040H) - LD D,(IY+041H) -L189A: LD HL,(L180B) - ADD HL,DE - LD (HL),A - INC DE - LD HL,(ZKL) - XOR A - SBC HL,DE - JR NZ,L189A ; (-00eH) - PUSH BC - LD HL,(L180B) - DEC HL - LD (HL),0FFH - DEC HL - LD (HL),0FFH - LD B,006H - JR L1874 ; (-042H) - -L18B6: LD BC,(ZKL) - INC BC - INC BC - LD HL,(L180B) - DEC HL - DEC HL - LD DE,(01809H) - RET - -L18C6: OR 0AFH - LD IX,(ZCL) - CALL IOCALL - RET - - CALL L1803 - RET NZ - PUSH DE - LD DE,L11A4 - CALL L026A - LD (0193CH),DE - POP DE - RET NC - JP 0017DH - - PUSH HL - PUSH DE - CALL L181A - LD HL,(L1040) - INC HL - BIT 7,(HL) - PUSH HL - LD B,000H - SCF - CALL Z,L1913 - POP HL - CALL C,L1908 - POP DE - PUSH AF - CALL L1815 - LD L,B - LD H,000H - ADD HL,DE - LD (HL),000H - POP AF - POP HL - RET - -L1908: SET 7,(HL) - LD HL,01051H - BIT 4,(HL) - RET Z - JP 01FA0H - -L1913: CALL L1803 - JR Z,L193B ; (+023H) - LD A,(L1050) - BIT 7,A - LD HL,L1989 - JR Z,L1975 ; (+053H) - BIT 2,A - LD HL,L1929 - JR NZ,L1975 ; (+04cH) -L1929: LD IX,(ZINP) - CALL IOCALL - RET - -L1931: LD A,03FH - RST 018H - DB 003H - LD A,020H - RST 018H - DB 003H - RST 018H - DB 034H -L193B: LD HL,L0000 -L193E: CALL HLFTCH - OR A - JR Z,L1931 ; (-013H) - LD C,000H - RST 018H - DB 036H - LD (0193CH),HL - RET - - LD B,000H - CALL TEST1 - DB 022H - JR NZ,L1967 ; (+013H) -L1954: LD A,(HL) - OR A - RET Z - INC HL - CP 022H - JR Z,L1961 ; (+005H) - LD (DE),A - INC DE - INC B - JR L1954 ; (-00dH) - -L1961: CALL TEST1 - DB 02CH - OR A - RET - -L1967: LD A,(HL) - OR A - RET Z - CP C - RET Z - INC HL - CP 02CH - RET Z - LD (DE),A - INC DE - INC B - JR L1967 ; (-00eH) - -L1975: LD (0197BH),HL - LD B,000H -L197A: CALL L0000 - RET C - CP 00DH - RET Z - LD (DE),A - INC DE - INC B - JR NZ,L197A ; (-00cH) - JP 01F76H - -L1989: CALL SKPDE - LD E,(IY+040H) - LD D,(IY+041H) - LD HL,(ZKL) - OR A - SBC HL,DE - CALL Z,L19B4 - RET C - LD L,(IY+04EH) - LD H,(IY+04FH) - XOR A - SBC HL,DE - SCF - RET Z - LD HL,(L180B) - ADD HL,DE - LD A,(HL) - INC DE - LD (IY+040H),E - LD (IY+041H),D - RET - -L19B4: CALL L1D15 - JP NZ,L2A4C - OR 0AFH - CALL L18B6 - CALL L1929 - RET C - LD A,(HL) - INC HL - AND (HL) - LD (HL),0FFH - INC A - LD DE,L0000 - RET NZ - PUSH HL - LD HL,(L180D) - LD BC,(ZKL) -L19D5: DEC HL - DEC BC - LD A,(HL) - OR A - JR Z,L19D5 ; (-006H) - POP HL - LD (HL),B - DEC HL - LD (HL),C - RET - - CALL SKPDE - LD HL,L1A2D - CP 088H - JR Z,L19F4 ; (+00aH) - LD HL,L1A35 - CP 089H - JR Z,L19F4 ; (+003H) - RST 018H - DB 029H - RET C -L19F4: LD (L1040),HL - LD DE,L1042 - LD BC,00008H - LDIR - LD (L1809),HL - PUSH HL - POP IY - LD DE,L1000 - CALL L1C54 - PUSH HL - LD HL,(L1044) - LD DE,L104A - LD BC,0001DH - LDIR - POP HL - LD BC,00010H - ADD HL,BC - LD (L180B),HL - LD BC,(ZKL) - ADD HL,BC - LD (L180D),HL - LD A,(L1043) - AND 00FH - RET - -L1A2D: ADC A,B - INC BC - LD A,B - DEC BC - NOP - NOP - NOP - NOP -L1A35: ADC A,C - LD (BC),A - NOP - RRCA - NOP - NOP - NOP - NOP - LD HL,L11A4 - PUSH HL - LD A,B - OR A - CALL NZ,LDHLDE - LD (HL),000H - LD HL,$CRT - JR L1A50 ; (+003H) - -L1A4D: LD HL,L0000 -L1A50: LD A,L - OR H - JR Z,L1A89 ; (+035H) - LD (01A84H),HL - CALL LDDEMI - LD (01A4EH),DE - LD DE,L11A4 - EX DE,HL -L1A62: LD A,(DE) - OR A - JR Z,L1A6D ; (+007H) - CP (HL) - JR NZ,L1A4D ; (-01cH) - INC HL - INC DE - JR L1A62 ; (-00bH) - -L1A6D: LD A,(HL) - INC HL - CP 03AH - LD C,000H - JR Z,L1A82 ; (+00dH) - SUB 031H - CP 009H - JR NC,L1A4D ; (-02eH) - LD C,A - LD A,(HL) - INC HL - CP 03AH - JR NZ,L1A4D ; (-035H) -L1A82: EX (SP),HL - LD HL,L0000 - LD A,C - JR L1A9B ; (+012H) - -L1A89: POP HL - PUSH HL -L1A8B: LD A,(HL) - INC HL - CP 03AH - JP Z,01F94H - OR A - JR NZ,L1A8B ; (-00aH) - LD HL,(DDEV) - LD A,(L1069) -L1A9B: LD (L1044),HL - PUSH HL - LD (L1046),A - LD DE,L104A - LD BC,0001DH - LDIR - LD B,A - LD A,(01051H) - AND 007H - CP B - JP C,01F94H - LD A,B - POP DE - POP HL - RET - - CALL SKPDE - RST 018H - DB 02CH - EX DE,HL - LD HL,L1001 - LD B,01FH - CALL ?CLRHL - LD HL,L1000 - RST 018H - DB 017H - CALL L1EB4 - LD HL,L1050 - BIT 4,(HL) - RET Z - INC HL - BIT 7,(HL) - RET NZ - LD A,(L1001) - CP 00DH - JP Z,01F9AH - RET - - CALL SKPDE - CALL L1AEF - LD B,000H - CALL L1B97 - JP L2D08 - -L1AEF: LD A,(L1042) - RST 018H - DB 029H - JP NC,01F7CH - CALL L1C5B - LD HL,L005D - LD A,(L1050) - LD DE,(ZKL) - INC DE - INC DE - BIT 7,A - JR NZ,L1B0B ; (+001H) - ADD HL,DE -L1B0B: LD A,(L1043) - BIT 2,A - JR Z,L1B13 ; (+001H) - ADD HL,DE -L1B13: EX DE,HL - LD A,(L1042) - RST 018H -L1B18: DB 02AH - LD (L1FC0),A - LD (L1040),HL - EX DE,HL - LD HL,L1042 - LD BC,00008H - LDIR - LD (01809H),DE - PUSH DE - POP IY - LD HL,L1000 - CALL L1C54 - LD HL,00010H - ADD HL,DE - LD (L180B),HL - LD DE,(ZKL) - ADD HL,DE - LD (L180D),HL - CALL L1D15 - JP NZ,L2B7F - LD A,(L1043) - BIT 2,A - JP NZ,01F97H - BIT 1,A - LD IX,(ZWO) - JR NZ,L1B65 ; (+00bH) - LD A,(L1050) - BIT 7,A - JR Z,L1B6B ; (+00aH) - LD IX,(ZRO) -L1B65: LD HL,L1000 - JP IOCALL - -L1B6B: CALL L0D9B - JP 019BBH - - CALL SKPDE - LD IY,L0100 - LD (L1042),IY - LD IY,L1000 - CALL L1D15 - LD HL,L2B7A - JR NZ,L1B8B ; (+003H) - LD HL,L1C39 -L1B8B: CALL L00FA - LD B,080H - CALL L1B97 - LD A,(L1000) - RET - -L1B97: LD A,(L1000) - CP 005H - RET C - LD A,(L1012) - AND 080H - CP B - RET Z - JP 01F9DH - -L1BA7: CALL SKPDE - OR A - JR Z,L1BED ; (+040H) - CALL L1BB3 - JP L2D08 - -L1BB3: RST 018H - DB 02EH - RET C - CALL L181A - PUSH AF - CALL L1D15 - JR NZ,L1BE1 ; (+022H) - BIT 7,A - LD A,B - JR Z,L1BD4 ; (+010H) - OR A - LD IX,(ZKL) - JR Z,L1BCF ; (+004H) - LD IX,(ZCL) -L1BCF: CALL IOCALL - JR L1BE4 ; (+010H) - -L1BD4: OR A - JR Z,L1BE4 ; (+00dH) - LD A,(L1043) - BIT 1,A - CALL NZ,L1892 - JR L1BE4 ; (+003H) - -L1BE1: CALL L2BEC -L1BE4: POP AF - RST 018H - DB 02BH - RET - - CALL SKPDE - LD B,000H -L1BED: LD C,08EH -L1BEF: LD A,C - PUSH BC - RST 018H - DB 029H - CALL NC,L1BB3 - POP BC - DEC C - JR NZ,L1BEF ; (-00bH) - JP L1FAB - -L1BFD: CALL SKPDE - LD A,(L1050) - BIT 6,A - JP Z,01F97H - CALL 018C7H - LD A,(ZDIRMX) - LD B,A -L1C0F: LD HL,L11A4 - PUSH BC - LD IX,(ZRO) - CALL IOCALL - POP BC - SET 0,A - RET C - PUSH IY - POP DE - CALL L1E9D - LD A,(HL) - RET Z - DJNZ L1C0F ; (-019H) - XOR A - SCF - RET - -L1C2B: CALL L1C5B - CALL L1BFD - JP NC,01F79H - OR A - JP Z,01F85H - RET - -L1C39: CALL L1C5B - CALL L1BFD - JP C,01F73H - CALL SKPDE - LD HL,L11A4 - PUSH IY - POP DE - PUSH HL - CALL L1C54 - POP HL - LD DE,L1000 - LD A,(HL) -L1C54: LD BC,00040H - LDIR - OR A - RET - -L1C5B: LD IX,L1C9D -L1C5F: LD (01C99H),IX - CALL SKPDE - LD A,(L1042) - LD C,A - LD HL,(L1072) - PUSH HL -L1C6E: POP HL - LD A,(HL) - OR A - RET Z - LD B,A - INC HL - CALL LDDEMI - PUSH HL - ADD HL,DE - EX (SP),HL - CP 08FH - JR NC,L1C6E ; (-010H) - CP C - JR Z,L1C6E ; (-013H) - INC HL - LD A,(HL) - EX AF,AF' - INC HL - LD DE,L1044 - PUSH BC - LD BC,00300H -L1C8C: LD A,(DE) - SUB (HL) - OR C - LD C,A - INC DE - INC HL - DJNZ L1C8C ; (-008H) - POP BC - JR NZ,L1C6E ; (-029H) - LD A,B - CALL L0000 - JR L1C6E ; (-02fH) - -L1C9D: LD A,(01051H) - BIT 6,A - JP NZ,01F7CH - BIT 5,A - RET Z - EX AF,AF' - LD B,A - LD A,(L1043) - AND B - BIT 1,A - RET Z - JP 01F7CH - - CALL L1D15 - JP NZ,L2AD2 - LD BC,(ELMD20) - PUSH BC - XOR A - LD IX,(ZINP) - CALL IOCALL - POP BC - RET - - LD A,(01051H) - BIT 7,A - JP Z,01F97H - LD BC,(ELMD20) - JP L313A - - LD A,(L1000) - CP 005H - JR C,L1CE4 ; (+005H) - LD A,080H - LD (L1012),A -L1CE4: CALL L1D15 - JP NZ,L2AE0 - BIT 7,A - JP NZ,01F97H - PUSH DE - LD HL,L0200 - LD (L1042),HL - CALL L1C5B - LD HL,L1000 - PUSH HL - POP IY - LD IX,(ZWO) - CALL IOCALL - LD BC,(ELMD20) - POP HL - LD A,004H - LD IX,(ZOUT) - CALL IOCALL - RET - -L1D15: LD A,(L1050) - BIT 5,A - RET - - CALL SKPDE - OR A - JR NZ,L1D6B ; (+04aH) - LD HL,L0100 - LD (L1042),HL - CALL L1C5B - LD HL,L1050 - BIT 7,(HL) - JP NZ,01F97H - BIT 5,(HL) - JP NZ,02F38H - INC HL - BIT 7,(HL) - JP NZ,01F97H - LD HL,L2000 - LD BC,00008H -L1D43: CALL ?CLRHL - DEC C - JR NZ,L1D43 ; (-006H) - CALL 018C7H - LD A,(ZDIRMX) - LD B,A - LD HL,L2000 -L1D53: PUSH BC - LD IX,(ZRO) - CALL IOCALL - PUSH AF - LD BC,00020H - ADD HL,BC - LD (HL),000H - POP AF - POP BC - JR C,L1D68 ; (+002H) - DJNZ L1D53 ; (-015H) -L1D68: JP L18C6 - -L1D6B: LD (01E13H),A - XOR A - LD (L1090),A - LD HL,L11A4 - PUSH HL - LD DE,L1E1D - LD B,00EH - CALL LDHLDE - CALL L1535 - LD (HL),020H - INC HL - LD (HL),020H - INC HL - EX DE,HL - CALL L1D15 - LD IX,(ZFREE) - JR Z,L1D95 ; (+004H) - LD IX,L2F4B -L1D95: CALL IOCALL - JR C,L1DA8 ; (+00eH) - LD H,B - LD L,C - LD B,000H - RST 018H - DB 016H - LD HL,L1E2B - LD B,009H - CALL LDDEHL -L1DA8: EX DE,HL - LD (HL),00DH - INC HL - LD (HL),000H - POP DE - CALL L1E12 - LD B,040H - LD HL,L2000 -L1DB7: CALL L1DC3 - LD DE,00020H - ADD HL,DE - DJNZ L1DB7 ; (-009H) - JP L2D08 - -L1DC3: CALL SKPDE - LD A,(HL) - OR A - RET Z - RET M - LD DE,L11A4 - PUSH DE - LD A,020H - LD B,026H - CALL ?SETDE - LD A,(HL) - CP 00CH - JR C,L1DDC ; (+002H) - LD A,00CH -L1DDC: PUSH HL - POP IY - POP DE - PUSH DE - INC DE - LD HL,L1E31 - LD BC,L0003 -L1DE8: ADD HL,BC - DEC A - JR NZ,L1DE8 ; (-004H) - LDIR - EX DE,HL - BIT 0,(IY+012H) - JR Z,L1DF7 ; (+002H) - LD (HL),02AH -L1DF7: INC HL - INC HL - LD (HL),022H - INC HL -L1DFC: LD A,(IY+001H) - CP 00DH - JR Z,L1E09 ; (+006H) - LD (HL),A - INC IY - INC HL - JR L1DFC ; (-00dH) - -L1E09: LD (HL),022H - INC HL - LD (HL),00DH - INC HL - LD (HL),000H - POP DE -L1E12: LD A,000H - RST 018H - DB 02EH - RST 018H - DB 017H - RST 018H - DB 037H - RST 018H - DB 00FH - RET - -L1E1D: DB 00DH,"DIRECTORY OF " ; Directory/file type strings -L1E2B: DB " KB FR" -L1E31: DS 2, 045H - DB ".OBJBTXBSDBRDRB" - DS 2, 020H - DB "? LIB ?" - DS 2, 020H - DB "? SYSGR" - DS 2, 020H - DB 03FH - DB 020H - DB LSE5 - DB 0AFH,032H,042H,010H,0DDH,021H,071H,01EH,0EDH,073H,072H,01EH,0CDH,05FH,01CH - DB LSE1 - DB 0DDH,02AH,053H,010H,0CDH,045H,002H,0C9H,031H - DS 2, 000H - DB 006H - DB 000H - DB 0DFH - DB 038H - DB 018H - DB 0DFH -L1E7A: DB 0CDH,064H,001H,059H,0C8H,011H,08EH,01EH,0DFH,005H,03EH,001H,0DFH,00DH,0FEH,059H,0C8H,0C3H,07DH,001H,"OK ? [Y/N]",019H,000H -L1E9A: DB 011H - DB 000H - DB 010H -L1E9D: DB 0CDH - DB 008H - LD BC,L1323 - LD A,(DE) - CP 00DH - RET Z - LD B,011H -L1EA8: LD A,(DE) - CP (HL) - RET NZ - CP 00DH - RET Z - INC HL - INC DE - DJNZ L1EA8 ; (-00aH) - OR A - RET - -L1EB4: INC HL - LD C,010H -L1EB7: LD A,B - OR A - JR Z,L1ECF ; (+014H) - LD A,(DE) - INC DE - DEC B - OR A - JR Z,L1ECF ; (+00eH) - CP 022H - JR Z,L1EB7 ; (-00eH) - CP 03AH - JP Z,01F9AH - LD (HL),A - INC HL - DEC C - JR NZ,L1EB7 ; (-018H) -L1ECF: LD (HL),00DH - INC HL -L1ED2: LD A,C - OR A - RET Z - LD (HL),020H - INC HL - DEC C - JR L1ED2 ; (-009H) - - LD HL,(L1072) -L1EDE: INC (HL) - DEC (HL) - SCF - RET Z - CP (HL) - INC HL - JR Z,L1EEE ; (+008H) - PUSH DE - CALL LDDEMI - ADD HL,DE - POP DE - JR L1EDE ; (-010H) - -L1EEE: INC HL - INC HL - RET - -L1EF1: CALL SKPDE - RST 018H - DB 029H - RET C - DEC HL - LD B,(HL) - DEC HL - LD C,(HL) - DEC HL - LD D,H - LD E,L - INC BC - INC BC - INC BC - PUSH BC - ADD HL,BC - PUSH HL - LD B,H - LD C,L - LD HL,(L107A) - OR A - SBC HL,BC - LD B,H - LD C,L - POP HL - LDIR - POP DE - LD HL,L0000 - OR A - SBC HL,DE - EX DE,HL - RST 018H - DB 019H - OR A - RET - - PUSH AF - PUSH BC - PUSH DE - PUSH DE - INC DE - INC DE - INC DE - LD HL,(L107A) - EX DE,HL - ADD HL,DE - EX DE,HL - JP C,01F6DH - PUSH HL - LD HL,0FE00H - ADD HL,SP - SBC HL,DE - JR C,01F6DH ; (+037H) - LD HL,(L107E) - DEC H - DEC H - SBC HL,DE - JR C,01F6DH ; (+02eH) - POP HL - PUSH HL - LD BC,(VARST) - OR A - SBC HL,BC - LD B,H - LD C,L - POP HL - INC BC - LDDR - POP DE - LD (HL),A - INC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - PUSH HL - INC DE - PUSH DE -L1F58: LD (HL),000H - INC HL - DEC DE - LD A,D - OR E - JR NZ,L1F58 ; (-008H) - POP DE - INC DE - INC DE - RST 018H - DB 019H - POP HL - POP DE - POP BC - POP AF - RET - -L1F6A: LD A,003H - LD HL,0063EH - LD HL,09C3EH - LD HL,0A83EH - LD HL,0A93EH - LD HL,0AA3EH - LD HL,0AB3EH - LD HL,0AE3EH - LD HL,0B23EH - LD HL,0B33EH - LD HL,0B43EH - LD HL,0B53EH - LD HL,0B63EH - LD HL,0B73EH - LD HL,L3A3E - LD HL,0BB3EH - LD HL,0BC3EH - LD HL,0BD3EH - LD HL,0BF3EH - LD HL,L403E - LD HL,0C43EH - JP L0182 - -L1FAB: LD A,(L1FC0) - OR A - LD B,000H - CALL NZ,L1BA7 - CALL L368D - CALL L38FA - CALL L2D08 - JP L0D20 - -L1FC0: DS 64, 000H -L2000: DS 38, 000H -L2026: DS 263, 000H -L212D: DS 211, 000H -L2200: DS 294, 000H -L2326: DS 986, 000H -L2700: DS 16, 000H -L2710: DS 240, 000H -L2800: DS 256, 000H - LD (02905H),DE - RET - -L2905: NOP - NOP -L2907: LD BC,L0000 - LD DE,00001H - BIT 2,A - CALL Z,L2ED0 - LD HL,(L180D) - LD A,(HL) - LD (HL),C - LD C,A - INC HL - LD A,(HL) - LD (HL),B - LD B,A - LD HL,(L180B) - LD DE,L0100 - JP L2FCF - - CALL SKPDE - CALL L181A - LD HL,L11A4 - PUSH HL - LD A,B - OR A - CALL NZ,LDHLDE - LD B,020H - LD A,020H - CALL ?SETHL - LD A,(IY+012H) - OR A - JP NZ,01F7FH - CALL L29DF - JR NC,L2964 ; (+01dH) - LD (IY+014H),E - LD (IY+015H),D - LD (IY+046H),001H - JR Z,L2964 ; (+011H) - CALL L29C2 - CALL L2A08 - CALL L297C - LD (IY+040H),L - LD (IY+041H),H - JR L296A ; (+006H) - -L2964: CALL L297C - CALL L29AB -L296A: POP HL - CALL L2E24 - LD (IY+044H),001H -L2972: LD HL,(L2905) - INC HL - LD (L2905),HL - JP L1815 - -L297C: LD HL,(L2905) - DEC HL - PUSH HL - ADD HL,HL - LD E,H - LD D,000H - LD HL,(L180B) - ADD HL,DE - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) - POP HL - LD A,L - PUSH AF - RRA - RRA - RRA - AND 00FH - LD L,A - LD H,000H - ADD HL,DE - POP AF - AND 007H - ADD A,A - ADD A,A - ADD A,A - ADD A,A - ADD A,A - LD DE,(0180BH) - INC D - ADD A,E - LD E,A - RET NC - INC D - RET - -L29AB: LD A,(IY+040H) - CP L - JR NZ,L29B6 ; (+005H) - LD A,(IY+041H) - CP H - RET Z -L29B6: CALL L29C2 - LD (IY+040H),L - LD (IY+041H),H - XOR A - JR L29CC ; (+00aH) - -L29C2: XOR A - CP (IY+044H) - RET Z - LD (IY+044H),A - LD A,003H -L29CC: CALL SKPDE - LD C,(IY+040H) - LD B,(IY+041H) - LD DE,L0100 - LD HL,(L180B) - INC H - JP L2FD1 - -L29DF: LD L,(IY+014H) - LD H,(IY+015H) - LD DE,(02905H) - LD A,H - OR L - JR NZ,L29F1 ; (+004H) - OR 0FFH - SCF - RET - -L29F1: CALL L2FC9 - RET NC - CALL SKPDE - DEC HL - DEC DE - LD A,L - AND 080H - LD L,A - LD A,E - AND 080H - LD E,A - CALL L2FC9 - RET C - SCF - RET - -L2A08: CALL SKPDE - LD HL,(L2905) - DEC HL - ADD HL,HL - LD B,H - INC B - LD HL,(L180B) -L2A15: LD A,(HL) - INC HL - OR (HL) - CALL Z,L2A23 - INC HL - DJNZ L2A15 ; (-009H) - LD (IY+046H),001H - RET - -L2A23: CALL SKPDE - PUSH HL - LD DE,00010H - CALL L2ED0 - POP HL - LD (HL),B - DEC HL - LD (HL),C - LD HL,(L180B) - INC H - XOR A -L2A36: LD (HL),020H - INC HL - DEC A - JR NZ,L2A36 ; (-006H) - DEC H - LD DE,L0100 - LD A,010H -L2A42: PUSH AF - CALL L2FCF - POP AF - INC BC - DEC A - JR NZ,L2A42 ; (-009H) - RET - -L2A4C: LD L,(IY+014H) - LD H,(IY+015H) - LD A,H - OR L - SCF - RET Z - LD DE,0FF02H - PUSH HL - ADD HL,DE - JR C,L2A60 ; (+003H) - LD HL,L0000 -L2A60: LD (IY+014H),L - LD (IY+015H),H - POP DE - LD HL,(L180B) - DEC HL - LD (HL),D - DEC HL - LD (HL),E - CALL L2A88 - OR A - LD A,(L1043) - BIT 2,A - RET NZ - LD HL,(L180D) - LD A,(HL) - LD (IY+01EH),A - INC HL - LD A,(HL) - LD (IY+01FH),A - LD DE,L0000 - RET - -L2A88: LD C,(IY+01EH) - LD B,(IY+01FH) - LD A,B - OR C - JP Z,01F76H - LD DE,L0100 - LD HL,(L180B) - JP 02FD0H - - RET - - XOR A - LD (DE),A - PUSH HL - PUSH DE - PUSH DE - CALL L29DF - POP DE - JR C,L2AC7 ; (+01fH) - CALL L181A - PUSH DE - CALL L297C - CALL L29AB - EX DE,HL - POP DE - CALL L2E24 - XOR A - LD (DE),A - CALL L2972 - LD B,020H - XOR A - LD HL,(L1040) - INC HL - RES 7,(HL) - JR L2ACF ; (+008H) - -L2AC7: XOR A - LD B,A - LD HL,(L1040) - INC HL - SET 7,(HL) -L2ACF: POP DE - POP HL - RET - -L2AD2: LD DE,(ELMD20) - LD BC,(ELMD30) - CALL 02FD0H - JP L2D08 - -L2AE0: CALL L2AEA - LD IY,L1000 - JP L2C07 - -L2AEA: PUSH DE - CALL L2DD0 - CALL L2ED0 - LD (ELMD30),BC - LD D,E - LD E,000H - POP HL - JP L2FCF - - OR A - JR NZ,L2B34 ; (+035H) - PUSH DE - CALL L2B6A - LD A,000H - CALL Z,L2B51 - POP DE - CALL L2AEA - LD HL,L1000 - OR 0FFH - CALL L2B51 - CALL L2E2A - LD HL,L2000 - LD (HL),081H - PUSH HL - POP IY - LD HL,(L1014) - LD (IY+014H),L - LD (IY+015H),H - LD HL,(ELMD30) - LD (IY+01EH),L - LD (IY+01FH),H - JP L2F37 - -L2B34: PUSH HL - CALL L2B6A - JP NZ,01F88H - DEC (HL) - LD DE,L1000 - CALL L2E24 - CALL L2F37 -L2B45: XOR A - LD HL,L2000 - CALL L2B51 - CALL L2E2A - POP HL - RET - -L2B51: CALL SKPDE - PUSH AF - LD DE,00014H - ADD HL,DE - CALL LDDEMI - LD BC,00008H - ADD HL,BC - LD C,(HL) - INC HL - LD B,(HL) - CALL L2DD8 - POP AF - JP L2E77 - -L2B6A: CALL L1D15 - JP Z,01F97H - CALL L2E36 - CALL 02F38H - LD A,(HL) - CP 081H - RET - -L2B7A: LD A,009H - LD (L1043),A -L2B7F: CALL L2F6E - XOR B - DEC HL - LD A,(L1043) - BIT 0,A - JP NZ,01F73H - PUSH AF - LD DE,00001H - CALL L2ED0 - LD (IY+01EH),C - LD (IY+01FH),B - LD (IY+046H),001H - POP AF - BIT 1,A - RET Z - LD HL,(L180D) - LD (HL),C - INC HL - LD (HL),B - RET - - RET M - RET Z - CALL L1E9A - RET NZ - POP AF - LD A,(L1043) - BIT 1,A - JP NZ,01F79H - PUSH HL - CALL L2E24 - LD B,020H - CALL ?CLRDE - POP HL - LD A,(HL) - PUSH IY - POP DE - CALL L2E24 - LD HL,L1043 - BIT 3,(HL) - RET NZ - BIT 0,(HL) - JP NZ,L2A4C - CALL L2E5E - CALL L2A88 - LD D,H - LD E,L -L2BDB: LD A,(HL) - INC HL - OR (HL) - INC HL - JR NZ,L2BDB ; (-006H) - DEC HL - DEC HL - SBC HL,DE - LD (IY+042H),L - LD (IY+043H),H - RET - -L2BEC: LD A,B - OR A - RET Z - LD A,(L1043) - BIT 0,A - RET NZ - BIT 2,A - JR NZ,L2C20 ; (+027H) - LD A,006H - CALL L2907 - PUSH IY - POP HL - LD DE,L1000 - CALL L2E24 -L2C07: CALL L2F6E - RLA - INC L - JP Z,01F85H -L2C0F: LD A,001H - LD B,(IY+000H) - JP L2D6A - - RET M - RET Z - CALL L1E9A - RET NZ - JP 01F79H - -L2C20: CALL L29C2 - LD A,(IY+046H) - OR A - RET Z - CALL L2F6E - LD (0CA2CH),A - ADD A,L - RRA - JR L2C0F ; (-023H) - - RET M - RET Z - CALL L1E9A - RET NZ - POP AF - LD (IY+045H),001H - LD A,(HL) - CP (IY+000H) - JP NZ,01F9DH - JR L2C0F ; (-037H) - - CALL SKPDE - LD (02C60H),A - CALL L2F6E - LD D,H - INC L - JP 01F73H - - RET Z - RET M - CALL L1E9A - RET NZ - POP AF - LD BC,L0012 - ADD HL,BC - LD (HL),0FFH -L2C61: CALL L2F37 - JP L2D08 - - CALL SKPDE - CALL L2F6E - LD (HL),D - INC L - JP 01F73H - - RET Z - RET M - CALL L1E9A - RET NZ - POP AF - CALL L2CFB - PUSH HL - LD DE,L1000 - CALL L2E24 - XOR A - LD (L1042),A - LD IX,L2C9B - CALL L1C5F - XOR A - LD (L1000),A - POP HL -L2C93: LD B,(HL) - LD IY,L1000 - JP L2D6A - -L2C9B: INC HL - INC HL - INC HL - CALL L1E9A - JP Z,01F7CH -L2CA4: RET - -L2CA5: DS 16, 000H - DEC C - CALL SKPDE - LD HL,L2CA4 - CALL L1EB4 - XOR A -L2CC0: LD (02CE3H),A - CALL L2F6E - JP Z,L182C - JR L2C93 ; (-038H) - - RET M - LD DE,L2CA4 - CALL L1E9D - JP Z,01F79H - CALL L1E9A - RET NZ - LD (02CE9H),HL - LD A,001H - LD (02CE3H),A - RET - - LD A,0FFH - OR A - JP Z,01F73H - LD HL,0FFFFH - CALL L2CFB - LD DE,L2CA5 - INC HL - EX DE,HL - LD BC,00011H - LDIR - JP L2C61 - -L2CFB: CALL SKPDE - LD DE,L0012 - ADD HL,DE - LD A,(HL) - OR A - RET Z - JP 01F7FH - -L2D08: CALL IOOUT - XOR A - LD (L1FC0),A - LD A,LSE0 -L2D11: PUSH AF - RST 018H - DB 02BH - POP AF - INC A - JR NZ,L2D11 ; (-007H) - LD HL,(L1044) - LD DE,$FD - CALL L2FC9 - RET NZ - LD A,(L1046) - EXX - LD H,A - LD D,000H - LD B,003H - EXX - XOR A - LD (L1042),A -L2D30: EXX - LD A,B - LD (L1046),A - ADD A,090H - LD L,A - LD E,000H - EXX - LD IX,L2D5C - CALL L1C5F - EXX - BIT 7,E - LD A,L - EXX - CALL Z,L1EF1 - EXX - DEC B - EXX - JP P,L2D30 - EXX - LD A,H - LD (L1046),A - BIT 7,D - EXX - CALL Z,L368D - RET - -L2D5C: EXX - LD DE,0FFFFH - EXX - RET - -L2D62: LD A,(L1046) - ADD A,090H - RST 018H - DB 029H - RET - -L2D6A: LD (L2DCF),A - LD A,B - PUSH AF - EX DE,HL - LD HL,L1000 - CALL L2E24 - CALL L2E36 - POP AF - CP 005H - JR C,L2D88 ; (+00aH) - LD A,(L1012) - RLA - LD A,003H - JR NC,L2D88 ; (+002H) - LD A,001H -L2D88: LD HL,02D9CH - ADD A,A - CALL ADDHLA - CALL INDRCT - CALL L00FA - CALL L2F37 - CALL L2E2A - JP L2D08 - - ADD A,02DH - ADD A,02DH - AND (HL) - DEC L - JP PO,L212D - JR NZ,02DB9H ; (+010H) -L2DA9: DEC HL - LD B,(HL) - DEC HL - LD C,(HL) - LD A,B - OR C - RET Z - LD DE,L0100 - LD HL,L11A4 - PUSH HL - PUSH DE - CALL 02FD0H - LD DE,00001H - CALL L2DC9 - POP DE - POP HL - ADD HL,DE - JR L2DA9 ; (-01dH) - - CALL L2DD0 -L2DC9: LD A,(L2DCF) - JP L2E77 - -L2DCF: NOP -L2DD0: LD DE,(ELMD20) - LD BC,(ELMD30) -L2DD8: LD A,E - OR D - JR Z,L2DDD ; (+001H) - DEC DE -L2DDD: INC D - LD E,D - LD D,000H - RET - - LD DE,L0100 - LD BC,(ELMD30) - LD A,(L2DCF) - OR A - LD HL,L11A4 - JR Z,L2DF5 ; (+003H) - LD HL,(L180B) -L2DF5: PUSH HL - PUSH AF - CALL L2FD1 - POP AF - PUSH AF - JR Z,L2E02 ; (+004H) - LD A,(IY+045H) - OR A -L2E02: LD DE,00001H - CALL Z,L2DC9 - POP AF - POP HL - JR Z,L2E13 ; (+007H) - LD E,(IY+042H) - LD D,(IY+043H) - ADD HL,DE -L2E13: LD C,(HL) - INC HL - LD B,(HL) - INC HL - LD A,B - OR C - RET Z - PUSH HL - LD DE,00010H - CALL L2DC9 - POP HL - JR L2E13 ; (-011H) - -L2E24: LD BC,00020H - LDIR - RET - -L2E2A: LD HL,L2800 - LD DE,L0100 - LD BC,L000F - JP L2FCF - -L2E36: LD HL,L2800 - CALL L2E67 - PUSH HL - CALL L2D62 - EX DE,HL - POP HL - RET C - PUSH HL - LD A,(DE) - CP (HL) - JP NZ,01F88H - LD BC,L0006 - ADD HL,BC - EX DE,HL - ADD HL,BC - EX DE,HL - LD B,FDPC -L2E52: LD A,(DE) - CPL - AND (HL) - JP NZ,01F88H - INC HL - INC DE - DJNZ L2E52 ; (-00aH) - POP HL - RET - -L2E5E: CALL L2D62 - RET NC - LD DE,L0100 - RST 018H - DB 02AH -L2E67: LD BC,L000F - LD DE,L0100 - XOR A - CALL L2FD4 - LD A,(HL) - OR A - JP M,01F70H - RET - -L2E77: LD HL,L2800 - CALL L2E84 - OR A - RET NZ - CALL L2D62 - RET C - XOR A -L2E84: CALL IOOUT - OR A - PUSH HL - LD HL,0B600H - LD A,013H - JR NZ,L2E95 ; (+005H) - LD HL,0A62FH - LD A,01BH -L2E95: LD (L2EB2),A - LD (L2EC8),HL - POP HL -L2E9C: CALL L2EA4 - INC BC - DEC E - JR NZ,L2E9C ; (-007H) - RET - -L2EA4: CALL SKPDE - INC HL - LD A,C - SUB (HL) - LD C,A - JR NC,L2EAE ; (+001H) - DEC B -L2EAE: INC HL - LD E,(HL) - INC HL - LD D,(HL) -L2EB2: NOP - DEC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - INC HL - INC HL - LD A,C - LD E,003H -L2EBD: SRL B - RR C - DEC E - JR NZ,L2EBD ; (-007H) - ADD HL,BC - CALL L2F2B -L2EC8: NOP - NOP - CP (HL) - LD (HL),A - RET NZ - JP 01F88H - -L2ED0: PUSH DE - CALL L2E5E - POP DE - PUSH HL - CALL L2EDE - POP HL - LD A,001H - JR L2E84 ; (-05aH) - -L2EDE: LD A,E - EXX - LD E,A - LD D,A - LD B,001H - EXX - INC HL - LD E,(HL) - LD D,000H - INC HL - INC HL - INC HL - LD C,(HL) - INC HL - LD B,(HL) - DEC BC - LD (02EFCH),BC - INC HL - PUSH HL - EXX - POP HL - EXX - LD B,D - LD C,E -L2EFB: LD HL,L0000 - OR A - SBC HL,DE - JP C,01F8BH - EXX - LD A,B - AND (HL) - EXX - CALL L2F15 - INC DE - EXX - RLC B - JR NC,L2F12 ; (+001H) - INC HL -L2F12: EXX - JR L2EFB ; (-01aH) - -L2F15: JR NZ,L2F24 ; (+00dH) - EXX - DEC E - EXX - RET NZ - POP AF - EXX - LD A,D - EXX - LD E,A - LD D,000H - OR A - RET - -L2F24: EXX - LD E,D - EXX - LD B,D - LD C,E - INC BC - RET - -L2F2B: PUSH BC - AND 007H - INC A - LD B,A - XOR A - SCF -L2F32: ADC A,A - DJNZ L2F32 ; (-003H) - POP BC - RET - -L2F37: OR 0AFH - LD HL,L2000 - LD DE,00800H - LD BC,00010H - CALL L2FD1 - LD A,(HL) - OR A - JP P,01F70H - RET - -L2F4B: PUSH HL - PUSH DE - CALL L2E36 - INC HL - INC HL - CALL LDDEMI - CALL INDRCT - XOR A - SBC HL,DE - JP C,01F70H - SRL H - RR L - SRL H - RR L - LD B,H - LD C,L - POP DE - POP HL - OR A - JP L368D - -L2F6E: CALL L1D15 - JP Z,01F97H - POP HL - CALL LDDEMI - LD (02FB1H),HL - LD (02F97H),DE - XOR A - LD (L2FC3),A - CALL 02F38H - LD (L2FC7),HL - LD A,040H - LD (L2FC6),A -L2F8E: LD HL,(L2FC7) - LD A,(HL) - OR A - CALL Z,L2FB3 - CALL 0FFFFH - LD HL,(L2FC7) - LD BC,00020H - ADD HL,BC - LD (L2FC7),HL - LD HL,L2FC6 - DEC (HL) - JR NZ,L2F8E ; (-01bH) - LD A,(L2FC3) - LD HL,(L2FC4) - OR A - JP 0FFFFH - -L2FB3: PUSH AF - LD A,(L2FC3) - OR A - JR NZ,L2FC1 ; (+007H) - INC A - LD (L2FC3),A - LD (L2FC4),HL -L2FC1: POP AF - RET - -L2FC3: NOP -L2FC4: NOP - NOP -L2FC6: NOP -L2FC7: NOP - NOP -L2FC9: PUSH HL - OR A - SBC HL,DE - POP HL - RET - -L2FCF: OR 0AFH -L2FD1: CALL L2FE8 -L2FD4: CALL SKPDE - OR A - LD IX,(ZINP) - JR Z,L2FE2 ; (+004H) - LD IX,(ZOUT) -L2FE2: LD A,(L1046) - JP IOCALL - -L2FE8: CALL IOOUT - LD A,(L35B5) - OR A - RET M - CALL L2D62 - RET C - JP L2E36 - -$CMT: DB "Y3CMT",000H,05FH ; $CMT - Cassette device descriptor -L2FFE: DB 0C0H,000H,014H,"0d0",022H,030H - DB LSE5 - DS 2, 000H - DB 001H,0AAH,"0]0",097H,01FH - SUB A - RRA - SUB A - RRA - CALL TEST1 - DB 054H - LD HL,L2FFE - SET 4,(HL) - RET Z - RES 4,(HL) - OR A - RET - - CALL SKPDE - LD DE,L10F0 - LD A,(HL) - LD C,005H - CP 002H - JR Z,L303D ; (+00eH) - LD C,004H -L3031: CP 003H - JR Z,L303D ; (+008H) - LD C,A -L3036: SUB 004H - CP 002H - JP C,01F9DH -L303D: LD A,C - LD (DE),A - INC HL - INC DE - LD BC,00011H - LDIR - INC HL - INC HL - LD BC,L0006 - LDIR - LD B,068H - CALL ?CLRDE - LD HL,L10F0 - LD BC,L0080 - CALL L30CB - JR L3060 ; (+003H) - - CALL L30D2 -L3060: JP C,L017B - RET - - LD A,037H - LD (L30AA),A - PUSH HL - LD HL,L10F0 - LD BC,L0080 - CALL L3114 - JR C,L30C1 ; (+04cH) - LD DE,L3332 - CALL L3301 - POP DE - LD A,(HL) - LD C,002H - CP 005H - JR Z,L3091 ; (+00eH) - LD C,003H - CP 004H - JR Z,L3091 ; (+008H) - LD C,A - SUB 002H - CP 002H - JP C,01F9DH -L3091: LD A,C - LD (DE),A - INC HL - INC DE - LD BC,00011H - LDIR - XOR A - LD B,002H - CALL ?CLRDE - LD BC,L0006 - LDIR - LD B,006H - JP ?CLRDE - -L30AA: XOR A - JR NC,L30BD ; (+010H) - LD A,0AFH - LD (L30AA),A - PUSH HL - LD HL,L1000 - LD DE,L333F - CALL L3301 - POP HL -L30BD: CALL L311B - RET NC -L30C1: CP 002H - JP NZ,L017B - LD A,0C6H - JP L0182 - -L30CB: CALL L32D4 - LD A,0CCH - JR L30D4 ; (+002H) - -L30D2: LD A,053H -L30D4: LD (03109H),SP - LD SP,L10F0 - PUSH DE - LD E,A - LD D,0D7H - LD A,B - OR C - JR Z,L3107 ; (+024H) - CALL L32CB - CALL L3174 - JR C,L3101 ; (+016H) - LD A,E - CP 0CCH - JR NZ,L30F8 ; (+008H) - PUSH DE - LD DE,L3325 - CALL L3301 - POP DE -L30F8: DI - OUT (LSE4),A - CALL 00780H - CALL NC,L31DD -L3101: DI - OUT (LSE4),A - CALL 00700H -L3107: POP DE - LD SP,L0000 - OUT (LSE0),A - OUT (LSE1),A - PUSH AF - RST 018H - DB 011H - POP AF - RET - -L3114: CALL L32D4 - LD A,0CCH - JR L311D ; (+002H) - -L311B: LD A,053H -L311D: LD (03109H),SP - LD SP,L10F0 - PUSH DE - LD D,LSD2 - LD E,A - LD A,B - OR C - JR Z,L3107 ; (-025H) - CALL L3174 - DI - OUT (LSE4),A - CALL NC,L065B - CALL NC,L3220 - JR L3101 ; (-039H) - -L313A: PUSH HL - LD DE,L334C - LD HL,L1000 - CALL L3301 - POP HL - CALL L3153 - RET NC - CP 002H - JP NZ,L017B - LD A,083H - JP L0182 - -L3153: LD (03109H),SP - LD SP,L10F0 - PUSH DE - LD D,LSD2 - LD E,053H - LD A,B - OR C - JR Z,L3107 ; (-05cH) - CALL L32CB - CALL L3174 - DI - OUT (LSE4),A - CALL NC,L065B - CALL NC,L3274 - JR L3101 ; (-073H) - -L3174: CALL SKPDE - RST 018H - DB 010H - LD HL,MMIO - LD A,FDPA - CALL POPRA - LD B,00AH -L3183: LD HL,0E002H - CALL BREAKX - AND 010H - JR Z,L319A ; (+00dH) -L318D: LD B,0FFH - OUT (LSE2),A -L3191: CALL L09A6 - DJNZ L3191 ; (-005H) - OUT (LSE0),A - XOR A - RET - -L319A: LD HL,0E003H - LD A,006H - CALL POPRA - INC A - CALL POPRA - DJNZ L3183 ; (-025H) - LD A,(L0050) - OR A - JR NZ,L31C7 ; (+019H) - RST 018H - DB 002H - LD A,07FH - RST 018H - DB 004H - LD A,020H - RST 018H - DB 003H - LD A,D - CP 0D7H - LD DE,L32BC - JR Z,L31C3 ; (+003H) - LD DE,L32C3 -L31C3: RST 018H - DB 005H - RST 018H - DB 002H -L31C7: LD HL,0E002H - CALL BREAKX - AND 010H - JR NZ,L318D ; (-044H) - LD HL,0E001H - CALL BREAKX - AND 080H - JR NZ,L31C7 ; (-014H) - SCF - RET - -L31DD: PUSH DE - PUSH BC - PUSH HL - LD D,002H - LD A,FDPA - LD (MMIO),A -L31E7: OUT (LSE1),A - LD A,(HL) - OUT (LSE3),A - CALL L32C8 - LD A,(0E001H) - AND 080H - SCF - JR Z,L321C ; (+025H) - INC HL - DEC BC - LD A,B - OR C - JR NZ,L31E7 ; (-016H) - LD HL,(L1197) - LD A,H - CALL L32C8 - LD A,L - CALL L32C8 - CALL L0D60 - XOR A - DEC D - JR Z,L321C ; (+00dH) - LD B,000H -L3211: CALL L0D47 - DJNZ L3211 ; (-005H) - POP HL - POP BC - PUSH BC - PUSH HL - JR L31E7 ; (-035H) - -L321C: POP HL - POP BC - POP DE - RET - -L3220: PUSH DE - PUSH BC - PUSH HL - LD H,002H -L3225: LD BC,0E001H - LD DE,0E002H -L322B: CALL 00601H - JR C,L3267 ; (+037H) - CALL 00A4AH - LD A,(DE) - AND 020H - JR Z,L322B ; (-00dH) - LD D,H - LD HL,L0000 - LD (L1197),HL - POP HL - POP BC - PUSH BC - PUSH HL -L3243: CALL L0624 - JR C,L3267 ; (+01fH) - OUT (LSE1),A - LD (HL),A - OUT (LSE3),A - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3243 ; (-010H) - LD HL,(L1197) - CALL L0624 - JR C,L3267 ; (+00cH) - CP H - JR NZ,L326B ; (+00dH) - CALL L0624 - JR C,L3267 ; (+004H) - CP L - JR NZ,L326B ; (+005H) -L3266: XOR A -L3267: POP HL - POP BC - POP DE - RET - -L326B: DEC D - LD H,D - JR NZ,L3225 ; (-04aH) -L326F: LD A,002H - SCF - JR L3267 ; (-00dH) - -L3274: PUSH DE - PUSH BC - PUSH HL - LD H,002H -L3279: LD BC,0E001H - LD DE,0E002H -L327F: CALL 00601H - JR C,L3267 ; (-01dH) - CALL 00A4AH - LD A,(DE) - AND 020H - JR Z,L327F ; (-00dH) - LD D,H - POP HL - POP BC - PUSH BC - PUSH HL -L3291: CALL L0624 - JR C,L3267 ; (-02fH) - OUT (LSE1),A - CP (HL) - OUT (LSE3),A - JR NZ,L326F ; (-02eH) - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3291 ; (-012H) - LD HL,(CSMDT) - CALL L0624 - JR C,L3267 ; (-044H) - CP H - JR NZ,L326F ; (-03fH) - CALL L0624 - JR C,L3267 ; (-04cH) - CP L - JR NZ,L326F ; (-047H) - DEC D - LD H,D - JR NZ,L3279 ; (-041H) - JR L3266 ; (-056H) - -L32BC: DB "RECORD." ; CMT status strings (RECORD/PLAY) -L32C3: DB "PLAY",000H -L32C8: JP L076D - -L32CB: DI - OUT (LSE2),A - CALL 0071AH - OUT (LSE0),A - RET - -L32D4: CALL SKPDE - LD A,0C9H - LD (L32D4),A - LD HL,L0036 - BIT 6,(HL) - RET Z - LD HL,L0767 - LD (032C9H),HL - LD HL,L077A - LD (030FCH),HL - LD HL,00996H - LD (03192H),HL - LD HL,L0A01 - LD (03212H),HL - LD HL,L0A1A - LD (03209H),HL - RET - -L3301: LD A,(L0050) - OR A - RET NZ - RST 018H - DB 002H - RST 018H - DB 005H - PUSH HL - INC HL - LD A,022H - RST 018H - DB 003H - LD D,010H -L3312: LD A,(HL) - CP 00DH - JR Z,L331D ; (+006H) - RST 018H - DB 003H - INC HL - DEC D - JR NZ,L3312 ; (-00bH) -L331D: LD A,022H - RST 018H - DB 003H - RST 018H - DB 002H - POP HL - RET - -L3325: DB 057H,005H,"RITING" ; CMT status strings (WRITING/FOUND/LOADING/VERIFYING) - DS 3, 020H - DB 006H - DB 000H -L3332: DB 046H,005H,"OUND" - DS 5, 020H - DB 006H - DB 000H -L333F: DB 04CH,005H,"OADING" - DS 3, 020H - DB 006H - DB 000H -L334C: DB 056H,005H,"ERIFYING ",006H - NOP -$RS: DB 08DH,"5RS" ; $RS - RS-232C device descriptor - DS 2, 000H - DB 08FH,001H,000H,072H,033H,0A4H,033H,0A4H,033H,0B5H,033H,0B5H,033H,0C6H,033H,0DBH,033H - DB LSE5 - DB 000H - RET C - PUSH IY - CALL L33EC - CALL L3380 - CALL L3435 - JR L33D8 ; (+058H) - -L3380: RST 018H - DB 013H - LD (IY-003H),E - CALL TEST1 - DB 02CH - JP NZ,L1F6A - RST 018H - DB 013H - LD (IY-002H),E - LD (IY-008H),00DH - CALL TEST1 - DB 000H - RET Z - CALL TEST1 - DB 02CH - RST 018H - DB 013H - LD (IY-008H),E - RET - - PUSH IY - CALL L33EC - LD A,(IY-001H) - INC (IY-001H) - OR A - CALL Z,L3497 - JR L33D8 ; (+023H) - - PUSH IY - CALL L33EC - DEC (IY-001H) - LD A,(IY-001H) - OR A - CALL Z,L347F - JR L33D7 ; (+011H) - - PUSH IY - CALL L33EC - CALL L34E6 - JR C,L33D8 ; (+008H) - CP (IY-008H) - JR NZ,L33D7 ; (+002H) - LD A,00DH -L33D7: OR A -L33D8: POP IY - RET - - PUSH IY - CALL L33EC - CP 00DH - JR NZ,L33E7 ; (+003H) - LD A,(IY-008H) -L33E7: CALL L352B - JR L33D8 ; (-014H) - -L33EC: PUSH AF - PUSH DE - LD A,(L1046) - INC A - LD IY,033F7H - LD DE,L0015 -L33F9: ADD IY,DE - DEC A - JR NZ,L33F9 ; (-005H) - LD C,(IY+000H) - POP DE - POP AF - RET - - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - OR C - OR B - NOP - DJNZ L3421 ; (+010H) - INC B - LD B,B - INC BC - RET NZ - DEC B - LD H,B - JR NC,L341C ; (+003H) - NOP - NOP - NOP -L341C: NOP - NOP - NOP - NOP - NOP -L3421: OR E - OR D - NOP - DJNZ 03436H ; (+010H) - INC B - LD B,B - INC BC - RET NZ - DEC B - LD H,B - JR NC,L3431 ; (+003H) -L342E: CALL BRKCHK -L3431: RET NZ - JP 0017DH - -L3435: LD A,018H - OUT (C),A - LD A,030H - OUT (C),A - LD A,(IY-002H) - AND 00CH - JR NZ,L3448 ; (+004H) - SET 2,(IY-002H) -L3448: LD A,(IY-002H) - LD B,A - AND 00FH - OR 040H - LD (IY+006H),A - LD A,B - AND 080H - OR 040H - LD (IY+008H),A - RRA - AND 07FH - OR 00AH - LD (IY+00AH),A - LD A,B - OR 07FH - LD (IY+002H),A - CALL L348B -L346C: IN A,(C) - RRCA - RET NC - DEC C - IN A,(C) - INC C - LD A,001H - OUT (C),A - IN A,(C) - AND 070H - JR Z,L346C ; (-012H) - RET - -L347F: RES 0,(IY+008H) - RES 7,(IY+00AH) - LD (IY-001H),000H -L348B: LD B,00AH - PUSH IY - POP HL - LD DE,L0003 - ADD HL,DE - OTIR - RET - -L3497: LD A,030H - OUT (C),A - RET - -L349C: SET 0,(IY+008H) - LD A,013H - OUT (C),A - LD A,(IY+008H) - OUT (C),A - LD A,035H - OUT (C),A - LD A,(IY+00AH) - OR 088H - LD (IY+00AH),A - OUT (C),A - RET - - LD A,003H - OUT (C),A - RES 0,(IY+008H) - LD A,(IY+008H) - OUT (C),A -L34C5: RES 7,(IY+00AH) - JR L34DB ; (+010H) - -L34CB: SET 1,(IY+00AH) - JR L34DB ; (+00aH) - -L34D1: RES 1,(IY+00AH) - JR L34DB ; (+004H) - - SET 7,(IY+00AH) -L34DB: LD A,005H - OUT (C),A - LD A,(IY+00AH) - OUT (C),A - OR A - RET - -L34E6: CALL SKPDE - LD C,(IY+000H) -L34EC: CALL L342E - CALL L3564 - JR C,L34EC ; (-008H) - CALL L349C -L34F7: CALL L342E - IN A,(C) - RRCA - JR NC,L34F7 ; (-008H) - DEC C - IN A,(C) - INC C - AND (IY+002H) - PUSH AF - LD A,001H - OUT (C),A - IN A,(C) - AND 070H - JR NZ,L3516 ; (+005H) - CALL L34C5 - POP AF - RET - -L3516: LD B,A - POP AF - PUSH BC - CALL L3435 - POP BC - LD A,01DH - RLC B - RLC B - RET C - INC A - RLC B - RET C - INC A - SCF - RET - -L352B: CALL SKPDE - LD C,(IY+000H) - LD D,A - CALL L34CB -L3535: CALL L342E - CALL L356B - CALL NC,L357C -L353E: JR C,L3535 ; (-00bH) - IN A,(C) - BIT 2,A - JR Z,L3535 ; (-011H) - BIT 7,(IY-003H) - JR Z,L3555 ; (+009H) - LD A,001H - OUT (C),A - IN A,(C) - RRCA - JR NC,L3535 ; (-020H) -L3555: DEC C - OUT (C),D - INC C - BIT 6,(IY-003H) - JR Z,L3562 ; (+003H) - CALL L34D1 -L3562: OR A - RET - -L3564: OR A - BIT 0,(IY-003H) - JR L3570 ; (+005H) - -L356B: OR A - BIT 1,(IY-003H) -L3570: RET Z - LD A,010H - OUT (C),A - IN A,(C) - AND 008H - RET NZ - SCF - RET - -L357C: OR A - BIT 2,(IY-003H) - RET Z - LD A,010H - OUT (C),A - IN A,(C) - AND 020H - RET NZ - SCF - RET - -$FD: DB 0A2H,"8FD" ; $FD - Floppy Disk device descriptor - DS 2, 000H - DB 03FH,003H,03FH,08DH,036H,00FH - DS 2, 000H - DB 001H,030H,000H,0FEH,000H,005H,037H,008H,037H,097H,01FH - SUB A - RRA - SUB A - RRA - DB 000H -L35AB: DB 000H -L35AC: DB 000H -L35AD: DS 3, 000H -L35B0: DB 000H -L35B1: DS 2, 000H -L35B3: DB 000H -L35B4: DB 000H -L35B5: DB 000H -L35B6: DB 000H -L35B7: DS 4, 000H -L35BB: DS 4, 000H -L35BF: DB 000H -L35C0: PUSH BC - LD A,L - LD B,004H -L35C4: SRL H - RR L - DJNZ L35C4 ; (-006H) - AND 00FH - INC A - LD H,A - POP BC - RET - -L35D0: LD A,H - LD H,000H - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - DEC A - ADD A,L - LD L,A - RET - -L35DB: CALL SKPDE - LD HL,L35B5 - BIT 7,(HL) - JR NZ,L35EB ; (+006H) - CALL L367C - CALL L3898 -L35EB: LD A,(L35AC) - BIT 2,A - SET 2,A - JR Z,L35F6 ; (+002H) - SET 5,A -L35F6: SET 7,A - LD HL,L35B5 - BIT 6,(HL) - JR Z,L3601 ; (+002H) - SET 6,A -L3601: CALL L361C - LD (HL),A - LD HL,L35B7 - CALL L3614 - BIT 0,(HL) - CALL Z,L3695 - RET C - SET 0,(HL) - RET - -L3614: LD A,(L35AC) - AND 003H - JP ADDHLA - -L361C: OUT (0DCH),A - PUSH AF - RLCA - RLCA - OUT (0DDH),A - RLCA - OUT (0DEH),A - POP AF - RET - -L3628: CALL SKPDE - LD D,000H - LD A,(L35B3) - SRL A - CPL - OUT (0DBH),A - LD B,A - LD A,(L35B5) - RES 6,A - BIT 5,A - JR Z,L3640 ; (+001H) - CCF -L3640: JR C,L3644 ; (+002H) - SET 6,A -L3644: CALL L361C - LD HL,L35B5 - CP (HL) - LD (HL),A - JR Z,L364F ; (+001H) - INC D -L364F: LD HL,L35BB - CALL L3614 - LD A,(HL) - OUT (0D9H),A - CP B - JR Z,L3666 ; (+00bH) - INC D - CALL L3673 - PUSH AF - IN A,(0D9H) - LD (HL),A - POP AF - RET C - RET NZ -L3666: LD A,(L35B4) - CPL - OUT (0DAH),A - LD A,D - OR A - CALL NZ,L388D - XOR A - RET - -L3673: LD A,018H - CALL L36C2 - RET C - AND 099H - RET - -L367C: LD HL,L35B5 - SET 7,(HL) - LD A,(HL) - CALL L361C - LD HL,L35B7 - LD B,004H - JP ?CLRHL - -L368D: XOR A - CALL L361C - LD (L35B5),A - RET - -L3695: CALL SKPDE - LD HL,L35BB - CALL L3614 - LD (HL),0FFH - LD A,008H - CALL L36C2 - RET C - AND 085H - XOR 004H - RET Z - JP L385A - -L36AE: PUSH AF - LD A,LSD0 - CALL L36BB - JR C,L36B8 ; (+002H) - POP AF - RET - -L36B8: POP HL - POP HL - RET - -L36BB: CALL SKPDE - LD D,000H - JR L36DC ; (+01aH) - -L36C2: CALL SKPDE - LD B,A - LD A,(035AAH) - CPL - AND 003H - OR B - LD D,000H - JR L36D6 ; (+005H) - -L36D1: CALL SKPDE - LD D,001H -L36D6: CALL L36AE - LD (L35B6),A -L36DC: CPL - OUT (0D8H),A - CALL L3887 - LD E,007H -L36E4: LD HL,L2710 -L36E7: DEC HL - LD A,H - OR L - JP Z,L36F9 - IN A,(0D8H) - CPL - LD B,A - AND 081H - CP D - JR NZ,L36E7 ; (-00fH) - LD A,B - OR A - RET - -L36F9: DEC E - JP Z,L385A - LD A,(L35B6) - CPL - OUT (0D8H),A - JR L36E4 ; (-021H) - - DB 037H - JR L3709 ; (+001H) - - OR A -L3709: EX AF,AF' - PUSH AF - EX AF,AF' - LD (L35B1),HL - PUSH HL - LD HL,L35AB - RL (HL) - RRC (HL) - LD H,(HL) - LD L,A - AND 007H - LD (L35AC),A - CALL L35DB - JR NC,L3728 ; (+005H) - POP HL - EX AF,AF' - POP AF - EX AF,AF' - RET - -L3728: BIT 7,H - LD A,L - POP HL - PUSH HL - CALL Z,L37E7 - LD (035AFH),DE - PUSH DE - OR A - PUSH AF - LD H,B - LD L,C - CALL P,L35C0 - LD (L35AD),HL - LD A,009H - LD (L35BF),A - PUSH IY - CALL L375C - EX AF,AF' - POP IY - LD HL,(L35B3) - POP AF - CALL P,L35D0 - LD B,H - LD C,L - POP DE - POP HL - POP AF - EX AF,AF' - JP L37E7 - -L375C: LD E,000H - LD HL,(035AFH) - LD A,(L35B5) - BIT 5,A - JR Z,L376B ; (+003H) - ADD HL,HL - LD E,080H -L376B: LD A,L - OR A - JR Z,L3770 ; (+001H) - INC H -L3770: LD A,H - LD (L35B0),A -L3774: CALL L37FA - CALL NC,L3628 - RET C - JR NZ,L37E1 ; (+064H) - DI - LD A,(L35AB) - BIT 7,A - LD A,090H - LD IY,0A2EDH - JR NZ,L3791 ; (+006H) - LD A,0B4H - LD IY,0A3EDH -L3791: LD (L37A8),IY - CALL L36D1 - RET C -L3799: LD B,E - PUSH DE - LD DE,0FE7CH -L379E: IN A,(0D8H) - OR E - CP D - JR Z,L379E ; (-006H) - CP LSFC - JR NZ,L37AD ; (+005H) -L37A8: NOP - NOP - JP NZ,L379E -L37AD: POP DE - IN A,(0D8H) - RRA - JP C,L385A - LD A,(L35B4) - INC A - LD (L35B4),A - CP 011H - JR Z,L37C4 ; (+005H) - DEC D - JR NZ,L3799 ; (-029H) - JR L37C5 ; (+001H) - -L37C4: DEC D -L37C5: CALL L36AE - EI - IN A,(0D8H) - CPL - OR A - JR NZ,L37E1 ; (+012H) - LD A,(L35AB) - OR A - CALL Z,L3830 - JR C,L37E1 ; (+009H) - CALL L3818 - LD A,D - OR A - JR NZ,L3774 ; (-06bH) - XOR A - RET - -L37E1: CALL L380B - RET C - JR L3774 ; (-073H) - -L37E7: CALL IOOUT - LD A,(L35B5) - BIT 5,A - RET Z -L37F0: LD A,(HL) - CPL - LD (HL),A - INC HL - DEC DE - LD A,D - OR E - JR NZ,L37F0 ; (-009H) - RET - -L37FA: LD HL,(L35AD) - LD (L35B3),HL - LD HL,(L35B1) - LD A,(L35B0) - LD D,A - LD C,0DBH - OR A - RET - -L380B: CALL SKPDE - LD HL,L35BF - DEC (HL) - JP Z,L385A - JP L3695 - -L3818: LD (L35B1),HL - LD A,D - LD (L35B0),A - LD HL,(L35B3) - LD A,H - CP 011H - RET NZ - LD H,001H - INC L - LD (L35AD),HL - LD (L35B3),HL - RET - -L3830: LD A,(035AEH) - CPL - OUT (0DAH),A - LD A,090H - CALL L36D1 - RET C - LD A,(L35B4) - LD B,A -L3840: IN A,(0D8H) - CPL - AND 081H - CP 001H - JR NZ,L3852 ; (+009H) - IN A,(0DAH) - CPL - CP B - JR NZ,L3840 ; (-00fH) - CALL L36AE -L3852: IN A,(0D8H) - CPL - AND 099H - RET Z - SCF - RET - -L385A: LD A,(L35B6) - RLA - IN A,(0D8H) - CPL - JR NC,L3878 ; (+015H) - RLA - JR C,L387B ; (+015H) - RLA - JR NC,L3870 ; (+007H) - LD HL,L35AB - BIT 7,(HL) - JR Z,L387F ; (+00fH) -L3870: AND 0C0H - JR NZ,L3883 ; (+00fH) -L3874: LD A,029H - SCF - RET - -L3878: RLA - JR NC,L3874 ; (-007H) -L387B: LD A,032H - SCF - RET - -L387F: LD A,02EH - SCF - RET - -L3883: LD A,036H - SCF - RET - -L3887: PUSH DE - LD DE,L000F - JR L3891 ; (+004H) - -L388D: PUSH DE - LD DE,L2026 -L3891: DEC DE - LD A,E - OR D - JR NZ,L3891 ; (-005H) - POP DE - RET - -L3898: PUSH BC - LD B,011H -L389B: CALL L388D - DJNZ L389B ; (-005H) - POP BC - RET - -$QD: DB 05EH,00DH,051H,044H ; $QD - Quick Disk device descriptor - DS 2, 000H - DB "_@ ",0C2H,038H,001H,039H,01FH,039H,0DAH,038H,000H,004H,012H,"9)9" - DS 2, 000H - NOP - NOP - CP A - JR C,0386FH ; (-051H) - SCF - RET - - RET C - CALL TEST1 - DB 059H - JR Z,L38D0 ; (+007H) - OR A - JP NZ,L1F6A - CALL L1E7A -L38D0: CALL L3924 - RET C - RST 018H - DB 010H - LD C,002H - JR L3919 ; (+03fH) - - OR A - JR NZ,L38FA ; (+01dH) - RST 018H - DB 010H - XOR A - LD (L395E),A - LD C,005H - CALL L38EB - LD BC,00001H -L38EB: LD (L3954),HL - LD (03956H),DE - LD HL,L3953 - LD (HL),B - DEC HL - LD (HL),C - JR L3968 ; (+06eH) - -L38FA: CALL SKPDE - LD C,006H - JR L3919 ; (+018H) - - LD BC,L0003 - LD DE,00040H - CALL L38EB - RET NC - CP 028H - SCF - RET NZ - LD A,000H - RET - - RST 018H - DB 010H - LD D,B - LD E,C - LD BC,00103H -L3919: CALL L38EB - RST 018H - DB 011H - RET - - LD A,037H - LD (L392C),A -L3924: LD BC,L0101 - JR L38EB ; (-03eH) - - PUSH AF - RST 018H - DB 010H -L392C: XOR A - JR NC,L3943 ; (+014H) - LD A,0AFH - LD (L392C),A - CALL L1C2B - LD (L3958),HL - LD HL,L1000 - LD DE,00040H - POP AF - JR L3949 ; (+006H) - -L3943: LD (L3958),HL - POP AF - SET 0,A -L3949: LD (0395AH),BC - LD B,A - LD C,004H - JR L3919 ; (-039H) - - DB 000H -L3953: DB 000H -L3954: DS 4, 000H -L3958: DS 4, 000H -L395C: DB 000H -L395D: DB 000H -L395E: DB 000H -L395F: DB 000H -L3960: DB 000H -L3961: DB 000H -L3962: DB 000H -L3963: DB 000H -L3964: DB 000H -L3965: DS 3, 000H -L3968: LD A,005H - LD (L3964),A -L396D: DI - CALL L39BC - EI - RET NC - PUSH AF - CP 028H - JR Z,L39BA ; (+042H) - CALL L3C37 - LD A,(03952H) - CP 004H - JR NZ,L399F ; (+01dH) - LD A,(L3960) - OR A - JR Z,L399F ; (+017H) - XOR A - LD (L3960),A - LD A,(L3961) - PUSH HL - LD (03966H),SP - POP HL - DI - CALL L3BB7 - EI - JR C,L39B4 ; (+018H) - CALL L3C37 -L399F: POP AF - PUSH AF - CP 029H - JR NZ,L39B4 ; (+00fH) - LD HL,L3964 - DEC (HL) - JR Z,L39B4 ; (+009H) - POP AF - LD A,(L395F) - LD (L395E),A - JR L396D ; (-047H) - -L39B4: CALL L3B29 - CALL L39D5 -L39BA: POP AF - RET - -L39BC: LD (03966H),SP - LD A,(03952H) - DEC A - JR Z,L39DC ; (+016H) - DEC A - JR Z,L39E2 ; (+019H) - DEC A - JR Z,L3A2C ; (+060H) - DEC A - JP Z,L3A9C - DEC A - JR Z,L39D5 ; (+002H) - JR L3A25 ; (+050H) - -L39D5: PUSH AF - XOR A - LD (L395C),A - POP AF - RET - -L39DC: LD A,(L3953) - JP L3B8B - -L39E2: XOR A - CALL L3BB7 - CALL L3CB5 - LD BC,0EFFFH - LD A,0AAH -L39EE: CPL - LD D,A - CALL L3D2C - DEC BC - LD A,B - OR C - JR Z,L39FB ; (+003H) - LD A,D - JR L39EE ; (-00dH) - -L39FB: CALL L3D02 - CALL L3C37 - CALL L3BEA - LD A,(L3962) - DEC A - JR NZ,L3A28 ; (+01eH) - CALL L3C4C - LD BC,0EFFFH - LD E,055H -L3A12: CP E - JR NZ,L3A28 ; (+013H) - DEC BC - LD A,B - OR C - JR Z,L3A22 ; (+008H) - LD A,E - CPL - LD E,A - CALL L3D42 - JR L3A12 ; (-010H) - -L3A22: CALL L3D14 -L3A25: JP L3C37 - -L3A28: LD A,029H - SCF - RET - -L3A2C: LD A,(L3963) - OR A - CALL Z,L3BEA - CALL L3A62 - RET C - CALL L3D87 - CALL L3D42 - LD C,A -L3A3E: CALL L3D42 - LD B,A - LD HL,(03956H) - SBC HL,BC - JP C,L3B33 - LD HL,(L3954) -L3A4D: CALL L3D42 - LD (HL),A - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3A4D ; (-00aH) - CALL L3D14 - LD A,(L3953) - BIT 0,A - JR NZ,L3A25 ; (-03cH) - RET - -L3A62: LD HL,L3962 - DEC (HL) - JR Z,L3A98 ; (+030H) - CALL L3C4C - LD C,A - LD A,(L395C) - LD HL,L395D - CP (HL) - JR NZ,L3A95 ; (+020H) - INC A - LD (L395C),A - LD (HL),A - LD A,(L3953) - XOR C - RRA - RET NC -L3A80: CALL L3D42 - LD C,A - CALL L3D42 - LD B,A -L3A88: CALL L3D42 - DEC BC - LD A,B - OR C - JR NZ,L3A88 ; (-008H) - CALL L3D14 - JR L3A62 ; (-033H) - -L3A95: INC (HL) - JR L3A80 ; (-018H) - -L3A98: LD A,028H - SCF - RET - -L3A9C: LD A,(L395E) - LD (L395F),A - LD A,(L3963) - OR A - JR NZ,L3ABF ; (+017H) - CALL L3BEA - LD A,(L395E) - LD HL,L3962 - ADD A,(HL) - LD (L3962),A - INC A - LD (L395C),A - CALL L3A62 - JP NC,L3B33 -L3ABF: LD A,(L3953) - LD B,A - AND 001H - JR NZ,L3AD3 ; (+00cH) - LD DE,L3954 - LD A,B - RES 2,A - CALL L3B3C - CALL L3D87 -L3AD3: LD DE,L3958 - LD A,(L3953) - SET 0,A - CALL L3B3C - CALL L3C37 - CALL L3D87 - LD A,(L3953) - AND 004H - JR Z,L3B37 ; (+04cH) - LD A,(L3961) - LD HL,L395E - ADD A,(HL) - CALL L3BB7 - LD A,001H - LD (L3960),A -L3AFA: LD A,(L3961) - LD HL,L395F - ADD A,(HL) - INC A - LD (L3962),A - INC A - LD (L395C),A - CALL L3A62 - JR NC,L3B33 ; (+025H) - LD A,(L3953) - AND 001H - JR NZ,L3B1C ; (+007H) - LD DE,L3954 - CALL L3B6A - RET C -L3B1C: LD DE,L3958 - CALL L3B6A - RET C - LD A,(L3960) - OR A - JR Z,L3B30 ; (+007H) -L3B29: XOR A - LD (L395E),A - LD (L3960),A -L3B30: JP L3C37 - -L3B33: LD A,029H - SCF - RET - -L3B37: CALL L3BEA - JR L3AFA ; (-042H) - -L3B3C: PUSH AF - LD HL,L395E - INC (HL) - CALL L3CB5 - POP AF - CALL L3D2C - CALL L3B60 - LD A,C - CALL L3D2C - LD A,B - CALL L3D2C -L3B53: LD A,(HL) - CALL L3D2C - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3B53 ; (-00aH) - JP L3D02 - -L3B60: EX DE,HL - LD E,(HL) - INC HL - LD D,(HL) - INC HL - LD C,(HL) - INC HL - LD B,(HL) - EX DE,HL - RET - -L3B6A: CALL L3C4C - CALL L3B60 - CALL L3D42 - CP C - JR NZ,L3B33 ; (-043H) - CALL L3D42 - CP B - JR NZ,L3B33 ; (-049H) -L3B7C: CALL L3D42 - CP (HL) - JR NZ,L3B33 ; (-04fH) - INC HL - DEC BC - LD A,B - OR C - JR NZ,L3B7C ; (-00cH) - JP L3D14 - -L3B8B: LD B,A - LD A,002H - OUT (0F7H),A - LD A,081H - OUT (0F7H),A - LD A,002H - OUT (0F7H),A - IN A,(0F7H) - AND 0F0H - CP 080H - JP NZ,03D58H - LD A,010H - OUT (0F6H),A - IN A,(0F6H) - LD C,A - AND 008H - JP Z,03D58H - LD A,B - OR A - RET Z - LD A,C - AND 020H - RET NZ - JP 03D55H - -L3BB7: PUSH AF - LD HL,03D7EH - LD B,009H - CALL L3C27 -L3BC0: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 008H - JP Z,03D58H - LD A,010H - OUT (0F7H),A - IN A,(0F7H) - AND 008H - JR Z,L3BC0 ; (-015H) - LD BC,L00E9 - CALL L3D66 - CALL L3CEA - CALL L3CCE - POP AF - CALL L3D2C - CALL L3D02 - JR L3C1D ; (+033H) - -L3BEA: LD HL,L3D73 - LD B,00BH - CALL L3C27 -L3BF2: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 008H - JP Z,03D58H - CALL L3D87 - LD A,010H - OUT (0F7H),A - IN A,(0F7H) - AND 008H - JR Z,L3BF2 ; (-018H) - LD BC,L00E9 - CALL L3D66 - CALL L3C62 - LD (L3961),A - INC A - LD (L3962),A - CALL L3D14 -L3C1D: LD HL,L3965 - SET 3,(HL) - XOR A - LD (L395D),A - RET - -L3C27: LD C,0F6H - OTIR - LD A,005H - LD (L3963),A - OUT (0F7H),A - LD A,080H - OUT (0F7H),A - RET - -L3C37: PUSH AF - LD A,005H - OUT (0F6H),A - LD A,060H - OUT (0F6H),A - LD A,005H - OUT (0F7H),A - XOR A - LD (L3963),A - OUT (0F7H),A - POP AF - RET - -L3C4C: LD A,058H - LD B,00BH - LD HL,L3D73 - CALL L3CF3 - LD HL,L3965 - BIT 3,(HL) - LD BC,L0003 - JR Z,L3C65 ; (+005H) - RES 3,(HL) -L3C62: LD BC,L00A0 -L3C65: CALL L3D66 - LD A,005H - OUT (0F7H),A - LD A,082H - OUT (0F7H),A - LD A,003H - OUT (0F6H),A - LD A,LSD3 - OUT (0F6H),A - LD BC,L2CC0 -L3C7B: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 010H - JR Z,L3C8D ; (+008H) - DEC BC - LD A,B - OR C - JR NZ,L3C7B ; (-00fH) - JP 03D5EH - -L3C8D: LD A,003H - OUT (0F6H),A - LD A,0C3H - OUT (0F6H),A - LD B,09FH -L3C97: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 001H - JR NZ,L3CA7 ; (+006H) - DEC B - JR NZ,L3C97 ; (-00dH) - JP 03D5EH - -L3CA7: LD A,003H - OUT (0F6H),A - LD A,0C9H - OUT (0F6H),A - CALL L3D42 - JP L3D42 - -L3CB5: LD A,098H - LD B,009H - LD HL,03D7EH - CALL L3CF3 - CALL L3CEA - LD HL,L3965 - BIT 3,(HL) - LD BC,0001DH - JR Z,L3CD1 ; (+005H) - RES 3,(HL) -L3CCE: LD BC,L0140 -L3CD1: CALL L3D66 - LD A,005H - OUT (0F6H),A - LD A,0EFH - OUT (0F6H),A - LD BC,00001H - CALL L3D66 - LD A,0C0H - OUT (0F6H),A - LD A,0A5H - JR L3D2C ; (+042H) - -L3CEA: LD A,005H - OUT (0F6H),A - LD A,0FFH - OUT (0F6H),A - RET - -L3CF3: LD C,0F6H - OUT (C),A - LD A,005H - OUT (0F7H),A -L3CFB: LD A,080H - OUT (0F7H),A - OTIR - RET - -L3D02: LD BC,00001H - CALL L3D66 - LD A,010H - OUT (0F7H),A - IN A,(0F7H) - AND 008H - RET NZ - JP 03D5BH - -L3D14: LD B,003H -L3D16: CALL L3D42 - DJNZ L3D16 ; (-005H) -L3D1B: IN A,(0F6H) - RRCA - JR NC,L3D1B ; (-005H) - LD A,001H - OUT (0F6H),A - IN A,(0F6H) - AND 040H - JR NZ,L3D52 ; (+028H) - OR A - RET - -L3D2C: PUSH AF -L3D2D: IN A,(0F6H) - AND 004H - JR Z,L3D2D ; (-006H) - POP AF - OUT (QDPC),A -L3D36: LD A,010H - OUT (0F6H),A - IN A,(0F6H) - AND 008H - JP Z,03D58H - RET - -L3D42: CALL L3D36 - IN A,(0F6H) - RLCA - JR C,L3D52 ; (+008H) - RRCA - RRCA - JR NC,L3D42 ; (-00cH) - IN A,(QDPC) - OR A - RET - -L3D52: LD A,029H - LD HL,02E3EH - LD HL,0323EH - LD HL,L353E - LD HL,0363EH - LD SP,(03966H) - SCF - RET - -L3D66: PUSH AF -L3D67: LD A,096H -L3D69: DEC A - JR NZ,L3D69 ; (-003H) - DEC BC - LD A,B - OR C - JR NZ,L3D67 ; (-00aH) - POP AF - RET - -L3D73: LD E,B - INC B - DJNZ L3D7C ; (+005H) - INC B - INC BC - RET NC - LD B,016H -L3D7C: RLCA - LD D,098H - INC B - DJNZ 03D88H ; (+006H) - LD D,007H - LD D,005H - LD L,L -L3D87: LD A,0E8H - OUT (LSE3),A - LD (MMIO),A - NOP - LD A,(0E001H) - OUT (LSE1),A - AND 081H - RET NZ - CALL L3B29 - JP L017B - - PUSH HL - LD DE,(00188H) - PUSH DE - LD DE,L3DE4 - LD (00188H),DE - LD A,(L004F) - PUSH AF - LD A,064H - LD (L004F),A - LD (03E5BH),SP - XOR A - LD (L1091),A -L3DBB: LD SP,L0000 -L3DBE: LD BC,L3DBE - PUSH BC - RST 018H - DB 002H - LD A,02AH - RST 018H - DB 003H -L3DC8: CALL L3E67 - JR NC,L3DC8 ; (-005H) - LD A,(DE) - CP 02AH - RET NZ - INC DE - LD A,(DE) - INC DE - EXX - LD HL,L3DF6 - LD B,00AH -L3DDA: CP (HL) - INC HL - JR Z,L3DF0 ; (+012H) - INC HL - INC HL - DJNZ L3DDA ; (-008H) - EXX - RET - -L3DE4: LD C,A - AND 07FH - JR Z,L3DBB ; (-02eH) - LD A,C - RST 018H - DB 01BH - RST 018H - DB 043H - JR L3DBB ; (-035H) - -L3DF0: LD E,(HL) - INC HL - LD D,(HL) - PUSH DE - EXX - RET - -L3DF6: LD B,H - CALL C,L4D3E - LD C,(HL) - CCF - LD D,B - INC D - LD A,047H - RST 010H - LD A,046H - LD (HL),D - CCF - LD D,D -L3E06: LD E,D - LD A,053H - DEC E - LD A,04CH - INC (HL) - LD A,056H - LD D,C - LD A,054H - JP NZ,03A3FH - SUB C - DJNZ L3E06 ; (-012H) - LD BC,09132H - DJNZ 03DE6H ; (-037H) - CALL L3FAB - RET C - EXX - CALL L3FD9 - EXX - LD (ELMD20),BC - LD (ELMD22),DE - LD (L1018),HL - RST 018H - DB 031H - RET - - CALL L3E88 - PUSH HL - PUSH AF - CALL L3E46 - POP AF - POP HL - JR NC,L3E43 ; (+003H) - LD HL,(ELMD22) -L3E43: RST 018H - DB 030H - RET - -L3E46: CALL L3FD9 - RST 018H - DB 02FH - CP 001H - RET Z - JP 01F9DH - - CALL L3E46 - LD HL,(ELMD22) - RST 018H - DB 032H - RET - - LD SP,L0000 - POP AF - LD (L004F),A - POP HL - LD (00188H),HL - POP HL - RET - -L3E67: LD DE,0FF00H - RST 018H - DB 00CH - JR C,L3E86 ; (+018H) - LD A,(DE) - CP 03AH - SCF - RET NZ - INC DE - CALL L3E88 - RET C - LD A,(DE) - INC DE - XOR 03DH - RET NZ -L3E7D: CALL L3EAD - CCF - RET NC - LD (HL),A - INC HL - JR L3E7D ; (-009H) - -L3E86: LD (DE),A - RET - -L3E88: PUSH HL - CALL L3EA2 - PUSH DE - CALL L3EB4 - JR C,L3E9D ; (+00bH) - LD H,A - CALL L3EB4 - JR C,L3E9D ; (+005H) - LD L,A - POP AF - POP AF - XOR A - RET - -L3E9D: POP DE - POP HL - SCF - RET - -L3EA1: INC DE -L3EA2: LD A,(DE) - CP 020H - JR Z,L3EA1 ; (-006H) - RET - -L3EA8: LD A,(DE) - RST 018H - DB 015H - INC DE - RET - -L3EAD: CALL L3EA2 - CP 03BH - JR Z,L3ED2 ; (+01eH) -L3EB4: PUSH BC - PUSH DE - CALL L3EA8 - JR C,L3ECE ; (+013H) - LD C,A - CALL L3EA8 - JR C,L3ECE ; (+00dH) - LD B,A - LD A,C - RLCA - RLCA - RLCA - RLCA - ADD A,B - LD C,A - LD A,C - POP BC - POP BC - OR A - RET - -L3ECE: POP DE - POP BC - SCF - RET - -L3ED2: INC DE - LD A,(DE) - INC DE - OR A - RET - - CALL L3E88 - RET C - JP (HL) - - CALL L3E88 - JR C,L3EEC ; (+00bH) - PUSH HL - CALL L3E88 - JR C,L3EEB ; (+004H) - POP DE - EX DE,HL - JR L3EF2 ; (+007H) - -L3EEB: POP HL -L3EEC: EX DE,HL - LD HL,L0080 - ADD HL,DE - EX DE,HL -L3EF2: LD C,008H - CALL L3EFF - RET C - PUSH HL - SBC HL,DE - POP HL - RET NC - JR L3EF2 ; (-00dH) - -L3EFF: CALL L3F27 - LD B,C - PUSH HL -L3F04: LD A,(HL) - CALL L3F38 - INC HL - LD A,020H - RST 018H - DB 009H - DJNZ L3F04 ; (-00bH) - POP HL - LD A,02FH - RST 018H - DB 009H - LD B,C -L3F15: LD A,(HL) - CP 020H - JR NC,L3F1C ; (+002H) - LD A,02EH -L3F1C: RST 018H - DB 009H - INC HL - DJNZ L3F15 ; (-00cH) - RST 018H - DB 008H - RST 018H - DB 00FH - OR A - RET - -L3F27: LD A,03AH - RST 018H - DB 009H - LD A,H - CALL L3F38 - LD A,L - CALL L3F38 - LD A,03DH - RST 018H - DB 009H - RET - -L3F38: PUSH AF - RLCA - RLCA - RLCA - RLCA - CALL L3F41 - POP AF -L3F41: AND 00FH - ADD A,030H - CP 03AH - JR C,L3F4B ; (+002H) - ADD A,007H -L3F4B: RST 018H - DB 009H - RET - - CALL L3E88 - LD A,(L1091) - PUSH AF - XOR A - LD (L1091),A -L3F59: RST 018H - DB 002H - CALL L3F27 - LD A,(HL) - CALL L3F38 - LD A,014H - RST 018H - DB 003H - RST 018H - DB 003H - CALL L3E67 - JR NC,L3F59 ; (-014H) - POP AF - LD (L1091),A - RET - - CALL L3E88 - RET C - PUSH HL - CALL L3E88 - POP BC - RET C - PUSH HL - PUSH BC - LD HL,0FF00H - CALL L3E7D - LD DE,0FF00H - OR A - SBC HL,DE - LD C,L - POP HL - PUSH HL - EXX - POP HL - POP DE - EXX - RET Z -L3F92: CALL L3FEC - JR NZ,L3F9B ; (+004H) - CALL L3EFF - RET C -L3F9B: RST 018H - DB 00EH - RET Z - EXX - INC HL - PUSH HL - SCF - SBC HL,DE - POP HL - RET NC - PUSH HL - EXX - POP HL - JR L3F92 ; (-019H) - -L3FAB: CALL L3E88 - PUSH HL - CALL NC,L3E88 - POP BC - RET C - SBC HL,BC - INC HL - PUSH HL - PUSH BC - CALL L3E88 - PUSH HL - EXX - POP HL - POP DE - POP BC - RET - - CALL L3FAB - RET C - EX DE,HL - PUSH HL - SBC HL,DE - POP HL - JR C,L3FD0 ; (+003H) - LDIR - RET - -L3FD0: ADD HL,BC - DEC HL - EX DE,HL - ADD HL,BC - DEC HL - EX DE,HL - LDDR - RET - -L3FD9: LD A,(DE) - OR A - JR Z,L3FE2 ; (+005H) - INC DE - CP 03AH - JR NZ,L3FD9 ; (-009H) -L3FE2: RST 018H - DB 017H - RST 018H - DB 02DH - LD A,001H - LD (L1000),A - RET - -L3FEC: LD A,(DE) - CP (HL) - RET NZ - PUSH BC - PUSH DE - PUSH HL - LD B,C -L3FF3: LD A,(DE) - CP (HL) - JR NZ,L3FFC ; (+005H) - INC DE - INC HL - DJNZ L3FF3 ; (-008H) - XOR A -L3FFC: POP HL - POP DE - POP BC - RET - -L4000: LD HL,085FFH - LD (L1070),HL - LD HL,L4046 - LD (000E3H),HL - LD A,B - OR A - JR Z,L401B ; (+00bH) - LD HL,L4036 - LD DE,L1361 - LD BC,00010H - LDIR -L401B: LD DE,L84E7 - RST 018H - DB 005H - RST 018H - DB 020H - EX DE,HL -L4023: LD (HL),000H - INC HL - LD A,H - CP 0FFH - JR C,L4023 ; (-008H) -L402B: CALL L4902 - CALL L4914 - CALL L5E1D - JR L404A ; (+014H) - -L4036: RRCA - DB "RUN ",022H,041H,055H ; AUTO RUN string -L403E: DB "TO RUN",022H,00DH -L4046: DB 03EH - DB 016H - DB 0DFH - DB 003H -L404A: LD HL,L4B85 - LD (00188H),HL -L4050: RST 018H - DB 002H - LD DE,L4B72 - RST 018H - DB 005H - RST 018H - DB 001H -L4059: LD A,(L4B78) - OR A - JR NZ,L406B ; (+00cH) - LD SP,(INTFAC) - LD HL,0FFFFH - PUSH HL - LD (08496H),SP -L406B: LD HL,L0000 - LD (L8483),HL - XOR A - LD (L0050),A - CALL L48B1 - RST 018H - DB 043H - LD DE,L11A4 - RST 018H - DB 00CH - JR NC,L408D ; (+00cH) -L4081: LD HL,L48B0 - LD A,(HL) - OR A - LD (HL),000H - JR NZ,L4050 ; (-03aH) - JR L4059 ; (-033H) - -L408C: INC DE -L408D: LD A,(DE) - CP 020H - JR Z,L408C ; (-006H) - OR A - JR Z,L4059 ; (-03cH) - CALL L5EC4 - JP NC,L473E - LD HL,L84E7 - PUSH HL - CALL L66EF - INC HL - LD (L847D),HL - CALL L4952 - POP HL - JR L40AF ; (+003H) - -L40AC: CALL 05E48H -L40AF: LD (08496H),SP -L40B3: LD DE,L40AC - PUSH DE -L40B7: LD (L8498),HL - CALL BRKCHK - JP Z,0017DH -L40C0: LD A,(HL) - INC HL - CP 080H - JR NC,L411A ; (+054H) - CP 027H - JP Z,L4F8A - CP 020H - JR Z,L40C0 ; (-00fH) - CP 03AH - JR Z,L40B7 ; (-01cH) - OR A - JR Z,L40E1 ; (+00bH) - DEC HL - SUB 041H - CP 01AH - JP C,L4C99 - JP L4AEC - -L40E1: LD HL,(L847D) -L40E4: LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - JR Z,L4103 ; (+018H) - LD (L0050),A - EX DE,HL - ADD HL,DE - DEC HL - LD (L847D),HL - EX DE,HL - INC HL - CALL LDDEMI - LD (08483H),DE - CALL L4971 - POP DE - JR L40AF ; (-054H) - -L4103: POP HL - CALL L4146 - JP Z,L4050 - XOR A - LD (L4B78),A - LD A,(L8486) - CP 002H - JP Z,04B19H - PUSH HL - JP L484D - -L411A: CP 0FFH - JP Z,L4CCB - LD DE,L44AC - CP 0FEH - JR NZ,L412A ; (+004H) - LD A,(HL) - INC HL - JR L4132 ; (+008H) - -L412A: CP LSE0 - JP NC,L4AEC - LD DE,L43EC -L4132: ADD A,A - PUSH HL - EX DE,HL - LD E,A - LD D,000H - ADD HL,DE - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - EX (SP),HL -L413E: CALL HLFTCH -L4141: OR A - RET Z - CP 03AH - RET - -L4146: PUSH HL - LD HL,(L8483) - LD A,L - OR H - POP HL - RET - - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -STMTWORDTBL:DB "GOT", "O" | 080H ; BASIC statement keyword text table - DB "GOSU", "B" | 080H - DB 080H - DB "RU", "N" | 080H - DB "RETUR", "N" | 080H - DB "RESTOR", "E" | 080H - DB "RESUM", "E" | 080H - DB "LIS", "T" | 080H - DB 080H - DB "DELET", "E" | 080H - DB "RENU", "M" | 080H - DB "AUT", "O" | 080H - DB "EDI", "T" | 080H -L4193: DB "FO", "R" | 080H - DB "NEX", "T" | 080H - DB "PRIN", "T" | 080H - DB 080H - DB "INPU", "T" | 080H - DB 080H - DB "I", "F" | 080H - DB "DAT", "A" | 080H - DB "REA", "D" | 080H - DB "DI", "M" | 080H - DB "RE", "M" | 080H - DB "EN", "D" | 080H - DB "STO", "P" | 080H - DB "CON", "T" | 080H - DB "CL", "S" | 080H - DB 080H - DB "O", "N" | 080H - DB "LE", "T" | 080H - DB "NE", "W" | 080H - DB "POK", "E" | 080H - DB "OF", "F" | 080H - DB "MOD", "E" | 080H - DB "SKI", "P" | 080H - DB "PLO", "T" | 080H - DB "LIN", "E" | 080H - DB "RLIN", "E" | 080H - DB "MOV", "E" | 080H - DB "RMOV", "E" | 080H - DB "TRO", "N" | 080H - DB "TROF", "F" | 080H - DB "INP", "@" | 080H - DB "DEFAUL", "T" | 080H - DB "GE", "T" | 080H - DB "PCOLO", "R" | 080H - DB "PHOM", "E" | 080H - DB "HSE", "T" | 080H - DB "GPRIN", "T" | 080H - DB "KE", "Y" | 080H - DB "AXI", "S" | 080H - DB "LOA", "D" | 080H - DB "SAV", "E" | 080H - DB "MERG", "E" | 080H - DB "CHAI", "N" | 080H - DB "CONSOL", "E" | 080H - DB "SEARC", "H" | 080H - DB "OUT", "@" | 080H - DB "CIRCL", "E" | 080H - DB "TES", "T" | 080H - DB "PAG", "E" | 080H - DB "WAI", "T" | 080H - DB "SWA", "P" | 080H - DB 080H - DB "ERRO", "R" | 080H - DB "ELS", "E" | 080H - DB "US", "R" | 080H - DB "BY", "E" | 080H - DB 080H - DB 080H - DB "DE", "F" | 080H - DB 080H - DB 080H - DB "LABE", "L" | 080H - DB 080H - DB 080H - DB 080H - DB "WOPE", "N" | 080H - DB "CLOS", "E" | 080H - DB "ROPE", "N" | 080H - DB "XOPE", "N" | 080H - DB 080H - DB 080H - DB 080H - DB "DI", "R" | 080H - DB 080H - DB 080H - DB "RENAM", "E" | 080H - DB "KIL", "L" | 080H - DB "LOC", "K" | 080H - DB "UNLOC", "K" | 080H - DB "INI", "T" | 080H - DB 080H - DB 080H - DB "RMO", "V" | 080H - DB "T", "O" | 080H - DB "STE", "P" | 080H - DB "THE", "N" | 080H - DB "USIN", "G" | 080H - DB 080H - DB 080H - DB "TA", "B" | 080H - DB "SP", "C" | 080H - DB 080H - DB 080H - DB ".XO", "R" | 080H - DB ".O", "R" | 080H - DB ".AN", "D" | 080H - DB ".NO", "T" | 080H - DB ">", "<" | 080H - DB "<", ">" | 080H - DB "=", "<" | 080H - DB "<", "=" | 080H - DB "=", ">" | 080H - DB ">", "=" | 080H - DB "=" | 080H - DB ">" | 080H - DB "<" | 080H - DB "+" | 080H - DB "-" | 080H - DB 080H - DB 080H - DB "/" | 080H - DB "*" | 080H - DB "^" | 080H - DB 0FFH -EXTWORDTBL: DB 080H ; BASIC extended keyword text table - DB "SE", "T" | 080H - DB "RESE", "T" | 080H - DB "COLO", "R" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "BEE", "P" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "MUSI", "C" | 080H - DB "TEMP", "O" | 080H - DB "CURSO", "R" | 080H - DB "VERIF", "Y" | 080H - DB "CL", "R" | 080H -L433E: DB "LIMI", "T" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "BOO", "T" | 080H - DB 0FFH -FUNCWORDTBL:DB "IN", "T" | 080H ; BASIC function keyword text table - DB "AB", "S" | 080H - DB "SI", "N" | 080H - DB "CO", "S" | 080H - DB "TA", "N" | 080H - DB "L", "N" | 080H - DB "EX", "P" | 080H - DB "SQ", "R" | 080H - DB "RN", "D" | 080H - DB "PEE", "K" | 080H - DB "AT", "N" | 080H - DB "SG", "N" | 080H - DB "LO", "G" | 080H - DB "FRA", "C" | 080H - DB "PA", "I" | 080H - DB "RA", "D" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "JO", "Y" | 080H - DB 080H - DB "CHR", "$" | 080H - DB "STR", "$" | 080H - DB "HEX", "$" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "SPACE", "$" | 080H - DB 080H - DB 080H - DB "AS", "C" | 080H - DB "LE", "N" | 080H - DB "VA", "L" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "ER", "N" | 080H - DB "ER", "L" | 080H - DB "SIZ", "E" | 080H - DB "CSR", "H" | 080H - DB "CSR", "V" | 080H - DB 080H - DB 080H - DB "LEFT", "$" | 080H - DB "RIGHT", "$" | 080H - DB "MID", "$" | 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB 080H - DB "TI", "$" | 080H - DB 080H - DB "EO", "F" | 080H - DB "F", "N" | 080H - DB 0FFH -L43EC: DW L5147 ; Keyword dispatch address table - DW L50C2 - DW L4AEC - DW L47FF - DW L5091 - DW L5828 - DW L4C38 - DW 052C2H - DW L4AEC - DW L4999 - DW L4A38 - DW L485E - DW L48B9 - DW L4D8E - DW L4E25 - DW L561E - DW L4AEC - DW L575B - DW L4AEC - DW L515A - DW L4F8A - DW L5754 - DW L76AC - DW L4F8A - DW L484D - DW L4BEA - DW L4C1B - DW L5537 - DW L4AEC - DW L50EA - DW L4C99 - DW L4922 - DW L5024 - DW L4AEC - DW L6A24 - DW L6A87 - DW L6E22 - DW L6AD4 - DW 06AD7H - DW 06ADAH - DW 06ADDH - DW L4959 - DW L496C - DW L4FAB - DW L58CA - DW L4FEF - DW L6B3F - DW L6B71 - DW L6B7B - DW L6B85 - DW L53A9 - DW L6BEA - DW L5986 - DW L5C88 - DW L59EA - DW L59D5 - DW L5260 - DW L52C0 - DW L4F96 - DW L6C2A - DW L6DF8 - DW L6E03 - DW L4F7A - DW L5D65 - DW L4AEC - DW L4B7A - DW L517C - DW L4F30 - DW L5258 - DW L4AEC - DW L4AEC - DW L5456 - DW L4AEC - DW L4AEC - DW L4F8A - DW L4AEC - DW L4AEC - DW L4AEC - DW 058E2H - DW L5913 - DW L58DF - DW 058E5H - DW L4AEC - DW L4AEC - DW L4AEC - DW L5CE3 - DW L4AEC - DW L4AEC - DW L5D0A - DW 05914H - DW 05CD7H - DW L5CD5 - DW L58D0 - DW L4AEC - DW L4AEC - DW L4AEC -L44AC: DW L4AEC - DW L51EE - DW 051EFH - DW L54A6 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L5255 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L54FD - DW L551F - DW L4FC7 - DW L5C71 - DW L4928 - DW L504D - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L52BA -L450A: DW L7E8B - DW L7E86 - DW L7FD2 - DW L7FC2 - DW L80B1 - DW L8320 - DW L81FC - DW L7EE8 - DW L81B7 - DW L81A3 - DW L7F06 - DW L8169 - DW L8314 - DW L608D - DW L8181 - DW L817C - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L792C - DW L4AEC - DW L4AEC - DW L7237 - DW L71F6 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L7219 - DW L4AEC - DW L4AEC - DW L7272 - DW L727C - DW L7284 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L7180 - DW L718E - DW L7164 - DW L7176 - DW L717B - DW L4AEC - DW L4AEC - DW L7296 - DW L72B3 - DW L72D0 - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L7326 - DW L4AEC - DW L7245 - DW L789F - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC - DW L4AEC -L45AA: CALL TEST1 - DB 00CH - JR NZ,L45B6 ; (+006H) - CALL LDDEMI - OR 0FFH - RET - -L45B6: INC HL - CP 00BH - JR NZ,L45DA ; (+01fH) - LD E,(HL) - INC HL - LD D,(HL) - INC HL - LD A,E - OR D - RET Z - EX DE,HL - CALL L4609 - JP C,04B0DH - EX DE,HL - DEC HL - LD (HL),D - DEC HL - LD (HL),E - DEC HL - LD (HL),00CH - INC HL - INC HL - INC HL - OR 0FFH - LD (L473D),A - RET - -L45DA: CP 022H - JP NZ,L4AEC - LD (04650H),HL - LD B,000H -L45E4: LD A,(HL) - OR A - JR Z,L45F0 ; (+008H) - INC HL - CP 022H - JR Z,L45F0 ; (+003H) - INC B - JR L45E4 ; (-00cH) - -L45F0: LD A,B - OR A - JP Z,L4AEC - LD (0464EH),A - EX DE,HL - CALL L4603 - JP C,04B0DH - EX DE,HL - OR 0FFH - RET - -L4603: PUSH BC - LD BC,L463C - JR L460D ; (+004H) - -L4609: PUSH BC - LD BC,L4630 -L460D: LD (04623H),BC - PUSH DE - EX DE,HL - LD HL,(L1070) -L4616: LD C,(HL) - INC HL - LD B,(HL) - LD A,B - OR C - SCF - JR Z,L462D ; (+00fH) - DEC HL - PUSH HL - ADD HL,BC - EX (SP),HL - CALL L0000 - JR C,L462C ; (+005H) - JR Z,L462C ; (+003H) - POP HL - JR L4616 ; (-016H) - -L462C: POP DE -L462D: POP DE - POP BC - RET - -L4630: INC HL - INC HL - INC HL - LD A,D - CP (HL) - RET NZ - DEC HL - LD A,E - CP (HL) - DEC HL - DEC HL - RET - -L463C: PUSH HL - INC HL - INC HL - INC HL - INC HL - CALL TEST1 - DB 0CAH - JR NZ,L4660 ; (+019H) - CALL TEST1 - DB 022H - JR NZ,L4660 ; (+013H) - LD B,000H - LD DE,L0000 -L4652: LD A,(DE) - CP (HL) - JR NZ,L4660 ; (+00aH) - INC HL - INC DE - DJNZ L4652 ; (-008H) - LD A,(HL) - CP 022H - JR Z,L4660 ; (+001H) - OR A -L4660: SCF - CCF - POP HL - RET - -L4664: LD DE,L0000 - LD BC,0FFFFH - CALL L46A6 - RET Z - CP 02DH - JR Z,L468E ; (+01cH) - CP 02EH - LD DE,(0847FH) - JR Z,L4681 ; (+007H) - CALL TESTX - DB 00BH - LD E,(HL) - INC HL - LD D,(HL) -L4681: INC HL - CALL L46A6 - JR Z,L468B ; (+004H) - CP 02DH - JR Z,L468E ; (+003H) -L468B: LD C,E - LD B,D - RET - -L468E: INC HL - CALL L46A6 - RET Z - CP 02EH - JR NZ,L469D ; (+006H) - LD BC,(0847FH) - INC HL - RET - -L469D: CALL TESTX - DB 00BH - LD C,(HL) - INC HL - LD B,(HL) - INC HL - RET - -L46A6: CALL L413E - RET Z - CP 02CH - RET - -L46AD: CALL SKPDE - LD A,0FFH - LD (L473D),A - LD HL,L4703 - JR L46CC ; (+012H) - -L46BA: CALL SKPDE - CALL L4836 -L46C0: LD A,(L473D) - OR A - RET Z - XOR A - LD (L473D),A - LD HL,L46E9 -L46CC: LD (046E7H),HL - LD HL,(L1070) - DEC HL -L46D3: INC HL - LD A,(HL) - INC HL - OR (HL) - RET Z - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD (04732H),DE -L46E0: CALL L51A2 - OR A - JR Z,L46D3 ; (-013H) - JP L0000 - -L46E9: CP 00CH - JR NZ,L46E0 ; (-00dH) - DEC HL - LD E,(HL) - INC HL - LD D,(HL) - PUSH HL - EX DE,HL - INC HL - INC HL - LD E,(HL) - INC HL - LD D,(HL) - POP HL - LD (HL),D - DEC HL - LD (HL),E - DEC HL - LD (HL),00BH - INC HL - INC HL - JR L46E0 ; (-023H) - -L4703: CP 00BH - JR NZ,L46E0 ; (-027H) - DEC HL - PUSH HL - CALL INDRCT - LD E,L - LD D,H - LD A,L - OR H - JR Z,L4739 ; (+027H) - CALL L4609 - JR C,L4722 ; (+00bH) - EX DE,HL - POP HL - DEC HL - LD (HL),00CH - INC HL - LD (HL),E - INC HL - LD (HL),D - JR L46E0 ; (-042H) - -L4722: PUSH DE - LD A,010H - RST 018H - DB 01BH - LD A,020H - RST 018H - DB 003H - POP HL - CALL L5E66 - RST 018H - DB 005H - LD HL,L0000 - CALL L4B58 - RST 018H - DB 002H -L4739: POP HL - INC HL - JR L46E0 ; (-05dH) - -L473D: NOP -L473E: RST 018H - DB 028H - CALL L46BA - CALL L6A11 - LD A,B - OR C - JP Z,L4059 - LD (0847FH),BC - LD A,(DE) - CP 020H - JR NZ,L4755 ; (+001H) - INC DE -L4755: PUSH AF - LD HL,L84E7 - CALL L66EF - PUSH HL - LD HL,(L847F) - LD E,L - LD D,H - CALL L49B9 - POP HL - POP AF - OR A - JR Z,L477C ; (+012H) - LD DE,L84E7 - OR A - SBC HL,DE - LD DE,00005H - ADD HL,DE - LD B,H - LD C,L - LD HL,L84E7 - CALL L4794 -L477C: LD A,(L48B0) - OR A - JP Z,L4059 - LD DE,(08481H) - LD HL,(L847F) - ADD HL,DE - LD (L847F),HL - JP NC,L4059 - JP L4081 - -L4794: LD (047F6H),HL - PUSH BC - LD BC,(0847FH) - LD HL,(L1070) - JR L47A5 ; (+004H) - -L47A1: CALL LDDEMD - ADD HL,DE -L47A5: CALL LDDEMD - LD A,D - OR E - JR Z,L47B9 ; (+00dH) - INC HL - INC HL - CALL LDDEMD - EX DE,HL - SBC HL,BC - DEC DE - DEC DE - EX DE,HL - JR C,L47A1 ; (-018H) -L47B9: POP DE - PUSH HL - PUSH DE - LD HL,00028H - ADD HL,DE - LD BC,(VARED) - LD (TMPEND),BC - ADD HL,BC - JP C,L4B2C - EX DE,HL - CALL L74E8 - POP DE - RST 018H - DB 018H - POP HL - PUSH DE - PUSH BC - EX (SP),HL - POP BC - PUSH HL - OR A - SBC HL,BC - LD B,H - LD C,L - POP HL - LD DE,(VARED) - INC BC - LDDR - INC HL - POP BC - LD (HL),C - INC HL - LD (HL),B - INC HL - LD DE,(0847FH) - LD (HL),E - INC HL - LD (HL),D - INC HL - EX DE,HL - LD HL,L84E7 - DEC BC - DEC BC - DEC BC - DEC BC - LDIR - RET - -L47FF: JR Z,L480A ; (+009H) - CALL L5176 - JP Z,L5147 - JP L5AED - -L480A: CALL L4928 -L480D: CALL L4821 - LD DE,(TEXTST) - LD SP,(INTFAC) - LD HL,0FFFFH - PUSH HL - PUSH HL - EX DE,HL - JP L40E4 - -L4821: PUSH HL - PUSH DE - CALL L4836 - XOR A - LD (L48B0),A - LD HL,0000AH - LD (L847F),HL - LD (L8481),HL - POP DE - POP HL - RET - -L4836: CALL L5825 - LD HL,L0000 - LD (L8487),HL - XOR A - LD (L4B78),A - LD (L8486),A - LD (L8485),A - LD (L849A),A - RET - -L484D: LD A,(L849A) - OR A - JP NZ,L5DCB - RST 018H - DB 028H - XOR A - LD (L4B78),A - POP BC - JP L4050 - -L485E: CALL L5C08 - LD DE,0000AH - LD BC,0000AH - JR Z,L4897 ; (+02eH) - CP 02CH - JR NZ,L4878 ; (+00bH) - INC HL - CALL L6E5F - LD B,D - LD C,E - LD DE,0000AH - JR L4897 ; (+01fH) - -L4878: CP 02EH - LD DE,(0847FH) - JR Z,L4889 ; (+009H) - CP 00BH - JP NZ,L4AEC - INC HL - LD E,(HL) - INC HL - LD D,(HL) -L4889: INC HL - CALL TEST1 - DB 02CH - JR NZ,L4897 ; (+007H) - PUSH DE - CALL L6E5F - LD C,E - LD B,D - POP DE -L4897: CALL 05E48H - LD A,C - OR B - JP Z,04AF2H - LD (0847FH),DE - LD (08481H),BC - LD A,001H - LD (L48B0),A - POP AF - JP L4059 - -L48B0: NOP -L48B1: LD A,(L48B0) - OR A - RET Z - XOR A - JR L48BF ; (+006H) - -L48B9: CALL L48BF - JP L4059 - -L48BF: LD DE,(0847FH) - CALL NZ,L4664 - PUSH DE - EX DE,HL - CALL L4609 - POP DE - INC HL - INC HL - INC HL - INC HL - JR NC,L48D5 ; (+003H) - LD HL,L00F9 -L48D5: EX DE,HL - PUSH DE - LD (L847F),HL - CALL L5E66 - RST 018H - DB 005H - LD A,020H - RST 018H - DB 003H - POP HL - LD DE,L11A4 - PUSH DE - CALL L68E0 - POP DE - LD B,000H -L48EE: LD A,(DE) - OR A - JR Z,L48F8 ; (+006H) - INC B - RST 018H - DB 004H - INC DE - JR L48EE ; (-00aH) - -L48F8: LD A,B - OR A - RET Z - LD A,014H - RST 018H - DB 003H - DJNZ 048FCH ; (-005H) - RET - -L4902: PUSH DE - LD DE,0FFF0H - ADD HL,DE - POP DE - LD (L107E),HL - DEC H - LD (L107C),HL - XOR A - LD (L849A),A - RET - -L4914: LD HL,(L1070) - CALL L4952 - LD (L1072),HL - CALL L4821 - JR L4928 ; (+006H) - -L4922: CALL L4914 - JP L404A - -L4928: PUSH HL - CALL L4939 - POP HL - RST 018H - DB 028H - RET - -L4930: LD HL,(L1070) - CALL L4952 - LD (L1072),HL -L4939: LD HL,(L1072) - LD (HL),000H - INC HL - LD (L1074),HL - LD (HL),000H - INC HL - LD (L1076),HL - CALL L4952 - LD (L1078),HL - LD (L107A),HL - RET - -L4952: LD (HL),000H - INC HL - LD (HL),000H - INC HL - RET - -L4959: CALL L413E - LD A,001H - JR Z,L496D ; (+00dH) - CALL TESTX - DB FDPD - CALL TESTX - DB 050H - LD A,002H - JR L496D ; (+001H) - -L496C: XOR A -L496D: LD (04972H),A - RET - -L4971: LD A,000H - OR A - RET Z - DEC A - LD (L1091),A - JR Z,L4982 ; (+007H) - LD A,(L1097) - CP 002H - JR Z,L4994 ; (+012H) -L4982: PUSH HL - LD A,05BH - RST 018H - DB 009H - LD HL,(L8483) - CALL L5E66 - RST 018H - DB 00BH - LD A,05DH - RST 018H - DB 009H - POP HL -L4994: XOR A - LD (L1091),A - RET - -L4999: CALL L46A6 - JP Z,L4AEC - CALL L5176 - JR Z,L49AD ; (+009H) - CP 02DH - JR Z,L49AD ; (+005H) - CP 02EH - JP NZ,L5D02 -L49AD: CALL L4664 - EX DE,HL - LD E,C - LD D,B - CALL L49B9 - JP L4050 - -L49B9: PUSH AF - PUSH BC - PUSH HL - PUSH DE - CALL L46BA - LD C,L - LD B,H - LD HL,(L1070) -L49C5: CALL LDDEMI - LD A,E - OR D - JR NZ,L49D4 ; (+008H) -L49CC: POP DE - POP HL - POP BC - POP AF - RET - -L49D1: POP DE - JR L49CC ; (-008H) - -L49D4: EX DE,HL - ADD HL,DE - DEC HL - DEC HL - EX DE,HL - PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - EX DE,HL - LD (049EEH),HL - SBC HL,BC - POP HL - JR C,L49C5 ; (-021H) - DB 01BH - DEC DE - DEC DE - POP BC - PUSH BC - PUSH DE - PUSH HL - LD HL,L0000 - SBC HL,BC - POP HL - JR Z,L4A13 ; (+01eH) - JR NC,L49D1 ; (-026H) -L49F7: CALL LDDEMI - LD A,D - OR E - JR Z,L4A11 ; (+013H) - EX DE,HL - ADD HL,DE - EX DE,HL - DEC DE - DEC DE - PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - EX DE,HL - SBC HL,BC - POP HL - JR C,L49F7 ; (-016H) - JR Z,L4A13 ; (+004H) - EX DE,HL - DEC HL -L4A11: DEC HL - DEC HL -L4A13: POP DE - PUSH DE - PUSH HL - OR A - EX DE,HL - SBC HL,DE - EX DE,HL - LD BC,(VARED) - RST 018H - DB 018H - POP DE - LD H,B - LD L,C - OR A - SBC HL,DE - LD B,H - LD C,L - EX DE,HL - POP DE - LDIR - JR L49CC ; (-063H) - -L4A2F: CALL L6E5F - LD A,D - OR E - RET NZ - JP 04AF2H - -L4A38: CALL L5C08 - LD DE,0000AH - LD (04AB7H),DE - LD (04AC9H),DE - LD E,000H - LD (04AA6H),DE - JR Z,L4A81 ; (+033H) - CP 02CH - JR Z,L4A62 ; (+010H) - CALL L4A2F - LD (04AB7H),DE - CALL L413E - JR Z,L4A81 ; (+023H) - CALL L5E70 - DEC HL -L4A62: CALL INCHLF - CP 02CH - JR Z,L4A79 ; (+010H) - CALL L4A2F - LD (04AA6H),DE - CALL L413E - JR Z,L4A81 ; (+00cH) - CALL L5E70 - DEC HL -L4A79: INC HL - CALL L4A2F - LD (04AC9H),DE -L4A81: PUSH HL - LD HL,(04AA6H) - EX DE,HL - LD HL,(04AB7H) - OR A - SBC HL,DE - JP C,04AF2H - CALL L46AD - LD HL,(L1070) -L4A95: LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - JR Z,L4AD3 ; (+037H) - EX DE,HL - ADD HL,DE - DEC HL - EX DE,HL - INC HL - LD C,(HL) - INC HL - LD B,(HL) - PUSH HL - LD HL,L0000 - OR A - SBC HL,BC - POP HL - JR Z,L4AB3 ; (+005H) - JR C,L4AB3 ; (+003H) - EX DE,HL - JR L4A95 ; (-01eH) - -L4AB3: DEC HL - DEC HL - DEC HL - LD BC,L0000 -L4AB9: LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - JR Z,L4AD3 ; (+013H) - EX DE,HL - ADD HL,DE - DEC HL - EX DE,HL - INC HL - LD (HL),C - INC HL - LD (HL),B - LD HL,L0000 - ADD HL,BC - JR C,L4AD8 ; (+00aH) - LD C,L - LD B,H - EX DE,HL - JR L4AB9 ; (-01aH) - -L4AD3: CALL L46C0 - POP HL - RET - -L4AD8: LD HL,0000AH - LD (04AC9H),HL - LD (04AB7H),HL - LD L,000H - LD (04AA6H),HL - CALL L4A81 - JP 04AF2H - -L4AEC: LD A,001H - LD HL,0023EH - LD HL,L033E - LD HL,0043EH - LD HL,L053E - LD HL,0063EH - LD HL,0073EH - LD HL,L083E - LD HL,L0D3E - LD HL,L0E3E - LD HL,L0F3E - LD HL,L103E - LD HL,L113E - LD HL,L123E - LD HL,L133E - LD HL,0143EH - LD HL,0153EH - LD HL,L183E - LD HL,L193E - LD HL,L3A3E - LD HL,L403E - JR L4B3A ; (+00eH) - -L4B2C: LD A,006H -L4B2E: LD SP,(INTFAC) - LD HL,0FFFFH - PUSH HL - LD (08496H),SP -L4B3A: JR L4B55 ; (+019H) - -L4B3C: LD HL,(.$LPT) - LD IX,(.$CRT) - LD (L1044),HL - XOR A - LD (01051H),A - LD A,0C4H - LD HL,0BB3EH - LD HL,0BC3EH - LD HL,0BD3EH -L4B55: JP L0182 - -L4B58: LD A,L - OR H - RET Z - LD DE,L4B66 - RST 018H - DB 005H - CALL L5E66 - RST 018H - DB 005H - RET - -L4B66: JR NZ,04BB1H ; (+049H) - LD C,(HL) - JR NZ,L4B6B ; (+000H) -L4B6B: LD B,D - DEC B - LD D,D - LD B,L - LD B,C - LD C,E - NOP -L4B72: LD D,D - DEC B - LD B,L - LD B,C - LD B,H - LD E,C -L4B78: NOP - NOP -L4B7A: CALL L6E4B - DEC A - CP 046H - JR C,L4B84 ; (+002H) - LD A,044H -L4B84: INC A -L4B85: LD SP,(08496H) - PUSH AF - RST 018H - DB 043H - CALL L5C44 - POP AF - OR A - JR Z,L4BE5 ; (+052H) - CP 080H - JR Z,L4BE3 ; (+04cH) - LD C,A - LD HL,L0000 - LD (L7928),HL - CALL L4146 - LD A,C - JR Z,L4BCE ; (+02aH) - LD HL,(L8483) - LD (L8487),HL - LD (L847F),HL - LD HL,(L847D) - LD (L8489),HL - LD HL,(L8498) - LD (L848B),HL - AND 07FH - LD (L8485),A - LD A,(L8486) - INC A - CP 002H - JR Z,L4BD9 ; (+013H) - XOR A - LD (L4B78),A - LD (L849A),A - LD A,C -L4BCE: RST 018H - DB 01BH -L4BD0: LD HL,(L8483) - CALL L4B58 - JP L4050 - -L4BD9: LD (L8486),A - LD HL,(0848DH) - PUSH HL - JP L40E4 - -L4BE3: LD A,02EH -L4BE5: LD HL,(L8498) - JR L4BED ; (+003H) - -L4BEA: LD A,02EH - POP DE -L4BED: PUSH AF - PUSH HL - RST 018H - DB 002H - RST 018H - DB 020H - LD DE,L4B6B - RST 018H - DB 005H - POP HL - CALL L4146 - JR Z,L4C17 ; (+019H) - LD (04C33H),HL - LD HL,(L847D) - LD (04C2DH),HL - LD HL,(L8483) - LD (04C27H),HL - LD (L847F),HL - POP AF - LD (L4B78),A - JP L4BD0 - -L4C17: POP AF - JP L4050 - -L4C1B: POP DE - LD HL,L4B78 - LD A,(HL) - OR A - JP Z,04B10H - LD (HL),000H - LD HL,L0000 - LD (L8483),HL - LD HL,L0000 - LD (L847D),HL - LD HL,L0000 - JP L40AF - -L4C38: LD A,(L8486) - CP 002H - JP C,04B1CH - DEC A - LD (L8486),A - CALL L413E - EX DE,HL - LD HL,(L8487) - LD (L8483),HL - LD HL,(L8489) - LD (L847D),HL - LD HL,(L848B) - JR NZ,L4C5D ; (+004H) - POP BC - JP L40B3 - -L4C5D: CP 08EH - JP Z,L4F8A - EX DE,HL - JP L5147 - -L4C66: CALL TEST1 - DB 080H - JR Z,L4C74 ; (+008H) - CALL TESTX - DB 082H - CALL TESTX - DB LSE0 -L4C74: CALL L45AA - JR Z,L4C83 ; (+00aH) - LD (0848DH),DE - LD A,001H -L4C7F: LD (L8486),A - RET - -L4C83: LD A,(L8486) - DEC A - JR Z,L4C7F ; (-00aH) - XOR A - LD (L8486),A - LD HL,(L8487) - LD (L8483),HL - LD A,(L8485) - JP L4B85 - -L4C99: CALL TEST1 - DB 0FFH - JP Z,L4CCB - CALL L7436 - PUSH BC - PUSH BC - PUSH AF - CALL TESTX - DB QDPC - CALL L6E8A - POP BC - LD A,(L84CE) - CP B - JP NZ,04AF5H - EX (SP),HL - EX DE,HL - CP 005H - JR Z,L4CC3 ; (+008H) - PUSH BC - CALL L4CD6 - POP AF - POP HL - POP BC - RET - -L4CC3: LD C,A - LD B,000H - LDIR - POP HL - POP BC - RET - -L4CCB: CALL TESTX - DB 0C4H - JP L73C2 - -L4CD2: PUSH DE - EX DE,HL - JR L4CDA ; (+004H) - -L4CD6: PUSH DE - CALL L6E7E -L4CDA: LD HL,L11A3 - LD (HL),A - LD B,A - LD C,A - INC HL - CALL LDHLDE - POP HL - LD A,(HL) - CP C - JR Z,L4D2B ; (+042H) - PUSH HL - OR A - CALL NZ,L4D3B - POP HL - LD A,(L11A3) - OR A - JR Z,L4D28 ; (+033H) - PUSH HL - LD BC,(VARST) - SBC HL,BC - EX DE,HL - LD HL,(L1078) - DEC HL - DEC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - LD BC,(STRST) - OR A - POP DE - PUSH HL - SBC HL,BC - EX DE,HL - LD (HL),A - LD B,A - INC HL - LD (HL),E - INC HL - LD (HL),D - POP HL - LD DE,L11A3 - INC DE - CALL L74DC - CALL L4952 - LD (L107A),HL - LD (L1078),HL - RET - -L4D28: LD (HL),000H - RET - -L4D2B: INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(L1076) - ADD HL,DE - LD DE,L11A3 - LD B,C - INC DE - JP L74DC - -L4D3B: LD C,(HL) - LD B,000H -L4D3E: INC BC - INC BC - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(L1076) - ADD HL,DE - DEC HL - DEC HL - LD E,L - LD D,H - ADD HL,BC - PUSH BC - PUSH DE - EX DE,HL - LD HL,(L1078) - OR A - SBC HL,DE - LD C,L - LD B,H - EX DE,HL - POP DE - PUSH DE - JR Z,L4D5F ; (+002H) - LDIR -L4D5F: POP DE - POP BC - LD HL,(L1078) - OR A - SBC HL,BC - LD (L1078),HL - EX DE,HL -L4D6B: LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - RET Z - LD HL,(L1074) - ADD HL,DE - LD A,(HL) - INC HL - LD E,(HL) - INC HL - LD D,(HL) - OR A - EX DE,HL - SBC HL,BC - EX DE,HL - LD (HL),D - DEC HL - LD (HL),E - PUSH BC - LD C,A - LD B,000H - LD HL,(L1076) - ADD HL,DE - ADD HL,BC - POP BC - JR L4D6B ; (-023H) - -L4D8E: POP BC - LD (04E23H),BC - CALL L4C99 - LD IX,L0000 - ADD IX,SP - LD (04E05H),HL - CALL L4EFE - LD (04E01H),BC -L4DA6: LD E,(IX+000H) - LD D,(IX+001H) - LD HL,0FF12H - OR A - SBC HL,DE - JR NZ,L4DCE ; (+01aH) - LD E,(IX+006H) - LD D,(IX+007H) - EX DE,HL - OR A - SBC HL,BC - JR Z,L4DC7 ; (+007H) - LD DE,L0012 - ADD IX,DE - JR L4DA6 ; (-021H) - -L4DC7: DB 011H - LD (DE),A - NOP - ADD IX,DE - LD SP,IX -L4DCE: LD HL,(04E05H) - CALL TESTX - DB LSE0 - CALL L6E8A - PUSH AF - PUSH HL - EX DE,HL - LD DE,L4F0A - CALL L5E93 - POP HL - POP AF - CP LSE1 - LD DE,L6112 - JR NZ,L4DEE ; (+004H) - INC HL - CALL L6E8A -L4DEE: LD (04E05H),HL - LD HL,0FFF6H - ADD HL,SP - LD SP,HL - EX DE,HL - CALL L5E93 - LD HL,L4F0A - CALL L5E93 - LD HL,L0000 - PUSH HL - LD HL,L0000 - PUSH HL - LD HL,(L847D) - PUSH HL - LD HL,0FF12H - PUSH HL - LD HL,0FE00H - ADD HL,SP - LD DE,(TMPEND) - SBC HL,DE - LD A,00BH - JP C,L4B2E - LD HL,(04E05H) - JP L0000 - -L4E25: LD A,005H - LD (L84CE),A - POP BC - LD (04E9AH),BC -L4E2F: PUSH AF - POP BC - LD (04E05H),HL - LD IX,L0000 - ADD IX,SP - LD (04E89H),IX - LD E,(IX+000H) - LD D,(IX+001H) - LD HL,0FF12H - OR A - SBC HL,DE - JP NZ,04B04H - PUSH BC - POP AF - JR NZ,L4EB0 ; (+05fH) - LD E,(IX+004H) - LD D,(IX+005H) - EX DE,HL - LD (04E97H),HL - LD E,(IX+006H) - LD D,(IX+007H) - LD HL,(L1074) - ADD HL,DE - LD BC,00008H - ADD IX,BC - PUSH IX - POP DE - CALL L7985 - INC DE - LD A,(DE) - LD IX,(04E89H) - LD DE,0000DH - ADD IX,DE - PUSH IX - POP DE - BIT 7,A - JR NZ,L4E83 ; (+001H) - EX DE,HL -L4E83: CALL L7A1C - JR C,L4E9C ; (+014H) - LD SP,L0000 - LD HL,00002H - ADD HL,SP - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - LD (L847D),HL - LD HL,L0000 -L4E99: JP L0000 - -L4E9C: LD DE,L0012 - LD HL,(04E89H) - ADD HL,DE - LD SP,HL - LD HL,(04E05H) - CALL TEST1 - DB 02CH - JR NZ,L4E99 ; (-014H) - LD (04E05H),HL -L4EB0: LD IX,L0000 - ADD IX,SP - LD (04E89H),IX - LD HL,(04E05H) - CALL TEST1 - DB 02CH - JP Z,L4E2F - CALL L7436 - LD (04E05H),HL - CALL L4EFE - LD IX,(04E89H) -L4ED1: LD E,(IX+000H) - LD D,(IX+001H) - LD HL,0FF12H - OR A - SBC HL,DE - JP NZ,04B04H - LD L,(IX+006H) - LD H,(IX+007H) - OR A - SBC HL,BC - LD HL,(04E05H) - JP Z,L4E2F - LD DE,L0012 - ADD IX,DE - LD (04E89H),IX - LD SP,(04E89H) - JR L4ED1 ; (-02dH) - -L4EFE: LD H,B - LD L,C - LD BC,(VARST) - OR A - SBC HL,BC - LD B,H - LD C,L - RET - -L4F0A: NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -L4F13: CALL L51A2 - OR A - RET NZ - INC HL - PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - LD A,D - OR E - INC HL - LD (04F12H),DE - LD E,(HL) - INC HL - LD D,(HL) - LD (04F10H),DE - POP DE - SCF - RET Z - JR L4F13 ; (-01dH) - -L4F30: CALL L5E7B - CALL L6E5F - LD (04F69H),DE - CALL TEST1 - DB 02CH - JR NZ,L4F5B ; (+01bH) - CALL L6E8A - CALL L7916 - LD (04F5EH),DE - CALL TEST1 - DB 02CH - JR NZ,L4F5B ; (+00bH) - CALL L7436 - CALL L7916 - LD (04F71H),BC - XOR A -L4F5B: PUSH HL - PUSH AF - LD HL,L0000 - CALL L6E7E - LD IX,L0182 - XOR A - CALL L0000 - POP AF - JR NZ,L4F76 ; (+008H) - LD A,B - EX DE,HL - LD DE,L0000 - CALL L4CD2 -L4F76: POP HL - JP L5E7F - -L4F7A: CALL L6E5F -L4F7D: LD A,D - OR E - RET Z - LD B,000H -L4F82: DJNZ L4F82 ; (-002H) - RST 018H - DB 00EH - RET Z - DEC DE - JR L4F7D ; (-00dH) - -L4F8A: DEC HL -L4F8B: CALL L51A2 - OR A - SCF - RET Z - CP 03AH - RET Z - JR L4F8B ; (-00bH) - -L4F96: CALL L6E4B - SUB LSE0 - CP 007H - JP C,04AF2H - CALL L5E70 - PUSH DE - CALL L6E4B - POP BC - OUT (C),A - RET - -L4FAB: CALL L6E4B - CALL L5E70 - PUSH DE - CALL L7436 - CP 005H - JP NZ,04AF5H - EX (SP),HL - PUSH BC - EX (SP),HL - POP BC - IN E,(C) - LD D,000H - CALL L5E99 - POP HL - RET - -L4FC7: CALL L4FCF - LD (00054H),DE - RET - -L4FCF: LD B,018H - LD C,027H - CALL L4FDA - JP C,04AF2H - RET - -L4FDA: PUSH BC - CALL L6E4B - PUSH AF - CALL L5E70 - CALL L6E4B - LD D,E - POP AF - LD E,A - POP BC - LD A,C - CP E - RET C - LD A,B - CP D - RET - -L4FEF: CALL L7436 - LD (L84CE),A - CP 005H - JR Z,L500E ; (+015H) - PUSH HL - PUSH BC - LD A,0FFH - RST 018H - DB 00DH - OR A - JR Z,L5008 ; (+006H) - LD HL,(L107A) - LD (HL),A - LD A,001H -L5008: POP DE - CALL L4CD2 - POP HL - RET - -L500E: PUSH HL - PUSH BC - LD A,0FFH - RST 018H - DB 00DH - SUB 030H - CP 00AH - JR C,L501B ; (+001H) - XOR A -L501B: LD E,A - LD D,000H - POP HL - CALL L5E99 - POP HL - RET - -L5024: CP 040H - LD BC,POPRA - JR NZ,L502F ; (+004H) - INC HL - LD BC,L504B -L502F: LD (05040H),BC - CALL L6E5F - CALL L5E73 -L5039: PUSH DE - CALL L6E4B - POP DE - EX DE,HL - CALL POPRA - EX DE,HL - INC DE - CALL TEST1 - DB 02CH - RET NZ - JR L5039 ; (-012H) - -L504B: LD (HL),A - RET - -L504D: PUSH HL - CALL TEST1 - DB 04DH - JR NZ,L5066 ; (+012H) - CALL TEST1 - DB 041H - JR NZ,L5066 ; (+00cH) - CALL TEST1 - DB 058H - JR NZ,L5066 ; (+006H) - EX (SP),HL - LD HL,(MEMMAX) - JR L5082 ; (+01cH) - -L5066: POP HL - CALL L6E5F - PUSH HL - LD HL,(MEMMAX) - OR A - SBC HL,DE - JP C,L4B2C - LD HL,(L107A) - INC H - INC H - INC H - INC H - OR A - SBC HL,DE - JP NC,04AF2H - EX DE,HL -L5082: CALL L4902 - POP HL - POP DE - LD SP,(INTFAC) - LD BC,0FFFFH - PUSH BC - PUSH DE - RET - -L5091: POP IX -L5093: POP BC - PUSH BC - LD A,B - INC A - JP NZ,04B07H - LD A,C - CP 012H - JR Z,L50B9 ; (+01aH) - CP 0FEH - JP NZ,04B07H - POP BC - CALL L413E - EX DE,HL - POP HL - LD (L8483),HL - POP HL - LD (L847D),HL - POP HL - PUSH IX - RET Z - EX DE,HL - JP L5147 - -L50B9: EX DE,HL - LD HL,L0012 - ADD HL,SP - LD SP,HL - EX DE,HL - JR L5093 ; (-02fH) - -L50C2: PUSH HL - CALL L4F8A - EX DE,HL - POP HL - POP BC - PUSH DE - EXX - LD HL,(L847D) - PUSH HL - LD HL,(L8483) - PUSH HL - LD HL,0FFFEH - PUSH HL - LD HL,0FE00H - ADD HL,SP - LD DE,(TMPEND) - SBC HL,DE - LD A,00AH - JP C,L4B2E - EXX - PUSH BC - JR L5147 ; (+05dH) - -L50EA: CALL TEST1 - DB 0C1H - JP Z,L4C66 - CALL L6E5F - LD C,E - LD B,D - CP 087H - JP NC,L4AEC - CP 082H - JR NZ,L510F ; (+010H) - CALL INCHLF - LD E,081H - CP LSE4 - JR Z,L510E ; (+006H) - CP LSE0 - JP NZ,L4AEC - DEC E -L510E: LD A,E -L510F: PUSH HL - LD HL,L43EC - SUB 080H - ADD A,A - LD E,A - LD D,000H - ADD HL,DE - CALL INDRCT - EX (SP),HL - INC HL - LD A,B - OR A - JR NZ,L5143 ; (+020H) - LD A,C - OR A - JR Z,L5143 ; (+01cH) - LD B,A -L5128: DEC B - RET Z - CALL HLFTCH - CALL L5173 - JP NZ,L4AEC - CALL L51A8 - OR A - RET Z - INC HL - CALL TEST1 - DB 02CH - JR Z,L5128 ; (-017H) - POP DE - JP 05E48H - -L5143: POP DE - JP L4F8A - -L5147: CALL L45AA - EX DE,HL - JR NZ,L5150 ; (+003H) - LD HL,(L1070) -L5150: LD (L847D),HL - XOR A - LD (L4B78),A - JP L40E4 - -L515A: CALL L6E8A - EX AF,AF' - LD A,(DE) - OR A - JR Z,L5182 ; (+020H) - EX AF,AF' - CP LSE2 - JR NZ,L516F ; (+008H) -L5167: CALL INCHLF - CALL L5173 - JR Z,L5147 ; (-028H) -L516F: POP AF - JP L40AF - -L5173: CP 022H - RET Z -L5176: CP 00BH - RET Z - CP 00CH - RET - -L517C: CALL L518B - JR NC,L517C ; (-005H) - RET - -L5182: DEC HL - CALL L518B - JR NC,L5167 ; (-021H) - DB 0C3H - POP HL - LD B,B -L518B: CALL L51A2 - OR A - SCF - RET Z - CP 0C2H - RET Z - CP 093H - JR NZ,L518B ; (-00dH) - CALL L518B - RET C - JR L518B ; (-013H) - -L519E: INC HL - LD A,(HL) - JR L51A8 ; (+006H) - -L51A2: INC HL - LD A,(HL) - CP 094H - JR Z,L51C7 ; (+01fH) -L51A8: OR A - RET Z - CP 022H - JR Z,L51E5 ; (+037H) - CP 0FEH - JR NC,L51C5 ; (+013H) - CP 097H - JR Z,L51C7 ; (+011H) - CP 027H - JR Z,L51C7 ; (+00dH) - CP 020H - RET NC - CP 00BH - RET C - CP 015H - JR NC,L51DC ; (+018H) - INC HL -L51C5: INC HL - RET - -L51C7: LD A,(HL) - OR A - RET Z - CP 03AH - RET Z - CP 022H - JR Z,L51D4 ; (+003H) - INC HL - JR L51C7 ; (-00dH) - -L51D4: CALL L51E5 - OR A - RET Z - INC HL - JR L51C7 ; (-015H) - -L51DC: AND 00FH - ADD A,L - LD L,A - LD A,020H - RET NC - INC H - RET - -L51E5: INC HL - LD A,(HL) - OR A - RET Z - CP 022H - RET Z - JR L51E5 ; (-009H) - -L51EE: OR 0AFH - PUSH AF - LD B,031H - LD C,04FH - CALL L4FDA - PUSH AF - CALL L523F - POP AF - JR C,L523D ; (+03eH) - LD A,C - LD (0522BH),A - LD B,001H - SRL E - JR NC,L520B ; (+002H) - SLA B -L520B: SRL D - JR NC,L5213 ; (+004H) - SLA B - SLA B -L5213: EX DE,HL - RST 018H - DB 01EH - CALL BREAKX - CP 0F0H - JR NC,L521F ; (+002H) - LD A,0F0H -L521F: LD C,A - POP AF - JR Z,L5235 ; (+012H) - SET 3,H - CALL BREAKX - AND 08FH - OR 000H - CALL POPRA - RES 3,H - LD A,C - OR B - JR L5238 ; (+003H) - -L5235: LD A,B - CPL - AND C -L5238: CALL POPRA - EX DE,HL - RET - -L523D: POP AF - RET - -L523F: LD A,(L005D) - AND 070H - LD C,A - CALL TEST1 - DB 02CH - RET NZ - PUSH DE - CALL L552C - POP DE - RLCA - RLCA - RLCA - RLCA - LD C,A - RET - -L5255: RST 018H - DB 020H - RET - -L5258: CALL 05E48H - RST 018H - DB 028H - RST 018H - DB 000H - RET - -L5260: JR Z,L5285 ; (+023H) - LD A,001H - LD (L004E),A - LD A,(L0056) - LD B,019H - CALL L5298 - LD (00056H),BC - CALL TEST1 - DB 02CH - RET NZ - LD B,028H - LD A,(L005B) - CALL L5298 - LD (0005BH),BC - RET - -L5285: XOR A - LD (L004E),A - LD BC,L1800 - LD (00056H),BC - LD BC,L2700 - LD (0005BH),BC - RET - -L5298: LD D,000H - LD E,A - CALL TEST1 - DB 02CH - JR Z,L52A9 ; (+008H) - PUSH BC - CALL L6E4B - POP BC - CALL L5E70 -L52A9: LD C,E - PUSH BC - CALL L6E4B - POP BC - DEC A - JP M,04AF2H - ADD A,C - CP B - JP NC,04AF2H - LD B,A - RET - -L52BA: DI - OUT (LSE4),A - JP L0000 - -L52C0: XOR A - LD BC,?SETDE - LD (L53A8),A - PUSH AF - CALL L5882 - RST 018H - DB 02EH - JP C,04B28H - BIT 1,A - JP Z,04B28H - CALL TEST1 - DB 02CH - POP AF - OR A - JR NZ,L52F2 ; (+015H) - CALL L6E6F - LD A,B - LD (L53A3),A - LD (053A4H),DE - CALL 05E48H - JR L52F2 ; (+005H) - -L52ED: LD A,002H - LD (L53A8),A -L52F2: CALL L4664 - LD (05319H),DE - LD (05327H),BC - LD A,0FFH - LD (L1090),A - CALL SKPDE - LD HL,(L1070) -L5308: CALL LDDEMI - LD A,D - OR E - RET Z - EX DE,HL - ADD HL,DE - DEC HL - DEC HL - EX DE,HL - PUSH DE - CALL LDDEMI - PUSH HL - LD HL,L0000 - OR A - SBC HL,DE - JR C,L5326 ; (+006H) - JR Z,L5326 ; (+004H) - POP HL - POP HL - JR L5308 ; (-01eH) - -L5326: LD HL,L0000 - OR A - SBC HL,DE - JR NC,L5331 ; (+003H) - POP HL - POP HL - RET - -L5331: EX DE,HL - CALL L5E66 - RST 018H - DB 017H - LD HL,L11A4 - CALL LDHLDE - LD (HL),020H - INC HL - EX DE,HL - POP HL - CALL L68E0 - LD A,(L53A8) - OR A - JR NZ,L5350 ; (+005H) - CALL L5366 - JR NC,L535A ; (+00aH) -L5350: LD DE,L11A4 - RST 018H - DB 017H - RST 018H - DB 037H - CALL L5733 -L535A: POP HL - LD A,(L53A8) - CP 002H - JR Z,L5308 ; (-05aH) - RST 018H - DB 00FH - JR L5308 ; (-05eH) - -L5366: EX DE,HL -L5367: PUSH HL - CALL L5371 - POP HL - RET C - RET Z - INC HL - JR L5367 ; (-00aH) - -L5371: LD A,(L53A3) - LD B,A - LD DE,(053A4H) -L5379: LD A,(HL) - INC HL - OR A - RET Z - CP 005H - JR Z,L5385 ; (+004H) - CP 006H - JR NZ,L5387 ; (+002H) -L5385: JR L5379 ; (-00eH) - -L5387: PUSH HL - LD C,A -L5389: LD A,(DE) - INC DE - CP 005H - JR Z,L5393 ; (+004H) - CP 006H - JR NZ,L539A ; (+007H) -L5393: DEC B - SCF - POP HL - RET Z - PUSH HL - JR L5389 ; (-011H) - -L539A: SUB C - POP HL - OR A - RET NZ - DEC B - SCF - RET Z - JR L5379 ; (-02aH) - -L53A3: NOP - NOP - NOP - NOP - NOP -L53A8: NOP -L53A9: CALL TESTX - DB 087H - CALL L5E4F - PUSH HL - LD C,000H -L53B3: RST 018H - DB 008H - LD A,C - ADD A,031H - LD D,A - LD E,020H - CP 03AH - JR NZ,L53C2 ; (+003H) - LD DE,L3031 -L53C2: LD (05445H),DE - LD DE,L543D - RST 018H - DB 00BH - LD A,C - CALL L549C - LD B,(HL) - INC HL - PUSH BC - CALL L53E0 - POP BC - INC C - LD A,C - CP 00AH - JR NZ,L53B3 ; (-029H) - RST 018H - DB 008H - POP HL - RET - -L53E0: LD A,B - OR A - LD C,000H - JR NZ,L53ED ; (+007H) - LD A,022H - RST 018H - DB 00AH - RST 018H - DB 00AH - RET - -L53ED: LD A,(HL) - CP 020H - JR C,L5412 ; (+020H) - CP 022H - JR Z,L5412 ; (+01cH) - LD A,C - CP 001H - JR Z,L5405 ; (+00aH) - OR A - LD DE,L544A - JR NZ,L5403 ; (+002H) - INC DE - INC DE -L5403: RST 018H - DB 00BH -L5405: LD A,(HL) - RST 018H - DB 00AH - INC HL - LD C,001H - DJNZ L53ED ; (-020H) - LD A,022H -L540F: RST 018H - DB 00AH - RET - -L5412: LD A,C - CP 0FFH - JR Z,L5437 ; (+020H) - OR A - LD DE,0544EH - JR NZ,L541F ; (+002H) - INC DE - INC DE -L541F: RST 018H - DB 00BH -L5421: PUSH BC - PUSH HL - LD L,(HL) - LD H,000H - CALL L5E66 - RST 018H - DB 00BH - POP HL - POP BC - INC HL - LD C,0FFH - DJNZ L53ED ; (-045H) - LD A,029H - JP L540F - -L5437: LD A,02CH - RST 018H - DB 00AH - JR L5421 ; (-01cH) - -L543D: LD B,H - LD B,L - LD B,(HL) - JR NZ,L548D ; (+04bH) - LD B,L - LD E,C - JR Z,L5446 ; (+000H) -L5446: NOP - ADD HL,HL - DEC A - NOP -L544A: ADD HL,HL - DEC HL - LD (L2200),HL - DEC HL - LD B,E - LD C,B - LD D,D - INC H - JR Z,L5456 ; (+000H) -L5456: CALL TEST1 - DB 0B2H - JR Z,L5467 ; (+00bH) - CALL TESTX - DB 0FFH -L5460: CALL TESTX - DB 0C7H - JP L7824 - -L5467: CALL TESTX - DB 028H - CALL L6E4B - CALL TESTX - DB 029H - CALL TESTX - DB QDPC - LD A,E - DEC A - CP 00AH - JP NC,04AF2H - PUSH HL - CALL L549C - EX (SP),HL - CALL L6E6F - EX (SP),HL - LD A,B - CP 010H - JR C,L548D ; (+002H) - LD A,00FH -L548D: LD (HL),A - OR A - JR Z,L5499 ; (+008H) - LD B,A - INC HL -L5493: LD A,(DE) - LD (HL),A - INC DE - INC HL - DJNZ L5493 ; (-006H) -L5499: POP HL - EI - RET - -L549C: ADD A,A - ADD A,A - ADD A,A - ADD A,A - LD HL,L12C0 - JP ADDHLA - -L54A6: CALL TEST1 - DB 02CH - JR NZ,L54B4 ; (+008H) - CALL L5E70 - LD DE,L005D - JR L54C0 ; (+00cH) - -L54B4: CALL L4FCF - CALL L5E70 - EX DE,HL - RST 018H - DB 01EH - SET 3,H - EX DE,HL -L54C0: EX DE,HL - CALL BREAKX - EX DE,HL - PUSH DE - CALL L54D0 - POP DE - EX DE,HL - CALL POPRA - EX DE,HL - RET - -L54D0: LD C,A - CALL TEST1 - DB 02CH - JR Z,L54E9 ; (+012H) - CALL L552C - ADD A,A - ADD A,A - ADD A,A - ADD A,A - XOR C - AND 070H - XOR C - LD C,A - CALL TEST1 - DB 02CH - JR NZ,L54FA ; (+011H) -L54E9: CALL L413E - JR Z,L54FA ; (+00cH) - CP 05DH - JR Z,L54FA ; (+008H) - CALL L552C - XOR C - AND 007H - XOR C - RET - -L54FA: LD A,C - RET - -L54FC: INC HL -L54FD: CALL L6E6F - LD A,B - OR A - JR Z,L5513 ; (+00fH) - PUSH HL - LD HL,L11A4 - PUSH HL - CALL LDHLDE - LD (HL),00DH - POP DE - CALL L0030 - POP HL -L5513: CALL HLFTCH - CP 03BH - JR Z,L54FC ; (-01eH) - CP 02CH - JR Z,L54FC ; (-022H) - RET - -L551F: CALL L6E4B - DEC A - CP 007H - JP NC,04AF2H - INC A - JP L0041 - -L552C: PUSH BC - CALL L6E4B - POP BC - CP 008H - JP NC,04AF2H - RET - -L5537: RST 018H - DB 045H - RET - - DS 198, 000H -L5600: LD A,(L1042) - CP 088H - RET - -L5606: CALL L6E8A - LD A,(L84CE) - CP 003H - PUSH HL - EX DE,HL - JR Z,L5619 ; (+007H) - CALL L6028 - POP HL - RST 018H - DB 017H - RET - -L5619: CALL L6E7E - POP HL - RET - -L561E: LD A,(L005D) - LD (0574DH),A - XOR A - LD (L1090),A - CALL L5882 - RST 018H - DB 02EH - JP C,L57B4 - BIT 2,A - JP NZ,L5D18 - BIT 1,A - JP Z,057B7H - CALL L58C2 - CALL L5600 - JR NZ,L5655 ; (+013H) - CALL TEST1 - DB 05BH - JR NZ,L5655 ; (+00dH) - LD A,(0574DH) - CALL L54D0 - LD (0574DH),A - CALL TESTX - DB 05DH -L5655: CALL L413E - JP Z,L5733 -L565B: LD A,(HL) - CP LSE3 - JR Z,L56DA ; (+07aH) - LD BC,L5674 - PUSH BC - CP 03BH - RET Z - CP 02CH - RET Z - CP LSE6 - JR Z,L56AA ; (+03cH) - CALL L5606 - JP L573E - -L5674: CALL L413E - JP Z,L5733 - CP 02CH - JR NZ,L569A ; (+01cH) - CALL L5600 - JR C,L5697 ; (+014H) - LD IX,(ZDELT) - CALL IOCALL - LD B,A -L568B: SUB 00AH - JR NC,L568B ; (-004H) - NEG - LD B,A - CALL L56CC - JR L569A ; (+003H) - -L5697: CALL L5733 -L569A: LD A,(HL) - CP 02CH - JR Z,L56A1 ; (+002H) - CP 03BH -L56A1: JR NZ,L56A4 ; (+001H) - INC HL -L56A4: CALL L413E - RET Z - JR L565B ; (-04fH) - -L56AA: CALL L5600 - JP C,057B7H - CALL L5E77 - CALL L6E4B - CALL L5E7F - LD IX,(ZDELT) - CALL IOCALL - SUB E - RET NC - NEG - LD B,A - CALL L5600 - LD A,013H - JR Z,L56CE ; (+002H) -L56CC: LD A,020H -L56CE: LD DE,L11A4 - PUSH BC - PUSH DE - CALL ?SETDE - POP DE - POP BC - JR L573E ; (+064H) - -L56DA: INC HL - CALL L6E6F - LD A,B - OR A - JP Z,04AF2H - PUSH HL - LD HL,L11A4 - PUSH HL - PUSH BC - CALL LDHLDE - POP BC - LD A,0F0H - LD E,B - LD D,000H - INC DE - RST 018H - DB 02AH - LD (L6306),HL - LD (L6308),HL - POP DE - CALL LDHLDE - LD (HL),000H - POP HL -L5702: CALL L413E - JR Z,L5729 ; (+022H) - INC HL - CP 02CH - JR Z,L5711 ; (+005H) - CP 03BH - JP NZ,L4AEC -L5711: CALL L413E - JR Z,L572C ; (+016H) - CALL L6E92 - PUSH HL - LD BC,(TMPEND) - PUSH BC - CALL L630A - POP DE - CALL L573C - POP HL - JR L5702 ; (-027H) - -L5729: CALL L5733 -L572C: LD A,0F0H - RST 018H - DB 02BH - RET - -L5731: DEC C - NOP -L5733: LD A,(L005D) - LD (0574DH),A - LD DE,L5731 -L573C: RST 018H - DB 017H -L573E: CALL L5600 - JR Z,L5746 ; (+003H) - RST 018H - DB 037H - RET - -L5746: PUSH HL - PUSH BC - LD HL,L005D - LD C,(HL) - LD (HL),070H - RST 018H - DB 037H - LD (HL),C - POP BC - POP HL - RET - -L5754: LD A,08AH - LD (L1042),A - JR L5792 ; (+037H) - -L575B: CALL L5882 - RST 018H - DB 02EH - JP C,L57B4 - BIT 2,A - JP NZ,L5D29 - BIT 0,A - JP Z,057B7H - CALL L58C2 - CALL L5600 - JR NZ,L5792 ; (+01dH) - CALL HLFTCH - CP 022H - LD DE,L57BC - LD B,002H - JR NZ,L5788 ; (+007H) - CALL L6E6F - CALL TESTX - DB 03BH -L5788: LD A,B - OR A - JR Z,L5792 ; (+006H) -L578C: LD A,(DE) - INC DE - RST 018H - DB 003H - DJNZ L578C ; (-006H) -L5792: LD (057EBH),SP - LD DE,(VARED) - LD (TMPEND),DE -L579E: LD DE,(TMPEND) - CALL L74E8 - CALL L7436 - PUSH AF - PUSH BC - CALL L413E - JR Z,057BEH ; (+00fH) - CALL L5E73 - JR L579E ; (-016H) - -L57B4: LD A,02CH - LD HL,0BB3EH - JP L0182 - -L57BC: CCF - JR NZ,0576EH ; (-051H) - PUSH AF - PUSH HL - RST 018H - DB 034H - LD HL,(057EBH) - DEC HL -L57C7: LD A,(HL) - OR A - JR Z,L57E9 ; (+01eH) - DEC HL - DEC HL - LD B,(HL) - DEC HL - LD C,(HL) - DEC HL - PUSH HL - PUSH AF - PUSH BC - LD DE,(TMPEND) - CALL L57EE - LD H,000H - LD L,B - ADD HL,DE - LD (HL),000H - POP DE - POP AF - CALL L57F8 - POP HL - JR L57C7 ; (-022H) - -L57E9: POP HL - LD SP,L0000 - RET - -L57EE: LD A,(L1042) - CP 08AH - JR Z,L5839 ; (+044H) - RST 018H - DB 035H - RET - -L57F8: CP 003H - JR NZ,L5803 ; (+007H) - LD HL,(L107A) - LD A,B -$START: JP L4CD2 ; $START - BASIC warm start / system entry - -L5803: PUSH DE - LD HL,(L107C) - LD DE,(TMPEND) - EX DE,HL - CALL HLFTCH - CP 045H - JP Z,04AF2H - EX DE,HL - CALL L5EDC - EX DE,HL - CALL TEST1 - DB 000H - JP NZ,04AF2H - EX DE,HL - POP DE - JP L5E93 - -L5825: XOR A - JR L587E ; (+056H) - -L5828: CALL L5825 - CALL L413E - CALL NZ,L45AA - EX DE,HL - CALL NZ,L5869 - EX DE,HL - JP L4F8A - -L5839: PUSH HL - PUSH DE - CALL L5847 - POP DE - POP HL - RET - -L5841: LD HL,(L1070) - CALL L5869 -L5847: LD A,(L848F) - CP 001H - JP Z,04B1FH - JR C,L5841 ; (-010H) - LD HL,(L8490) - LD C,03AH - RST 018H - DB 036H - LD (L8490),HL - CALL L413E - SCF - CCF - RET NZ - DEC HL -L5862: CALL L519E - OR A - JR NZ,L5874 ; (+00cH) - INC HL -L5869: LD A,(HL) - INC HL - OR (HL) - LD A,001H - JR Z,L587E ; (+00eH) - INC HL - INC HL - JR L5862 ; (-012H) - -L5874: CP 094H - JR NZ,L5862 ; (-016H) - INC HL - LD (L8490),HL - LD A,002H -L587E: LD (L848F),A - RET - -L5882: CALL TEST1 - DB 023H - JR NZ,L58AD ; (+025H) - CALL HLFTCH - CP 020H - JP NC,L4AEC - PUSH DE - PUSH BC - LD DE,L84CF - PUSH DE - CALL L705A - EX (SP),HL - CALL L60B7 - LD A,H - OR A - JP NZ,04B28H - OR L - JP Z,04B28H - JP M,04B28H - POP HL - POP BC - POP DE - RET - -L58AD: CALL TEST1 - DB FDPD - LD A,088H - RET NZ - CALL TEST1 - DB 050H - LD A,089H - RET Z - CALL TESTX - DB 054H - LD A,080H - RET - -L58C2: LD A,(L1042) - OR A - RET M - JP L5E70 - -L58CA: CALL L593A - RST 018H - DB 03AH - RET - -L58D0: CALL L413E - LD B,000H - CALL NZ,L6E6F -L58D8: PUSH HL - RST 018H - DB 02CH - RST 018H - DB 03CH - POP HL - RET - -L58DF: LD A,001H - LD BC,0023EH - LD BC,0043EH - PUSH AF - LD (L1043),A - CALL L5882 - CP 088H - JR NZ,L58F4 ; (+002H) - LD A,080H -L58F4: LD (L1042),A - CALL L58C2 - CALL L592D - POP AF - CP 004H - JR Z,L5904 ; (+002H) -L5902: LD A,003H -L5904: LD (L1000),A - PUSH AF - RST 018H - DB 033H - LD A,(L1000) - POP BC - CP B - JP NZ,04B53H - RET - -L5913: OR 0AFH - LD B,A - CALL L413E - JR Z,L5929 ; (+00eH) -L591B: CALL L5882 - CP 088H - RET NC - RST 018H - DB 038H - CALL TEST1 - DB 02CH - JR L591B ; (-00eH) - -L5929: XOR A - RST 018H - DB 038H - RET - -L592D: CALL L46A6 - LD B,000H - CALL NZ,L6E6F - PUSH HL - RST 018H - DB 02DH - POP HL - RET - -L593A: PUSH HL - CALL HLFTCH - LD DE,L5982 - LD B,001H - CALL L5975 - CALL NC,L5975 - JR C,L5962 ; (+017H) - CALL L5975 - CALL L5EC4 - CALL L597B - CALL L413E - JR NZ,L5962 ; (+009H) - LD A,03AH - LD (DE),A - POP AF - LD DE,L5982 - JR L596B ; (+009H) - -L5962: POP HL - CALL L413E - LD B,000H - CALL NZ,L6E6F -L596B: PUSH HL - RST 018H - DB 02CH - INC (HL) - DEC (HL) - JP NZ,04B25H - POP HL - RET - -L5975: CP 041H - RET C - CP 05BH - CCF -L597B: RET C - LD (DE),A - INC HL - INC DE - LD A,(HL) - INC B - RET - -L5982: NOP - NOP - NOP - NOP -L5986: CALL L592D - CALL TEST1 - DB 02CH - JP Z,L5A47 - PUSH HL - CALL L5BDC - DEC A - JR Z,L59A9 ; (+012H) - DEC A - JP NZ,04B53H - CALL L5C08 - CALL L5BE5 - CALL L5C11 - CALL L5C44 - POP HL - RET - -L59A9: LD HL,(ELMD22) - PUSH HL - LD DE,(MEMLMT) - CALL L59CF - LD DE,(ELMD20) - LD BC,(MEMMAX) - CALL NC,L59CA - JP C,04B13H - POP HL - RST 018H - DB 030H - CALL L5C44 - POP HL - RET - -L59CA: ADD HL,DE - RET C - EX DE,HL - LD H,B - LD L,C -L59CF: PUSH HL - OR A - SBC HL,DE - POP HL - RET - -L59D5: CALL L592D - CALL L5BDC - CP 002H - JP NZ,04B53H - LD A,(L849A) - OR A - JP Z,L5B0D - JP L5DB2 - -L59EA: CALL L5C08 - CALL L592D - CALL TEST1 - DB 02CH - JR Z,05A4DH ; (+057H) - RST 018H - DB 02FH - CP 002H - JP NZ,04B53H - PUSH HL - LD HL,(L1078) - LD (L107A),HL - LD BC,003E8H - ADD HL,BC - JP C,L4B2C - PUSH HL - LD BC,(ELMD20) - INC B - ADD HL,BC - JP C,L4B2C - SBC HL,SP - JP NC,L4B2C - POP HL - PUSH HL - RST 018H - DB 030H - POP HL - CALL L5A24 - POP HL - RET - -L5A24: CALL LDDEMI - LD A,D - OR E - RET Z - PUSH DE - CALL LDDEMI - PUSH HL - LD H,D - LD L,E - LD (L847F),HL - CALL L49B9 - POP HL - POP BC - PUSH BC - PUSH HL - CALL L4794 - POP HL - POP BC - ADD HL,BC - DEC HL - DEC HL - DEC HL - DEC HL - JR L5A24 ; (-023H) - -L5A47: CALL L5C08 - LD A,001H - LD BC,L003E - LD BC,0023EH - PUSH AF - CALL TESTX - DB 041H - CALL 05E48H - LD A,001H - LD (L1043),A - LD A,081H - LD (L1042),A - CALL L5902 - POP AF - PUSH AF - PUSH HL - LD HL,L0000 - LD DE,0FFFFH - OR A - CALL NZ,L49B9 - LD A,081H - RST 018H - DB 02EH - LD HL,(L1078) - LD (L107A),HL - LD BC,003E8H - ADD HL,BC - JP C,04AFBH - PUSH HL - LD (L5AEB),HL -L5A89: LD HL,0FE00H - ADD HL,SP - LD DE,(05AEBH) - SBC HL,DE - JP C,04AFBH - LD DE,(TMPEND) - RST 018H - DB 035H - LD A,B - OR A - JR Z,L5AD6 ; (+036H) - CALL L6A11 - LD A,B - OR C - JP Z,04AF2H - LD HL,(L5AEB) - PUSH HL - INC HL - INC HL - LD (HL),C - INC HL - LD (HL),B - INC HL - PUSH HL - LD H,D - LD L,E - CALL TEST1 - DB 000H - JP Z,04AF2H - POP HL - LD A,(DE) - CP 020H - JR NZ,L5AC3 ; (+001H) - INC DE -L5AC3: CALL L66EF - LD (HL),000H - INC HL - LD (L5AEB),HL - POP DE - OR A - SBC HL,DE - EX DE,HL - LD (HL),E - INC HL - LD (HL),D - JR L5A89 ; (-04dH) - -L5AD6: LD HL,(L5AEB) - CALL L4952 - CALL L4928 - POP HL - CALL L5A24 - POP HL - POP AF - CP 002H - RET NZ - JP L480D - -L5AEB: NOP - NOP -L5AED: CALL L592D - PUSH HL - CALL TEST1 - DB 02CH - JR NZ,L5AFF ; (+008H) - CALL HLFTCH - CP 041H - JP Z,05A50H -L5AFF: CALL L5BDC - POP HL - DEC A - JR Z,L5B16 ; (+010H) - DEC A - JP NZ,04B53H - CALL L5BE5 -L5B0D: CALL L5C11 - CALL L5C44 - JP L480D - -L5B16: LD D,0C9H - LD BC,0FF00H - CALL TEST1 - DB 02CH - JR NZ,L5B2A ; (+009H) - CALL TESTX - DB 052H - LD D,000H - LD BC,0CF00H -L5B2A: LD A,D - LD (L5B93),A - LD HL,(L1014) - LD DE,(ELMD22) - PUSH HL - CALL L59CA - POP DE - LD HL,(L1070) - LD BC,0FF00H - CALL NC,L59CA - JP C,L4B2C - LD SP,L0000 - CALL L4930 - XOR A - LD (L5C07),A - LD HL,(L1018) - PUSH HL - LD DE,(ELMD20) - PUSH DE - LD HL,(L107A) - RST 018H - DB 030H - LD A,004H - RST 018H - DB 003H - LD A,016H - RST 018H - DB 003H - POP BC - PUSH BC - LD DE,(ELMD22) - CALL L59CF - LD A,0B0H - JR NC,L5B7B ; (+008H) - EX DE,HL - ADD HL,BC - DEC HL - EX DE,HL - ADD HL,BC - DEC HL - LD A,0B8H -L5B7B: LD (05B92H),A - DI - PUSH HL - PUSH DE - LD BC,00016H - LD HL,L5B8E - LD DE,0FF80H - PUSH DE - LDIR - RET - -L5B8E: POP DE - POP HL - POP BC - LDIR -L5B93: RET - - POP BC - LD SP,VRAM - EX DE,HL - PUSH BC - PUSH HL - LD (HL),LSD3 - INC HL - LD (HL),LSE4 - INC HL - LD (HL),0C9H - RET - -L5BA4: LD HL,(L1078) - LD (L107A),HL - LD DE,(TEXTED) - LD (05C01H),DE - OR A - SBC HL,DE - LD (L5C03),HL - LD HL,0FF00H - ADD HL,SP - LD (L5C05),HL - LD DE,(VARED) - PUSH HL - OR A - SBC HL,DE - JP C,L4B2C - EX (SP),HL - EX DE,HL - LD BC,(05C03H) - INC BC - LDDR - POP DE - RST 018H - DB 018H - LD A,001H - LD (L5C07),A - RET - -L5BDC: CALL L5BA4 - RST 018H - DB 02FH - LD A,(L1000) - RET - -L5BE5: LD HL,(L1078) - XOR A - DEC HL - LD (HL),A - DEC HL - LD (HL),A - LD (L1076),HL - DEC HL - LD (HL),A - LD (L1074),HL - DEC HL - LD (HL),A - LD (L1072),HL - LD HL,00004H - LD (L5C03),HL - RET - -L5C01: NOP - NOP -L5C03: NOP - NOP -L5C05: NOP - NOP -L5C07: NOP -L5C08: PUSH AF - CALL L4146 - JP NZ,04B16H - POP AF - RET - -L5C11: LD BC,(ELMD20) - PUSH BC - LD HL,(L1072) - LD DE,(TEXTST) - OR A - SBC HL,DE - LD L,000H - SBC HL,BC - JP C,L4B2C - LD HL,L0000 - LD (L5C01),HL - CALL L4821 - LD HL,L0000 - LD (L8483),HL - LD HL,(L1070) - RST 018H - DB 030H - POP BC - LD HL,(L1070) - ADD HL,BC - LD (L5C01),HL - RET - -L5C44: LD A,081H - LD B,000H - RST 018H - DB 038H - LD HL,L5C07 - LD A,(HL) - OR A - RET Z - LD (HL),000H - LD HL,(L5C01) - LD A,H - OR L - JR NZ,L5C5F ; (+006H) - LD HL,(L1070) - CALL L4952 -L5C5F: EX DE,HL - LD HL,(L1072) - LD BC,(05C03H) - LDIR - EX DE,HL - OR A - SBC HL,DE - EX DE,HL - RST 018H - DB 018H - RET - -L5C71: PUSH HL - CALL L46C0 - POP HL - CALL L592D - PUSH HL - RST 018H - DB 02FH - CP 002H - JP NZ,04B53H - LD HL,(L1070) - RST 018H - DB 032H - POP HL - RET - -L5C88: PUSH HL - CALL L46C0 - POP HL - CALL L592D - CALL TEST1 - DB 02CH - JR Z,L5CB5 ; (+01fH) - PUSH HL - LD A,002H - LD (L1000),A - LD HL,(L1072) - LD DE,(TEXTST) - OR A - SBC HL,DE - LD (L1014),HL - LD A,(L1001) - CP 00DH - JP Z,04B50H - RST 018H - DB 031H - POP HL - RET - -L5CB5: CALL TESTX - DB 041H - PUSH HL - LD A,002H - LD (L1043),A - LD A,081H - LD (L1042),A - CALL L5902 - POP HL - CALL L52ED - CALL L5733 - LD B,001H - LD A,081H - RST 018H - DB 038H - RET - -L5CD5: XOR A - LD BC,?SETDE - PUSH AF - CALL L6E6F - RST 018H - DB 02DH - POP AF - RST 018H - DB 03FH - RET - -L5CE3: CALL L5882 - PUSH AF - RST 018H - DB 02EH - JP C,L57B4 - BIT 1,A - JP Z,057B7H - CALL L58C2 - CALL L593A - LD B,A - XOR A - RST 018H - DB 039H - LD A,B - RST 018H - DB 03AH - POP AF - RST 018H - DB 039H - RET - -L5D02: CALL L6E6F - RST 018H - DB 02DH - RST 018H - DB 03DH - RET - -L5D0A: CALL L6E6F - RST 018H - DB 02DH - CALL L5E70 - CALL L6E6F - RST 018H - DB 03EH - RET - -L5D18: CALL L5D4E -L5D1B: CALL L5606 - RST 018H - DB 042H - CALL L413E - RET Z - CALL L5E73 - JR L5D1B ; (-00eH) - -L5D29: CALL L5D4E - LD DE,(TMPEND) - CALL L74E8 -L5D33: CALL L7436 - PUSH HL - PUSH AF - PUSH BC - LD DE,(TMPEND) - RST 018H - DB 041H - POP DE - POP AF - CALL L57F8 - POP HL - CALL L413E - RET Z - CALL L5E73 - JR L5D33 ; (-01bH) - -L5D4E: CALL TEST1 - DB 028H - RET NZ - CALL L6E5F - LD A,D - OR E - JP Z,04AF2H - RST 018H - DB 040H - CALL L5E7F - CALL TEST1 - DB 02CH - RET - -L5D65: LD A,(L849A) - OR A - JP NZ,04B22H - PUSH HL - LD B,000H - RST 018H - DB 02CH - LD (05E1AH),DE - LD (L5E1C),A - LD HL,(L1072) - LD DE,(TEXTST) - XOR A - SBC HL,DE - LD (L1014),HL - RST 018H - DB 044H - POP HL - CALL L592D - CALL 05E48H - LD A,(L1050) - BIT 5,A - JP Z,057B7H - PUSH HL - LD HL,(08494H) - ADD HL,SP - LD SP,HL - EX DE,HL - LD HL,L847D - LD BC,(08492H) - LDIR - CALL L5BDC - CP 002H - JP NZ,04B53H - LD (05DB3H),SP -L5DB2: LD SP,L0000 - CALL L5C11 - CALL L5C44 - LD HL,0FFFDH - PUSH HL - PUSH HL - LD A,001H - LD (L849A),A - LD HL,(L1070) - JP L40E4 - -L5DCB: XOR A - LD (L849A),A - POP IX -L5DD1: POP BC - LD A,B - CP 0FFH - JP NZ,04B22H - LD A,C - CP 0FDH - JR Z,L5DF0 ; (+013H) - CP 0FEH - LD HL,00004H - JR Z,L5DEC ; (+008H) - CP 012H - LD HL,00010H - JP NZ,04B22H -L5DEC: ADD HL,SP - LD SP,HL - JR L5DD1 ; (-01fH) - -L5DF0: LD DE,(05E1AH) - LD A,(L5E1C) - RST 018H - DB 03AH - LD B,000H - RST 018H - DB 02CH - CALL L5BA4 - OR 0FFH - RST 018H - DB 044H - CALL L5C11 - CALL L5C44 - LD HL,L0000 - ADD HL,SP - LD DE,L847D - LD BC,(08492H) - LDIR - LD SP,HL - POP HL - RET - - NOP - NOP -L5E1C: NOP -L5E1D: LD DE,L5E37 - LD B,005H - CALL L58D8 - LD A,031H - CALL L5E2C - LD A,032H -L5E2C: LD (05E3EH),A - LD DE,05E3CH - LD B,00CH - JP L58D8 - -L5E37: DB "CMT:TRS?:0,$8C,13",0CDH; XCMT device config string - LD A,041H - RET Z - JP L4AEC - -L5E4F: XOR A - LD (L1091),A - CALL TEST1 - DB FDPD - RET NZ - CALL TESTX - DB 050H - CALL L6AC6 - LD A,050H - LD (L1091),A - CP A - RET - -L5E66: LD DE,L849C - LD B,000H - PUSH DE - RST 018H - DB 016H - POP DE - RET - -L5E70: CALL HLFTCH -L5E73: CP 02CH - JR L5E84 ; (+00dH) - -L5E77: INC HL -L5E78: CALL HLFTCH -L5E7B: CP 028H - JR L5E84 ; (+005H) - -L5E7F: CALL HLFTCH -L5E82: CP 029H -L5E84: INC HL - RET Z - JP L4AEC - -L5E89: LD A,(DE) - CP 020H - INC DE - JR Z,L5E89 ; (-006H) - RET - -L5E90: LD HL,L6112 -L5E93: LD BC,00005H - LDIR - RET - -L5E99: CALL L7967 - LD A,E - OR D - RET Z - BIT 7,D - LD A,07FH - JR Z,L5EAE ; (+009H) - LD A,D - CPL - LD D,A - LD A,E - CPL - LD E,A - INC DE - LD A,0FFH -L5EAE: LD B,091H -L5EB0: DEC B - BIT 7,D - JR NZ,L5EBB ; (+006H) - RL E - RL D - JR L5EB0 ; (-00bH) - -L5EBB: LD (HL),B - INC HL - AND D - LD (HL),A - INC HL - LD (HL),E - DEC HL - DEC HL - RET - -L5EC4: CP 030H - RET C - CP 03AH - CCF - RET - -L5ECB: CP 05FH - RET Z - CP 030H - RET C - CP 05BH - CCF - RET C - CP 03AH - CCF - RET NC - CP 041H - RET - -L5EDC: CALL L7967 - LD (L6301),A - LD (L6302),A - LD (L6303),A - LD (05F83H),A - LD A,005H - LD (L84CE),A -L5EF0: CALL L5E89 - CP 02BH - JR Z,L5EF0 ; (-007H) - CP 02DH - JR NZ,L5F01 ; (+006H) - CALL L5EF0 - JP L7972 - -L5F01: CP 024H - JR NZ,L5F11 ; (+00cH) - PUSH HL - EX DE,HL - RST 018H - DB 014H - EX (SP),HL - CALL L5E99 - POP DE - LD A,005H - RET - -L5F11: CP 030H - JR NZ,L5F1B ; (+006H) - LD A,(DE) - INC DE - JR L5F11 ; (-008H) - -L5F19: LD A,(DE) - INC DE -L5F1B: CP 020H - JR Z,L5F19 ; (-006H) - CP 02EH - JR Z,L5F3E ; (+01bH) - CALL L5EC4 - JR C,L5F78 ; (+050H) - SUB 030H - CALL L60AA - CALL L6014 - LD A,001H - LD (L6302),A - LD A,(L6301) - INC A - LD (L6301),A - JR L5F19 ; (-025H) - -L5F3E: LD A,001H - LD (05F83H),A - LD C,A -L5F44: LD A,(DE) - INC DE - CP 020H - JR Z,L5F44 ; (-006H) - CALL L5EC4 - JR C,L5F70 ; (+021H) - INC C - SUB 030H - JR Z,L5F5B ; (+007H) - PUSH AF - LD A,001H - LD (L6302),A - POP AF -L5F5B: PUSH AF - LD A,(L6302) - LD B,A - LD A,(L6301) - ADD A,B - LD (L6301),A - POP AF - CALL L60AA - CALL L6014 - JR L5F44 ; (-02cH) - -L5F70: DEC C - JR Z,L5F78 ; (+005H) - CALL L5FFE - JR L5F70 ; (-008H) - -L5F78: CP 045H - JR Z,L5F89 ; (+00dH) -L5F7C: DEC DE - LD A,(L6303) - OR A - RET NZ - LD A,000H - OR A - RET NZ - LD A,005H - RET - -L5F89: LD A,(DE) - CP 02DH - JR Z,L5F97 ; (+009H) - CP 02BH - JR Z,L5F97 ; (+005H) - CALL L5EC4 - JR C,L5F7C ; (-01bH) -L5F97: LD A,001H - LD (05F83H),A - PUSH HL - LD HL,L7BB3 - LD (05FF7H),HL - LD HL,L0000 - LD A,(DE) - INC DE - CP 02BH - JR Z,L5FB8 ; (+00cH) - CP 02DH - JR NZ,L5FBA ; (+00aH) - PUSH HL - LD HL,L7C9E - LD (05FF7H),HL - POP HL -L5FB8: LD A,(DE) - INC DE -L5FBA: SUB 030H - JR C,L5FDA ; (+01cH) - CP 00AH - JR NC,L5FDA ; (+018H) - PUSH DE - CALL L600F - LD E,L - LD D,H - CALL L600F - CALL L600F - CALL L600B - LD E,A - LD D,000H - CALL L600B - POP DE - JR L5FB8 ; (-022H) - -L5FDA: LD A,H - OR A - JR NZ,L6011 ; (+033H) - LD A,L - POP HL - PUSH DE - PUSH BC - PUSH HL - LD DE,L84CF - PUSH DE - CALL L5E90 - POP HL - LD B,A - INC B - JR L5FF2 ; (+003H) - -L5FEF: CALL L60AA -L5FF2: DJNZ L5FEF ; (-005H) - EX DE,HL - POP HL - CALL L0000 - POP BC - POP DE - JP L5F7C - -L5FFE: PUSH AF - PUSH BC - PUSH DE - LD DE,L610D - CALL L7C9E - POP DE - POP BC - POP AF - RET - -L600B: ADD HL,DE - RET NC - JR L6011 ; (+002H) - -L600F: ADD HL,HL - RET NC -L6011: JP 04AEFH - -L6014: PUSH DE - PUSH HL - LD HL,L84CF - LD E,A - LD D,000H - CALL L5E99 - EX DE,HL - POP HL - PUSH BC - CALL L7985 - POP BC - POP DE - RET - -L6028: LD A,005H - LD (L84CE),A - LD A,(HL) - OR A - JR Z,L6035 ; (+004H) - INC HL - LD A,(HL) - DEC HL - RLCA -L6035: LD A,020H - JR NC,L603E ; (+005H) - CALL L7972 - LD A,02DH -L603E: PUSH AF - CALL L61AD - CALL L623A - POP AF - DEC DE - LD (DE),A - RET - -L6049: PUSH BC - CALL L7A1C - POP BC - RET - -L604F: CALL SKPDE - LD A,(HL) - CP 081H - JP C,L7967 - LD A,(HL) - CP 0A0H - RET NC - INC HL - CALL L6086 - PUSH HL - LD L,(HL) - LD B,000H -L6064: SRL E - RR D - RR C - RR L - INC A - INC B - CP 0A0H - JR NZ,L6064 ; (-00eH) -L6072: SLA L - RL C - RL D - RL E - DJNZ L6072 ; (-00aH) - LD A,L - POP HL - LD (HL),A - DEC HL - LD (HL),C - DEC HL - LD (HL),D - DEC HL - LD (HL),E - RET - -L6086: LD E,(HL) - INC HL -L6088: LD D,(HL) - INC HL - LD C,(HL) - INC HL - RET - -L608D: LD A,(HL) - CP 081H - RET C - PUSH DE - PUSH HL - LD DE,L60A5 - PUSH DE - CALL L5E93 - POP HL - CALL L604F - EX DE,HL - POP HL - CALL L797C - POP DE - RET - -L60A5: NOP - NOP - NOP - NOP - NOP -L60AA: PUSH AF - PUSH BC - PUSH DE - LD DE,L610D - CALL L7BB3 - POP DE - POP BC - POP AF - RET - -L60B7: INC HL - BIT 7,(HL) - JR Z,L60C7 ; (+00bH) - CALL L60C7 - LD A,H - CPL - LD H,A - LD A,L - CPL - LD L,A - INC HL - RET - -L60C7: DEC HL - LD A,(HL) - CP 091H - JP NC,04AEFH - CP 081H - JR C,L60E5 ; (+013H) - PUSH AF - INC HL - LD A,(HL) - INC HL - LD L,(HL) - LD H,A - POP AF - SET 7,H -L60DB: CP 090H - RET Z - INC A - SRL H - RR L - JR L60DB ; (-00aH) - -L60E5: CCF - LD HL,L0000 - RET - -L60EA: SBC A,E - LD A,0BCH - JR NZ,L60EF ; (+000H) -L60EF: SBC A,B - JR L6088 ; (-06aH) - - ADD A,B - NOP - SUB H - LD (HL),H - INC H - NOP - NOP - SUB C - LD B,E - LD D,B - NOP - NOP - ADC A,(HL) - INC E - LD B,B - NOP - NOP - ADC A,D - LD A,D - NOP - NOP - NOP - ADD A,A - LD C,B - NOP - NOP - NOP -L610D: ADD A,H - JR NZ,L6110 ; (+000H) -L6110: NOP - NOP -L6112: ADD A,C - NOP - NOP - NOP - NOP - LD A,L - LD C,H - CALL Z,0CDCCH -L611C: LD H,(HL) - DEC HL - CALL Z,L1277 -L6121: LD HL,(L6304) - LD B,000H -L6126: LD DE,L610D - CALL L6049 - JR C,L6134 ; (+006H) - CALL L5FFE - INC B - JR L6126 ; (-00eH) - -L6134: LD DE,L6112 - CALL L6049 - JR NC,L6142 ; (+006H) - CALL L60AA - DEC B - JR L6134 ; (-00eH) - -L6142: PUSH BC - CALL L61AD - CALL L623A - POP BC - PUSH DE - EX DE,HL -L614C: LD A,(HL) - OR A - JR Z,L6153 ; (+003H) - INC HL - JR L614C ; (-007H) - -L6153: DEC HL - LD A,(HL) - INC HL - CP 030H - JR NZ,L615C ; (+002H) - INC B - DEC HL -L615C: LD A,045H - LD (HL),A - INC HL - LD A,B - LD B,02BH - BIT 7,A - JR Z,L616B ; (+004H) - NEG - LD B,02DH -L616B: LD (HL),B - INC HL - LD (HL),030H -L616F: SUB 00AH - JR C,L6176 ; (+003H) - INC (HL) - JR L616F ; (-007H) - -L6176: ADD A,03AH - INC HL - LD (HL),A - INC HL - LD (HL),000H - POP DE - RET - -L617F: PUSH HL - CALL L60B7 - LD DE,L84A7 - PUSH DE - LD B,001H - RST 018H - DB 016H - POP HL - LD A,030H - LD B,005H -L6190: CP (HL) - JR NZ,L6198 ; (+005H) - INC HL - DJNZ L6190 ; (-006H) - JR L61A1 ; (+009H) - -L6198: LD A,B - LD (L6301),A - LD A,001H - LD (L6302),A -L61A1: LD A,02EH - LD (L84AC),A - POP HL - CALL L608D - JP L61FD - -L61AD: LD (L6304),HL - XOR A - LD (L6301),A - LD (L6302),A - PUSH HL - LD HL,L84A3 - LD (HL),0FFH - LD B,021H - LD A,030H -L61C1: INC HL - LD (HL),A - DJNZ L61C1 ; (-004H) - LD A,02EH - LD (L84AC),A - POP HL - LD A,(HL) - OR A - RET Z - LD DE,L60EA - CALL L7A1C - CCF - RET C - LD DE,L611C - CALL L7A1C - RET C - LD DE,L84D7 - PUSH DE - CALL L5E93 - POP HL - LD A,(HL) - CP 081H - JR C,L61FD ; (+013H) - CP 090H - JP C,L617F - LD IX,L84A4 - LD DE,L60EF - CALL L62C4 - CALL L62F8 - RET NC -L61FD: LD IX,L84AD -L6201: LD DE,L60EA - PUSH BC - PUSH IX - CALL L7BB3 - POP IX - POP BC - INC DE - INC DE - INC DE - INC DE - INC DE - CALL L62C4 - CALL L62F8 - JR C,L6201 ; (-019H) - RET - -L621B: LD A,005H - LD (L84CE),A - PUSH HL - LD DE,L84DF - PUSH DE - CALL L5E93 - POP HL - CALL L61AD - CALL L6237 - POP HL - RET - -L6231: LD DE,L84AC - LD (DE),A - DEC DE - RET - -L6237: JP C,L6121 -L623A: LD HL,(L6304) - LD A,(HL) - OR A - JR Z,L6231 ; (-010H) - LD DE,L84A4 - DEC DE - EX DE,HL - LD DE,00001H -L6249: INC HL - LD A,(HL) - CP 02EH - JR NZ,L6254 ; (+005H) - LD DE,L0000 - JR L6249 ; (-00bH) - -L6254: CP 030H - JR Z,L6249 ; (-00fH) - ADD HL,DE - LD DE,00008H - ADD HL,DE - LD A,(HL) -L625E: LD (HL),030H - CP 035H - JR C,L6273 ; (+00fH) -L6264: DEC HL - LD A,(HL) - CP 02EH - JR Z,L6264 ; (-006H) - INC A - JR Z,L62AD ; (+040H) - LD (HL),A - CP 03AH - JR Z,L625E ; (-014H) - INC HL -L6273: LD DE,L84AC - EX DE,HL - OR A - SBC HL,DE - EX DE,HL - JR C,L6282 ; (+005H) - LD HL,L84AC - JR L6299 ; (+017H) - -L6282: DEC HL - LD A,(HL) - CP 02EH - DEC HL - JR Z,L6298 ; (+00fH) - INC HL - CP 030H - JR Z,L6273 ; (-01bH) - PUSH HL - LD DE,L84B5 - SBC HL,DE - POP HL - JP NC,L6121 -L6298: INC HL -L6299: LD (HL),000H - LD DE,L84A4 -L629E: LD A,(DE) - CP 030H - JR NZ,L62A6 ; (+003H) - INC DE - JR L629E ; (-008H) - -L62A6: OR A - RET NZ - DEC DE - LD A,030H - LD (DE),A - RET - -L62AD: LD HL,L849C - LD DE,L62BE - PUSH BC - LD BC,L0006 - LDIR - POP BC - LD DE,L849C - RET - -L62BE: LD SP,L2B45 - JR NC,L62FB ; (+038H) - NOP -L62C4: LD A,(DE) - CP 07DH - RET Z -L62C8: CALL L7A1C - JR C,L62E0 ; (+013H) - INC (IX+000H) - PUSH IX - PUSH BC - CALL L797C - POP BC - POP IX - LD A,001H - LD (L6302),A - JR L62C8 ; (-018H) - -L62E0: INC IX - INC DE - INC DE - INC DE - INC DE - INC DE - LD A,(L6302) - LD B,A - LD A,(L6301) - ADD A,B - LD (L6301),A - CALL L62F8 - RET NC - JR L62C4 ; (-034H) - -L62F8: LD A,(HL) - OR A - RET Z -L62FB: LD A,(L6301) - CP 009H - RET - -L6301: NOP -L6302: NOP -L6303: NOP -L6304: NOP - NOP -L6306: NOP - NOP -L6308: NOP - NOP -L630A: LD HL,(L6308) - PUSH DE -L630E: LD A,(HL) - OR A - JP Z,04AF2H - CALL L63AC - JR Z,L631D ; (+005H) - LD (BC),A - INC BC - INC HL - JR L630E ; (-00fH) - -L631D: EX AF,AF' - LD A,(L84CE) - CP 003H - JP NZ,L63D5 - EX AF,AF' - CP 021H - JP Z,L6334 - CP 026H - JP Z,L635B - JP 04AF5H - -L6334: EX (SP),HL - PUSH BC - CALL L6E7E - OR A - LD A,020H - JR Z,L633F ; (+001H) - LD A,(DE) -L633F: POP BC - LD (BC),A - INC BC -L6342: POP HL - INC HL -L6344: LD A,(HL) - OR A - JR Z,L6352 ; (+00aH) - CALL L63AC - JR Z,L6355 ; (+008H) - LD (BC),A - INC BC - INC HL - JR L6344 ; (-00eH) - -L6352: LD HL,(L6306) -L6355: LD (L6308),HL - XOR A - LD (BC),A - RET - -L635B: LD D,002H -L635D: INC HL - LD A,(HL) - CP 026H - JR Z,L636B ; (+008H) - INC D - CP 020H - JR Z,L635D ; (-00bH) - JP 04AF2H - -L636B: EX (SP),HL - LD A,(HL) - CP D - JR C,L6385 ; (+015H) - INC HL - CALL INDRCT - PUSH BC - LD BC,(STRST) - ADD HL,BC - POP BC -L637B: LD A,(HL) - LD (BC),A - INC BC - INC HL - DEC D - JR NZ,L637B ; (-007H) - JP L6342 - -L6385: LD E,(HL) - INC HL - CALL INDRCT - LD A,E - OR A - JR Z,L63A2 ; (+014H) - PUSH BC - LD BC,(STRST) - ADD HL,BC - POP BC -L6395: LD A,(HL) - LD (BC),A - INC BC - INC HL - DEC E - JR Z,L63A6 ; (+00aH) - DEC D - JR NZ,L6395 ; (-00aH) - JP L6342 - -L63A2: LD A,020H - LD (BC),A - INC BC -L63A6: DEC D - JR NZ,L63A2 ; (-007H) - JP L6342 - -L63AC: CALL CHKACC - INC B - LD HL,L2326 - DEC HL - RET Z - LD E,A - CP 02AH - JR Z,L63CF ; (+015H) - CALL L65AC - JR Z,L63CF ; (+010H) - CP 02EH - LD E,023H - JR Z,L63CF ; (+00aH) - CP 0C4H - RET NZ - INC HL - LD A,(HL) - OR A - JP Z,04AF2H - RET - -L63CF: INC HL - LD A,(HL) - CP E - DEC HL - LD A,(HL) - RET - -L63D5: XOR A - LD (0651CH),A - LD (0656CH),A - LD (L6554),A - LD (06512H),A - LD (064CCH),A - LD (064F9H),A - LD (06517H),A - LD (064C5H),A - DEC A - LD (064C2H),A - EX AF,AF' - LD D,000H - CP 023H - JP Z,L6431 - CP 02AH - JP Z,L6412 - CALL L65AC - JP Z,L6423 - CP 02EH - JP Z,L6433 - CP 02BH - JP Z,L642C - JP 04AF5H - -L6412: LD A,001H - LD (0656CH),A - INC HL - INC D - INC HL - INC D - LD A,(HL) - CALL L65AC - JR NZ,L6433 ; (+012H) - JR L6425 ; (+002H) - -L6423: INC HL - INC D -L6425: INC HL - INC D - LD (L6554),A - JR L6433 ; (+007H) - -L642C: LD A,001H - LD (0651CH),A -L6431: INC HL - INC D -L6433: EX DE,HL - DEC H -L6435: INC H - LD A,(DE) - INC DE - CP 023H - JR Z,L6435 ; (-007H) - CP 02CH - JR NZ,L6447 ; (+007H) - LD A,001H - LD (064CCH),A - JR L6435 ; (-012H) - -L6447: CP 02EH - JR Z,L646E ; (+023H) - CP 02DH - JR NZ,L6457 ; (+008H) - LD A,001H - LD (06512H),A - INC DE - JR L6467 ; (+010H) - -L6457: CP 02BH - JR NZ,L6467 ; (+00cH) - LD A,(0651CH) - OR A - JR NZ,L6467 ; (+006H) - LD A,001H - LD (06517H),A - INC DE -L6467: DEC DE - LD A,H - LD (064F9H),A - JR L64A1 ; (+033H) - -L646E: LD A,H - LD (064F9H),A - LD H,0FFH -L6474: INC H - LD A,(DE) - INC DE - CP 023H - JR Z,L6474 ; (-007H) - CP 02DH - JR NZ,L6487 ; (+008H) - LD A,001H - LD (06512H),A - INC DE - JR L6497 ; (+010H) - -L6487: CP 02BH - JR NZ,L6497 ; (+00cH) - LD A,(0651CH) - OR A - JR NZ,L6497 ; (+006H) - LD A,001H - LD (06517H),A - INC DE -L6497: DEC DE - LD A,H - LD (064C2H),A - JR L64A1 ; (+003H) - -L649E: POP DE - JR L64B3 ; (+012H) - -L64A1: LD H,004H - PUSH DE -L64A4: LD A,(DE) - INC DE - CP 05EH - JR NZ,L649E ; (-00cH) - DEC H - JR NZ,L64A4 ; (-009H) - POP AF - LD A,001H - LD (064C5H),A -L64B3: POP HL - PUSH DE - INC HL - LD A,(HL) - RES 7,(HL) - DEC HL - LD (06549H),A - LD A,(064F9H) - LD D,A - LD A,000H - LD E,A - LD A,000H - PUSH BC - CALL L65BE - POP BC - LD A,000H - OR A - JR Z,L6511 ; (+041H) - PUSH BC - PUSH DE - LD A,(064F9H) - LD L,A - LD H,000H - ADD HL,DE - LD DE,L849C - LD C,000H - DEC HL -L64DF: LD B,003H -L64E1: LD A,(HL) - CP 020H - JR Z,L64F8 ; (+012H) - INC C - LD (DE),A - INC DE - DEC HL - DJNZ L64E1 ; (-00bH) - LD A,(HL) - CP 020H - JR Z,L64F8 ; (+007H) - LD A,02CH - LD (DE),A - INC DE - INC C - JR L64DF ; (-019H) - -L64F8: LD A,000H - CP C - JP C,04AEFH - LD B,C - LD L,A - LD H,000H - POP DE - PUSH DE - ADD HL,DE - LD DE,L849C - DEC HL -L6509: LD A,(DE) - LD (HL),A - DEC HL - INC DE - DJNZ L6509 ; (-006H) - POP DE - POP BC -L6511: LD A,000H - OR A - JR NZ,L6553 ; (+03dH) - LD A,000H - OR A - JR NZ,L6553 ; (+038H) - LD A,000H - OR A - JR NZ,L6548 ; (+028H) - LD A,(06549H) - RLCA - JR NC,L6553 ; (+02dH) - LD A,(DE) - CP 020H - LD H,02DH - JR Z,L6532 ; (+005H) - CP 030H - JP NZ,04AEFH -L6532: PUSH DE -L6533: LD A,(DE) - INC DE - CP 020H - JR Z,L6533 ; (-006H) - CP 030H - JR Z,L6533 ; (-00aH) - OR A - JR NZ,L6541 ; (+001H) - DEC DE -L6541: DEC DE - DEC DE - LD A,H - LD (DE),A - POP DE - JR L6553 ; (+00bH) - -L6548: LD A,000H - RLCA - LD H,02BH - JR NC,L6532 ; (-01dH) - LD H,02DH - JR L6532 ; (-021H) - -L6553: DB 03EH -L6554: NOP - OR A - JR Z,L656B ; (+013H) - LD A,(DE) - CP 020H - JR NZ,L656B ; (+00eH) - PUSH DE -L655E: LD A,(DE) - INC DE - CP 020H - JR Z,L655E ; (-006H) - DEC DE - DEC DE - LD A,(L6554) - LD (DE),A - POP DE -L656B: LD A,000H - OR A - JR Z,L657D ; (+00dH) - PUSH DE -L6571: LD A,(DE) - CP 020H - JR NZ,L657C ; (+006H) - LD A,02AH - LD (DE),A - INC DE - JR L6571 ; (-00bH) - -L657C: POP DE -L657D: LD A,(DE) - OR A - JR Z,L6586 ; (+005H) - LD (BC),A - INC BC - INC DE - JR L657D ; (-009H) - -L6586: LD A,(06517H) - OR A - JR Z,L659A ; (+00eH) - LD A,(06549H) - RLCA - LD A,02BH -L6592: JR NC,L6596 ; (+002H) - LD A,02DH -L6596: LD (BC),A - INC BC - JR L65A8 ; (+00eH) - -L659A: LD A,(06512H) - OR A - JR Z,L65A8 ; (+008H) - LD A,(06549H) - RLCA - LD A,020H - JR L6592 ; (-016H) - -L65A8: POP HL - JP L6344 - -L65AC: PUSH HL - LD HL,L0036 - BIT 6,(HL) - POP HL - JR NZ,L65B8 ; (+003H) - CP 07DH - RET - -L65B8: CP FDPD - RET Z - CP 024H - RET - -L65BE: OR A - JP Z,L6649 - PUSH DE - LD A,(HL) - OR A - JR Z,L6606 ; (+03fH) - PUSH HL - LD A,D - LD DE,L84D7 - PUSH AF - CALL L5E90 - POP AF - OR A - JR Z,L65DF ; (+00bH) - LD B,A - LD HL,L84D7 - JR L65DD ; (+003H) - -L65DA: CALL L60AA -L65DD: DJNZ L65DA ; (-005H) -L65DF: POP HL - LD B,000H -L65E2: LD DE,L84D7 - CALL L6049 - JR C,L65F0 ; (+006H) - CALL L5FFE - INC B - JR L65E2 ; (-00eH) - -L65F0: PUSH HL - LD HL,L84D7 - CALL L5FFE - POP HL -L65F8: LD DE,L84D7 - CALL L6049 - JR NC,L6606 ; (+006H) - CALL L60AA - DEC B - JR L65F8 ; (-00eH) - -L6606: POP DE - PUSH BC - CALL L6663 - POP BC - PUSH DE - LD A,(DE) - CP 02EH - JR NZ,L6624 ; (+012H) - LD DE,L84AC - DEC DE - LD A,(DE) - CP 031H - POP DE - PUSH DE - JR NZ,L6640 ; (+023H) - EX DE,HL - INC HL - LD (HL),031H - DEC HL - JR L663E ; (+01aH) - -L6624: LD A,(DE) - CP 031H - JR NZ,L6640 ; (+017H) - EX DE,HL - INC HL - LD A,(HL) - DEC HL - CP 02EH - LD A,030H - JR Z,L6635 ; (+002H) - LD A,020H -L6635: LD (HL),A -L6636: INC HL - LD A,(HL) - CP 02EH - JR Z,L6636 ; (-006H) - LD (HL),031H -L663E: EX DE,HL - INC B -L6640: LD A,(DE) - INC DE - OR A - JR NZ,L6640 ; (-005H) - DEC DE - JP L615C - -L6649: PUSH DE - CALL L6663 - POP AF - OR A - RET NZ - PUSH HL - LD HL,L84AC - DEC HL - LD A,030H - CP (HL) -L6658: JP NZ,04AEFH - DEC HL - LD A,020H - CP (HL) - JR NZ,L6658 ; (-009H) - POP HL - RET - -L6663: PUSH DE - CALL L61AD - JP C,04AEFH - POP HL - PUSH HL - LD H,000H - INC L - JR Z,L6672 ; (+001H) - DEC L -L6672: LD DE,L84AD - ADD HL,DE - LD A,(HL) - LD (HL),000H - LD DE,L3036 - CP 035H - JR C,L668F ; (+00fH) -L6680: DEC HL - LD A,(HL) - CP 02EH - JR Z,L6680 ; (-006H) - INC A - JP Z,04AEFH - LD (HL),A - CP 03AH - JR Z,0667AH ; (-015H) -L668F: LD HL,L11A3 - LD DE,L2000 -L6695: LD (HL),D - INC HL - DEC E - JR NZ,L6695 ; (-005H) - POP HL - PUSH HL - LD E,H - LD D,000H - LD HL,L11A4 - ADD HL,DE - PUSH HL - LD HL,L84A3 - LD (HL),020H - INC HL - LD D,007H -L66AC: LD A,(HL) - CP 030H - JR NZ,L66B7 ; (+006H) - LD (HL),020H - INC HL - DEC D - JR NZ,L66AC ; (-00bH) -L66B7: POP HL - PUSH HL - LD B,E - LD A,B - OR A - JR Z,L66D5 ; (+017H) - LD DE,L84AC -L66C1: DEC HL - DEC DE - LD A,(DE) - LD (HL),A - CP 020H - JR Z,L66D5 ; (+00cH) - DJNZ L66C1 ; (-00aH) - DEC DE - LD A,(DE) - CP 020H - JR Z,L66D5 ; (+004H) - INC A - JP NZ,04AEFH -L66D5: POP HL - POP DE - INC E - JR Z,L66E9 ; (+00fH) - LD B,E - LD DE,L84AD - LD (HL),02EH -L66E0: INC HL - DEC B - JR Z,L66E9 ; (+005H) - LD A,(DE) - INC DE - LD (HL),A - JR L66E0 ; (-009H) - -L66E9: LD (HL),000H - LD DE,L11A4 - RET - -L66EF: PUSH DE - PUSH BC - LD C,000H - DEC DE -L66F4: INC DE -L66F5: CALL L687B - OR A - JR Z,L672C ; (+031H) - CP 0FFH - JR Z,L6730 ; (+031H) - CP 060H - JP NC,L4AEC - CP 020H - JR C,L66F4 ; (-014H) - LD IX,L66F5 - PUSH IX - CP 022H - JR Z,L674B ; (+039H) - CP 027H - JR Z,L673E ; (+028H) - CP 03FH - JR Z,L6737 ; (+01dH) - CP 02EH - JP Z,L689E - CP 024H - JP Z,L68B8 - CALL L5EC4 - JR C,L6773 ; (+04aH) - JP L6885 - -L672C: LD (HL),A - POP BC - POP DE - RET - -L6730: LD (HL),LSE4 - CALL L6757 - JR L66F5 ; (-042H) - -L6737: LD A,08FH - CALL L6756 - JR L67B4 ; (+076H) - -L673E: LD (HL),03AH - CALL L6757 - LD (HL),027H - CALL L6758 - JP L681B - -L674B: LD (HL),A - CALL L6757 -L674F: LD A,(DE) - OR A - RET Z - CP 022H - JR NZ,L674B ; (-00bH) -L6756: LD (HL),A -L6757: INC DE -L6758: INC HL -L6759: INC C - RET NZ - JP 04B01H - -L675E: POP BC - LD A,(DE) - CALL L5ECB - JR C,L6756 ; (-00fH) -L6765: CALL L6756 - LD A,(DE) - CP 024H - JR Z,L6756 ; (-017H) - CALL L5EC4 - RET C - JR L6765 ; (-00eH) - -L6773: PUSH BC - LD BC,STMTWORDTBL - CALL L682A - JR NC,L67AA ; (+02eH) - LD BC,EXTWORDTBL - CALL L682A - LD C,0FEH - JR NC,L6790 ; (+00aH) - LD BC,FUNCWORDTBL - CALL L682A - LD C,0FFH - JR C,L675E ; (-032H) -L6790: LD (HL),C - INC HL - LD (HL),A - POP BC - CALL L6759 - CALL L6758 - CP 0B4H - RET NZ - CALL L687B - CP 03DH - RET NZ - LD (HL),QDPC - CALL L6757 - JR L67F0 ; (+046H) - -L67AA: POP BC - CP 0DFH - DB 020H - LD (BC),A - LD (HL),0A8H - CALL L6758 -L67B4: CP 097H - JR Z,L681B ; (+063H) - CP 094H - JR Z,L681B ; (+05fH) - CP 0C2H - JR Z,L6811 ; (+051H) - CP LSE2 - JR Z,L67F0 ; (+02cH) - CP LSE0 - RET NC - PUSH AF - CALL L687B - CP 02FH - JR NZ,L67DC ; (+00dH) - LD (HL),FDPD - CALL L6757 - CALL L6A1D - CALL L6756 - JR L67EC ; (+010H) - -L67DC: CP 023H - JR NZ,L67EC ; (+00cH) - CALL L6756 - CALL L6A1D - CALL L5EC4 - CALL NC,L6885 -L67EC: POP AF - CP 08DH - RET NC -L67F0: CALL L687B - CP 022H - JR NZ,L67FC ; (+005H) - CALL L674B - JR L67F0 ; (-00cH) - -L67FC: CP 02CH - RET C - CP 02FH - JR C,L680C ; (+009H) - CALL L5EC4 - RET C - CALL L68AF - JR L67F0 ; (-01cH) - -L680C: CALL L6756 - JR L67F0 ; (-021H) - -L6811: DB 02BH - LD (HL),03AH - INC HL - LD (HL),A - CALL L6758 - JR L67F0 ; (-02bH) - -L681B: LD A,(DE) - CALL L4141 - RET Z - CALL L6756 - CP 022H - CALL Z,L674F - JR L681B ; (-00fH) - -L682A: PUSH HL - PUSH DE - LD H,B - LD L,C - LD B,07FH -L6830: POP DE - PUSH DE - INC B - LD A,(HL) - CP 0FFH - JR NZ,L683C ; (+004H) - POP DE - POP HL - SCF - RET - -L683C: CP 02EH - JR NZ,L6849 ; (+009H) - INC HL - DEC DE - LD A,(DE) - INC DE - CALL L5ECB - JR NC,L6868 ; (+01fH) -L6849: LD A,(DE) - CP 020H - JR NZ,L685A ; (+00cH) - LD A,(HL) - AND 07FH - SUB 041H - CP 01AH - JR C,L6868 ; (+011H) - CALL L6A1C -L685A: LD C,(HL) - INC HL - INC DE - CP 02EH - JR Z,L6870 ; (+00fH) - SUB C - JR Z,L6849 ; (-01bH) - CP 080H - JR Z,L6876 ; (+00eH) -L6868: DEC HL -L6869: BIT 7,(HL) - INC HL - JR Z,L6869 ; (-005H) - JR L6830 ; (-040H) - -L6870: LD A,B - CP 0E8H - JR NC,L6868 ; (-00dH) - CCF -L6876: POP HL - POP HL - LD (HL),B - LD A,B - RET - -L687B: LD A,(DE) - CP 020H - RET NZ - LD (HL),A - CALL L6757 - JR L687B ; (-00aH) - -L6885: EX AF,AF' - PUSH DE - CALL L6A1C - POP DE - CALL L5EC4 - JR NC,L689E ; (+00eH) - CP 02EH - JR Z,L689E ; (+00aH) - CP 045H - JR Z,L689E ; (+006H) - EX AF,AF' - SUB 02FH - JP L689E - -L689E: PUSH BC - LD (HL),015H - INC HL - PUSH HL - CALL L5EDC - POP HL - LD BC,00005H - ADD HL,BC - LD A,006H - JR L68D2 ; (+023H) - -L68AF: PUSH BC - CALL L6A11 - LD (HL),00BH - INC HL - JR L68CC ; (+014H) - -L68B8: LD (HL),A - INC DE - LD A,(DE) - RST 018H - DB 015H - JP C,L6758 - PUSH BC - LD (HL),011H - INC HL - PUSH HL - EX DE,HL - RST 018H - DB 014H - LD B,D - LD C,E - EX DE,HL - POP HL -L68CC: LD A,003H - LD (HL),C - INC HL - LD (HL),B - INC HL -L68D2: POP BC - ADD A,C - JP C,04B01H - LD C,A -L68D8: DEC DE - LD A,(DE) - CP 020H - JR Z,L68D8 ; (-006H) - INC DE - RET - -L68E0: PUSH HL - PUSH DE - PUSH BC - EXX - LD B,000H - EXX - LD C,000H -L68E9: LD A,(HL) - OR A - JR Z,L691D ; (+030H) - LD BC,L68E9 - PUSH BC - CP 027H - JR Z,L6937 ; (+042H) - INC HL - LD BC,STMTWORDTBL - CP 020H - JR C,L695F ; (+062H) - CP 022H - JR Z,L6948 ; (+047H) - CP 03AH - JR Z,L6955 ; (+050H) - CP 097H - JR Z,L6933 ; (+02aH) - CP 094H - JR Z,L6933 ; (+026H) - CP LSE4 - JR Z,L6922 ; (+011H) - CP 0FEH - JR NC,L6927 ; (+012H) - CP 080H - JP NC,L69A3 - JP L69C0 - -L691D: LD (DE),A - POP BC - POP DE - POP HL - RET - -L6922: LD A,0FFH - JP L69C0 - -L6927: LD BC,FUNCWORDTBL - JR NZ,L692F ; (+003H) - LD BC,EXTWORDTBL -L692F: LD A,(HL) - INC HL - JR L69A3 ; (+070H) - -L6933: CALL L69A3 - RET Z -L6937: LD A,(HL) - CALL L4141 - RET Z - CALL L69C0 - LD A,(HL) - INC HL - CP 022H - CALL Z,L694B - JR L6937 ; (-011H) - -L6948: CALL L69C0 -L694B: LD A,(HL) - OR A - RET Z - INC HL - CP 022H - JR NZ,L6948 ; (-00bH) - JR L69C0 ; (+06bH) - -L6955: LD (DE),A - LD A,(HL) - CP 0C2H - RET Z - CP 027H - RET Z - JR L69C3 ; (+064H) - -L695F: CP 015H - JR Z,L6993 ; (+030H) - CP 00BH - JR NC,L696C ; (+005H) - DEC A - OR 030H - JR L69C0 ; (+054H) - -L696C: PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - INC HL - PUSH HL - CP 012H - JR Z,L6982 ; (+00cH) - CP 00CH - JR C,L6982 ; (+008H) - JR NZ,L69CF ; (+053H) - EX DE,HL - INC HL - INC HL - LD E,(HL) - INC HL - LD D,(HL) -L6982: EX DE,HL - CALL L5E66 - LD B,D - LD C,E - POP HL - POP DE -L698A: LD A,(BC) - OR A - RET Z - CALL L69C0 - INC BC - JR L698A ; (-009H) - -L6993: PUSH HL - PUSH DE - CALL L621B - LD B,D - LD C,E - POP DE - POP HL - INC HL - INC HL - INC HL - INC HL - INC HL - JR L698A ; (-019H) - -L69A3: CP 080H - JR Z,L69B1 ; (+00aH) - EX AF,AF' -L69A8: LD A,(BC) - RLCA - INC BC - JR NC,L69A8 ; (-005H) - EX AF,AF' - DEC A - JR L69A3 ; (-00eH) - -L69B1: LD A,(BC) - BIT 7,A - JR NZ,L69BE ; (+008H) - CP 02EH - CALL NZ,L69C0 - INC BC - JR L69B1 ; (-00dH) - -L69BE: AND 07FH -L69C0: LD (DE),A - OR A - RET Z -L69C3: INC DE - EXX - INC B - EXX - RET NZ - XOR A - LD (DE),A - DEC DE - EXX - DEC B - EXX - RET - -L69CF: LD A,024H - EX AF,AF' - EX DE,HL - CALL L69E0 - LD B,D - LD C,E - POP HL - POP DE - EX AF,AF' - CALL L69C0 - JR L698A ; (-056H) - -L69E0: LD DE,L84A8 - PUSH DE - LD A,H - CALL L69F9 - LD A,L - CALL L69F9 - XOR A - LD (DE),A - POP DE - LD B,003H -L69F1: LD A,(DE) - CP 030H - RET NZ - INC DE - DJNZ L69F1 ; (-007H) - RET - -L69F9: PUSH AF - RRCA - RRCA - RRCA - RRCA - AND 00FH - CALL L6A06 - POP AF - AND 00FH -L6A06: ADD A,030H - CP 03AH - JR C,L6A0E ; (+002H) - ADD A,007H -L6A0E: LD (DE),A - INC DE - RET - -L6A11: PUSH HL - EX DE,HL - RST 018H - DB 013H - LD B,D - LD C,E - EX DE,HL - POP HL - JP L68D8 - -L6A1C: INC DE -L6A1D: LD A,(DE) - CP 020H - JR Z,L6A1C ; (-006H) - RET - -L6A23: LD C,(HL) -L6A24: CALL L6A2C - XOR A - LD (L1095),A - RET - -L6A2C: LD A,(L004D) - OR A - JP NZ,L4B3C - CALL TEST1 - DB 047H - JR Z,L6A7C ; (+043H) - CALL TESTX - DB 054H - LD A,001H - LD (L1097),A - CALL TEST1 - DB 04EH - JR Z,L6A52 ; (+00aH) - CALL TEST1 - DB 04CH - JR Z,L6A52 ; (+004H) - CALL TESTX - DB 053H -L6A52: LD (L6A23),A - CALL 05E48H - CALL L6A74 -L6A5B: LD A,001H - RST 018H - DB 006H - LD A,(L6A23) - CP 04EH - RET Z - CP 04CH - LD A,00BH - JR Z,L6A71 ; (+006H) - LD A,009H - RST 018H - DB 006H - RST 018H - DB 006H -L6A71: RST 018H - DB 006H - RET - -L6A74: LD A,00AH - RST 018H - DB 006H - LD A,003H - JR L6A71 ; (-00bH) - -L6A7C: INC HL - CALL 05E48H - LD A,002H - LD (L1097),A - JR L6A71 ; (-016H) - -L6A87: CALL L6AC6 - CALL L6E5F - LD A,E - OR A - RET Z - CP 0ECH - JR NC,L6A99 ; (+005H) - CP 015H - JP NC,04AF2H -L6A99: CALL 05E48H - BIT 7,E - JR NZ,L6AA8 ; (+008H) -L6AA0: LD A,00AH - RST 018H - DB 006H - DEC E - JR NZ,L6AA0 ; (-007H) - RET - -L6AA8: LD A,003H - RST 018H - DB 006H - INC E - JR NZ,L6AA8 ; (-007H) - RET - -L6AB0: PUSH HL - LD HL,L03E7 - JR L6ABA ; (+004H) - -L6AB6: PUSH HL - LD HL,L01E0 -L6ABA: PUSH HL - ADD HL,DE - POP HL - JR C,L6AC4 ; (+005H) - SBC HL,DE - JP C,04AF2H -L6AC4: POP HL - RET - -L6AC6: LD B,001H - JR L6ACC ; (+002H) - -L6ACA: LD B,002H -L6ACC: LD A,(L1097) - CP B - RET Z - JP L4B3C - -L6AD4: LD C,044H - LD DE,04A0EH - LD DE,04D0EH - LD DE,0520EH - CALL L6ACA - LD A,C - LD (06B26H),A - CP 04DH - JR NC,L6B0C ; (+022H) - CALL TEST1 - DB 025H - JR NZ,L6B0C ; (+01cH) - CALL L6E4B - LD A,E - DEC A - CP 010H - JP NC,04AF2H - DEC DE - LD A,04CH - RST 018H - DB 006H - CALL L6DE2 - CALL L6B68 - CALL L413E - RET Z - CALL L5E73 -L6B0C: CALL L6E5F - CALL L5E73 - CALL L6AB6 - PUSH DE - CALL L6E5F - CP 02CH - JR Z,L6B20 ; (+003H) - CALL 05E48H -L6B20: CALL L6AB0 - POP BC - PUSH DE - LD A,000H - RST 018H - DB 006H - LD E,C - LD D,B - CALL L6DE2 - CALL L6B6C - POP DE - CALL L6DE2 - CALL L6B68 - CALL L413E - RET Z - INC HL - JR L6B0C ; (-033H) - -L6B3F: CALL L6E4B - LD A,E - CP 004H - JP NC,04AF2H - CALL 05E48H - LD A,(L1097) - CP 002H - JR Z,L6B5F ; (+00dH) - CALL L6A74 - LD A,002H - RST 018H - DB 006H - CALL L6B5F - JP L6A5B - -L6B5F: LD A,043H - RST 018H - DB 006H - LD A,E - OR 030H - RST 018H - DB 006H -L6B68: LD A,00DH - JR L6B6E ; (+002H) - -L6B6C: LD A,02CH -L6B6E: RST 018H - DB 006H - RET - -L6B71: CALL L6ACA - CALL 05E48H - LD A,048H - JR L6B6E ; (-00dH) - -L6B7B: CALL L6ACA - CALL 05E48H - LD A,049H - JR L6B6E ; (-017H) - -L6B85: CALL L6ACA - CALL TEST1 - DB 05BH - JR NZ,L6BC6 ; (+038H) - CALL L6E4B - CP 040H - JP NC,04AF2H - PUSH DE - CALL L5E70 - CALL L6E4B - CP 004H - JP NC,04AF2H - PUSH DE - CALL TESTX - DB 05DH - POP BC - POP DE - PUSH BC - LD A,053H - RST 018H - DB 006H - CALL L6DE2 - CALL L6B6C - POP DE - LD A,051H - RST 018H - DB 006H - CALL L6DE2 - CALL L6B68 - CALL L413E - RET Z - CALL L5E73 -L6BC6: CALL L6E6F - CALL L413E - JR Z,L6BD2 ; (+004H) - CALL L5E73 - DEC HL -L6BD2: LD A,B - OR A - JR Z,L6BE3 ; (+00dH) - LD A,050H - RST 018H - DB 006H -L6BDA: LD A,(DE) - RST 018H - DB 006H - INC DE - DJNZ L6BDA ; (-006H) - CALL L6B68 -L6BE3: CALL L413E - RET Z - INC HL - JR L6BC6 ; (-024H) - -L6BEA: CALL L6ACA - CALL L6E4B - CP 002H - JP NC,04AF2H - PUSH AF - CALL L5E70 - CALL L6E5F - PUSH DE - CALL L5E73 - CALL L6E4B - OR A - JP Z,04AF2H - CALL 05E48H - LD A,058H - RST 018H - DB 006H - POP BC - POP AF - PUSH DE - PUSH BC - OR 030H - RST 018H - DB 006H - CALL L6B6C - POP DE - CALL L6AB0 - CALL L6DE2 - CALL L6B6C - POP DE - CALL L6DE2 - JP L6B68 - -L6C2A: CALL L6ACA - PUSH HL - LD DE,L0000 - LD HL,L6DC4 - CALL L5E99 - LD DE,L0168 - LD HL,L6DC9 - CALL L5E99 - LD HL,L610D - LD DE,L6DCE - CALL L5E93 - POP HL - CALL L6E8A - CALL L5E73 - PUSH HL - LD HL,L6DB5 - EX DE,HL - CALL L5E93 - POP HL - CALL L6E8A - CALL L5E73 - PUSH HL - LD HL,L6DBA - EX DE,HL - CALL L5E93 - POP HL - CALL L6E8A - PUSH HL - PUSH AF - LD HL,L6DBF - EX DE,HL - CALL L5E93 - LD A,(06DC0H) - RLCA - JP C,04AF2H - POP AF - CP 02CH - JR NZ,L6CBA ; (+03aH) - POP HL - INC HL - CALL L6E8A - PUSH HL - PUSH AF - LD HL,L6DC4 - EX DE,HL - CALL L5E93 - POP AF - CP 02CH - JR NZ,L6CBA ; (+027H) - POP HL - INC HL - CALL L6E8A - PUSH HL - PUSH AF - LD HL,L6DC9 - EX DE,HL - CALL L5E93 - POP AF - CP 02CH - JR NZ,L6CBA ; (+014H) - POP HL - INC HL - CALL L6E8A - PUSH HL - LD HL,L6DCE - EX DE,HL - CALL L5E93 - LD A,(06DCFH) - RLCA - JP C,04AF2H -L6CBA: POP HL - CALL 05E48H - PUSH HL - LD HL,L6DC9 - LD DE,L6DC4 - LD A,(L6DCE) - OR A - CALL NZ,L7A1C - JP C,04AF2H - CALL L6D6B - LD HL,L6DD3 - LD (06D43H),HL - LD HL,L6DD8 - LD (06D4EH),HL - CALL 06D3FH - LD A,(L6DCE) - OR A - JR Z,L6D19 ; (+032H) -L6CE7: LD HL,L6DC4 - LD DE,L6DCE - CALL L7985 - LD DE,L6DC9 - CALL L7A1C - JR NC,L6D04 ; (+00cH) - CALL L6D6B - CALL L6D3C - RST 018H - DB 00EH - JR NZ,L6CE7 ; (-01bH) - POP HL - RET - -L6D04: CALL L6D0C - CALL L6D3C - POP HL - RET - -L6D0C: LD HL,L6DC9 - LD DE,L6DC4 - LD BC,00005H - LDIR - JR L6D6B ; (+052H) - -L6D19: LD HL,L6DB5 - LD (06D43H),HL - LD HL,L6DBA - LD (06D4EH),HL - CALL L6D3C - CALL L6D0C - LD HL,L6DD3 - LD (06D43H),HL - LD HL,L6DD8 - LD (06D4EH),HL - CALL L6D3C - POP HL - RET - -L6D3C: LD A,044H - LD HL,L4D3E - PUSH AF - LD HL,L6DB5 - CALL L60B7 - PUSH HL - EX DE,HL - CALL L6AB0 - LD HL,L6DBA - CALL L60B7 - PUSH HL - EX DE,HL - CALL L6AB0 - POP HL - POP DE - POP AF - RST 018H - DB 006H - PUSH HL - CALL L6DE2 - CALL L6B6C - POP DE - CALL L6DE2 - JP L6B68 - -L6D6B: LD DE,(INTFAC) - LD HL,L6DC4 - CALL L5E93 - LD HL,(L107C) - CALL L817C - CALL L7FC2 - LD DE,L6DBF - CALL L7BB3 - LD DE,L6DB5 - CALL L7985 - LD DE,L6DD3 - CALL L5E93 - LD DE,(INTFAC) - LD HL,L6DC4 - CALL L5E93 - LD HL,(L107C) - CALL L817C - CALL L7FD2 - LD DE,L6DBF - CALL L7BB3 - LD DE,L6DBA - CALL L7985 - LD DE,L6DD8 - JP L5E93 - -L6DB5: DS 5, 000H -L6DBA: DS 5, 000H -L6DBF: DS 5, 000H -L6DC4: DS 5, 000H -L6DC9: DS 5, 000H -L6DCE: DS 5, 000H -L6DD3: DS 5, 000H -L6DD8: DS 10, 000H -L6DE2: PUSH AF - PUSH HL - LD HL,(L107C) - CALL L5E99 - CALL L6028 - RST 018H - DB 017H -L6DEF: LD A,(DE) - RST 018H - DB 006H - INC DE - DJNZ L6DEF ; (-006H) - POP HL - POP AF - RET - -L6DF8: CALL L6AC6 - CALL 05E48H - LD A,004H - RST 018H - DB 006H - RET - -L6E03: CALL L6AC6 - CALL L6E5F - LD A,E - OR A - JP Z,04AF2H - CP 049H - JP NC,04AF2H - CALL 05E48H - LD A,009H - RST 018H - DB 006H - RST 018H - DB 006H - CALL L6DE2 - JP L6B68 - -L6E22: CP 09DH - JR Z,L6E31 ; (+00bH) - CP 0A1H - JP NZ,L4AEC - XOR A -L6E2C: LD (L004D),A - INC HL - RET - -L6E31: CALL L6AC6 - LD A,(L6A23) - CP 04EH - JP NZ,L4B3C - LD A,(L004D) - OR A - JR NZ,L6E2C ; (-016H) - CALL L5285 - LD A,016H - RST 018H - DB 003H - JR L6E2C ; (-01fH) - -L6E4B: CALL L6E5F -L6E4E: LD A,D - OR A - JP NZ,04AF2H - LD A,E - RET - -L6E55: CALL L6E9C - DEC DE - DEC DE - DEC DE - DEC DE - DEC DE - JR L6E62 ; (+003H) - -L6E5F: CALL L6E8A -L6E62: PUSH AF - PUSH HL - EX DE,HL - CALL L791F - CALL L60B7 - EX DE,HL - POP HL - POP AF - RET - -L6E6F: CALL L6E8A - PUSH AF - CALL L7916 - PUSH HL - EX DE,HL - CALL L6E7E - POP HL - POP AF - RET - -L6E7E: LD B,(HL) - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(L1076) - ADD HL,DE - EX DE,HL - LD A,B - RET - -L6E8A: LD DE,(VARED) - LD (TMPEND),DE -L6E92: LD DE,(INTFAC) - PUSH DE - CALL L6E9C - POP DE - RET - -L6E9C: PUSH DE - LD DE,(TMPEND) - CALL L74E8 - POP DE - CALL L6EC0 -L6EA8: CP 0EAH - RET NZ - LD A,(L84CE) - PUSH AF - INC HL - CALL L6EC0 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL 07E65H - POP HL - POP AF - JR L6EA8 ; (-018H) - -L6EC0: CALL L6EDB -L6EC3: CP 0EBH - RET NZ - LD A,(L84CE) - PUSH AF - INC HL - CALL L6EDB - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL 07E62H - POP HL - POP AF - JR L6EC3 ; (-018H) - -L6EDB: CALL L6EF6 -L6EDE: CP 0ECH - RET NZ - LD A,(L84CE) - PUSH AF - INC HL - CALL L6EF6 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7E5F - POP HL - POP AF - JR L6EDE ; (-018H) - -L6EF6: CALL TEST1 - DB 0EDH - JR NZ,L6F0B ; (+00fH) - CALL L6F0B - PUSH AF - PUSH HL - LD HL,0FFFBH - ADD HL,DE - CALL L7E4F - POP HL - POP AF - RET - -L6F0B: CALL L6F75 -L6F0E: CP 0EEH - RET C - PUSH AF - LD A,(L84CE) - PUSH AF - INC HL - CALL L6F75 - POP BC - EX (SP),HL - PUSH AF - PUSH HL - CALL L74C5 - CALL L7A1C - EX AF,AF' - POP AF - CP 0F6H - JR NZ,L6F48 ; (+01eH) - EX AF,AF' - JR C,L6F43 ; (+016H) -L6F2D: LD BC,L0000 -L6F30: LD (HL),C - INC HL - LD (HL),B - INC HL - XOR A - LD (HL),A - INC HL - LD (HL),A - INC HL - LD (HL),A - LD A,005H - LD (L84CE),A - POP AF - POP HL - JR L6F0E ; (-035H) - -L6F43: LD BC,08081H - JR L6F30 ; (-018H) - -L6F48: CP QDPD - JR NZ,L6F53 ; (+007H) - EX AF,AF' - JR Z,L6F2D ; (-022H) - JR C,L6F2D ; (-024H) - JR L6F43 ; (-010H) - -L6F53: CP QDPC - JR NZ,L6F5C ; (+005H) - EX AF,AF' - JR Z,L6F43 ; (-017H) - JR L6F2D ; (-02fH) - -L6F5C: CP QDPA - JR C,L6F65 ; (+005H) - EX AF,AF' - JR NC,L6F43 ; (-020H) - JR L6F2D ; (-038H) - -L6F65: CP 0F0H - JR C,L6F70 ; (+007H) - EX AF,AF' - JR Z,L6F43 ; (-029H) - JR C,L6F43 ; (-02bH) - JR L6F2D ; (-043H) - -L6F70: EX AF,AF' - JR Z,L6F2D ; (-046H) - JR L6F43 ; (-032H) - -L6F75: CALL L6FA0 -L6F78: CP 0F7H - RET C - LD A,(L84CE) - PUSH AF - INC HL - JR Z,L6F92 ; (+010H) - CALL L6FA0 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L797C -L6F8E: POP HL - POP AF - JR L6F78 ; (-01aH) - -L6F92: CALL L6FA0 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7985 - JR L6F8E ; (-012H) - -L6FA0: CALL L6FCB -L6FA3: CP FDPB - RET C - LD A,(L84CE) - PUSH AF - INC HL - JR Z,L6FBD ; (+010H) - CALL L6FCB - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7EBB -L6FB9: POP HL - POP AF - JR L6FA3 ; (-01aH) - -L6FBD: CALL L6FCB - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7EDA - JR L6FB9 ; (-012H) - -L6FCB: CALL L6FF6 -L6FCE: CP FDPD - RET C - LD A,(L84CE) - PUSH AF - INC HL - JR Z,L6FE8 ; (+010H) - CALL L6FF6 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7BB3 -L6FE4: POP HL - POP AF - JR L6FCE ; (-01aH) - -L6FE8: CALL L6FF6 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7C9E - JR L6FE4 ; (-012H) - -L6FF6: CALL TEST1 - DB 0F7H - JR Z,L6FF6 ; (-006H) - CP FDPA - JR NZ,L7006 ; (+006H) - INC HL - CALL L7006 - JR L702F ; (+029H) - -L7006: CALL L703B -L7009: CP 0FDH - RET NZ - LD A,(L84CE) - PUSH AF - INC HL - CALL L7021 - POP BC - PUSH AF - PUSH HL - CALL L74C5 - CALL L7DD3 - POP HL - POP AF - JR L7009 ; (-018H) - -L7021: CALL TEST1 - DB 0F7H - JR Z,L7021 ; (-006H) - CP FDPA - JR NZ,L703B ; (+010H) - INC HL - CALL L703B -L702F: PUSH AF - PUSH HL - LD HL,0FFFBH - ADD HL,DE - CALL L796F - POP HL - POP AF - RET - -L703B: CALL L413E - JP Z,L4AEC - CALL L7047 - JP HLFTCH - -L7047: PUSH HL - LD HL,(L107E) - SCF - SBC HL,DE - JP C,04AFBH - POP HL - CP LSE4 - JR Z,L7064 ; (+00eH) - CP 020H - JR NC,L70A4 ; (+04aH) -L705A: INC HL - CP 015H - JR C,L7073 ; (+014H) - CALL L5E93 - JR L706D ; (+009H) - -L7064: INC HL - PUSH HL - LD HL,0818FH - CALL L5E93 - POP HL -L706D: LD A,005H -L706F: LD (L84CE),A - RET - -L7073: CP 00BH - JR NC,L7080 ; (+009H) - DEC A - JP M,L4AEC - LD B,000H - LD C,A - JR L7091 ; (+011H) - -L7080: LD C,(HL) - INC HL - LD B,(HL) - INC HL - CP 00CH - JR NZ,L7091 ; (+009H) - INC BC - INC BC - LD A,(BC) - INC BC - EX AF,AF' - LD A,(BC) - LD B,A - EX AF,AF' - LD C,A -L7091: PUSH HL - PUSH DE - EX DE,HL - LD E,C - LD D,B - CALL L5E99 - POP DE - POP HL - LD A,005H -L709D: INC DE - INC DE - INC DE - INC DE - INC DE - JR L706F ; (-035H) - -L70A4: CP 022H - JR NZ,L70D7 ; (+02fH) - INC HL - PUSH HL - CALL L74D0 - EX (SP),HL - PUSH HL - LD HL,(L107A) - PUSH BC - LD BC,(STRST) - OR A - SBC HL,BC - POP BC - EX DE,HL - LD (HL),B - INC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - INC HL - INC HL - POP DE - PUSH HL - LD HL,(L107A) - CALL L74DC - LD (L107A),HL - POP DE - POP HL - LD A,003H - LD (L84CE),A - RET - -L70D7: CP 028H - JR NZ,L70E2 ; (+007H) - INC HL - CALL L6E9C - JP L5E82 - -L70E2: OR A - JP P,L76F5 - CP 0E7H - INC HL - JR NZ,L70F0 ; (+005H) - LD A,0A8H - PUSH AF - JR L7125 ; (+035H) - -L70F0: CP 0FFH - JP NZ,L4AEC - LD A,(HL) - INC HL - CP 0A0H - JP Z,L71A5 - CP 0C8H - JP NC,L4AEC - CP 0BAH - JR NC,L7155 ; (+050H) - PUSH AF - CP 0B3H - JR NC,L7146 ; (+03cH) - LD B,003H - CP 0AAH - JR Z,L7125 ; (+015H) - CP 0ABH - JR NC,L7125 ; (+011H) - LD B,005H - CP 088H - JR Z,L7140 ; (+026H) - CP 089H - JR NZ,L7125 ; (+007H) - CALL TEST1 - DB 040H - LD (081A8H),A -L7125: CALL L5E78 -L7128: PUSH BC - CALL L6E9C - CALL L5E82 - POP AF - CALL L7912 -L7133: POP AF - PUSH DE - PUSH HL - LD HL,0FFFBH - ADD HL,DE - CALL L7155 - POP HL - POP DE - RET - -L7140: CALL TEST1 - DB 028H - JR Z,L7128 ; (-01eH) -L7146: LD A,005H - LD (L84CE),A - PUSH HL - LD HL,L6112 - CALL L5E93 - POP HL - JR L7133 ; (-022H) - -L7155: PUSH HL - ADD A,A - LD L,A - LD H,000H - LD BC,L450A - ADD HL,BC - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - EX (SP),HL - RET - -L7164: EX DE,HL - LD HL,0FDF1H - ADD HL,SP - LD BC,(TMPEND) - OR A - SBC HL,BC - EX DE,HL - JR NC,L7186 ; (+013H) - XOR A - JR L7183 ; (+00dH) - -L7176: LD A,(L0054) - JR L7183 ; (+008H) - -L717B: LD A,(00055H) - JR L7183 ; (+003H) - -L7180: LD A,(L8485) -L7183: LD E,A - LD D,000H -L7186: LD A,005H - LD (L84CE),A - JP L5E99 - -L718E: LD DE,(08487H) - CALL L5E99 - INC HL - BIT 7,(HL) - DEC HL - RET Z - LD DE,L71A0 - JP L7985 - -L71A0: SUB C - NOP - NOP - NOP - NOP -L71A5: CALL L5E78 - LD B,000H -L71AA: PUSH BC - PUSH DE - CALL L6E55 - CALL L6E4E - POP DE - POP BC - PUSH AF - INC B - CALL TEST1 - DB 02CH - JR Z,L71AA ; (-012H) - CALL L5E82 - LD A,B - EXX - LD B,A - LD HL,(L107A) - CALL ADDHLA - LD D,H - LD E,L - CALL L74E8 -L71CD: DEC HL - POP AF - LD (HL),A - DJNZ L71CD ; (-005H) - EXX - LD A,B - EXX - LD B,A -L71D6: LD (TMPEND),DE - LD DE,(STRST) - OR A - SBC HL,DE - PUSH HL - LD A,B - EXX - EX DE,HL - LD (HL),A - INC HL - POP BC - LD (HL),C - INC HL - LD (HL),B - LD BC,L0003 - ADD HL,BC -L71EF: EX DE,HL - LD A,003H - LD (L84CE),A - RET - -L71F6: PUSH HL - CALL L60B7 - CALL L69E0 - RST 018H - DB 017H -L71FF: LD A,B - OR A - JR Z,L7213 ; (+010H) - LD HL,(L107A) - PUSH HL - PUSH BC - CALL L74DC - POP BC - EX DE,HL - POP HL - EXX - POP DE - EXX - JR L71D6 ; (-03dH) - -L7213: POP HL - CALL L7967 - JR L71EF ; (-02aH) - -L7219: PUSH HL - CALL L722A - LD B,A - LD C,A - OR A - LD A,020H - PUSH DE - CALL NZ,?SETDE - POP DE - LD B,C - JR L71FF ; (-02bH) - -L722A: CALL L60B7 - LD DE,L11A4 - LD A,H - OR A - JP NZ,04AF2H - LD A,L - RET - -L7237: PUSH HL - CALL L6028 - LD A,(DE) - CP 020H - JR NZ,L7241 ; (+001H) - INC DE -L7241: RST 018H - DB 017H - JR L71FF ; (-046H) - -L7245: CALL L5E78 - CALL L5882 - LD B,A - CALL L5E7F - LD A,B - PUSH HL - PUSH DE - RST 018H - DB 029H - LD DE,0FFFFH - JR C,L7261 ; (+008H) - INC HL - BIT 7,(HL) - JR NZ,L7261 ; (+003H) - LD DE,L0000 -L7261: POP HL - CALL L5E99 - LD A,005H - LD (L84CE),A - INC HL - INC HL - INC HL - INC HL - INC HL - EX DE,HL - POP HL - RET - -L7272: PUSH HL - CALL L6E7E - OR A - JR Z,L727A ; (+001H) - LD A,(DE) -L727A: JR L7280 ; (+004H) - -L727C: PUSH HL - CALL L6E7E -L7280: POP HL - JP L7183 - -L7284: PUSH HL - CALL L6E7E - LD HL,(L107A) - PUSH HL - CALL L74DC - LD (HL),000H - POP DE - POP HL - JP L5EDC - -L7296: CALL L7312 - CALL L5E82 - CALL L730B - EX DE,HL - LD A,(HL) - CP C - JR NC,L72A5 ; (+001H) - LD C,A -L72A5: LD (HL),C - LD BC,00005H -L72A9: LD A,003H - ADD HL,BC - EX DE,HL - LD (L84CE),A - JP HLFTCH - -L72B3: CALL L7312 - CALL L5E82 - CALL L730B - EX DE,HL - LD A,(HL) - SUB C - JR NC,L72C3 ; (+002H) - XOR A - LD C,(HL) -L72C3: LD (HL),C - INC HL - ADD A,(HL) - LD (HL),A - INC HL - JR NC,L72CB ; (+001H) - INC (HL) -L72CB: LD BC,L0003 - JR L72A9 ; (-027H) - -L72D0: CALL L7312 - CALL L730B - OR A - JP Z,04AF2H - PUSH AF - CALL TEST1 - DB 029H - LD A,0FFH - JR Z,L72F7 ; (+014H) - CALL L5E70 - PUSH DE - EX DE,HL - LD BC,00005H - ADD HL,BC - EX DE,HL - CALL L6E55 - CALL L5E82 - CALL L6E4E - POP DE -L72F7: POP BC - LD C,A - EX DE,HL - LD A,(HL) - SUB B - JR C,L7307 ; (+009H) - INC A - CP C - JR NC,L7303 ; (+001H) - LD C,A -L7303: LD A,B - DEC A - JR L72C3 ; (-044H) - -L7307: XOR A - LD C,A - JR L72C3 ; (-048H) - -L730B: LD A,B - OR A - JP NZ,04AF2H - LD A,C - RET - -L7312: CALL L5E78 - PUSH DE - CALL L6E9C - CALL L5E73 - CALL L7916 - CALL L6E55 - LD C,E - LD B,D - POP DE - RET - -L7326: PUSH HL - PUSH DE - LD HL,(L107A) - PUSH HL - LD A,030H - LD B,006H - CALL ?SETHL - RST 018H - DB 025H - POP HL - OR A - JR Z,L733E ; (+005H) - INC (HL) - INC HL - INC (HL) - INC (HL) - DEC HL -L733E: EX DE,HL - LD BC,08CA0H - CALL L73B5 - LD BC,L0E10 - CALL L73B5 - CP 03AH - JR C,L7359 ; (+00aH) - SUB 00AH - DEC DE - LD (DE),A - DEC DE - LD A,(DE) - INC A - LD (DE),A - INC DE - INC DE -L7359: DEC DE - DEC DE - LD A,(DE) - INC DE - LD B,A - LD A,(DE) - INC DE - LD C,A - LD A,B - CP 032H - JR NZ,L7377 ; (+011H) - LD A,C - CP 034H - JR NZ,L7377 ; (+00cH) - LD HL,(L107A) - LD A,030H - LD B,006H - CALL ?SETHL - JR L738D ; (+016H) - -L7377: LD BC,L0258 - CALL L73B5 - LD BC,0003CH - CALL L73B5 - LD BC,0000AH - CALL L73B5 - LD A,030H - ADD A,L - LD (DE),A -L738D: LD HL,(L107A) - LD DE,L0006 - EX DE,HL - ADD HL,DE - LD (L107A),HL - EX DE,HL - LD DE,(STRST) - OR A - SBC HL,DE - EX DE,HL - POP HL - LD (HL),006H - INC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - INC HL - INC HL - EX DE,HL - POP HL - LD A,003H - LD (L84CE),A - JP HLFTCH - -L73B5: OR A - SBC HL,BC - JR C,L73BF ; (+005H) - LD A,(DE) - INC A - LD (DE),A - JR L73B5 ; (-00aH) - -L73BF: ADD HL,BC - INC DE - RET - -L73C2: CALL TESTX - DB QDPC - CALL L6E6F - LD A,B - CP 006H - JP NZ,04AF2H - PUSH HL - PUSH DE - LD HL,L0000 - CALL L7403 - CP 018H - JP NC,04AF2H - CP 00CH - LD A,000H - JR C,L73EB ; (+009H) - PUSH DE - LD DE,L000C - OR A - SBC HL,DE - POP DE - INC A -L73EB: PUSH AF - CALL L7403 - CP 03CH - JP NC,04AF2H - CALL L7403 - CP 03CH - JP NC,04AF2H - POP AF - EX DE,HL - RST 018H - DB 026H - POP DE - POP HL - RET - -L7403: PUSH DE - LD D,H - LD E,L - ADD HL,HL - ADD HL,HL - ADD HL,DE - LD D,H - LD E,L - ADD HL,HL - ADD HL,DE - ADD HL,HL - ADD HL,HL - POP DE - LD A,(DE) - INC DE - SUB 030H - JP C,04AF2H - CP 00AH - JP NC,04AF2H - PUSH BC - LD C,A - ADD A,A - ADD A,A - ADD A,C - ADD A,A - LD C,A - LD A,(DE) - INC DE - SUB 030H - JP C,04AF2H -L742A: CP 00AH - JP NC,04AF2H - ADD A,C - LD C,A - LD B,000H - ADD HL,BC - POP BC - RET - -L7436: LD DE,(VARED) - LD (TMPEND),DE - LD DE,(INTFAC) -L7442: PUSH DE - CALL L7495 -L7446: LD A,(HL) - CP 028H - JP Z,L74FB - PUSH HL - CALL L77B6 - JR NC,L7458 ; (+006H) - LD A,C - LD C,L - LD B,H - POP HL - POP DE - RET - -L7458: LD A,(DE) - ADD A,C - ADD A,002H - PUSH BC - EX DE,HL - LD HL,(L107A) - PUSH HL - OR A - SBC HL,DE - INC HL - LD C,L - LD B,H - POP HL - PUSH DE - EX DE,HL - LD L,A - LD H,000H - ADD HL,DE - EX DE,HL - CALL L74E8 - LDDR - LD E,A - LD D,000H - RST 018H - DB 01AH - POP HL - POP BC - LD DE,L11A4 - LD (HL),C - INC HL - SCF - SBC A,C - LD B,A -L7484: LD A,(DE) - LD (HL),A - INC DE - INC HL - DJNZ L7484 ; (-006H) - PUSH HL - LD B,C - CALL ?CLRHL - LD (HL),A - LD A,C - POP BC - POP HL - POP DE - RET - -L7495: CALL HLFTCH - SUB 041H - CP 01AH - JP NC,L4AEC - LD DE,L11A4 - LD B,000H -L74A4: INC DE - LD A,(HL) - CALL L5ECB - JR C,L74B6 ; (+00bH) - LD (DE),A - INC B - LD A,B - CP 003H - JR C,L74B3 ; (+001H) - DEC B -L74B3: INC HL - JR L74A4 ; (-012H) - -L74B6: LD DE,L11A4 - EX DE,HL - LD (HL),B - EX DE,HL - LD C,005H - CP 024H - RET NZ - LD C,003H - INC HL - RET - -L74C5: LD HL,0FFFBH - EX DE,HL - ADD HL,DE - EX DE,HL - ADD HL,DE - LD A,B - JP L7912 - -L74D0: LD B,0FFH -L74D2: INC B - LD A,(HL) - OR A - RET Z - INC HL - CP 022H - RET Z - JR L74D2 ; (-00aH) - -L74DC: LD A,B - OR A - RET Z - CALL LDHLDE - EX DE,HL - CALL L74E8 - EX DE,HL - RET - -L74E8: PUSH HL - LD HL,0FE00H - ADD HL,SP - SBC HL,DE - POP HL - RET NC - JP L4B2C - -L74F4: LD DE,(INTFAC) - PUSH DE - JR L7503 ; (+008H) - -L74FB: XOR A - LD (L76F4),A - INC HL - LD (L76F2),HL -L7503: LD B,000H - EXX - POP HL - PUSH HL - PUSH HL - LD HL,(L107A) - LD DE,L11A4 - PUSH HL - LD A,(DE) - LD (HL),A - INC DE - INC HL - LD B,A - CALL L74DC - POP DE - LD (L107A),HL - LD HL,(L1076) - EX DE,HL - OR A - SBC HL,DE - EX (SP),HL - PUSH HL - EXX -L7526: POP DE - PUSH DE - PUSH BC - LD BC,(076F2H) - LD A,(L76F4) - PUSH BC - PUSH AF - LD BC,(0849CH) - PUSH BC - CALL L6E55 - BIT 7,D - JP NZ,04AF2H - EX AF,AF' - POP BC - LD (0849CH),BC - POP AF - LD (L76F4),A - POP BC - LD (076F2H),BC - EX AF,AF' - INC HL - CP 029H - JR Z,L756C ; (+018H) - CP 02CH - JP NZ,L4AEC - POP BC - INC B - LD A,B - CP 004H - JP NC,04AF2H - EXX - POP HL - POP DE - EXX - PUSH DE - EXX - PUSH DE - PUSH HL - EXX - JR L7526 ; (-046H) - -L756C: POP BC - EXX - POP HL - POP DE - EXX - INC B - PUSH DE - PUSH HL - EXX - LD HL,(L1076) - ADD HL,DE - LD B,(HL) - INC B - LD DE,L11A4 - CALL LDDEHL - EXX - SET 7,C - CALL L77B6 - RES 7,C - JR NC,L75E1 ; (+056H) - LD A,B - CP (HL) - JP NZ,04AFEH - INC HL - EX DE,HL - POP HL - LD (L849C),HL - EXX - LD HL,L0000 - EXX - EX DE,HL -L759C: LD E,(HL) - INC HL - LD D,(HL) - INC HL - EX (SP),HL - PUSH DE - EXX - POP DE - CALL L76C8 - EXX - PUSH HL - OR A - SBC HL,DE - JP NC,04AF2H - EXX - POP DE - CALL L76C4 - EXX - POP HL - DJNZ L759C ; (-01cH) - PUSH HL - EXX - LD A,C - LD D,B - BIT 6,A - JR NZ,L75D4 ; (+014H) - AND 00FH - LD E,A - PUSH AF - CALL L76C8 - PUSH HL - EXX - POP BC - POP AF - POP HL - ADD HL,BC - LD C,L - LD B,H -L75CF: LD HL,(L849C) - POP DE - RET - -L75D4: LD E,(HL) - INC HL - LD D,(HL) - POP HL - LD C,L - LD B,H - LD (HL),E - INC HL - LD (HL),D - AND 00FH - JR L75CF ; (-012H) - -L75E1: EXX - LD A,(L76F4) - OR A - JP Z,04AF2H - POP HL - LD (L849C),HL - EXX - LD DE,(TMPEND) - LD L,B - LD H,000H - ADD HL,HL - ADD HL,DE - EX DE,HL - INC DE - CALL L74E8 - LD (HL),B - INC HL - EXX - LD HL,00001H - EXX -L7603: POP DE - LD A,(L76F4) - OR A - JR NZ,L7616 ; (+00cH) - PUSH HL - EX DE,HL - LD DE,0000AH - SCF - SBC HL,DE - JP NC,04AF2H - POP HL -L7616: INC DE - LD (HL),E - INC HL - LD (HL),D - INC HL - PUSH DE - EXX - POP DE - CALL L76C8 - EXX - DJNZ L7603 ; (-021H) - DB 059H - LD D,000H - PUSH BC - PUSH DE - EXX - POP DE - CALL L76C8 - PUSH HL - EXX - POP BC - PUSH BC - EX DE,HL - LD HL,(L107A) - LD L,(HL) - LD H,000H - ADD HL,HL - LD A,(L11A4) - ADD A,005H - ADD A,L - LD L,A - LD A,000H - ADC A,H - LD H,A - JR C,L764C ; (+005H) - ADD HL,BC - JR C,L764C ; (+002H) - PUSH HL - ADD HL,DE -L764C: JP C,L4B2C - EX DE,HL - CALL L74E8 - PUSH HL - EXX - POP HL - LD BC,(STRST) - DEC BC - OR A - SBC HL,BC - PUSH HL - EXX - POP BC - LDDR - POP DE - RST 018H - DB 01AH - POP BC - PUSH DE - EXX - POP DE - LD H,B - LD L,C - POP BC - LD A,C - OR 080H - LD (HL),A - INC HL - DEC DE - LD (HL),E - INC HL - LD (HL),D - INC HL - LD DE,L11A4 - LD A,(DE) - INC A - LD B,A - CALL LDHLDE - LD DE,(TMPEND) - LD A,(DE) - LD (HL),A - INC HL - INC DE - ADD A,A - LD B,A - CALL LDHLDE - PUSH HL - EXX - POP HL -L7690: XOR A - LD (HL),A - INC HL - DEC BC - LD A,B - OR C - JR NZ,L7690 ; (-008H) - LD (HL),A - EXX - POP DE - LD A,(L76F4) - OR A - JR Z,L76A5 ; (+004H) - LD HL,(L849C) - RET - -L76A5: LD HL,(L76F2) - PUSH DE - JP L7503 - -L76AC: LD A,0FFH - LD (L76F4),A -L76B1: CALL L7495 - LD A,(HL) - CALL L5E7B - CALL L74F4 - CALL HLFTCH - CP 02CH - RET NZ - INC HL - JR L76B1 ; (-013H) - -L76C4: ADD HL,DE - RET NC - JR L76EF ; (+027H) - -L76C8: PUSH BC - EX DE,HL - LD C,L - LD A,H - LD HL,L0000 - CALL L76D8 - LD A,C - CALL L76D8 - POP BC - RET - -L76D8: OR A - JR Z,L76E9 ; (+00eH) - LD B,008H -L76DD: ADD HL,HL - JR C,L76EF ; (+00fH) - RLCA - JR NC,L76E6 ; (+003H) - ADD HL,DE - JR C,L76EF ; (+009H) -L76E6: DJNZ L76DD ; (-00bH) - RET - -L76E9: LD A,H - LD H,L - LD L,000H - OR A - RET Z -L76EF: JP 04AFBH - -L76F2: NOP - NOP -L76F4: NOP -L76F5: SUB 041H - CP 01AH - JP NC,L4AEC - LD BC,(07928H) - LD A,B - OR C - JR NZ,L7716 ; (+012H) - CALL L7442 -L7707: PUSH DE - PUSH HL - LD L,C - LD H,B - LD B,A - LD C,A - CALL LDDEHL - POP HL - LD A,C - POP DE - JP L709D - -L7716: PUSH DE - CALL L7495 - PUSH HL - INC B - LD DE,L11A4 - LD HL,(L107A) - CALL L74DC - LD B,000H - LD HL,(L7928) - CALL HLFTCH - CP QDPC - JR Z,L7760 ; (+02fH) - CP 028H - JR NZ,L775D ; (+028H) -L7735: INC HL - INC B - PUSH BC - CALL L7495 - LD A,C - POP DE - CP E - LD C,E - JR NZ,L7752 ; (+011H) - PUSH DE - LD C,B - INC C - PUSH HL - LD HL,(L107A) - LD DE,L11A4 - CALL L7953 - POP HL - POP BC - JR Z,L7776 ; (+024H) -L7752: CALL HLFTCH - CP 029H - JR Z,L7760 ; (+007H) - CP 02CH - JR Z,L7735 ; (-028H) -L775D: JP L4AEC - -L7760: LD HL,(L107A) - LD DE,L11A4 - LD A,(HL) - LD (DE),A - LD B,A -L7769: INC HL - INC DE - LD A,(HL) - LD (DE),A - DJNZ L7769 ; (-006H) - POP HL - POP DE - CALL L77B2 - JR L7707 ; (-06fH) - -L7776: LD HL,(L792A) - CALL L5E78 - DEC B - JR Z,L7797 ; (+018H) - DEC HL -L7780: PUSH BC -L7781: CALL L51A2 - CALL L413E - JP Z,L4AEC - CP 029H - JP Z,L4AEC - CP 02CH - JR NZ,L7781 ; (-012H) - POP BC - DJNZ L7780 ; (-016H) - INC HL -L7797: EX DE,HL - POP HL - EX (SP),HL - EX DE,HL - LD BC,(07928H) - PUSH BC - LD BC,L0000 - LD (07928H),BC - CALL L6E9C - POP HL - LD (L7928),HL - POP HL - JP HLFTCH - -L77B2: PUSH DE - JP L7446 - -L77B6: LD HL,(L1074) -L77B9: LD DE,L11A4 - LD A,(HL) - OR A - RET Z - CP 040H - JR NC,L77EA ; (+027H) - CP C - JR NZ,L77DF ; (+019H) - INC HL - LD A,(DE) - CP (HL) - JR NZ,L77DD ; (+012H) - LD B,A -L77CC: INC DE - INC HL - LD A,(DE) - CP (HL) - JR NZ,L77D7 ; (+005H) - DJNZ L77CC ; (-008H) - INC HL - SCF - RET - -L77D7: INC HL - DJNZ L77D7 ; (-003H) - LD A,C - JR L77E4 ; (+007H) - -L77DD: LD A,C - DEC HL -L77DF: AND 00FH - INC HL - ADD A,(HL) - INC HL -L77E4: LD E,A - LD D,000H - ADD HL,DE - JR L77B9 ; (-031H) - -L77EA: CP C - JR Z,L7801 ; (+014H) - INC HL -L77EE: LD E,(HL) - INC HL - LD D,(HL) - DEC HL - ADD HL,DE - JR L77B9 ; (-03cH) - -L77F5: LD A,C - SUB B - CPL - LD C,A - LD B,0FFH - ADD HL,BC - POP BC -L77FD: DEC HL - DEC HL - JR L77EE ; (-013H) - -L7801: LD A,(HL) - EXX - LD C,A - LD B,000H - EXX - INC HL - PUSH DE - LD E,(HL) - INC HL - LD D,(HL) - INC HL - EX DE,HL - ADD HL,DE - EX DE,HL - POP DE - LD A,(DE) - CP (HL) - JR NZ,L77FD ; (-018H) - PUSH BC - LD B,A - LD C,A -L7818: INC HL - INC DE - LD A,(DE) - CP (HL) - JR NZ,L77F5 ; (-029H) - DJNZ L7818 ; (-008H) - INC HL - POP BC - SCF - RET - -L7824: CALL L7495 - SET 6,C - PUSH HL - CALL L77B6 - JP C,04AFEH - LD (HL),C - EX (SP),HL - PUSH HL - DEC HL -L7834: CALL L51A2 - OR A - JR Z,L783E ; (+004H) - CP 03AH - JR NZ,L7834 ; (-00aH) -L783E: POP DE - PUSH HL - INC HL - SBC HL,DE - LD A,(L11A4) - ADD A,004H - LD C,A - LD B,000H - LD A,L - ADD HL,BC - LD B,A - PUSH HL - EXX - POP BC - PUSH BC - PUSH HL - PUSH DE - PUSH BC - LD HL,L0000 - ADD HL,SP - LD DE,(TMPEND) - DEC H - OR A - SBC HL,DE - LD A,00CH - JP C,L4B2E - POP BC - POP DE - POP HL - LD HL,(L107A) - PUSH HL - ADD HL,BC - EX (SP),HL - PUSH HL - LD DE,(STRST) - OR A - SBC HL,DE - LD C,L - LD B,H - POP HL - POP DE - LDDR - POP DE - RST 018H - DB 01AH - DEC DE - POP HL - EX (SP),HL - INC HL - LD (HL),E - INC HL - LD (HL),D - INC HL - LD DE,L11A4 - LD A,(DE) - LD (HL),A - LD B,A -L788E: INC DE - INC HL - LD A,(DE) - LD (HL),A - DJNZ L788E ; (-006H) - INC HL - PUSH HL - EXX - POP HL - CALL LDHLDE - LD (HL),000H - POP HL - RET - -L789F: PUSH DE - CALL L7495 - POP IX - PUSH BC - SET 6,C - LD DE,(0792AH) - LD (L792A),HL - PUSH DE - CALL L77B6 - JP NC,04B0AH - LD DE,(07928H) - LD (L7928),HL - PUSH DE - PUSH IX - DEC HL -L78C1: CALL L51A2 - CALL L413E - JP Z,L4AEC - CP QDPC - JR NZ,L78C1 ; (-00dH) - INC HL - POP DE - PUSH DE - CALL L6E9C - POP DE - LD HL,(L792A) - POP BC - LD (07928H),BC - POP BC - LD (0792AH),BC - EX DE,HL - POP BC - LD A,C - CALL L7912 - LD BC,00005H - ADD HL,BC - EX DE,HL - CALL HLFTCH - CP 028H - RET NZ - PUSH DE - LD B,001H -L78F6: PUSH BC - CALL L51A2 - POP BC - CALL L4141 - JP Z,L4AEC - CP 028H - JR NZ,L7906 ; (+001H) - INC B -L7906: CP 029H - JR NZ,L78F6 ; (-014H) - DJNZ L78F6 ; (-016H) - INC HL - CALL HLFTCH - POP DE - RET - -L7912: CP 003H - JR NZ,L791F ; (+009H) -L7916: LD A,(L84CE) - CP 003H - RET Z - JP 04AF5H - -L791F: LD A,(L84CE) - CP 003H - RET NZ - JP 04AF5H - -L7928: NOP - NOP -L792A: NOP - NOP -L792C: PUSH HL - CALL L60B7 - LD A,H - OR A - JP NZ,04AF2H - LD A,L - CP 008H - JP NC,04AF2H - RST 018H - DB 012H - POP HL - JR C,L794E ; (+00eH) - JR Z,L794E ; (+00cH) - LD DE,0FFFFH -L7945: CALL L5E99 - LD A,005H - LD (L84CE),A - RET - -L794E: LD E,A - LD D,000H - JR L7945 ; (-00eH) - -L7953: LD A,(DE) - CP (HL) - RET NZ - PUSH BC - PUSH DE - PUSH HL - LD B,C -L795A: LD A,(DE) - CP (HL) - JR NZ,L7963 ; (+005H) - INC DE - INC HL - DJNZ L795A ; (-008H) - XOR A -L7963: POP HL - POP DE - POP BC - RET - -L7967: PUSH HL - LD B,005H - CALL ?CLRHL - POP HL - RET - -L796F: CALL L791F -L7972: LD A,(HL) - OR A - RET Z - INC HL - LD A,(HL) - XOR 080H - LD (HL),A - DEC HL - RET - -L797C: CALL L791F - LD C,A - LD A,080H - JP L798F - -L7985: LD A,(L84CE) - CP 003H - JP Z,L79D9 - LD C,A - XOR A -L798F: LD (L7D89),HL - PUSH DE - PUSH HL - LD (07D8CH),SP - INC HL - INC DE - LD B,(HL) - XOR (HL) - EX DE,HL - XOR (HL) - DEC HL - DEC DE - EX DE,HL - RLCA - LD A,B - LD (L7D8B),A - JP C,L7A9A - XOR A - CP (HL) - JP Z,L79CE - LD A,(DE) - OR A - JR Z,L79B6 ; (+004H) - SUB (HL) - JP L7ADD - -L79B6: LD SP,(07D8CH) - POP HL - POP DE - EI - LD A,(HL) - OR A - JP Z,L7E86 - LD A,(L7D8B) - AND 080H - INC HL - RES 7,(HL) - OR (HL) - LD (HL),A - DEC HL - RET - -L79CE: LD B,000H - LD A,005H - LD C,A - EX DE,HL - LDIR - JP L79B6 - -L79D9: LD B,(HL) - LD A,(DE) - ADD A,B - JP C,04AF8H - LD C,A - PUSH DE - PUSH HL - PUSH DE - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(L1076) - ADD HL,DE - EX DE,HL - LD HL,(L107A) - CALL L74DC - EX (SP),HL - LD B,(HL) - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(L1076) - ADD HL,DE - EX DE,HL - POP HL - CALL L74DC - LD A,C - LD DE,(TMPEND) - LD BC,(STRST) - EX DE,HL - OR A - SBC HL,BC - EX DE,HL - LD (L107A),HL - POP HL - LD (HL),A - INC HL - LD (HL),E - INC HL - LD (HL),D - DEC HL - DEC HL - POP DE - RET - -L7A1C: LD A,(L84CE) - CP 003H - JR NZ,L7A57 ; (+034H) - PUSH DE - PUSH HL - LD A,(DE) - OR (HL) - JR Z,L7A54 ; (+02bH) - LD A,(DE) - CP (HL) - JR C,L7A2E ; (+001H) - LD A,(HL) -L7A2E: OR A - JR Z,L7A4E ; (+01dH) - INC HL - LD C,(HL) - INC HL - LD B,(HL) - EX DE,HL - INC HL - LD E,(HL) - INC HL - LD D,(HL) - LD HL,(L1076) - EX DE,HL - ADD HL,DE - EX DE,HL - ADD HL,BC - EX DE,HL - LD B,A - OR A - JR Z,L7A54 ; (+00eH) -L7A46: LD A,(DE) - CP (HL) - JR NZ,L7A54 ; (+00aH) - INC DE - INC HL - DJNZ L7A46 ; (-008H) -L7A4E: POP DE - POP HL - LD A,(DE) - CP (HL) - EX DE,HL - RET - -L7A54: POP HL - POP DE - RET - -L7A57: INC DE - INC HL - LD A,(DE) - DEC DE - XOR (HL) - RLCA - JR NC,L7A63 ; (+004H) - LD A,(HL) - DEC HL - RLCA - RET - -L7A63: LD A,(HL) - DEC HL - RLCA - JR NC,L7A6E ; (+006H) - CALL L7A6E - RET Z - CCF - RET - -L7A6E: PUSH DE - PUSH HL - EX DE,HL - LD A,(DE) - CP (HL) - JR NZ,L7A8F ; (+01aH) - INC DE - INC HL - LD A,(HL) - OR 080H - LD B,A - LD A,(DE) - OR 080H - CP B - JR NZ,L7A8F ; (+00eH) - LD A,(L84CE) - LD B,A - DEC B - DEC B -L7A87: INC DE - INC HL - LD A,(DE) - CP (HL) - JR NZ,L7A8F ; (+002H) - DJNZ L7A87 ; (-008H) -L7A8F: POP HL - POP DE - RET - -L7A92: POP HL - PUSH HL - CALL L7967 - JP L79B6 - -L7A9A: CALL L7A6E - JR Z,L7A92 ; (-00dH) - JR NC,L7AAA ; (+009H) - LD A,(L7D8B) - XOR 080H - LD (L7D8B),A - SCF -L7AAA: EX AF,AF' - LD A,(HL) - OR A - JP Z,L79CE - LD A,(DE) - OR A - JP Z,L79B6 - SUB (HL) - JR C,L7ABF ; (+007H) - CP 020H - JP NC,L79CE - JR L7AC6 ; (+007H) - -L7ABF: NEG - CP 020H - JP NC,L79B6 -L7AC6: EX AF,AF' - JR C,L7ACA ; (+001H) - EX DE,HL -L7ACA: EX AF,AF' - JP L7B64 - -L7ACE: LD SP,(07D8CH) - EI - POP HL - POP DE - LD A,(07D93H) - OR A - JP Z,04AEFH - RET - -L7ADD: JR NC,L7AE9 ; (+00aH) - NEG - CP 020H - JP NC,L79B6 - EX DE,HL - JR L7AEE ; (+005H) - -L7AE9: CP 020H - JP NC,L79CE -L7AEE: CALL L7B24 - LD A,H - EXX - ADC A,H - EXX - LD H,A - LD A,L - EXX - ADC A,L - EXX - LD L,A - LD A,D - EXX - ADC A,D - EXX - LD D,A - LD A,E - EXX - ADC A,E - EXX - JR NC,L7B11 ; (+00bH) - RRA - RR D - RR L - RR H - INC C - JP Z,L7ACE -L7B11: LD E,A - LD A,C - EXX - LD BC,00005H - LD HL,(L7D89) - LD (HL),A - ADD HL,BC - DI - LD SP,HL - EXX - PUSH HL - PUSH DE - JP L79B6 - -L7B24: DI - LD (07D8EH),SP - EX AF,AF' - INC HL - LD SP,HL - EXX - POP DE - SET 7,E - POP HL - OR A -L7B32: EX AF,AF' - CP 008H - JR C,L7B43 ; (+00cH) - SUB 008H - EX AF,AF' - RL H - LD H,L - LD L,D - LD D,E - LD E,000H - JR L7B32 ; (-011H) - -L7B43: OR A - JR Z,L7B54 ; (+00eH) -L7B46: EX AF,AF' - OR A - RR E - RR D - RR L - RR H - EX AF,AF' - DEC A - JR NZ,L7B46 ; (-00eH) -L7B54: EXX - EX DE,HL - LD C,(HL) - INC HL - LD SP,HL - POP DE - SET 7,E - POP HL - EX AF,AF' - LD SP,(07D8EH) - EI - RET - -L7B64: CP 020H - JP NC,L79B6 - CALL L7B24 - LD A,H - EXX - SBC A,H - EXX - LD H,A - LD A,L - EXX - SBC A,L - EXX - LD L,A - LD A,D - EXX - SBC A,D - EXX - LD D,A - LD A,E - EXX - SBC A,E - EXX -L7B7F: OR A - JR Z,L7B98 ; (+016H) -L7B82: BIT 7,A - JR NZ,L7B94 ; (+00eH) - RL H - RL L - RL D - RLA - DEC C - JP NZ,L7B82 - JP L7A92 - -L7B94: LD E,A - JP L7B11 - -L7B98: LD A,C - SUB 008H - LD C,A - LD A,D - LD D,L - LD L,H - LD H,000H - JR Z,L7BA5 ; (+002H) - JR NC,L7B7F ; (-026H) -L7BA5: JP L7A92 - -L7BA8: LD C,A - INC HL - INC DE - LD A,(DE) - XOR (HL) - LD (L7D8B),A - DEC HL - DEC DE - RET - -L7BB3: CALL L791F - CALL L7BA8 - PUSH DE - PUSH HL - LD (07D8CH),SP - LD A,(HL) - OR A - JP Z,L7A92 - LD A,(DE) - OR A - JP Z,L7A92 - INC DE - PUSH DE - POP IX - ADD A,(HL) - LD E,A - LD A,000H - ADC A,A - LD D,A - LD (07D91H),DE - INC HL - XOR A - LD (L7D90),A - LD D,(HL) - SET 7,D - INC HL - LD E,(HL) - INC HL - PUSH HL - LD H,A - LD L,A - EXX - POP HL - LD D,(HL) - INC HL - LD E,(HL) - LD B,A - LD C,A - LD H,A - LD L,A - EXX - LD A,(IX+000H) - OR 080H - LD C,004H -L7BF6: LD B,008H - OR A - JP Z,L7C8B -L7BFC: RLCA - JR NC,L7C11 ; (+012H) - EX AF,AF' - EXX - LD A,C - ADD A,B - LD C,A - ADC HL,DE - EXX - ADC HL,DE - JR NC,L7C10 ; (+005H) - LD A,001H - LD (L7D90),A -L7C10: EX AF,AF' -L7C11: SRL D - RR E - EXX - RR D - RR E - RR B - EXX - DJNZ L7BFC ; (-023H) -L7C1F: INC IX - LD A,(IX+000H) - DEC C - JR NZ,L7BF6 ; (-031H) - EXX - LD A,(L7D90) - OR A - JR Z,L7C44 ; (+016H) - LD DE,(07D91H) - INC DE - LD (07D91H),DE - EXX - SCF - RR H - RR L - EXX - RR H - RR L - RR C -L7C44: BIT 7,C - JR Z,L7C62 ; (+01aH) - LD DE,00001H - ADD HL,DE - EXX - LD DE,L0000 - ADC HL,DE - EXX - JR NC,L7C62 ; (+00dH) - LD DE,(07D91H) - INC DE - LD (07D91H),DE - EXX - LD H,080H - EXX -L7C62: POP IX - PUSH IX - LD (IX+004H),L - LD (IX+003H),H - EXX - LD (IX+002H),L - LD (IX+001H),H - LD HL,(07D91H) - OR A - LD DE,L0081 - SBC HL,DE - LD A,H - ADD A,000H - JP M,L7C97 - JP NZ,L7ACE - LD (IX+000H),L - JP L79B6 - -L7C8B: LD A,E - EXX - LD B,E - LD E,D - LD D,A - EXX - LD E,D - LD D,000H - JP L7C1F - -L7C97: LD SP,(07D8CH) - JP L7A92 - -L7C9E: CALL L791F - CALL L7BA8 - PUSH DE - PUSH HL - LD (07D8CH),SP - LD A,(DE) - OR A - JP Z,04AEFH - EX AF,AF' - LD A,(HL) - OR A - JP Z,L7A92 - EXX - ADD A,081H - LD B,A - LD A,000H - ADC A,A - EX AF,AF' - LD C,A - LD A,B - SUB C - LD C,A - EX AF,AF' - LD B,A - EX AF,AF' - LD A,B - SBC A,000H - JP C,L7C97 - JP NZ,L7ACE - LD A,C - PUSH AF - EXX - INC DE - INC HL - LD B,(HL) - SET 7,B - INC HL - LD C,(HL) - INC HL - PUSH HL - EX DE,HL - LD D,(HL) - SET 7,D - INC HL - LD E,(HL) - INC HL - PUSH HL - LD H,B - LD L,C - EXX - POP HL - LD D,(HL) - INC HL - LD E,(HL) - POP HL - LD A,(HL) - INC HL - LD L,(HL) - LD H,A - EXX - LD C,005H -L7CF0: LD B,008H - XOR A -L7CF3: BIT 7,H - JR NZ,L7D07 ; (+010H) - OR A -L7CF8: RLA - EXX - ADD HL,HL - EXX - ADC HL,HL - DJNZ L7CF3 ; (-00dH) - PUSH AF - DEC C - JR NZ,L7CF0 ; (-014H) - JP L7D41 - -L7D07: OR A - EXX - SBC HL,DE - EXX - SBC HL,DE - CCF - JR C,L7CF8 ; (-019H) - EXX - ADD HL,DE - EXX - ADC HL,DE - OR A - RLA - EXX - ADD HL,HL - EXX - ADC HL,HL - DJNZ L7D26 ; (+007H) - PUSH AF - LD B,008H - DEC C - JP Z,L7D41 -L7D26: EXX - OR A - SBC HL,DE - EXX - SBC HL,DE - SCF - RLA - DJNZ L7D37 ; (+006H) - PUSH AF - LD B,008H - DEC C - JR Z,L7D41 ; (+00aH) -L7D37: EXX - ADD HL,HL - EXX - ADC HL,HL - JR C,L7D26 ; (-018H) - JP L7CF3 - -L7D41: POP AF - LD H,A - EXX - POP AF - LD E,A - POP AF - LD D,A - POP AF - LD C,A - POP AF - LD B,A - POP AF -L7D4D: BIT 7,B - JR NZ,L7D64 ; (+013H) - EXX - SLA H - EXX - RL E - RL D - RL C - RL B - DEC A - JP NZ,L7D4D - JP L7A92 - -L7D64: EXX - RL H - EXX - JR NC,L7D7B ; (+011H) - LD HL,00001H - ADD HL,DE - EX DE,HL - LD HL,L0000 - ADC HL,BC - LD B,H - LD C,L - JR NC,L7D7B ; (+003H) - LD B,080H - INC A -L7D7B: POP HL - PUSH HL - LD (HL),A - INC HL - LD (HL),B -L7D80: INC HL - LD (HL),C - INC HL - LD (HL),D - INC HL - LD (HL),E - JP L79B6 - -L7D89: NOP - NOP -L7D8B: NOP - NOP - NOP - NOP - NOP -L7D90: NOP - NOP - NOP - NOP -L7D94: INC HL - BIT 7,(HL) - DEC HL - RET - -L7D99: INC (HL) - RET NZ - JP 04AEFH - -L7D9E: LD A,(HL) - OR A - RET Z - DEC (HL) - RET NZ - JP L7967 - -L7DA6: PUSH HL - INC HL - INC HL - INC HL - INC HL - INC HL - EX DE,HL - LD HL,(MEMMAX) - DEC HL - SBC HL,DE - JP C,04AFBH - POP HL - RET - -L7DB8: PUSH HL - LD (L8471),HL - CALL L7DA6 - EX DE,HL - LD (L8473),HL - CALL L7DA6 - EX DE,HL - LD (L8475),HL - CALL L7DA6 - LD (08477H),DE - POP HL - RET - -L7DD3: CALL L791F - EX DE,HL - LD A,(HL) - OR A - JP Z,L7E35 - EX DE,HL - LD A,(HL) - OR A - JP Z,L7967 - CALL L7D94 - JR Z,L7E0F ; (+028H) - CALL L7972 - EX DE,HL - PUSH DE - PUSH HL - LD DE,L84D7 - CALL L5E93 - LD HL,L84D7 - CALL L608D - LD A,(HL) - OR A - JP NZ,04AF2H - POP HL - PUSH HL - CALL L60B7 - BIT 0,L - POP DE - POP HL - JR Z,L7E0F ; (+006H) - CALL L7E0F - JP L7972 - -L7E0F: EX DE,HL - LD A,(HL) - OR A - JR Z,L7E35 ; (+021H) - CALL L7D94 - JR Z,L7E3B ; (+022H) - CALL L7972 - CALL L7E3B - PUSH DE - PUSH HL - LD DE,L84D7 - CALL L5E90 - LD HL,L84D7 - POP DE - CALL L7C9E - PUSH DE - CALL L5E93 - POP HL - POP DE - RET - -L7E35: PUSH DE - CALL L5E90 - POP HL - RET - -L7E3B: PUSH DE - LD DE,L84D7 - CALL L5E93 - POP HL - CALL L8320 - LD DE,L84D7 - CALL L7BB3 - JP L81FC - -L7E4F: CALL L791F - PUSH DE - PUSH HL - CALL L60B7 - LD A,L - CPL - LD E,A - LD A,H - CPL - LD D,A - JR L7E80 ; (+021H) - -L7E5F: LD A,0A2H - LD BC,0B23EH - LD BC,0AA3EH - LD (L7E7B),A - INC A - LD (L7E7E),A - CALL L791F - PUSH DE - PUSH HL - CALL L60B7 - EX DE,HL - CALL L60B7 - LD A,H -L7E7B: AND D - LD D,A - LD A,L -L7E7E: AND E - LD E,A -L7E80: POP HL - CALL L5E99 - POP DE - RET - -L7E86: INC HL - RES 7,(HL) - DEC HL - RET - -L7E8B: CALL L7D94 - JP Z,L604F - CALL L7EB0 - CALL L604F - LD DE,L84D7 - CALL L7A1C - RET Z -L7E9E: LD DE,L6112 - JP L797C - -L7EA4: LD DE,L6112 - JP L7985 - -L7EAA: LD DE,L6112 - JP L7A1C - -L7EB0: PUSH HL - PUSH DE - LD DE,L84D7 - CALL L5E93 - POP DE - POP HL - RET - -L7EBB: CALL L604F - EX DE,HL - CALL L604F - EX DE,HL - CALL L7EB0 - CALL L7C9E - CALL L604F - CALL L7BB3 - PUSH DE - LD DE,L84D7 - CALL L797C - POP DE - JP L7972 - -L7EDA: CALL L604F - EX DE,HL - CALL L604F - EX DE,HL - CALL L7C9E - JP L604F - -L7EE8: LD A,(HL) - OR A - RET Z - CALL L7D94 - JP NZ,04AF2H - CALL L8320 - CALL L7D9E - JP L81FC - -L7EFA: PUSH HL - EX DE,HL - CALL L5E90 - POP HL - POP BC - RET - -L7F02: LD A,(HL) - LD C,H -L7F04: ADD A,B - DEC HL -L7F06: PUSH BC - INC HL - LD A,(HL) - RES 7,(HL) - DEC HL - PUSH AF - CALL L7F17 - POP AF - POP BC - RLCA - RET NC - JP L7972 - -L7F17: CALL L7EAA - JR C,L7F3A ; (+01eH) - CALL L7DA6 - PUSH DE - PUSH HL - CALL L5E93 - POP DE - PUSH DE - CALL L5E90 - POP HL - POP DE - CALL L7C9E - CALL L7F3A - LD DE,08194H - CALL L797C - JP L7E86 - -L7F3A: LD A,0FFH - LD (L80B0),A - LD DE,L7F02 - CALL L7A1C - JR C,07F96H ; (+04fH) - LD DE,L7F04 - CALL L7A1C - PUSH AF - CALL L7DA6 - POP AF - PUSH HL - PUSH DE - CALL L5E93 - POP HL - JR C,L7F6E ; (+014H) - CALL L7EA4 - EX (SP),HL - CALL L797C - POP DE - CALL L7C9E - CALL 07F96H - LD DE,08199H - JP L7985 - -L7F6E: LD DE,L7F91 - CALL L7BB3 - CALL L7EA4 - EX (SP),HL - LD DE,L7F91 - CALL L797C - POP DE - CALL L7C9E - CALL 07F96H - CALL L7D99 - LD DE,08199H - CALL L7985 - JP L7D9E - -L7F91: LD A,A - LD D,H - INC DE - CALL Z,0C5D0H - PUSH HL - CALL L7DB8 - POP HL - PUSH HL - PUSH DE - CALL L5E93 - POP HL - LD E,L - LD D,H - CALL L7BB3 - LD DE,(08475H) - POP HL - PUSH HL - CALL L5E93 - LD A,(L84CE) - DEC A - CP 004H - LD B,A - LD HL,08137H - JP Z,L803D - LD B,00AH - JP L803D - -L7FC2: PUSH BC - LD A,(HL) - OR A - JP Z,L7EFA - LD DE,08194H - CALL L797C - CALL L7972 - POP BC -L7FD2: PUSH BC - INC HL - LD A,(HL) - RES 7,(HL) - AND 080H - CPL - LD (L80B0),A - DEC HL - LD DE,L818A - PUSH HL - CALL L7A1C - JR C,L7FF0 ; (+009H) - CALL L7C9E - CALL L608D - CALL L7BB3 -L7FF0: LD DE,0818FH - CALL L7A1C - JR C,L8003 ; (+00bH) - CALL L797C - LD A,(L80B0) - XOR 080H - LD (L80B0),A -L8003: LD DE,08194H - CALL L7A1C - JR C,L8014 ; (+009H) - LD DE,0818FH - CALL L797C - CALL L7E86 -L8014: CALL L7DB8 - POP HL - PUSH DE - LD DE,08199H - CALL L7A1C - JR NC,L8086 ; (+065H) - POP DE - PUSH HL - PUSH DE - CALL L5E93 - POP HL - LD E,L - LD D,H - CALL L7BB3 - LD DE,(08475H) - POP HL - PUSH HL - CALL L5E93 - LD A,(L84CE) - LD B,A - LD HL,L80E7 -L803D: PUSH BC -L803E: PUSH HL - LD HL,(L8475) - LD DE,(08477H) - CALL L7BB3 - POP HL - PUSH HL - LD DE,(08473H) - PUSH DE - CALL L5E93 - POP HL - LD DE,(08475H) - CALL L7BB3 - EX DE,HL - LD HL,(L8471) - CALL L7985 - POP HL - LD DE,00005H - ADD HL,DE - POP BC - DJNZ L803D ; (-02dH) - POP HL - POP BC - LD A,(L80B0) - INC HL - XOR (HL) - CPL - LD (HL),A - DEC HL - LD A,(L84CE) - CP 008H - LD A,(HL) - JR Z,L8082 ; (+006H) - CP 05CH -L807E: RET NC - JP L7967 - -L8082: CP 04DH - JR L807E ; (-008H) - -L8086: LD DE,08194H - CALL L797C - CALL L7E86 - POP DE - PUSH HL - PUSH DE - CALL L5E93 -L8095: POP HL - LD E,L - LD D,H - CALL L7BB3 - LD DE,(08475H) - CALL L5E90 -L80A2: POP DE - PUSH DE - CALL L5E90 - LD A,(L84CE) - LD B,A - LD HL,L810F - JR L803D ; (-073H) - -L80B0: NOP -L80B1: PUSH BC - PUSH HL - CALL L7DA6 - EX DE,HL - LD (L8479),HL - CALL L7DA6 - LD (0847BH),DE - POP HL - PUSH HL - CALL L5E93 - LD HL,(L8479) - EX DE,HL - POP HL -L80CB: PUSH HL - CALL L5E93 - LD HL,(0847BH) - CALL L7FD2 - POP DE - PUSH DE - CALL L5E93 - LD HL,(L8479) - CALL L7FC2 - EX DE,HL - POP HL - CALL L7C9E - POP BC - RET - -L80E7: LD A,(HL) -L80E8: XOR D - XOR D - XOR D - XOR E - LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C - LD (HL),H - RET NC - DEC C - NOP - RET NC -L80F6: LD L,(HL) - JR C,L80E8 ; (-011H) - DEC E - DEC HL - LD H,A - RST 010H - LD (L402B),A - LD H,B - JR NC,L8095 ; (-06eH) - JR NC,L80A2 ; (-063H) - LD E,B - RST 010H - CCF - SBC A,A - LD A,(04A50H) - SUB (HL) - DEC SP - ADD A,D -L810F: ADD A,B - ADD A,B - NOP - NOP - NOP - LD A,H - LD HL,(0AAAAH) - XOR E - LD (HL),A - OR (HL) - DEC BC - LD H,B - OR (HL) - LD (HL),C - LD D,B - DEC C - NOP - RET NC - LD L,E - SUB E - JP P,0BC7DH - LD H,H - RRCA - HALT - RST 000H -L812C: ADD A,B - LD E,H - RET - -L812F: RES 4,L - LD B,(HL) - LD D,H - LD D,A - CCF - SBC A,A - LD A,(0AA7FH) - XOR D - XOR D - XOR E - LD A,(HL) - LD C,H - CALL Z,0CDCCH - LD A,(HL) - SUB D - LD C,C - INC H - SUB D - LD A,L - LD H,E - ADC A,(HL) - JR C,L812F ; (-01cH) - LD A,L - CP D - LD L,08BH - AND E - LD A,L - DEC E - ADC A,C - RET C - SBC A,(HL) - LD A,L - ADC A,B - ADC A,B - ADC A,B - ADC A,C - LD A,H - LD (HL),B - RET P - RET P - POP AF - LD A,H - RST 010H - SUB H - DEC (HL) - PUSH HL - LD A,H - LD B,E - INC C - JR NC,L812C ; (-03dH) -L8169: LD DE,L0000 - LD A,(HL) - OR A - JR Z,L8178 ; (+008H) - CALL L7D94 - INC DE - JR Z,L8178 ; (+002H) - DEC DE - DEC DE -L8178: CALL L5E99 - RET - -L817C: LD DE,0819EH - JR L8184 ; (+003H) - -L8181: LD DE,0818FH -L8184: PUSH BC - CALL L7BB3 - POP BC - RET - -L818A: ADD A,E - LD C,C - RRCA - JP C,L82A2 - LD C,C - RRCA - JP C,L81A2 - LD C,C - RRCA - JP C,L80A2 - LD C,C - RRCA - JP C,07BA2H - LD C,FDPC - DEC (HL) -L81A2: INC DE -L81A3: PUSH HL - CALL L60B7 - LD A,000H - CP 040H - LD A,(HL) - CALL NZ,BREAKX - LD E,A - LD D,000H - POP HL - CALL L5E99 - RET - -L81B7: LD A,(HL) - OR A - JR Z,L81C0 ; (+005H) - CALL L7D94 - JR Z,L81CB ; (+00bH) -L81C0: PUSH HL - LD HL,L4193 - LD (L81FA),HL - POP HL - XOR A - LD R,A -L81CB: PUSH BC - LD DE,(081FAH) - LD A,R - XOR D - RRC A - RRC A - RRC A - LD D,A - LD A,R - XOR E - RLC A - RLC A - LD E,D - LD D,A - LD (081FAH),DE - PUSH HL - INC HL - RES 7,D - LD (HL),D - INC HL - LD (HL),E - INC HL - LD A,R - LD (HL),A - POP HL - LD (HL),081H - CALL L7E9E - POP BC - RET - -L81FA: SUB E - LD B,C -L81FC: PUSH BC - LD A,(HL) - OR A - JP Z,L7EFA - INC HL - LD A,(HL) - LD (L8312),A - RES 7,(HL) - DEC HL - LD DE,L8467 - CALL L7BB3 - PUSH HL - CALL L7DA6 - PUSH DE - CALL L5E93 - POP HL - CALL L604F - PUSH HL - CALL L60B7 - XOR A - CP H - JP NZ,04AEFH - LD A,L - LD (L8311),A - POP DE - POP HL - PUSH HL - CALL L797C - PUSH DE - PUSH HL - CALL L5E90 - POP DE - POP HL - CALL L7D9E - EX DE,HL - XOR A - LD B,008H -L823D: PUSH BC - PUSH AF - CALL L7A1C - JR C,L824B ; (+007H) - CALL L797C - POP AF - SET 7,A - PUSH AF -L824B: POP AF - RLC A - EX DE,HL - PUSH AF - CALL L7D9E - POP AF - EX DE,HL - POP BC - DJNZ L823D ; (-01bH) - LD (L8313),A - PUSH DE - LD DE,L845D - LD A,(L84CE) - BIT 3,A - JR NZ,L8269 ; (+003H) - LD DE,L8462 -L8269: CALL L7BB3 - POP DE - PUSH DE - CALL L5E93 - POP HL - LD A,(L84CE) - BIT 3,A - JP Z,L8301 - CALL L7D99 - LD DE,L610D - CALL L7985 - CALL L7D9E - POP DE - PUSH DE - CALL L7BB3 - LD DE,L610D - CALL L7D9E - CALL L7985 - CALL L7D99 - POP DE - PUSH DE - CALL L7BB3 - LD DE,L8458 - CALL L7BB3 -L82A2: CALL L7D99 - CALL L7EA4 - CALL L7D9E - POP DE - PUSH DE - CALL L7BB3 - CALL L7EA4 - POP DE - PUSH DE - CALL L7BB3 -L82B8: CALL L7EA4 - EX (SP),HL - EX DE,HL - PUSH DE - CALL L5E90 - POP HL - LD DE,L8408 - LD A,(L8313) - LD B,008H -L82CA: RLC A - JR NC,L82D5 ; (+007H) - PUSH AF - PUSH BC - CALL L7BB3 - POP BC - POP AF -L82D5: INC DE - INC DE - INC DE - INC DE - INC DE - DJNZ L82CA ; (-012H) - LD A,(L8311) - ADD A,(HL) - JP C,04AEFH - LD (HL),A - POP DE - CALL L7BB3 - POP BC - LD A,(L8312) - RLC A - RET NC - PUSH BC - PUSH DE - PUSH HL - CALL L5E93 - POP DE - PUSH DE - CALL L5E90 - POP HL - POP DE - CALL L7C9E - POP BC - RET - -L8301: POP DE - PUSH DE - CALL L7BB3 - LD A,(HL) - OR A - CALL NZ,L7D9E - CALL L7985 - JP L82B8 - -L8311: NOP -L8312: NOP -L8313: NOP -L8314: PUSH BC - CALL L8320 - LD DE,L83F9 - CALL L7BB3 - POP BC - RET - -L8320: PUSH BC - CALL L7D94 - JP NZ,04AF2H - LD A,(HL) - OR A - JP Z,04AF2H - SUB 081H - LD (L83F8),A - LD (HL),081H - XOR A - LD B,008H - LD DE,L8408 -L8339: PUSH BC - PUSH AF - CALL L7A1C - JR C,L834F ; (+00fH) - PUSH HL - LD HL,00028H - ADD HL,DE - EX DE,HL - EX (SP),HL - CALL L7BB3 - POP DE - POP AF - SET 7,A - PUSH AF -L834F: POP AF - RLC A - INC DE - INC DE - INC DE - INC DE - INC DE - POP BC - DJNZ L8339 ; (-021H) - DB 022H - LD (HL),C - ADD A,H - CALL L7DA6 - EX DE,HL - LD E,A - LD D,000H - CALL L5E99 - LD A,(HL) - OR A - JR Z,L836E ; (+003H) - SUB 008H - LD (HL),A -L836E: LD A,(L83F8) - CP 080H - JR C,L8377 ; (+002H) - NEG -L8377: PUSH HL - CALL L7DA6 - EX DE,HL - LD (L8473),HL - LD E,A - LD D,000H - CALL L5E99 - LD A,(L83F8) - AND 080H - INC HL - OR (HL) - LD (HL),A - DEC HL - EX DE,HL - POP HL - CALL L7985 - LD A,(L84CE) - LD DE,0846CH - CP 005H - JR Z,L83A0 ; (+003H) - LD DE,L845D -L83A0: CALL L7BB3 - PUSH HL - LD DE,(08473H) - LD HL,(L8471) - PUSH HL - PUSH DE - CALL L5E93 - POP HL - CALL L7EA4 - EX (SP),HL - CALL L797C - POP DE - CALL L7C9E - PUSH DE - CALL L5E93 - POP HL - PUSH DE - LD E,L - LD D,H - CALL L7BB3 - POP DE - PUSH HL - PUSH DE - CALL L5E93 - POP HL - LD DE,L8403 - CALL L7985 - EX DE,HL - POP HL - CALL L7BB3 - LD DE,L610D - CALL L7D99 - CALL L7985 - CALL L7D9E - EX DE,HL - LD HL,(L8471) - CALL L7BB3 - LD DE,L83FE - CALL L7BB3 - POP DE - CALL L7985 - POP BC - RET - -L83F8: NOP -L83F9: LD A,A - LD E,(HL) - LD E,E - RET C - XOR C -L83FE: LD A,A - LD C,H - CALL Z,0CDCCH -L8403: ADD A,C - LD D,L - LD D,L - LD D,L - LD D,(HL) -L8408: ADD A,C - DEC (HL) - INC B - DI - INC (HL) - ADD A,C - JR L8447 ; (+037H) - - RET P - LD D,D - ADD A,C - DEC BC -L8414: SUB L - POP BC - CALL PO,00581H - XOR D - JP 08168H - - LD (BC),A - CALL 09986H - ADD A,C - LD BC,0D164H - CALL P,L0081 - OR C - IN D,(C) - ADD A,C - NOP - LD E,B - RST 010H - OUT (080H),A - DEC (HL) - INC B - DI - INC (HL) - ADD A,B - LD D,A - LD B,H - CALL M,L80CB - LD L,D - RET NZ - ADD A,0E8H - ADD A,B - LD (HL),L - DEC H - LD A,L - LD D,080H - LD A,D - ADD A,E -L8447: OR D - CALL C,L7D80 - LD A,00CH - DEC C - ADD A,B - LD A,(HL) - SBC A,(HL) - LD DE,0805DH - LD A,A - LD C,(HL) - BIT 3,D -L8458: LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C -L845D: ADD A,B - LD SP,L1772 - RET M -L8462: ADD A,B - LD SP,L1772 - RET M -L8467: ADD A,C - JR C,L8414 ; (-056H) - DEC SP - LD HL,(03180H) - LD (HL),D - RLA - RET M -L8471: DS 2, 000H -L8473: DS 2, 000H -L8475: DS 4, 000H -L8479: DS 4, 000H -L847D: DS 2, 000H -L847F: DS 2, 000H -L8481: DS 2, 000H -L8483: DS 2, 000H -L8485: DB 000H -L8486: DB 000H -L8487: DS 2, 000H -L8489: DS 2, 000H -L848B: DS 4, 000H -L848F: DB 000H -L8490: DS 2, 000H - DB 015H - DB 000H - DB 0EBH - DB 0FFH - DS 2, 000H -L8498: DS 2, 000H -L849A: DS 2, 000H -L849C: DS 7, 000H -L84A3: DB 000H -L84A4: DS 3, 000H -L84A7: DB 000H -L84A8: DS 4, 000H -L84AC: DB 000H -L84AD: DS 8, 000H -L84B5: DS 25, 000H -L84CE: DB 008H ; Splash screen / banner text -L84CF: DS 8, 000H -L84D7: DS 8, 000H -L84DF: DS 8, 000H -L84E7: DB 016H - DB 00DH - DB 020H - DS 38, 0D7H - DS 4, 020H - DB "BASIC ",005H,"INTERPRETER" - DS 2, 020H - DB 006H,"MZ-5Z" - DS 2, 030H - DB "8 V1.0A ",00DH - DS 3, 020H - DB 043H,005H,"OPYRIGHT ",006H,"(C) 1984 ",005H,"BY ",006H,"SHARP CORP." - DS 5, 020H - DS 38, 0CFH - DB 020H,00DH,020H,005H,"30134 BYTES FR" - DS 2, 045H - DS 2, 00DH - DS 93, 000H diff --git a/dis/MZ-5Z008/mz5z008_dz80.asm b/dis/MZ-5Z008/mz5z008_dz80.asm index 0dec91b..0ca209b 100644 --- a/dis/MZ-5Z008/mz5z008_dz80.asm +++ b/dis/MZ-5Z008/mz5z008_dz80.asm @@ -36,6 +36,7 @@ FUNBUF EQU 012B2H INBUFC EQU 01352H INBUFL EQU 01353H INBUF EQU 01354H +TIMST EQU 00033H ; Timer stop routine in Monitor ROM LINLIM EQU 01364H KEYDAT EQU 01365H AMPM EQU 01366H @@ -88,6 +89,22 @@ PPI_PC EQU 0E012H PPI_CTL EQU 0E013H PRGSTART EQU 00000H +; =========================================================================== +; Build configuration — set these flags to select the build variant: +; +; BUILD_RFS=0, BUILD_TAPE=0 : Original BASIC (QD boot, no RFS) +; BUILD_RFS=0, BUILD_TAPE=1 : Original BASIC (Tape/CMT/RFS ROM boot) +; BUILD_RFS=1, BUILD_TAPE=0 : RFS Enhanced BASIC (QD boot) +; BUILD_RFS=1, BUILD_TAPE=1 : RFS Enhanced BASIC (Tape/CMT/RFS ROM boot) +; =========================================================================== +BUILD_RFS EQU 1 ; 0 = original BASIC, 1 = RFS enhancements +BUILD_TAPE EQU 0 ; 0 = QD boot, 1 = Tape/CMT/RFS ROM boot + +; Tape/CMT boot constants +ATRB EQU 010F0H ; MZF header location (= ELMD area) +TAPECOPY EQU 01200H ; Load address for tape bootstrap +HDRLEN EQU 00040H ; MZF header length (64 bytes) + ; RFS (ROM Filing System) constants for picoZ80 PORT_LODRAM EQU 0E0H ; OUT: map 0000-0FFF to DRAM PORT_DRAM EQU 0E1H ; OUT: map D000-FFFF to DRAM @@ -100,7 +117,24 @@ HWSPISTART EQU 0EFFCH ; Start SPI transfer register ; SECTORBUF relocated to RFS data area — was EQU 0CE00H (overlapped BASIC stack) SDCS_ACT EQU 001H ; BNKCTRL: CS LOW (active), BBCLK enable SDCS_DEACT EQU 003H ; BNKCTRL: CS HIGH (inactive), BBCLK enable -HDRLEN EQU 00040H ; File header length (64 bytes) + +; --------------------------------------------------------------------------- +; MZF tape header (only for BUILD_TAPE=1) +; Loaded by Monitor ROM at ATRB (0x10F0), then bootstrapped to 0x0000 +; --------------------------------------------------------------------------- + IF BUILD_TAPE = 1 + ORG ATRB +BOOTATRB: DB 001H ; File type: 01 = Machine Code + IF BUILD_RFS = 1 +BOOTNAME: DB "BASIC 5Z-008BRFS", 00DH ; Title (17 bytes + CR) + ELSE +BOOTNAME: DB "BASIC 5Z-008B ", 00DH ; Title (17 bytes + CR) + ENDIF +BOOTSIZE: DW BASICEND - L0000 ; Size of program +BOOTDTADR: DW TAPECOPY ; Load address +BOOTEXADR: DW EXECSTART + TAPECOPY ; Exec address (relocated) +BOOTCOMNT: DS 104 ; Comment area (unused) + ENDIF ORG PRGSTART @@ -3664,16 +3698,11 @@ L1D15: LD A,(ZFLAG1) JR NZ,L1D6B ; (+04aH) LD HL,L0100 LD (ZLOG),HL - CALL DBG_L1C5B_WRAP - CALL DBG_FLAGS_TEST - ; - ; V1.1Z: Restore original ZFLAG1/ZFLAG2 bit tests. - ; DBG_FLAGS_TEST returns HL=ZFLAG1 for non-$RFS devices + IF BUILD_RFS = 1 + CALL RFS_L1C5B_WRAP + CALL RFS_FLAGS_TEST + ; RFS_FLAGS_TEST returns HL=ZFLAG1 for non-$RFS devices ; (and already handles the ZFLAG1 bit7 error check). - ; Original code: BIT 7,ZFLAG1 / BIT 5,ZFLAG1 / INC HL / - ; BIT 7,ZFLAG2. bit5 of ZFLAG1 (not ZFLAG2!) flags block - ; devices ($FD, $QD) for the ZINP-based DIR path at 02F38H. - ; BIT 5,(HL) ; ZFLAG1 bit5 = block device JP NZ,02F38H ; Block device DIR path (ZINP-based) INC HL ; HL = ZFLAG2 @@ -3684,6 +3713,18 @@ L1D15: LD A,(ZFLAG1) NOP NOP NOP + ELSE + ; Original SVC#39 DIR handler (no RFS) + CALL L1C5B + LD HL,ZFLAG1 + BIT 7,(HL) + JP NZ,01F97H + BIT 5,(HL) + JP NZ,02F38H ; Block device DIR path + INC HL + BIT 7,(HL) + JP NZ,01F97H + ENDIF LD HL,L2000 LD BC,00008H L1D43: CALL ?CLRHL @@ -5250,10 +5291,17 @@ L3153: LD (03109H),SP LD A,B OR C JR Z,L3107 ; (-05cH) + IF BUILD_RFS = 1 CALL RFS_LOAD_HOOK NOP NOP NOP + ELSE + ; Original SVC#30 data transfer (no RFS) + CALL L32CB + CALL L3174 + NOP + ENDIF DI OUT (LSE4),A CALL NC,L065B @@ -6311,7 +6359,12 @@ L389B: CALL L388D ; --------------------------------------------------------------------------- ; $QD Device Descriptor (Quick Disk) ; --------------------------------------------------------------------------- -$QD: DW $RFS ; Next device = $RFS (was $USR at 0D5EH) +$QD: + IF BUILD_RFS = 1 + DW $RFS ; Next device = $RFS (RFS enhanced) + ELSE + DW $USR ; Next device = $USR (original) + ENDIF DB "QD",000H,000H ; Device name DB 05FH ; flags1: bit5=1 ZINP-based DIR, bit6=1 ZRO enum DB 040H ; flags2 @@ -7452,7 +7505,12 @@ L3FFC: POP HL POP BC RET -L4000: LD HL,RFS_END ; TEXTST: moved past RFS module (was 085FFH) +L4000: + IF BUILD_RFS = 1 + LD HL,RFS_END ; TEXTST: moved past RFS module + ELSE + LD HL,085FFH ; TEXTST: original end of BASIC code + ENDIF LD (TEXTST),HL LD HL,L4046 LD (000E3H),HL @@ -7466,7 +7524,13 @@ L4000: LD HL,RFS_END ; TEXTST: moved past RFS module (was 085 L401B: LD DE,L84E7 RST 018H DB 005H - JP MEMCLI_PATCH ; MEMCLI: call SVC 020H then set HL=RFS_END (was SVC 020H + EX DE,HL) + IF BUILD_RFS = 1 + JP MEMCLI_PATCH ; MEMCLI: call SVC 020H then set HL=RFS_END + ELSE + RST 018H ; Original: SVC 020H (boot beep + EI) + DB 020H + EX DE,HL ; HL = DE (original TEXTST) + ENDIF L4023: LD (HL),000H INC HL LD A,H @@ -8994,23 +9058,12 @@ L4B58: LD A,L DB 005H RET -L4B66: JR NZ,04BB1H ; (+049H) - LD C,(HL) - JR NZ,L4B6B ; (+000H) -L4B6B: LD B,D - DEC B - LD D,D - LD B,L - LD B,C - LD C,E - NOP -L4B72: LD D,D - DEC B - LD B,L - LD B,C - LD B,H - LD E,C -L4B78: NOP +L4B66: DB 020H,049H,04EH,020H,000H ; " IN \0" — error location text +L4B6B: DB 042H,005H ; "B\x05" — control prefix + DB 052H,045H,041H,04BH,000H ; "REAK\0" — BREAK message +L4B72: DB 052H,005H ; "R\x05" — control prefix + DB 045H,041H,044H,059H ; "EADY" — Ready prompt +L4B78: DB 000H ; NUL terminator NOP L4B7A: CALL L6E4B DEC A @@ -10867,17 +10920,34 @@ L58C2: LD A,(ZLOG) RET M JP L5E70 -L58CA: JP DBG_DIRCMD1 ; Debug hook: DIR handler 1 (via L593A) +L58CA: + IF BUILD_RFS = 1 + JP RFS_DIRCMD1 ; RFS: debug hook for DIR handler 1 NOP NOP NOP - -L58D0: JP DBG_DIRCMD2 ; Debug hook: DIR handler 2 (via L6E6F) + ELSE + CALL L593A ; Original: parse device name for DIR + LD B,A + XOR A + NOP + ENDIF +L58D0: + IF BUILD_RFS = 1 + JP RFS_DIRCMD2 ; RFS: debug hook for DIR handler 2 NOP NOP NOP NOP NOP + ELSE + CALL L6E6F ; Original: evaluate string expression + PUSH HL + RST 018H + DB 02CH + RST 018H + DB 03CH + ENDIF L58D8: PUSH HL RST 018H DB 02CH @@ -10954,22 +11024,39 @@ L593A: PUSH HL LD A,03AH LD (DE),A POP AF + IF BUILD_RFS = 1 JP RFS_DIR_FIX NOP NOP + ELSE + LD DE,L5982 ; Original: buffer for device name + INC HL ; Advance past ':' + ENDIF L5962: POP HL CALL L413E LD B,000H CALL NZ,L6E6F -L596B: JP DBG_DIR ; Debug hook: trace SVC #2C for DIR - NOP ; (was: PUSH HL / RST 018H / DB 02CH / INC(HL) / DEC(HL) / JP NZ / POP HL / RET) +L596B: + IF BUILD_RFS = 1 + JP RFS_DIR_OPEN ; RFS: debug hook for SVC #2C DIR trace NOP NOP NOP NOP NOP NOP + NOP + ELSE + PUSH HL ; Original SVC #2C DIR handler + RST 018H + DB 02CH + INC (HL) + DEC (HL) + JP NZ,04B1FH + POP HL + RET + ENDIF L5975: CP 041H RET C @@ -11462,7 +11549,14 @@ L5CD5: XOR A DB 03FH RET -L5CE3: JP DBG_DIR3 ; Debug hook: trace full DIR handler +L5CE3: + IF BUILD_RFS = 1 + JP RFS_DIR3 ; RFS: debug hook for DIR handler + ELSE + NOP ; Original: no hook (3 bytes NOP) + NOP + NOP + ENDIF PUSH AF RST 018H DB 02EH @@ -12079,54 +12173,21 @@ L60E5: CCF LD HL,L0000 RET -L60EA: SBC A,E - LD A,0BCH - JR NZ,L60EF ; (+000H) -L60EF: SBC A,B - JR L6088 ; (-06aH) - - ADD A,B - NOP - SUB H - LD (HL),H - INC H - NOP - NOP - SUB C - LD B,E - LD D,B - NOP - NOP - ADC A,(HL) - INC E - LD B,B - NOP - NOP - ADC A,D - LD A,D - NOP - NOP - NOP - ADD A,A - LD C,B - NOP - NOP - NOP -L610D: ADD A,H - JR NZ,L6110 ; (+000H) -L6110: NOP - NOP -L6112: ADD A,C - NOP - NOP - NOP - NOP - LD A,L - LD C,H - CALL Z,0CDCCH -L611C: LD H,(HL) - DEC HL - CALL Z,L1277 +; --------------------------------------------------------------------------- +; Floating-point constant table — powers of 10 for number formatting +; Each entry is 5 bytes (1 exponent + 4 mantissa) in Sharp MZ FP format +; --------------------------------------------------------------------------- +L60EA: DB 09BH,03EH,0BCH,020H,000H ; FP 10^9 (1000000000) +L60EF: DB 098H,018H,096H,080H,000H ; FP 10^8 (100000000) + DB 094H,074H,024H,000H,000H ; FP 10^7 (10000000) + DB 091H,043H,050H,000H,000H ; FP 10^6 (1000000) + DB 08EH,01CH,040H,000H,000H ; FP 10^5 (100000) + DB 08AH,07AH,000H,000H,000H ; FP 10^4 (10000) + DB 087H,048H,000H,000H,000H ; FP 10^3 (1000) +L610D: DB 084H,020H,000H,000H,000H ; FP 10^2 (100) +L6112: DB 081H,000H,000H,000H,000H ; FP 10^1 (10) + DB 07DH,04CH,0CCH,0CCH,0CDH ; FP 10^-1 (0.1) +L611C: DB 066H,02BH,0CCH,077H,012H ; FP precision guard L6121: LD HL,(L6304) LD B,000H L6126: LD DE,L610D @@ -14628,11 +14689,7 @@ L718E: LD DE,(08487H) LD DE,L71A0 JP L7985 -L71A0: SUB C - NOP - NOP - NOP - NOP +L71A0: DB 091H,000H,000H,000H,000H ; FP constant (65536.0) L71A5: CALL L5E78 LD B,000H L71AA: PUSH BC @@ -16946,10 +17003,8 @@ L7F6E: LD DE,L7F91 CALL L7985 JP L7D9E -L7F91: LD A,A - LD D,H - INC DE - CALL Z,0C5D0H +L7F91: DB 07FH,054H,013H,0CCH,0D0H ; FP constant (used by EXP/LOG) + PUSH BC ; *** was misaligned: disassembler consumed D0+C5 as CALL Z *** PUSH HL CALL L7DB8 POP HL @@ -17120,118 +17175,36 @@ L80CB: PUSH HL POP BC RET -L80E7: LD A,(HL) -L80E8: XOR D - XOR D - XOR D - XOR E - LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C - LD (HL),H - RET NC - DEC C - NOP - RET NC -L80F6: LD L,(HL) - JR C,L80E8 ; (-011H) - DEC E - DEC HL - LD H,A - RST 010H - LD (L402B),A - LD H,B - JR NC,L8095 ; (-06eH) - JR NC,L80A2 ; (-063H) - LD E,B - RST 010H - CCF - SBC A,A - LD A,(04A50H) - SUB (HL) - DEC SP - ADD A,D -L810F: ADD A,B - ADD A,B - NOP - NOP - NOP - LD A,H - LD HL,(0AAAAH) - XOR E - LD (HL),A - OR (HL) - DEC BC - LD H,B - OR (HL) - LD (HL),C - LD D,B - DEC C - NOP - RET NC - LD L,E - SUB E - JP P,0BC7DH - LD H,H - RRCA - HALT - RST 000H -L812C: ADD A,B - LD E,H - RET - -L812F: RES 4,L - LD B,(HL) - LD D,H - LD D,A - CCF - SBC A,A - LD A,(0AA7FH) - XOR D - XOR D - XOR E - LD A,(HL) - LD C,H - CALL Z,0CDCCH - LD A,(HL) - SUB D - LD C,C - INC H - SUB D - LD A,L - LD H,E - ADC A,(HL) - JR C,L812F ; (-01cH) - LD A,L - CP D - LD L,08BH - AND E - LD A,L - DEC E - ADC A,C - RET C - SBC A,(HL) - LD A,L - ADC A,B - ADC A,B - ADC A,B - ADC A,C - LD A,H - LD (HL),B - RET P - RET P - POP AF - LD A,H - RST 010H - SUB H - DEC (HL) - PUSH HL - LD A,H - LD B,E - INC C - JR NC,L812C ; (-03dH) +; --------------------------------------------------------------------------- +; Floating-point polynomial coefficient tables for transcendental functions +; (SIN, COS, TAN, ATN, LOG, EXP, SQR). 5 bytes per FP constant. +; --------------------------------------------------------------------------- +L80E7: DB 07EH,0AAH,0AAH,0AAH,0ABH ; SIN/COS coeff 0 + DB 07AH,008H,088H,088H,089H ; SIN/COS coeff 1 + DB 074H,0D0H,00DH,000H,0D0H ; SIN/COS coeff 2 +L80F6: DB 06EH,038H,0EFH,01DH,02BH ; SIN/COS coeff 3 + DB 067H,0D7H,032H,02BH,040H ; SIN/COS coeff 4 + DB 060H,030H,092H,030H,09DH ; SIN/COS coeff 5 + DB 058H,0D7H,03FH,09FH,03AH ; SIN/COS coeff 6 + DB 050H,04AH,096H,03BH,082H ; SIN/COS coeff 7 +L810F: DB 080H,080H,000H,000H,000H ; FP 1.0 + DB 07CH,02AH,0AAH,0AAH,0ABH ; TAN coeff 0 + DB 077H,0B6H,00BH,060H,0B6H ; TAN coeff 1 + DB 071H,050H,00DH,000H,0D0H ; TAN coeff 2 + DB 06BH,093H,0F2H,07DH,0BCH ; TAN coeff 3 + DB 064H,00FH,076H,0C7H,080H ; TAN coeff 4 +L812C: DB 05CH,0C9H,0CBH,0A5H,046H ; TAN coeff 5 (NB: 0xC9=RET opcode in data) +L812F: DB 054H,057H,03FH,09FH,03AH ; ATN coeff 0 + DB 07FH,0AAH,0AAH,0AAH,0ABH ; ATN coeff 1 + DB 07EH,04CH,0CCH,0CCH,0CDH ; ATN coeff 2 + DB 07EH,092H,049H,024H,092H ; ATN coeff 3 + DB 07DH,063H,08EH,038H,0E4H ; ATN coeff 4 + DB 07DH,0BAH,02EH,08BH,0A3H ; ATN coeff 5 + DB 07DH,01DH,089H,0D8H,09EH ; ATN coeff 6 + DB 07DH,088H,088H,088H,089H ; ATN coeff 7 + DB 07CH,070H,0F0H,0F0H,0F1H ; ATN coeff 8 + DB 07CH,0D7H,094H,035H,0E5H ; ATN coeff 9 + DB 07CH,043H,00CH,030H,0C3H ; ATN coeff 10 L8169: LD DE,L0000 LD A,(HL) OR A @@ -17253,22 +17226,13 @@ L8184: PUSH BC POP BC RET -L818A: ADD A,E - LD C,C - RRCA - JP C,L82A2 - LD C,C - RRCA - JP C,L81A2 - LD C,C - RRCA - JP C,L80A2 - LD C,C - RRCA - JP C,07BA2H - LD C,FDPC - DEC (HL) -L81A2: INC DE +; FP constants for LOG/EXP computation +L818A: DB 083H,049H,00FH,0DAH,0A2H ; FP constant (log2(e)) + DB 082H,049H,00FH,0DAH,0A2H ; FP constant + DB 081H,049H,00FH,0DAH,0A2H ; FP constant + DB 080H,049H,00FH,0DAH,0A2H ; FP constant + DB 07BH,00EH,0FAH,035H,013H ; FP constant (ln(2)) +L81A2 EQU $-1 ; Last byte alias L81A3: PUSH HL CALL L60B7 LD A,000H @@ -17600,97 +17564,35 @@ L83A0: CALL L7BB3 POP BC RET -L83F8: NOP -L83F9: LD A,A - LD E,(HL) - LD E,E - RET C - XOR C -L83FE: LD A,A - LD C,H - CALL Z,0CDCCH -L8403: ADD A,C - LD D,L - LD D,L - LD D,L - LD D,(HL) -L8408: ADD A,C - DEC (HL) - INC B - DI - INC (HL) - ADD A,C - JR L8447 ; (+037H) - - RET P - LD D,D - ADD A,C - DEC BC -L8414: SUB L - POP BC - CALL PO,00581H - XOR D - JP 08168H - - LD (BC),A - CALL 09986H - ADD A,C - LD BC,0D164H - CALL P,L0081 - OR C - IN D,(C) - ADD A,C - NOP - LD E,B - RST 010H - OUT (080H),A - DEC (HL) - INC B - DI - INC (HL) - ADD A,B - LD D,A - LD B,H - CALL M,L80CB - LD L,D - RET NZ - ADD A,0E8H - ADD A,B - LD (HL),L - DEC H - LD A,L - LD D,080H - LD A,D - ADD A,E -L8447: OR D - CALL C,L7D80 - LD A,00CH - DEC C - ADD A,B - LD A,(HL) - SBC A,(HL) - LD DE,0805DH - LD A,A - LD C,(HL) - BIT 3,D -L8458: LD A,D - EX AF,AF' - ADC A,B - ADC A,B - ADC A,C -L845D: ADD A,B - LD SP,L1772 - RET M -L8462: ADD A,B - LD SP,L1772 - RET M -L8467: ADD A,C - JR C,L8414 ; (-056H) - DEC SP - LD HL,(03180H) - LD (HL),D - RLA - RET M +L83F8: DB 000H ; Exponent work variable +; --------------------------------------------------------------------------- +; Floating-point polynomial coefficient tables for SQR, LOG, EXP functions +; Each entry is 5 bytes (1 exponent + 4 mantissa) in Sharp MZ FP format +; --------------------------------------------------------------------------- +L83F9: DB 07FH,05EH,05BH,0D8H,0A9H ; 1/sqrt(2) approx +L83FE: DB 07FH,04CH,0CCH,0CCH,0CDH ; log10(2) approx +L8403: DB 081H,055H,055H,055H,056H ; Coeff +L8408: DB 081H,035H,004H,0F3H,034H ; LOG poly coeff 0 + DB 081H,018H,037H,0F0H,052H ; LOG poly coeff 1 + DB 081H,00BH,095H,0C1H,0E4H ; LOG poly coeff 2 + DB 081H,005H,0AAH,0C3H,068H ; LOG poly coeff 3 + DB 081H,002H,0CDH,086H,099H ; LOG poly coeff 4 + DB 081H,001H,064H,0D1H,0F4H ; LOG poly coeff 5 + DB 081H,000H,0B1H,0EDH,050H ; LOG poly coeff 6 + DB 081H,000H,058H,0D7H,0D3H ; LOG poly coeff 7 + DB 080H,035H,004H,0F3H,034H ; EXP poly coeff 0 + DB 080H,057H,044H,0FCH,0CBH ; EXP poly coeff 1 + DB 080H,06AH,0C0H,0C6H,0E8H ; EXP poly coeff 2 + DB 080H,075H,025H,07DH,016H ; EXP poly coeff 3 + DB 080H,07AH,083H,0B2H,0DCH ; EXP poly coeff 4 + DB 080H,07DH,03EH,00CH,00DH ; EXP poly coeff 5 + DB 080H,07EH,09EH,011H,05DH ; EXP poly coeff 6 + DB 080H,07FH,04EH,0CBH,05AH ; EXP poly coeff 7 +L8458: DB 07AH,008H,088H,088H,089H ; SQR constant +L845D: DB 080H,031H,072H,017H,0F8H ; SQR constant +L8462: DB 080H,031H,072H,017H,0F8H ; SQR constant +L8467: DB 081H,038H,0AAH,03BH,02AH ; SQR constant + DB 080H,031H,072H,017H,0F8H ; SQR constant L8471: DS 2, 000H L8473: DS 2, 000H L8475: DS 4, 000H @@ -17744,6 +17646,7 @@ L84E7: DB 016H DS 2, 00DH DS 93, 000H + IF BUILD_RFS = 1 ; ============================================================================= ; $RFS - ROM Filing System device module (Direct SD Card Access) ; @@ -17778,7 +17681,10 @@ L84E7: DB 016H ; --------------------------------------------------------------------------- ; $RFS Device Descriptor (29 bytes header + 22 bytes state = 51 bytes) ; --------------------------------------------------------------------------- -$RFS: DW $USR ; Next device = $USR + ENDIF ; (Glass: $RFS label must be outside IF) +$RFS: + IF BUILD_RFS = 1 + DW $USR ; Next device = $USR DB "RFS",000H ; Device name DB 05FH ; flags1: bit5=1 ZINP-based DIR, bit6=1 ZRO enum capable DB 007H ; flags2: max channel 7 (bit7 must be 0, SVC #39 errors if set) @@ -18259,16 +18165,8 @@ RFSRO_NEXT: ; Debug: show entry delivered PUSH AF OUT (PORT_DRAM),A ; Switch to DRAM for debug I/O - LD A,'R' - OUT (050H),A - LD A,'O' - OUT (050H),A - LD A,':' - OUT (050H),A LD A,(DIR_ENTRY_IDX) DEC A ; Show the index we just returned - CALL DBG_HEX - CALL DBG_CRLF OUT (PORT_MMIO),A ; Back to MMIO POP AF ; @@ -18321,11 +18219,7 @@ RFSRO_END: RFSINP_DIR: ; Debug: trace every ZINP call PUSH AF - LD A,'Z' - OUT (050H),A LD A,H - CALL DBG_HEX - CALL DBG_CRLF POP AF ; ; LOAD data path: BASIC's LOAD for bit5=0 devices calls ZINP once @@ -18399,12 +18293,7 @@ RDIR_LOOP: PUSH BC JR NC,RDIR_NDBG ; Only dump entries 0-3 PUSH HL PUSH AF - LD A,'[' - OUT (050H),A LD A,E - CALL DBG_HEX ; Entry number - LD A,']' - OUT (050H),A POP AF POP HL PUSH HL @@ -18412,12 +18301,8 @@ RDIR_LOOP: PUSH BC ; Dump 8 bytes from entry LD B,008H RDIR_DBLP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A INC HL DJNZ RDIR_DBLP - CALL DBG_CRLF POP BC POP HL ; @@ -18453,14 +18338,8 @@ RDIR_NEXT: INC E ; Next SD directory entry RDIR_DONE: CALL MMIO_OFF ; Debug: show how many entries found (D started at 63, remaining = D) PUSH AF - LD A,'F' - OUT (050H),A - LD A,'=' - OUT (050H),A LD A,03FH ; 63 max SUB D ; A = entries found - CALL DBG_HEX - CALL DBG_CRLF POP AF ; POP BC @@ -18503,24 +18382,14 @@ RFSINP_DISKID: ; --------------------------------------------------------------------------- RFSINP_LD: ; Debug: trace RFSINP_LD entry PUSH AF - LD A,'I' - OUT (050H),A - LD A,'L' - OUT (050H),A - LD A,':' - OUT (050H),A ; Dump ELMD1 first 8 chars PUSH HL PUSH BC LD HL,ELMD1 LD B,008H ILD_DMP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A INC HL DJNZ ILD_DMP - CALL DBG_CRLF POP BC POP HL POP AF @@ -18629,59 +18498,22 @@ RLD_NORLOC: ; Switch to DRAM for debug output (port 050H may need DRAM) PUSH AF OUT (PORT_DRAM),A - LD A,'I' - OUT (050H),A - LD A,'S' - OUT (050H),A - LD A,':' - OUT (050H),A ; FILE_STARTSEC (4 bytes) LD A,(FILE_STARTSEC) - CALL DBG_HEX LD A,(FILE_STARTSEC+1) - CALL DBG_HEX LD A,(FILE_STARTSEC+2) - CALL DBG_HEX LD A,(FILE_STARTSEC+3) - CALL DBG_HEX - LD A,' ' - OUT (050H),A ; Absolute sector (SDSTARTSEC, 4 bytes) - LD A,'A' - OUT (050H),A - LD A,':' - OUT (050H),A LD A,(SDSTARTSEC) - CALL DBG_HEX LD A,(SDSTARTSEC+1) - CALL DBG_HEX LD A,(SDSTARTSEC+2) - CALL DBG_HEX LD A,(SDSTARTSEC+3) - CALL DBG_HEX - LD A,' ' - OUT (050H),A ; SIZE - LD A,'Z' - OUT (050H),A - LD A,':' - OUT (050H),A LD A,(FILE_SIZE+1) ; High byte - CALL DBG_HEX LD A,(FILE_SIZE) ; Low byte - CALL DBG_HEX - LD A,' ' - OUT (050H),A ; DTADR - LD A,'D' - OUT (050H),A - LD A,':' - OUT (050H),A LD A,(FILE_LOADADDR+1) ; High byte - CALL DBG_HEX LD A,(FILE_LOADADDR) ; Low byte - CALL DBG_HEX - CALL DBG_CRLF ; Switch back to MMIO OUT (PORT_MMIO),A POP AF @@ -19377,7 +19209,9 @@ CE_NM1: LD (DE),A ; SVC 020H programs the boot beep timer and (critically) enables interrupts. ; We must still call it, then load HL with RFS_END for the memory clear. ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label must be outside IF) MEMCLI_PATCH: + IF BUILD_RFS = 1 RST 018H DB 020H ; SVC 020H: boot beep + EI LD HL,RFS_END @@ -19397,7 +19231,9 @@ MEMCLI_PATCH: ; We advance HL past the ':' so the INC/DEC zero-test at L596B sees ; end-of-text (0x00) rather than ':' (0x3A). ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label must be outside IF) RFS_DIR_FIX: + IF BUILD_RFS = 1 LD DE,L5982 INC HL ; Advance HL past ':'. JP L596B @@ -19438,21 +19274,14 @@ DSTR_DONE: LD DE,L5982 ; DE = start of name buffer (for SVC #2C ; Entry: BC = SIZE (file size to load), stack = L10F0 stack ; Exit: A=0 NC on success; carry on error. Registers preserved. ; --------------------------------------------------------------------------- + ENDIF ; (Glass: label must be outside IF) RFS_LOAD_HOOK: + IF BUILD_RFS = 1 ; Debug: trace L3153 hook entry PUSH AF - LD A,'L' - OUT (050H),A - LD A,'H' - OUT (050H),A - LD A,':' - OUT (050H),A ; Show BC (SIZE) LD A,B - CALL DBG_HEX LD A,C - CALL DBG_HEX - CALL DBG_CRLF POP AF ; LD HL,(ZINP) ; Current device ZINP handler @@ -19472,38 +19301,18 @@ RFLH_RFS: ; $RFS device: transfer file data from SD card. PUSH AF PUSH HL PUSH BC - LD A,'L' - OUT (050H),A - LD A,'D' - OUT (050H),A - LD A,':' - OUT (050H),A ; Dump ELMD[0..7] (ATRB + first 7 chars of name) LD HL,ELMD LD B,008H RFLH_DMP1: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A INC HL DJNZ RFLH_DMP1 - CALL DBG_CRLF ; Dump ELMD18-ELMD23 (SIZE+DTADR+EXADR) - LD A,'E' - OUT (050H),A - LD A,'M' - OUT (050H),A - LD A,':' - OUT (050H),A LD HL,ELMD18 LD B,006H RFLH_DMP2: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A INC HL DJNZ RFLH_DMP2 - CALL DBG_CRLF POP BC POP HL POP AF @@ -19511,84 +19320,66 @@ RFLH_DMP2: LD A,(HL) CALL RFSINP_LD ; Debug: show return status PUSH AF - LD A,'L' - OUT (050H),A - LD A,'R' - OUT (050H),A - LD A,'=' - OUT (050H),A JR C,RFLH_ERR - LD A,'K' - OUT (050H),A JR RFLH_DONE RFLH_ERR: LD A,'E' - OUT (050H),A -RFLH_DONE: CALL DBG_CRLF +RFLH_DONE: CALL RFS_CRLF POP AF JP L3101 ; =========================================================================== -; DBG_DIRCMD1 — Debug wrapper for L58CA (DIR handler 1: device-name path). +; RFS_DIRCMD1 — Debug wrapper for L58CA (DIR handler 1: device-name path). ; Outputs "1E\n" on port 050H as version/path marker, then original logic. ; =========================================================================== -DBG_DIRCMD1: + ENDIF ; (Glass: label must be outside IF) +RFS_DIRCMD1: + IF BUILD_RFS = 1 LD A,'1' ; DIR path 1 marker - OUT (050H),A LD A,'M' ; Version letter M - OUT (050H),A - CALL DBG_CRLF CALL L593A ; Original: parse device name RST 018H DB 03AH ; SVC #3A: list directory RET ; =========================================================================== -; DBG_DIRCMD2 — Debug wrapper for L58D0 (DIR handler 2: string-expr path). +; RFS_DIRCMD2 — Debug wrapper for L58D0 (DIR handler 2: string-expr path). ; Outputs "2E\n" on port 050H as version/path marker, then original logic. ; =========================================================================== -DBG_DIRCMD2: + ENDIF ; (Glass: label must be outside IF) +RFS_DIRCMD2: + IF BUILD_RFS = 1 LD A,'2' ; DIR path 2 marker - OUT (050H),A LD A,'M' ; Version letter M - OUT (050H),A - CALL DBG_CRLF CALL L413E ; Original: check current char LD B,000H CALL NZ,L6E6F ; Evaluate string expression JP L58D8 ; Continue at PUSH HL / SVC #2C / SVC #3C ; =========================================================================== -; DBG_DIR — Debug wrapper replacing L596B for DIR SVC #2C. +; RFS_DIR_OPEN — Debug wrapper replacing L596B for DIR SVC #2C. ; Outputs trace info on port 050H, then performs the original SVC call and ; error check. Format: ; D:BB NAMESTR... (before SVC: B=count, name from DE) ; K:xx xx xx xx xx xx (after SVC: KEYBUF[0..5]) ; =HHHH:VV (after SVC: HL pointer and (HL) value) ; =========================================================================== -DBG_DIR: + ENDIF ; (Glass: label must be outside IF) +RFS_DIR_OPEN: + IF BUILD_RFS = 1 PUSH AF ; --- Before SVC: output "D:" + B (hex) + space + name string --- - LD A,'D' - OUT (050H),A - LD A,':' - OUT (050H),A LD A,B - CALL DBG_HEX - LD A,' ' - OUT (050H),A ; Output the name (B chars from DE) PUSH BC PUSH DE LD A,B OR A - JR Z,DBG_NN -DBG_NLP: LD A,(DE) - OUT (050H),A + JR Z,RFS_NN +RFS_NLP: LD A,(DE) INC DE - DJNZ DBG_NLP -DBG_NN: POP DE + DJNZ RFS_NLP +RFS_NN: POP DE POP BC - CALL DBG_CRLF POP AF ; --- Call SVC #2C (original L596B logic) --- PUSH HL @@ -19599,32 +19390,16 @@ DBG_NN: POP DE PUSH BC PUSH DE PUSH HL ; save SVC result HL - LD A,'K' - OUT (050H),A - LD A,':' - OUT (050H),A LD HL,KEYBUF LD B,008H -DBG_KLP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A +RFS_KLP: LD A,(HL) INC HL - DJNZ DBG_KLP - CALL DBG_CRLF + DJNZ RFS_KLP POP HL ; restore SVC result HL ; --- Output "=" + HL (4 hex) + ":" + (HL) (2 hex) --- - LD A,'=' - OUT (050H),A LD A,H - CALL DBG_HEX LD A,L - CALL DBG_HEX - LD A,':' - OUT (050H),A LD A,(HL) - CALL DBG_HEX - CALL DBG_CRLF POP DE POP BC POP AF @@ -19636,40 +19411,42 @@ DBG_KLP: LD A,(HL) RET ; ; --------------------------------------------------------------------------- -; DBG_HEX — Output A as 2 hex ASCII digits to port 050H. +; RFS_HEX — Output A as 2 hex ASCII digits to port 050H. ; Preserves BC, DE, HL. ; --------------------------------------------------------------------------- -DBG_HEX: PUSH AF + ENDIF ; (Glass: label outside IF) +RFS_HEX: + IF BUILD_RFS = 1 + PUSH AF RRCA RRCA RRCA RRCA AND 00FH - CALL DBG_NIB + CALL RFS_NIB POP AF AND 00FH -DBG_NIB: CP 00AH - JR C,DBG_DIG +RFS_NIB: CP 00AH + JR C,RFS_DIG ADD A,037H ; 'A'..'F' - OUT (050H),A RET -DBG_DIG: ADD A,030H ; '0'..'9' - OUT (050H),A +RFS_DIG: ADD A,030H ; '0'..'9' RET ; ; --------------------------------------------------------------------------- -; DBG_CRLF — Output CR+LF to port 050H. Preserves all registers. +; RFS_CRLF — Output CR+LF to port 050H. Preserves all registers. ; --------------------------------------------------------------------------- -DBG_CRLF: PUSH AF + ENDIF ; (Glass: label outside IF) +RFS_CRLF: + IF BUILD_RFS = 1 + PUSH AF LD A,00DH ; CR - OUT (050H),A LD A,00AH ; LF - OUT (050H),A POP AF RET ; =========================================================================== -; DBG_DIR3 — Debug wrapper for L5CE3 (the real DIR command handler). +; RFS_DIR3 — Debug wrapper for L5CE3 (the real DIR command handler). ; Replicates the full DIR flow with debug markers around each SVC call. ; Output format on port 050H: ; D3:E (entry marker + version) @@ -19682,33 +19459,15 @@ DBG_CRLF: PUSH AF ; 39b:AA (SVC #39 with A=orig done) ; D3:X (exit marker) ; =========================================================================== -DBG_DIR3: + ENDIF ; (Glass: label must be outside IF) +RFS_DIR3: + IF BUILD_RFS = 1 ; --- Entry marker --- - LD A,'D' - OUT (050H),A - LD A,'3' - OUT (050H),A - LD A,':' - OUT (050H),A LD A,'M' ; Version M - OUT (050H),A - CALL DBG_CRLF ; --- Call L5882 (original first instruction) --- CALL L5882 ; --- Debug: show L5882 result --- PUSH AF - PUSH AF - LD A,'8' - OUT (050H),A - LD A,'2' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show A from L5882 - CALL DBG_CRLF - POP AF ; --- PUSH AF (as original) --- ; AF is already on stack from our PUSH above ; --- SVC #2E --- @@ -19716,139 +19475,58 @@ DBG_DIR3: DB 02EH ; --- Debug: show SVC #2E result --- PUSH AF ; save flags from SVC #2E - PUSH AF - LD A,'2' - OUT (050H),A - LD A,'E' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show A from SVC #2E - LD A,' ' - OUT (050H),A - LD A,'C' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - JR C,DBG_D3_CY1 + JR C,RFS_D3_CY1 LD A,'0' - JR DBG_D3_CY1D -DBG_D3_CY1: + JR RFS_D3_CY1D +RFS_D3_CY1: LD A,'1' -DBG_D3_CY1D: - OUT (050H),A - CALL DBG_CRLF +RFS_D3_CY1D: POP AF ; restore flags from SVC #2E ; --- JP C,L57B4 (error 0x2C on carry) --- JP C,L57B4 ; --- BIT 1,A / JP Z,057B7H --- - PUSH AF - LD A,'B' - OUT (050H),A - LD A,'1' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF BIT 1,A PUSH AF - JR Z,DBG_D3_B0 + JR Z,RFS_D3_B0 LD A,'1' - JR DBG_D3_B1D -DBG_D3_B0: + JR RFS_D3_B1D +RFS_D3_B0: LD A,'0' -DBG_D3_B1D: - OUT (050H),A - CALL DBG_CRLF +RFS_D3_B1D: POP AF JP Z,057B7H ; error 0xBB if bit1=0 ; --- CALL L58C2 (check ZLOG) --- CALL L58C2 - LD A,'C' - OUT (050H),A - LD A,'2' - OUT (050H),A - LD A,':' - OUT (050H),A LD A,'K' ; OK - OUT (050H),A - CALL DBG_CRLF ; --- CALL L593A (parse device name) --- CALL L593A ; --- Debug: show L593A result (channel in A) --- - PUSH AF - LD A,'3' - OUT (050H),A - LD A,'A' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show channel - CALL DBG_CRLF - POP AF ; --- LD B,A / XOR A / SVC #39 (A=0) --- LD B,A ; ; Debug V1.1J: dump ZINP pointer and ZFLAG1 before SVC #39 PUSH BC LD A,'I' ; "IP=" marker for ZINP - OUT (050H),A - LD A,'P' - OUT (050H),A - LD A,'=' - OUT (050H),A LD A,(ZINP+1) ; High byte of ZINP pointer - CALL DBG_HEX LD A,(ZINP) ; Low byte of ZINP pointer - CALL DBG_HEX - LD A,' ' - OUT (050H),A LD A,'F' ; "F1=" marker for ZFLAG1 - OUT (050H),A - LD A,'1' - OUT (050H),A - LD A,'=' - OUT (050H),A LD A,(ZFLAG1) - CALL DBG_HEX - CALL DBG_CRLF POP BC ; ; Debug V1.1K: dump first 4 bytes at RFSINP_DIR (runtime) and 0x2000 PUSH HL PUSH BC - LD A,'R' - OUT (050H),A - LD A,'@' - OUT (050H),A LD HL,RFSINP_DIR ; Point to RFSINP_DIR code in memory LD B,004H -DBG_RDMP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A +RFS_RDMP: LD A,(HL) INC HL - DJNZ DBG_RDMP - CALL DBG_CRLF + DJNZ RFS_RDMP ; Also dump first 4 bytes of DIR buffer at 0x2000 - LD A,'B' - OUT (050H),A - LD A,'@' - OUT (050H),A LD HL,L2000 LD B,004H -DBG_BDMP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A +RFS_BDMP: LD A,(HL) INC HL - DJNZ DBG_BDMP - CALL DBG_CRLF + DJNZ RFS_BDMP POP BC POP HL ; @@ -19856,15 +19534,6 @@ DBG_BDMP: LD A,(HL) ; ALL devices, causing 20s delay + empty DIR for non-RFS devices) ; XOR A - LD A,'S' - OUT (050H),A - LD A,'9' - OUT (050H),A - LD A,'a' - OUT (050H),A - LD A,':' - OUT (050H),A - CALL DBG_CRLF XOR A ; A=0 again (debug output clobbered it) RST 018H DB 039H @@ -19872,149 +19541,45 @@ DBG_BDMP: LD A,(HL) PUSH AF PUSH HL PUSH BC - LD A,'B' - OUT (050H),A - LD A,'=' - OUT (050H),A LD HL,L2000 LD B,004H -DBG_BDMP2: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A +RFS_BDMP2: LD A,(HL) INC HL - DJNZ DBG_BDMP2 - CALL DBG_CRLF + DJNZ RFS_BDMP2 POP BC POP HL POP AF ; --- original after-SVC debug --- - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'9' - OUT (050H),A - LD A,'a' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show A result - LD A,' ' - OUT (050H),A - LD A,'C' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - JR C,DBG_D3_CY2 + JR C,RFS_D3_CY2 LD A,'0' - JR DBG_D3_CY2D -DBG_D3_CY2: + JR RFS_D3_CY2D +RFS_D3_CY2: LD A,'1' -DBG_D3_CY2D: - OUT (050H),A - CALL DBG_CRLF +RFS_D3_CY2D: ; --- LD A,B / SVC #3A (A=channel) --- LD A,B - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'A' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show channel being sent - CALL DBG_CRLF - POP AF RST 018H DB 03AH ; --- Debug: after SVC #3A --- - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'A' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX - LD A,' ' - OUT (050H),A - LD A,'C' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - JR C,DBG_D3_CY3 + JR C,RFS_D3_CY3 LD A,'0' - JR DBG_D3_CY3D -DBG_D3_CY3: + JR RFS_D3_CY3D +RFS_D3_CY3: LD A,'1' -DBG_D3_CY3D: - OUT (050H),A - CALL DBG_CRLF +RFS_D3_CY3D: ; --- POP AF / SVC #39 (A=original from L5882) --- POP AF PUSH AF - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'9' - OUT (050H),A - LD A,'b' - OUT (050H),A - LD A,':' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX ; show original A being sent - CALL DBG_CRLF - POP AF RST 018H DB 039H ; --- Debug: after final SVC #39 --- - PUSH AF - LD A,'S' - OUT (050H),A - LD A,'9' - OUT (050H),A - LD A,'b' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - PUSH AF - CALL DBG_HEX - LD A,' ' - OUT (050H),A - LD A,'C' - OUT (050H),A - LD A,'=' - OUT (050H),A - POP AF - JR C,DBG_D3_CY4 + JR C,RFS_D3_CY4 LD A,'0' - JR DBG_D3_CY4D -DBG_D3_CY4: + JR RFS_D3_CY4D +RFS_D3_CY4: LD A,'1' -DBG_D3_CY4D: - OUT (050H),A - CALL DBG_CRLF +RFS_D3_CY4D: ; --- Exit marker --- - LD A,'D' - OUT (050H),A - LD A,'3' - OUT (050H),A - LD A,':' - OUT (050H),A - LD A,'X' - OUT (050H),A - CALL DBG_CRLF ; --- Clean up and return --- POP AF ; balance the PUSH AF from after L5882 RET @@ -20022,30 +19587,36 @@ DBG_D3_CY4D: ; =========================================================================== ; Data area ; =========================================================================== -SDSTARTSEC: DS 4, 000H ; Current sector address for SD_READ (big-endian) -DIRSECBUF: DB 0FFH ; Cached directory sector number (0xFF = none) + ENDIF ; (Glass: label outside IF) +SDSTARTSEC: + IF BUILD_RFS = 1 + DS 4, 000H ; Current sector address for SD_READ (big-endian) + ENDIF ; (Glass: label outside IF) +DIRSECBUF: + IF BUILD_RFS = 1 + DB 0FFH ; Cached directory sector number (0xFF = none) + ENDIF ; (Glass: label outside IF) FILE_STARTSEC: + IF BUILD_RFS = 1 DS 4, 000H ; Saved file start sector (absolute, big-endian) + ENDIF ; (Glass: label outside IF) FILE_LOADADDR: + IF BUILD_RFS = 1 + DW 00000H ; Current load address during LOAD transfer ; =========================================================================== -; DBG_L1C5B_WRAP — Wrapper around CALL L1C5B to dump ZFLAG1 before and after. +; RFS_L1C5B_WRAP — Wrapper around CALL L1C5B to dump ZFLAG1 before and after. ; This reveals whether L1C5B modifies ZFLAG1 (specifically bit 5). ; Output format: "F1:xx>xx\r\n" where xx=before, xx=after ; =========================================================================== -DBG_L1C5B_WRAP: + ENDIF ; (Glass: label must be outside IF) +RFS_L1C5B_WRAP: + IF BUILD_RFS = 1 PUSH AF PUSH HL ; --- Print "F1:" --- - LD A,'F' - OUT (050H),A - LD A,'1' - OUT (050H),A - LD A,':' - OUT (050H),A ; --- Dump ZFLAG1 before --- LD A,(ZFLAG1) - CALL DBG_HEX POP HL POP AF ; --- Call the real L1C5B --- @@ -20054,57 +19625,48 @@ DBG_L1C5B_WRAP: PUSH AF PUSH HL ; --- Print ">" --- - LD A,'>' - OUT (050H),A ; --- Dump ZFLAG1 after --- LD A,(ZFLAG1) - CALL DBG_HEX - CALL DBG_CRLF POP HL POP AF RET ; =========================================================================== -; DBG_FLAGS_TEST — Replaces the LD HL,ZFLAG1 / BIT 7 / BIT 5 sequence. +; RFS_FLAGS_TEST — Replaces the LD HL,ZFLAG1 / BIT 7 / BIT 5 sequence. ; V1.1Q: Workaround for suspected Z80 emulator bug where AND immediate ; does not correctly set the Z flag (0x5F AND 0x20 = 0x20 yet Z is set). ; Instead of testing ZFLAG1 bit 5, check device name for "$RFS" and force ; the ZINP path directly. This is safe because this code point is only ; reached when A=0 (DIR enumeration) in SVC #39. ; =========================================================================== -DBG_FLAGS_TEST: + ENDIF ; (Glass: label must be outside IF) +RFS_FLAGS_TEST: + IF BUILD_RFS = 1 LD HL,ZFLAG1 ; --- Check bit 7 first (error condition, applies to all devices) --- LD A,(HL) AND 080H - JR Z,DBG_FT_NO7 + JR Z,RFS_FT_NO7 POP DE ; discard CALL return address JP 01F97H -DBG_FT_NO7: +RFS_FT_NO7: ; --- Check if this is the $RFS device by name --- LD A,(ZDEVNM) ; first char of device name CP 'R' - JR NZ,DBG_FT_NORFS + JR NZ,RFS_FT_NORFS LD A,(ZDEVNM+1) ; second char CP 'F' - JR NZ,DBG_FT_NORFS + JR NZ,RFS_FT_NORFS ; --- This IS $RFS — force ZINP/DIR path --- - PUSH AF - LD A,'R' - OUT (050H),A - LD A,'!' - OUT (050H),A - CALL DBG_CRLF - POP AF POP DE ; discard CALL return address - JP DBG_BIT5PATH -DBG_FT_NORFS: + JP RFS_BIT5PATH_DIR +RFS_FT_NORFS: ; --- Not $RFS: fall through to ZRO path --- ; HL = ZFLAG1 (correct for INC HL that follows the NOPs) RET ; =========================================================================== -; DBG_BIT5PATH — Replacement for the SVC #39 bit-5 path at 0x2F38. +; RFS_BIT5PATH_DIR — Replacement for the SVC #39 bit-5 path at 0x2F38. ; Instead of calling through L2FD1 → IOCALL, this calls RFSINP_DIR directly ; to bypass the broken IOCALL dispatch. Also traces the path. ; Original bit-5 path: XOR A / LD HL,L2000 / LD DE,800 / LD BC,10 / CALL L2FD1 @@ -20113,15 +19675,8 @@ DBG_FT_NORFS: ; 2nd: L2FD4 → DIR fill (H=0x20) ; We replicate both calls directly to RFSINP_DIR. ; =========================================================================== -DBG_BIT5PATH: +RFS_BIT5PATH_DIR: ; --- Marker --- - LD A,'B' - OUT (050H),A - LD A,'5' - OUT (050H),A - LD A,':' - OUT (050H),A - CALL DBG_CRLF ; ; --- 1st ZINP call: disk identity (H=0x28) --- LD HL,02800H ; H=0x28 → DISKID path @@ -20136,21 +19691,11 @@ DBG_BIT5PATH: ; --- After both calls, check DIR buffer --- PUSH HL PUSH BC - LD A,'D' - OUT (050H),A - LD A,'R' - OUT (050H),A - LD A,'=' - OUT (050H),A LD HL,L2000 LD B,008H -DBG_B5DMP: LD A,(HL) - CALL DBG_HEX - LD A,' ' - OUT (050H),A +RFS_B5DMP: LD A,(HL) INC HL - DJNZ DBG_B5DMP - CALL DBG_CRLF + DJNZ RFS_B5DMP POP BC POP HL ; @@ -20170,17 +19715,73 @@ DBG_B5DMP: LD A,(HL) ; Return — will go through SKPDE cleanup from SVC #39 handler RET -FILE_SIZE: DW 00000H ; Remaining bytes during LOAD transfer -RFS_LD_A0: DB 000H ; V1.1Y: Entry A for RFSINP_LD (0=SVC #30, else SVC #33) -DIR_BUFPTR: DW 00000H ; Current write position in DIR buffer -FINDSD_NAME:DW 00000H ; Saved filename pointer for FINDSD -SAVE_DIRENT:DB 000H ; Saved directory entry number for SAVE -SAVE_PENDING:DB 000H ; 1 = SAVE in progress, trigger RFSWO on first RFSOUT call -DIR_FILLED: DB 000H ; 1 = DIR buffer filled, next ZINP call is data transfer -SAVE_SP: DW 00000H ; Saved BASIC stack pointer -DIR_ENTRY_IDX: DB 000H ; Current SD directory entry index for RFSRO (0-255) -SECTORBUF: DS 512, 000H ; SD card sector buffer (was EQU 0CE00H, moved here + ENDIF ; (Glass: label outside IF) +FILE_SIZE: + IF BUILD_RFS = 1 + DW 00000H ; Remaining bytes during LOAD transfer + ENDIF ; (Glass: label outside IF) +RFS_LD_A0: + IF BUILD_RFS = 1 + DB 000H ; V1.1Y: Entry A for RFSINP_LD (0=SVC #30, else SVC #33) + ENDIF ; (Glass: label outside IF) +DIR_BUFPTR: + IF BUILD_RFS = 1 + DW 00000H ; Current write position in DIR buffer + ENDIF ; (Glass: label outside IF) +FINDSD_NAME: + IF BUILD_RFS = 1 + DW 00000H ; Saved filename pointer for FINDSD + ENDIF ; (Glass: label outside IF) +SAVE_DIRENT: + IF BUILD_RFS = 1 + DB 000H ; Saved directory entry number for SAVE + ENDIF ; (Glass: label outside IF) +SAVE_PENDING: + IF BUILD_RFS = 1 + DB 000H ; 1 = SAVE in progress, trigger RFSWO on first RFSOUT call + ENDIF ; (Glass: label outside IF) +DIR_FILLED: + IF BUILD_RFS = 1 + DB 000H ; 1 = DIR buffer filled, next ZINP call is data transfer + ENDIF ; (Glass: label outside IF) +SAVE_SP: + IF BUILD_RFS = 1 + DW 00000H ; Saved BASIC stack pointer + ENDIF ; (Glass: label outside IF) +DIR_ENTRY_IDX: + IF BUILD_RFS = 1 + DB 000H ; Current SD directory entry index for RFSRO (0-255) + ENDIF ; (Glass: label outside IF) +SECTORBUF: + IF BUILD_RFS = 1 + DS 512, 000H ; SD card sector buffer (was EQU 0CE00H, moved here ; to avoid overlap with BASIC stack at ~0xCFFF) DS 128, 000H ; Temp stack (64 levels) + ENDIF ; (Glass: labels must be outside IF) TEMP_STACK_TOP: ; SP points here (grows downward) RFS_END EQU TEMP_STACK_TOP ; End of RFS code = new TEXTST + IF BUILD_RFS = 1 + + ENDIF ; END BUILD_RFS = 1 + +; =========================================================================== +; Tape/CMT bootstrap (only for BUILD_TAPE=1) +; This code loads at TAPECOPY (0x1200) and copies the BASIC ROM to 0x0000, +; then jumps to the cold start entry point. +; =========================================================================== + IF BUILD_TAPE = 1 +EXECSTART: XOR A ; Execution entry point (runs at TAPECOPY+offset) + LD DE,L0000 + CALL TIMST ; Stop timer + LD DE,L0000 ; Destination: 0x0000 + LD HL,BASICEND - L0000 ; Size of BASIC ROM + OR A + SBC HL,DE + LD C,L + LD B,H ; BC = byte count + LD HL,TAPECOPY ; Source: where tape loaded the image + OUT (LSE0),A ; Map 0000-0FFF to DRAM + LDIR ; Copy BASIC ROM to 0x0000 + JP L0000 ; Jump to cold start +BASICEND: + ENDIF diff --git a/tools/MZQD/MZQDTool b/tools/MZQD/MZQDTool new file mode 100755 index 0000000000000000000000000000000000000000..eaa207753872b77ae42528fe0dc98342e875ef42 GIT binary patch literal 17320 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 literal 0 HcmV?d00001 diff --git a/tools/MZQD/MZQDTool.c b/tools/MZQD/MZQDTool.c new file mode 100755 index 0000000..fd30ca4 --- /dev/null +++ b/tools/MZQD/MZQDTool.c @@ -0,0 +1,366 @@ +/* ========================================================================= + * MZQDTool — Sharp MZ-700 Quick Disk (QD) image tool + * + * Creates and manages QD disk images for the MZ-700 Quick Disk system. + * Supports format, directory listing, and adding MZF files to QD images. + * + * Original V0.30 (c) 2002 by BKK + * Updated V1.00 (c) 2026 Philip Smart — rewritten with configurable disk + * name, fixed file ordering, correct CMT→QD header conversion, + * and robust error handling. + * + * QD disk image format (61455 bytes): + * + * Disk header: + * [00] [16 16] [A5] [block_count] [CRC: 43 52 43] + * + * Per file (2 blocks each: header + data): + * + * Header block: + * [00] [16 16] [A5] [00] [size_lo=40] [size_hi=00] + * [64 bytes: QDHeaderStr] + * [CRC: 43 52 43] + * + * Data block: + * [00] [16 16] [A5] [05] [size_lo] [size_hi] + * [file data] + * [CRC: 43 52 43] + * + * Usage: + * MZQDTool format [-o disk.qd] + * MZQDTool dir [-o disk.qd] + * MZQDTool add [-o disk.qd] + * ========================================================================= */ + +#define VERSION "1.00" + +#include +#include +#include +#include + +#define QDSIZE 61455 +#define MAXQDFILETYPES 12 +#define DEFAULTQDFILE "MZ700.qd" +#define CMTHDRSIZE 128 /* MZF/CMT file header size */ +#define QDHDRSIZE 64 /* QD file header size */ + +/* MZF/CMT tape file header (128 bytes) */ +struct CMTHeaderStr { + uint8_t Attribute; /* File type: 01=OBJ, 02=BTX, etc. */ + char Name[17]; /* Filename (CR-terminated, null-padded) */ + uint16_t Size; /* Data size (0 = use actual file size) */ + uint16_t LoadAddress; /* Load address (DTADR) */ + uint16_t ExecAddress; /* Execution address (EXADR) */ + char Comment[104]; /* Comment area */ +}; + +/* QD file header (64 bytes, stored in header block) */ +struct QDHeaderStr { + uint8_t Attribute; /* File type: 01=OBJ, 02=BTX, etc. */ + char Name[17]; /* Filename (CR-terminated, null-padded) */ + uint16_t Unknown; /* Reserved (usually 0) */ + uint16_t Size; /* Data size in bytes */ + uint16_t LoadAddress; /* Load address */ + uint16_t ExecAddress; /* Execution address */ + char Comment[38]; /* Comment (truncated from CMT's 104) */ +}; + +static const char *QDFileTypes[MAXQDFILETYPES] = { + "???", "OBJ", "BTX", "BSD", "BRD", "RB ", + "???", "LIB", "???", "???", "SYS", "GR " +}; + +static uint8_t QDArray[QDSIZE]; +static char qdFileName[256] = DEFAULTQDFILE; + +/* ------- Low-level QD block I/O helpers ------- */ + +static void write_sync(uint16_t *ptr) +{ + QDArray[(*ptr)++] = 0x00; /* BREAK */ + QDArray[(*ptr)++] = 0x16; /* SYNC */ + QDArray[(*ptr)++] = 0x16; /* SYNC */ + QDArray[(*ptr)++] = 0xA5; /* SHARP SYNC */ +} + +static void write_crc(uint16_t *ptr) +{ + QDArray[(*ptr)++] = 'C'; + QDArray[(*ptr)++] = 'R'; + QDArray[(*ptr)++] = 'C'; +} + +static int save_qd(void) +{ + FILE *f = fopen(qdFileName, "wb"); + if (!f) { + fprintf(stderr, "ERROR: Cannot write '%s'\n", qdFileName); + return 0; + } + fwrite(QDArray, QDSIZE, 1, f); + fclose(f); + return 1; +} + +static int load_qd(void) +{ + FILE *f = fopen(qdFileName, "rb"); + if (!f) { + fprintf(stderr, "ERROR: Cannot open '%s'\n", qdFileName); + return 0; + } + fread(QDArray, QDSIZE, 1, f); + fclose(f); + return 1; +} + +/* ------- Commands ------- */ + +/* Format: create an empty QD image with 0 files */ +static void QDFormat(void) +{ + uint16_t ptr = 0; + + printf("Formatting '%s' (%d bytes)\n", qdFileName, QDSIZE); + memset(QDArray, 0x00, QDSIZE); + + /* Disk header: sync + block_count(0) + CRC */ + write_sync(&ptr); + QDArray[ptr++] = 0x00; /* 0 blocks */ + write_crc(&ptr); + + if (!save_qd()) exit(1); + puts("Done."); +} + +/* Dir: list files on the QD */ +static void QDDir(void) +{ + uint16_t ptr, blockSize; + uint8_t blocks, i; + + if (!load_qd()) exit(1); + + /* Disk header: 4 sync bytes + block_count + 3 CRC */ + ptr = 4; + blocks = QDArray[ptr++]; + ptr += 3; /* skip CRC */ + + printf("Directory of '%s': %d block(s), %d file(s)\n\n", + qdFileName, blocks, blocks / 2); + + for (i = 0; i < blocks; i++) { + if (ptr + 7 >= QDSIZE) { + fprintf(stderr, "WARNING: Truncated QD image at block %d\n", i); + break; + } + ptr += 4; /* sync: 00 16 16 A5 */ + + uint8_t blockType = QDArray[ptr++]; + blockSize = QDArray[ptr] | (QDArray[ptr + 1] << 8); + ptr += 2; + + if (blockType == 0x00 && blockSize == QDHDRSIZE) { + /* File header block */ + struct QDHeaderStr *hdr = (struct QDHeaderStr *)&QDArray[ptr]; + uint8_t ft = hdr->Attribute; + if (ft >= MAXQDFILETYPES) ft = 0; + + /* Format name: stop at CR or end of field */ + char name[18]; + memcpy(name, hdr->Name, 17); + name[17] = '\0'; + for (int j = 0; j < 17; j++) { + if (name[j] == '\r' || name[j] == '\0') { name[j] = '\0'; break; } + } + + printf(" %-3s %-17s Size=%-6u Load=0x%04X Exec=0x%04X\n", + QDFileTypes[ft], name, hdr->Size, + hdr->LoadAddress, hdr->ExecAddress); + } else if (blockType == 0x05) { + /* Data block — skip silently */ + } else { + printf(" [block %d: type=0x%02X size=%u]\n", i, blockType, blockSize); + } + + ptr += blockSize; + ptr += 3; /* skip CRC */ + } + printf("\n%u bytes free\n", QDSIZE - ptr); +} + +/* Add: append an MZF file to the QD image */ +static void AddFileToQD(const char *mzfFileName) +{ + FILE *mzfFile; + uint16_t ptr, fileDataSize; + uint8_t blocks, i; + uint16_t blockSize; + struct CMTHeaderStr cmtHdr; + + if (!load_qd()) exit(1); + + /* Read block count and skip to end of existing data */ + ptr = 4; + blocks = QDArray[ptr]; + ptr = 5 + 3; /* past block_count + CRC */ + + for (i = 0; i < blocks; i++) { + ptr += 4; /* sync */ + ptr++; /* block type */ + blockSize = QDArray[ptr] | (QDArray[ptr + 1] << 8); + ptr += 2; + ptr += blockSize; + ptr += 3; /* CRC */ + } + + /* Open and read MZF file */ + mzfFile = fopen(mzfFileName, "rb"); + if (!mzfFile) { + fprintf(stderr, "ERROR: Cannot open '%s'\n", mzfFileName); + exit(1); + } + fseek(mzfFile, 0, SEEK_END); + long mzfTotalSize = ftell(mzfFile); + fseek(mzfFile, 0, SEEK_SET); + + if (mzfTotalSize < CMTHDRSIZE) { + fprintf(stderr, "ERROR: '%s' is too small for MZF format (%ld bytes)\n", + mzfFileName, mzfTotalSize); + fclose(mzfFile); + exit(1); + } + + fread(&cmtHdr, CMTHDRSIZE, 1, mzfFile); + fileDataSize = (uint16_t)(mzfTotalSize - CMTHDRSIZE); + + /* Check available space */ + uint32_t needed = (4+1+2+QDHDRSIZE+3) + (4+1+2+(uint32_t)fileDataSize+3); + if (ptr + needed > QDSIZE) { + fprintf(stderr, "ERROR: Not enough space (need %u, have %u)\n", + (unsigned)needed, QDSIZE - ptr); + fclose(mzfFile); + exit(1); + } + + /* ---- Write header block ---- */ + write_sync(&ptr); + QDArray[ptr++] = 0x00; /* block type: file header */ + QDArray[ptr++] = QDHDRSIZE; /* size low */ + QDArray[ptr++] = 0x00; /* size high */ + + struct QDHeaderStr *qdHdr = (struct QDHeaderStr *)&QDArray[ptr]; + memset(qdHdr, 0, QDHDRSIZE); + + /* Convert CMT header to QD header */ + qdHdr->Attribute = cmtHdr.Attribute; + if (qdHdr->Attribute == 0x05) + qdHdr->Attribute = 0x02; /* MZF tape type 05 → QD type 02 (BTX) */ + memcpy(qdHdr->Name, cmtHdr.Name, 17); + qdHdr->Unknown = 0; + + /* + * Size field handling: + * - If MZF Size > 0: use it directly (normal file) + * - If MZF Size == 0: use actual file data size (convention for + * ROM images where Size=0 means "whole file"). The QD header + * MUST have the real size — the QD loader uses it to determine + * how many bytes to read. + */ + if (cmtHdr.Size != 0) + qdHdr->Size = cmtHdr.Size; + else + qdHdr->Size = fileDataSize; + + qdHdr->LoadAddress = cmtHdr.LoadAddress; + qdHdr->ExecAddress = cmtHdr.ExecAddress; + memcpy(qdHdr->Comment, cmtHdr.Comment, 38); + + ptr += QDHDRSIZE; + write_crc(&ptr); + + /* ---- Write data block ---- */ + write_sync(&ptr); + QDArray[ptr++] = 0x05; /* block type: file data */ + QDArray[ptr++] = fileDataSize & 0xFF; + QDArray[ptr++] = (fileDataSize >> 8) & 0xFF; + fread(&QDArray[ptr], 1, fileDataSize, mzfFile); + ptr += fileDataSize; + write_crc(&ptr); + + fclose(mzfFile); + + /* Update block count (+2: one header block, one data block) */ + QDArray[4] = blocks + 2; + + /* Format name for display */ + char name[18]; + memcpy(name, cmtHdr.Name, 17); + name[17] = '\0'; + for (int j = 0; j < 17; j++) { + if (name[j] == '\r' || name[j] == '\0') { name[j] = '\0'; break; } + } + + printf(" Added: type=0x%02X name=\"%s\" size=%u load=0x%04X exec=0x%04X\n", + qdHdr->Attribute, name, qdHdr->Size, + qdHdr->LoadAddress, qdHdr->ExecAddress); + printf(" QD: %d blocks, %u bytes free\n", blocks + 2, QDSIZE - ptr); + + if (!save_qd()) exit(1); +} + +/* ------- Usage and main ------- */ + +static void usage(void) +{ + printf("Usage:\n"); + printf(" MZQDTool format [-o disk.qd] Format empty QD image\n"); + printf(" MZQDTool dir [-o disk.qd] List QD directory\n"); + printf(" MZQDTool add [-o disk.qd] Add MZF file to QD\n"); + printf("\n"); + printf("Options:\n"); + printf(" -o QD image file (default: %s)\n", DEFAULTQDFILE); + printf("\n"); +} + +int main(int argc, char *argv[]) +{ + printf("\nMZQDTool V%s (c) 2002 BKK, 2026 Philip Smart\n\n", VERSION); + + if (argc < 2) { + usage(); + return 1; + } + + /* Parse -o option from any position */ + for (int i = 1; i < argc - 1; i++) { + if (strcmp("-o", argv[i]) == 0) { + strncpy(qdFileName, argv[i + 1], sizeof(qdFileName) - 1); + qdFileName[sizeof(qdFileName) - 1] = '\0'; + /* Remove -o and its argument from argv for command parsing */ + for (int j = i; j < argc - 2; j++) + argv[j] = argv[j + 2]; + argc -= 2; + break; + } + } + + if (strcmp("format", argv[1]) == 0) { + QDFormat(); + } else if (strcmp("dir", argv[1]) == 0) { + QDDir(); + } else if (strcmp("add", argv[1]) == 0) { + if (argc < 3) { + fprintf(stderr, "ERROR: No MZF file specified\n"); + return 2; + } + AddFileToQD(argv[2]); + } else { + fprintf(stderr, "ERROR: Unknown command '%s'\n", argv[1]); + usage(); + return 1; + } + + return 0; +} diff --git a/tools/MZQD/Makefile b/tools/MZQD/Makefile new file mode 100644 index 0000000..8ffb0eb --- /dev/null +++ b/tools/MZQD/Makefile @@ -0,0 +1,19 @@ +# MZQDTool - Sharp MZ-700 Quick Disk image tool +# (c) 2002 BKK, 2026 Philip Smart +# +# Usage: +# make Build MZQDTool +# make clean Remove build artifacts + +CC = gcc +CFLAGS = -Wall -Wno-unused-result -O2 +TARGET = MZQDTool +SRC = MZQDTool.c + +$(TARGET): $(SRC) + $(CC) $(CFLAGS) -o $@ $< + +clean: + rm -f $(TARGET) + +.PHONY: clean diff --git a/tools/MZQD/side_a/AUTO RUN.mzf b/tools/MZQD/side_a/AUTO RUN.mzf new file mode 100644 index 0000000000000000000000000000000000000000..898f4fc5a256c21de96bea11c0126b18bcf9366b GIT binary patch literal 382 zcmb8rzYf7r6bA55TmPC!q}7Ol+}s%2)ojpk8-lhel`xyl9-zBN;2FGxmoXS5Hk|7c zD|c!0J73TJQq5225lhmr!rteOe~ykzwfFiU2N(vunMLG*bM?0^3?@$O=rYZ_a;iZk z`0a6Uoh+sW9&FUqT&MYDG@EmxmLh{l*5{OQ73Jj?5vEfa>nJOb4Mqu*v96*bQGb}U zU5+{eWhEIC0UL`Yv5i=9Sw^Ff?sc$IWD?E%g`lcvVEsZTW3n%GjQoKdG_k>sTc5xB NeOeYr0bA@T{{)zBL0JF* literal 0 HcmV?d00001 diff --git a/tools/MZQD/side_a/BASIC 5Z008A RFS.mzf b/tools/MZQD/side_a/BASIC 5Z008A RFS.mzf new file mode 100644 index 0000000000000000000000000000000000000000..12474c27aa5e0cde4a7eb8d33499b9c6c5d778a7 GIT binary patch literal 37210 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

@+*5JD5!TZoJS%INFeHlG#X9!B{98Lbs|+tF0; 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 K2L}E>G4Q_?&g9Gh literal 0 HcmV?d00001 diff --git a/tools/MZQD/side_a/BASIC 5Z008ADRFS.mzf b/tools/MZQD/side_a/BASIC 5Z008ADRFS.mzf new file mode 100644 index 0000000000000000000000000000000000000000..6157655eec0a8830051f12fc496cfc79b6866893 GIT binary patch literal 38045 zcmeFa2~=CxwKsmRgoKzSgzXF1a4&L_Ys4VS0fYkA%$UK*MtBM~c4B988auJm03I-I z$=H|H>69i-`}&%^G)dEkQzuoXx`2$sMZOL)#sMc(Rvi&1vJxu}*s;Uq|2vY&@ZNvD z^{sEc^{w@Ns{-BO4EyY}&p!L?v(G+9bXlprrku^Y*<`YmRy0=G;}-m!`ak$_cE>vZ zMd3WJa-LH;r(>K!m2)P>`Du(ZQ{kK+;p|m8T_)!VlQU_tGj*}kzS#M8l5tB1W#iV-gkpY0g-UM2Tda(8Z3 zP#=$<_4SWT`nV+e?0ERa$IT(nL3gir+$)~#uQD9wRoW{CMrqJa_nsA7466;~Vidbu z4cf27?nFJV9f=0L_KKL&8oEt(7;fJl6d&9^v`{p3$Si+Flv?PshYe?Y46{#$0fA;B zyE&ngo9djD*tnpRqJC3+UUg126H^|miFz?XNEnD2j2VrYi1`=AW6ECD?~)#lel)ru zx+>{`q$iTpN$VBf*mJR;#rl$-)9=vNseP0XXSzn_pG2*SIuLg*_5HL3>A|$(l-Eip69;(Tw)5c45ZpPaz_AvJZuc#@A=n|4RmU$UyQs71fYyl&AS)4$5R|7)_( zlAqkqqGmqsG5X;LP4vR;q?Q@w3UBZ%Q1^|DXRK6=bDgw9qA0g_$Wbuh?4(E3REmRF z=_A<7D!1s%Y(he*MD5O}ywblYEb-Q6>K7(Wpkn*=RI=aU75fqWgi?+h)G6gue)*)# zTC$nzt;;C~%UYS31WSsw0nbT6u2(JV_(<*}wVcSRr7INkPSB%d`mCEMd4@e6l;@c) z$U4jUOeV(lectDZVE#}rDa3h{LASS81PUFF0pkMeYU(Y^Bzc{0K!9}(^_FQ;1eVf8 zghqJ@wO~HNE{~zDyf6HsX^eD9?O@LOGVrCyvcwFL?WDo{H*q zFJRA(_{PS(?lJFJx8kl%?h&6O&{*je*foP6D~uhW#+z(ZK4sK?;c$Me=y0%#eAcMF zL|%&c_Ts_$5z_S$l7^O+sZqunRA{60Db)?WHB)DD@dfwBQ<_O>U4%es)LN-10*@{m z`-S!kS2Z8&TEix5idmnaX7s+1evXUL&5NOkU z_jz31=ssiZq<11K@*%fxB!s%xO@B#Xv;zVK0Ey%w1S*j?%O1d~E%%yR(Erz74=9Tm2W{xcrESz!CWo;V*#I>JI9;N;U@^pdv`bcateMS7j*BiGNRxIa+Iq}z;4&K=sY z=i!ID!lX(Ly2XdNJ1Fpqw37a~tWL*M{$v#&}MjnlyHzy2(O#pR)d#a&$ynJURQ&UT_3nkBYEH;VHS=W(ha>Q{aVfO zLpo|mZSKc&ul7q|)wH3*KrcoEC5qg;@98eRhe!aGevkMmZsTYunB@zk5pO!X8N_VLtK<)rlK$4$T=TnBJ4f-RsbUxC6 zUL+3W$!w+q&8w+hKPy_Z=NCmArKU(HdbWlR39@)$v3U(8{U}mka2Ej-lBHAaC9=dl zhyDCp@Q*60odtBaIX#NB*1~Y9Yru$V!~9)unWh$aH!}%{V&ZWLwVO#7YBthdCUv;E zGMXsTPD~swgf%P)Xkdcr+m=XDmXIx6$D9^Eg)69DIWG1C5WsyiR&r<7MWB9>e^!aW2JVBRWR>+6S5f5?e=l`Ysucl~Hni8ckANuaR4$o&pIK9W+M`diFIEu+wjq42=%~ZF!0mRqP zDSF3%O;+*gvYJmhRVt^L;si9drk%T_0TVa0doVV!W26z7;eUJjU!VEuOHcml`R*5A zKXlOX+u!}>xnKVKAD{j8Uw;o(WyEK0iVD~pqqxX3gs)%Czu%bOlmCJ-Uy)BCEWgv( zvYP980m!l!IMtc_seB^%ylxDENFPd(UxGBohAM>j?>fXPbv-X2hqWmRnRJ_)BtIUS z8>3t)uGGooaDZ)*KiJ+o>ENyw1fSa)$ek*x>*H%7 zKl#yCgnTcVk{`Vm^4RX?^&47ppNJ`MY@!~U)r^UP^-|1hF-Kykgt{_{+W*}M677i< zI!90Mr9JaR4L1{GJ)m{)N)FoM$B^fu5I1RkLhE3aLB<$#3JG7o-4b->B#;qxFoq$L z2U$}b1JIfD%q4+^__q-Si(ia!$FzuaYltj4iPu20ippF~-Msg$6HDXTxu3*7xE*?5 zM-d-cJh(JY+7wF$sus1AQWF?*91qn`O+XE_L-jJt^DHLlZ<+EY3ooV8QJuSw{^-4T zzq&fZC(A#z=t^3i_%ui^c+k?3xJW7s9gV9u&_gI~$smvYP zY>Uz_;=ZVzZP+i+{sX70jmmsZT26SLk6%FU*D7I&PS7{t0<{( zzLnCx-uIhyk&xE<3+(`D>~PY5UjGLua4ENb#eeFD6m>&Fa)R^4ICLuM#e{D2FSH_e zKnppj1*=z+hGqjTHT@m$-)`|?EG8w21%iefKnKP6p8 zI+`GqI)6a_4^Zs8ATa0u&gZ`?p$)?AJBi5)>DAx)&=flSe+T9}ssG=5`Rto2(GjX| zUjF&?|3`ty##Ie0%aWlY^ikE<*qhjEFSw~nS2fwb^{#HLY*@AYn}CRln#OP5kiL9b z<3b)8uYEKXl~rtA<+|CRh;my)(`+Q}YJ2JGN|yaPL|tzyt@zga*AZVoNTYf_Ue;Pz zxs%V3d-yaaR#x(fP&^?T__&M1|B&8@89sAW6fTHIMe$ULC|@w$An)WqBRQkx63B>7 zemh~b zMpp-IQOMPSJkoP|TTp}{OsBm;%1Y9mQ_~b+3EMl&J4c?DdMmOcBu`uOvgw zI5^O)rl(Bqv#o}+Bcim0UdU(aC<>;oQzkij$l$y6?nM^;B8xWJ61T__4fQ|S65;nU ze-{)GLrB>nJ&`nO@Gr7_y2yg-xkVP=gWLVgIg)+p5D}A0M~_BB%TJQo9$XzTqj@zSZpV$X+TB&QAQ_M$ep!$EVo}*zdrhv2`r#P;p&yh0c=$XlheYop> zJI|vMM|4Z(Bzj=Tf?2V-LaWz%=Am3`mGU*iqi6$rm<30V`J$$7CiVL^{SeN%5bXAYMXsk8LMijv^Ui>yi;Xs%xqU5uC6@R*@^1gn<|&HHAkvcjit+h zVTclqtB$Wwl{TVQo!359s+#&rw!zlKR@qiH99f3giZ!K;{iUjU0IgWZR<5nFpZxmG zwxaTQg9@q1L+2V5Kvl9~Oiu!0D2n78Yf{;4?DEovb!-(17_Ly&*z3L~IFf~eSvyGF z57K~q%S%s&^3>bV63Elv*;%2gT%E%Na!UpFNIO`^XOu-sPB-)U2= z0*+`40IFBns%y&8@(?;@l_#KUSiiw@wiJ>Jh^zo3G?kXsqr_#E<#nummBgwl8yjtn zU(1gF`3EOeVlC6kk6hC!r4&Zu7--Z`ILox;2CX8blXA-#KEbt-%VSv0c;-f}RH+c# z90Mt2CZS>`k!-r9WO{XJW(4#%y1!RFWWL zpgD>Wr@F^8*M(4$luXZv?m3;bRS~ckCA)_pC}37jVKPg!23LnqO%)u|Cwo88B)cc2 zIn13fJ?B$FujrDwm0H*B1J2*20|ajf*ZI+8-tJn%ElOtV$1^vC3J{ihlmhEfdT!)G z;?BVb;wevlMp3c|v(^?mgVn>BY>+c}RiZwExrm@Fhlrpz5STSU!amQ~os6^;H7duE z0QL*#1L@xoFig5vlSikwHB8@bL-h*=2vs}uVPcA)UtfLZR5zjAqU6yI!}IwwMW9}f zFEfrIq%p?8GIYgzukpT+jLc4vAA#)4OOYRimbz#(qeQDK)6yDP#xkN9-?UdpX{Dz5 zzRU`(u2xGgK)4r%&8Uo+5VWX_IL2BI0Vh79gbIhxql&O1N5pBHBV_dA+F}?bD6;oe zJ};vyMarfF_J$NRgda-)k%!q24UncC2H6@<@o}dX%TcBiHuB24&LUSklj!x4*TJ8s zJJ_krty=3{+KdXV&s_C2O4UTjM!tUf=jm;3GSi|xS$<5T)agz8H9Vc{ zCy6q_`=FDbyGE#hJ&GBb_M#wAiqlfbggD5X4C0XX*k=r7$IQ)T8_!&$Wn)4d#7B>3 zuF@ixvr-}bI?nl4GHGXyqNg*;w76@Lm)m7zm0aO`^dxmB(8P>S#8+00S`)Psov#l# ze?z##!IwyfNF6*mqu^(7?*cZ%wXcoWI>yo6(3`?tfPq~gjv!+@@>7OUO6QG1kCD(z zO~wDXz2CFw=Wx@-G@ zrW#fHoy#`hMB{t6iexxBUmFov z_4SfKcgV4@r^KRu?h!q=IE_|PQN`?6frI{OS7H^f$j>ww@-qz69W-XC>egw4fw_qH za1jFK$??qd6nGNEI4H+Z1Bga~@rPGV5>o%8Z$GQ8`0y}r4NgL;b()N)2gkFYvSr`ulv9`5BvV8vX=sB!1wvA-OF7(wJC=y19HJp!+vebtQuHbZH0ccfbI6US(_0O3 z>^W4S-7x@y#xa+`a5v@^3>-G_nh~&EvYWYJz!EG3$D&bVm9fFtv_Yv<_DA_DmctO_ z2$aFZ960EPIKt57_ar-D>=_x+>-C8BC;Ly|lkVdvxiHXZDah>5UUwZHa=gAk-Tl|{ zDg&>(TMau6I}ASk2-X8qVYa>OhMt)0b;DL9C^P!;DkSO z!XZw0l@ng$guiftgA=Tr@D?Y$%?W?yguih`C7f^sO0%^m-JzzA{2^6(JYTwEku=#@ zbr133KQI5Jz&|PQPYV2#0{^7IKPm7}3jC7-|H~8z*j0;Q`=BXGM^mmf$A)q+hwiw~ zX6U%L8k24vMLXZkh0cf>*VnUMHH(E)3q9SD=;+&*E_oK27EJF}!7NV99YR85>fVXY?Yk#BHzHsZ z!EhJ?I*TeIkh8<^mt%%ZgZ2`s5Q*~Xw3IZILo5mea5og}V)n{)C`ZsvO7G?dl~~{x z!-eg6tzbZ>nDHfBh&^EX`$^OH&v7G{afflI^hl;7G*9j!RGw~4GvJaA(}g(QkTzYF z-uBAi19&CaJBM=NU+Ehe0e#(;bkKh!Oh>;PgzQd~b}Uk}-65;aVMfzk9eR>s83;5d zX#;g>T4^YkOpZRuB-3nXWY&l@l#MzB%G0#=G|G!+b+CCO(pIBD9b0L1BO%gF%}6Va zQf3aOSo!-gf67eKhHH?ShKIE2`_r8Txjtm-dn7%N%up8QNCmmwWJVUs7cxvt>XN8r z%s4PNjA}4cNu$|8XKM~-cx0ZPpCegvJLLVM5M?gcO51W@2w4uQ`*x;Jf(3!$^nGd5 z_ofrl2Ql9Tq3$!>D_$Ouo=)othUWEs?dd)gtY)QR+S@_q=nHc=O!!-RTvad(Ni8{` zGjV?Ui-ElY3t8jz_sgd5FDK?YlE1nKUV=9WYAJHjv@c})K_#~3&db8IUZAn+?A)3i zF3#DWPB^Wj3JwF?a?KHJE%WBM?KwP}X1hh)4F&_?4DLz)FYDcLD35zC3kIKV z^I1~tU>3uW8E_V?6@x$;q{{d>3#<5Nv#@I67~Gl8&CH-g-M?oU{Im|{3Fj?Y0HRBz zk}-F7q8DFL9p5?k2gdFUHGu<(!FF_%&+;rUah9czP0>ga*(Y1G&_ zw>}#|-M8m){Pf(f^0?j>>{czY*4rU-z5jjYAK)eGvd15v7O-k8x_8cgWu&X2U6u_GBU(?%mSK+z!W;d(#OpsVm3Pg9M}9puGcA z>%RzkR>kE$FQl6PoRcw-q66VTt;Cju$T0&+i`FxJFHn8CvF2$bpK*1j@h4G5Fw~TUHmI=%4;k z`dHiZW73>l{g{g~(S|W*f{hznFxC?s+ck!DD~C9CGg2$X{)xz<>h6M{z!e+@XLNZT zrGc3gr0j5fjyj=H@^iqm*~H%wR@>9}rn`z<3&^)(x!db-V%i>(0bV4@cqKPre=@h* z?97Ec$ap6g&bdc(Gv5KMV~293nHfBS?oo*0j^^gEKC3e~^GL44IWsefM+X~Ogsd4y za)Z};2XQp^0x#(t8LnUw+z>JeZq$PRi1G0%WqmErahVX@nV++6N%`_7YGV(TWZGiN zF!?Y7zGT{9dNQ5-!7|gt$+@nH0oU^mLVeu@ZAU!(82I@32&`3VY^Ne*#p&Oqx5M*2 z)SC(h;-5{9K)iX zJ+L!sF_r>HHqL#o?G=8ZWn-&zL-2vk#3l!$g<(2 zM;8?T3!u3tHUiN5fP&N~o7E>-GxLs5SHFbxW`c)(7LOkSkJ;kqo=CGJ+jG(#k3$`~ zmh*ly^EfE#(Q?!o;WGRh)x>oUj*k;sK2AM@rQGMEv{#4Ebc>ww3}p1DR1v<~_pK}7 z`JU`i2>U#60rn_&$?xgjHp9=!Y4)f*idh)!+Z-K&*2$hP5J&oba}~nnklT32@L6fV z3@71<&I0~ALrmK%>?fH|>h>UTFTT>Ixb8W?fRd`?v{${o{XWL!?R66n*DGlHj1EZB zYD^(eumOT-I_i5%+A$V`U&Gr&_ul|*N1EBuKyad~%t+66!MSbZy z%6U&DSqD#v96m!hRuIi6&7mdm0q%~-4AIQ(ip==R#QicV46N@2X_l=*B=>!cbhGEmoid?SZz5d-+erX_w}qX;<{&>HHb=1fq^8spP;R zkw7PrM+H48MuYP5$V2qhBY=oFL5WwAnZywYj2749Of;@PW`I((ET}>`0_`CghN?F&Ifd-5!kfi|oeeKzfy?%<=sKoU%6;sPsU5%d7Bl-xHuLg%FsHMuKkLM>qBAY0gQWaZ%wBaHUSL_*OWz2ctm zHihB`L+cmZYk6?x#RMc@`jy4{a-M6A>pg6>_{=p!VjjTbC24+sE9c0QlJZ?u$9|DN z>N+YS;e^t;mLC3KGBR>_JaYK&kck?4E@eHG=USRO{C+it5|_iZou`*t!XNbw9m8X<^D#-%&iu*u$6AA=nZMwa4Jth;%e(ldASqHgLqXD zL}}?i^38uik)zVXmbA#QOXlF0`R|YBR!{7IlMS{x#07&lTdbipjHiI19hyl^#w&R~ z?vHt{xvu!zw@*ZxU(S=>&oimKnxIB>?b++~9s8&tVDHWwaZGNy>x-Vej6dZ;iT_(3 zdf)m24JHeR@`7Is<&nWYsBwN&kVa*8=MhqE=aq}nI`=wwdf^`P!93|o!AU-Ul-+XC ziqiH82d25e?^(6*D(=rtXS`4#x${TMM|6AS_eT%C$zPGbV&MnY_uB&Z`=jZnf%dC; zMdnxYumwsrhkcKs=b*Y*Q8x#h2!M`bCW|FXVl2BH>@T`SDaJC2AtyBaV;!v{w>7jd zaY@YlQ(nfQyv$eftOxVf#J?ZvB;4Qf@<12oFY-Z)T|gC8+9T_FuBWq5StJ*&|3O+( zI6zPY9@QvzV!uqYQSYD5eVq*g6B6>&K!FJ2&cm~5&OFPUd8SB0*bY8nqK8co78Qu| zOkWD-0#V4pHy{loZ z*jE>F_Cic!nQdT{cs0XdZA@1}A;pl)7xV~}=+UlNM=NQBcyvT{$tt92n(3PaFjEpV zkgP(*m--Q_oC#u>8gc6n&70oh)v+O6z1_!LF>jsREK#( zT6B{%QWz9TS^z2L=N9wH#r&q?!Dp<+yn631gwY5w-%E8z~aP` zn*gL5o48_iO@(c)C#9mBfS7J=Au0PE@`n07OfZ><;OjwNuBGrHkOLFL5Vg6Dg%1^d z1J86FNlCMjfF^CdX%v9SE!04fgp-i#8YzGdb9fTqZUkwAAgZ+Krgq%g@a@1iOa-T+ z*iZJ1V&dT!K>;K}J>OveitFpF1J}dsE1{%cIFpL21;y|sVL!gOzkg}sg524+wph>( zPrW~7o6rodEye`CeS+5nPt_G0OiBI$S-IYlwE zgxguHj`?m5(B|t*=dNYCwa9!62z+ZHT7tW+(DnCj^M*n(ekyPXEWEi8*mVwH5+?=K z@RYC#U)AuX?oc>ZIM=FUP>OW1h-7R*&*D|C-_pM$$dGix5AanY&+zaR-IH|{F%9+dd+Oj!uync*o?m-Y}ks0dVzYpJdgugBS3tX85J?bY|E5=>VGnvj2@gypdu zjE4yRN^tm#Yv_?S5vBa%_opH)nuG+?7w>=J5QRmYki!XPPRQeg{J`$p3kyK5Ut$*w zspeErTpOWPMJR{Vb0g>eDnd(cs(XZUp&g##O?(skd(g$5yJ=sb`4M_V_hE6s{s?Wg zQIoFAg=wsb5|4y%HFt~P_wdKQb)BLXZ4RYK5fQfAK8dQ2kHcyeWWfOx7@2_(!cVn!7N zw%&|KXfKQqGoDxrlOkISdi2OYnxg--7;c@y(xFxZb16~uNxv6Hq*nz?%pK&a+8zvc zi)5z}*8j;K>J-l$y@)jOO?+Dai1dPB(c8#1uDU%EpH5qQZ?8ji_mT{HjAba|V_YmT zK5~t4`!;cKB4s}0GmJ- zk}!z~wa@urh^Rn~Ak{nS>*uH$X|Dj{VDi4)3$uiKY(P4{l#L)Ldg2Gh488(_C}Nn8 zkjHnD3c(so$9*>scK+=8EH+^glPN;1w;aH@#m@=J8LgtxWoKI-zQocWK#m0^!O1GQOEBPG>H z3tE_@1mbm_5pu1@Q%0OH7dvqttV2_K6uKRCn32-fwmJtJ8`!-^3)35hwO@9T8RHMT zy3H#n>6K-ka`>xwVokB!!DStee2P8FNa3b-@JFO0EhmI(?xQZB^x5r(jJ;h_V~rQ) zgk>!Rj_&1>k&It;VJRN4Vel~<_#`M>`43SGBiX)p`l)*7`P$6AUEuj$ zhj<1B`;(1;<|j6qfc=ME(tR~<=4G!`RXVt$q}$w9XMLzkRtzTB`JBs_$uonldfm$v zvdl(w7~pPw=EV70-TCr|eSYH2Og6xug}bw3K(=Ck^bfoCzDoA{eCtzfYkHS>>h^WQ z^)>8?3!hnd(_C|%g{S(-&I~CWTUk+avdVUX`0f&S(371t4J%gRdX#t$ z6HnWU8mX~Ts%$s{Ktsf3x4eG1({{YR@?=Bhdn;^p{kE#3#Glk&S2MJt-gc6B_%@Qu za@*?uMsjItv>nH{>L@_>z%96RRsG58%9AU~ZS}SjE0)=o_b;4vY^$1j%4-_S>-(E3?I%~1R`;(dtvLyw z;Gs_9zIvjv-rm2;exht0@vE&o+SyrOT1Fg&JJ%3T-tu~zy}yw>tqnQ$B2CQ+;#N$& zYwK$2kJa1CU8@?%wWgs4p1!EXsit?~Vm#Eetn&COI~?@p|ojGf5Cvxy# z+HfSN!FE!3yXbK7+eLpZJ}mt8uZQ3MPv?+X?t}*Hn#_*Pp1bSxzt_pE8^6iA6c%DxrnYiFvTSi!Hg)b}->uYIbhrbDYtGl+ zyz((y)0&qbc+9qZ*(Y_W^#!ZW*M73%srrnXg~+{d>%&_!ww>Ji-qzDw$G5Jl`CiQ* zZG&q+vn{>*zPoqd{ovg%+CRDbp>>a}|76|Bx=oEejlZ;Ie(&-<%5A%Bw{19IyQ^-` zN|S9ZN((6!L>wV$s1Y~}Nz zeBpGn*Hs~ivv2?1eYz=q)jPKP*7G&XQJZi6-fa9)$3q<__Vw+1rIY>PSNqR(IQBog zU%l_H{YgK3eAE8@d-i{m_P;)5wUe-d9aHyx6PLV$Jnz`CXGd4)DIC*z-;eLxa^C~@ z?GB~<<&Hx;hQ1X`(pK{pSI{6jgOP zuFg-^*NpkGuyaq%n2W1LIiv4w>Qyl91I1Q4&fAA^ zaaG1gRlwb7z{1x6St$tE&DGNHSHeRZXOzgX>_sC2eSQOp^MGl?n3Zs~`whmT71M@89;iWgLB;8i5Tdpe! zl<(_;vcl5(Neo>WxqO-Xx;8XPZ`62$4n7gXDMopnib}3nPU3%FZ9TZmLGm^4??TGt zjD1}v)|EK-mt;&;_Y(r3GE9VIrjzl-02T*gn`wWbEH%|{Ip_9`a6D{fb#2-}`7UkL z>8v`xbnbq)hw+Z|pY6qRKpF98Y;M!SFVWD8HADlUJ6SvNqxcwnpf2!H(gQ08t5-S$ zH%okt#4QUn->aP+w0(Z(hb3fHV_CQP;4&_n0)`p;yNLJob!*9J{xC-KwmS1eUFHY7 z%ujcT)~CB1eXb22o&@(gSCmMa_1Hy(Lp=B#Ig5=kNE^4|9EfO&Nx#MgQF08plr#uo zq%1aa1WD@3+!*TH4-S4_8?f)|3Y72ff&z1JSK)?!rv6I|Ck_8GB$a zKs7*jC>+={40@oTq#9>!iBBr5@p|}g;^18h#Ryx9$@PIyhBhtPOpJH@6P6WdJ`OB= z72g$tg29&f9W^436c{Lm9>_!vmJEmWOd~x(jSuvE1(t z9Atij*4cHa$N70}xMc%&2bxH%O``(#=WF>Tau)W;<|4>Zi~92h>E0Hjw1NIQ`1w$9 zED1J*(uuXc%;#(UnT}c%avEU&M7l6g2X+Ohho8)y3Ep65FR!vF{megrB27`@G^hd6 zfVq(*$`ZZ2!p}@dJyl+jaI09G;i%1_GEnONTHuUTRzblLKimjTP=&m4BRN6C32~ed z&j|^fpydP|CnR!$o)eNdVGbuSoRCZ$a*IlsctJheGl&|>Bxi2Zj%R+4>{IAAuha@h zzV_P1BGBGf2XwbX5e{*o$ksHlRGA72TpiV@B72)4Me4Q{%T@5xt|$uZ{$)hi2N&XM#D<)xgrwWiuY_%KTMV#*ext_My{3Uo8R;=|kP{=`PIi z2qUen1Am}bWVkma=Gy8y9D~|AoLLc4-N|(?QRAK6B_U1u^!&PFl!K=BX9B?=c4a==g%p`T>S7~$ zorg-~A44toJF8csZ+G$<^n)MZdq#Sxl8+A9A1A%~AxMpfx{CR!Zh~+Ki1ooP=Yw^~ zLKJW*|Nj2|N#y!MdTd*-^?29oeUr6k{a82D^h>AegE-g1MwTAQxlY^YBhJ2^BYqeX zrH*afv%1!5n*m<--i|l;GN0qfP0PL3XLSyKNyuqCQ0B)m0LIX2a-i-3t;6j@P-``j z`d;0$I=%G4{X`7x(&D55^lFhvDRO=Q;!5?-5AJVJQ%dD*pwYOYDXJfXXB*l01U__+ z@Cta7_l5$>0D@S8b{!fZ2N86TTz@LDP>Se}zF#ss>4J z2$a(e<1N(qYMM(V^F%gfyhS~}I?|6W!AHV_VLX}fgl^+sW+De6@MGI1eSTfEP5N1j zHz<2`iMOy328044H#JlEr5_PoC>jNk?&Sj;_y8Zz@NjS5r42L+F{g9t01#s*EI-G) zfZNjzlf3{D#%?_0(eL2Z7g5(AWH*ktM2xRi`7@qGBtetZ7mhIFQRDDad9YodGM@Qp zgDwtOBY^C?@k{e}S(0Ea;1pCLnN?lmF?eJpQb?N|sudX=&VQ$DQdfiy<~D#w!lWXg zzfCHjG`>weetRTHh2%&YrV}s^?0&R?8Qyf)*Y5k@%-x8}&|@G{an~V3z@BKsQ^2mZ zxeEs1X|cNnGB9Aj%N821QbAN{ZhOGq5`K>XF66!ZK3lhM5`+aKj&nc2$_A_TdN_wgV1M<7JfE_18sG0a1q|-KJ6#J2W5*cu_2RHV%zct$SCX7}0qbbpQ z=J@)_PFfrwgxw9T0_`SPVIMFFBwKJTbT?+X-VkuPg#MHQ1JQLW0_7zufVi|Xgq7Qm zwQ0YeP@;$Vv=v62E%b6W5!X^S7T2|``fO&WmYMHG9v_~Fkk6_^i3{<;%Zblx{V*$d z-9)fLN9-RF$FT_9R@4_+*DfdG90VCpy+puxAzr*-4ez*bfQS@7mq>w;88~}D#&~;2 z#s~{Tj`=wGJ8T>cHXiF|FnH3vgSXcMle#kb;S=X;HuwQt7XPu^xva(Qe9Q)s=4X`{ zx_}`O#t^&U3=NDhtVaF^t3f%)%#Q{kI^~Q3Ic7kP6{R1oG+h;qkcZESvQ5lh`PJ10N@|LvqZhJjcXfR|}k&z&J$5$5tN6 zM-XKE6A2G)7ue7_ge3a_b7`u3QoT6d1`e5&mNo`0Lc7`6sHR;vnG`P8Wi>_M%KANN z@JGO=bA@oh7UUB{r!!6bWQv@J<$9+5Afs%{{WsF^B9<67P!sotSifgP%39?nRxz9C zVMQo#9^ONVya7VKfx_`p>SXCxje+vjWRql8kDABvPoaQjN+c&R(G)`>Y3hbRIfCZm z;5$NLNO^ES*tjnAP<-X{+WoJCZK`ql+=mcN-8A68V4swJu-21vny+)&26-}eWCb1U z9BKQuHuJOgfc-f;@L^Pf0!g7n1?I5i6tGt|>57{?G40YbO;v_|>5RP>hx0_U?|C#{ z`259FY$O~RqCL?f?3y@sAcLRZjuUI59lF{kR)PIVF&&<0Lp-fLLz0Q@IGc}k=o+rY z_4~G64>LM+Q*W;!en$J2u*jLvBxHG_nGaz-x^_0gqGD>1F@wr5hL2A`1N@nf0m?J@ zzT;fjh8s`h*EV_)zF+JvmZQ;#K45$njdZpR=OHMBgjP&cs|_hQ&`)~>N4pXCSFR@! zE77Du(TVPD(QTlZSO_~jf=yi?`2Ap2KfK|Z!m>yV@gkoHUL?6+oVfSJuwd2^eKc0y z04*eI)r%96FN*D$ZGt~=YMGCC)RE?lb4w=3ycQZ(=6^tG{X3Dl#d0K2EpnDpAr6!^ zcoRL9-;5XEGWq@A_lTXD*!&Gy1=UJc`uv!e^P9XlV+sS8mvnFQ@-<}FVz__3y2iDp zkJ*4u=2#>3t(B*c$qO^BwWBo+Bhmq6y4%A*m6v*#*XR& zjGNd^+>n2-r{KO`oRjew97UOeZ;@=#23PerBwIi@EJOG98nuFr1P_8_H-Qh;DSAvu zuLO4b*N|y@zz!`8niwYa7_}$+31SHtc$rUxEX*`8$5_gCL!-Yj)4ztCEShEvZEEyQ z_J?wPy5@T7PV8-W2c^rv|L6Z$+^o+2~_O$!QIh?pe4)<0M)KLY2dPP7hT-t2WjI36klCDukJJxj1-xcBuw zdmVfzs|l^+L+OV+78IAoeBSM`kU2RvU~b>$^JGI;0?N7{tW(p{_t%~L{yNJ%+_7*W z?Ouo6Y?NS4#5rt0i7;3wmy-*l23u6=sNB4C6yB2^5g|DOTu3Q{)i?X351Nbl#9|5^x_h!!y!e zM@%wm$6ZS0J4CRs- z3kJv@TAb=aEGw{R5x>8mS9^P-FdH{A;{Z-bjr{-$GFdCdaEo!dTr2D+#8#{e;+$nD z^fNP#BX86Q`#m||D*0-yFT;Oxc;ex|85-i%TEfAeJoJhDuyO74+D!k=FgFq_7H|Nq zDDbH_Y;A+3jo4uPH@h)L`-#o&5K?3628&jx0zp~PNv4`^ zbL9F=hBQ->b_AWvV4bwO4OyUzGU8a%pEh5_3Ab}8?#Io#&Y2OI z<6yzTwRbT!t)xgINrm>;euf`YU;a5xKtjdDHN zgzRBJ`^fd8^jxzimz*X50Nut`V=L@bxZF=JJG5K`1vs=4B!yZN+FwegimFvYd3ZbH~pX})7BG*F;&8ITy_1J5oCUT*%#!nyt zEo?m}jpJd^ZD5`u4RMVJ2`Dq^P2pfdbUxh&(Liax!6G9`8$QrsMV)6c7!n*tl6=Eo zUMbKB39Y8VTNaThg_97hp6sA!sp$NVA5TIz#Mm`EY+2V;cY6xkJl3G6PzU>%>N zC-WuT1yO3)fWgXBhR!=cgzo1E_(mFE6SAJtuymbGM3{^3!3+Z@`+Z*PDZwyB>Jzq$ zX4K*E5l>dYp3-8T-*T;Pa1%$}JQai@=rf^%2QX0hGJoEM$ql!+D^T~-uE4?B-W=F@ zXanK3kWApFXM8@i^wXp{FySD!OU$0yQ z-{P?nT)-exGoFfT;3%q4H(TJBp|wn1L5o@?jjk0IOIa;~*(|i^idxjM&e65-9=A3% z+Lu~QSqm-YS&Nqt5@5BJm@ZM}t37C<71GhI!U_cZP1HTprKUzab0Naf@v@jW1G)3? z*28U)f#gJA)?=NYOT2|v!JZ>ZceG=1!?jD;$4BkTT?20#pY@x?L^XGI5%@Lj#o+YM&`0y$;YKym75)K zIm1^arohS@1=Lgo4r$gOZuD`7c4u7Lh%Sc`jL=@Q*=Qg4+dT;Lrs#2|*L)mIjcrj0 zo3P4|u!;P~Y{JwPS2y$bJva$_FV+Hlp#k+ki?=!gdeuvtv{x}_!BIPI=bnu?;6N95 zi}c$)zwD%b ze*Z#>dZK&Y5%uFYQseN9+0))Tj_p6_gUq>cL#R^U>WZY|%rOuPT~m&l z9sejQQ?q#l=5CnWUf#^B6llqyCNwGP8`-RpxxpJZ%hwM!Z*~&P8zx5%f#vCxUWL+& z9}nQ8NhS@+^m%4za?!02=PE#x>v;_hu;VAO{BXA8P0Jhu%t~0?dq5l2+kxbB*e{)B zn_EceZX9Xyt(XOT^c;2ykpinwhLhpY+z9S^gK=P^oXO9TUcQaj$~kEUoC$cO2S@;Q z{Nlu0#tzt1=HF)i-fiZl+sui#nU8HTf4Rjx?>2M)mSS_?7R_8rHViJ_B4-XJZUK-% z!xlMbaLE?gIGD8swFBY4cbg%}kko-lHjz<~XMkcN5i=h#{_7S(9vL7+v0jI;V_Tro z=kNxICkn^&T1kF_ zBQZ8nZ`4kb$4DV7Q6I~EBv5ah{;akXDcvI^tudw5h+pw=6DVvkxmd`Bx7OSiX~F?o z?Db?3&eR9#7#8)GaiBmab;rTuO&@QwKmiNS?Aq`qijf7f)Qr7Y=x4Ewz> zQNB7LFBBbvHMfIl`K7*H=b;O%?{$4kcKHwoDdr7_&dM-% zzqI-GUf`C)CZc=dw-Xk-M_}ACI@7f9ir@pmg7n4TGQ665-&- zqK%GXci{a0t6m@ZZGq=>$st+C8sqsVS{!*I4Zoux9y) zB9!cP&*u}$Q4sdysd!b2zLmK|jUP0(6Ss-YG8}eEm)`BG)<}yt5VKVE%{Fnmd@o!cU~tcQ6m+Tk)2EgS7Sz zXX>4;cupaPR(28=tk@nWUDul;xmqkiq)m|*@*e}xCvyg*`}g;+9Zb+Sf)lCsxkn;8@WUDr#5EJ#5@kqD(W8#0 zbi&uM9TWSA=bc3-&EMK!(1S@5p5T30(2O^_It=_(rl(ClXS%r5>%F%P8V}n;XvR$8 ze5UzZ-N3^Xk1Wy9jntY`xz69-*`GhhfEjU%7dl}Se$xcjP2JY~7z2~ks)tAD>9u$C z=j#kaeJiW;dj%z#ANKA)P1o5%%y31IO_}{;YHBQ=IKi0ckMHb9^OhOV0%-JG(cIPG zx)mU3CJ1^x76NoIu_wx%C!W2_*>hJSery8!hw+34!f$s>mBA74Ug_Dp20B8t>A4F- zea5l6yO_@;Jco|`V<(xr6FX#B@oyMlw#ajMlN@7G6;GL%CbFbt@L^da7Uy$mSbNwL zg&35}>b&k~Y_jgTOUYbC9aOo(9mEmvk?5jqH)WylXGM-HC3s5<_Z_Ui+mu znSjqkf~4O1Ef>~A5X|q<6Jk0?@4V)E+aP6a4IP3_PQLCdBG&b4z8ngE6U6b8MBQ(| z__u|w=OYkkHygHMCL`Uy6~}t1t%j{~!+=~b#PDh%%A+QKq7dy-<4EgC1F;e)00O^P za&#-EO}o*1&YM*79GF-U=h}?{1!>71U_t3o&&S=zeWYX}eB2ovA?LNILQVr-QB5-n zwE_+mI4rNIF1|t+U#p8>u8VJ!2Di4GufJPfZpr|L*TLdgw++T;Eec2#>OE@dANNRi z-hFNU1`IIOlm4=mIHABGNE}Y3gIjw?a3q=;8Qt>4tx2_g+{#fE)~J8}=^1-d(FP9zUp+%3A}_k`4S ztc31t@o}%+Lspl)WMP!NzWMbl)yT`vMi05BcT`)bi-_r_;pZH zIEXtQ&i-yFyBB2i0SVoad#uOraU7Yyi!7JkeGfN$Pe%DY+~_?S4fjY(Lvg$r@Clj^ zw(EfP{9UG4B$SHo@x-$}m=j{jGkiuuz(UhcrV;fZVBQRYDY^$~z5|$~7b-Ym`6LoT ziTC-zDM&s0=yeA@YTtJV7-)tsG^qEp78qQmJ^Q7;eY(Hh1I=3p2*7NZME#dUCuS1? zHWH2A1A8o)q5Lm@CViy1r&?gw_sk13g%|tz(BaVL5riYJ^*!j1a!r_(!(A2Fquu4- z@GLJtZSwhRQB$)~8^cjs=m47_#cYRJ^6E^oWJ9PZ zeSf?B>F8v*nD1}zJsU1({w_^Wo?_E9mbo-Vkr4(z{)WHMj5z3JT=f1<=A1mqMr!!K zTRvbe$X~E34gWFYmOr*Cv63BUH`fB*Dd7a@PXb^oC@?ALuN zytXp={RvhP{H0!7nZn4<1Eapd-y3+{86mhbd3hjdus`Wv35`BPrm~)NBI(7I$*TiN zFZM@$(8Q7s{BE@)=@ZKDvAA)GQ|Sd&jjmX@wLA^jWI19z-$lpfK(w#vVO_mZ5Wew6}-t%c7B4?h#~B{ER!orW`j zr$HgDB2MiN>#-OvHTTn1* z{-V|=MZ}P(^GC35raKlDN}esZVU`>I1opI~oPw^~ z5BOj#DaUeWLp0n|jAeea8aTi_P3Di?RSZ2gnvrOw7n5g9ozaVv67V;#qHh8MFknq2 z;{T#b$XyNOgrTb?=SN1RZ54E~H9cEG%YxT_66rOjwLQE_-%_tPD$9T$%yh^(bTxHp z2@t8+dd)BreQ8*t0i;9(M6pCeo8bWC=d0UyjtgKX0zP3&H%W9=&IG)%AH00Qj!ra1wskwQ1g%}u@ z7v$L*k|s{eC(F2DC?ZvYZnSc78s(d+peN4R|I2EtaYHUr;5d7U?xc}o%UJVCk-JqX zHm3ouOabtbITN+$E@op>6#2%%keyTkd^iPzUD9ilIwIfDYmUJXJ(tzqWQ2B5wWo?jTX3uf=iK}>`?{q&VnDYkH6@` z?sF;|xED+}uk`f+jCexrR?SR*p z+>s`W(VJrYd&Z~vUvL4L^9($W#a6^-qw+n^MBon`f%*&k=hnih62O7clQWFJ`H0Kc zW79=$c^-XbYA)%g1aMz1ugl^~`$p(n^bogv-De*eM$%}jG+*}#@0n;*UCZ{tavO7s z5NVOQJL(}sAr$dV2mEI9@NyhwVMir!4aP~hPbTNB>Wwl-MK~^5xQn5vK2}MLkby!R z+2zC^bnPfiNz|}+fN8D6;D3jCG^v8@Uf4#NS|c67IHNGq%hVe&L_J|pkNbAP2jB+y zW?=1TS8aEsBN&e@E8)kL@L@pl`4C93fd@Il-3*u%{Vs6l^&vKL1bHEj26~k6l8;BH zE$e?WIvvDfJ5k*y%%t%P+EbZS($Uc}8Tjb>Aac3}r6|@j~4&^_p`3$DDwA zawF#9hGFRK`n$LQD6Knpvu&19*wLn7A1p?~q@J8-T=h7U{Wjiab@`v?SuLF+Z)+R3 z*%8KO$!!jO-rRSjcS;MTtOnCo$H`Y3+YWSo%45MW<3)dWW2|YLBNDobHQyGeWh+kd z(+3aiLy0PkBy18+H`~Y0EpVN@G|v`}h6l#jGBfuM4!R@YZJrv6x|Dd9+@5pM_p5(PT<@h_UQ;4JbfI6O87FZ+14St+UgPc#u-aE+p6r=uM!iUH%0RJ^3i zWEq6po9yB?afL&CPF&e2ZV?wXiCabE(A!|3x+OSvSm&pW)w~E^DcS6(&pv-yjD`Wp z`Pl014z>QW7z*O9LUmGY9(GKv4vu{CDI6rII}7~P?ZHC12wc8p8=NBZH%Yxnpt;t!wh{Xsq^YoA_gDTjRn%jaL}b zj3*IB0{ITeP+CZABfQllvk7RjqY*UO(U=$RjqKQ%b2Scd6zA=RE#Y(;uv=1Q3ox-LJ_zW26dvQyIYSO zIoxNW#e?HZM#q+U9eGr~I3+kXc#B96SoU~B0W3iIB8Gb?%a}8mY`jbChR1IAnvCw+ zbg_F)T6e9o#Or9+x)rfX`(eeEm+Xf=ZR}p70GXS_*-ICRII_-vo1GdGSpO7NV0m^P zF~N>T@vyrbn5u0JUYojH-Ec~Al9j_J#611n;3e>AR7zpL{ErO#2pI*%;h8FRThPvF z+Q*2+V(cl+`9u!)t$(JYU5r)Y|8(=$Vm^q`ADxv@sdGAKIz%WkL{Ax`QBjCt2+M8$ z#(&-(Um?b;+W4g*U zH4?4IWO5aH!_~l^6in)mhW~-GgRsOxS4=+WU%|7Tc6tdO)Hux%{xKLuk6X1~_&0|% zZngZihQ4A8>en+J15;$@WG6jW@WKlYg8|lB36@o?{loDe&*zpqX|xMjYhNC`FBCDT zgb_|y!^wtOL^;MGhj6b`&f}pxA()AoH4zhY7#g6P<>Dd&*Gz98H2HsUqrq^8ZToV^ z#A^G*Mc6#^y3+c-(z@5w4~KeJjXUhQ?+8;O7>y)L5@~C-T(rNg~=GG3`Dou{WhR`1my!|Kr6I5 z04mlXfQ2vMe8^SW!7NG%Va(dNFY72}-s?2q3W@@momJ>mkdp8hENitdxM5)Qw>U8x zdDo>)TT7Nln>K^K6Uc#ea+(BU>ied%m#o*6?Zvg)-EP9cyB0uF4809R3cDSM$MTN9 z)v@-Gy#GE5=c*5J-ViGZw*3#9V$0U7M`P`*g1VfR%qTCK;_jU0QVsD>b9JDVuQ+9} z&}cq}OP^~ZpexmGaYqThYy#prB9Im{aRdxS<(79{(5%1#7*QIEvhzZVlj;r=Kv*by z68j7ZpPxa2?fI^bXvv!Ov1Rqt__zsS*=pHTOu!;UDgldb;3Kr<(WmK(_)ww#or(3O z)UT+W@VWopQSf$hzV1>A`WEMnwSn-A`qWDljd1IpQ-CzY_PosRO)^zV`1KMaPf62y z;d2-%05Za`!Uhk5Ry!Jb@7}#{H>x*n+FW}yM{)ES^VwTUR~$E$&RA~TVSIJ*@#+6+ zshIcTz3W^q$e_IhiRC*ekmfTj+qO{MNg5aVPaJRZD; z`^~eY1Y+Wn4;T03HHWp2tw*~BtFaF7dn%hXON0e=Dw~Pv;a0JMM;63@HSw#}K>@o{ z0gEXYenDXR6XBI5CK-a?H{?>QUT?{3R;hzo#w>Wrf|PN#ZlpP5(Kffh@K_(BKnsw} zI*Lt@U=5Uz5@=t5mF8^!gw^c-a2?vegEZRZX37P(7N#{IW9Q}_bDJ(T-|YtCs8hxr zzT?=0EA=96C`AKSxlhxRQqX8Iv^Cl*{g}Gma;Z7#GN;An$V|LC|VHV;iK-!8RyH~x+&jPx`*!aopxvL_5ZUwO=#KeRz4BB;8wgBt8gn8 zAMbKeI@h8(KLlM*9X$MvYt0>w(XPhk_rGvCtiy6#&Q|SXuC)&bmoiy%O?r0BCH8Qe z_ugB=-co(sFMo|vNI$z1^p{g#AEUnh=isl=Io$DI^~d3F*31PD%;s?4-Xr%_R^Z?c z+~UWn<}dy2l-LhII@M+a4YT%>Ie(BZVUO^51rcR zgiDobtS06^wXw0GdLqxE@kWa`STRH2~RrhBieSH|`w zZ#4sjBJOtSWn|KGlo)lCUoAs<6w+u8JlUZ+)z*A|8o$sMJpS#dTHaH3@*|ix65P8Ct`E){t-q5c7pb8PdmU-UFBk z>s+8U4WH>dQec9Vm>cc(GTxjR z`!|}pJx!)l9=oZ><1l^cp@t&Z7Raz62QWe&dY)#_C_RZf)|sg^-7NeRd-kyBmjh|g zbgaR>UMj&uPnLI1D*S7fzK@RR^Chiv*{F!e))?n>+{6kjVaUeDJ9d=-hUe#JZKmKUPu+mNewOCZvQOJHM7uXz8b=+ar$ z2&d-9wt(sCS@V*Mu}w#5SU@dWyK0)0GzehgX&57jl{ z!WMFV(R{BnwsXIge<$H!eU0NZ=XGPDN=B!t6i8LC*IXXOUBDatS8jzUDz{pdte(YG z>aVS5W;!I6rd70Y8oiN1Qu%>CT5K6f+a^P5$!MAhg z5RPk@nSQummXij^2QSM=9LKbWwKbd2H-#_<51Rb7lM>j4P1+ImtRnE(AXX%aR^Tz-k%{=-;w* zVsWA$4uYDby(0`XRRvuY%w3WS!(J;mXGf_9QV;OiyAj|B!9ZHyL4_a<0gSA0W^UhYBmA@P~4nhHNq_igdjAqLnL9Hg(xBnMF(vOLxyz{QUDA} zA#dTcQub73gfjtQS(0FIrL^b(4CNh60awT+TB%Q;L(inpADr`XR&ZL-SW6 zd4KQC9_qR*Cjx!d^&Bc7XQ*((#l=bUGY|up} zb|j8_KoMc>4*P8i!X)zpGk%i;U&L~8rK-}64- z^MBsw|2*IK4azzD?919~uf6u#Yp=cbhOQ{L*HyC1Z^|vW$z-yyY~0L))c?UBXHTs2 zM+)a>D(6|1b2`QuR5@p2oS(-yvlY&H5zao9(`9lVH#w6QInx$7?Tei6COKC{l~GO~ z<$NN_SsLdw#W_`RPBso;C~Ag6S)k82f2gFczlWmEIg6t4?F;?;Q)Ez+tVz^_zh>je zJ6&@$@_eK_ax$_x^1et$^L8lLpCV^-{%=s^!XkEn{4YMJ`fIu^m zJ)F?RO?6F5Y+TSuQO}lqraG&diK&d$M7@w8Bn-q1#*D^H#QaF{LuH@pcS#RNKN?*W zU6XWw(o;$5r1c7K?Ah3JvA(1O`knfEwT}|wOjpVLMAWLNC*#hheUv^wBbZ*2`c~@c zlzY-%pEo*Boaap)V*bH2q$DuEPfMFWp5&v}rf4zUQ(F=BvR%TWzyumX--8V9xxl%FCbL*Lq^!1PVvTfAZh)3ajg5KTW8SeI#T}d6BR)rBYX(127&}3Yx7nyd%BcO);rv9=>0lLwtWkTB zd@SKRN(SdeNDCt*4J|EIqmDIb&_?NVst0^)rcUSM7u*|9X(pw05dx)AYo#R-2)b(i zrb9%fKE!exDF?4U$SS=(Vw;!5A`od4^ZG`uqpm{CJD` z&*SOF@EPkMqZ36@4yAn~A=JHY`YQsX0}v`LN~sk+oTuhL_MtqX|1>Doli!f zRL8>)Kiq|kq0+Q5hR>fQELq7$1V5)IgRWXuNteWgxipTp#gKfpypp~-MmnwUATaQf z*;7wOaQDWjRR{S*gZ8pqcFG$ew;cCIoGe2YfqfEBwI;!$)Ls!)qHs3M9E32S!NmT7 z$Wi7~kPwUv4t{Sm#O|W>p=v;ggKU?kW30{8$!OEpN1_Lqpmc>I<8soI9`wuyH@H3y zv}~YuzlxwY2W`doI=`*QSvULw)!Mfq}Tab)CwE9p-v>UBKjPf_tPzJ4_&{Z`%QWdiqHF(+e8`m?^TWavJ>toj`WDmSdn1!Q;bVDCXzgBbn zkd7KsoBI*&(|!f4nm2SB=tbzDM3MX8L*2y>kqDsDzaxE$8~PC0Nx3m(G^Ub_Zz1E^ z;hqo~fEeDoPloC13AR$7y2sp0i9`bNr=*RM(j96DkgcE!Nb=L#Ldwv*L4SA|U5GrO z7fAzovRkM?%W7)ZPnWFO^YbMerRGQ{Mz)3y39@)$k$DXzJr*f2c#8lE$LsJ*$de=)@p4(Rme zIQY`ruM4y^Qvl}=f#Jg`4n9HpfyPH*UMD@H@iKEm!7x8B} z>GPz!K8CQ{==u#2c~#53qHoh3j4~9zoAkwRh?pYrz*|x%=Wix(Md?o(z!T2D%`1D} z?j>mYkq&X|=YQ1ko++BtrbKPbKYX`ehwzyYP9JjjP?;Mjj$$%b<9U5%3)N$81o1U= zs@^eRlU00%tmacsmdmN8I02ol>EJGEz{HIm9?VVb80iFN_A;i%PnkT2}jtn{K1aCNeB1!l0b!p)(1_r-j8y~>&Lu@f+j_Z_&F^KjkyEDYW%k1 z_qJSd#B7Mx&CGBLf~~8Q|Jv2bex0WgbS3Px-c`e20TR0$yLkn;;x^3hMdA|Q4rwxq zKZ1w(`_blA(bvl6XXXfjyhPL!kb{d@DuT?GP`B zSH%Af9q<2WkxyfuocnbOb)z+o(I)EjNu~MOu}{vuqN0r1adVPM%#n?sAm(-z)&0rU zm?s|FhM4cAQ1YW!V}7{1W&MWM{HJ0no0_Q~&T7U)!Fn;~jhMqRR6>0PMeYA?0!jA7 z3SFb8_R^lYqK2D^u|BDF@JbHa;wO;jq7XM}eM;+Kl|jZBbP5UIeBB&$<|U9Bbufk@ zk_Sao9Rtvr^vp$ph4{A-1&d#VdB>DRhBZW%oWyIOSw&^9rf%B%&hgT?4(^HA2X{d4 z>s-P|mJF80NtgO;0{`FVheB)g{LjJ2oA>=taH!lUGvG|1)HH5)w(brc-^nfZpW)#o4pIKU0N|aIcCoreA0-Yiy$N5-kkz%){xoMEeeH* zFh`#52}g*N{Syhbg62u{Z*_e^vB$@K7QshBpU_I0IA~0oI8J-LanBp<6=?Ndu=FZ> z6ZLPTGuz_Y;z&0>6!#F`9If@}cfB_FOh&-I6bLNUeiCXjWnH0l?K|{zhV#*s=^9EZ zo@b@BZykCzLnNfN{#-jiIy;>8U(f#m3S7)@Sn;36Aw^xEkdokhAr6B|dLg05{By0y zJ*kBp)PmJ(Nk_D&&+vLrgm~?n;*}nyXnk5M(?ZpuF1j5fqL=%*cJWD-tgs}vV{}!y zDtYZmovgOpc=AhGVKNJOj0sr^+T~<*0>4n!siSySPE^P6sq!2)S%{ThP7tEWL&-#< zD(FINtu&a>enEOC;fgpsBXkYR0xh``dWL1O2ZP(Dj_2AZK9VQm{xSeAq$u`+_H#01 zq$3GJx$_6~{{Y3l3j%BY@BI9CHMB#xeJ3;dAfx&_KQx5_|KEZ6PVWEjeVn`2BsxNM z?c-me|2qmqHmz!8VKtjgQ#I7to7vefic*!YYPNmrTisOMxN7;eh={7XrfXlwU%9kt z0e`K$rmDJzt*>4;8x>J$Yiz!jOsVbVtE<^-5Y!E}@~Urre=F*ag-bEIUnTm~7@#m{3j z@-bd7f50b@630jh`FyXyiYG!eAJ9y0iDxiib6&$4J!EOA+uXsG`wmI%L>`J14C z7(&iY>8YeqgFnmid6oswvso73gFF1pSyH@oh=|G3(Ie5&@{?q?7f%NaX`XmKQke0? z$!WdLy>!S%X2q5&tzPe$i+Zg!+9QkFtShw>2|R5mv>LGfv#ZuMHkXguRI96-*qR30 zhjprkhU(h#2DYlaxvyEZZbdb_yw1M7yt#6~u4-6zsA;-+gQE!1mV=0#&4oY zR8w{Hs-|PBRE-2g9$T}jv9h_&b}gczuCc#TRo-}gGphz;pO~$GMU$<$I+V3e)o5>S zS``Y<=4`6AuUg(8es*;=RhJ*OuPI-_sv4?SS0C-_Li6p-)yvts!!@d=^5wuVM2V(V z$5yDyo6xGRt3NfWx`t}D(bmk?*j6&M9Pgdt86xQd3obHwgwdpSE=gk_1_R2*+S8*9VG4tX+XZ^ zpJz_6O}?2THfS|PSO22#mN zLd8rX+jMK$^y>2L7$&7npWUK`s5p8LGktH_^v?3>#Yw%>i<5huPi6G06;ks2alqjt z#<|F>cIiz&`H}A0sE2^_YedH%*v@ucA3`T>h!6pqNDm0@5h=H_oS4}+z!)o zAr@P=@kA5G!yt~Fd%3fnNAy&+VAQ0h?%tViit%!S0AgAc@0 zp2Ex}DI&~TTj)$y4`Z@H&g4~z`UvI%qH-J}qW*%&oB0VD6o!;I!eVYxCn&y)bM>WyXY{MP}x$ko|`N(zMecTjMD{?&Kml%5>aDK3UfplmquotbTC^v}k7blPLn@*!ZFH^S=@dW7lnveo zo&4NYLIvzm%*eDC6@gNmmP#SSLD>`#hxErjW2iV*ZZ6w+_8Ki46XGB~dOUlT7Nwlk z3hCEz&UaEsKXVj4omrv9TZ^*XE+ebtisxY@sk?wCR(v9UW!0!PQ9IG~)`0U_!W|C2 zOnQy9!IL)%eg^l>XER;<+Ig*G9K#KxDLe!i*ahMUGPc7%VHl9pe=8IHjRLD$gNse1_!ltNA)C_`AOlP&`XImB`9*?HrcznVvCsnFW65chd84r&cx z4qwU{`3ckczwiM=r^cYG()QDoGW8d)*z^YNr9Sq_B~zwjbj@G%Wi>l6M~(LZY44MIi!OR6>_IkFm(5dW54Cpgie* zN(;^>U4^!iLNF)H$~8h17#Klwb{YEWY5_!clK$O($dV5hLy)6bj3V$~9D8||fD}7R zz)6~=u-6mpvnaHF=Ml!NPwz25sU?F(H$Pn+5A6ZENFi&$e?M>>&%TxPB3GXej4bh+ z?od;nIh-+F9VJ!L{=zt@7H%mqU0sH1CFgt{OQmQpf**h<$a)E5ZA4(z3nhW>lw)B} ziADR|BYJL8I<2IlO4zRhFZ-umi8Z{UFxy}#%rs1Q(paUc+olZ$<^sOMRS1+P&okFk zMRKUa>c-akc zgsIE#NpZl~Gcuyr>yheD@t?XY!^cr_aiGakl-;Sl?m7hWyuLvFeOJpW18=$84EGv# z8hrW@><6U5Yqh-{eMgm_!ppm zQQ%(`_!kBKMS*`&;9nH@7X|)*LVY@Ax?>CQyQp?w*WC(AT{`rf4JoypUMH8ii24rNK2Y-vx{^!LlA z?<>cy>z*v>k6B)6LEdy>6`ifhGGwZCUqESk-iA`MU$CA`HBTiSC&`ST!)+RwXEb=5%A(bWJ(1 z2FL|YcmDMDr0Ls|11+j7>`6vU&0rNL<_{sGF>UWe*N)v2T^kWGifA|t0iCR>2$bwJ zym{1+ZO~pM4I)WCotBb@@`y!&0PcZ;UBX_z4)qAyN$G?9pb{JWVz{zBZxjva6f?dQ z3$X`Ge?MvZzGOE_8Fw1*l^)4|M9V7d^e8`Gz2GTL7mydR$gd*@I- z{40GUBcQL_k^%aUgz4yagOELm(#|Y3+Y_?t9Aq>-wV{v<%RrzdNgJq7*GfbAWO4Lq zHd$snBXdTipgYq-WB5gQ0c(p^gk6Dps>n3GMA9YxD(q92Weoy{;MmK{>y%M9O~l^BaKe0K%`CUxgIdXZtY2efx!Y5k_4XH{JO^Fo^W z)x6AsJg;;hPdT6cig1^q;}xKRuKBgV%ol=aO5$0b5=XJOvD8!DGKQyY7!B-0jCrpbpH@I})G)6*H` zA1pJ?oSg5P7;ruBAk^2L*LKFkkAaVmkHB7~#&$A7R-Ae^qXVArq0wY8p!)+at8a%y z;?8U7E=qElV0%1nI<*__W<}-~O}?w~NsBBEx*Kkg6gRj#;}zKTjE`5!5d@~?6{MSvZPKJ$vBZs72Tc9N9SM z!}eGB1=3No^!-JaIlJYftY$>FFjP1838k*c6MtJo0#u|MW+}35IO)*^#s30m&hd=^ z^bw#S_lXwu3C_&C@6#>6fsAH?hkX{02Y|dD=+fnR5xPIzt(eIm?AAzJEEk~Ue zF2S);O?>Cz`8c8FJ>+i9D0jR$+FTyx!YpTjy(NMmQa^4k5Ho{XQhffoh z6-4uhIkX2pz-^7p6wTbO$jq-z+%KXsf3k?9qcaoDTxxV?lvyN%?e!=;DxX2f^eE?O zJBd-$qckM5lO)2U@QR_$MzT%IvTCYEh22W*@rORJ!B<{2o3a|)b#*oC$fufmyr9WW zQBTm+&KnNk-y8UMYg~TvnCS zotLDX0_L;H5eS1N)7-@ybjj3oN(p;qx{-3vN)U>A9*+hseRLJ z3h76S1MLYzae?+&fev&8+9&SjKNqK6nun%c(FdmsXD||oKBA;j0pF0J26pN=i%LD>$*Yz%m(V z$EMM_Y1eco9~B0YU^*QaSQ(3``+11K#SYPda1Em(uf_pE8*03!w1es#AmnRaIZ0!^GgwH9IJQ&)*;NC2N zFRxnKTPXd?V*OKrYmMteoV7UTnjtCoBY07oU)aXIRUjo7x@wO8qHxr8L`233rE@Jk z{PARD> zNz#3VlOK(>1xI_WZxrMYpW5X({J5n@6d1`_I6Cnwk>DVA0s+*ojvx;12%Fz5AeDsy z70w8nQ050ej~H;aSSE!b>D@w$A}D%8sy4jJQ<1sW`eH%;gz{y4stBUA)Kh47pvqC{ z5lebx*e7%Fa^Xj#`Lz@K-)4jD4srfqi^Uqs!+44q+M$`$WWHM9<6bIo&2h!wwqqjF z{HFrx;{ub)s|jjE*Pgvz-_f&00eeruh+}fo9bfhpWd6ATT6}K-M&E`a4OR=U7X-g_ z7m(RLsBxYxN~f}W3J9ro@XD<8uDuSPUa-gfN`Z8x=tNfGD7)o?6}9aXo}A_a|IVs~ z*YSRCI`f4h>3HF2<%n*N{L$!ZZ}XSsuUR;P9s0K-_eY}{r-1ew1xw6t6yOY$Dw+L| zp_9?vD`=a8O$0#4(M1+Zl$2uGs?6aps~mNh&vZyQ}SF(@?29SA#5j~Fwx5<2w6qqT+>&Axkwc9@LPzP zN|!(}5tyCXwB4_=aJ=nT>!imm+ADoxYuri-%trCsULb;Y9|ZM=dhb+Ge2+8*=9;&_$xnT4jQ%vHq!`|4t@xfttMW;+-q zUd=Gr9MhFi$T1}IMZE$gdbBIn(MlRI9v#tLa*Ju2W)4jPm?;S=NN%xYoR_(-7?VE= z1{pQNLD&0%%A1O7<0F{&zdJr>zXX-}*5V7&d&O6VCS{(lkSt5AO~rBqJKuV9v4fx6 zW4^iAdP}h{aPMu!-V4%OH(s$Y$P=8Dv)Bag*5U#_DrntQjOH+Zk+N@;P8J76k{3Wq z_&FtfN(sNIWbj#Q39n#QO!k;JAl=$r?EKMV@C2YF1oa9Mg^$x2iIW)WTH%gTy%y}uf#A#VV`pmke*m2Z6mHF&1$NKTrK1T^W+ z8%F_%yh0rmNjM3mu95=iFb5|AZZSw31W~1%Z|uOU9lxFU4O79XEb)^=qgZ+PMNj~l z(9XZG@8S6t>%j9M`${P5m(JvpT0t>X`4A0Byc0 zboOeY%}dO;fWVuJ(G%Ql#jd~gm|Kg*_^H5aVBsyrz^-ffqBtq2hNpy0_*D&G>$mjp2r?v}@B{oRQD%5}itf$1in^B9ke&}ZTT4QT&fzKb zzgL?HZ6`_scy5@)LDx<@7O$p~v2Uf_axfeD52U8Kk zcxHHtw52124jKYg<7%#}#Ormol&F=cMtkL>sRYv%fhOdiC}Vl-2O|){Uk(m`c@;g< zC!$nT^3hbJMU#+V`tqYM9iouM33;4g=1L1Vp)j!fw&Eg?>lZi%Lz+1i6xT**RT0V| z^_<8#zeEr()m_5b&=Jq@DZYvQy%^%o-Lx;z@(4Ym^OXebkI+^dH7RT{+o-_3Ef7PY zLlE>|OZu@U$o43u+Xd5=R5`m>pQ<0@E|#dHvGJW~fIG#QXq(u_AMfy_c`6wf*l}b` ztopcgd1L8{B%$_0p=M`k(@lbXzR<8(SiMqcK2(a6B%jl$U_g4QbaYHQRXP@^gjvBp zN1MrLJ&Q!?Q2{1|S|R8)DYNHjJth%(Joz#ma#g7nNSs;3k}3#ny_t{DURWV!Jh2ug zRkjxO>QR0)RsVTOuk>f3bg0e1Tuc;w(sROy^oC%G*-DCaNRAr80e~E$PW2?~ zMdXoh-bS8rwH=Z8>9Te7^*Ka$A1R>6T!tz>!NU^cBhLu8pNaJPxh|YE zj@L+3>8KCOxeDHWF*u&9dCPI`rWPgFV1ZNn&&=ZP|Czw~H43FuU-Cu$F} z?ZvN9;)xQW8AV1)6{W$6gd--|YEc}CL@eq8@gRPm(s~qtO&|+NSVV;S=d&Q4~!XnMFdf#F#kju-w9GKP+{=(lP~1& z6G`5dPr$*=E2On zwOnmk<{1iJ6){{R@O<$b<+G+CMkiqU1x@Ts}ahK z6XxJ3&O`O+YL7y9Z#|09){c4y8yncYM+@5z|lYq@`R`=oQX88Y{FOZGZ1>m&!APM;mm1s*+_kqSF9>>(j>r%XERt zhkbtH&P-0gpMk%#V?egzfb;|1dtWC9e!lfnYis_1xauD2g70hC6&FskaHqNII}2C! z6J1qs>TO0u<0=W{{Ght3?nI64IC0)3{-7ti>Ka$9!t)4m9VV`}RdrHRwN%}B7=VU| z&u(SIaF^{^L-mQq>JL}g>icaqM~FkIy}oW}MT6}Gaq(>;kL9-2{Y~W2++;h3-LBdYO7DIsI)cMj;~m1Ti(CaUVWlARDFH*SozwzVK}uPhNFA`^6IAA{>r80 zb;nS%-PX`=uP$$@9I&lw?yanAs%+?QuC||8QC{1>ro8S1oPvkCi2v&G>IQrND*N$@ zb;Pl@`bbw-LwN=96z*C>TzM-SZ1(;p5?UMb>_wis{rRd#q7cXc(FAF{7-c6H^gwH?pH|MJGed5yLc!n;cjmb|;< zy^@2%d+!~5_m6+->gsv%Z!=wJA^M{FM5xhM{gJ!6Dypl8zWMl8U^yyr!l!w~2bHUu z?6%`@?5?XBt86&lP`8|5M1Cr4wi7exvGR&xJE6~TbNR7`W7TVi>?@BqH6C73UF|Aw zK4z~y)?j%swq18})Mu(W#ZflxegRIWy_-0p0sKDN4? z5UvY^JyzXx)LwT}f2F-?0KX?e*6Nz(15I_cOPdcYud51|24(6FbXD7q)Et{xy3)BK zu#8&zlNDKOiyIC#1(rQiSG;WF(zlmBv3y};#_GVb^=kslT2?-0Teaq;`yaD4F7?;X zYp|>eEc35;rom8m9ZE0Q_VBjM?I*T);+TR({&^3Zf@#pdfJx#y-Rl~x9_&yx*@P^cm3X#i)`yqb70w;X7YT@MxKFX ze_xxl?(|yU+VIzz_2eDBA!*%*>qpkRuf_(Jom+WsD*HTh;lJL%*dvKRq;Lq!oLDU7bLpuW(ICgL8AP+({px^Uimo{oSMMhqY{tS^7`mrs%tEawXC4YH z%Un^Trr-^%As)%f2)ET&9T2#E!%Y5p_d;##g4)z*%A2b?8A3h8~YmiOB6Q0j%SotYTFVQgnU+P4S zw4a@49L0sJUK7Wvag$ul(y3`qzQ<}3D8_#SzjTNj{!N4RR`+#b;DT? zS;%&TD3z8E$T=ay9%&mFQOhJ^{U#MHwFDOamz2n{>;)qteSQN;^M9$sn3bUBBt{zrF1M?i^;iY$KB;7V_T;5a`sNB~LWrd~nlbE_NbNRCOb#G{v z-mdco9eg6DQ_S)@6_rx8oTUG}*80j)2PxOGzZ*GIGWT^Kzp2dmgR;!2+I~U+G=_sFP**5?P0tl{b%~HA5cLY z8e7`6a7;AxVH43n=uS3I{HQ(#KTsF=D5-7bAOu6;CMl~<%3K;~xm!CsY5V+6Um3PF zik9}6Us=jUQ@}8De>ZWzUbvRb<_}{w@2EFF)NOvS+x$$oXnm&Jamcm7!;|Pf=gKlk zvmVEYaEk|@C+Dy+25IAVTm%tKF&S66AWDt_my!-4jFiJhjvz~Yg&R|S$IF9XEDPB8 zbq6ZlUBuzSeE0`9&<|gcDQgUBW{t;jr>a9?}5!YDh z^zH7@eKhI_PlTSC!cvMTX1KU#M0b8B#hnS4&dfcq7oZuSI}{F_8U{U3QF5KLzRV|C z>%1QRS{mF-p%~#zF?rq}D$uSar-|{6|Ab`)nvVkuU%~GRLBZfm{LVTNcM1%YKo8_2 z$!SpqpXd`>JW0!Au&2j`1(d6k@ZNU=e>wZ^}01sDpXog~-g zyi>EhieQ^d!)l_z?KVNt&0K<(WAu-JrvA*&>jD*Cizh8Dtq-an`V60Zy6F^3fTQ&A zYfVcFzXL^@qQZI50^|X6BTJMedU=(fnUMNwydvRN zaapEgSss;%T7R$%IAfbtP;kT%H-ZyXA$QzJPS9{d94EwcLINjfIYGw>iJYM4gd|Q# z<^+ZlQiw-xNf{F_sAoq8QA3%O?Csj|?C+6-3O(kPTH)|FZoAk8+WY!|ZYvbw5EqJU zT_a0XsGz{rQ%x#zxCv6EetU^r14r$uC4t?)=$`acN>%G2D4K8vt-*%&Wbz$SZFvWu z4d%d514~1f&3v>w`V%co@C&_H13HjpZ=Z$K46j9jO?J_rbIuA{!wF{rJ_r4=F7 zojmsvHQxDhSx8epHLtz|^`NW$*+B4t?(9dqkt6%DZZ@LN`FffBIMi~#bLmQq?Jiz} zaqt8Do|gVt%|{39KPIF4AxMpfx=Z+}9)fTPi1op4=R@@#^>)4oxmQAc4=`{ z07kV)q!hV80BPlV=g0Roswt&%HqvO^&>Yo|$+MlDd;%Z3M|cI?$@@YP6#zjjLAzcX zAU6?ol2RCB6@JV@{lK4qjp}2@`!EAHO3yTmgUI8>nW{!dk*pKh z)bUpJ`07YMh6Eo87l!c^#uIvtf0d0Agup-CKI!x8VrjrMmG*0#bL>RmA%tyb2 z*P)2|{vf+?yftEcwaTCQG!hA#q`mNj8IKx=qsoIF`qc64M;moE0IFplu)b4LzVP?4YR;JQ5}q0sU=K0j2Tn>haqmK`LZN z)-aubd0_XWjm+?-JHGMXzqWQGDnqYR83Oi18$toQ*5)o6fUCvsR>;7B{SI4b zzDfg8r8yk|du#YR2Dp&#%6n`*zDW=kj5yBy06QD7hOnA;KXf5!xWVh(N5Fs`)Hvyb zg?<`y!AR;Y!fJ8=hkNR`pFAx`5`lPk>j=L3u;qnU=&SHPSw#i`X8FL{Ih6FPR!qo4 zwtyX1L#Ubf>!puuC@A(L|0D|FWe;xb>v(6h{cREGp(`vgq7Qmy=lLmP@70mYL^886QGK$miCh#s&Dn$MG+g`C(S@x`|+gj@UmUj$;$JeaWH7 z`VKh}7a_<9^$`K%g?RCTHN4}#0U}cTTp|TVX5j4s8RP9686zwVIp*W!@33(+*m$g; z*#La{2DdfVSl{M|k-P|%#Q{kI_1m(Ic7kP6{R1oG+hym;*)QGB_Q@sBw$n&-e_O z88Z1ISvKkAr*TsJdOl8Ohvb-1IoZVESPQ(Ez&J$5$5|d}f*{EFClVgqA+Vu~2ubk) z=HgV(q_M$@)F%@JGO@bA@o;7UUB{*E3B# zF-0!Ka{Z>`Wk%Va|G!Abi`Zh=Kuz2oV*OqmvRUOORxz9CVMQo#9^ONVya7VKk;45_ z>J;f$O@YeQ(G)`xY3lkwC8Flw<~u@RNO^ES*tk9vD7pN_ zvi)y?ZEA7-+&>_idT79Z!9FQHu-21zim!Ls26-}fr;NfX6h>oMbAoadRymq1YCgj2W&VzV3~n_kvFqq3Gx}V( zQek2tC%3%NEUhot9oRYEYBxm_s}@dANsHHb5sSI`c~1iK?|z@O)9xKbr%YK7*lPnV z2ke~&^oa^9A2q9BzVO*n^;f?lRYl$bA9L<0ucKE5k#jO^Qi5E6ShBVHaN1PUab(e& zbQZ=vrEZZaV6Sf03C*6E4(ZwE8biP2wfEt6o@n+%kH!n9zj%s`gd;<=Ct8GE6ZZ~e z^7A@yWlgk0SKrJka6l=h(-Uoor?sa^Hn9Vj^RW(H(SNA5wc3CEMq2>X$;?=fDU+-j{(Xv_}bN+*L13M7|()V6_SUz_n#Q z;!;PtGtMoUAoE&jSegG0rS)$_=9b8jKy`_;oC6 z62psH4qR>Rawis$eO`9_vDApZdK3i6&pt!-pNllHYt5k7i(oeQS zN8F|Dm!graWQ~^@14hDmoTQDT!bH)T*Wk=Cy&6ZVi!g8EIB{d)-JYU*`fyRk58)}w z6n%?iSsPrn*GM*>a9F19y)|kD8wnl+$!-K6s#Eo3K^nN%zlJQ^19oU((8RE)$E-cs zPY{d8#LIjtXK3_`v;Awx)uQRf(5Xh>WPhmCxit%^+i|$v9hANT{(tjA z!y~{XNwTD@a6+aL- zjA`!hwzYoDcvyWdT?A{S8%lYglyW_1m5dS1u78I5C8l`_*iH!ha zl)-v99tM}s<)5*i8ju0v_=#?Ed5D3%j?~R!QXc8oeb7B3-E{XE$+2mV;}Bo}1_b(L zzMgoHA?p?4kzTx32#>-inQj)kNShp&oX~S_Tvyveft)^1j%P{efv%uwK|u=Ej zfwl4@aE|Ii?-1tATNi}qp+Zn%Z)DPQ1C9*$y>-Z54=2jnFs(`cA&&*sJ0n731gMZo25WEfNgubA@QEeB11oIF*COfGV_66?&(UHxuv062urBQ5 z+oe4*xbBp`-s>@iGNg?9H{B8T0wv%+Zh>c{y`ETP2IE?suWlgV!qxC=uvbSCeOQ}d zc|)I766+BdK1mxvLV=yfbL+i6j|pcMZh~$}Yy|`43@vVTA%+zgw20f^&uhJXQCN%{ znQ;Iol*V}g1zD?=W46V#T&WfI6Iv_R1#!oRlLJbJYie6{@QYhYe>xhO*W)g5)`QVD1KqhYquMLrVme$BRN2IYaM{-7?HBED% zm3*+v{L>a32MDyFBc#D~Zty)akv_<+$Iy}%)%BPo*Jm@No07C67+W3_xuK41jrCzj z&LLeVylm2t{kbS3t~LEh%LUwUJBQ*PZ_#zljKCTP0}h^ji>M)gzprrEQ1}l+p(uuF z6=>NBkwC9UBQurjv2lpy;d&w`NS_0TGqBev*ONoY9tO0JTrWxoT0HsWHUR+WF}4}o zV5Y+3KJwV9CJ3wUa7l^nfjIYXA zPkC6l&SoOa#rI-?ft&rlSmr6iEJfNAHj8G~(%d?|7aPMmy2(N`?0yjP5^P#7oA>D!X1~FY?@zgHQ z9LmJvX`0u|GCG-D<%kO_5Lf&a1AB04t94$h$4YPkgG|kMs;+{gsAAo0gnESG5Vm0onw z3hBr;VFe=oD(ZgIt)@mib0EPn@N$?q19|gs*262yKuTgP>#@zxCEiS{$Z-Q{YX|l= zT)TvQeAKS|HE>4K3p47cRIXjD+NF0TGLv^3{vF5du?-=cMrCWMC~q7fAqZA{4awyM zgqhxKR%|vaH=7^W7&2l=kG9H2{wp~bJ1OT|ojW_^1#GO(?@2m?m9AS*0T_#Un7IUX z9Bv149-ju8Zdq~CB)zyvO4hqcILXkPnUC=Gz(%6EBP+?q#hx_rk#HtOrr@Mi zvAGsmyO1>)F3p^X<5iNpk+~#S^KofbFf9?*hIzaC$OaA0Hl5nq(JB9K z$RItm$+ulixo*TQwJEOoOCsdov0u2ZbLm`(E}Re9>uodMLw2n~7wb1-5i9Q>9r5Y@ zW77z+TS>M}z;sUsxp9k(;V`bR?IyV5{tYZI-ruw*f9u}-9R|_ZDL-}m+%kE;ML!8m zWBb;i>udSRfhEKaRm)hHK^r&>3@n~COcEo1vYJo^~n=EQ{9j@@nC^VgnwkQ`fUmdX;+Q@Yt5PObIy5Dz?sAeF2A110DOcP=wAjYTwP{+<|W0xlPjHTck_342^St>PC_Nai8?s zZio)tb)naX(=7iCcezjJ3Bw?*EV>1Ic`tP*rirJxn?V>f_`L2wcbXq(h+w72V^y$j zF_W^152oleaFHl9$pw}KbWR?Bc?n}Nj35bpc(J;>E7su zBg=8_W>5!^Q$a{22BV`lO)%kd?%#Cl4&KsF6MJtTWQw?`+Gw&+sq)?dVnfuAFQ&%f z7_+CNZyd*eFb0{kgz=IWcDj(#pYHLyBk-Ud@E%>ADzrjAyHrz%5XMZ znj66_G#Cdq%GrFf^wO=oR?bT|;7-89y+8t}<1bFUW9)=EW!|mk@7-!{zSW#~tNG{_ z^H*EUb8j{GZz(Y!+M=05$%es2TjcD)#4P|aXxJj>4c@RtHV)=&LF+)c@7-!hG9+~( zkxgV2Bn(hYBvR%f#edxb$Rh)UD7NbmcXSIh`aIqM@ub0L;;ni{D;wEZ>%3bXaB8Me zwLWbRaA0mA&xJFy#sB;Khqf?EH- z0<}@V!u;T^edMz4^8OJ-?!ft3utz*)R4d7!;7E*3)El*vBp4~=BTI@oy2WL72=@=IGVAm-JOJiegPokTN z5va(8M$?&vxr~S4K|Gn*_^Vmd(yYz5Cb~&{+z3ff3)zXd4$Dnkv=rd)i`Kcf;wl?b zmtcg|Emxsr;;o5@(}dz!=2Ne;YV*}Q9a*KkSCp>|$O}ZrVBKwCTE5h`3uAp!da@P! zM=`bBhuH23iFz+&*N5HTl3hNeL5g|9v9mJF-7jsvtq-{6v56R-_}dAK+#|4U844E} znN)nSbNvwfa-Lu!tL!#1*!jzai~JGrwPUZOIoIDj0ti7zFZ}1bje_YQ2xS!5gX~4G zI0DfDT6=v9sT`ip)%~d(f`QU~M>Y(eTSkO~AA2@BirtC(|F3v`R>K#HKwJupG6g9#6%qQuS@jMIujh zIL#DKrRk;Jx8ufZn7J0on}{8lwR|?tP2M){gK4Z7rd3`p<>zBi{PuQv!QflBlNouL z^TFHOFb@{~Lt3+yIVe0Kt=`JqUueZw;q}tmtxz@p{-9^w-pfO*L#7dT+&gVJ2W1)m(Yxv!u?G1wz+|aDIP_lp&O|+C-a@Zy}iFM z*?<*ss~0+96#k|OjGMY`g)s&usZ9@u&{J!-_8005M18BM_j?5;Ss(W8KSkHuLdc+SlAQguH(<$;q1L5 z5r1p~=Z6tO2jOpbT&#c};N8-5cMNofXw!QKruxjI^>;AmB!ppeC!NpSnb;}Ah=2V6 zvqetkO>&G$RWfB_n#qom!G~RqSlrL0VeMf@6k<=VsQ0>~amc#&4kdFDhLyBiD(c-{ zcrzFb%s)ZCXiapa(sV^r!h8{pEi;XrcbH_oFtIPuF`yrd80+mxOv3?WQCOhyOQ-K3 z@HBwNyr}y__sAaUt2_4Mwl5Mp?>5am&mf1(iWQR7PMNdvJGC;$R~ujI%!ESq*?^n7Mg$;q&=BF(iM6AJQ@ zGr)q@AvL>Un^o@Bmz#32%{Tz=ZGUMR{-+HJDn}tgi4Qk_mm0kjl;>*95fyn zk!CN&E=@R8$9zIU#E5DEIJpeaM#wr8VFGysMBUKm?icJ~bb*4f@;_q^8zQWO5kTJv zxfmy`@TgNgYD{QXTW4TCCY1oB0w6=Xf*ZGwkk;0359vHWX{|@y7aZv)*oNBq^0sR& zc7jNQ+i+l?;tt=1b%E}7niENYi@RBO?5>cyj*ZZJTYcOccahCyFWDC*pKpKjiS5w8 zhCZylcafdVAoK^Tm+VR-D((dteLzBY_%7?QyBvq- z?IOFScizPf-<4T;7dLuWX5(E_X()|113p3X!44g;p0~>si;U8eyFBr%59Wke5{Ao2 z2v}(O$uyxI1kBqZFiY-2p6>uA`GqR3bonGQLW%eJ!70c+8}zz^9<}c~1Prvm6&lq0 zX)Ell(w_a&p?$i)-UZED2MEAym?Zs|Ovh(40X8y?-UV|kS)u$t{+aZV>VDMDEqfkU1-Tv|aXJP5Njy>6UQP z)OPu^t4UL{NgKmSTj&6rAjRx}S@OzEiey8qD1Cp2{Q2l)xSH?p=sOdxXWlMNP@ZDb zHI_LvMUfc>fBX&qLM!5+mvPbiyO^``Bpa#W|7Q7^IWK?7sx=cR@vWoB%qJ&O#i9CS6BC**Y}<8JCE=CopXfa+?mMXt*PH$U>N}}b$DxrBCiOF zuH5^*L*%YToUWw zKnOS3Vi1~5-8dPY>H-V{&URgn!>Y>WNWgOhwRX1IBF{(ZF~B-7Wh0gW_=a#wu$y=Y zQD}S1*wl1)>eswIr{V2sZV`-QiAMC=hbMm4kvdI-zvGUk>D2p`t3lZr)3<8MYgvjBPC)I_7M`AwH<1dJQ9NNKa4QIXa0ex$k?S{wt0+&8;v(AD>(@L7H&Ip6Q+!*&v$X37 zkfy|{c#ooa82poV0oBs%A+rO9376)ev!GK@Flqj*E2ybTRN+D@>}K4#c%<@&E;nYm zv5(V zmU>FPXEFETsGB?1L!<#^(*tM=DjR*{Y!NX4M#U(S$_M+55&J$}dPv2*t%k3usnYa^ z_e6f)sV^?X6^np!&*hevl$X_)*lgt(7`w`B?w(Y&-72PP?D|4)Db||(wX#6@mJq|z3AinVMQkGg6?kC#1RXrPmdkYTxT1#!575{;bhR)~$18fHn|idy`6ToIdOkA2pa zqSk4=k1N5XY5^Ab&|s9Tsp`t*aD-hc;;t$vG^qnimO4~yd0tTp%+?oO?YuHiuT!EF zf{ft6W!JJ?R2!khGdUMudUiG%A65)x!zvYskczsutfz8-FVgMV?98z^v*M-j6A`nq zDvb%f3$;TfqLWj1(htN$-^!K&d(y=cvO!U} za;iHPGHe4{=X!Sp(nc7(>s`#1aFXW|FkF9QTwCcS(ZA3w;tz+N357;;g|o=yFqAs6 zt}pC;{t*DLL$@2zo@RtA@w6afMP^B4X;&=%{Wcd?GwW3`8hWEWhFs!QL68av1Mr!E z;=)yNU08sgMc}i?5kQRo;%U1z_MQBU>_k?JY7pDakV``_Vg7J|R-ZAk@|C#Y>n#DO zB^r6p!|koC6w%D&2wc@TKws&OG*yA#6yx8k!Q%gg6p%Yl5V0+`F0l-mAKIb<4y>a2 zi-lHn0aJ;>LC{lAIKJ_Ly_CnAixQWOzH*9Z_}Vbes}(tuSaqd{AL5~IrQ9bU2(xIk zRaMG;EWWzHZT#92gy%NlQ=rlcLp$JHX25pzTGymHE+-QkE5-ShVhpADWiB*W5W$YvBr8mYf7k8T z_$V7Wg1t~jfi9Jz78KEGr`vy2jc^jicH(*vQ+VRIVAp43js0)HbyQuHfDsmE_dN|` zD7!g{8|sFs*G%_+3e@9 zsA?SJ4-kMD!Zn8l!Hsn^V*O?|`{9HUsb zUmAl&G3?0Ayw|uK79sLrpI6zVY?hRll&!tWkCf&X^GR`VAr_9d$b7r$V>-iV3ks$Xa=r@na<>@4F`0kXV zJ;UFmu;xVH%hK&IDVK(eJh4L)7KL)Jd= zoY~#G_6HB^ge=EJJR^lX0yb2Ylh{Pw?n{dac(Sh-JlWT4i%qISFonO;oLIeA;sM!` z*2%X}QSr@N6?Glo;&S6=(x3@a%~~89YFx3Wj?~%TaJI*u#Eh z5`f*wZP}Au24!+v)?}Bya<4RI4d@c9yr*=x{?+@@ncm55IAgo#+1Y={D0i}Yo!#-xbxaHZ8R55ERhs6WO!XW zr`SkOgj^Qe`9$C+=B}Fr{UxTtYjrop~$lohZS9IDYpO9 zB^sBnbQp~OdNuCBWU>RjVJE1k1}5{N;eWX1Bs{TbD;Av$Z5G)=J6;2T8oN0HAA?c! z{EorMzf0Qu&h*zd`bwc+KDureBL^fwfVWnIXBD=8;Qn!asm({DUFh0a zoBU){6^xN0AH3n@!<v3 zMc(zn@kN*fuLP*m6;Kt(X@`>wxgoOzU{BXjzbLDN}^JmPcy9XJYN_P3x@K}e!MQrB-i z5P*X*G~~l*XQ4v8L=3WGCXNSr$h_`dKU!AM0E#FKz4D5Y zAs^)(qXNND_B@su5G#Z2!_3=||%RgJOrWt|z zDLo&71bq9RdT^igPcJ(^mySQO`=`>}T^EL>7m<;-{j0B%-tz|*#l6e&9U-)h&@D5B z5J1)Pa)^D{Ivn5(;QBb26$}qNRdn&q?Q{vy#ZQ;M!dr`Mq)!dH)DymsaY%A{Ne1Bl z0E$3O^WyUkESY~RppGWoz?j_%Bw9!0BKp^yXnjXE$)*kH4{inGynGz(44-KAsE-CB z!@gj6|B|%i@V@Gj0qCD~GgTUKmsL2_hcX`h5dJi&+By&gf4!vKs1fi~(ngKu@o5qq z6P_pKuW`P)Nt?!-q!z@%J+^_E^|?XRo7@UJz&}#jtXfp|XhJ_gLJwHQ4iQoC2BL{y z!xB9>n0c_CV&NAQ=1w5ovcRN6fPF(Rt>(cx+knw5n;a&9WWmZLvl|s(t+Ngc!SU#c z(!)9sX*!EFkPr=|kWuJhn5E_$`jx9SPN@4pkq^w=K|F;1CItk zIPy%>4(K@6;A)oIqX&h2Xa}%6n>}8sWM=7F- z7GVX$y8f1p7yhH4Bsj2k?b>yLMcLPC0$lA^s{(ni1wRkujD-FEk9jvP6Z9{K{^K|1KmK{|*X#oO`M>I8$7ku1)lV(6P8i!X)zpGk%i;U&L~8rK-}64- z^MBsw|2*IK4azzD?919~uf6u#Yp=cbhOQ{L*HyC1Z^|vW$z-yyY@FgD>i^)6vnSU1 zBZc!bmGi91IUVB+s+==1&d+0<*$U^p2xp(l=`uNwo196DoN0@k_C?Njlboxf$|$Fg zay}8|ERA!T;+(2DCmRPa6g5MkEYN41KU7lJ-$PO7oJG<2_J#iaDKe-@)+B1eU$b%K zovt|=c|Ot|IT_g;d0!->c{`NrPm!}Z|2HUdVG%_IRu6lf6eC_3KGQkuy+Yn?g4Y%zGiVyA>S|A!aWtP7zO0D#ngN8G`hS`u|K%kk( z9!}`urn)92HZJI-sAo$)Q=L`K#8k#=qFzW45(Z)hV@6{pVt%Cfp|Vf)yQGJsAB`@G zu1UH->8T`j(t3qA_H69ASYOfs{Z4(o+D8d-rmJLrB5GCClW}L$K1!dT5lk;heJk~J z$~|eX&l{a5&hw@YG5=s1QWBWor=`swPx4V~)3@flnNyQPWj&jHUDh8nzRtey8?w)m zpS;hYWj^kQ^urID=mk4SD>Ew<-ryOa?i(4;T&Wo6x@d<)QEu;$qiDd{MUSYdR0prp zN3fSvZqb+BjEqv5+FeL_r5`CQ@zxgV=O#^{YR5t<#qaQn{YZXFDaQ@!lyVxsd{SmD zxy(ZAa>~K7RwgFFl4@;4I4Q{Wsbw7>$^BC;C$ehkGR3?f^eCA_)=iW=!yXIDb4}-E zo#nG^CdT!B-sg#6eqS^x#CeoKx3^CO3Z0Gt<9zFC>K)4@`J87!gmn$|j%iW^meK`< zT~aB5-j3Zr*?7w;Pr7wI^^+xQ`ufLw**0oy#3xNqo_Pj^ax9lm97|@;d;4jgit2OE zXU~lI#>TwvG4EK9;*L%35uYQ_RP7bmHG`ihjGdsy+iX-JWz>G@aDJlbbg+s-)~LNm zK9=wuC4=)Kq=gZZhL)D9QO6oIXruHw)dRjYQ>XLs3+|1lG?UW02!Yb5wbGIZ1YI`v zOYN7gT0YjbhE36wus%V}=zSyo92cXT8$(A^ftUN-UZKqVj*^u4S%ibXXx>QKb^&-$ z(;=c#A7Z(Ul!I3vWR>0?vCT_j5s7^0yG{DN?|KK$EHQ7=b2saywRESKj3%psU=$hI zVTp7M#8bN%Rmng+z1#UYg+}PO7!I{l(a6|-6Us(TSochtj^05b9nx{S|@H0SFWTB$7Y~R3dN4f4)s`h|_+Cf~W~3W^ahq zUQ$P=rGgbS+DkpmOFhiT?XrT6N}brxelDajzm{qKtW2?gPo1FIaqC8kd33Vfd^w`i zJQERAv4xUD1$J|_@lIE5JF7UNlA}#;fl0IQL-!^|p&MV&ZPE*LqMp`*wANen&L<;K zs^j5@AMQfNP-)s2!{<*DmaJqWf}hiqL02uSq)TGLTpCB)Vo1JPUP<2^Bc0ZF5EyvL z?5QUsxO-#Ns)Kx@L3>#)JLQd#TaJ4pPL?5yz&?qmT9aT=YOjbYQ8*iB4ni2vU}FD3 zOWCU%#4?eyi^DG6DZO>jrRnEA{Fcw4xBT z?{xhJtuV}I&xsgP!pn?8c+32*8occKjq4fdEj9Sq^|9*|vIkx!%)(Jax}guHU#mHO zNJkB+&HV`XX}hL?VIsQ_{vr=?*mn$W~AVB>8D=A!TUZpg+8fE<_&C zi==@(*)3F{Wi_?yr%TrC`T3HKQgfseBU?j<1X;YW$h?M<9*YzhyhQ+oWa(0Si7as^ zvtN7*{t-p3vxx37XGD?SS`e;v4H!{vn78X4)6{(LW+nkiOgtW;elzJp-A4M$qz-pi zW-~?liHXC5u!bc89ZWEN*AhwU5^{y>m{Yh3YXkg7_Lb zRqq(E$tpfWR`aPR%jHy4oPf^ObZ{3nVB*FO59TIzjC2As{J)<0x8MBa#ixJye9sGS zz4o%>x4(P#z%TyekI()3y?=+QGU78gM+NLnQC#F{!q=}C-e)ZAE&PMAP*F%BuCUA4 zx|-|#1CV9UbE?yYQ-wtEdEJ--kw289unc*OjWvkx-}M@+)b;)WC9KU+D5Sf&S@I*$ z(iG)Nb)`+Fgd=QO{$NMnq=Wlw_j*??*Z0^<&;cL6agy{G1kr#@qp6HGW(1 zdt0tJVm3tUW@b1A!PeEuf9>jIzs}PLx)OF;@2cUi0Eu0W-Mj)^aU16MB5{dthcp?* zAHl=?{b=*5=xb&3G_IPxJa~0a^srZmn(P6PUi*PU1DttfI14Q#b8>=Xhyc2lqtmgFB%2 zbuQr}O9o5hq)oA8qH0w;DK&v1$MI18)CAN(2UIV!JlA4^{+2CovhY$G9o4n_$YURV z@b#4$K1KeCMNguB_4Aj0|N1L$zVR*}A^+8)5b~TaB#;iBnVFd%>ex6uqm^ttSys%< z#LeLILXUYlWqwKv-5$&p;Zbr-8su{9nvI@?x{LYkC47|b@q!Xwse8`S;jubTQQ14S zDVaO9+4tdfpEmn`yzbX#x8v2W&EAFAF0GiI9JA*QK54|yMUWA2?@oa>YshTs7KK7Y zm?Ka3gd@bs{)vQILGz^fx4OQd*yH0qi{PW6PiQ4g95g0P9H+hBxaSS_3bcAJSbCMc ziTXFvnQd`xaikj`ihBrej@EkgyIvc7CL>^93IvvFKM6INvaZm&_8odU!}(~+bPXjH z&$Ck6w+=md?Q*g@fnO-=)KNSuC#qxkRCx}YEW}DLCkWBxp=2Ua z6?7rCRvJubzaYJna77%R5xRzDftFkeJ;SotgTZZ6$8+ryAITGOe;EK5QWSeZ`#Bjh z(vbwA-1!6ge}H1&1%WmHcYgl68rmV;zLS}JkWu}eADY5||L?$jC-?vNKF(ch5*?ws z_VKUK{~ZM)n^rZlu$s-LsT%6+&Ft(KMXAbHHQT=Rt!}DrT($gKL_}3x)3q<;uUy)+ zfWKB=Q&nBV)>p5ajf$wWH8x*MrquTG)z$1Z2 z+{>pkv9gj+gyIR&z{gz}{=4*-nBmh`MB%)6L=;b!iSl{V_42*^IZ`rOE`yBd;^#3M z`53R4Kj0HciDRUMe7;v;#gn3Vq)ha2SWVsU6({$e)L0@;nkrbK;DVxLzOW|j~g@^T8)jF$&` z)by0eeWuNDW<->>&`AIU{i>CvIG*3JqDa?4{ z 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 literal 0 HcmV?d00001 diff --git a/tools/MZQD/side_b/DELETE.mzf b/tools/MZQD/side_b/DELETE.mzf new file mode 100644 index 0000000000000000000000000000000000000000..5c8c80a528b1fcb6ca4a213bc0df532ea881e513 GIT binary patch literal 8575 zcmeG>Yj_jam3Jh~=w;cGW$f$s9m|+O=3x{tUInIp3FBZ}L=qUs;Zc%rleD{qgb?Ep zRMV2sB)ctbHffr7+ayi8**Iz1Dvv@2v^bTErssk#&mr zx7+Zmrtrg>@F*MpGaGInQ%H=TLE*&U{^-f5bn3t|$3B6ze(JzlhxPOQr=)d`)eicqlzO`y*3YEgY&*Pz z*$%t)Q>ma!Z6<<_zu%OQ?%#B%Tyg{zB77>z>zGsf9H;smQ;?%yWU#)M7kl{0o(Z|s zoCrhelB4XO*$&gwCcQBU&oUEzCzB6r9@O@+T+a86j~J~RQnY09X3dD{&!&$-=6U;F z_8YhuT57IJr}?|afH4O4{^zG5=gZ`_Os9P+{j@y=k;V9jnBDhRG3A?Rlw}Q?XyO#O z9y@%p>_*K=zK03P2n|LLg%Fz|2 zRvF@rn<`NLXecTj0QMfOVi~Y%l|rF)LLoJCafQ1Tg$Qv!X3VN7aJK=Rli>R}#U|+a z)0~n`IQdhAf0r26;& zL;aP-?$zj>nhA;)Ie_49NAFZkNZ_SBuJOw{Ex5O7`w!M{Ts2(cz8U>sN&Ef-$6`(| zI(9fFpGLz)4vqHMTp|0|3^EoyzzE2=f3TRGIvhK8EIN2BdaPG-$A-bfu~6LSiHf9s z;Ebj+7!ugGiLn}0S}%mcXEebO(NvR4>qUwz5xSQS6zb%eI@!R;O&s*m4gsx~KSsS! zwk|X>AAV50naD69uhEIfz**(%bpS@Zyp2z&~rWJ!)i3 zDE`|1!Khg4dRt319?^w_i>~#^doLJI7`i3sGzL_DJqiijKBA5GN?lP(1tQ47*ln=y z_)WC`)DqVQJO5R?yoL!z>11+is7HEzca1*OpNa0p?9%>BW_$Q!1VPxIHS*9qGJ)W> zgXh3|<&v8jA)3i=DoH^T*+06kYZO{({)_M)gxPbfn@&zp1wGJ?9adeB4l<)|dBT$5%AjRam4C^J%R9FC|V6a~5#jo_@54I^9Vk|hllYA@| z;wKeGIHMr)VZmvJoOG{8_`!*7u1|D9m!eCsq+0$p3*{E+62g(DZA5dBRZLZHLXpmf zhv~~U!Z5yU+h7-&Y&&Cx)Vep?!{5_^R`>4RyL&)T)n;Bc3iBsuNj4B&;$vna5osb? z<{e|IN-d0Rq;gGymKiq6Bld1;0~&=K|DKLd7&&&IknOO3s?;7I(J7sO7||W61rd?# zfj4K!s?l06OROZGNfif84CLVS&VK#-_%Dz`C}gPMz3;2#F3CsOe$fI;yWDPa2hb5y z)n^Ay{Wu|CMs!|I43{K^i=i4KAH+M?qV2x`Fggdye(xVf^>iYX$G}cC6NOpw8z9{l zljrNB;Zgm~xrqN6%BR!j@I>yRwfF7by(^Wf{KTNNo4*Y~t;jbrXX{tk1T>n@3g*}W z4#`h*`=dBM+TmUcRlW}Wq8*~BhTiXrJOxoWipe<%rj+;^)`)Mq-r=B@BTq%1kV72Q zapZ%@aS)HcMvH|~-aL9%ZajpXZ@3(#eUIo?$9n1n4plpf%{ZZS+qre2C z@{fT($salj;#BV#2v!zQ!8bwh%uuhI25<~o+u0#z7WG!{<9c0vNTMr{a9m!emv84_ z0l5vb0x5ZK_irhD#zJz+$&P@)TY28e5}MY{MN`tJ1gAv3QCuQu-uLc|J1#=%0zq9LT~s_vD;??d`k7{D1Rp^ zTZ?#v%T~jCR#_+Nb+tkA4NQSO)bCYTp;Y07f+KZGL6t>>!8UaBlLjc_w(eoro5(Rb z2zcnnPdxk74}Si`$6xGy`OP<83qAAP)6YNl!oU9X$-O^;v&i9?%WsVPZ#44y5n9*3 ztiHRly07}B%4$tD0$O!X<+{~;-%H>u8ROZJ>d9)l@I?nDNt%0Jx-5O!dFC(XJ$awy zqwC!kY|XaWbG|a)nXxDDGK(smmfRVXa&Y}wpxn-)U1!sj?>+oAp!`EVQXWiG9@^e{ z^V)UuvrG-X0D5TZTt>Hd!E~Le9*z?$>Ji#`ErYU$GsK?vkMCfH^CSb`VRG-Wh6FAD zw8?N5mJ>;|&_%n$R1oTi?bwbliUd{`FWtL^1+b)5&88Itvq8xb&cdc`bgo7>?Re)8 zqPd$-Chy+_CyL+_LBDiBG|R~(T?5y0;Ur6KC>9|kCs}H$zx#Zzs};GvZ-t}XP*l_n zYk6GQ>-w#!ef@BSEt%Z5R4_ubRM5h^d)OU5j+}Q{^ULnCI`4+&ZmaViXzsB(w?VVb z>bw`4d##c)nY`~;LeAk)UPs4k%UvSlGSJm@P!g+w;L?xurU=r+fzw${qG6Bg8QcDZ z)EnbJ(g{Y`Ppq=u3_GUY%v)zw-uEkV84h*Psc~!)HA5H0o$!P9#KqHNO3%AZ(;f(TU<`i4y0!Y;i!YFeV$=6%t-)6`^%}B_MMLwE= zuj7|nIPo>Yt$B%SomoDc!GF~p`JYl1Ut`G1s=9FELP!#4^Wr>Sbn)UMUaXF9-)LS8>3VD_`J9G1 znUL1#tgKFZh|AUIKCZLUhW$tJjCyWMZOx~5_Q@F;;af_*D@k+5_~+4N(&q_~wwn@t zw7n_Ouc8f!L$qy3yic2z-o%L7dJ<>UHZew<*2E=fn#bd<(6o)mJLhoy- zOXT@{0A~4ob%|16OXGNalg|h5+dzT{%UfoTM>tw({ z3Q&(`Msg@fU2;USDM)?dBUY+L1?EJGDM$sJkwOYm0U?r4jZuLmR3H_yn+l|2u7RkM ztJ+$c{eiLQI{2=HbmFo1>dc?)>$gp*uHjxn;|( zTVC4o@|K@(*>(31w?4l0M_ZrR`s7w=>%i8!#zqLVBGHqXf`sNZ<+IP9d;n!l;T?c~ zK8=@;AEYdror=VFKuOJ0O6j{(9HCiNn#Rk=-vd@#BdJI{mr2`nFE6I3RQ$`fn*R+A zzWJ|tm}{_WkxAp;JFcYwMsEkMc^H&=4gP-(Id>&sMh7=J|NmT@f%7i7<7#Q7%ZgAw zo9Vfh%fQ*?>WBH()fhs|x4(ez`T~Cc7w`wZfbaeS{+%!24_=G^cT9fYE@Ud!8lv7XPXsg;zms#(ew;T+X8DYXLCEW!rm zJ;AR0UdW;v?@s%s?i@bZ8EkcB-4b})RgcV zK`RJ4^7D3YLXzz{3h9G)2(GJ!GX=ev9JVNhec>I9`Z@l*jYBc{24*n6r8Z~5nDzY7 zpDqs36A~Q6q`3cUR@WU?sbV~0fGq@e6S^#2I2l2iIVluYr3;^@Py$j|-DswSNJg`^hA$52)Z zQx7Luy7x=b{gX+l zuC-;kr?H`4aym%>F2(&F{(z^|Pg?65<}RpeBxJS6M;6RmNXQb4NUnNT)-`#E1v%gG z#XB$ieU3W9Ot5a0l4*(r~@BxH~2XZ zf1^L%xx}yhvS0bhz}7BV&elBt!obchg&BCdOL=49pSvPoBlVH`cbmH++ev%m>m(!6 zNep6-{B&3NrLN$c;$~r^JLnG$jNiita@>FCKcdM+>+|8t*tufeD7aQNB#z+0;F~1k z0O>%6gg-gZ1n6tP-Y*>kXcopZuNu?8 z4)U{bnUc3a$%}8eD&(84X`cZSWOsz+x_Zkm=~ffLv9=b&?w!$uhRN#Y4D8 zR{bjn;a0JM=9cC_2jNyPn75#gz^AyGODp(UC~wZsdRO@xRGnu33dCCsY4%EXm47+q zudJi&6|AQN@y6UVciAF$J?r%bP%kW81eVENWCB(xxSZy7IqZHPCL%8;lPLR%zQ|!731?DSDmCeSG{y=uuF@1Mw1S_ zjrGps>ezsfaOq^Xv30GU>G=T(Yrg5q5FkE(Mq0CuZD}EXU;=F_jje3m8kI&CEv~Am zL2`KsZ=6zCw$NS2Hq|w^A(4@9E|%RTG=v=KLNoY ze6C~o`vJcwB?g^>{~)*s1i^}8I}Qpqs=(k+Qe*Ha*TH)Hh=XLqI+w_Y`f*!v2u7br z!|_f#j{A-S+)@Y(+hD2uaY?GYZYjJ{ULXmj((BS=K1s@o(?tfu85)>fxuh?pv#m$SxH7;v&ijh!^kN_!TkJ|IzEN}~6?CS# zlSD}ld{zV@Lq5Qs0Y)Y%%!$blWkiE;x8Vr3sqba#8(yhtbub*fkeukUH{Y!+g=y$$dn*l0Q&ztX6l!JMf#0K%X)tI5VB0}xSfwR2oatJH+wnY$ z7k*6=yr|x#@YxJX>vB+Pmtz!i6|aYpKWx(?T1O5X1x|VekYG?@B~ffdXIsh8Nm5n_ zxt>~$)EUDeNUw{<6TL8V675G!HCp&d+thrR@C;o9hFNKFn1zc{a``a5jg9eTl+3%W zW!p<&{>mFmqJYEU6YGF7N^wBU82((E{ui}bXUQi@wz_#ubNW~fUF zq;w*%);R-9d^WxD<#Xumuew{=(_!&Bxo#s45u@!0Nd;;2?R z(Yw8+Ha)?Mm3hF(CU~CW0-%iGnaUynJOmdh)ntavO|adznpPFAusx%;CAM#nD;p@S zx2h7tdVD^w55Y`=>a+a^kqc5a2xt6VLXonQB&eG(3czsA#Al&c!G_a@&o;RY)ZcCD zvKpR+Z4arv>`(6k&3@A2t!r#LG~2s^N-SsVe2wj%Iv?WNSzmL& zLst5{0Z&6fUGxIP=c#M#NW;s#tJ)e7?B#9CyuQ}DDUoG#tM}908F8(wr`7B0APseZ z)BQdbC)EMN&253Y`W6uLuy85iT}E#3)?ejhn>RqfQ4jP{&qBwlgWmcZ2;hM=^zCmX wXljQ8#RYC3yQ&QUm%D-Wwt++HS;C(>Ni@=PM2gbr@dujQ>H^K)HlmXM3%fiEzW@LL literal 0 HcmV?d00001 diff --git a/tools/MZQD/side_b/QDCOPY.mzf b/tools/MZQD/side_b/QDCOPY.mzf new file mode 100644 index 0000000000000000000000000000000000000000..5cfc694563840eac074ecb1157d5ae57cb646733 GIT binary patch literal 7967 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 )zGkv}gH~yWwPiVj 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 E1;v6o;Q#;t literal 0 HcmV?d00001 diff --git a/tools/MZQD/side_b_applications/OPENING DATA.mzf b/tools/MZQD/side_b_applications/OPENING DATA.mzf new file mode 100644 index 0000000000000000000000000000000000000000..d50aa851ebec993ea65de609ead82fe300e09292 GIT binary patch literal 2176 zcmeHIF>ljA6n+6z20|e!MW&5qCvojFS38I65H&(k(}JKN0YYpnxjZ{4OW6=Br~?Qg zehC8;0}FzME`Y?y5HY}(EfS(ghG)A8ZUu!23BuT$uPUFpf_(b-H#>C!!r3nT7Q@_;A70!L8+n&PGmwss?*RN~7tPCd=>uV8972i+90AA;$pTJ|5FF{o z(+vcLR3dgyI<|BI;Yoqu$pw!rs8IwAYrl99qyy+wrKr+16rPWw>Wo2?Ub9#4E}~cU zYKvjr7wGw6&G$sl`xigXhzjBcwsB=J-kWztDB1~!lnafo$y)0$5RT_#P2wq#}& zN^_EBweur6A#a1^Jx($y$A+Xln?Xn}AxVT3LSO^+h;_*Wpk@g5pW=30@5TZYKo*el z9E62k>ZJ`dky`VRgupS06C}p%(D(3!!)x6dRyk=R^o4^}alLl3SO2?Te01LM{qSSb zEjkF^Rv@)dA<}8lSnC+Xd#r}8A43*ID+ae18RDGqj)M_rbmYX4YP3rOgM0TD? zmU7e*#>edLaK@#n6Ds+HwW22V{GlVttZrC_KC2u#lrK*fj?SoM(>BZM%+bPR{_vDi z)JXp^b>xM`w$g^|+WHm%3@+S{4%~YDa1&7EI3zJ9F=e>UoID1grs~aO8!U+))<7jJFbj#mk=C?`Cgsj@L^-j=icx2 zbgy>jw3k%=$sbW~?Yw@!e(&|`*F8PcGt>9Cw6_*H989KSb|WLMvdTi-qF~SUA_L-P zOW651s_Y6j75o&AS><0l=KRv;c}})QdVj4 zq*p>&!Q1IeLQhgzo~=(MWh9j!vvi0XWlYjsJ&H|ly(QnQLGDrU!Aw$F-#X|~T>jW3ySYQuSEwI$iSa3^2rIiL6zp2O@S2dnJ`{}f_1E_=SzNz( zp)($JF5oVZUsMNm|BBTcSkVAW5hnF1KNEinE0y1w`0)>)z5Tk43%~rwpFZ)?=kNXN z#^xevgLFuS63GjfI8S-9Lo&Smj_rgO5jG3|SB!rTFa3C@JWZ%9FI@uef;_}xt|@?1 z9TUm#0j}b2PvqA`@)ZSeqX6Dk01p+w?c<=VcO<&CPhJC>ZRQ*OQ#sa;uV8jeSpu6Aa4Fn^;Q1BjT znMNqY0^Ol#+#pkN!(@T2v7l*Co!#MH7Kj_hos6u~Nwb)(Xm4w3_AYQ}#o_PAZk7DQ-v+oM5Z+37RS$*6RXLA0Q@jWH3kNskPmiS(Q57_YEsFtB&8-85i zyKMOH1^$=~e_P`KbhP}OVP*NT*KIK* ze}R>qJWfVnG6Itkn2f-mAp-i~2W9%sk{7TZ(08QFqRdf!@cFXCSx+*H{sl#unt#Jl zxx$Sc@jX;Nb|QmR^BnPXX&gJs`GdsMrF$&J`JWR{m&mcboPUydx`dDI=KK$dr%UD7 zF3x|Cc)CQ64RHQ%h^NcNSTE=Qns~Y-j&0`rcZjD;;n-Tv-$OiI0>|8(j}cFozOe?* zf17x^sEunRm-+AXe>cC)rY>(mlo>dD5ZaM9bK zCqB`Wi%JzNi}mdv9D!iE8oJuxmk#COThLbIij<*8P|%WiS4*1JnO{)E4$vb1*(eSH z<%%H?biz*0>r5G`T>6T#V*pW8M%Fr({zlnhB0tby#FQQ1Mo!;pzFu}PL-NVS-@-v{ z@Pnds@7I~kXvq=y&$Ok#yYEW9`wMOG!(#o=`^8$_>w3~`th^~X^FxZA?)WJECdBof zo62Bf9onlW-bgCluJs~rKf+4I7oH!HQlRCB|@#+h?e`=@z)0riT|~ehxfQO7z5$WE*J$r}_s@f@O;zVypX#GybO-%nSd zFxgxL_dBb#QBSpt4VSFOpwBi>Rq8sc)nQL{gDb_y0lIwZz~|>HLx<3hL&ub%1EBg~ z%ApUQo6+|shQw6(uzIGR_!y(}VGKh=cXbsGtrsOmU8(d>zQ|;(t{XXhkos(Jv3?$9=A-_pE?1J3OEIC$8hFFmd7=tfhI^dZ(a5wBs}i(?5giem?gu zfmr%}VdN+vWn|Vn+`~l&zDWwd;HQ1E@mfrMiC475e;gfCMqWza3o|W4?LHr7JUF>2}oO&#<^Hy8Px+flZ(EOPJ?fyka(85IlT%w zc=BEy%{*fe!stydx&j`h-#TZ_ci#iGgjGxU0E7=%E-tEvWF0m4X(1iTN`H)8V3+H| zw!|yn(i3m#gYTSL+u7nuxn6>!B`}ql^~gNN&WxWMbU%QyTVY>MmUIwVdd{4M+ldGS z>2_jT=7e&^032tB1%-SamtQoONZr?Z;*@^qznANW&K2v9QT>&#&6zOJC=8TkPTg}5jBg#D}x5noixPqYOEs$}gPQEVc)2;fBqcB_F(En545~}Z4pIG%B2es9Aj_mRC zVW(B!r;wrgsORbaHSdlU;AEPNz+?m_BQP0(KNtaeC$b^#+hQzZYkJLKG!kFNR^4`8 zLxb}!Kik^HS~@z`bSzVweUV7iRQVeobzV(;UO9`|3+Y9YD04X*8t`T*7WSE}l@l`< z*}@Ce+8V#wwaql*b>+;1cRfz#55`z|O`nCTcvoeVGoRlt>s}pISKZdC27)0&jrSVe z!9dXPm&?)(kvk*Ntr4|58V>s+e&N9K<;&Tcrkhw(=SJ4F-ou(YJglQhWq1k2*5A6G zt>{p#(5SGz&eIuJP^6L;yCa4{Zu?@hY&K z?mT$%NVnB!fX5gH(T|~M_no!zy7|PA-^g1!w`d)!+g7hwrgp~qBHcdI@Q*v@Gc83Z zW$mkKP5rfSsHWa^9msmTWNfUdU)-m*M}7XrhW?s{g&S41rQhfljL<~9xf8IpOf|Rl z8oYSHMm5eY^lcJyVjR=ZRfBQWj7HUX*calxZiST(Q;g2g`0zx_h2Clmej^g?+tPy} z=<7Dr+K7QB)%49*dwh2r$WU;RR2BVX*nCl`ZyM*;#OJEgFI5fYHq5X$jQVjr#Bl^T z|NL-VT6}#c>YIjt&j*>zZlWJ%GDkrBLHn^>*mx$B=>@OjcIgD@Fz6Z3{h(ziuf;u? z3i=pmJ1sAehfP_(d9s))WxhRqT z5dM3Bg$eLfR2KOw%5W=gy}LzQIj&VyK2Wr#qH3^sMTNSxyrK$#R#B#5K}50?H_sm- z+YY%i_@6_&-oOntYpSSxq{vfI^>A@hg_@kwR8jj-$;yg`2d1v9STb0;qGF(^`03*E ziX~b_gH}-snWl;==rmQ7twhz6X)*$n5txj?WCSK7Fd2crfC$L%#^iTm^1G_zs?~V; z-PhZKe_zm(f=c<1Y`nxz3tWC@C2s53gUm{JU~eV5nL@&QG@eqkElS^uQj*`hU23t} zZ;*r-li$73Jsu@_@Ak>pnJDqQ@n(V&9@z2ps>skS6Qv`fT-=_s4=tF!|og=C!2j1k%RpuWmhyeFH>thMpw`mQC$n13!Dx0 zu7y|ojV{-MK3AQ93P*&-;$;9N>5}!kCyKm|y=S82!k^^bLjD?#GDh1-2=5g*Uz-6Vb;3{B@HXHMHk<8sBST4?Xr0KC z{8}*~NjtP=bg+w<{Qh<`cuGC^Pt>kBaPFr(;Yk>&4}b2b4IdV`oWDty(hu;bIP4K| z5N@(3IX){pUy>}PSMVqM@_N8Q9O#{f1GAW%e0ZkN{-Ws+FK6C9GDgD z^TCDO;R~4Dk0GsG#pN%_&bJc30r*7UZ>}wXhYR4_fveJJ4*i7Vv)O<<2SoPo3)uNt z0Xzk~lE#mgZ|B7V@~;tIRLSJ^P-@M@g=V7mo+x1FG;pfd?ms$xLOT~0z~>dfmjYL% zb2(H8KBH(hv(Kj+2**zWnf(&@T*>6ni!nc5P=vcC zaUGLImjj=0-^KdwnCWsxv3bGQ74(|EElfUfb#^oU{M;Mg7U^c|JX$Q~+a{pySU2mV z$M7tU$BAA%d%w%yisz}T@!*irlR|>lc?jynL(VuuEpf9i5P;F~-4k9j?8TOh2+F-) zf7H7r6z%ebynZ}xj(dH5{R|JudqV~u#yT4&mY^LTL9dTI^BNHoPpJbjxZw5og~QvR zlEZl+Y37M~y{#SEsupj{YL6G&H9WVj)>gGOLkpXmye+yY)jb`|yP|zflh*EC)7rYe zrPJG~HMO^R<<=Cp+$zHNhuAl!WJ|G;L~L)#LVsvO3GIo=6XyG3@({1#_nAJivn9WT zLL>IN`(UTn;f{YpD_CftUTzegzF01Xzg zrzo$0Ipf>HrmqXsj9Iit=CJX|i1jij-aHx3Es;KFZw&94V&=9SsH-oCJ$gaEfV8Hz zdOGL0c#kjM!<_zY5maGOGiH_CZN%bu*OkY3Q5G{oK2i|5-jKUq>tRXd`WGTRk&WDR7Z_S=N`1M$lytrjmi|jQN$*2Btz9KA z*RPT`2z|T%0%l2MD5g?huAe29>t|WNz5RbD^qYi1xgM8PuHQ+YmH>ABe*i`?k@mCK zV{u)U>wJjtWbgmSf#&L~LQhg&D0GR)%e|ye*!9Kzj4G(~SDKK#q~Yy2SfCAHRl{#zVls>}#_3ChWq zY`?rO-|eyl8cyXasQE0L1AVGORF^H4`t!1gl_6P5xm1o_tHe4U5%mv?=aclDgB~f! pcFXyj&M)b^rD+}4UT4t;TcNC1%F;Ap6X8Vz%Pfg`HU%5Y{ulhKsq6p% literal 0 HcmV?d00001 diff --git a/tools/assemble_roms.sh b/tools/assemble_roms.sh index 14f473c..bf53a81 100755 --- a/tools/assemble_roms.sh +++ b/tools/assemble_roms.sh @@ -40,7 +40,7 @@ ASM=glass.jar BUILDROMLIST="monitor_sa1510_hiload monitor_80c_sa1510_hiload monitor_80c_sa1510 mz80afi monitor_sa1510 monitor_80c_sa1510 monitor_1z-013a monitor_80c_1z-013a ipl" #BUILDMZFLIST="hi-ramcheck sharpmz-test" -BUILDMZFLIST="sa-5510_rfs msbasic_mz80a msbasic_rfs40 msbasic_rfs80 sharpmz-test 1z-013b mz5z009 mz2z009e mz5z008 mz5z008_rfs" +BUILDMZFLIST="sa-5510_rfs msbasic_mz80a msbasic_rfs40 msbasic_rfs80 sharpmz-test 1z-013b mz5z009 mz2z009e_orig mz2z009e_rfs mz5z008_orig mz5z008_rfs" ASMDIR=${ROOTDIR}/asm ASMTMPDIR=${ROOTDIR}/tmp INCDIR=${ROOTDIR}/asm/include diff --git a/tools/make_roms.sh b/tools/make_roms.sh index 7e2978c..35c72ad 100755 --- a/tools/make_roms.sh +++ b/tools/make_roms.sh @@ -219,8 +219,10 @@ ROM_INCLUDE_RSV1="" # | | | | |-- Name and path of the sectored version of the MZF file. addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/sa-5510_rfs.${SECTORSIZE}.bin" addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/1z-013b.${SECTORSIZE}.bin" -addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/mz2z009e.${SECTORSIZE}.bin" -addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/mz5z008.${SECTORSIZE}.bin" +addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/mz2z009e_orig.${SECTORSIZE}.bin" +addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/mz2z009e_rfs.${SECTORSIZE}.bin" +addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/mz5z008_orig.${SECTORSIZE}.bin" +addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/mz5z008_rfs.${SECTORSIZE}.bin" addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/mz5z009.${SECTORSIZE}.bin" addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/msbasic_mz80a.${SECTORSIZE}.bin" addMZFToROMImageList 1 1 1 0 "${MZB_PATH}/Common/msbasic_rfs40.${SECTORSIZE}.bin"