X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fopcodes.c;h=2b4354a881b6c7151248d5cf5b7a1c37fbba0137;hb=1b81dcc64fbb66da569ea5f827a6622cdfdbc743;hp=fa8b1d5751233f274676565cfe5dd5f591c512d9;hpb=24403e151e7e58c17703c7b8b54b9040ced1f74b;p=cc65 diff --git a/src/cc65/opcodes.c b/src/cc65/opcodes.c index fa8b1d575..2b4354a88 100644 --- a/src/cc65/opcodes.c +++ b/src/cc65/opcodes.c @@ -6,9 +6,9 @@ /* */ /* */ /* */ -/* (C) 2001 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ +/* (C) 2001-2003 Ullrich von Bassewitz */ +/* Römerstraße 52 */ +/* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ /* */ /* */ @@ -39,10 +39,10 @@ /* common */ #include "check.h" +#include "cpu.h" /* cc65 */ #include "codeinfo.h" -#include "cpu.h" #include "error.h" #include "opcodes.h" @@ -75,8 +75,8 @@ const OPCDesc OPCTable[OPCODE_COUNT] = { { OP65_ASL, /* opcode */ "asl", /* mnemonic */ 0, /* size */ - REG_A, /* use */ - REG_A, /* chg */ + REG_NONE, /* use */ + REG_NONE, /* chg */ OF_SETF /* flags */ }, { OP65_BCC, /* opcode */ @@ -189,21 +189,21 @@ const OPCDesc OPCTable[OPCODE_COUNT] = { 0, /* size */ REG_A, /* use */ REG_NONE, /* chg */ - OF_SETF /* flags */ + OF_SETF | OF_CMP /* flags */ }, { OP65_CPX, /* opcode */ "cpx", /* mnemonic */ 0, /* size */ REG_X, /* use */ REG_NONE, /* chg */ - OF_SETF /* flags */ + OF_SETF | OF_CMP /* flags */ }, { OP65_CPY, /* opcode */ "cpy", /* mnemonic */ 0, /* size */ REG_Y, /* use */ REG_NONE, /* chg */ - OF_SETF /* flags */ + OF_SETF | OF_CMP /* flags */ }, { OP65_DEA, /* opcode */ "dea", /* mnemonic */ @@ -362,8 +362,8 @@ const OPCDesc OPCTable[OPCODE_COUNT] = { { OP65_LSR, /* opcode */ "lsr", /* mnemonic */ 0, /* size */ - REG_A, /* use */ - REG_A, /* chg */ + REG_NONE, /* use */ + REG_NONE, /* chg */ OF_SETF /* flags */ }, { OP65_NOP, /* opcode */ @@ -406,7 +406,7 @@ const OPCDesc OPCTable[OPCODE_COUNT] = { 1, /* size */ REG_Y, /* use */ REG_NONE, /* chg */ - OF_NONE /* flags */ + OF_NONE /* flags */ }, { OP65_PLA, /* opcode */ "pla", /* mnemonic */ @@ -439,21 +439,24 @@ const OPCDesc OPCTable[OPCODE_COUNT] = { { OP65_ROL, /* opcode */ "rol", /* mnemonic */ 0, /* size */ - REG_A, /* use */ - REG_A, /* chg */ - OF_SETF /* flags */ + REG_NONE, /* use */ + REG_NONE, /* chg */ + OF_SETF /* flags */ }, { OP65_ROR, /* opcode */ "ror", /* mnemonic */ 0, /* size */ - REG_A, /* use */ - REG_A, /* chg */ - OF_SETF /* flags */ + REG_NONE, /* use */ + REG_NONE, /* chg */ + OF_SETF /* 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_NONE, /* use */ + REG_AXY, /* use */ REG_NONE, /* chg */ OF_RET /* flags */ }, @@ -513,6 +516,13 @@ const OPCDesc OPCTable[OPCODE_COUNT] = { 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 */ @@ -581,7 +591,7 @@ const OPCDesc OPCTable[OPCODE_COUNT] = { static int FindCmp (const void* Key, const void* Desc) /* Compare function for FindOpcode */ -{ +{ return strcmp (Key, ((OPCDesc*)Desc)->Mnemo); } @@ -675,16 +685,16 @@ opc_t GetInverseBranch (opc_t OPC) case OP65_BMI: return OP65_BPL; case OP65_BNE: return OP65_BEQ; case OP65_BPL: return OP65_BMI; - case OP65_BVC: return OP65_BVS; + case OP65_BVC: return OP65_BVS; case OP65_BVS: return OP65_BVC; - case OP65_JCC: return OP65_JCS; - case OP65_JCS: return OP65_JCC; - case OP65_JEQ: return OP65_JNE; - case OP65_JMI: return OP65_JPL; - case OP65_JNE: return OP65_JEQ; - case OP65_JPL: return OP65_JMI; - case OP65_JVC: return OP65_JVS; - case OP65_JVS: return OP65_JVC; + case OP65_JCC: return OP65_JCS; + case OP65_JCS: return OP65_JCC; + case OP65_JEQ: return OP65_JNE; + case OP65_JMI: return OP65_JPL; + case OP65_JNE: return OP65_JEQ; + case OP65_JPL: return OP65_JMI; + case OP65_JVC: return OP65_JVS; + case OP65_JVS: return OP65_JVC; default: Internal ("GetInverseBranch: Invalid opcode: %d", OPC); return 0; @@ -700,23 +710,23 @@ opc_t MakeShortBranch (opc_t OPC) { switch (OPC) { case OP65_BCC: - case OP65_JCC: return OP65_BCC; + case OP65_JCC: return OP65_BCC; case OP65_BCS: - case OP65_JCS: return OP65_BCS; + case OP65_JCS: return OP65_BCS; case OP65_BEQ: - case OP65_JEQ: return OP65_BEQ; + case OP65_JEQ: return OP65_BEQ; case OP65_BMI: - case OP65_JMI: return OP65_BMI; + case OP65_JMI: return OP65_BMI; case OP65_BNE: - case OP65_JNE: return OP65_BNE; + case OP65_JNE: return OP65_BNE; case OP65_BPL: - case OP65_JPL: return OP65_BPL; + case OP65_JPL: return OP65_BPL; case OP65_BVC: - case OP65_JVC: return OP65_BVC; + case OP65_JVC: return OP65_BVC; case OP65_BVS: - case OP65_JVS: return OP65_BVS; + case OP65_JVS: return OP65_BVS; case OP65_BRA: - case OP65_JMP: return (CPU == CPU_65C02)? OP65_BRA : OP65_JMP; + case OP65_JMP: return (CPUIsets[CPU] & CPU_ISET_65SC02)? OP65_BRA : OP65_JMP; default: Internal ("MakeShortBranch: Invalid opcode: %d", OPC); return 0; @@ -732,23 +742,23 @@ opc_t MakeLongBranch (opc_t OPC) { switch (OPC) { case OP65_BCC: - case OP65_JCC: return OP65_JCC; + case OP65_JCC: return OP65_JCC; case OP65_BCS: - case OP65_JCS: return OP65_JCS; + case OP65_JCS: return OP65_JCS; case OP65_BEQ: - case OP65_JEQ: return OP65_JEQ; + case OP65_JEQ: return OP65_JEQ; case OP65_BMI: - case OP65_JMI: return OP65_JMI; + case OP65_JMI: return OP65_JMI; case OP65_BNE: - case OP65_JNE: return OP65_JNE; + case OP65_JNE: return OP65_JNE; case OP65_BPL: - case OP65_JPL: return OP65_JPL; + case OP65_JPL: return OP65_JPL; case OP65_BVC: - case OP65_JVC: return OP65_JVC; + case OP65_JVC: return OP65_JVC; case OP65_BVS: - case OP65_JVS: return OP65_JVS; + case OP65_JVS: return OP65_JVS; case OP65_BRA: - case OP65_JMP: return OP65_JMP; + case OP65_JMP: return OP65_JMP; default: Internal ("MakeLongBranch: Invalid opcode: %d", OPC); return 0; @@ -761,22 +771,22 @@ bc_t GetBranchCond (opc_t OPC) /* Get the condition for the conditional branch in OPC */ { switch (OPC) { - case OP65_BCC: return BC_CC; - case OP65_BCS: return BC_CS; - case OP65_BEQ: return BC_EQ; - case OP65_BMI: return BC_MI; - case OP65_BNE: return BC_NE; - case OP65_BPL: return BC_PL; - case OP65_BVC: return BC_VC; - case OP65_BVS: return BC_VS; - case OP65_JCC: return BC_CC; - case OP65_JCS: return BC_CS; - case OP65_JEQ: return BC_EQ; - case OP65_JMI: return BC_MI; - case OP65_JNE: return BC_NE; - case OP65_JPL: return BC_PL; - case OP65_JVC: return BC_VC; - case OP65_JVS: return BC_VS; + case OP65_BCC: return BC_CC; + case OP65_BCS: return BC_CS; + case OP65_BEQ: return BC_EQ; + case OP65_BMI: return BC_MI; + case OP65_BNE: return BC_NE; + case OP65_BPL: return BC_PL; + case OP65_BVC: return BC_VC; + case OP65_BVS: return BC_VS; + case OP65_JCC: return BC_CC; + case OP65_JCS: return BC_CS; + case OP65_JEQ: return BC_EQ; + case OP65_JMI: return BC_MI; + case OP65_JNE: return BC_NE; + case OP65_JPL: return BC_PL; + case OP65_JVC: return BC_VC; + case OP65_JVS: return BC_VS; default: Internal ("GetBranchCond: Invalid opcode: %d", OPC); return 0; @@ -805,3 +815,4 @@ bc_t GetInverseCond (bc_t BC) +