Files
RFS/asm/mz-1e14.asm

1060 lines
31 KiB
NASM

; Disassembly of the file "mz-1e14.rom"
;
; CPU Type: Z80
;
; Created with dZ80 2.1
;
; on Saturday, 14 of March 2026 at 12:27 PM
;
MMIO_E0 EQU 0E0H
SIO_CHA_D EQU 0F4H
SIO_CHA_C EQU 0F6H
SIO_CHB_C EQU 0F7H
PPI_PORTB EQU 0FEH
PPI_PORTC EQU 0FFH
GETL EQU 00003H
NL EQU 00009H
PRNTS EQU 0000CH
PRNT EQU 00012H
MSG EQU 00015H
MSGX EQU 00018H
GETKY EQU 0001BH
BRKEY EQU 0001EH
XTEMP EQU 00041H
MONSTART EQU 0005BH
ERRORMSG EQU 00147H
PRTHLA EQU 002A6H
CLSSCR EQU 00308H
PRTHX EQU 003B1H
HLHEX EQU 00410H
_2HEX EQU 0041FH
WRINF EQU 00436H
WRDAT EQU 00475H
RDINF EQU 004D8H
RDDAT EQU 004F8H
VRFY EQU 00588H
CLSDN EQU 005FAH
?KEY EQU 008CAH
PRNT4 EQU 00920H
SAVEDMSG EQU 00942H
PRNT3 EQU 0096CH
FNAMMSG EQU 0098BH
LOADINGMSG EQU 009A0H
SPCCHK EQU 00A32H
?ADCN EQU 00BB9H
?BLNK EQU 00DA6H
?DPCT EQU 00DDCH
STACK2 EQU 010EEH
ATRB EQU 010F0H
NAME EQU 010F1H
SIZE EQU 01102H
DTADR EQU 01104H
EXADR EQU 01106H
COMNT EQU 01108H
QDCMD EQU 01130H
QDSUBCMD EQU 01131H
QDLOADADDR EQU 01132H
QDBLKSIZE EQU 01134H
QDRELOC EQU 0113AH
QDDISPFLG EQU 0113BH
QDADDRMARK EQU 0113CH
QDEXPMARK EQU 0113DH
QDWORK1 EQU 0113EH
QDWORK2 EQU 01140H
QDTOTBLKS EQU 01141H
QDREMBLKS EQU 01142H
QDMOTOR EQU 01143H
QDRETRY EQU 01144H
QDFLAGS EQU 01146H
QDSAVESP EQU 01147H
DSPXY EQU 01171H
DPRNT EQU 01194H
SWRK EQU 0119DH
BUFER EQU 011A3H
BUFER10 EQU 011ADH
USERRAM EQU 01200H
PRGSTART EQU 0E800H
ORG PRGSTART
NOP ; MZ-1E14 QD Interface ROM - Entry point table
JP LE80A
JP LE884
LE807: JP LEDD1
LE80A: LD A,0C6H ; Cold start: IPL boot from QD
CALL ?DPCT
XOR A
LD (DPRNT),A
DI
XOR A
LD DE,00000H
CALL CLSSCR
LD A,001H
OUT (SIO_CHB_C),A
XOR A
OUT (SIO_CHB_C),A
CALL GETKY
CP 04DH
JR Z,LE880 ; (+057H)
CP 051H
JR Z,LE835 ; (+008H)
CALL LEB22
CALL Z,LF006
JR LE835 ; (+000H)
LE835: CALL LEBD1
CALL NL
CALL LEC0C
JR C,LE868 ; (+028H)
LD A,00DH
LD (BUFER),A
CALL LED08
LD A,001H
LD (QDDISPFLG),A
LD HL,LE86B
LD SP,STACK2
EX (SP),HL
CALL LEBDC
JP C,LEBAC
LD A,(ATRB)
CP 001H
JR NZ,LE871 ; (+010H)
LD DE,LEB27
RST 018H
JP LEB7B
LE868: LD DE,LEB37
LE86B: CALL NL
RST 018H
JR LE87D ; (+00cH)
LE871: LD A,006H
LD (QDCMD),A
CALL LE807
LD DE,LED4C
RST 018H
LE87D: CALL NL
LE880: LD DE,LEB45
RST 018H
LE884: CALL NL ; Warm start: command prompt (* MONITOR 9Z-503M *)
LD A,02AH
CALL PRNT
LD DE,BUFER
CALL GETL
LE892: LD A,(DE) ; Command parser: J=Jump, L=Load, F=Format, B=Bell, P=Print, M=Modify, S=Save, V=Verify, D=Dump, Q=QD sub-cmds
INC DE
CP 00DH
JR Z,LE884 ; (-014H)
CP 04AH
JR Z,LE910 ; (+074H)
CP 04CH
JR Z,LE914 ; (+074H)
CP 046H
JR Z,LE8DE ; (+03aH)
CP 042H
JP Z,LEA6D
CP 023H
JP Z,LEA6A
CP 050H
JP Z,LE968
CP 04DH
JP Z,LE9D9
CP 053H
JP Z,LEA0C
CP 056H
JP Z,LEA5E
CP 044H
JP Z,LEA78
CP 051H
JR NZ,LE892 ; (-039H)
LD HL,00000H
LD (QDRELOC),HL
LD A,(DE)
CP 04CH
JP Z,LEB5D
CP 044H
JP Z,LEC18
LE8DC: JR LE884 ; (-05aH)
LE8DE: LD A,(DE)
CP 00DH
JR NZ,LE8DC ; (-007H)
CALL LEB22
CALL Z,LF006
JR LE8DC ; (-00fH)
LE8EB: CP 002H
JR Z,LE8DC ; (-013H)
CALL NL
LD DE,ERRORMSG
RST 018H
JR LE8DC ; (-01cH)
LE8F8: EX (SP),HL
POP BC
LD DE,BUFER
CALL GETL
LD A,(DE)
CP 01BH
JR Z,LE8DC ; (-029H)
JP (HL)
LE906: EX (SP),IY
POP AF
CALL HLHEX
JR C,LE8DC ; (-032H)
JP (IY)
LE910: CALL LE906
JP (HL)
LE914: CALL RDINF
JR C,LE8EB ; (-02eH)
CALL NL
LD DE,LOADINGMSG
RST 018H
LD DE,NAME
RST 018H
XOR A
LD (BUFER),A
LD HL,(DTADR)
LD A,H
OR L
JR NZ,LE941 ; (+012H)
LD HL,(EXADR)
LD A,H
OR L
JR NZ,LE941 ; (+00bH)
LD A,PPI_PORTC
LD (BUFER),A
LD HL,USERRAM
LD (DTADR),HL
LE941: CALL RDDAT
JR C,LE8EB ; (-05bH)
LD A,(BUFER)
CP PPI_PORTC
JR Z,LE954 ; (+007H)
LD BC,00100H
LD HL,(EXADR)
JP (HL)
LE954: OUT (MMIO_E0),A
LD HL,USERRAM
LD DE,00000H
LD BC,(SIZE)
LDIR
LD BC,00100H
JP 00000H
LE968: LD A,(DE)
CP 026H
JR NZ,LE983 ; (+016H)
LE96D: INC DE
LD A,(DE)
CP 04CH
JR Z,LE989 ; (+016H)
CP 053H
JR Z,LE98E ; (+017H)
CP 043H
JR Z,LE99E ; (+023H)
CP 047H
JR Z,LE997 ; (+018H)
CP 054H
JR Z,LE993 ; (+010H)
LE983: CALL LE9B8
LE986: JP LE8DC
LE989: LD DE,00470H
JR LE983 ; (-00bH)
LE98E: LD DE,003D5H
JR LE983 ; (-010H)
LE993: LD A,004H
JR LE999 ; (+002H)
LE997: LD A,002H
LE999: CALL LE9A2
JR LE96D ; (-031H)
LE99E: LD A,01DH
JR LE999 ; (-009H)
LE9A2: LD C,000H
LD B,A
CALL LE9C9
LD A,B
OUT (PPI_PORTC),A
LD A,080H
OUT (PPI_PORTB),A
LD C,001H
CALL LE9C9
XOR A
OUT (PPI_PORTB),A
RET
LE9B8: PUSH DE
PUSH BC
PUSH AF
LE9BB: LD A,(DE)
CALL LE9A2
LD A,(DE)
INC DE
CP 00DH
JR NZ,LE9BB ; (-00aH)
POP AF
POP BC
POP DE
RET
LE9C9: IN A,(PPI_PORTB)
AND 00DH
CP C
RET Z
CALL BRKEY
JR NZ,LE9C9 ; (-00bH)
LD SP,ATRB
JR LE986 ; (-053H)
LE9D9: CALL LE906
LE9DC: CALL CLSDN
CALL PRTHX
CALL PRNT4
CALL LE8F8
CALL HLHEX
JR C,LEA08 ; (+01bH)
CALL PRTHLA
INC DE
CALL _2HEX
JR C,LE9DC ; (-01aH)
CP (HL)
JR NZ,LE9DC ; (-01dH)
INC DE
LD A,(DE)
CP 00DH
JR Z,LEA05 ; (+006H)
CALL _2HEX
JR C,LE9DC ; (-028H)
LD (HL),A
LEA05: INC HL
JR LE9DC ; (-02cH)
LEA08: LD H,B
LD L,C
JR LE9DC ; (-030H)
LEA0C: CALL LE906
LD (DTADR),HL
LD B,H
LD C,L
CALL PRTHLA
CALL LE906
SBC HL,BC
INC HL
LD (SIZE),HL
CALL PRTHLA
CALL LE906
LD (EXADR),HL
CALL NL
LD DE,FNAMMSG
RST 018H
CALL LE8F8
CALL PRTHLA
CALL PRTHLA
LD HL,NAME
LEA3C: INC DE
LD A,(DE)
LD (HL),A
INC HL
CP 00DH
JR NZ,LEA3C ; (-008H)
LD A,001H
LD (ATRB),A
CALL WRINF
LEA4C: JP C,LE8EB
CALL WRDAT
JR C,LEA4C ; (-008H)
CALL NL
LD DE,SAVEDMSG
RST 018H
LEA5B: JP LE884
LEA5E: CALL VRFY
JP C,LE8EB
LD DE,SAVEDMSG
RST 018H
JR LEA5B ; (-00fH)
LEA6A: JP MONSTART
LEA6D: LD A,(SWRK)
RRA
CCF
RLA
LD (SWRK),A
LEA76: JR LEA5B ; (-01dH)
LEA78: CALL LE906
CALL PRTHLA
PUSH HL
CALL HLHEX
POP DE
JR C,LEAD6 ; (+051H)
LEA85: EX DE,HL
LEA86: LD B,008H
LD C,017H
CALL CLSDN
LEA8D: CALL PRTHX
INC HL
PUSH AF
LD A,(DSPXY)
ADD A,C
LD (DSPXY),A
POP AF
CP 020H
JR NC,LEAA0 ; (+002H)
LD A,02EH
LEAA0: CALL ?ADCN
CALL PRNT3
LD A,(DSPXY)
INC C
SUB C
LD (DSPXY),A
DEC C
DEC C
DEC C
PUSH HL
SBC HL,DE
POP HL
JR Z,LEAD3 ; (+01cH)
LD A,0F8H
LD (0E000H),A
NOP
LD A,(0E001H)
CP PPI_PORTB
JR NZ,LEAC7 ; (+003H)
CALL ?BLNK
LEAC7: DJNZ LEA8D ; (-03cH)
LEAC9: CALL ?KEY
OR A
JR Z,LEAC9 ; (-006H)
CALL SPCCHK
JR NZ,LEA86 ; (-04eH)
JR LEA76 ; (-060H)
LEAD6: LD HL,000A0H
ADD HL,DE
JR LEA85 ; (-057H)
LEADC: CALL NL
LD DE,FNAMMSG
RST 018H
LD DE,BUFER
CALL GETL
LD A,(DE)
CP 01BH
JR NZ,LEAF3 ; (+005H)
LD HL,LE884
EX (SP),HL
RET
LEAF3: LD B,000H
LD DE,BUFER10
LD HL,BUFER
LD A,(DE)
CP 00DH
JR Z,LEB20 ; (+020H)
LEB00: CP 020H
JR NZ,LEB08 ; (+004H)
INC DE
LD A,(DE)
JR LEB00 ; (-008H)
LEB08: CP 022H
JR Z,LEB14 ; (+008H)
LEB0C: LD (HL),A
INC HL
INC B
LD A,011H
CP B
JR Z,LEADC ; (-038H)
LEB14: INC DE
LD A,(DE)
CP 022H
JR Z,LEB1E ; (+004H)
CP 00DH
JR NZ,LEB0C ; (-012H)
LEB1E: LD A,00DH
LEB20: LD (HL),A
RET
LEB22: LD A,(0F000H) ; Check QD interface presence (read F000H)
OR A
RET
LEB27: DB "IPL IS LOADING "
DB 00DH
LEB37: DB "MAKE READY QD"
DB 00DH
LEB45: DB "** MONITOR 9Z-503M **"
DB 00DH
LEB5D: CALL LEBD1 ; QL command: Load file from QD
CALL LEC0C
JR C,LEBAC ; (+047H)
CALL LEADC
CALL LED08
LD DE,LOADINGMSG
RST 018H
LEB6F: CALL LEBDC
JR C,LEBAC ; (+038H)
LD A,(ATRB)
CP 001H
JR NZ,LEB6F ; (-00cH)
LEB7B: LD DE,NAME
RST 018H
LD HL,(EXADR)
LD A,H
OR L
JR NZ,LEB8B ; (+005H)
LD HL,(COMNT)
LD A,H
OR L
LEB8B: JR NZ,LEB97 ; (+00aH)
LD A,PPI_PORTC
LD (QDRELOC),A
LD HL,USERRAM
JR LEB9A ; (+003H)
LEB97: LD HL,(EXADR)
LEB9A: LD (QDLOADADDR),HL
LD HL,(DTADR)
LD (QDBLKSIZE),HL
LD HL,00103H
LD (QDCMD),HL
CALL LE807
LEBAC: JP C,LEC51
LD A,(QDRELOC)
CP PPI_PORTC
JR Z,LEBBD ; (+007H)
LD BC,00300H
LD HL,(COMNT)
JP (HL)
LEBBD: OUT (MMIO_E0),A
LD HL,USERRAM
LD DE,00000H
LD BC,(DTADR)
LDIR
LD BC,00300H
JP 00000H
LEBD1: XOR A ; Init QD state variables (motor status, address marks)
LD (QDMOTOR),A
LD (QDWORK1),A
LD (QDWORK2),A
RET
LEBDC: LD HL,GETL ; Read next header block from QD (mode 3)
LD (QDCMD),HL
LD HL,ATRB
LD (QDLOADADDR),HL
LD HL,00040H
LD (QDBLKSIZE),HL
LEBEE: CALL LE807
RET C
LD A,(BUFER)
CP 00DH
RET Z
LD HL,BUFER
LD DE,NAME
LD B,011H
LEC00: LD A,(DE)
CP (HL)
JR NZ,LEBEE ; (-016H)
CP 00DH
RET Z
INC DE
INC HL
DJNZ LEC00 ; (-00bH)
RET
LEC0C: XOR A ; Start QD: motor on + status check (mode 1)
LD (QDSUBCMD),A
INC A
LD (QDCMD),A
CALL LE807
RET
LEC18: CALL LEBD1 ; QD command: Directory listing
CALL LEC0C
JR C,LEC51 ; (+031H)
CALL LED08
LD B,000H
LD DE,LED5D
RST 018H
LD HL,0CD90H
LEC2C: LD (QDLOADADDR),HL
LD HL,GETL
LD (QDCMD),HL
LD HL,00040H
LD (QDBLKSIZE),HL
PUSH BC
CALL LE807
POP BC
JR C,LEC4C ; (+00aH)
INC B
LD HL,(QDLOADADDR)
LD DE,PRNT
ADD HL,DE
JR LEC2C ; (-020H)
LEC4C: CP 028H
JR Z,LEC53 ; (+003H)
SCF
LEC51: JR C,LECD2 ; (+07fH)
LEC53: LD A,006H
LD (QDCMD),A
PUSH BC
CALL LE807
POP BC
XOR A
CP B
JR NC,LECC8 ; (+067H)
CALL NL
LD HL,0CD90H
LEC67: LD A,(HL)
LD DE,LED6E
DEC A
JR Z,LECA4 ; (+036H)
LD DE,LED79
DEC A
JR Z,LECA4 ; (+030H)
LD DE,LED84
DEC A
JR Z,LECA4 ; (+02aH)
LD DE,LED8F
DEC A
JR Z,LECA4 ; (+024H)
LD DE,LED9A
DEC A
JR Z,LECA4 ; (+01eH)
DEC A
JR Z,LECA1 ; (+018H)
LD DE,LEDA5
DEC A
JR Z,LECA4 ; (+015H)
DEC A
JR Z,LECA1 ; (+00fH)
DEC A
JR Z,LECA1 ; (+00cH)
LD DE,LEDB0
DEC A
JR Z,LECA4 ; (+009H)
LD DE,LEDBB
DEC A
JR Z,LECA4 ; (+003H)
LECA1: LD DE,LEDC6
LECA4: RST 018H
LD A,022H
CALL PRNT
INC HL
PUSH HL
POP DE
RST 018H
LD A,022H
CALL PRNT
CALL NL
LD DE,00011H
ADD HL,DE
LECBA: CALL ?KEY
OR A
JR Z,LECBA ; (-006H)
CALL SPCCHK
JP Z,LE884
DJNZ LEC67 ; (-061H)
LECC8: CALL NL
LD DE,LED11
RST 018H
JP LE884
LECD2: LD DE,LED15 ; Display QD error message based on error code in A
CP 028H
JR Z,LECF1 ; (+018H)
LD DE,LED33
CP 032H
JR Z,LECF1 ; (+011H)
LD DE,LED40
CP 036H
JR Z,LECF1 ; (+00aH)
LD DE,LED14
CP 000H
JR Z,LECF1 ; (+003H)
LD DE,LED27
LECF1: LD A,006H
LD (QDCMD),A
CALL LE807
CALL LED08
LD A,(QDDISPFLG)
RRA
RET C
CALL NL
RST 018H
JP LE884
LED08: LD A,005H ; Send motor off command (mode 5)
LD (QDCMD),A
CALL LE807
RET
LED11: DB "OK!"
LED14: DB 00DH
LED15: DB "QD:FILE NOT FOUND"
DB 00DH
LED27: DB "QD:HARD ERR"
DB 00DH
LED33: DB "QD:NOT READY"
DB 00DH
LED40: DB "QD:UNFORMAT"
DB 00DH
LED4C: DB "QD:FILE MODE ERR"
DB 00DH
LED5D: DB "DIRECTORY OF QD:"
DB 00DH
LED6E: DB " OBJ "
DB 00DH
LED79: DB " BTX "
DB 00DH
LED84: DB " BSD "
DB 00DH
LED8F: DB " BRD "
DB 00DH
LED9A: DB " RB "
DB 00DH
LEDA5: DB " LIB "
DB 00DH
LEDB0: DB " SYS "
DB 00DH
LEDBB: DB " GR "
DB 00DH
LEDC6: DB " ??? "
DB 00DH
LEDD1: LD A,005H ; QD block read service with retry (5 retries on error 29H)
LD (QDRETRY),A
LEDD6: DI
CALL LEDF8
EI
RET NC
PUSH AF
CP 028H
JR Z,LEDF6 ; (+015H)
CALL LEF03
POP AF
PUSH AF
CP 029H
JR NZ,LEDF6 ; (+00cH)
LD HL,QDRETRY
DEC (HL)
JR Z,LEDF3 ; (+003H)
POP AF
JR LEDD6 ; (-01dH)
LEDF3: CALL LEE0D
LEDF6: POP AF
RET
LEDF8: LD (QDSAVESP),SP ; QD read dispatcher: mode 1=dir, 3=block read, 5/6=motor off
LD A,(QDCMD)
DEC A
JR Z,LEE14 ; (+012H)
DEC A
DEC A
JR Z,LEE1A ; (+014H)
DEC A
DEC A
JR Z,LEE0D ; (+003H)
JP LEF03
LEE0D: PUSH AF
XOR A
LD (QDADDRMARK),A
POP AF
RET
LEE14: LD A,(QDSUBCMD) ; Mode 1: Directory scan (motor on + status)
JP LEE8B
LEE1A: LD A,(QDMOTOR) ; Mode 3: Read block (init SIO, find block, read data)
OR A
CALL Z,LEEB7
CALL LEE51
RET C
CALL LEFEC
CALL LEFA8
LD C,A
CALL LEFA8
LD B,A
LD HL,(QDBLKSIZE)
SBC HL,BC
JP C,LEFC0
LD HL,(QDLOADADDR)
LEE3B: CALL LEFA8
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JR NZ,LEE3B ; (-00aH)
CALL LEF90
LD A,(QDSUBCMD)
BIT 0,A
JP NZ,LEF03
RET
LEE51: LD HL,QDREMBLKS ; Find next block: scan blocks, match address marks
DEC (HL)
JR Z,LEE87 ; (+030H)
CALL LEF18
LD C,A
LD A,(QDADDRMARK)
LD HL,QDEXPMARK
CP (HL)
JR NZ,LEE84 ; (+020H)
INC A
LD (QDADDRMARK),A
LD (HL),A
LD A,(QDSUBCMD)
XOR C
RRA
RET NC
LEE6F: CALL LEFA8
LD C,A
CALL LEFA8
LD B,A
LEE77: CALL LEFA8
DEC BC
LD A,B
OR C
JR NZ,LEE77 ; (-008H)
CALL LEF90
JR LEE51 ; (-033H)
LEE84: INC (HL)
JR LEE6F ; (-018H)
LEE87: LD A,028H
SCF
RET
LEE8B: LD B,A ; Motor on + check drive status via SIO ChB
LD A,002H
OUT (SIO_CHB_C),A
LD A,081H
OUT (SIO_CHB_C),A
LD A,002H
OUT (SIO_CHB_C),A
IN A,(SIO_CHB_C)
AND 081H
CP 081H
JP NZ,LEFC6
LD A,010H
OUT (SIO_CHA_C),A
IN A,(SIO_CHA_C)
LD C,A
AND 008H
JP Z,LEFC6
LD A,B
OR A
RET Z
LD A,C
AND 020H
RET NZ
JP LEFC3
LEEB7: LD HL,LEFE1 ; Full QD init: SIO reset, motor on, wait for DCD + sync
LD B,00BH
CALL LEED6
CALL LEF2E
LD (QDTOTBLKS),A
INC A
LD (QDREMBLKS),A
CALL LEF90
LD HL,QDFLAGS
SET 3,(HL)
XOR A
LD (QDEXPMARK),A
RET
LEED6: LD C,SIO_CHA_C ; Write SIO init table to ChA control + motor on via ChB WR5
OTIR
LD A,005H
LD (QDMOTOR),A
OUT (SIO_CHB_C),A
LD A,080H
OUT (SIO_CHB_C),A
LEEE5: LD A,010H
OUT (SIO_CHA_C),A
IN A,(SIO_CHA_C)
AND 008H
JP Z,LEFC6
CALL LEFEC
LD A,010H
OUT (SIO_CHB_C),A
IN A,(SIO_CHB_C)
AND 008H
JR Z,LEEE5 ; (-018H)
LD BC,000E9H
JP LEFD4
LEF03: PUSH AF ; Motor off: ChA WR5=60H (RTS off), ChB WR5=00H
LD A,005H
OUT (SIO_CHA_C),A
LD A,060H
OUT (SIO_CHA_C),A
LD A,005H
OUT (SIO_CHB_C),A
XOR A
LD (QDMOTOR),A
OUT (SIO_CHB_C),A
POP AF
RET
LEF18: LD A,058H ; Enter sync/hunt mode, wait for sync detection, read block type
LD B,00BH
LD HL,LEFE1
CALL LEF81
LD HL,QDFLAGS
BIT 3,(HL)
LD BC,GETL
JR Z,LEF31 ; (+005H)
RES 3,(HL)
LEF2E: LD BC,000A0H
LEF31: CALL LEFD4
LD A,005H
OUT (SIO_CHB_C),A
LD A,082H
OUT (SIO_CHB_C),A
LD A,003H
OUT (SIO_CHA_C),A
LD A,0D3H
OUT (SIO_CHA_C),A
LD BC,02CC0H
LEF47: LD A,010H
OUT (SIO_CHA_C),A
IN A,(SIO_CHA_C)
AND 010H
JR Z,LEF59 ; (+008H)
DEC BC
LD A,B
OR C
JR NZ,LEF47 ; (-00fH)
JP LEFCC
LEF59: LD A,003H
OUT (SIO_CHA_C),A
LD A,0C3H
OUT (SIO_CHA_C),A
LD B,09FH
LEF63: LD A,010H
OUT (SIO_CHA_C),A
IN A,(SIO_CHA_C)
AND 001H
JR NZ,LEF73 ; (+006H)
DEC B
JR NZ,LEF63 ; (-00dH)
JP LEFCC
LEF73: LD A,003H
OUT (SIO_CHA_C),A
LD A,0C9H
OUT (SIO_CHA_C),A
CALL LEFA8
JP LEFA8
LEF81: LD C,SIO_CHA_C ; Write SIO register + OTIR init table to ChA control
OUT (C),A
LD A,005H
OUT (SIO_CHB_C),A
LD A,080H
OUT (SIO_CHB_C),A
OTIR
RET
LEF90: LD B,003H ; Read 3 trailing bytes (CRC), check for Rx overrun
LEF92: CALL LEFA8
DJNZ LEF92 ; (-005H)
LEF97: IN A,(SIO_CHA_C)
RRCA
JR NC,LEF97 ; (-005H)
LD A,001H
OUT (SIO_CHA_C),A
IN A,(SIO_CHA_C)
AND 040H
JR NZ,LEFC0 ; (+01aH)
OR A
RET
LEFA8: LD A,010H ; Read one byte from QD: check DCD, wait Rx ready, IN A,(F4H)
OUT (SIO_CHA_C),A
IN A,(SIO_CHA_C)
AND 008H
JP Z,LEFC6
IN A,(SIO_CHA_C)
RLCA
JR C,LEFC0 ; (+008H)
RRCA
RRCA
JR NC,LEFA8 ; (-014H)
IN A,(SIO_CHA_D)
OR A
RET
LEFC0: LD A,029H ; Error return chain: 29H=CRC, 2EH=?, 32H=not ready, 35H=?, 36H=unformat
LD HL,02E3EH
LD HL,0323EH
LD HL,0353EH
LD HL,0363EH
LD SP,(QDSAVESP)
SCF
RET
LEFD4: PUSH AF ; Delay loop: outer*inner (BC outer, 86H inner)
LEFD5: LD A,086H
LEFD7: DEC A
JR NZ,LEFD7 ; (-003H)
DEC BC
LD A,B
OR C
JR NZ,LEFD5 ; (-00aH)
POP AF
RET
LEFE1: DB 058H ; SIO init table: 58=ChReset, 04/10=WR4(x1,sync), 05/04=WR5(CRC16), 03/D0=WR3(Rx8bit,hunt), 06/16=WR6(sync1), 07/16=WR7(sync2)
DB 004H
DB 010H
DB 005H
DB 004H
DB 003H
DB 0D0H
DB 006H
DB 016H
DB 007H
DB 016H
LEFEC: LD A,0E8H ; QD hardware presence check via memory-mapped I/O at E000/E001H
LD (0E000H),A
NOP
LD A,(0E001H)
AND 081H
RET NZ
LD SP,(QDSAVESP)
SCF
RET
DB 02EH ; EFFE-EFFF: Residual data
DB 041H
DS 6, 0FFH ; F000-F005: Unused (0xFF padding)
LF006: ; F006-F7FF: Unused ROM space
DS 2042, 0FFH ; 0xFF padding to end of ROM