/* */
/* */
/* */
-/* (C) 2001 Ullrich von Bassewitz */
-/* Wacholderweg 14 */
-/* D-70597 Stuttgart */
-/* EMail: uz@cc65.org */
+/* (C) 2001-2006, Ullrich von Bassewitz */
+/* Römerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
+/* common */
+#include "chartype.h"
+
/* cc65 */
#include "codeent.h"
#include "codeinfo.h"
/* Check for the sequence */
if (E->OPC == OP65_LDA &&
+ !CS_RangeHasLabel (S, I+1, 5) &&
CS_GetEntries (S, L, I+1, 5) &&
L[0]->OPC == OP65_SEC &&
- !CE_HasLabel (L[0]) &&
L[1]->OPC == OP65_STA &&
strcmp (L[1]->Arg, "tmp1") == 0 &&
- !CE_HasLabel (L[1]) &&
L[2]->OPC == OP65_LDA &&
- !CE_HasLabel (L[2]) &&
L[3]->OPC == OP65_SBC &&
strcmp (L[3]->Arg, "tmp1") == 0 &&
- !CE_HasLabel (L[3]) &&
L[4]->OPC == OP65_STA &&
- strcmp (L[4]->Arg, L[2]->Arg) == 0 &&
- !CE_HasLabel (L[4])) {
+ strcmp (L[4]->Arg, L[2]->Arg) == 0) {
/* Remove the store to tmp1 */
CS_DelEntry (S, I+2);
+unsigned OptSub3 (CodeSeg* S)
+/* Search for a call to decaxn and replace it by an 8 bit sub if the X register
+ * is not used later.
+ */
+{
+ unsigned Changes = 0;
+
+ /* Walk over the entries */
+ unsigned I = 0;
+ while (I < CS_GetEntryCount (S)) {
+
+ CodeEntry* E;
+
+ /* Get next entry */
+ E = CS_GetEntry (S, I);
+
+ /* Check for the sequence */
+ if (E->OPC == OP65_JSR &&
+ strncmp (E->Arg, "decax", 5) == 0 &&
+ IsDigit (E->Arg[5]) &&
+ E->Arg[6] == '\0' &&
+ !RegXUsed (S, I+1)) {
+
+ CodeEntry* X;
+ const char* Arg;
+
+ /* Insert new code behind the sequence */
+ X = NewCodeEntry (OP65_SEC, AM65_IMP, 0, 0, E->LI);
+ CS_InsertEntry (S, X, I+1);
+
+ Arg = MakeHexArg (E->Arg[5] - '0');
+ X = NewCodeEntry (OP65_SBC, AM65_IMM, Arg, 0, E->LI);
+ CS_InsertEntry (S, X, I+2);
+
+ /* Delete the old code */
+ CS_DelEntry (S, I);
+
+ /* Remember, we had changes */
+ ++Changes;
+
+ }
+
+ /* Next entry */
+ ++I;
+
+ }
+
+ /* Return the number of changes made */
+ return Changes;
+}
+
+