Files
RFS/asm/rfs_mrom_opcd7.asm

419 lines
17 KiB
NASM

;--------------------------------------------------------------------------------------------------------
;-
;- Name: rfs_mrom_opcd7.asm
;- Created: March 2026
;- Author(s): Philip Smart
;- Description: Z80 Opcode table (part 2: OTDR-END) and search routines for MROM bank 7.
;- This is used by the DASM/ASM tools in UROM banks 7 and 8 (picoZ80/RomDisk builds).
;- See rfs_mrom_opcd6.asm for full description.
;-
;- Search routines at FIXED addresses (same as MROM bank 6):
;- DSMFINDOPCD @ 0x0E80
;- ASMFINDINST @ 0x0F10
;- ASMFINDPARM @ 0x0F70
;-
;- Copyright: (c) 2018-2026 Philip Smart <philip.smart@net2net.org>
;-
;--------------------------------------------------------------------------------------------------------
;- This source file is free software: you can redistribute it and-or modify
;- it under the terms of the GNU General Public License as published
;- by the Free Software Foundation, either version 3 of the License, or
;- (at your option) any later version.
;-
;- This source file is distributed in the hope that it will be useful,
;- but WITHOUT ANY WARRANTY; without even the implied warranty of
;- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;- GNU General Public License for more details.
;-
;- You should have received a copy of the GNU General Public License
;- along with this program. If not, see <http://www.gnu.org/licenses/>.
;--------------------------------------------------------------------------------------------------------
INCLUDE "macros.asm"
;-----------------------------------------------
; Work RAM addresses (must match rfs_bank7.asm)
;-----------------------------------------------
INS_BUF: EQU 0CF1BH
PARM_BUF: EQU 0CF1FH
BLK_ADDR: EQU 0CF2FH
ROW_ADDR: EQU 0CF31H
BLK_NUM: EQU 0CF33H
BLK_SIZE: EQU 0CF34H
ROW_NUM: EQU 0CF35H
ML_BUF: EQU 0CF36H
ML_BTCOUNT: EQU 0CF38H
;-----------------------------------------------
; MROM Bank 7 - Opcode Table Part 2 (OTDR-END)
;-----------------------------------------------
ORG 00000H
; Safety: if this bank is accidentally executed, reset to default.
XOR A
LD (0EFFDh),A ; Select MROM bank 0
JP 00000H
; Pad to table start
ALIGN_NOPS 010H
;-------------------------------------------------------------------------------
; Z80 Assembler lookup table - PART 2 (OTDR through END)
;-------------------------------------------------------------------------------
OPCD_TABLE:
DB "#OTDR", 001H, 000H, 000H, 000H, 000H
DB " ", 0BBH, 0EDH, 002H
DB "#OTIR", 001H, 000H, 000H, 000H, 000H
DB " ", 0B3H, 0EDH, 002H
DB "#OUT ", 008H, 000H, 000H, 000H, 000H
DB "(C),A ", 079H, 0EDH, 002H
DB "(C),B ", 041H, 0EDH, 002H
DB "(C),C ", 049H, 0EDH, 002H
DB "(C),D ", 051H, 0EDH, 002H
DB "(C),E ", 059H, 0EDH, 002H
DB "(C),H ", 061H, 0EDH, 002H
DB "(C),L ", 069H, 0EDH, 002H
DB "(*),A ", 0D3H, 000H, 002H
DB "#OUT0", 007H, 000H, 000H, 000H, 000H
DB "(*),A ", 039H, 0EDH, 003H
DB "(*),B ", 001H, 0EDH, 003H
DB "(*),C ", 009H, 0EDH, 003H
DB "(*),D ", 011H, 0EDH, 003H
DB "(*),E ", 019H, 0EDH, 003H
DB "(*),H ", 021H, 0EDH, 003H
DB "(*),L ", 029H, 0EDH, 003H
DB "#OUTD", 001H, 000H, 000H, 000H, 000H
DB " ", 0ABH, 0EDH, 002H
DB "#OUTI", 001H, 000H, 000H, 000H, 000H
DB " ", 0A3H, 0EDH, 002H
DB "#POP ", 006H, 000H, 000H, 000H, 000H
DB "AF ", 0F1H, 000H, 001H
DB "BC ", 0C1H, 000H, 001H
DB "DE ", 0D1H, 000H, 001H
DB "HL ", 0E1H, 000H, 001H
DB "IX ", 0E1H, 0DDH, 002H
DB "IY ", 0E1H, 0FDH, 002H
DB "#PUSH", 006H, 000H, 000H, 000H, 000H
DB "AF ", 0F5H, 000H, 001H
DB "BC ", 0C5H, 000H, 001H
DB "DE ", 0D5H, 000H, 001H
DB "HL ", 0E5H, 000H, 001H
DB "IX ", 0E5H, 0DDH, 002H
DB "IY ", 0E5H, 0FDH, 002H
DB "#RES ", 008H, 000H, 000H, 000H, 000H
DB "*,(HL) ", 086H, 0CBH, 002H
DB "*,A ", 087H, 0CBH, 002H
DB "*,B ", 080H, 0CBH, 002H
DB "*,C ", 081H, 0CBH, 002H
DB "*,D ", 082H, 0CBH, 002H
DB "*,E ", 083H, 0CBH, 002H
DB "*,H ", 084H, 0CBH, 002H
DB "*,L ", 085H, 0CBH, 002H
DB "#RET ", 009H, 000H, 000H, 000H, 000H
DB " ", 0C9H, 000H, 001H
DB "C ", 0D8H, 000H, 001H
DB "M ", 0F8H, 000H, 001H
DB "NC ", 0D0H, 000H, 001H
DB "NZ ", 0C0H, 000H, 001H
DB "P ", 0F0H, 000H, 001H
DB "PE ", 0E8H, 000H, 001H
DB "PO ", 0E0H, 000H, 001H
DB "Z ", 0C8H, 000H, 001H
DB "#RETI", 001H, 000H, 000H, 000H, 000H
DB " ", 04DH, 0EDH, 002H
DB "#RETN", 001H, 000H, 000H, 000H, 000H
DB " ", 045H, 0EDH, 002H
DB "#RL ", 008H, 000H, 000H, 000H, 000H
DB "(HL) ", 016H, 0CBH, 002H
DB "A ", 017H, 0CBH, 002H
DB "B ", 010H, 0CBH, 002H
DB "C ", 011H, 0CBH, 002H
DB "D ", 012H, 0CBH, 002H
DB "E ", 013H, 0CBH, 002H
DB "H ", 014H, 0CBH, 002H
DB "L ", 015H, 0CBH, 002H
DB "#RLA ", 001H, 000H, 000H, 000H, 000H
DB " ", 017H, 000H, 001H
DB "#RLC ", 008H, 000H, 000H, 000H, 000H
DB "(HL) ", 006H, 0CBH, 002H
DB "A ", 007H, 0CBH, 002H
DB "B ", 000H, 0CBH, 002H
DB "C ", 001H, 0CBH, 002H
DB "D ", 002H, 0CBH, 002H
DB "E ", 003H, 0CBH, 002H
DB "H ", 004H, 0CBH, 002H
DB "L ", 005H, 0CBH, 002H
DB "#RLCA", 001H, 000H, 000H, 000H, 000H
DB " ", 007H, 000H, 001H
DB "#RLD ", 001H, 000H, 000H, 000H, 000H
DB " ", 06FH, 0EDH, 002H
DB "#RR ", 008H, 000H, 000H, 000H, 000H
DB "(HL) ", 01EH, 0CBH, 002H
DB "A ", 01FH, 0CBH, 002H
DB "B ", 018H, 0CBH, 002H
DB "C ", 019H, 0CBH, 002H
DB "D ", 01AH, 0CBH, 002H
DB "E ", 01BH, 0CBH, 002H
DB "H ", 01CH, 0CBH, 002H
DB "L ", 01DH, 0CBH, 002H
DB "#RRA ", 001H, 000H, 000H, 000H, 000H
DB " ", 01FH, 000H, 001H
DB "#RRC ", 008H, 000H, 000H, 000H, 000H
DB "(HL) ", 00EH, 0CBH, 002H
DB "A ", 00FH, 0CBH, 002H
DB "B ", 008H, 0CBH, 002H
DB "C ", 009H, 0CBH, 002H
DB "D ", 00AH, 0CBH, 002H
DB "E ", 00BH, 0CBH, 002H
DB "H ", 00CH, 0CBH, 002H
DB "L ", 00DH, 0CBH, 002H
DB "#RRCA", 001H, 000H, 000H, 000H, 000H
DB " ", 00FH, 000H, 001H
DB "#RRD ", 001H, 000H, 000H, 000H, 000H
DB " ", 067H, 0EDH, 002H
DB "#RST ", 008H, 000H, 000H, 000H, 000H
DB "00H ", 0C7H, 000H, 001H
DB "08H ", 0CFH, 000H, 001H
DB "10H ", 0D7H, 000H, 001H
DB "18H ", 0DFH, 000H, 001H
DB "20H ", 0E7H, 000H, 001H
DB "28H ", 0EFH, 000H, 001H
DB "30H ", 0F7H, 000H, 001H
DB "38H ", 0FFH, 000H, 001H
DB "#SBC ", 00FH, 000H, 000H, 000H, 000H
DB "A,(HL) ", 09EH, 000H, 001H
DB "A,(IX*)", 09EH, 0DDH, 003H
DB "A,(IY*)", 09EH, 0FDH, 003H
DB "A,A ", 09FH, 000H, 001H
DB "A,B ", 098H, 000H, 001H
DB "A,C ", 099H, 000H, 001H
DB "A,D ", 09AH, 000H, 001H
DB "A,E ", 09BH, 000H, 001H
DB "A,H ", 09CH, 000H, 001H
DB "A,L ", 09DH, 000H, 001H
DB "HL,BC ", 042H, 0EDH, 002H
DB "HL,DE ", 052H, 0EDH, 002H
DB "HL,HL ", 062H, 0EDH, 002H
DB "HL,SP ", 072H, 0EDH, 002H
DB "A,* ", 0DEH, 000H, 002H
DB "#SCF ", 001H, 000H, 000H, 000H, 000H
DB " ", 037H, 000H, 001H
DB "#SET ", 008H, 000H, 000H, 000H, 000H
DB "*,(HL) ", 0C6H, 0CBH, 002H
DB "*,A ", 0C7H, 0CBH, 002H
DB "*,B ", 0C0H, 0CBH, 002H
DB "*,C ", 0C1H, 0CBH, 002H
DB "*,D ", 0C2H, 0CBH, 002H
DB "*,E ", 0C3H, 0CBH, 002H
DB "*,H ", 0C4H, 0CBH, 002H
DB "*,L ", 0C5H, 0CBH, 002H
DB "#SLA ", 008H, 000H, 000H, 000H, 000H
DB "(HL) ", 026H, 0CBH, 002H
DB "A ", 027H, 0CBH, 002H
DB "B ", 020H, 0CBH, 002H
DB "C ", 021H, 0CBH, 002H
DB "D ", 022H, 0CBH, 002H
DB "E ", 023H, 0CBH, 002H
DB "H ", 024H, 0CBH, 002H
DB "L ", 025H, 0CBH, 002H
DB "#SRA ", 008H, 000H, 000H, 000H, 000H
DB "(HL) ", 02EH, 0CBH, 002H
DB "A ", 02FH, 0CBH, 002H
DB "B ", 028H, 0CBH, 002H
DB "C ", 029H, 0CBH, 002H
DB "D ", 02AH, 0CBH, 002H
DB "E ", 02BH, 0CBH, 002H
DB "H ", 02CH, 0CBH, 002H
DB "L ", 02DH, 0CBH, 002H
DB "#SRL ", 008H, 000H, 000H, 000H, 000H
DB "(HL) ", 03EH, 0CBH, 002H
DB "A ", 03FH, 0CBH, 002H
DB "B ", 038H, 0CBH, 002H
DB "C ", 039H, 0CBH, 002H
DB "D ", 03AH, 0CBH, 002H
DB "E ", 03BH, 0CBH, 002H
DB "H ", 03CH, 0CBH, 002H
DB "L ", 03DH, 0CBH, 002H
DB "#SUB ", 00BH, 000H, 000H, 000H, 000H
DB "(HL) ", 096H, 000H, 001H
DB "(IX*) ", 096H, 0DDH, 003H
DB "(IY*) ", 096H, 0FDH, 003H
DB "A ", 097H, 000H, 001H
DB "B ", 090H, 000H, 001H
DB "C ", 091H, 000H, 001H
DB "D ", 092H, 000H, 001H
DB "E ", 093H, 000H, 001H
DB "H ", 094H, 000H, 001H
DB "L ", 095H, 000H, 001H
DB "* ", 0D6H, 000H, 002H
DB "#XOR ", 00BH, 000H, 000H, 000H, 000H
DB "(HL) ", 0AEH, 000H, 001H
DB "(IX*) ", 0AEH, 0DDH, 003H
DB "(IY*) ", 0AEH, 0FDH, 003H
DB "A ", 0AFH, 000H, 001H
DB "B ", 0A8H, 000H, 001H
DB "C ", 0A9H, 000H, 001H
DB "D ", 0AAH, 000H, 001H
DB "E ", 0ABH, 000H, 001H
DB "H ", 0ACH, 000H, 001H
DB "L ", 0ADH, 000H, 001H
DB "* ", 0EEH, 000H, 002H
; End of table sentinel
DB "#END ", 000H, 000H, 000H, 000H, 000H
;-------------------------------------------------------------------------------
; Search routines at fixed addresses (same as MROM bank 6)
;-------------------------------------------------------------------------------
; Pad to DSMFINDOPCD address
PAD 0E80H
;******************************************************************
; DSMFINDOPCD - identical to bank 6 copy but LD IX,OPCD_TABLE
; points to THIS bank's table.
;******************************************************************
DSMFINDOPCD:PUSH BC
LD IX,OPCD_TABLE
DSMFN_LP1: LD A,(IX+0)
CP '#'
JP NZ,DSMFN_CK1
LD (BLK_ADDR),IX
JP DSMFN_NXT
DSMFN_CK1: LD A,(ML_BUF)
CP 0CBh
JP Z,DSMFN_CK2
CP 0DDh
JP Z,DSMFN_CK2
CP 0EDh
JP Z,DSMFN_CK2
CP 0FDh
JP Z,DSMFN_CK2
LD C,(IX+7)
CP C
JP NZ,DSMFN_NXT
LD A,0
LD C,(IX+8)
CP C
JP Z,DSMFN_MAT
JP DSMFN_NXT
DSMFN_CK2: LD C,(IX+8)
CP C
JP NZ,DSMFN_NXT
LD A,(ML_BUF+1)
LD C,(IX+7)
CP C
JP Z,DSMFN_MAT
DSMFN_NXT: LD BC,000Ah
ADD IX,BC
LD A,(IX+5)
CP 0
JP NZ,DSMFN_LP1
DSMFN_MAT: LD (ROW_ADDR),IX
LD A,(IX+8)
LD (ML_BUF+1),A
LD A,(IX+9)
LD (ML_BTCOUNT),A
CP 0
POP BC
RET
; Pad to ASMFINDINST address
PAD 0F10H
;******************************************************************
; ASMFINDINST - identical to bank 6 copy
;******************************************************************
ASMFINDINST:PUSH DE
PUSH BC
LD A,0
LD (ROW_NUM),A
LD IX,OPCD_TABLE
AFI_NXTBLK: LD (BLK_ADDR),IX
LD A,(IX+5)
LD (BLK_SIZE),A
CP 0
JP Z,AFI_EXIT
LD IY,INS_BUF
LD C,04h
AFI_CMPLP: LD A,(IX+1)
LD B,(IY+0)
CP B
JP NZ,AFI_NOMAT
INC IX
INC IY
DEC C
JP NZ,AFI_CMPLP
JP AFI_EXIT
AFI_NOMAT: LD A,(BLK_SIZE)
INC A
LD IX,(BLK_ADDR)
LD DE,000Ah
AFI_BLKLP: ADD IX,DE
DEC A
JP NZ,AFI_BLKLP
LD A,(ROW_NUM)
INC A
LD (ROW_NUM),A
JP AFI_NXTBLK
AFI_EXIT: POP BC
POP DE
RET
; Pad to ASMFINDPARM address
PAD 0F70H
;******************************************************************
; ASMFINDPARM - identical to bank 6 copy
;******************************************************************
ASMFINDPARM:PUSH DE
PUSH BC
PUSH HL
LD IX,(BLK_ADDR)
LD A,(BLK_SIZE)
LD L,A
AFP_NXTROW: LD DE,000Ah
ADD IX,DE
LD (ROW_ADDR),IX
LD IY,PARM_BUF
LD C,07h
AFP_CMPLP: LD A,(IX+0)
LD B,(IY+0)
CP B
JP NZ,AFP_NOMAT
INC IX
INC IY
DEC C
JP NZ,AFP_CMPLP
JP AFP_MATCH
AFP_NOMAT: DEC L
JP Z,AFP_NOFND
LD IX,(ROW_ADDR)
JP AFP_NXTROW
AFP_NOFND: LD A,0
LD (ML_BUF+2),A
JP AFP_EXIT
AFP_MATCH: LD A,(IX+0)
LD (ML_BUF),A
LD A,(IX+1)
LD (ML_BUF+1),A
LD A,(IX+2)
LD (ML_BUF+2),A
AFP_EXIT: POP HL
POP BC
POP DE
RET
; Pad to 4K boundary
ALIGN 1000H