+/* Search for the sequence:
+ *
+ * lda regbank+n
+ * ldx regbank+n+1
+ * sta regsave
+ * stx regsave+1
+ * clc
+ * adc #$01
+ * bcc L0005
+ * inx
+ * L: sta regbank+n
+ * stx regbank+n+1
+ * lda regsave
+ * ldx regsave+1
+ * ldy #$00
+ * jsr ldauidx
+ *
+ * and replace it by:
+ *
+ * ldy #$00
+ * ldx #$00
+ * lda (regbank+n),y
+ * inc regbank+n
+ * bne L1
+ * inc regbank+n+1
+ * L1: tay <- only if flags are used
+ *
+ * This function must execute before OptPtrLoad5!
+ *
+ */
+{
+ unsigned Changes = 0;
+
+ /* Walk over the entries */
+ unsigned I = 0;
+ while (I < CS_GetEntryCount (S)) {
+
+ CodeEntry* L[15];
+ unsigned Len;
+
+ /* Get next entry */
+ L[0] = CS_GetEntry (S, I);
+
+ /* Check for the sequence */
+ if (L[0]->OPC == OP65_LDA &&
+ L[0]->AM == AM65_ZP &&
+ strncmp (L[0]->Arg, "regbank+", 8) == 0 &&
+ (Len = strlen (L[0]->Arg)) > 0 &&
+ CS_GetEntries (S, L+1, I+1, 14) &&
+ !CS_RangeHasLabel (S, I+1, 7) &&
+ !CS_RangeHasLabel (S, I+9, 5) &&
+ L[1]->OPC == OP65_LDX &&
+ L[1]->AM == AM65_ZP &&
+ strncmp (L[1]->Arg, L[0]->Arg, Len) == 0 &&
+ strcmp (L[1]->Arg+Len, "+1") == 0 &&
+ L[2]->OPC == OP65_STA &&
+ L[2]->AM == AM65_ZP &&
+ strcmp (L[2]->Arg, "regsave") == 0 &&
+ L[3]->OPC == OP65_STX &&
+ L[3]->AM == AM65_ZP &&
+ strcmp (L[3]->Arg, "regsave+1") == 0 &&
+ L[4]->OPC == OP65_CLC &&
+ L[5]->OPC == OP65_ADC &&
+ CE_KnownImm (L[5]) &&
+ L[5]->Num == 1 &&
+ L[6]->OPC == OP65_BCC &&
+ L[6]->JumpTo != 0 &&
+ L[6]->JumpTo->Owner == L[8] &&
+ L[7]->OPC == OP65_INX &&
+ L[8]->OPC == OP65_STA &&
+ L[8]->AM == AM65_ZP &&
+ strcmp (L[8]->Arg, L[0]->Arg) == 0 &&
+ L[9]->OPC == OP65_STX &&
+ L[9]->AM == AM65_ZP &&
+ strcmp (L[9]->Arg, L[1]->Arg) == 0 &&
+ L[10]->OPC == OP65_LDA &&
+ L[10]->AM == AM65_ZP &&
+ strcmp (L[10]->Arg, "regsave") == 0 &&
+ L[11]->OPC == OP65_LDX &&
+ L[11]->AM == AM65_ZP &&
+ strcmp (L[11]->Arg, "regsave+1") == 0 &&
+ L[12]->OPC == OP65_LDY &&
+ CE_KnownImm (L[12]) &&
+ CE_IsCallTo (L[13], "ldauidx")) {
+
+ CodeEntry* X;
+ CodeLabel* Label;
+
+ /* Check if the instruction following the sequence uses the flags
+ * set by the load. If so, insert a test of the value in the
+ * accumulator.
+ */
+ if (CE_UseLoadFlags (L[14])) {
+ X = NewCodeEntry (OP65_TAY, AM65_IMP, 0, 0, L[13]->LI);
+ CS_InsertEntry (S, X, I+14);
+ }
+
+ /* Attach a label to L[14]. This may be either the just inserted
+ * instruction, or the one following the sequence.
+ */
+ Label = CS_GenLabel (S, L[14]);
+
+ /* ldy #$xx */
+ X = NewCodeEntry (OP65_LDY, AM65_IMM, L[12]->Arg, 0, L[12]->LI);
+ CS_InsertEntry (S, X, I+14);
+
+ /* ldx #$xx */
+ X = NewCodeEntry (OP65_LDX, AM65_IMM, "$00", 0, L[13]->LI);
+ CS_InsertEntry (S, X, I+15);
+
+ /* lda (regbank+n),y */
+ X = NewCodeEntry (OP65_LDA, AM65_ZP_INDY, L[0]->Arg, 0, L[13]->LI);
+ CS_InsertEntry (S, X, I+16);
+
+ /* inc regbank+n */
+ X = NewCodeEntry (OP65_INC, AM65_ZP, L[0]->Arg, 0, L[5]->LI);
+ CS_InsertEntry (S, X, I+17);
+
+ /* bne ... */
+ X = NewCodeEntry (OP65_BNE, AM65_BRA, Label->Name, Label, L[6]->LI);
+ CS_InsertEntry (S, X, I+18);
+
+ /* inc regbank+n+1 */
+ X = NewCodeEntry (OP65_INC, AM65_ZP, L[1]->Arg, 0, L[7]->LI);
+ CS_InsertEntry (S, X, I+19);
+
+ /* Delete the old code */
+ CS_DelEntries (S, I, 14);
+
+ /* Remember, we had changes */
+ ++Changes;
+
+ }
+
+ /* Next entry */
+ ++I;
+
+ }
+
+ /* Return the number of changes made */
+ return Changes;
+}
+
+
+
+static unsigned OptPtrLoad6 (CodeSeg* S)