#include <stdlib.h>
+/* common */
+#include "cpu.h"
+
/* cc65 */
#include "codeent.h"
#include "codeinfo.h"
-#include "cpu.h"
#include "coptsize.h"
{ "pushax", -1, 0, -1, "pusha0" },
{ "pushax", -1, 0xFF, -1, "pushaFF" },
{ "pushaysp", -1, -1, 0, "pusha0sp" },
+ { "pushwidx", -1, -1, 1, "pushw" },
+ { "pushwysp", -1, -1, 3, "pushw0sp" },
{ "staxysp", -1, -1, 0, "stax0sp" },
{ "tosaddax", -1, 0, -1, "tosadda0" },
{ "tosandax", -1, 0, -1, "tosanda0" },
{ "tosumodax", -1, 0, -1, "tosumoda0" },
{ "tosumulax", -1, 0, -1, "tosumula0" },
{ "tosxorax", -1, 0, -1, "tosxora0" },
- { "zzzzzzzz", -1, -1, -1, "zzzzzzzz" },
#if 0
"tosadd0ax", /* tosaddeax, sreg = 0 */
{
/* Do a binary search */
int First = 0;
- int Last = (sizeof(CallTable) / sizeof(CallTable[0])) - 1;
- int Current;
- int Result;
+ int Last = CALL_COUNT - 1;
int Found = 0;
while (First <= Last) {
/* Set current to mid of range */
- Current = (Last + First) / 2;
+ int Current = (Last + First) / 2;
/* Do a compare */
- Result = strcmp (CallTable[Current].LongFunc, Name);
+ int Result = strcmp (CallTable[Current].LongFunc, Name);
if (Result < 0) {
First = Current + 1;
} else {
Found = 1;
}
}
-
}
/* Return the first entry if found, or NULL otherwise */
I = 0;
while (I < CS_GetEntryCount (S)) {
+ const CallDesc* D;
+
/* Get next entry */
E = CS_GetEntry (S, I);
/* Check if it's a subroutine call */
- if (E->OPC == OP65_JSR) {
+ if (E->OPC == OP65_JSR && (D = FindCall (E->Arg)) != 0) {
/* Check for any of the known functions. */
- const CallDesc* D = FindCall (E->Arg);
- while (D && strcmp (D->LongFunc, E->Arg) == 0) {
+ while (1) {
+
/* Check the registers */
if ((D->A < 0 || D->A == E->RI->In.RegA) &&
(D->X < 0 || D->X == E->RI->In.RegX) &&
(D->Y < 0 || D->Y == E->RI->In.RegY)) {
+
/* Ok, match for all registers */
CodeEntry* X;
X = NewCodeEntry (E->OPC, E->AM, D->ShortFunc, 0, E->LI);
/* Remember that we had changes */
++Changes;
+
+ /* Done */
+ break;
+ }
+
+ /* Next table entry, bail out if next entry not valid */
+ if (++D >= CallTable + CALL_COUNT ||
+ strcmp (D->LongFunc, E->Arg) != 0) {
+ /* End of table or entries reached */
+ break;
}
- ++D;
}
}
I = 0;
while (I < CS_GetEntryCount (S)) {
-
/* Get next entry */
CodeEntry* E = CS_GetEntry (S, I);
+ /* Get the input registers */
+ const RegContents* In = &E->RI->In;
+
/* Assume we have no replacement */
CodeEntry* X = 0;
case OP65_LDA:
if (CE_KnownImm (E)) {
short Val = (short) E->Num;
- if (Val == E->RI->In.RegX) {
+ if (Val == In->RegX) {
X = NewCodeEntry (OP65_TXA, AM65_IMP, 0, 0, E->LI);
- } else if (Val == E->RI->In.RegY) {
+ } else if (Val == In->RegY) {
X = NewCodeEntry (OP65_TYA, AM65_IMP, 0, 0, E->LI);
- } else if (E->RI->In.RegA >= 0 && CPU >= CPU_65C02) {
- if (Val == ((E->RI->In.RegA - 1) & 0xFF)) {
+ } else if (RegValIsKnown (In->RegA) && CPU >= CPU_65C02) {
+ if (Val == ((In->RegA - 1) & 0xFF)) {
X = NewCodeEntry (OP65_DEA, AM65_IMP, 0, 0, E->LI);
- } else if (Val == ((E->RI->In.RegA + 1) & 0xFF)) {
+ } else if (Val == ((In->RegA + 1) & 0xFF)) {
X = NewCodeEntry (OP65_INA, AM65_IMP, 0, 0, E->LI);
}
}
case OP65_LDX:
if (CE_KnownImm (E)) {
short Val = (short) E->Num;
- if (E->RI->In.RegX >= 0 && Val == ((E->RI->In.RegX - 1) & 0xFF)) {
+ if (RegValIsKnown (In->RegX) && Val == ((In->RegX - 1) & 0xFF)) {
X = NewCodeEntry (OP65_DEX, AM65_IMP, 0, 0, E->LI);
- } else if (E->RI->In.RegX >= 0 && Val == ((E->RI->In.RegX + 1) & 0xFF)) {
+ } else if (RegValIsKnown (In->RegX) && Val == ((In->RegX + 1) & 0xFF)) {
X = NewCodeEntry (OP65_INX, AM65_IMP, 0, 0, E->LI);
- } else if (Val == E->RI->In.RegA) {
+ } else if (Val == In->RegA) {
X = NewCodeEntry (OP65_TAX, AM65_IMP, 0, 0, E->LI);
}
}
case OP65_LDY:
if (CE_KnownImm (E)) {
short Val = (short) E->Num;
- if (E->RI->In.RegY >= 0 && Val == ((E->RI->In.RegY - 1) & 0xFF)) {
+ if (RegValIsKnown (In->RegY) && Val == ((In->RegY - 1) & 0xFF)) {
X = NewCodeEntry (OP65_DEY, AM65_IMP, 0, 0, E->LI);
- } else if (E->RI->In.RegY >= 0 && Val == ((E->RI->In.RegY + 1) & 0xFF)) {
+ } else if (RegValIsKnown (In->RegY) && Val == ((In->RegY + 1) & 0xFF)) {
X = NewCodeEntry (OP65_INY, AM65_IMP, 0, 0, E->LI);
- } else if (Val == E->RI->In.RegA) {
+ } else if (Val == In->RegA) {
X = NewCodeEntry (OP65_TAY, AM65_IMP, 0, 0, E->LI);
}
}