-/* Mapper table, mnemonic --> opcode */
-static const OPCDesc OPCTable[OPC_COUNT] = {
- { "adc", OPC_ADC, 0, CI_USE_A | CI_CHG_A },
- { "and", OPC_AND, 0, CI_USE_A | CI_CHG_A },
- { "asl", OPC_ASL, 0, CI_USE_A | CI_CHG_A },
- { "bcc", OPC_BCC, 2, CI_BRA },
- { "bcs", OPC_BCS, 2, CI_BRA },
- { "beq", OPC_BEQ, 2, CI_BRA },
- { "bit", OPC_BIT, 0, CI_USE_A },
- { "bmi", OPC_BMI, 2, CI_BRA },
- { "bne", OPC_BNE, 2, CI_BRA },
- { "bpl", OPC_BPL, 2, CI_BRA },
- { "bra", OPC_BRA, 2, CI_BRA },
- { "brk", OPC_BRK, 1, CI_NONE },
- { "bvc", OPC_BVC, 2, CI_BRA },
- { "bvs", OPC_BVS, 2, CI_BRA },
- { "clc", OPC_CLC, 1, CI_CHG_NONE },
- { "cld", OPC_CLD, 1, CI_CHG_NONE },
- { "cli", OPC_CLI, 1, CI_CHG_NONE },
- { "clv", OPC_CLV, 1, CI_CHG_NONE },
- { "cmp", OPC_CMP, 0, CI_USE_A },
- { "cpx", OPC_CPX, 0, CI_USE_X },
- { "cpy", OPC_CPY, 0, CI_USE_Y },
- { "dea", OPC_DEA, 1, CI_USE_A | CI_CHG_A },
- { "dec", OPC_DEC, 0, CI_NONE },
- { "dex", OPC_DEX, 1, CI_USE_X | CI_CHG_X },
- { "dey", OPC_DEY, 1, CI_USE_Y | CI_CHG_Y },
- { "eor", OPC_EOR, 0, CI_USE_A | CI_CHG_A },
- { "ina", OPC_INA, 1, CI_USE_A | CI_CHG_A },
- { "inc", OPC_INC, 0, CI_NONE },
- { "inx", OPC_INX, 1, CI_USE_X | CI_CHG_X },
- { "iny", OPC_INY, 1, CI_USE_Y | CI_CHG_Y },
- { "jcc", OPC_JCC, 5, CI_BRA },
- { "jcs", OPC_JCS, 5, CI_BRA },
- { "jeq", OPC_JEQ, 5, CI_BRA },
- { "jmi", OPC_JMI, 5, CI_BRA },
- { "jmp", OPC_JMP, 3, CI_BRA },
- { "jne", OPC_JNE, 5, CI_BRA },
- { "jpl", OPC_JPL, 5, CI_BRA },
- { "jsr", OPC_JSR, 3, CI_BRA },
- { "jvc", OPC_JVC, 5, CI_BRA },
- { "jvs", OPC_JVS, 5, CI_BRA },
- { "lda", OPC_LDA, 0, CI_CHG_A },
- { "ldx", OPC_LDX, 0, CI_CHG_X },
- { "ldy", OPC_LDY, 0, CI_CHG_Y },
- { "lsr", OPC_LSR, 0, CI_USE_A | CI_CHG_A },
- { "nop", OPC_NOP, 1, CI_NONE },
- { "ora", OPC_ORA, 0, CI_USE_A | CI_CHG_A },
- { "pha", OPC_PHA, 1, CI_USE_A },
- { "php", OPC_PHP, 1, CI_NONE },
- { "phx", OPC_PHX, 1, CI_USE_X },
- { "phy", OPC_PHY, 1, CI_USE_Y },
- { "pla", OPC_PLA, 1, CI_CHG_A },
- { "plp", OPC_PLP, 1, CI_NONE },
- { "plx", OPC_PLX, 1, CI_CHG_X },
- { "ply", OPC_PLY, 1, CI_CHG_Y },
- { "rol", OPC_ROL, 0, CI_USE_A | CI_CHG_A },
- { "ror", OPC_ROR, 0, CI_USE_A | CI_CHG_A },
- { "rti", OPC_RTI, 1, CI_NONE },
- { "rts", OPC_RTS, 1, CI_NONE },
- { "sbc", OPC_SBC, 0, CI_USE_A | CI_CHG_A },
- { "sec", OPC_SEC, 1, CI_NONE },
- { "sed", OPC_SED, 1, CI_NONE },
- { "sei", OPC_SEI, 1, CI_NONE },
- { "sta", OPC_STA, 0, CI_USE_A },
- { "stx", OPC_STX, 0, CI_USE_X },
- { "sty", OPC_STY, 0, CI_USE_Y },
- { "tax", OPC_TAX, 1, CI_USE_A | CI_CHG_X },
- { "tay", OPC_TAY, 1, CI_USE_A | CI_CHG_Y },
- { "trb", OPC_TRB, 0, CI_USE_A },
- { "tsb", OPC_TSB, 0, CI_USE_A },
- { "tsx", OPC_TSX, 1, CI_CHG_X },
- { "txa", OPC_TXA, 1, CI_USE_X | CI_CHG_A },
- { "txs", OPC_TXS, 1, CI_USE_X },
- { "tya", OPC_TYA, 1, CI_USE_Y | CI_CHG_A }
+/* Opcode description table */
+const OPCDesc OPCTable[OP65_COUNT] = {
+
+ /* 65XX opcodes */
+ { OP65_ADC, /* opcode */
+ "adc", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_A, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_AND, /* opcode */
+ "and", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_A, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_ASL, /* opcode */
+ "asl", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_SETF | OF_NOIMP /* flags */
+ },
+ { OP65_BCC, /* opcode */
+ "bcc", /* mnemonic */
+ 2, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA /* flags */
+ },
+ { OP65_BCS, /* opcode */
+ "bcs", /* mnemonic */
+ 2, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA /* flags */
+ },
+ { OP65_BEQ, /* opcode */
+ "beq", /* mnemonic */
+ 2, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_ZBRA | OF_FBRA /* flags */
+ },
+ { OP65_BIT, /* opcode */
+ "bit", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_NONE, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_BMI, /* opcode */
+ "bmi", /* mnemonic */
+ 2, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_FBRA /* flags */
+ },
+ { OP65_BNE, /* opcode */
+ "bne", /* mnemonic */
+ 2, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_ZBRA | OF_FBRA /* flags */
+ },
+ { OP65_BPL, /* opcode */
+ "bpl", /* mnemonic */
+ 2, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_FBRA /* flags */
+ },
+ { OP65_BRA, /* opcode */
+ "bra", /* mnemonic */
+ 2, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_UBRA /* flags */
+ },
+ { OP65_BRK, /* opcode */
+ "brk", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_BVC, /* opcode */
+ "bvc", /* mnemonic */
+ 2, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA /* flags */
+ },
+ { OP65_BVS, /* opcode */
+ "bvs", /* mnemonic */
+ 2, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA /* flags */
+ },
+ { OP65_CLC, /* opcode */
+ "clc", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_CLD, /* opcode */
+ "cld", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_CLI, /* opcode */
+ "cli", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_CLV, /* opcode */
+ "clv", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_CMP, /* opcode */
+ "cmp", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_NONE, /* chg */
+ OF_SETF | OF_CMP /* flags */
+ },
+ { OP65_CPX, /* opcode */
+ "cpx", /* mnemonic */
+ 0, /* size */
+ REG_X, /* use */
+ REG_NONE, /* chg */
+ OF_SETF | OF_CMP /* flags */
+ },
+ { OP65_CPY, /* opcode */
+ "cpy", /* mnemonic */
+ 0, /* size */
+ REG_Y, /* use */
+ REG_NONE, /* chg */
+ OF_SETF | OF_CMP /* flags */
+ },
+ { OP65_DEA, /* opcode */
+ "dea", /* mnemonic */
+ 1, /* size */
+ REG_A, /* use */
+ REG_A, /* chg */
+ OF_REG_INCDEC | OF_SETF /* flags */
+ },
+ { OP65_DEC, /* opcode */
+ "dec", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_SETF | OF_NOIMP /* flags */
+ },
+ { OP65_DEX, /* opcode */
+ "dex", /* mnemonic */
+ 1, /* size */
+ REG_X, /* use */
+ REG_X, /* chg */
+ OF_REG_INCDEC | OF_SETF /* flags */
+ },
+ { OP65_DEY, /* opcode */
+ "dey", /* mnemonic */
+ 1, /* size */
+ REG_Y, /* use */
+ REG_Y, /* chg */
+ OF_REG_INCDEC | OF_SETF /* flags */
+ },
+ { OP65_EOR, /* opcode */
+ "eor", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_A, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_INA, /* opcode */
+ "ina", /* mnemonic */
+ 1, /* size */
+ REG_A, /* use */
+ REG_A, /* chg */
+ OF_REG_INCDEC | OF_SETF /* flags */
+ },
+ { OP65_INC, /* opcode */
+ "inc", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_SETF | OF_NOIMP /* flags */
+ },
+ { OP65_INX, /* opcode */
+ "inx", /* mnemonic */
+ 1, /* size */
+ REG_X, /* use */
+ REG_X, /* chg */
+ OF_REG_INCDEC | OF_SETF /* flags */
+ },
+ { OP65_INY, /* opcode */
+ "iny", /* mnemonic */
+ 1, /* size */
+ REG_Y, /* use */
+ REG_Y, /* chg */
+ OF_REG_INCDEC | OF_SETF /* flags */
+ },
+ { OP65_JCC, /* opcode */
+ "jcc", /* mnemonic */
+ 5, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_LBRA /* flags */
+ },
+ { OP65_JCS, /* opcode */
+ "jcs", /* mnemonic */
+ 5, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_LBRA /* flags */
+ },
+ { OP65_JEQ, /* opcode */
+ "jeq", /* mnemonic */
+ 5, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_LBRA | OF_ZBRA | OF_FBRA /* flags */
+ },
+ { OP65_JMI, /* opcode */
+ "jmi", /* mnemonic */
+ 5, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_LBRA | OF_FBRA /* flags */
+ },
+ { OP65_JMP, /* opcode */
+ "jmp", /* mnemonic */
+ 3, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_UBRA | OF_LBRA /* flags */
+ },
+ { OP65_JNE, /* opcode */
+ "jne", /* mnemonic */
+ 5, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_LBRA | OF_ZBRA | OF_FBRA /* flags */
+ },
+ { OP65_JPL, /* opcode */
+ "jpl", /* mnemonic */
+ 5, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_LBRA | OF_FBRA /* flags */
+ },
+ { OP65_JSR, /* opcode */
+ "jsr", /* mnemonic */
+ 3, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CALL /* flags */
+ },
+ { OP65_JVC, /* opcode */
+ "jvc", /* mnemonic */
+ 5, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_LBRA /* flags */
+ },
+ { OP65_JVS, /* opcode */
+ "jvs", /* mnemonic */
+ 5, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_CBRA | OF_LBRA /* flags */
+ },
+ { OP65_LDA, /* opcode */
+ "lda", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_A, /* chg */
+ OF_LOAD | OF_SETF /* flags */
+ },
+ { OP65_LDX, /* opcode */
+ "ldx", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_X, /* chg */
+ OF_LOAD | OF_SETF /* flags */
+ },
+ { OP65_LDY, /* opcode */
+ "ldy", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_Y, /* chg */
+ OF_LOAD | OF_SETF /* flags */
+ },
+ { OP65_LSR, /* opcode */
+ "lsr", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_SETF | OF_NOIMP /* flags */
+ },
+ { OP65_NOP, /* opcode */
+ "nop", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_ORA, /* opcode */
+ "ora", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_A, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_PHA, /* opcode */
+ "pha", /* mnemonic */
+ 1, /* size */
+ REG_A, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_PHP, /* opcode */
+ "php", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_PHX, /* opcode */
+ "phx", /* mnemonic */
+ 1, /* size */
+ REG_X, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_PHY, /* opcode */
+ "phy", /* mnemonic */
+ 1, /* size */
+ REG_Y, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_PLA, /* opcode */
+ "pla", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_A, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_PLP, /* opcode */
+ "plp", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_PLX, /* opcode */
+ "plx", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_X, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_PLY, /* opcode */
+ "ply", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_Y, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_ROL, /* opcode */
+ "rol", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_SETF | OF_NOIMP /* flags */
+ },
+ { OP65_ROR, /* opcode */
+ "ror", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_SETF | OF_NOIMP /* flags */
+ },
+ /* Mark RTI as "uses all registers but doesn't change them", so the
+ * optimizer won't remove preceeding loads.
+ */
+ { OP65_RTI, /* opcode */
+ "rti", /* mnemonic */
+ 1, /* size */
+ REG_AXY, /* use */
+ REG_NONE, /* chg */
+ OF_RET /* flags */
+ },
+ { OP65_RTS, /* opcode */
+ "rts", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_RET /* flags */
+ },
+ { OP65_SBC, /* opcode */
+ "sbc", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_A, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_SEC, /* opcode */
+ "sec", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_SED, /* opcode */
+ "sed", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_SEI, /* opcode */
+ "sei", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_NONE /* flags */
+ },
+ { OP65_STA, /* opcode */
+ "sta", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_NONE, /* chg */
+ OF_STORE /* flags */
+ },
+ { OP65_STX, /* opcode */
+ "stx", /* mnemonic */
+ 0, /* size */
+ REG_X, /* use */
+ REG_NONE, /* chg */
+ OF_STORE /* flags */
+ },
+ { OP65_STY, /* opcode */
+ "sty", /* mnemonic */
+ 0, /* size */
+ REG_Y, /* use */
+ REG_NONE, /* chg */
+ OF_STORE /* flags */
+ },
+ { OP65_STZ, /* opcode */
+ "stz", /* mnemonic */
+ 0, /* size */
+ REG_NONE, /* use */
+ REG_NONE, /* chg */
+ OF_STORE /* flags */
+ },
+ { OP65_TAX, /* opcode */
+ "tax", /* mnemonic */
+ 1, /* size */
+ REG_A, /* use */
+ REG_X, /* chg */
+ OF_XFR | OF_SETF /* flags */
+ },
+ { OP65_TAY, /* opcode */
+ "tay", /* mnemonic */
+ 1, /* size */
+ REG_A, /* use */
+ REG_Y, /* chg */
+ OF_XFR | OF_SETF /* flags */
+ },
+ { OP65_TRB, /* opcode */
+ "trb", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_NONE, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_TSB, /* opcode */
+ "tsb", /* mnemonic */
+ 0, /* size */
+ REG_A, /* use */
+ REG_NONE, /* chg */
+ OF_SETF /* flags */
+ },
+ { OP65_TSX, /* opcode */
+ "tsx", /* mnemonic */
+ 1, /* size */
+ REG_NONE, /* use */
+ REG_X, /* chg */
+ OF_XFR | OF_SETF /* flags */
+ },
+ { OP65_TXA, /* opcode */
+ "txa", /* mnemonic */
+ 1, /* size */
+ REG_X, /* use */
+ REG_A, /* chg */
+ OF_XFR | OF_SETF /* flags */
+ },
+ { OP65_TXS, /* opcode */
+ "txs", /* mnemonic */
+ 1, /* size */
+ REG_X, /* use */
+ REG_NONE, /* chg */
+ OF_XFR /* flags */
+ },
+ { OP65_TYA, /* opcode */
+ "tya", /* mnemonic */
+ 1, /* size */
+ REG_Y, /* use */
+ REG_A, /* chg */
+ OF_XFR | OF_SETF /* flags */
+ },