From 405f881fbff99fce70cb30c00660903a030b09c2 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 28 Nov 2023 17:22:10 +0900 Subject: [PATCH] [TLCS90] Fix LDA/JP/CALL operand --- src/asm_tlcs90.cpp | 116 ++--- src/dis_tlcs90.cpp | 26 +- src/entry_tlcs90.h | 4 +- src/insn_tlcs90.h | 9 +- src/table_tlcs90.cpp | 24 +- test/autogen/gen_tlcs90.inc | 984 ++++++++++++++++++------------------ test/test_asm_tlcs90.cpp | 146 +++--- test/test_dis_tlcs90.cpp | 136 ++--- 8 files changed, 746 insertions(+), 699 deletions(-) diff --git a/src/asm_tlcs90.cpp b/src/asm_tlcs90.cpp index adea66e55..859c8ff88 100644 --- a/src/asm_tlcs90.cpp +++ b/src/asm_tlcs90.cpp @@ -136,6 +136,7 @@ void AsmTlcs90::encodeOperand( insn.emitInsn(opc | encodeReg16(op.reg)); return; case M_IDX: + case M_IXPD: if (overflowInt8(static_cast(op.val16))) insn.setErrorIf(op, OVERFLOW_RANGE); insn.emitInsn(opc | encodeIndexReg(op.reg)); @@ -184,83 +185,78 @@ Error AsmTlcs90::parseOperand(StrScanner &scan, Operand &op) const { return OK; } - auto reg = parseRegName(p); - if (reg != REG_UNDEF) { - switch (reg) { - case REG_IX: - case REG_IY: - op.mode = M_REGIX; - break; - case REG_B: - case REG_D: - case REG_E: - case REG_H: - case REG_L: - op.mode = M_REG8; - break; - default: - op.mode = AddrMode(int8_t(reg) + R_BASE); - break; + const auto paren = p.expect('(') ? ')' : 0; + const auto regAt = p.skipSpaces(); + const auto reg = parseRegName(p); + if (reg == REG_UNDEF) { + op.val16 = parseExpr16(p, op, paren); + if (op.hasError()) + return op.getError(); + if (paren && !p.skipSpaces().expect(')')) + return op.setError(p, MISSING_CLOSING_PAREN); + if (paren) { // (nnnn) + op.mode = op.getError() ? M_SYM : (op.val16 >= 0xFF00 ? M_DIR : M_EXT); + } else { // nnnn + op.mode = M_IMM16; } - op.reg = reg; scan = p; return OK; } - if (p.expect('(')) { - const auto regp = p.skipSpaces(); - reg = parseRegName(p); - if (reg == REG_UNDEF) { // (nnnn) - op.val16 = parseExpr16(p, op, ')'); - if (op.hasError()) - return op.getError(); - if (!p.skipSpaces().expect(')')) - return op.setError(p, MISSING_CLOSING_PAREN); - op.mode = op.getError() ? M_SYM : (op.val16 >= 0xFF00 ? M_DIR : M_EXT); + p.skipSpaces(); + op.reg = reg; + if (paren && p.expect(')')) { // (rr) + if (isReg16(reg)) { + op.mode = M_IND; scan = p; return OK; } - op.reg = reg; - if (p.skipSpaces().expect(')')) { // (rr) - if (isReg16(reg)) { - op.mode = M_IND; - scan = p; - return OK; - } - return op.setError(regp, REGISTER_NOT_ALLOWED); - } - auto a = p; - if (reg == REG_HL && a.expect('+')) { - const auto idxp = a.skipSpaces(); - const auto idx = parseRegName(a); + return op.setError(regAt, REGISTER_NOT_ALLOWED); + } + const auto dispAt = p; + const auto disp = p.expect([](char c) { return c == '+' || c == '-'; }); + if (disp) { + if (reg == REG_HL && disp == '+') { + const auto idxAt = p.skipSpaces(); + const auto idx = parseRegName(p); if (idx != REG_UNDEF) { if (idx != REG_A) - return op.setError(idxp, REGISTER_NOT_ALLOWED); - if (!a.skipSpaces().expect(')')) - return op.setError(a, MISSING_CLOSING_PAREN); - scan = a; - op.mode = M_BASE; // (HL+A) + return op.setError(idxAt, REGISTER_NOT_ALLOWED); + if (paren && !p.skipSpaces().expect(')')) + return op.setError(p, MISSING_CLOSING_PAREN); + scan = p; + op.mode = paren ? M_BASE : M_HLPA; // (HL+A), HL+A return OK; } } - if (*p == '+' || *p == '-') { // (rr+n) - op.val16 = parseExpr16(p, op, ')'); + if (isRegIndex(reg)) { + p = dispAt; + op.val16 = parseExpr16(p, op, paren); if (op.hasError()) return op.getError(); - if (!p.skipSpaces().expect(')')) + if (paren && !p.skipSpaces().expect(')')) return op.setError(p, MISSING_CLOSING_PAREN); - if (isRegIndex(reg)) { - scan = p; - op.mode = M_IDX; - return OK; - } - return op.setError(regp, REGISTER_NOT_ALLOWED); + scan = p; + op.mode = paren ? M_IDX : M_IXPD; // (ix+d), ix+d + return OK; } - return op.setError(UNKNOWN_OPERAND); + return op.setError(regAt, REGISTER_NOT_ALLOWED); + } + switch (reg) { + case REG_IX: + case REG_IY: + op.mode = M_REGIX; + break; + case REG_B: + case REG_D: + case REG_E: + case REG_H: + case REG_L: + op.mode = M_REG8; + break; + default: + op.mode = AddrMode(int8_t(reg) + R_BASE); + break; } - op.val16 = parseExpr16(p, op); - if (op.hasError()) - return op.getError(); - op.mode = M_IMM16; scan = p; return OK; } diff --git a/src/dis_tlcs90.cpp b/src/dis_tlcs90.cpp index b78e3f31a..42e179362 100644 --- a/src/dis_tlcs90.cpp +++ b/src/dis_tlcs90.cpp @@ -115,14 +115,24 @@ void DisTlcs90::decodeOperand( outRegName(out.letter('('), op.reg).letter(')'); break; case M_IDX: - outRegName(out.letter('('), op.reg); + case M_IXPD: + if (mode == M_IDX) + out.letter('('); + outRegName(out, op.reg); if (val8 >= 0) out.letter('+'); - outHex(out, val8, -8).letter(')'); + outHex(out, val8, -8); + if (mode == M_IDX) + out.letter(')'); break; case M_BASE: - outRegName(out.letter('('), REG_HL).letter('+'); - outRegName(out, REG_A).letter(')'); + case M_HLPA: + if (mode == M_BASE) + out.letter('('); + outRegName(out, REG_HL).letter('+'); + outRegName(out, REG_A); + if (mode == M_BASE) + out.letter(')'); break; case M_CC: outCcName(out, op.cc); @@ -140,7 +150,7 @@ void DisTlcs90::decodeOperand( case R_AF: case R_AFP: case R_A: - outRegName(out, RegName(uint8_t(mode) - 16)); + outRegName(out, RegName(uint8_t(mode) - R_BASE)); break; default: break; @@ -152,7 +162,9 @@ Error DisTlcs90::decodeImpl(DisMemory &memory, Insn &_insn, StrBuffer &out) cons const auto opc = insn.readByte(); insn.setOpCode(opc); Operand prefixOp; + insn.setPrefixMode(M_NONE); if (TABLE.isPrefix(cpuType(), opc, prefixOp.mode)) { + insn.setPrefixMode(prefixOp.mode); if (insn.readOpCode(prefixOp)) return _insn.setError(insn); } @@ -163,7 +175,7 @@ Error DisTlcs90::decodeImpl(DisMemory &memory, Insn &_insn, StrBuffer &out) cons if (dst != M_NONE) { const auto *start = out.mark(); if (dst == M_DST) { - decodeOperand(insn, out, prefixOp.mode, prefixOp); + decodeOperand(insn, out, insn.pre(), prefixOp); } else { Operand op; if (readOperand(insn, dst, op)) @@ -175,7 +187,7 @@ Error DisTlcs90::decodeImpl(DisMemory &memory, Insn &_insn, StrBuffer &out) cons if (out.mark() != start) // skip CC_T because it's empty. out.comma(); if (src == M_SRC) { - decodeOperand(insn, out, prefixOp.mode, prefixOp); + decodeOperand(insn, out, insn.pre(), prefixOp); } else { Operand op; if (readOperand(insn, src, op)) diff --git a/src/entry_tlcs90.h b/src/entry_tlcs90.h index 46f87da51..e4b283aa0 100644 --- a/src/entry_tlcs90.h +++ b/src/entry_tlcs90.h @@ -43,7 +43,9 @@ enum AddrMode : uint8_t { M_REG8 = 13, // Register 8-bit: B/C/D/E/H/L/A M_REG16 = 14, // Register 16-bit: BC/DE/HL/IX/IY/SP M_REGIX = 15, // Register index: IX/IY/SP - R_BASE = 16, + M_HLPA = 16, // HL+A + M_IXPD = 17, // ix+disp + R_BASE = 18, R_BC = R_BASE + REG_BC, R_DE = R_BASE + REG_DE, R_HL = R_BASE + REG_HL, diff --git a/src/insn_tlcs90.h b/src/insn_tlcs90.h index e3bb23269..5d05ffa2f 100644 --- a/src/insn_tlcs90.h +++ b/src/insn_tlcs90.h @@ -29,6 +29,11 @@ struct EntryInsn : EntryInsnBase { AddrMode dst() const { return flags().dst(); } AddrMode src() const { return flags().src(); } void setAddrMode(AddrMode dst, AddrMode src) { setFlags(Entry::Flags::create(dst, src)); } + AddrMode pre() const { return _prefixMode; } + void setPrefixMode(AddrMode mode) { _prefixMode = mode; } + +private: + AddrMode _prefixMode; }; struct Operand final : ErrorAt { @@ -44,9 +49,6 @@ struct AsmInsn final : AsmInsnImpl, EntryInsn { Operand dstOp, srcOp; - AddrMode pre() const { return _prefixMode; } - void setPrefixMode(AddrMode mode) { _prefixMode = mode; } - void setEmitInsn() { _emitInsn = true; } void emitInsn(Config::opcode_t opc) { if (_emitInsn) { @@ -56,7 +58,6 @@ struct AsmInsn final : AsmInsnImpl, EntryInsn { } private: - AddrMode _prefixMode; bool _emitInsn; }; diff --git a/src/table_tlcs90.cpp b/src/table_tlcs90.cpp index 7f7691ff9..0a28000e9 100644 --- a/src/table_tlcs90.cpp +++ b/src/table_tlcs90.cpp @@ -55,9 +55,9 @@ static constexpr Entry TABLE_TLCS90[] PROGMEM = { E2(0x14, TEXT_ADD, M_REGIX, M_IMM16), E1(0x18, TEXT_DJNZ, M_REL8), E2(0x19, TEXT_DJNZ, R_BC, M_REL8), - E1(0x1A, TEXT_JP, M_EXT), + E1(0x1A, TEXT_JP, M_IMM16), E1(0x1B, TEXT_JRL, M_REL16), - E1(0x1C, TEXT_CALL, M_EXT), + E1(0x1C, TEXT_CALL, M_IMM16), E1(0x1D, TEXT_CALR, M_REL16), E0(0x1E, TEXT_RET), E0(0x1F, TEXT_RETI), @@ -499,8 +499,10 @@ struct EntryPage : entry::PrefixTableBase { const auto reg = code & 7; switch (prefixMode()) { case M_IND: + case M_REG16: return (code & ~7) == pre && reg != 3 && reg != 7; case M_IDX: + case M_IXPD: return (code & ~3) == pre && reg != 3; case M_REG8: return (code & ~7) == pre && reg != 7; @@ -532,13 +534,13 @@ static constexpr EntryPage TLCS90_PAGES[] PROGMEM = { {0xE8, M_IND, ARRAY_RANGE(TABLE_DST), ARRAY_RANGE(INDEX_DST)}, // dst (rr) {0xF7, M_BASE, ARRAY_RANGE(TABLE_DST), ARRAY_RANGE(INDEX_DST)}, // dst (HL+A) {0xF4, M_IDX, ARRAY_RANGE(TABLE_DST), ARRAY_RANGE(INDEX_DST)}, // dst (ix+d) - {0xEB, M_EXT, ARRAY_RANGE(TABLE_JMP), ARRAY_RANGE(INDEX_JMP)}, // JP/CALL - {0xE8, M_IND, ARRAY_RANGE(TABLE_JMP), ARRAY_RANGE(INDEX_JMP)}, // JP/CALL - {0xF7, M_BASE, ARRAY_RANGE(TABLE_JMP), ARRAY_RANGE(INDEX_JMP)}, // JP/CALL - {0xF4, M_IDX, ARRAY_RANGE(TABLE_JMP), ARRAY_RANGE(INDEX_JMP)}, // JP/CALL + {0xEB, M_IMM16, ARRAY_RANGE(TABLE_JMP), ARRAY_RANGE(INDEX_JMP)}, // JP/CALL nnnn + {0xE8, M_REG16, ARRAY_RANGE(TABLE_JMP), ARRAY_RANGE(INDEX_JMP)}, // JP/CALL rr + {0xF7, M_HLPA, ARRAY_RANGE(TABLE_JMP), ARRAY_RANGE(INDEX_JMP)}, // JP/CALL HL+A + {0xF4, M_IXPD, ARRAY_RANGE(TABLE_JMP), ARRAY_RANGE(INDEX_JMP)}, // JP/CALL ix+d {0xF8, M_REG8, ARRAY_RANGE(TABLE_REG), ARRAY_RANGE(INDEX_REG)}, // r/rr - {0xF7, M_BASE, ARRAY_RANGE(TABLE_LDA), ARRAY_RANGE(INDEX_LDA)}, // LDA - {0xF4, M_IDX, ARRAY_RANGE(TABLE_LDA), ARRAY_RANGE(INDEX_LDA)}, // LDA + {0xF7, M_HLPA, ARRAY_RANGE(TABLE_LDA), ARRAY_RANGE(INDEX_LDA)}, // LDA HL+A + {0xF4, M_IXPD, ARRAY_RANGE(TABLE_LDA), ARRAY_RANGE(INDEX_LDA)}, // LDA ix+d {0xFE, M_NONE, ARRAY_RANGE(TABLE_COND), ARRAY_RANGE(INDEX_COND)}, {0xFE, M_NONE, ARRAY_RANGE(TABLE_BLOCK), ARRAY_RANGE(INDEX_BLOCK)}, }; @@ -628,7 +630,11 @@ Error TableTlcs90::searchName(CpuType cpuType, AsmInsn &insn) const { } static bool prefixMatcher(DisInsn &insn, const EntryPage *page) { - return page->prefixMatcher(insn.prefix()); + if (page->prefixMatcher(insn.prefix())) { + insn.setPrefixMode(page->prefixMode()); + return true; + } + return false; } static bool invalidPrefixCode(Config::opcode_t prefix, AddrMode mode) { diff --git a/test/autogen/gen_tlcs90.inc b/test/autogen/gen_tlcs90.inc index 20b28317b..f09a8a8dc 100644 --- a/test/autogen/gen_tlcs90.inc +++ b/test/autogen/gen_tlcs90.inc @@ -29,11 +29,11 @@ DJNZ BC, $+28 DJNZ BC, $-126 DJNZ BC, $ - JP (1C1BH) + JP 1C1BH JRL $+1D1EH JRL $-00E2H JRL $ - CALL (1E1DH) + CALL 1E1DH CALR $+1F20H CALR $-00E0H CALR $ @@ -702,38 +702,38 @@ XOR (BC), 6EH OR (BC), 6FH CP (BC), 70H - JP F, (BC) - JP LT, (BC) - JP LE, (BC) - JP ULE, (BC) - JP OV, (BC) - JP MI, (BC) - JP Z, (BC) - JP C, (BC) - JP (BC) - JP GE, (BC) - JP GT, (BC) - JP UGT, (BC) - JP NOV, (BC) - JP PL, (BC) - JP NZ, (BC) - JP NC, (BC) - CALL F, (BC) - CALL LT, (BC) - CALL LE, (BC) - CALL ULE, (BC) - CALL OV, (BC) - CALL MI, (BC) - CALL Z, (BC) - CALL C, (BC) - CALL (BC) - CALL GE, (BC) - CALL GT, (BC) - CALL UGT, (BC) - CALL NOV, (BC) - CALL PL, (BC) - CALL NZ, (BC) - CALL NC, (BC) + JP F, BC + JP LT, BC + JP LE, BC + JP ULE, BC + JP OV, BC + JP MI, BC + JP Z, BC + JP C, BC + JP BC + JP GE, BC + JP GT, BC + JP UGT, BC + JP NOV, BC + JP PL, BC + JP NZ, BC + JP NC, BC + CALL F, BC + CALL LT, BC + CALL LE, BC + CALL ULE, BC + CALL OV, BC + CALL MI, BC + CALL Z, BC + CALL C, BC + CALL BC + CALL GE, BC + CALL GT, BC + CALL UGT, BC + CALL NOV, BC + CALL PL, BC + CALL NZ, BC + CALL NC, BC LD (DE), B LD (DE), C LD (DE), D @@ -757,38 +757,38 @@ XOR (DE), 6EH OR (DE), 6FH CP (DE), 70H - JP F, (DE) - JP LT, (DE) - JP LE, (DE) - JP ULE, (DE) - JP OV, (DE) - JP MI, (DE) - JP Z, (DE) - JP C, (DE) - JP (DE) - JP GE, (DE) - JP GT, (DE) - JP UGT, (DE) - JP NOV, (DE) - JP PL, (DE) - JP NZ, (DE) - JP NC, (DE) - CALL F, (DE) - CALL LT, (DE) - CALL LE, (DE) - CALL ULE, (DE) - CALL OV, (DE) - CALL MI, (DE) - CALL Z, (DE) - CALL C, (DE) - CALL (DE) - CALL GE, (DE) - CALL GT, (DE) - CALL UGT, (DE) - CALL NOV, (DE) - CALL PL, (DE) - CALL NZ, (DE) - CALL NC, (DE) + JP F, DE + JP LT, DE + JP LE, DE + JP ULE, DE + JP OV, DE + JP MI, DE + JP Z, DE + JP C, DE + JP DE + JP GE, DE + JP GT, DE + JP UGT, DE + JP NOV, DE + JP PL, DE + JP NZ, DE + JP NC, DE + CALL F, DE + CALL LT, DE + CALL LE, DE + CALL ULE, DE + CALL OV, DE + CALL MI, DE + CALL Z, DE + CALL C, DE + CALL DE + CALL GE, DE + CALL GT, DE + CALL UGT, DE + CALL NOV, DE + CALL PL, DE + CALL NZ, DE + CALL NC, DE LD (HL), B LD (HL), C LD (HL), D @@ -812,38 +812,38 @@ XOR (HL), 6EH OR (HL), 6FH CP (HL), 70H - JP F, (HL) - JP LT, (HL) - JP LE, (HL) - JP ULE, (HL) - JP OV, (HL) - JP MI, (HL) - JP Z, (HL) - JP C, (HL) - JP (HL) - JP GE, (HL) - JP GT, (HL) - JP UGT, (HL) - JP NOV, (HL) - JP PL, (HL) - JP NZ, (HL) - JP NC, (HL) - CALL F, (HL) - CALL LT, (HL) - CALL LE, (HL) - CALL ULE, (HL) - CALL OV, (HL) - CALL MI, (HL) - CALL Z, (HL) - CALL C, (HL) - CALL (HL) - CALL GE, (HL) - CALL GT, (HL) - CALL UGT, (HL) - CALL NOV, (HL) - CALL PL, (HL) - CALL NZ, (HL) - CALL NC, (HL) + JP F, HL + JP LT, HL + JP LE, HL + JP ULE, HL + JP OV, HL + JP MI, HL + JP Z, HL + JP C, HL + JP HL + JP GE, HL + JP GT, HL + JP UGT, HL + JP NOV, HL + JP PL, HL + JP NZ, HL + JP NC, HL + CALL F, HL + CALL LT, HL + CALL LE, HL + CALL ULE, HL + CALL OV, HL + CALL MI, HL + CALL Z, HL + CALL C, HL + CALL HL + CALL GE, HL + CALL GT, HL + CALL UGT, HL + CALL NOV, HL + CALL PL, HL + CALL NZ, HL + CALL NC, HL LD (0EDECH), B LD (0EDECH), C LD (0EDECH), D @@ -867,38 +867,38 @@ XOR (0EDECH), 6EH OR (0EDECH), 6FH CP (0EDECH), 70H - JP F, (0EDECH) - JP LT, (0EDECH) - JP LE, (0EDECH) - JP ULE, (0EDECH) - JP OV, (0EDECH) - JP MI, (0EDECH) - JP Z, (0EDECH) - JP C, (0EDECH) - JP (0EDECH) - JP GE, (0EDECH) - JP GT, (0EDECH) - JP UGT, (0EDECH) - JP NOV, (0EDECH) - JP PL, (0EDECH) - JP NZ, (0EDECH) - JP NC, (0EDECH) - CALL F, (0EDECH) - CALL LT, (0EDECH) - CALL LE, (0EDECH) - CALL ULE, (0EDECH) - CALL OV, (0EDECH) - CALL MI, (0EDECH) - CALL Z, (0EDECH) - CALL C, (0EDECH) - CALL (0EDECH) - CALL GE, (0EDECH) - CALL GT, (0EDECH) - CALL UGT, (0EDECH) - CALL NOV, (0EDECH) - CALL PL, (0EDECH) - CALL NZ, (0EDECH) - CALL NC, (0EDECH) + JP F, 0EDECH + JP LT, 0EDECH + JP LE, 0EDECH + JP ULE, 0EDECH + JP OV, 0EDECH + JP MI, 0EDECH + JP Z, 0EDECH + JP C, 0EDECH + JP 0EDECH + JP GE, 0EDECH + JP GT, 0EDECH + JP UGT, 0EDECH + JP NOV, 0EDECH + JP PL, 0EDECH + JP NZ, 0EDECH + JP NC, 0EDECH + CALL F, 0EDECH + CALL LT, 0EDECH + CALL LE, 0EDECH + CALL ULE, 0EDECH + CALL OV, 0EDECH + CALL MI, 0EDECH + CALL Z, 0EDECH + CALL C, 0EDECH + CALL 0EDECH + CALL GE, 0EDECH + CALL GT, 0EDECH + CALL UGT, 0EDECH + CALL NOV, 0EDECH + CALL PL, 0EDECH + CALL NZ, 0EDECH + CALL NC, 0EDECH LD (IX), B LD (IX), C LD (IX), D @@ -922,38 +922,38 @@ XOR (IX), 6EH OR (IX), 6FH CP (IX), 70H - JP F, (IX) - JP LT, (IX) - JP LE, (IX) - JP ULE, (IX) - JP OV, (IX) - JP MI, (IX) - JP Z, (IX) - JP C, (IX) - JP (IX) - JP GE, (IX) - JP GT, (IX) - JP UGT, (IX) - JP NOV, (IX) - JP PL, (IX) - JP NZ, (IX) - JP NC, (IX) - CALL F, (IX) - CALL LT, (IX) - CALL LE, (IX) - CALL ULE, (IX) - CALL OV, (IX) - CALL MI, (IX) - CALL Z, (IX) - CALL C, (IX) - CALL (IX) - CALL GE, (IX) - CALL GT, (IX) - CALL UGT, (IX) - CALL NOV, (IX) - CALL PL, (IX) - CALL NZ, (IX) - CALL NC, (IX) + JP F, IX + JP LT, IX + JP LE, IX + JP ULE, IX + JP OV, IX + JP MI, IX + JP Z, IX + JP C, IX + JP IX + JP GE, IX + JP GT, IX + JP UGT, IX + JP NOV, IX + JP PL, IX + JP NZ, IX + JP NC, IX + CALL F, IX + CALL LT, IX + CALL LE, IX + CALL ULE, IX + CALL OV, IX + CALL MI, IX + CALL Z, IX + CALL C, IX + CALL IX + CALL GE, IX + CALL GT, IX + CALL UGT, IX + CALL NOV, IX + CALL PL, IX + CALL NZ, IX + CALL NC, IX LD (IY), B LD (IY), C LD (IY), D @@ -977,38 +977,38 @@ XOR (IY), 6EH OR (IY), 6FH CP (IY), 70H - JP F, (IY) - JP LT, (IY) - JP LE, (IY) - JP ULE, (IY) - JP OV, (IY) - JP MI, (IY) - JP Z, (IY) - JP C, (IY) - JP (IY) - JP GE, (IY) - JP GT, (IY) - JP UGT, (IY) - JP NOV, (IY) - JP PL, (IY) - JP NZ, (IY) - JP NC, (IY) - CALL F, (IY) - CALL LT, (IY) - CALL LE, (IY) - CALL ULE, (IY) - CALL OV, (IY) - CALL MI, (IY) - CALL Z, (IY) - CALL C, (IY) - CALL (IY) - CALL GE, (IY) - CALL GT, (IY) - CALL UGT, (IY) - CALL NOV, (IY) - CALL PL, (IY) - CALL NZ, (IY) - CALL NC, (IY) + JP F, IY + JP LT, IY + JP LE, IY + JP ULE, IY + JP OV, IY + JP MI, IY + JP Z, IY + JP C, IY + JP IY + JP GE, IY + JP GT, IY + JP UGT, IY + JP NOV, IY + JP PL, IY + JP NZ, IY + JP NC, IY + CALL F, IY + CALL LT, IY + CALL LE, IY + CALL ULE, IY + CALL OV, IY + CALL MI, IY + CALL Z, IY + CALL C, IY + CALL IY + CALL GE, IY + CALL GT, IY + CALL UGT, IY + CALL NOV, IY + CALL PL, IY + CALL NZ, IY + CALL NC, IY LD (SP), B LD (SP), C LD (SP), D @@ -1032,38 +1032,38 @@ XOR (SP), 6EH OR (SP), 6FH CP (SP), 70H - JP F, (SP) - JP LT, (SP) - JP LE, (SP) - JP ULE, (SP) - JP OV, (SP) - JP MI, (SP) - JP Z, (SP) - JP C, (SP) - JP (SP) - JP GE, (SP) - JP GT, (SP) - JP UGT, (SP) - JP NOV, (SP) - JP PL, (SP) - JP NZ, (SP) - JP NC, (SP) - CALL F, (SP) - CALL LT, (SP) - CALL LE, (SP) - CALL ULE, (SP) - CALL OV, (SP) - CALL MI, (SP) - CALL Z, (SP) - CALL C, (SP) - CALL (SP) - CALL GE, (SP) - CALL GT, (SP) - CALL UGT, (SP) - CALL NOV, (SP) - CALL PL, (SP) - CALL NZ, (SP) - CALL NC, (SP) + JP F, SP + JP LT, SP + JP LE, SP + JP ULE, SP + JP OV, SP + JP MI, SP + JP Z, SP + JP C, SP + JP SP + JP GE, SP + JP GT, SP + JP UGT, SP + JP NOV, SP + JP PL, SP + JP NZ, SP + JP NC, SP + CALL F, SP + CALL LT, SP + CALL LE, SP + CALL ULE, SP + CALL OV, SP + CALL MI, SP + CALL Z, SP + CALL C, SP + CALL SP + CALL GE, SP + CALL GT, SP + CALL UGT, SP + CALL NOV, SP + CALL PL, SP + CALL NZ, SP + CALL NC, SP LD (0FFF0H), B LD (0FFF0H), C LD (0FFF0H), D @@ -1501,12 +1501,12 @@ LD (IX-11), L LD (IX-11), A LD (IX-11), 38H - LDA BC, (IX-11) - LDA DE, (IX-11) - LDA HL, (IX-11) - LDA IX, (IX-11) - LDA IY, (IX-11) - LDA SP, (IX-11) + LDA BC, IX-11 + LDA DE, IX-11 + LDA HL, IX-11 + LDA IX, IX-11 + LDA IY, IX-11 + LDA SP, IX-11 LDW (IX-11), 4140H LD (IX-11), BC LD (IX-11), DE @@ -1522,38 +1522,38 @@ XOR (IX-11), 6EH OR (IX-11), 6FH CP (IX-11), 70H - JP F, (IX-11) - JP LT, (IX-11) - JP LE, (IX-11) - JP ULE, (IX-11) - JP OV, (IX-11) - JP MI, (IX-11) - JP Z, (IX-11) - JP C, (IX-11) - JP (IX-11) - JP GE, (IX-11) - JP GT, (IX-11) - JP UGT, (IX-11) - JP NOV, (IX-11) - JP PL, (IX-11) - JP NZ, (IX-11) - JP NC, (IX-11) - CALL F, (IX-11) - CALL LT, (IX-11) - CALL LE, (IX-11) - CALL ULE, (IX-11) - CALL OV, (IX-11) - CALL MI, (IX-11) - CALL Z, (IX-11) - CALL C, (IX-11) - CALL (IX-11) - CALL GE, (IX-11) - CALL GT, (IX-11) - CALL UGT, (IX-11) - CALL NOV, (IX-11) - CALL PL, (IX-11) - CALL NZ, (IX-11) - CALL NC, (IX-11) + JP F, IX-11 + JP LT, IX-11 + JP LE, IX-11 + JP ULE, IX-11 + JP OV, IX-11 + JP MI, IX-11 + JP Z, IX-11 + JP C, IX-11 + JP IX-11 + JP GE, IX-11 + JP GT, IX-11 + JP UGT, IX-11 + JP NOV, IX-11 + JP PL, IX-11 + JP NZ, IX-11 + JP NC, IX-11 + CALL F, IX-11 + CALL LT, IX-11 + CALL LE, IX-11 + CALL ULE, IX-11 + CALL OV, IX-11 + CALL MI, IX-11 + CALL Z, IX-11 + CALL C, IX-11 + CALL IX-11 + CALL GE, IX-11 + CALL GT, IX-11 + CALL UGT, IX-11 + CALL NOV, IX-11 + CALL PL, IX-11 + CALL NZ, IX-11 + CALL NC, IX-11 LD (IX+0), B LD (IX+0), C LD (IX+0), D @@ -1562,12 +1562,12 @@ LD (IX+0), L LD (IX+0), A LD (IX+0), 38H - LDA BC, (IX+0) - LDA DE, (IX+0) - LDA HL, (IX+0) - LDA IX, (IX+0) - LDA IY, (IX+0) - LDA SP, (IX+0) + LDA BC, IX+0 + LDA DE, IX+0 + LDA HL, IX+0 + LDA IX, IX+0 + LDA IY, IX+0 + LDA SP, IX+0 LDW (IX+0), 4140H LD (IX+0), BC LD (IX+0), DE @@ -1583,38 +1583,38 @@ XOR (IX+0), 6EH OR (IX+0), 6FH CP (IX+0), 70H - JP F, (IX+0) - JP LT, (IX+0) - JP LE, (IX+0) - JP ULE, (IX+0) - JP OV, (IX+0) - JP MI, (IX+0) - JP Z, (IX+0) - JP C, (IX+0) - JP (IX+0) - JP GE, (IX+0) - JP GT, (IX+0) - JP UGT, (IX+0) - JP NOV, (IX+0) - JP PL, (IX+0) - JP NZ, (IX+0) - JP NC, (IX+0) - CALL F, (IX+0) - CALL LT, (IX+0) - CALL LE, (IX+0) - CALL ULE, (IX+0) - CALL OV, (IX+0) - CALL MI, (IX+0) - CALL Z, (IX+0) - CALL C, (IX+0) - CALL (IX+0) - CALL GE, (IX+0) - CALL GT, (IX+0) - CALL UGT, (IX+0) - CALL NOV, (IX+0) - CALL PL, (IX+0) - CALL NZ, (IX+0) - CALL NC, (IX+0) + JP F, IX+0 + JP LT, IX+0 + JP LE, IX+0 + JP ULE, IX+0 + JP OV, IX+0 + JP MI, IX+0 + JP Z, IX+0 + JP C, IX+0 + JP IX+0 + JP GE, IX+0 + JP GT, IX+0 + JP UGT, IX+0 + JP NOV, IX+0 + JP PL, IX+0 + JP NZ, IX+0 + JP NC, IX+0 + CALL F, IX+0 + CALL LT, IX+0 + CALL LE, IX+0 + CALL ULE, IX+0 + CALL OV, IX+0 + CALL MI, IX+0 + CALL Z, IX+0 + CALL C, IX+0 + CALL IX+0 + CALL GE, IX+0 + CALL GT, IX+0 + CALL UGT, IX+0 + CALL NOV, IX+0 + CALL PL, IX+0 + CALL NZ, IX+0 + CALL NC, IX+0 LD (IY-10), B LD (IY-10), C LD (IY-10), D @@ -1623,12 +1623,12 @@ LD (IY-10), L LD (IY-10), A LD (IY-10), 38H - LDA BC, (IY-10) - LDA DE, (IY-10) - LDA HL, (IY-10) - LDA IX, (IY-10) - LDA IY, (IY-10) - LDA SP, (IY-10) + LDA BC, IY-10 + LDA DE, IY-10 + LDA HL, IY-10 + LDA IX, IY-10 + LDA IY, IY-10 + LDA SP, IY-10 LDW (IY-10), 4140H LD (IY-10), BC LD (IY-10), DE @@ -1644,38 +1644,38 @@ XOR (IY-10), 6EH OR (IY-10), 6FH CP (IY-10), 70H - JP F, (IY-10) - JP LT, (IY-10) - JP LE, (IY-10) - JP ULE, (IY-10) - JP OV, (IY-10) - JP MI, (IY-10) - JP Z, (IY-10) - JP C, (IY-10) - JP (IY-10) - JP GE, (IY-10) - JP GT, (IY-10) - JP UGT, (IY-10) - JP NOV, (IY-10) - JP PL, (IY-10) - JP NZ, (IY-10) - JP NC, (IY-10) - CALL F, (IY-10) - CALL LT, (IY-10) - CALL LE, (IY-10) - CALL ULE, (IY-10) - CALL OV, (IY-10) - CALL MI, (IY-10) - CALL Z, (IY-10) - CALL C, (IY-10) - CALL (IY-10) - CALL GE, (IY-10) - CALL GT, (IY-10) - CALL UGT, (IY-10) - CALL NOV, (IY-10) - CALL PL, (IY-10) - CALL NZ, (IY-10) - CALL NC, (IY-10) + JP F, IY-10 + JP LT, IY-10 + JP LE, IY-10 + JP ULE, IY-10 + JP OV, IY-10 + JP MI, IY-10 + JP Z, IY-10 + JP C, IY-10 + JP IY-10 + JP GE, IY-10 + JP GT, IY-10 + JP UGT, IY-10 + JP NOV, IY-10 + JP PL, IY-10 + JP NZ, IY-10 + JP NC, IY-10 + CALL F, IY-10 + CALL LT, IY-10 + CALL LE, IY-10 + CALL ULE, IY-10 + CALL OV, IY-10 + CALL MI, IY-10 + CALL Z, IY-10 + CALL C, IY-10 + CALL IY-10 + CALL GE, IY-10 + CALL GT, IY-10 + CALL UGT, IY-10 + CALL NOV, IY-10 + CALL PL, IY-10 + CALL NZ, IY-10 + CALL NC, IY-10 LD (IY+0), B LD (IY+0), C LD (IY+0), D @@ -1684,12 +1684,12 @@ LD (IY+0), L LD (IY+0), A LD (IY+0), 38H - LDA BC, (IY+0) - LDA DE, (IY+0) - LDA HL, (IY+0) - LDA IX, (IY+0) - LDA IY, (IY+0) - LDA SP, (IY+0) + LDA BC, IY+0 + LDA DE, IY+0 + LDA HL, IY+0 + LDA IX, IY+0 + LDA IY, IY+0 + LDA SP, IY+0 LDW (IY+0), 4140H LD (IY+0), BC LD (IY+0), DE @@ -1705,38 +1705,38 @@ XOR (IY+0), 6EH OR (IY+0), 6FH CP (IY+0), 70H - JP F, (IY+0) - JP LT, (IY+0) - JP LE, (IY+0) - JP ULE, (IY+0) - JP OV, (IY+0) - JP MI, (IY+0) - JP Z, (IY+0) - JP C, (IY+0) - JP (IY+0) - JP GE, (IY+0) - JP GT, (IY+0) - JP UGT, (IY+0) - JP NOV, (IY+0) - JP PL, (IY+0) - JP NZ, (IY+0) - JP NC, (IY+0) - CALL F, (IY+0) - CALL LT, (IY+0) - CALL LE, (IY+0) - CALL ULE, (IY+0) - CALL OV, (IY+0) - CALL MI, (IY+0) - CALL Z, (IY+0) - CALL C, (IY+0) - CALL (IY+0) - CALL GE, (IY+0) - CALL GT, (IY+0) - CALL UGT, (IY+0) - CALL NOV, (IY+0) - CALL PL, (IY+0) - CALL NZ, (IY+0) - CALL NC, (IY+0) + JP F, IY+0 + JP LT, IY+0 + JP LE, IY+0 + JP ULE, IY+0 + JP OV, IY+0 + JP MI, IY+0 + JP Z, IY+0 + JP C, IY+0 + JP IY+0 + JP GE, IY+0 + JP GT, IY+0 + JP UGT, IY+0 + JP NOV, IY+0 + JP PL, IY+0 + JP NZ, IY+0 + JP NC, IY+0 + CALL F, IY+0 + CALL LT, IY+0 + CALL LE, IY+0 + CALL ULE, IY+0 + CALL OV, IY+0 + CALL MI, IY+0 + CALL Z, IY+0 + CALL C, IY+0 + CALL IY+0 + CALL GE, IY+0 + CALL GT, IY+0 + CALL UGT, IY+0 + CALL NOV, IY+0 + CALL PL, IY+0 + CALL NZ, IY+0 + CALL NC, IY+0 LD (SP-9), B LD (SP-9), C LD (SP-9), D @@ -1745,12 +1745,12 @@ LD (SP-9), L LD (SP-9), A LD (SP-9), 38H - LDA BC, (SP-9) - LDA DE, (SP-9) - LDA HL, (SP-9) - LDA IX, (SP-9) - LDA IY, (SP-9) - LDA SP, (SP-9) + LDA BC, SP-9 + LDA DE, SP-9 + LDA HL, SP-9 + LDA IX, SP-9 + LDA IY, SP-9 + LDA SP, SP-9 LDW (SP-9), 4140H LD (SP-9), BC LD (SP-9), DE @@ -1766,38 +1766,38 @@ XOR (SP-9), 6EH OR (SP-9), 6FH CP (SP-9), 70H - JP F, (SP-9) - JP LT, (SP-9) - JP LE, (SP-9) - JP ULE, (SP-9) - JP OV, (SP-9) - JP MI, (SP-9) - JP Z, (SP-9) - JP C, (SP-9) - JP (SP-9) - JP GE, (SP-9) - JP GT, (SP-9) - JP UGT, (SP-9) - JP NOV, (SP-9) - JP PL, (SP-9) - JP NZ, (SP-9) - JP NC, (SP-9) - CALL F, (SP-9) - CALL LT, (SP-9) - CALL LE, (SP-9) - CALL ULE, (SP-9) - CALL OV, (SP-9) - CALL MI, (SP-9) - CALL Z, (SP-9) - CALL C, (SP-9) - CALL (SP-9) - CALL GE, (SP-9) - CALL GT, (SP-9) - CALL UGT, (SP-9) - CALL NOV, (SP-9) - CALL PL, (SP-9) - CALL NZ, (SP-9) - CALL NC, (SP-9) + JP F, SP-9 + JP LT, SP-9 + JP LE, SP-9 + JP ULE, SP-9 + JP OV, SP-9 + JP MI, SP-9 + JP Z, SP-9 + JP C, SP-9 + JP SP-9 + JP GE, SP-9 + JP GT, SP-9 + JP UGT, SP-9 + JP NOV, SP-9 + JP PL, SP-9 + JP NZ, SP-9 + JP NC, SP-9 + CALL F, SP-9 + CALL LT, SP-9 + CALL LE, SP-9 + CALL ULE, SP-9 + CALL OV, SP-9 + CALL MI, SP-9 + CALL Z, SP-9 + CALL C, SP-9 + CALL SP-9 + CALL GE, SP-9 + CALL GT, SP-9 + CALL UGT, SP-9 + CALL NOV, SP-9 + CALL PL, SP-9 + CALL NZ, SP-9 + CALL NC, SP-9 LD (SP+0), B LD (SP+0), C LD (SP+0), D @@ -1806,12 +1806,12 @@ LD (SP+0), L LD (SP+0), A LD (SP+0), 38H - LDA BC, (SP+0) - LDA DE, (SP+0) - LDA HL, (SP+0) - LDA IX, (SP+0) - LDA IY, (SP+0) - LDA SP, (SP+0) + LDA BC, SP+0 + LDA DE, SP+0 + LDA HL, SP+0 + LDA IX, SP+0 + LDA IY, SP+0 + LDA SP, SP+0 LDW (SP+0), 4140H LD (SP+0), BC LD (SP+0), DE @@ -1827,38 +1827,38 @@ XOR (SP+0), 6EH OR (SP+0), 6FH CP (SP+0), 70H - JP F, (SP+0) - JP LT, (SP+0) - JP LE, (SP+0) - JP ULE, (SP+0) - JP OV, (SP+0) - JP MI, (SP+0) - JP Z, (SP+0) - JP C, (SP+0) - JP (SP+0) - JP GE, (SP+0) - JP GT, (SP+0) - JP UGT, (SP+0) - JP NOV, (SP+0) - JP PL, (SP+0) - JP NZ, (SP+0) - JP NC, (SP+0) - CALL F, (SP+0) - CALL LT, (SP+0) - CALL LE, (SP+0) - CALL ULE, (SP+0) - CALL OV, (SP+0) - CALL MI, (SP+0) - CALL Z, (SP+0) - CALL C, (SP+0) - CALL (SP+0) - CALL GE, (SP+0) - CALL GT, (SP+0) - CALL UGT, (SP+0) - CALL NOV, (SP+0) - CALL PL, (SP+0) - CALL NZ, (SP+0) - CALL NC, (SP+0) + JP F, SP+0 + JP LT, SP+0 + JP LE, SP+0 + JP ULE, SP+0 + JP OV, SP+0 + JP MI, SP+0 + JP Z, SP+0 + JP C, SP+0 + JP SP+0 + JP GE, SP+0 + JP GT, SP+0 + JP UGT, SP+0 + JP NOV, SP+0 + JP PL, SP+0 + JP NZ, SP+0 + JP NC, SP+0 + CALL F, SP+0 + CALL LT, SP+0 + CALL LE, SP+0 + CALL ULE, SP+0 + CALL OV, SP+0 + CALL MI, SP+0 + CALL Z, SP+0 + CALL C, SP+0 + CALL SP+0 + CALL GE, SP+0 + CALL GT, SP+0 + CALL UGT, SP+0 + CALL NOV, SP+0 + CALL PL, SP+0 + CALL NZ, SP+0 + CALL NC, SP+0 LD (HL+A), B LD (HL+A), C LD (HL+A), D @@ -1867,12 +1867,12 @@ LD (HL+A), L LD (HL+A), A LD (HL+A), 38H - LDA BC, (HL+A) - LDA DE, (HL+A) - LDA HL, (HL+A) - LDA IX, (HL+A) - LDA IY, (HL+A) - LDA SP, (HL+A) + LDA BC, HL+A + LDA DE, HL+A + LDA HL, HL+A + LDA IX, HL+A + LDA IY, HL+A + LDA SP, HL+A LDW (HL+A), 4140H LD (HL+A), BC LD (HL+A), DE @@ -1888,38 +1888,38 @@ XOR (HL+A), 6EH OR (HL+A), 6FH CP (HL+A), 70H - JP F, (HL+A) - JP LT, (HL+A) - JP LE, (HL+A) - JP ULE, (HL+A) - JP OV, (HL+A) - JP MI, (HL+A) - JP Z, (HL+A) - JP C, (HL+A) - JP (HL+A) - JP GE, (HL+A) - JP GT, (HL+A) - JP UGT, (HL+A) - JP NOV, (HL+A) - JP PL, (HL+A) - JP NZ, (HL+A) - JP NC, (HL+A) - CALL F, (HL+A) - CALL LT, (HL+A) - CALL LE, (HL+A) - CALL ULE, (HL+A) - CALL OV, (HL+A) - CALL MI, (HL+A) - CALL Z, (HL+A) - CALL C, (HL+A) - CALL (HL+A) - CALL GE, (HL+A) - CALL GT, (HL+A) - CALL UGT, (HL+A) - CALL NOV, (HL+A) - CALL PL, (HL+A) - CALL NZ, (HL+A) - CALL NC, (HL+A) + JP F, HL+A + JP LT, HL+A + JP LE, HL+A + JP ULE, HL+A + JP OV, HL+A + JP MI, HL+A + JP Z, HL+A + JP C, HL+A + JP HL+A + JP GE, HL+A + JP GT, HL+A + JP UGT, HL+A + JP NOV, HL+A + JP PL, HL+A + JP NZ, HL+A + JP NC, HL+A + CALL F, HL+A + CALL LT, HL+A + CALL LE, HL+A + CALL ULE, HL+A + CALL OV, HL+A + CALL MI, HL+A + CALL Z, HL+A + CALL C, HL+A + CALL HL+A + CALL GE, HL+A + CALL GT, HL+A + CALL UGT, HL+A + CALL NOV, HL+A + CALL PL, HL+A + CALL NZ, HL+A + CALL NC, HL+A MUL HL, B DIV HL, B ADD IX, BC diff --git a/test/test_asm_tlcs90.cpp b/test/test_asm_tlcs90.cpp index 5f502268e..87cefba14 100644 --- a/test/test_asm_tlcs90.cpp +++ b/test/test_asm_tlcs90.cpp @@ -531,6 +531,36 @@ static void test_16bit_transfer() { TEST("POP IX", 0x5C); TEST("POP IY", 0x5D); TEST("POP AF", 0x5E); + + TEST("LDA BC, IX+18", 0xF4, 0x12, 0x38); + TEST("LDA DE, IX+18", 0xF4, 0x12, 0x39); + TEST("LDA HL, IX+18", 0xF4, 0x12, 0x3A); + TEST("LDA IX, IX+18", 0xF4, 0x12, 0x3C); + TEST("LDA IY, IX+18", 0xF4, 0x12, 0x3D); + TEST("LDA SP, IX+18", 0xF4, 0x12, 0x3E); + TEST("LDA BC, IY-18", 0xF5, 0xEE, 0x38); + TEST("LDA DE, IY-18", 0xF5, 0xEE, 0x39); + TEST("LDA HL, IY-18", 0xF5, 0xEE, 0x3A); + TEST("LDA IX, IY-18", 0xF5, 0xEE, 0x3C); + TEST("LDA IY, IY-18", 0xF5, 0xEE, 0x3D); + TEST("LDA SP, IY-18", 0xF5, 0xEE, 0x3E); + TEST("LDA BC, SP+18", 0xF6, 0x12, 0x38); + TEST("LDA DE, SP+18", 0xF6, 0x12, 0x39); + TEST("LDA HL, SP+18", 0xF6, 0x12, 0x3A); + TEST("LDA IX, SP+18", 0xF6, 0x12, 0x3C); + TEST("LDA IY, SP+18", 0xF6, 0x12, 0x3D); + TEST("LDA SP, SP+18", 0xF6, 0x12, 0x3E); + TEST("LDA BC, HL+A", 0xF7, 0x38); + TEST("LDA DE, HL+A", 0xF7, 0x39); + TEST("LDA HL, HL+A", 0xF7, 0x3A); + TEST("LDA IX, HL+A", 0xF7, 0x3C); + TEST("LDA IY, HL+A", 0xF7, 0x3D); + TEST("LDA SP, HL+A", 0xF7, 0x3E); + + ATEST(0x1000, "LDAR HL, 1003H", 0x17, 0x01, 0x00); + ATEST(0x1000, "LDAR HL, 1000H", 0x17, 0xFE, 0xFF); + ATEST(0x9000, "LDAR HL, 1002H", 0x17, 0x00, 0x80); + ATEST(0x1000, "LDAR HL, 9001H", 0x17, 0xFF, 0x7F); } static void test_exchange() { @@ -1613,59 +1643,59 @@ static void test_jump_call() { ATEST(0x1000, "JRL $+8001H", 0x1B, 0xFF, 0x7F); AERRT(0x1000, "JRL $+8002H", OVERFLOW_RANGE, "$+8002H", 0x1B, 0x00, 0x80); - TEST("JP (1234H)", 0x1A, 0x34, 0x12); - - TEST("JP F,(BC)", 0xE8, 0xC0); - TEST("JP LT,(DE)", 0xE9, 0xC1); - TEST("JP LE,(HL)", 0xEA, 0xC2); - TEST("JP ULE,(1234H)", 0xEB, 0x34, 0x12, 0xC3); - TEST("JP OV,(IX)", 0xEC, 0xC4); - TEST("jp mi,(iy)", 0xED, 0xC5); - TEST("JP Z,(SP)", 0xEE, 0xC6); - TEST("JP C,(0FF34H)", 0xEB, 0x34, 0xFF, 0xC7); - TEST("JP (IX+34H)", 0xF4, 0x34, 0xC8); - TEST("JP GE,(IY-34H)", 0xF5, 0xCC, 0xC9); - TEST("JP GT,(SP+34H)", 0xF6, 0x34, 0xCA); - TEST("JP UGT,(HL+A)", 0xF7, 0xCB); - TEST("JP NOV,(BC)", 0xE8, 0xCC); - TEST("JP PL,(DE)", 0xE9, 0xCD); - TEST("JP NZ,(HL)", 0xEA, 0xCE); - TEST("JP NC,(1234H)", 0xEB, 0x34, 0x12, 0xCF); - TEST("JP PE,(IX)", 0xEC, 0xC4); - TEST("JP M,(IY)", 0xED, 0xC5); - TEST("JP EQ,(SP)", 0xEE, 0xC6); - TEST("JP ULT,(0FF34H)", 0xEB, 0x34, 0xFF, 0xC7); - TEST("JP PO,(IX+34H)", 0xF4, 0x34, 0xCC); - TEST("JP P,(IY-34H)", 0xF5, 0xCC, 0xCD); - TEST("JP NE,(SP+34H)", 0xF6, 0x34, 0xCE); - TEST("JP UGE,(HL+A)", 0xF7, 0xCF); - - TEST("CALL (1234H)", 0x1C, 0x34, 0x12); - - TEST("CALL F,(BC)", 0xE8, 0xD0); - TEST("CALL LT,(DE)", 0xE9, 0xD1); - TEST("CALL LE,(HL)", 0xEA, 0xD2); - TEST("CALL ULE,(1234H)", 0xEB, 0x34, 0x12, 0xD3); - TEST("CALL OV,(IX)", 0xEC, 0xD4); - TEST("CALL MI,(IY)", 0xED, 0xD5); - TEST("CALL Z,(SP)", 0xEE, 0xD6); - TEST("CALL C,(0FF34H)", 0xEB, 0x34, 0xFF, 0xD7); - TEST("CALL (IX+34H)", 0xF4, 0x34, 0xD8); - TEST("CALL GE,(IY-34H)", 0xF5, 0xCC, 0xD9); - TEST("CALL GT,(SP+34H)", 0xF6, 0x34, 0xDA); - TEST("CALL UGT,(HL+A)", 0xF7, 0xDB); - TEST("CALL NOV,(BC)", 0xE8, 0xDC); - TEST("CALL PL,(DE)", 0xE9, 0xDD); - TEST("CALL NZ,(HL)", 0xEA, 0xDE); - TEST("CALL NC,(1234H)", 0xEB, 0x34, 0x12, 0xDF); - TEST("CALL PE,(IX)", 0xEC, 0xD4); - TEST("CALL M,(IY)", 0xED, 0xD5); - TEST("CALL EQ,(SP)", 0xEE, 0xD6); - TEST("CALL ULT,(0FF34H)", 0xEB, 0x34, 0xFF, 0xD7 ); - TEST("CALL PO,(IX+34H)", 0xF4, 0x34, 0xDC); - TEST("CALL P,(IY-34H)", 0xF5, 0xCC, 0xDD); - TEST("CALL NE,(SP+34H)", 0xF6, 0x34, 0xDE); - TEST("CALL UGE,(HL+A)", 0xF7, 0xDF); + TEST("JP 1234H", 0x1A, 0x34, 0x12); + + TEST("JP F, BC", 0xE8, 0xC0); + TEST("JP LT, DE", 0xE9, 0xC1); + TEST("JP LE, HL", 0xEA, 0xC2); + TEST("JP ULE, 1234H", 0xEB, 0x34, 0x12, 0xC3); + TEST("JP OV, IX", 0xEC, 0xC4); + TEST("jp mi, iy", 0xED, 0xC5); + TEST("JP Z, SP", 0xEE, 0xC6); + TEST("JP C, 0FF34H", 0xEB, 0x34, 0xFF, 0xC7); + TEST("JP IX+34H", 0xF4, 0x34, 0xC8); + TEST("JP GE, IY-34H", 0xF5, 0xCC, 0xC9); + TEST("JP GT, SP+34H", 0xF6, 0x34, 0xCA); + TEST("JP UGT, HL+A", 0xF7, 0xCB); + TEST("JP NOV, BC", 0xE8, 0xCC); + TEST("JP PL, DE", 0xE9, 0xCD); + TEST("JP NZ, HL", 0xEA, 0xCE); + TEST("JP NC, 1234H", 0xEB, 0x34, 0x12, 0xCF); + TEST("JP PE, IX", 0xEC, 0xC4); + TEST("JP M, IY", 0xED, 0xC5); + TEST("JP EQ, SP", 0xEE, 0xC6); + TEST("JP ULT, 0FF34H", 0xEB, 0x34, 0xFF, 0xC7); + TEST("JP PO, IX+34H", 0xF4, 0x34, 0xCC); + TEST("JP P, IY-34H", 0xF5, 0xCC, 0xCD); + TEST("JP NE, SP+34H", 0xF6, 0x34, 0xCE); + TEST("JP UGE, HL+A", 0xF7, 0xCF); + + TEST("CALL 1234H", 0x1C, 0x34, 0x12); + + TEST("CALL F, BC", 0xE8, 0xD0); + TEST("CALL LT, DE", 0xE9, 0xD1); + TEST("CALL LE, HL", 0xEA, 0xD2); + TEST("CALL ULE, 1234H", 0xEB, 0x34, 0x12, 0xD3); + TEST("CALL OV, IX", 0xEC, 0xD4); + TEST("CALL MI, IY", 0xED, 0xD5); + TEST("CALL Z, SP", 0xEE, 0xD6); + TEST("CALL C, 0FF34H", 0xEB, 0x34, 0xFF, 0xD7); + TEST("CALL IX+34H", 0xF4, 0x34, 0xD8); + TEST("CALL GE, IY-34H", 0xF5, 0xCC, 0xD9); + TEST("CALL GT, SP+34H", 0xF6, 0x34, 0xDA); + TEST("CALL UGT, HL+A", 0xF7, 0xDB); + TEST("CALL NOV, BC", 0xE8, 0xDC); + TEST("CALL PL, DE", 0xE9, 0xDD); + TEST("CALL NZ, HL", 0xEA, 0xDE); + TEST("CALL NC, 1234H", 0xEB, 0x34, 0x12, 0xDF); + TEST("CALL PE, IX", 0xEC, 0xD4); + TEST("CALL M, IY", 0xED, 0xD5); + TEST("CALL EQ, SP", 0xEE, 0xD6); + TEST("CALL ULT, 0FF34H", 0xEB, 0x34, 0xFF, 0xD7 ); + TEST("CALL PO, IX+34H", 0xF4, 0x34, 0xDC); + TEST("CALL P, IY-34H", 0xF5, 0xCC, 0xDD); + TEST("CALL NE, SP+34H", 0xF6, 0x34, 0xDE); + TEST("CALL UGE, HL+A", 0xF7, 0xDF); ATEST(0x1000, "CALR $+3", 0x1D, 0x01, 0x00); ATEST(0x1000, "CALR $", 0x1D, 0xFE, 0xFF); @@ -1746,10 +1776,10 @@ static void test_comment() { ERRT("LD B , ( 1234H ) ; comment", OK, "; comment", 0xE3, 0x34, 0x12, 0x28); ERRT("LD B , ( IX + 34H ); comment", OK, "; comment", 0xF0, 0x34, 0x28); ERRT("LD B , ( HL + A ) ; comment", OK, "; comment", 0xF3, 0x28); - ERRT("CALL LE , ( HL ) ; comment", OK, "; comment", 0xEA, 0xD2); - ERRT("CALL ULE , ( 1234H ) ; comment", OK, "; comment", 0xEB, 0x34, 0x12, 0xD3); - ERRT("CALL GT , ( SP + 34H ) ; comment", OK, "; comment", 0xF6, 0x34, 0xDA); - ERRT("CALL UGT , ( HL + A ) ; comment", OK, "; comment", 0xF7, 0xDB); + ERRT("CALL LE , HL ; comment", OK, "; comment", 0xEA, 0xD2); + ERRT("CALL ULE , 1234H ; comment", OK, "; comment", 0xEB, 0x34, 0x12, 0xD3); + ERRT("CALL GT , SP + 34H ; comment", OK, "; comment", 0xF6, 0x34, 0xDA); + ERRT("CALL UGT , HL + A ; comment", OK, "; comment", 0xF7, 0xDB); } static void test_error() { @@ -1761,7 +1791,7 @@ static void test_error() { ERRT("LD B,(HL-A)", REGISTER_NOT_ALLOWED, "HL-A)"); ERRT("LD B,(IX+127", MISSING_CLOSING_PAREN, ""); ERRT("LD B,(1234H", MISSING_CLOSING_PAREN, ""); - ERRT("LD B,(BC+34H", MISSING_CLOSING_PAREN, ""); + ERRT("LD B,(BC+34H", REGISTER_NOT_ALLOWED, "BC+34H"); ERRT("LD B,(HL+A", MISSING_CLOSING_PAREN, ""); } diff --git a/test/test_dis_tlcs90.cpp b/test/test_dis_tlcs90.cpp index 755872b44..987dc88f1 100644 --- a/test/test_dis_tlcs90.cpp +++ b/test/test_dis_tlcs90.cpp @@ -614,35 +614,35 @@ static void test_16bit_transfer() { TEST("POP", "IY", 0x5D); TEST("POP", "AF", 0x5E); - // LDA rr, (ix+d) - TEST("LDA", "BC, (IX+18)", 0xF4, 0x12, 0x38); - TEST("LDA", "DE, (IX+18)", 0xF4, 0x12, 0x39); - TEST("LDA", "HL, (IX+18)", 0xF4, 0x12, 0x3A); - TEST("LDA", "IX, (IX+18)", 0xF4, 0x12, 0x3C); - TEST("LDA", "IY, (IX+18)", 0xF4, 0x12, 0x3D); - TEST("LDA", "SP, (IX+18)", 0xF4, 0x12, 0x3E); - TEST("LDA", "BC, (IY-18)", 0xF5, 0xEE, 0x38); - TEST("LDA", "DE, (IY-18)", 0xF5, 0xEE, 0x39); - TEST("LDA", "HL, (IY-18)", 0xF5, 0xEE, 0x3A); - TEST("LDA", "IX, (IY-18)", 0xF5, 0xEE, 0x3C); - TEST("LDA", "IY, (IY-18)", 0xF5, 0xEE, 0x3D); - TEST("LDA", "SP, (IY-18)", 0xF5, 0xEE, 0x3E); - TEST("LDA", "BC, (SP+18)", 0xF6, 0x12, 0x38); - TEST("LDA", "DE, (SP+18)", 0xF6, 0x12, 0x39); - TEST("LDA", "HL, (SP+18)", 0xF6, 0x12, 0x3A); - TEST("LDA", "IX, (SP+18)", 0xF6, 0x12, 0x3C); - TEST("LDA", "IY, (SP+18)", 0xF6, 0x12, 0x3D); - TEST("LDA", "SP, (SP+18)", 0xF6, 0x12, 0x3E); + // LDA rr, ix+d + TEST("LDA", "BC, IX+18", 0xF4, 0x12, 0x38); + TEST("LDA", "DE, IX+18", 0xF4, 0x12, 0x39); + TEST("LDA", "HL, IX+18", 0xF4, 0x12, 0x3A); + TEST("LDA", "IX, IX+18", 0xF4, 0x12, 0x3C); + TEST("LDA", "IY, IX+18", 0xF4, 0x12, 0x3D); + TEST("LDA", "SP, IX+18", 0xF4, 0x12, 0x3E); + TEST("LDA", "BC, IY-18", 0xF5, 0xEE, 0x38); + TEST("LDA", "DE, IY-18", 0xF5, 0xEE, 0x39); + TEST("LDA", "HL, IY-18", 0xF5, 0xEE, 0x3A); + TEST("LDA", "IX, IY-18", 0xF5, 0xEE, 0x3C); + TEST("LDA", "IY, IY-18", 0xF5, 0xEE, 0x3D); + TEST("LDA", "SP, IY-18", 0xF5, 0xEE, 0x3E); + TEST("LDA", "BC, SP+18", 0xF6, 0x12, 0x38); + TEST("LDA", "DE, SP+18", 0xF6, 0x12, 0x39); + TEST("LDA", "HL, SP+18", 0xF6, 0x12, 0x3A); + TEST("LDA", "IX, SP+18", 0xF6, 0x12, 0x3C); + TEST("LDA", "IY, SP+18", 0xF6, 0x12, 0x3D); + TEST("LDA", "SP, SP+18", 0xF6, 0x12, 0x3E); // LDA rr, HL+A - TEST("LDA", "BC, (HL+A)", 0xF7, 0x38); - TEST("LDA", "DE, (HL+A)", 0xF7, 0x39); - TEST("LDA", "HL, (HL+A)", 0xF7, 0x3A); - TEST("LDA", "IX, (HL+A)", 0xF7, 0x3C); - TEST("LDA", "IY, (HL+A)", 0xF7, 0x3D); - TEST("LDA", "SP, (HL+A)", 0xF7, 0x3E); - - // LDA rr, (gg) + TEST("LDA", "BC, HL+A", 0xF7, 0x38); + TEST("LDA", "DE, HL+A", 0xF7, 0x39); + TEST("LDA", "HL, HL+A", 0xF7, 0x3A); + TEST("LDA", "IX, HL+A", 0xF7, 0x3C); + TEST("LDA", "IY, HL+A", 0xF7, 0x3D); + TEST("LDA", "SP, HL+A", 0xF7, 0x3E); + + // LDA rr, gg UNKN(0xE8, 0x38); UNKN(0xE9, 0x39); UNKN(0xEA, 0x3A); @@ -1715,53 +1715,53 @@ static void test_jump_call() { ATEST(0x9000, "JRL", "1002H", 0x1B, 0x00, 0x80); ATEST(0x1000, "JRL", "9001H", 0x1B, 0xFF, 0x7F); - TEST("JP", "(1234H)", 0x1A, 0x34, 0x12); - TEST("JP", "(1234H)", 0xEB, 0x34, 0x12, 0xC8); - UNKN( 0xEF, 0x34, 0xC8); - - TEST("JP", "F, (BC)", 0xE8, 0xC0); - TEST("JP", "LT, (DE)", 0xE9, 0xC1); - TEST("JP", "LE, (HL)", 0xEA, 0xC2); - TEST("JP", "ULE, (1234H)", 0xEB, 0x34, 0x12, 0xC3); - TEST("JP", "OV, (IX)", 0xEC, 0xC4); - TEST("JP", "MI, (IY)", 0xED, 0xC5); - TEST("JP", "Z, (SP)", 0xEE, 0xC6); - UNKN( 0xEF, 0x23, 0xC6); // No JP (n) - TEST("JP", "C, (IX+18)", 0xF4, 0x12, 0xC7); - TEST("JP", "(IY+34H)", 0xF5, 0x34, 0xC8); - TEST("JP", "GE, (SP-16)", 0xF6, 0xF0, 0xC9); - TEST("JP", "GT, (HL+A)", 0xF7, 0xCA); - TEST("JP", "UGT, (BC)", 0xE8, 0xCB); - TEST("JP", "NOV, (DE)", 0xE9, 0xCC); - TEST("JP", "PL, (HL)", 0xEA, 0xCD); - TEST("JP", "NZ, (1234H)", 0xEB, 0x34, 0x12, 0xCE); - TEST("JP", "NC, (IX)", 0xEC, 0xCF); + TEST("JP", "1234H", 0x1A, 0x34, 0x12); + TEST("JP", "1234H", 0xEB, 0x34, 0x12, 0xC8); + UNKN( 0xEF, 0x34, 0xC8); + + TEST("JP", "F, BC", 0xE8, 0xC0); + TEST("JP", "LT, DE", 0xE9, 0xC1); + TEST("JP", "LE, HL", 0xEA, 0xC2); + TEST("JP", "ULE, 1234H", 0xEB, 0x34, 0x12, 0xC3); + TEST("JP", "OV, IX", 0xEC, 0xC4); + TEST("JP", "MI, IY", 0xED, 0xC5); + TEST("JP", "Z, SP", 0xEE, 0xC6); + UNKN( 0xEF, 0x23, 0xC6); // No JP (n) + TEST("JP", "C, IX+18", 0xF4, 0x12, 0xC7); + TEST("JP", "IY+34H", 0xF5, 0x34, 0xC8); + TEST("JP", "GE, SP-16", 0xF6, 0xF0, 0xC9); + TEST("JP", "GT, HL+A", 0xF7, 0xCA); + TEST("JP", "UGT, BC", 0xE8, 0xCB); + TEST("JP", "NOV, DE", 0xE9, 0xCC); + TEST("JP", "PL, HL", 0xEA, 0xCD); + TEST("JP", "NZ, 1234H", 0xEB, 0x34, 0x12, 0xCE); + TEST("JP", "NC, IX", 0xEC, 0xCF); ATEST(0x1000, "CALR", "1003H", 0x1D, 0x01, 0x00); ATEST(0x1000, "CALR", "1000H", 0x1D, 0xFE, 0xFF); ATEST(0x9000, "CALR", "1002H", 0x1D, 0x00, 0x80); ATEST(0x1000, "CALR", "9001H", 0x1D, 0xFF, 0x7F); - TEST("CALL", "(1234H)", 0x1C, 0x34, 0x12); - TEST("CALL", "(1234H)", 0xEB, 0x34, 0x12, 0xD8); - - TEST("CALL", "F, (BC)", 0xE8, 0xD0); - TEST("CALL", "LT, (DE)", 0xE9, 0xD1); - TEST("CALL", "LE, (HL)", 0xEA, 0xD2); - TEST("CALL", "ULE, (1234H)", 0xEB, 0x34, 0x12, 0xD3); - TEST("CALL", "OV, (IX)", 0xEC, 0xD4); - TEST("CALL", "MI, (IY)", 0xED, 0xD5); - TEST("CALL", "Z, (SP)", 0xEE, 0xD6); - UNKN( 0xEF, 0x23, 0xD6); // No CALL (n) - TEST("CALL", "C, (IX+18)", 0xF4, 0x12, 0xD7); - TEST("CALL", "(IY+34H)", 0xF5, 0x34, 0xD8); - TEST("CALL", "GE, (SP-16)", 0xF6, 0xF0, 0xD9); - TEST("CALL", "GT, (HL+A)", 0xF7, 0xDA); - TEST("CALL", "UGT, (BC)", 0xE8, 0xDB); - TEST("CALL", "NOV, (DE)", 0xE9, 0xDC); - TEST("CALL", "PL, (HL)", 0xEA, 0xDD); - TEST("CALL", "NZ, (1234H)", 0xEB, 0x34, 0x12, 0xDE); - TEST("CALL", "NC, (IX)", 0xEC, 0xDF); + TEST("CALL", "1234H", 0x1C, 0x34, 0x12); + TEST("CALL", "1234H", 0xEB, 0x34, 0x12, 0xD8); + + TEST("CALL", "F, BC", 0xE8, 0xD0); + TEST("CALL", "LT, DE", 0xE9, 0xD1); + TEST("CALL", "LE, HL", 0xEA, 0xD2); + TEST("CALL", "ULE, 1234H", 0xEB, 0x34, 0x12, 0xD3); + TEST("CALL", "OV, IX", 0xEC, 0xD4); + TEST("CALL", "MI, IY", 0xED, 0xD5); + TEST("CALL", "Z, SP", 0xEE, 0xD6); + UNKN( 0xEF, 0x23, 0xD6); // No CALL (n) + TEST("CALL", "C, IX+18", 0xF4, 0x12, 0xD7); + TEST("CALL", "IY+34H", 0xF5, 0x34, 0xD8); + TEST("CALL", "GE, SP-16", 0xF6, 0xF0, 0xD9); + TEST("CALL", "GT, HL+A", 0xF7, 0xDA); + TEST("CALL", "UGT, BC", 0xE8, 0xDB); + TEST("CALL", "NOV, DE", 0xE9, 0xDC); + TEST("CALL", "PL, HL", 0xEA, 0xDD); + TEST("CALL", "NZ, 1234H", 0xEB, 0x34, 0x12, 0xDE); + TEST("CALL", "NC, IX", 0xEC, 0xDF); ATEST(0x1000, "DJNZ", "1002H", 0x18, 0x00); ATEST(0x1000, "DJNZ", "1000H", 0x18, 0xFE);