Skip to content

Commit

Permalink
Refactor Table to separate assembler and disassembler
Browse files Browse the repository at this point in the history
  • Loading branch information
tgtakaoka committed Jan 30, 2025
1 parent 1d6b050 commit de53581
Show file tree
Hide file tree
Showing 104 changed files with 1,066 additions and 1,182 deletions.
5 changes: 2 additions & 3 deletions src/asm_cdp1802.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_cdp1802.h"

#include "reg_cdp1802.h"
#include "table_cdp1802.h"
#include "text_common.h"
Expand Down Expand Up @@ -195,8 +194,8 @@ Error AsmCdp1802::encodeImpl(StrScanner &scan, Insn &_insn) const {
scan.skipSpaces();
}

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.op1, insn);

emitOperand(insn, insn.mode1(), insn.op1);
if (insn.mode2() == M_ADDR) {
Expand Down
7 changes: 3 additions & 4 deletions src/asm_f3850.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_f3850.h"

#include "reg_f3850.h"
#include "table_f3850.h"
#include "text_common.h"
Expand Down Expand Up @@ -163,7 +162,7 @@ void AsmF3850::encodeOperand(AsmInsn &insn, const Operand &op, AddrMode mode) co

Error AsmF3850::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
if (TABLE.hasOperand(cpuType(), insn)) {
if (hasOperand(cpuType(), insn)) {
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
Expand All @@ -173,8 +172,8 @@ Error AsmF3850::encodeImpl(StrScanner &scan, Insn &_insn) const {
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.op1, insn);

encodeOperand(insn, insn.op1, insn.mode1());
encodeOperand(insn, insn.op2, insn.mode2());
Expand Down
5 changes: 2 additions & 3 deletions src/asm_i8048.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_i8048.h"

#include "table_i8048.h"
#include "text_common.h"

Expand Down Expand Up @@ -241,8 +240,8 @@ Error AsmI8048::encodeImpl(StrScanner &scan, Insn &_insn) const {
scan.skipSpaces();
}

if (_insn.setErrorIf(insn.dstOp, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.dstOp, insn);

encodeOperand(insn, insn.dst(), insn.dstOp);
encodeOperand(insn, insn.src(), insn.srcOp);
Expand Down
7 changes: 3 additions & 4 deletions src/asm_i8051.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_i8051.h"

#include "table_i8051.h"
#include "text_common.h"

Expand Down Expand Up @@ -245,7 +244,7 @@ void AsmI8051::encodeOperand(AsmInsn &insn, AddrMode mode, const Operand &op) co
case M_NOTAD:
if (op.val.overflow(UINT8_MAX))
insn.setErrorIf(op, mode == M_ADR8 ? OVERFLOW_RANGE : NOT_BIT_ADDRESSABLE);
if (TABLE.invalidDirect(insn.opCode(), op.val.getUnsigned()))
if (invalidDirect(insn.opCode(), op.val.getUnsigned()))
insn.setErrorIf(op, OPERAND_NOT_ALLOWED);
insn.emitOperand8(op.val.getUnsigned());
break;
Expand All @@ -269,8 +268,8 @@ Error AsmI8051::encodeImpl(StrScanner &scan, Insn &_insn) const {
scan.skipSpaces();
}

if (_insn.setErrorIf(insn.dstOp, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.dstOp, insn);

const auto dst = insn.dst();
const auto src = insn.src();
Expand Down
4 changes: 2 additions & 2 deletions src/asm_i8080.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -265,8 +265,8 @@ Error AsmI8080::encodeImpl(StrScanner &scan, Insn &_insn) const {
scan.skipSpaces();
}

if (_insn.setErrorIf(insn.dstOp, TABLE.searchName(cpuType(), insn, _zilogSyntax)))
return _insn.getError();
if (searchName(cpuType(), insn, _zilogSyntax))
return _insn.setError(insn.dstOp, insn);

encodeOperand(insn, insn.dstOp, insn.dst());
encodeOperand(insn, insn.srcOp, insn.src());
Expand Down
10 changes: 5 additions & 5 deletions src/asm_i8086.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ Error AsmI8086::parseStringInst(StrScanner &scan, Operand &op) const {
Insn _insn(0);
AsmInsn insn(_insn);
insn.nameBuffer().text(opr);
if (TABLE.searchName(_cpuSpec, insn))
if (searchName(_cpuSpec, insn))
return UNKNOWN_INSTRUCTION;
if (!insn.stringInst())
return UNKNOWN_INSTRUCTION;
Expand Down Expand Up @@ -435,7 +435,7 @@ uint8_t Operand::encodeR_m() const {
Config::opcode_t AsmI8086::encodeSegmentOverride(RegName seg, RegName base) const {
if (seg == REG_UNDEF)
return 0;
const Config::opcode_t segPrefix = TABLE.segOverridePrefix(seg);
const Config::opcode_t segPrefix = segOverridePrefix(seg);
if (_optimizeSegment) {
if (base == REG_BP || base == REG_SP)
return seg == REG_SS ? 0 : segPrefix;
Expand Down Expand Up @@ -587,7 +587,7 @@ void AsmI8086::emitStringOperand(
if (seg == REG_ES && op.seg != REG_ES)
insn.setErrorIf(op, ILLEGAL_SEGMENT);
if (seg == REG_DS && op.seg != REG_UNDEF && op.seg != REG_DS)
insn.setSegment(TABLE.segOverridePrefix(op.seg));
insn.setSegment(segOverridePrefix(op.seg));
}

void AsmI8086::emitStringInst(AsmInsn &insn, const Operand &dst, const Operand &src) const {
Expand Down Expand Up @@ -759,8 +759,8 @@ Error AsmI8086::encodeImpl(StrScanner &scan, Insn &_insn) const {
scan.skipSpaces();
}

if (_insn.setErrorIf(insn.dstOp, TABLE.searchName(_cpuSpec, insn)))
return _insn.getError();
if (searchName(_cpuSpec, insn))
return _insn.setError(insn.dstOp, insn);
insn.prepairModReg();

if (insn.stringInst()) {
Expand Down
5 changes: 2 additions & 3 deletions src/asm_i8096.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_i8096.h"

#include "reg_i8096.h"
#include "table_i8096.h"
#include "text_common.h"
Expand Down Expand Up @@ -270,8 +269,8 @@ Error AsmI8096::encodeImpl(StrScanner &scan, Insn &_insn) const {
scan.skipSpaces();
}

if (_insn.setErrorIf(insn.dstOp, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.dstOp, insn);

const auto jbx_djnz = insn.src2() == M_REL8 || insn.src1() == M_REL8;
if (!jbx_djnz) {
Expand Down
5 changes: 2 additions & 3 deletions src/asm_ins8060.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_ins8060.h"

#include "table_ins8060.h"
#include "text_common.h"

Expand Down Expand Up @@ -179,8 +178,8 @@ Error AsmIns8060::encodeImpl(StrScanner &scan, Insn &_insn) const {
return _insn.setError(insn.op);
scan.skipSpaces();

if (_insn.setErrorIf(insn.op, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.op, insn);

insn.setErrorIf(insn.op);
switch (insn.addrMode()) {
Expand Down
5 changes: 2 additions & 3 deletions src/asm_ins8070.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_ins8070.h"

#include "table_ins8070.h"
#include "text_common.h"

Expand Down Expand Up @@ -248,8 +247,8 @@ Error AsmIns8070::encodeImpl(StrScanner &scan, Insn &_insn) const {
scan.skipSpaces();
}

if (_insn.setErrorIf(insn.dstOp, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.dstOp, insn);

emitOperand(insn, insn.dst(), insn.dstOp);
emitOperand(insn, insn.src(), insn.srcOp);
Expand Down
7 changes: 3 additions & 4 deletions src/asm_mc6800.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_mc6800.h"

#include "reg_mc6800.h"
#include "table_mc6800.h"
#include "text_common.h"
Expand Down Expand Up @@ -186,7 +185,7 @@ void AsmMc6800::emitOperand(AsmInsn &insn, AddrMode mode, const Operand &op) con

Error AsmMc6800::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
if (TABLE.hasOperand(cpuType(), insn)) {
if (hasOperand(cpuType(), insn)) {
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
Expand All @@ -200,8 +199,8 @@ Error AsmMc6800::encodeImpl(StrScanner &scan, Insn &_insn) const {
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.op1, insn);

emitOperand(insn, insn.mode1(), insn.op1);
emitOperand(insn, insn.mode2(), insn.op2);
Expand Down
6 changes: 3 additions & 3 deletions src/asm_mc68000.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -972,7 +972,7 @@ Error AsmMc68000::encodeImpl(StrScanner &scan, Insn &_insn) const {
if (isize == ISZ_ERROR)
return _insn.setError(scan, ILLEGAL_SIZE);

if (TABLE.hasOperand(_cpuSpec, insn)) {
if (hasOperand(_cpuSpec, insn)) {
if (parseOperand(scan, insn.srcOp) && insn.srcOp.hasError())
return _insn.setError(insn.srcOp);
if (scan.skipSpaces().expect(',')) {
Expand All @@ -986,8 +986,8 @@ Error AsmMc68000::encodeImpl(StrScanner &scan, Insn &_insn) const {
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.srcOp, TABLE.searchName(_cpuSpec, insn)))
return _insn.getError();
if (searchName(_cpuSpec, insn))
return _insn.setError(insn.srcOp, insn);

insn.setErrorIf(insn.srcOp);
insn.setErrorIf(insn.dstOp);
Expand Down
6 changes: 3 additions & 3 deletions src/asm_mc6805.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ void AsmMc6805::emitOperand(AsmInsn &insn, AddrMode mode, const Operand &op) con

Error AsmMc6805::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
if (TABLE.hasOperand(cpuType(), insn)) {
if (hasOperand(cpuType(), insn)) {
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
Expand All @@ -273,8 +273,8 @@ Error AsmMc6805::encodeImpl(StrScanner &scan, Insn &_insn) const {
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.op1, insn);

if (insn.mode1() == M_BNO)
insn.embed((insn.op1.val.getUnsigned() & 7) << 1);
Expand Down
12 changes: 5 additions & 7 deletions src/asm_mc6809.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_mc6809.h"

#include "table_mc6809.h"
#include "text_common.h"

Expand Down Expand Up @@ -182,10 +181,9 @@ void AsmMc6809::encodeIndexed(AsmInsn &insn, const Operand &op) const {
}
spec.size = size;
}
const auto postSpec = TABLE.searchPostSpec(cpuType(), spec);
if (postSpec < 0)
if (searchPostSpec(cpuType(), spec))
insn.setErrorIf(op, UNKNOWN_OPERAND);
uint8_t post = postSpec;
uint8_t post = spec.post;
const auto size = spec.size;
if (size == 5)
post |= disp & 0x1F;
Expand Down Expand Up @@ -587,7 +585,7 @@ Error AsmMc6809::processPseudo(StrScanner &scan, Insn &insn) {

Error AsmMc6809::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
auto error = TABLE.hasName(cpuType(), insn);
auto error = hasName(cpuType(), insn);
if (error)
return _insn.setError(error);

Expand All @@ -601,8 +599,8 @@ Error AsmMc6809::encodeImpl(StrScanner &scan, Insn &_insn) const {
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.op1, insn);

const auto mode1 = insn.mode1();
if (mode1 == M_RTFM) {
Expand Down
6 changes: 3 additions & 3 deletions src/asm_mn1610.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ Error AsmMn1610::processPseudo(StrScanner &scan, Insn &_insn) {

Error AsmMn1610::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
if (TABLE.hasOperand(cpuType(), insn)) {
if (hasOperand(cpuType(), insn)) {
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
Expand All @@ -420,8 +420,8 @@ Error AsmMn1610::encodeImpl(StrScanner &scan, Insn &_insn) const {
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.op1, insn);

encodeOperand(insn, insn.op1, insn.mode1());
encodeOperand(insn, insn.op2, insn.mode2());
Expand Down
5 changes: 2 additions & 3 deletions src/asm_mos6502.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "asm_mos6502.h"

#include "reg_mos6502.h"
#include "table_mos6502.h"
#include "text_mos6502.h"
Expand Down Expand Up @@ -346,7 +345,7 @@ bool maybeStackRelativeIndirect(CpuType cpuType, AddrMode mode3) {
Error AsmMos6502::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
char indirect = 0;
if (TABLE.hasOperand(cpuType(), insn)) {
if (hasOperand(cpuType(), insn)) {
if (parseOperand(scan, insn.op1, indirect) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
Expand All @@ -363,7 +362,7 @@ Error AsmMos6502::encodeImpl(StrScanner &scan, Insn &_insn) const {
}
scan.skipSpaces();

const auto error = TABLE.searchName(cpuType(), insn);
const auto error = searchName(cpuType(), insn);
if (error == OPERAND_NOT_ALLOWED) {
if (hasRegister(insn.op1.mode))
return _insn.setError(insn.op1, REGISTER_NOT_ALLOWED);
Expand Down
4 changes: 2 additions & 2 deletions src/asm_ns32000.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -727,8 +727,8 @@ Error AsmNs32000::encodeImpl(StrScanner &scan, Insn &_insn) const {
scan.skipSpaces();
}

if (_insn.setErrorIf(insn.srcOp, TABLE.searchName(_cpuSpec, insn)))
return _insn.getError();
if (searchName(_cpuSpec, insn))
return _insn.setError(insn.srcOp, insn);

insn.setErrorIf(insn.srcOp);
insn.setErrorIf(insn.dstOp);
Expand Down
6 changes: 3 additions & 3 deletions src/asm_pdp11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ Error AsmPdp11::processPseudo(StrScanner &scan, Insn &_insn) {

Error AsmPdp11::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
const auto error = TABLE.hasName(cpuType(), insn);
const auto error = hasName(cpuType(), insn);
if (_implicitWord && error != OK) {
StrScanner p = _insn.errorAt();
insn.setOK(); // clear UNKNOWN_INSTRUCTION
Expand All @@ -531,8 +531,8 @@ Error AsmPdp11::encodeImpl(StrScanner &scan, Insn &_insn) const {
scan.skipSpaces();
}

if (_insn.setErrorIf(insn.srcOp, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
if (searchName(cpuType(), insn))
return _insn.setError(insn.srcOp, insn);
insn.setErrorIf(insn.srcOp);
insn.setErrorIf(insn.dstOp);
encodeOperand(insn, insn.srcOp, insn.src(), insn.srcPos());
Expand Down
Loading

0 comments on commit de53581

Please sign in to comment.