Hopefully a script to regenerate the *.hxx files for m6502
authorNick Downing <nick.downing@lifx.co>
Sun, 30 Jun 2019 00:35:22 +0000 (10:35 +1000)
committerNick Downing <nick.downing@lifx.co>
Sun, 30 Jun 2019 00:35:22 +0000 (10:35 +1000)
m6502/m6502.hxx [new file with mode: 0644]
m6502/m6502d.hxx [new file with mode: 0644]
m6502/m65c02.hxx [new file with mode: 0644]
m6502/m65c02d.hxx [new file with mode: 0644]
m6502/n.sh [new file with mode: 0755]

diff --git a/m6502/m6502.hxx b/m6502/m6502.hxx
new file mode 100644 (file)
index 0000000..267bec1
--- /dev/null
@@ -0,0 +1,15043 @@
+void m6502_device::adc_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::adc_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::adc_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::adc_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::adc_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::adc_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::adc_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_adc(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::adc_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_adc(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::adc_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_adc(read(TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::adc_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_adc(read(TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::adc_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::adc_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::adc_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::adc_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::adc_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::adc_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_adc(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::and_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::and_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::and_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::and_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::and_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::and_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::and_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       A &= read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::and_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       A &= read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::and_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::and_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::and_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A &= read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::and_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A &= read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::and_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::and_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::and_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A &= read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::and_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A &= read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::asl_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::asl_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::asl_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::asl_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::asl_acc_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       A = do_asl(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::asl_acc_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       A = do_asl(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::asl_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::asl_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::asl_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::asl_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::bcc_rel_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(!(P & F_C)) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::bcc_rel_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(!(P & F_C)) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::bcs_rel_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(P & F_C) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::bcs_rel_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(P & F_C) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::beq_rel_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(P & F_Z) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::beq_rel_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(P & F_Z) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::bit_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       do_bit(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::bit_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       do_bit(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::bit_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       do_bit(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::bit_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       do_bit(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::bmi_rel_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(P & F_N) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::bmi_rel_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(P & F_N) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::bne_rel_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(!(P & F_Z)) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::bne_rel_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(!(P & F_Z)) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::bpl_rel_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(!(P & F_N)) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::bpl_rel_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(!(P & F_N)) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::brk_imp_full()
+{
+
+       // The 6502 bug when a nmi occurs in a brk is reproduced (case !irq_taken && nmi_state)
+
+       if(irq_taken) {
+
+       if(icount == 0) { inst_substate = 1; return; }
+               read_pc_noinc();
+       icount--;
+
+       } else {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc();
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(SP, PC >> 8);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(SP, PC);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(SP, irq_taken ? P & ~F_B : P);
+       icount--;
+
+       dec_SP();
+
+       if(nmi_state) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+               PC = read_arg(0xfffa);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+               PC = set_h(PC, read_arg(0xfffb));
+       icount--;
+
+               nmi_state = false;
+
+               standard_irq_callback(NMI_LINE);
+
+       } else {
+
+       if(icount == 0) { inst_substate = 8; return; }
+               PC = read_arg(0xfffe);
+       icount--;
+
+       if(icount == 0) { inst_substate = 9; return; }
+               PC = set_h(PC, read_arg(0xffff));
+       icount--;
+
+               if(irq_taken)
+
+                       standard_irq_callback(IRQ_LINE);
+
+       }
+
+       irq_taken = false;
+
+       P |= F_I; // Do *not* move after the prefetch
+
+       if(icount == 0) { inst_substate = 10; return; }
+       prefetch();
+       icount--;
+
+       inst_state = -1;
+
+}
+
+void m6502_device::brk_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       // The 6502 bug when a nmi occurs in a brk is reproduced (case !irq_taken && nmi_state)
+
+       if(irq_taken) {
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+               read_pc_noinc();
+       icount--;
+
+       } else {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc();
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(SP, PC >> 8);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(SP, PC);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(SP, irq_taken ? P & ~F_B : P);
+       icount--;
+
+       dec_SP();
+
+       if(nmi_state) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+               PC = read_arg(0xfffa);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+               PC = set_h(PC, read_arg(0xfffb));
+       icount--;
+
+               nmi_state = false;
+
+               standard_irq_callback(NMI_LINE);
+
+       } else {
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+               PC = read_arg(0xfffe);
+       icount--;
+
+       if(icount == 0) { inst_substate = 9; return; }
+case 9:
+               PC = set_h(PC, read_arg(0xffff));
+       icount--;
+
+               if(irq_taken)
+
+                       standard_irq_callback(IRQ_LINE);
+
+       }
+
+       irq_taken = false;
+
+       P |= F_I; // Do *not* move after the prefetch
+
+       if(icount == 0) { inst_substate = 10; return; }
+case 10:
+       prefetch();
+       icount--;
+
+       inst_state = -1;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::bvc_rel_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(!(P & F_V)) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::bvc_rel_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(!(P & F_V)) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::bvs_rel_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(P & F_V) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::bvs_rel_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(P & F_V) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+                       read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+               }
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::clc_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       P &= ~F_C;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::clc_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       P &= ~F_C;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cld_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       P &= ~F_D;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cld_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       P &= ~F_D;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cli_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+       P &= ~F_I; // Do *not* move it before the prefetch
+
+}
+
+void m6502_device::cli_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+       P &= ~F_I; // Do *not* move it before the prefetch
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::clv_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       P &= ~F_V;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::clv_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       P &= ~F_V;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cmp_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cmp_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cmp_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cmp_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cmp_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cmp_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cmp_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_cmp(A, read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cmp_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_cmp(A, read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cmp_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_cmp(A, read(TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cmp_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_cmp(A, read(TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cmp_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cmp_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cmp_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cmp_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cmp_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cmp_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_cmp(A, TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cpx_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(X, TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cpx_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(X, TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cpx_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       do_cmp(X, TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cpx_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       do_cmp(X, TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cpx_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(X, TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cpx_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(X, TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cpy_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(Y, TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cpy_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(Y, TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cpy_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       do_cmp(Y, TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cpy_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       do_cmp(Y, TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::cpy_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(Y, TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::cpy_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP);
+       icount--;
+
+       do_cmp(Y, TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dec_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dec_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dec_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dec_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dec_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dec_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dec_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dec_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dex_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       X--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dex_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       X--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dey_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       Y--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dey_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       Y--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::eor_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::eor_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::eor_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::eor_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::eor_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::eor_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::eor_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::eor_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::eor_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A ^= read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::eor_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A ^= read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::eor_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       A ^= read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::eor_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       A ^= read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::eor_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::eor_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::eor_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A ^= read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::eor_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A ^= read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::inc_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::inc_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::inc_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::inc_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::inc_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::inc_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::inc_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::inc_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::inx_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       X++;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::inx_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       X++;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::iny_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       Y++;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::iny_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       Y++;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::jmp_adr_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       PC = TMP;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::jmp_adr_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       PC = TMP;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::jmp_ind_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       PC = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       PC = set_h(PC, read(set_l(TMP, TMP+1)));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::jmp_ind_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       PC = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       PC = set_h(PC, read(set_l(TMP, TMP+1)));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::jsr_adr_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(SP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(SP, PC>>8);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(SP, PC);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       PC = TMP;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::jsr_adr_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(SP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(SP, PC>>8);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(SP, PC);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       PC = TMP;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lda_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lda_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lda_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A = read(TMP + X);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lda_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A = read(TMP + X);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lda_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A = read(TMP + Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lda_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A = read(TMP + Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lda_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lda_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lda_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A = read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lda_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A = read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lda_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       A = read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lda_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       A = read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lda_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       A = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lda_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       A = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lda_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A = read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lda_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A = read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldx_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       X = read(TMP);
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldx_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       X = read(TMP);
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldx_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       X = read(TMP + Y);
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldx_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       X = read(TMP + Y);
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldx_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       X = read_pc();
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldx_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       X = read_pc();
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldx_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       X = read(TMP);
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldx_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       X = read(TMP);
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldx_zpy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       X = read(uint8_t(TMP+Y));
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldx_zpy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       X = read(uint8_t(TMP+Y));
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldy_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       Y = read(TMP);
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldy_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       Y = read(TMP);
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldy_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       Y = read(TMP);
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldy_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       Y = read(TMP);
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldy_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       Y = read_pc();
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldy_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       Y = read_pc();
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldy_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       Y = read(TMP);
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldy_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       Y = read(TMP);
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ldy_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       Y = read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ldy_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       Y = read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lsr_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lsr_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lsr_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lsr_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lsr_acc_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       A = do_lsr(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lsr_acc_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       A = do_lsr(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lsr_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lsr_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lsr_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lsr_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::nop_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::nop_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ora_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ora_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ora_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ora_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ora_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ora_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ora_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       A |= read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ora_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       A |= read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ora_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ora_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ora_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A |= read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ora_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A |= read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ora_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ora_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ora_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A |= read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ora_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A |= read(uint8_t(TMP+X));
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::pha_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       write(SP, A);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::pha_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       write(SP, A);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::php_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       write(SP, P);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::php_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       write(SP, P);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::pla_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A = read(SP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::pla_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A = read(SP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::plp_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(SP) | (F_B|F_E);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+       P = TMP; // Do *not* move it before the prefetch
+
+}
+
+void m6502_device::plp_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(SP) | (F_B|F_E);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+       P = TMP; // Do *not* move it before the prefetch
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rol_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rol_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rol_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rol_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rol_acc_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       A = do_rol(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rol_acc_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       A = do_rol(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rol_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rol_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rol_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rol_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ror_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ror_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ror_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ror_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ror_acc_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       A = do_ror(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ror_acc_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       A = do_ror(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ror_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ror_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ror_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ror_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rti_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       P = read(SP) | (F_B|F_E);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+       PC = read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 5; return; }
+       PC = set_h(PC, read(SP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rti_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       P = read(SP) | (F_B|F_E);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       PC = read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       PC = set_h(PC, read(SP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rts_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       PC = read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+       PC = set_h(PC, read(SP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rts_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       PC = read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       PC = set_h(PC, read(SP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sbc_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sbc_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sbc_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sbc_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sbc_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sbc_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sbc_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_sbc(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sbc_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_sbc(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sbc_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_sbc(read(TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sbc_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_sbc(read(TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sbc_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sbc_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sbc_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sbc_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sbc_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sbc_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_sbc(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sec_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       P |= F_C;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sec_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       P |= F_C;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sed_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       P |= F_D;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sed_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       P |= F_D;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sei_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+       P |= F_I; // Do *not* move it before the prefetch
+
+}
+
+void m6502_device::sei_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+       P |= F_I; // Do *not* move it before the prefetch
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sta_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sta_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sta_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP+X, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sta_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP+X, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sta_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP+Y, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sta_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP+Y, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sta_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sta_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sta_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP+Y, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sta_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP+Y, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sta_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       write(TMP, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sta_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       write(TMP, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sta_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(uint8_t(TMP+X), A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sta_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(uint8_t(TMP+X), A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::stx_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, X);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::stx_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, X);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::stx_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       write(TMP, X);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::stx_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       write(TMP, X);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::stx_zpy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(uint8_t(TMP+Y), X);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::stx_zpy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(uint8_t(TMP+Y), X);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sty_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, Y);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sty_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, Y);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sty_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       write(TMP, Y);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sty_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       write(TMP, Y);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sty_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(uint8_t(TMP+X), Y);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sty_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(uint8_t(TMP+X), Y);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::tax_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       X = A;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::tax_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       X = A;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::tay_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       Y = A;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::tay_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       Y = A;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::tsx_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       X = SP;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::tsx_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       X = SP;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::txa_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       A = X;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::txa_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       A = X;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::txs_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       SP = set_l(SP, X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::txs_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       SP = set_l(SP, X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::tya_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       A = Y;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::tya_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       A = Y;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::reset_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       PC = read_arg(0xfffc);
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       PC = set_h(PC, read_arg(0xfffd));
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+       inst_state = -1;
+
+}
+
+void m6502_device::reset_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       PC = read_arg(0xfffc);
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       PC = set_h(PC, read_arg(0xfffd));
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+       inst_state = -1;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dcp_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dcp_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dcp_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dcp_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dcp_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dcp_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dcp_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dcp_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dcp_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dcp_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dcp_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dcp_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::dcp_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::dcp_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       do_cmp(A, TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::isb_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::isb_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::isb_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::isb_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::isb_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::isb_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::isb_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::isb_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::isb_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::isb_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::isb_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::isb_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::isb_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::isb_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2++;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       do_sbc(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lax_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A = X = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lax_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A = X = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lax_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A = X = read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lax_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A = X = read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lax_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A = X = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lax_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A = X = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lax_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       A = X = read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lax_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       A = X = read(TMP+Y);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lax_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       A = X = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lax_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       A = X = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lax_zpy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+Y);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       A = X = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lax_zpy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+Y);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       A = X = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rla_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rla_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rla_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rla_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rla_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rla_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rla_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rla_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rla_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rla_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rla_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rla_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rla_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rla_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       A &= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rra_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rra_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rra_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rra_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rra_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rra_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rra_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rra_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rra_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rra_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rra_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rra_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::rra_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::rra_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       do_adc(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sax_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       TMP2 = A & X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sax_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       TMP2 = A & X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sax_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       TMP2 = A & X;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sax_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       TMP2 = A & X;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sax_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       TMP2 = A & X;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sax_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       TMP2 = A & X;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sax_zpy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+Y);
+
+       TMP2 = A & X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sax_zpy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+Y);
+
+       TMP2 = A & X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sbx_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       X &= A;
+
+       if(X < TMP2)
+
+               P &= ~F_C;
+
+       else
+
+               P |= F_C;
+
+       X -= TMP2;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sbx_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       X &= A;
+
+       if(X < TMP2)
+
+               P &= ~F_C;
+
+       else
+
+               P |= F_C;
+
+       X -= TMP2;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sha_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP2 = A & X & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, Y))
+
+               TMP = set_h(TMP+Y, TMP2);
+
+       else
+
+               TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sha_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP2 = A & X & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, Y))
+
+               TMP = set_h(TMP+Y, TMP2);
+
+       else
+
+               TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sha_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP2 = A & X & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, Y))
+
+               TMP = set_h(TMP+Y, TMP2);
+
+       else
+
+               TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sha_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP2 = A & X & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, Y))
+
+               TMP = set_h(TMP+Y, TMP2);
+
+       else
+
+               TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::shs_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       SP = set_l(SP, A & X);
+
+       TMP2 = A & X & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, Y))
+
+               TMP = set_h(TMP+Y, TMP2);
+
+       else
+
+               TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::shs_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       SP = set_l(SP, A & X);
+
+       TMP2 = A & X & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, Y))
+
+               TMP = set_h(TMP+Y, TMP2);
+
+       else
+
+               TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::shx_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP2 = X & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, Y))
+
+               TMP = set_h(TMP+Y, TMP2);
+
+       else
+
+               TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::shx_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP2 = X & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, Y))
+
+               TMP = set_h(TMP+Y, TMP2);
+
+       else
+
+               TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::shy_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP2 = Y & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, X))
+
+               TMP = set_h(TMP+X, TMP2);
+
+       else
+
+               TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::shy_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP2 = Y & ((TMP >> 8)+1);
+
+       if(page_changing(TMP, X))
+
+               TMP = set_h(TMP+X, TMP2);
+
+       else
+
+               TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::slo_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::slo_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::slo_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::slo_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::slo_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::slo_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::slo_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::slo_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::slo_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::slo_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::slo_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::slo_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::slo_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::slo_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       A |= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sre_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sre_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sre_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sre_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sre_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sre_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sre_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sre_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sre_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sre_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(set_l(TMP, TMP+Y));
+       icount--;
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sre_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sre_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::sre_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::sre_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       TMP = uint8_t(TMP+X);
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       A ^= TMP2;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::anc_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       A &= read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(A & 0x80)
+
+               P |= F_C;
+
+       else
+
+               P &= ~F_C;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::anc_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       A &= read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(A & 0x80)
+
+               P |= F_C;
+
+       else
+
+               P &= ~F_C;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::ane_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       A &= TMP2 & X;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::ane_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       A &= TMP2 & X;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::asr_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       A &= read_pc();
+       icount--;
+
+       A = do_lsr(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::asr_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       A &= read_pc();
+       icount--;
+
+       A = do_lsr(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::arr_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       A &= read_pc();
+       icount--;
+
+       do_arr();
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::arr_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       A &= read_pc();
+       icount--;
+
+       do_arr();
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::las_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP+Y);
+       icount--;
+
+       A = TMP2 | 0x51;
+
+       X = 0xff;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::las_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP+Y);
+       icount--;
+
+       A = TMP2 | 0x51;
+
+       X = 0xff;
+
+       set_nz(TMP2);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::lxa_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       A = X = read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::lxa_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       A = X = read_pc();
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::nop_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::nop_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::nop_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(TMP + X);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::nop_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(TMP + X);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::nop_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::nop_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::nop_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::nop_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::nop_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(uint8_t(TMP+X));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m6502_device::nop_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(uint8_t(TMP+X));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m6502_device::kil_non_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(0xffff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(0xfffe);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(0xfffe);
+       icount--;
+
+       for(;;) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+               read(0xffff);
+       icount--;
+
+       }
+
+}
+
+void m6502_device::kil_non_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(0xffff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(0xfffe);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(0xfffe);
+       icount--;
+
+       for(;;) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+               read(0xffff);
+       icount--;
+
+       }
+
+}
+       inst_substate = 0;
+}
+
+
+
+
+void m6502_device::do_exec_full()
+{
+       switch(inst_state) {
+
+       case 0x00: brk_imp_full(); break;
+       case 0x01: ora_idx_full(); break;
+       case 0x02: kil_non_full(); break;
+       case 0x03: slo_idx_full(); break;
+       case 0x04: nop_zpg_full(); break;
+       case 0x05: ora_zpg_full(); break;
+       case 0x06: asl_zpg_full(); break;
+       case 0x07: slo_zpg_full(); break;
+       case 0x08: php_imp_full(); break;
+       case 0x09: ora_imm_full(); break;
+       case 0x0a: asl_acc_full(); break;
+       case 0x0b: anc_imm_full(); break;
+       case 0x0c: nop_aba_full(); break;
+       case 0x0d: ora_aba_full(); break;
+       case 0x0e: asl_aba_full(); break;
+       case 0x0f: slo_aba_full(); break;
+       case 0x10: bpl_rel_full(); break;
+       case 0x11: ora_idy_full(); break;
+       case 0x12: kil_non_full(); break;
+       case 0x13: slo_idy_full(); break;
+       case 0x14: nop_zpx_full(); break;
+       case 0x15: ora_zpx_full(); break;
+       case 0x16: asl_zpx_full(); break;
+       case 0x17: slo_zpx_full(); break;
+       case 0x18: clc_imp_full(); break;
+       case 0x19: ora_aby_full(); break;
+       case 0x1a: nop_imp_full(); break;
+       case 0x1b: slo_aby_full(); break;
+       case 0x1c: nop_abx_full(); break;
+       case 0x1d: ora_abx_full(); break;
+       case 0x1e: asl_abx_full(); break;
+       case 0x1f: slo_abx_full(); break;
+       case 0x20: jsr_adr_full(); break;
+       case 0x21: and_idx_full(); break;
+       case 0x22: kil_non_full(); break;
+       case 0x23: rla_idx_full(); break;
+       case 0x24: bit_zpg_full(); break;
+       case 0x25: and_zpg_full(); break;
+       case 0x26: rol_zpg_full(); break;
+       case 0x27: rla_zpg_full(); break;
+       case 0x28: plp_imp_full(); break;
+       case 0x29: and_imm_full(); break;
+       case 0x2a: rol_acc_full(); break;
+       case 0x2b: anc_imm_full(); break;
+       case 0x2c: bit_aba_full(); break;
+       case 0x2d: and_aba_full(); break;
+       case 0x2e: rol_aba_full(); break;
+       case 0x2f: rla_aba_full(); break;
+       case 0x30: bmi_rel_full(); break;
+       case 0x31: and_idy_full(); break;
+       case 0x32: kil_non_full(); break;
+       case 0x33: rla_idy_full(); break;
+       case 0x34: nop_zpx_full(); break;
+       case 0x35: and_zpx_full(); break;
+       case 0x36: rol_zpx_full(); break;
+       case 0x37: rla_zpx_full(); break;
+       case 0x38: sec_imp_full(); break;
+       case 0x39: and_aby_full(); break;
+       case 0x3a: nop_imp_full(); break;
+       case 0x3b: rla_aby_full(); break;
+       case 0x3c: nop_abx_full(); break;
+       case 0x3d: and_abx_full(); break;
+       case 0x3e: rol_abx_full(); break;
+       case 0x3f: rla_abx_full(); break;
+       case 0x40: rti_imp_full(); break;
+       case 0x41: eor_idx_full(); break;
+       case 0x42: kil_non_full(); break;
+       case 0x43: sre_idx_full(); break;
+       case 0x44: nop_zpg_full(); break;
+       case 0x45: eor_zpg_full(); break;
+       case 0x46: lsr_zpg_full(); break;
+       case 0x47: sre_zpg_full(); break;
+       case 0x48: pha_imp_full(); break;
+       case 0x49: eor_imm_full(); break;
+       case 0x4a: lsr_acc_full(); break;
+       case 0x4b: asr_imm_full(); break;
+       case 0x4c: jmp_adr_full(); break;
+       case 0x4d: eor_aba_full(); break;
+       case 0x4e: lsr_aba_full(); break;
+       case 0x4f: sre_aba_full(); break;
+       case 0x50: bvc_rel_full(); break;
+       case 0x51: eor_idy_full(); break;
+       case 0x52: kil_non_full(); break;
+       case 0x53: sre_idy_full(); break;
+       case 0x54: nop_zpx_full(); break;
+       case 0x55: eor_zpx_full(); break;
+       case 0x56: lsr_zpx_full(); break;
+       case 0x57: sre_zpx_full(); break;
+       case 0x58: cli_imp_full(); break;
+       case 0x59: eor_aby_full(); break;
+       case 0x5a: nop_imp_full(); break;
+       case 0x5b: sre_aby_full(); break;
+       case 0x5c: nop_abx_full(); break;
+       case 0x5d: eor_abx_full(); break;
+       case 0x5e: lsr_abx_full(); break;
+       case 0x5f: sre_abx_full(); break;
+       case 0x60: rts_imp_full(); break;
+       case 0x61: adc_idx_full(); break;
+       case 0x62: kil_non_full(); break;
+       case 0x63: rra_idx_full(); break;
+       case 0x64: nop_zpg_full(); break;
+       case 0x65: adc_zpg_full(); break;
+       case 0x66: ror_zpg_full(); break;
+       case 0x67: rra_zpg_full(); break;
+       case 0x68: pla_imp_full(); break;
+       case 0x69: adc_imm_full(); break;
+       case 0x6a: ror_acc_full(); break;
+       case 0x6b: arr_imm_full(); break;
+       case 0x6c: jmp_ind_full(); break;
+       case 0x6d: adc_aba_full(); break;
+       case 0x6e: ror_aba_full(); break;
+       case 0x6f: rra_aba_full(); break;
+       case 0x70: bvs_rel_full(); break;
+       case 0x71: adc_idy_full(); break;
+       case 0x72: kil_non_full(); break;
+       case 0x73: rra_idy_full(); break;
+       case 0x74: nop_zpx_full(); break;
+       case 0x75: adc_zpx_full(); break;
+       case 0x76: ror_zpx_full(); break;
+       case 0x77: rra_zpx_full(); break;
+       case 0x78: sei_imp_full(); break;
+       case 0x79: adc_aby_full(); break;
+       case 0x7a: nop_imp_full(); break;
+       case 0x7b: rra_aby_full(); break;
+       case 0x7c: nop_abx_full(); break;
+       case 0x7d: adc_abx_full(); break;
+       case 0x7e: ror_abx_full(); break;
+       case 0x7f: rra_abx_full(); break;
+       case 0x80: nop_imm_full(); break;
+       case 0x81: sta_idx_full(); break;
+       case 0x82: nop_imm_full(); break;
+       case 0x83: sax_idx_full(); break;
+       case 0x84: sty_zpg_full(); break;
+       case 0x85: sta_zpg_full(); break;
+       case 0x86: stx_zpg_full(); break;
+       case 0x87: sax_zpg_full(); break;
+       case 0x88: dey_imp_full(); break;
+       case 0x89: nop_imm_full(); break;
+       case 0x8a: txa_imp_full(); break;
+       case 0x8b: ane_imm_full(); break;
+       case 0x8c: sty_aba_full(); break;
+       case 0x8d: sta_aba_full(); break;
+       case 0x8e: stx_aba_full(); break;
+       case 0x8f: sax_aba_full(); break;
+       case 0x90: bcc_rel_full(); break;
+       case 0x91: sta_idy_full(); break;
+       case 0x92: kil_non_full(); break;
+       case 0x93: sha_idy_full(); break;
+       case 0x94: sty_zpx_full(); break;
+       case 0x95: sta_zpx_full(); break;
+       case 0x96: stx_zpy_full(); break;
+       case 0x97: sax_zpy_full(); break;
+       case 0x98: tya_imp_full(); break;
+       case 0x99: sta_aby_full(); break;
+       case 0x9a: txs_imp_full(); break;
+       case 0x9b: shs_aby_full(); break;
+       case 0x9c: shy_abx_full(); break;
+       case 0x9d: sta_abx_full(); break;
+       case 0x9e: shx_aby_full(); break;
+       case 0x9f: sha_aby_full(); break;
+       case 0xa0: ldy_imm_full(); break;
+       case 0xa1: lda_idx_full(); break;
+       case 0xa2: ldx_imm_full(); break;
+       case 0xa3: lax_idx_full(); break;
+       case 0xa4: ldy_zpg_full(); break;
+       case 0xa5: lda_zpg_full(); break;
+       case 0xa6: ldx_zpg_full(); break;
+       case 0xa7: lax_zpg_full(); break;
+       case 0xa8: tay_imp_full(); break;
+       case 0xa9: lda_imm_full(); break;
+       case 0xaa: tax_imp_full(); break;
+       case 0xab: lxa_imm_full(); break;
+       case 0xac: ldy_aba_full(); break;
+       case 0xad: lda_aba_full(); break;
+       case 0xae: ldx_aba_full(); break;
+       case 0xaf: lax_aba_full(); break;
+       case 0xb0: bcs_rel_full(); break;
+       case 0xb1: lda_idy_full(); break;
+       case 0xb2: kil_non_full(); break;
+       case 0xb3: lax_idy_full(); break;
+       case 0xb4: ldy_zpx_full(); break;
+       case 0xb5: lda_zpx_full(); break;
+       case 0xb6: ldx_zpy_full(); break;
+       case 0xb7: lax_zpy_full(); break;
+       case 0xb8: clv_imp_full(); break;
+       case 0xb9: lda_aby_full(); break;
+       case 0xba: tsx_imp_full(); break;
+       case 0xbb: las_aby_full(); break;
+       case 0xbc: ldy_abx_full(); break;
+       case 0xbd: lda_abx_full(); break;
+       case 0xbe: ldx_aby_full(); break;
+       case 0xbf: lax_aby_full(); break;
+       case 0xc0: cpy_imm_full(); break;
+       case 0xc1: cmp_idx_full(); break;
+       case 0xc2: nop_imm_full(); break;
+       case 0xc3: dcp_idx_full(); break;
+       case 0xc4: cpy_zpg_full(); break;
+       case 0xc5: cmp_zpg_full(); break;
+       case 0xc6: dec_zpg_full(); break;
+       case 0xc7: dcp_zpg_full(); break;
+       case 0xc8: iny_imp_full(); break;
+       case 0xc9: cmp_imm_full(); break;
+       case 0xca: dex_imp_full(); break;
+       case 0xcb: sbx_imm_full(); break;
+       case 0xcc: cpy_aba_full(); break;
+       case 0xcd: cmp_aba_full(); break;
+       case 0xce: dec_aba_full(); break;
+       case 0xcf: dcp_aba_full(); break;
+       case 0xd0: bne_rel_full(); break;
+       case 0xd1: cmp_idy_full(); break;
+       case 0xd2: kil_non_full(); break;
+       case 0xd3: dcp_idy_full(); break;
+       case 0xd4: nop_zpx_full(); break;
+       case 0xd5: cmp_zpx_full(); break;
+       case 0xd6: dec_zpx_full(); break;
+       case 0xd7: dcp_zpx_full(); break;
+       case 0xd8: cld_imp_full(); break;
+       case 0xd9: cmp_aby_full(); break;
+       case 0xda: nop_imp_full(); break;
+       case 0xdb: dcp_aby_full(); break;
+       case 0xdc: nop_abx_full(); break;
+       case 0xdd: cmp_abx_full(); break;
+       case 0xde: dec_abx_full(); break;
+       case 0xdf: dcp_abx_full(); break;
+       case 0xe0: cpx_imm_full(); break;
+       case 0xe1: sbc_idx_full(); break;
+       case 0xe2: nop_imm_full(); break;
+       case 0xe3: isb_idx_full(); break;
+       case 0xe4: cpx_zpg_full(); break;
+       case 0xe5: sbc_zpg_full(); break;
+       case 0xe6: inc_zpg_full(); break;
+       case 0xe7: isb_zpg_full(); break;
+       case 0xe8: inx_imp_full(); break;
+       case 0xe9: sbc_imm_full(); break;
+       case 0xea: nop_imp_full(); break;
+       case 0xeb: sbc_imm_full(); break;
+       case 0xec: cpx_aba_full(); break;
+       case 0xed: sbc_aba_full(); break;
+       case 0xee: inc_aba_full(); break;
+       case 0xef: isb_aba_full(); break;
+       case 0xf0: beq_rel_full(); break;
+       case 0xf1: sbc_idy_full(); break;
+       case 0xf2: kil_non_full(); break;
+       case 0xf3: isb_idy_full(); break;
+       case 0xf4: nop_zpx_full(); break;
+       case 0xf5: sbc_zpx_full(); break;
+       case 0xf6: inc_zpx_full(); break;
+       case 0xf7: isb_zpx_full(); break;
+       case 0xf8: sed_imp_full(); break;
+       case 0xf9: sbc_aby_full(); break;
+       case 0xfa: nop_imp_full(); break;
+       case 0xfb: isb_aby_full(); break;
+       case 0xfc: nop_abx_full(); break;
+       case 0xfd: sbc_abx_full(); break;
+       case 0xfe: inc_abx_full(); break;
+       case 0xff: isb_abx_full(); break;
+       case STATE_RESET: reset_full(); break;
+       }
+}
+
+void m6502_device::do_exec_partial()
+{
+       switch(inst_state) {
+
+       case 0x00: brk_imp_partial(); break;
+       case 0x01: ora_idx_partial(); break;
+       case 0x02: kil_non_partial(); break;
+       case 0x03: slo_idx_partial(); break;
+       case 0x04: nop_zpg_partial(); break;
+       case 0x05: ora_zpg_partial(); break;
+       case 0x06: asl_zpg_partial(); break;
+       case 0x07: slo_zpg_partial(); break;
+       case 0x08: php_imp_partial(); break;
+       case 0x09: ora_imm_partial(); break;
+       case 0x0a: asl_acc_partial(); break;
+       case 0x0b: anc_imm_partial(); break;
+       case 0x0c: nop_aba_partial(); break;
+       case 0x0d: ora_aba_partial(); break;
+       case 0x0e: asl_aba_partial(); break;
+       case 0x0f: slo_aba_partial(); break;
+       case 0x10: bpl_rel_partial(); break;
+       case 0x11: ora_idy_partial(); break;
+       case 0x12: kil_non_partial(); break;
+       case 0x13: slo_idy_partial(); break;
+       case 0x14: nop_zpx_partial(); break;
+       case 0x15: ora_zpx_partial(); break;
+       case 0x16: asl_zpx_partial(); break;
+       case 0x17: slo_zpx_partial(); break;
+       case 0x18: clc_imp_partial(); break;
+       case 0x19: ora_aby_partial(); break;
+       case 0x1a: nop_imp_partial(); break;
+       case 0x1b: slo_aby_partial(); break;
+       case 0x1c: nop_abx_partial(); break;
+       case 0x1d: ora_abx_partial(); break;
+       case 0x1e: asl_abx_partial(); break;
+       case 0x1f: slo_abx_partial(); break;
+       case 0x20: jsr_adr_partial(); break;
+       case 0x21: and_idx_partial(); break;
+       case 0x22: kil_non_partial(); break;
+       case 0x23: rla_idx_partial(); break;
+       case 0x24: bit_zpg_partial(); break;
+       case 0x25: and_zpg_partial(); break;
+       case 0x26: rol_zpg_partial(); break;
+       case 0x27: rla_zpg_partial(); break;
+       case 0x28: plp_imp_partial(); break;
+       case 0x29: and_imm_partial(); break;
+       case 0x2a: rol_acc_partial(); break;
+       case 0x2b: anc_imm_partial(); break;
+       case 0x2c: bit_aba_partial(); break;
+       case 0x2d: and_aba_partial(); break;
+       case 0x2e: rol_aba_partial(); break;
+       case 0x2f: rla_aba_partial(); break;
+       case 0x30: bmi_rel_partial(); break;
+       case 0x31: and_idy_partial(); break;
+       case 0x32: kil_non_partial(); break;
+       case 0x33: rla_idy_partial(); break;
+       case 0x34: nop_zpx_partial(); break;
+       case 0x35: and_zpx_partial(); break;
+       case 0x36: rol_zpx_partial(); break;
+       case 0x37: rla_zpx_partial(); break;
+       case 0x38: sec_imp_partial(); break;
+       case 0x39: and_aby_partial(); break;
+       case 0x3a: nop_imp_partial(); break;
+       case 0x3b: rla_aby_partial(); break;
+       case 0x3c: nop_abx_partial(); break;
+       case 0x3d: and_abx_partial(); break;
+       case 0x3e: rol_abx_partial(); break;
+       case 0x3f: rla_abx_partial(); break;
+       case 0x40: rti_imp_partial(); break;
+       case 0x41: eor_idx_partial(); break;
+       case 0x42: kil_non_partial(); break;
+       case 0x43: sre_idx_partial(); break;
+       case 0x44: nop_zpg_partial(); break;
+       case 0x45: eor_zpg_partial(); break;
+       case 0x46: lsr_zpg_partial(); break;
+       case 0x47: sre_zpg_partial(); break;
+       case 0x48: pha_imp_partial(); break;
+       case 0x49: eor_imm_partial(); break;
+       case 0x4a: lsr_acc_partial(); break;
+       case 0x4b: asr_imm_partial(); break;
+       case 0x4c: jmp_adr_partial(); break;
+       case 0x4d: eor_aba_partial(); break;
+       case 0x4e: lsr_aba_partial(); break;
+       case 0x4f: sre_aba_partial(); break;
+       case 0x50: bvc_rel_partial(); break;
+       case 0x51: eor_idy_partial(); break;
+       case 0x52: kil_non_partial(); break;
+       case 0x53: sre_idy_partial(); break;
+       case 0x54: nop_zpx_partial(); break;
+       case 0x55: eor_zpx_partial(); break;
+       case 0x56: lsr_zpx_partial(); break;
+       case 0x57: sre_zpx_partial(); break;
+       case 0x58: cli_imp_partial(); break;
+       case 0x59: eor_aby_partial(); break;
+       case 0x5a: nop_imp_partial(); break;
+       case 0x5b: sre_aby_partial(); break;
+       case 0x5c: nop_abx_partial(); break;
+       case 0x5d: eor_abx_partial(); break;
+       case 0x5e: lsr_abx_partial(); break;
+       case 0x5f: sre_abx_partial(); break;
+       case 0x60: rts_imp_partial(); break;
+       case 0x61: adc_idx_partial(); break;
+       case 0x62: kil_non_partial(); break;
+       case 0x63: rra_idx_partial(); break;
+       case 0x64: nop_zpg_partial(); break;
+       case 0x65: adc_zpg_partial(); break;
+       case 0x66: ror_zpg_partial(); break;
+       case 0x67: rra_zpg_partial(); break;
+       case 0x68: pla_imp_partial(); break;
+       case 0x69: adc_imm_partial(); break;
+       case 0x6a: ror_acc_partial(); break;
+       case 0x6b: arr_imm_partial(); break;
+       case 0x6c: jmp_ind_partial(); break;
+       case 0x6d: adc_aba_partial(); break;
+       case 0x6e: ror_aba_partial(); break;
+       case 0x6f: rra_aba_partial(); break;
+       case 0x70: bvs_rel_partial(); break;
+       case 0x71: adc_idy_partial(); break;
+       case 0x72: kil_non_partial(); break;
+       case 0x73: rra_idy_partial(); break;
+       case 0x74: nop_zpx_partial(); break;
+       case 0x75: adc_zpx_partial(); break;
+       case 0x76: ror_zpx_partial(); break;
+       case 0x77: rra_zpx_partial(); break;
+       case 0x78: sei_imp_partial(); break;
+       case 0x79: adc_aby_partial(); break;
+       case 0x7a: nop_imp_partial(); break;
+       case 0x7b: rra_aby_partial(); break;
+       case 0x7c: nop_abx_partial(); break;
+       case 0x7d: adc_abx_partial(); break;
+       case 0x7e: ror_abx_partial(); break;
+       case 0x7f: rra_abx_partial(); break;
+       case 0x80: nop_imm_partial(); break;
+       case 0x81: sta_idx_partial(); break;
+       case 0x82: nop_imm_partial(); break;
+       case 0x83: sax_idx_partial(); break;
+       case 0x84: sty_zpg_partial(); break;
+       case 0x85: sta_zpg_partial(); break;
+       case 0x86: stx_zpg_partial(); break;
+       case 0x87: sax_zpg_partial(); break;
+       case 0x88: dey_imp_partial(); break;
+       case 0x89: nop_imm_partial(); break;
+       case 0x8a: txa_imp_partial(); break;
+       case 0x8b: ane_imm_partial(); break;
+       case 0x8c: sty_aba_partial(); break;
+       case 0x8d: sta_aba_partial(); break;
+       case 0x8e: stx_aba_partial(); break;
+       case 0x8f: sax_aba_partial(); break;
+       case 0x90: bcc_rel_partial(); break;
+       case 0x91: sta_idy_partial(); break;
+       case 0x92: kil_non_partial(); break;
+       case 0x93: sha_idy_partial(); break;
+       case 0x94: sty_zpx_partial(); break;
+       case 0x95: sta_zpx_partial(); break;
+       case 0x96: stx_zpy_partial(); break;
+       case 0x97: sax_zpy_partial(); break;
+       case 0x98: tya_imp_partial(); break;
+       case 0x99: sta_aby_partial(); break;
+       case 0x9a: txs_imp_partial(); break;
+       case 0x9b: shs_aby_partial(); break;
+       case 0x9c: shy_abx_partial(); break;
+       case 0x9d: sta_abx_partial(); break;
+       case 0x9e: shx_aby_partial(); break;
+       case 0x9f: sha_aby_partial(); break;
+       case 0xa0: ldy_imm_partial(); break;
+       case 0xa1: lda_idx_partial(); break;
+       case 0xa2: ldx_imm_partial(); break;
+       case 0xa3: lax_idx_partial(); break;
+       case 0xa4: ldy_zpg_partial(); break;
+       case 0xa5: lda_zpg_partial(); break;
+       case 0xa6: ldx_zpg_partial(); break;
+       case 0xa7: lax_zpg_partial(); break;
+       case 0xa8: tay_imp_partial(); break;
+       case 0xa9: lda_imm_partial(); break;
+       case 0xaa: tax_imp_partial(); break;
+       case 0xab: lxa_imm_partial(); break;
+       case 0xac: ldy_aba_partial(); break;
+       case 0xad: lda_aba_partial(); break;
+       case 0xae: ldx_aba_partial(); break;
+       case 0xaf: lax_aba_partial(); break;
+       case 0xb0: bcs_rel_partial(); break;
+       case 0xb1: lda_idy_partial(); break;
+       case 0xb2: kil_non_partial(); break;
+       case 0xb3: lax_idy_partial(); break;
+       case 0xb4: ldy_zpx_partial(); break;
+       case 0xb5: lda_zpx_partial(); break;
+       case 0xb6: ldx_zpy_partial(); break;
+       case 0xb7: lax_zpy_partial(); break;
+       case 0xb8: clv_imp_partial(); break;
+       case 0xb9: lda_aby_partial(); break;
+       case 0xba: tsx_imp_partial(); break;
+       case 0xbb: las_aby_partial(); break;
+       case 0xbc: ldy_abx_partial(); break;
+       case 0xbd: lda_abx_partial(); break;
+       case 0xbe: ldx_aby_partial(); break;
+       case 0xbf: lax_aby_partial(); break;
+       case 0xc0: cpy_imm_partial(); break;
+       case 0xc1: cmp_idx_partial(); break;
+       case 0xc2: nop_imm_partial(); break;
+       case 0xc3: dcp_idx_partial(); break;
+       case 0xc4: cpy_zpg_partial(); break;
+       case 0xc5: cmp_zpg_partial(); break;
+       case 0xc6: dec_zpg_partial(); break;
+       case 0xc7: dcp_zpg_partial(); break;
+       case 0xc8: iny_imp_partial(); break;
+       case 0xc9: cmp_imm_partial(); break;
+       case 0xca: dex_imp_partial(); break;
+       case 0xcb: sbx_imm_partial(); break;
+       case 0xcc: cpy_aba_partial(); break;
+       case 0xcd: cmp_aba_partial(); break;
+       case 0xce: dec_aba_partial(); break;
+       case 0xcf: dcp_aba_partial(); break;
+       case 0xd0: bne_rel_partial(); break;
+       case 0xd1: cmp_idy_partial(); break;
+       case 0xd2: kil_non_partial(); break;
+       case 0xd3: dcp_idy_partial(); break;
+       case 0xd4: nop_zpx_partial(); break;
+       case 0xd5: cmp_zpx_partial(); break;
+       case 0xd6: dec_zpx_partial(); break;
+       case 0xd7: dcp_zpx_partial(); break;
+       case 0xd8: cld_imp_partial(); break;
+       case 0xd9: cmp_aby_partial(); break;
+       case 0xda: nop_imp_partial(); break;
+       case 0xdb: dcp_aby_partial(); break;
+       case 0xdc: nop_abx_partial(); break;
+       case 0xdd: cmp_abx_partial(); break;
+       case 0xde: dec_abx_partial(); break;
+       case 0xdf: dcp_abx_partial(); break;
+       case 0xe0: cpx_imm_partial(); break;
+       case 0xe1: sbc_idx_partial(); break;
+       case 0xe2: nop_imm_partial(); break;
+       case 0xe3: isb_idx_partial(); break;
+       case 0xe4: cpx_zpg_partial(); break;
+       case 0xe5: sbc_zpg_partial(); break;
+       case 0xe6: inc_zpg_partial(); break;
+       case 0xe7: isb_zpg_partial(); break;
+       case 0xe8: inx_imp_partial(); break;
+       case 0xe9: sbc_imm_partial(); break;
+       case 0xea: nop_imp_partial(); break;
+       case 0xeb: sbc_imm_partial(); break;
+       case 0xec: cpx_aba_partial(); break;
+       case 0xed: sbc_aba_partial(); break;
+       case 0xee: inc_aba_partial(); break;
+       case 0xef: isb_aba_partial(); break;
+       case 0xf0: beq_rel_partial(); break;
+       case 0xf1: sbc_idy_partial(); break;
+       case 0xf2: kil_non_partial(); break;
+       case 0xf3: isb_idy_partial(); break;
+       case 0xf4: nop_zpx_partial(); break;
+       case 0xf5: sbc_zpx_partial(); break;
+       case 0xf6: inc_zpx_partial(); break;
+       case 0xf7: isb_zpx_partial(); break;
+       case 0xf8: sed_imp_partial(); break;
+       case 0xf9: sbc_aby_partial(); break;
+       case 0xfa: nop_imp_partial(); break;
+       case 0xfb: isb_aby_partial(); break;
+       case 0xfc: nop_abx_partial(); break;
+       case 0xfd: sbc_abx_partial(); break;
+       case 0xfe: inc_abx_partial(); break;
+       case 0xff: isb_abx_partial(); break;
+       case STATE_RESET: reset_partial(); break;
+       }
+}
+
diff --git a/m6502/m6502d.hxx b/m6502/m6502d.hxx
new file mode 100644 (file)
index 0000000..07b6b93
--- /dev/null
@@ -0,0 +1,260 @@
+const m6502_disassembler::disasm_entry m6502_disassembler::disasm_entries[0x100] = {
+
+       { "brk", DASM_imp, 0 },
+       { "ora", DASM_idx, 0 },
+       { "kil", DASM_non, 0 },
+       { "slo", DASM_idx, 0 },
+       { "nop", DASM_zpg, 0 },
+       { "ora", DASM_zpg, 0 },
+       { "asl", DASM_zpg, 0 },
+       { "slo", DASM_zpg, 0 },
+       { "php", DASM_imp, 0 },
+       { "ora", DASM_imm, 0 },
+       { "asl", DASM_acc, 0 },
+       { "anc", DASM_imm, 0 },
+       { "nop", DASM_aba, 0 },
+       { "ora", DASM_aba, 0 },
+       { "asl", DASM_aba, 0 },
+       { "slo", DASM_aba, 0 },
+       { "bpl", DASM_rel, 0 },
+       { "ora", DASM_idy, 0 },
+       { "kil", DASM_non, 0 },
+       { "slo", DASM_idy, 0 },
+       { "nop", DASM_zpx, 0 },
+       { "ora", DASM_zpx, 0 },
+       { "asl", DASM_zpx, 0 },
+       { "slo", DASM_zpx, 0 },
+       { "clc", DASM_imp, 0 },
+       { "ora", DASM_aby, 0 },
+       { "nop", DASM_imp, 0 },
+       { "slo", DASM_aby, 0 },
+       { "nop", DASM_abx, 0 },
+       { "ora", DASM_abx, 0 },
+       { "asl", DASM_abx, 0 },
+       { "slo", DASM_abx, 0 },
+       { "jsr", DASM_adr, STEP_OVER },
+       { "and", DASM_idx, 0 },
+       { "kil", DASM_non, 0 },
+       { "rla", DASM_idx, 0 },
+       { "bit", DASM_zpg, 0 },
+       { "and", DASM_zpg, 0 },
+       { "rol", DASM_zpg, 0 },
+       { "rla", DASM_zpg, 0 },
+       { "plp", DASM_imp, 0 },
+       { "and", DASM_imm, 0 },
+       { "rol", DASM_acc, 0 },
+       { "anc", DASM_imm, 0 },
+       { "bit", DASM_aba, 0 },
+       { "and", DASM_aba, 0 },
+       { "rol", DASM_aba, 0 },
+       { "rla", DASM_aba, 0 },
+       { "bmi", DASM_rel, 0 },
+       { "and", DASM_idy, 0 },
+       { "kil", DASM_non, 0 },
+       { "rla", DASM_idy, 0 },
+       { "nop", DASM_zpx, 0 },
+       { "and", DASM_zpx, 0 },
+       { "rol", DASM_zpx, 0 },
+       { "rla", DASM_zpx, 0 },
+       { "sec", DASM_imp, 0 },
+       { "and", DASM_aby, 0 },
+       { "nop", DASM_imp, 0 },
+       { "rla", DASM_aby, 0 },
+       { "nop", DASM_abx, 0 },
+       { "and", DASM_abx, 0 },
+       { "rol", DASM_abx, 0 },
+       { "rla", DASM_abx, 0 },
+       { "rti", DASM_imp, STEP_OUT },
+       { "eor", DASM_idx, 0 },
+       { "kil", DASM_non, 0 },
+       { "sre", DASM_idx, 0 },
+       { "nop", DASM_zpg, 0 },
+       { "eor", DASM_zpg, 0 },
+       { "lsr", DASM_zpg, 0 },
+       { "sre", DASM_zpg, 0 },
+       { "pha", DASM_imp, 0 },
+       { "eor", DASM_imm, 0 },
+       { "lsr", DASM_acc, 0 },
+       { "asr", DASM_imm, 0 },
+       { "jmp", DASM_adr, 0 },
+       { "eor", DASM_aba, 0 },
+       { "lsr", DASM_aba, 0 },
+       { "sre", DASM_aba, 0 },
+       { "bvc", DASM_rel, 0 },
+       { "eor", DASM_idy, 0 },
+       { "kil", DASM_non, 0 },
+       { "sre", DASM_idy, 0 },
+       { "nop", DASM_zpx, 0 },
+       { "eor", DASM_zpx, 0 },
+       { "lsr", DASM_zpx, 0 },
+       { "sre", DASM_zpx, 0 },
+       { "cli", DASM_imp, 0 },
+       { "eor", DASM_aby, 0 },
+       { "nop", DASM_imp, 0 },
+       { "sre", DASM_aby, 0 },
+       { "nop", DASM_abx, 0 },
+       { "eor", DASM_abx, 0 },
+       { "lsr", DASM_abx, 0 },
+       { "sre", DASM_abx, 0 },
+       { "rts", DASM_imp, STEP_OUT },
+       { "adc", DASM_idx, 0 },
+       { "kil", DASM_non, 0 },
+       { "rra", DASM_idx, 0 },
+       { "nop", DASM_zpg, 0 },
+       { "adc", DASM_zpg, 0 },
+       { "ror", DASM_zpg, 0 },
+       { "rra", DASM_zpg, 0 },
+       { "pla", DASM_imp, 0 },
+       { "adc", DASM_imm, 0 },
+       { "ror", DASM_acc, 0 },
+       { "arr", DASM_imm, 0 },
+       { "jmp", DASM_ind, 0 },
+       { "adc", DASM_aba, 0 },
+       { "ror", DASM_aba, 0 },
+       { "rra", DASM_aba, 0 },
+       { "bvs", DASM_rel, 0 },
+       { "adc", DASM_idy, 0 },
+       { "kil", DASM_non, 0 },
+       { "rra", DASM_idy, 0 },
+       { "nop", DASM_zpx, 0 },
+       { "adc", DASM_zpx, 0 },
+       { "ror", DASM_zpx, 0 },
+       { "rra", DASM_zpx, 0 },
+       { "sei", DASM_imp, 0 },
+       { "adc", DASM_aby, 0 },
+       { "nop", DASM_imp, 0 },
+       { "rra", DASM_aby, 0 },
+       { "nop", DASM_abx, 0 },
+       { "adc", DASM_abx, 0 },
+       { "ror", DASM_abx, 0 },
+       { "rra", DASM_abx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "sta", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "sax", DASM_idx, 0 },
+       { "sty", DASM_zpg, 0 },
+       { "sta", DASM_zpg, 0 },
+       { "stx", DASM_zpg, 0 },
+       { "sax", DASM_zpg, 0 },
+       { "dey", DASM_imp, 0 },
+       { "nop", DASM_imm, 0 },
+       { "txa", DASM_imp, 0 },
+       { "ane", DASM_imm, 0 },
+       { "sty", DASM_aba, 0 },
+       { "sta", DASM_aba, 0 },
+       { "stx", DASM_aba, 0 },
+       { "sax", DASM_aba, 0 },
+       { "bcc", DASM_rel, 0 },
+       { "sta", DASM_idy, 0 },
+       { "kil", DASM_non, 0 },
+       { "sha", DASM_idy, 0 },
+       { "sty", DASM_zpx, 0 },
+       { "sta", DASM_zpx, 0 },
+       { "stx", DASM_zpy, 0 },
+       { "sax", DASM_zpy, 0 },
+       { "tya", DASM_imp, 0 },
+       { "sta", DASM_aby, 0 },
+       { "txs", DASM_imp, 0 },
+       { "shs", DASM_aby, 0 },
+       { "shy", DASM_abx, 0 },
+       { "sta", DASM_abx, 0 },
+       { "shx", DASM_aby, 0 },
+       { "sha", DASM_aby, 0 },
+       { "ldy", DASM_imm, 0 },
+       { "lda", DASM_idx, 0 },
+       { "ldx", DASM_imm, 0 },
+       { "lax", DASM_idx, 0 },
+       { "ldy", DASM_zpg, 0 },
+       { "lda", DASM_zpg, 0 },
+       { "ldx", DASM_zpg, 0 },
+       { "lax", DASM_zpg, 0 },
+       { "tay", DASM_imp, 0 },
+       { "lda", DASM_imm, 0 },
+       { "tax", DASM_imp, 0 },
+       { "lxa", DASM_imm, 0 },
+       { "ldy", DASM_aba, 0 },
+       { "lda", DASM_aba, 0 },
+       { "ldx", DASM_aba, 0 },
+       { "lax", DASM_aba, 0 },
+       { "bcs", DASM_rel, 0 },
+       { "lda", DASM_idy, 0 },
+       { "kil", DASM_non, 0 },
+       { "lax", DASM_idy, 0 },
+       { "ldy", DASM_zpx, 0 },
+       { "lda", DASM_zpx, 0 },
+       { "ldx", DASM_zpy, 0 },
+       { "lax", DASM_zpy, 0 },
+       { "clv", DASM_imp, 0 },
+       { "lda", DASM_aby, 0 },
+       { "tsx", DASM_imp, 0 },
+       { "las", DASM_aby, 0 },
+       { "ldy", DASM_abx, 0 },
+       { "lda", DASM_abx, 0 },
+       { "ldx", DASM_aby, 0 },
+       { "lax", DASM_aby, 0 },
+       { "cpy", DASM_imm, 0 },
+       { "cmp", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "dcp", DASM_idx, 0 },
+       { "cpy", DASM_zpg, 0 },
+       { "cmp", DASM_zpg, 0 },
+       { "dec", DASM_zpg, 0 },
+       { "dcp", DASM_zpg, 0 },
+       { "iny", DASM_imp, 0 },
+       { "cmp", DASM_imm, 0 },
+       { "dex", DASM_imp, 0 },
+       { "sbx", DASM_imm, 0 },
+       { "cpy", DASM_aba, 0 },
+       { "cmp", DASM_aba, 0 },
+       { "dec", DASM_aba, 0 },
+       { "dcp", DASM_aba, 0 },
+       { "bne", DASM_rel, 0 },
+       { "cmp", DASM_idy, 0 },
+       { "kil", DASM_non, 0 },
+       { "dcp", DASM_idy, 0 },
+       { "nop", DASM_zpx, 0 },
+       { "cmp", DASM_zpx, 0 },
+       { "dec", DASM_zpx, 0 },
+       { "dcp", DASM_zpx, 0 },
+       { "cld", DASM_imp, 0 },
+       { "cmp", DASM_aby, 0 },
+       { "nop", DASM_imp, 0 },
+       { "dcp", DASM_aby, 0 },
+       { "nop", DASM_abx, 0 },
+       { "cmp", DASM_abx, 0 },
+       { "dec", DASM_abx, 0 },
+       { "dcp", DASM_abx, 0 },
+       { "cpx", DASM_imm, 0 },
+       { "sbc", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "isb", DASM_idx, 0 },
+       { "cpx", DASM_zpg, 0 },
+       { "sbc", DASM_zpg, 0 },
+       { "inc", DASM_zpg, 0 },
+       { "isb", DASM_zpg, 0 },
+       { "inx", DASM_imp, 0 },
+       { "sbc", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "sbc", DASM_imm, 0 },
+       { "cpx", DASM_aba, 0 },
+       { "sbc", DASM_aba, 0 },
+       { "inc", DASM_aba, 0 },
+       { "isb", DASM_aba, 0 },
+       { "beq", DASM_rel, 0 },
+       { "sbc", DASM_idy, 0 },
+       { "kil", DASM_non, 0 },
+       { "isb", DASM_idy, 0 },
+       { "nop", DASM_zpx, 0 },
+       { "sbc", DASM_zpx, 0 },
+       { "inc", DASM_zpx, 0 },
+       { "isb", DASM_zpx, 0 },
+       { "sed", DASM_imp, 0 },
+       { "sbc", DASM_aby, 0 },
+       { "nop", DASM_imp, 0 },
+       { "isb", DASM_aby, 0 },
+       { "nop", DASM_abx, 0 },
+       { "sbc", DASM_abx, 0 },
+       { "inc", DASM_abx, 0 },
+       { "isb", DASM_abx, 0 },
+};
+
diff --git a/m6502/m65c02.hxx b/m6502/m65c02.hxx
new file mode 100644 (file)
index 0000000..ee3369c
--- /dev/null
@@ -0,0 +1,4687 @@
+void m65c02_device::adc_c_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::adc_c_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::adc_c_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::adc_c_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::adc_c_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::adc_c_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::adc_c_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_adc(read(TMP));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::adc_c_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_adc(read(TMP));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::adc_c_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_adc(read(TMP+Y));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::adc_c_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_adc(read(TMP+Y));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::adc_c_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::adc_c_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::adc_c_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::adc_c_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP);
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::adc_c_zpi_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       do_adc(read(TMP));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::adc_c_zpi_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       do_adc(read(TMP));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::adc_c_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::adc_c_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_adc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::and_zpi_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::and_zpi_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A &= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::asl_c_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::asl_c_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_asl(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::bbr_zpb_full()
+{
+
+       // Access pattern uncertain
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(!(TMP2 & (1 << ((inst_state >> 4) & 7)))) {
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::bbr_zpb_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       // Access pattern uncertain
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read_pc_noinc();
+       icount--;
+
+       if(!(TMP2 & (1 << ((inst_state >> 4) & 7)))) {
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::bbs_zpb_full()
+{
+
+       // Access pattern uncertain
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(TMP2 & (1 << ((inst_state >> 4) & 7))) {
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::bbs_zpb_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       // Access pattern uncertain
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read_pc_noinc();
+       icount--;
+
+       if(TMP2 & (1 << ((inst_state >> 4) & 7))) {
+
+               PC += int8_t(TMP);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::bit_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       do_bit(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::bit_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       do_bit(read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::bit_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(A & TMP)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::bit_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(A & TMP)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::bit_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_bit(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::bit_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_bit(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::bra_rel_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+       }
+
+       PC += int8_t(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::bra_rel_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read_pc_noinc();
+       icount--;
+
+       if(page_changing(PC, int8_t(TMP))) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read_arg(set_l(PC, PC+int8_t(TMP)));
+       icount--;
+
+       }
+
+       PC += int8_t(TMP);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::brk_c_imp_full()
+{
+
+       if(irq_taken || nmi_state) {
+
+       if(icount == 0) { inst_substate = 1; return; }
+               read_pc_noinc();
+       icount--;
+
+       } else {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc();
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(SP, PC >> 8);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(SP, PC);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(SP, irq_taken || nmi_state ? P & ~F_B : P);
+       icount--;
+
+       dec_SP();
+
+       if(irq_taken && nmi_state) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+               PC = read_arg(0xfffa);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+               PC = set_h(PC, read_arg(0xfffb));
+       icount--;
+
+               nmi_state = false;
+
+               standard_irq_callback(NMI_LINE);
+
+       } else {
+
+       if(icount == 0) { inst_substate = 8; return; }
+               PC = read_arg(0xfffe);
+       icount--;
+
+       if(icount == 0) { inst_substate = 9; return; }
+               PC = set_h(PC, read_arg(0xffff));
+       icount--;
+
+               if(irq_taken)
+
+                       standard_irq_callback(IRQ_LINE);
+
+       }
+
+       irq_taken = false;
+
+       P = (P | F_I) & ~F_D; // Do *not* move after the prefetch
+
+       if(icount == 0) { inst_substate = 10; return; }
+       prefetch();
+       icount--;
+
+       inst_state = -1;
+
+}
+
+void m65c02_device::brk_c_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(irq_taken || nmi_state) {
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+               read_pc_noinc();
+       icount--;
+
+       } else {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc();
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(SP, PC >> 8);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(SP, PC);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(SP, irq_taken || nmi_state ? P & ~F_B : P);
+       icount--;
+
+       dec_SP();
+
+       if(irq_taken && nmi_state) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+               PC = read_arg(0xfffa);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+               PC = set_h(PC, read_arg(0xfffb));
+       icount--;
+
+               nmi_state = false;
+
+               standard_irq_callback(NMI_LINE);
+
+       } else {
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+               PC = read_arg(0xfffe);
+       icount--;
+
+       if(icount == 0) { inst_substate = 9; return; }
+case 9:
+               PC = set_h(PC, read_arg(0xffff));
+       icount--;
+
+               if(irq_taken)
+
+                       standard_irq_callback(IRQ_LINE);
+
+       }
+
+       irq_taken = false;
+
+       P = (P | F_I) & ~F_D; // Do *not* move after the prefetch
+
+       if(icount == 0) { inst_substate = 10; return; }
+case 10:
+       prefetch();
+       icount--;
+
+       inst_state = -1;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::cmp_zpi_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       do_cmp(A, read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::cmp_zpi_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       do_cmp(A, read(TMP));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::dec_acc_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       A--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::dec_acc_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       A--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::eor_zpi_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::eor_zpi_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A ^= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::inc_acc_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       A++;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::inc_acc_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       A++;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::jmp_iax_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       PC = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       PC = set_h(PC, read(TMP+1));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::jmp_iax_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       PC = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       PC = set_h(PC, read(TMP+1));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::jmp_c_ind_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       PC = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read(set_l(TMP, TMP+1));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       PC = set_h(PC, read(TMP+1));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::jmp_c_ind_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       PC = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read(set_l(TMP, TMP+1));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       PC = set_h(PC, read(TMP+1));
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::lda_zpi_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::lda_zpi_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A = read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::lsr_c_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::lsr_c_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_lsr(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::nop_c_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::nop_c_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::nop_c_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 8; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::nop_c_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 8; return; }
+case 8:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::nop_c_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::nop_c_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::ora_zpi_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::ora_zpi_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       A |= read(TMP);
+       icount--;
+
+       set_nz(A);
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::phx_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       write(SP, X);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::phx_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       write(SP, X);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::phy_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       write(SP, Y);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::phy_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       write(SP, Y);
+       icount--;
+
+       dec_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::plx_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       X = read(SP);
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::plx_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       X = read(SP);
+       icount--;
+
+       set_nz(X);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::ply_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+       Y = read(SP);
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::ply_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(SP);
+       icount--;
+
+       inc_SP();
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       Y = read(SP);
+       icount--;
+
+       set_nz(Y);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::rmb_bzp_full()
+{
+
+       // Access pattern unknown but probable (built upon inc_zpg)
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 &= ~(1 << ((inst_state >> 4) & 7));
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::rmb_bzp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       // Access pattern unknown but probable (built upon inc_zpg)
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 &= ~(1 << ((inst_state >> 4) & 7));
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::rol_c_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::rol_c_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_rol(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::ror_c_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::ror_c_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 = do_ror(TMP2);
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sbc_c_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sbc_c_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sbc_c_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sbc_c_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, X)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+X));
+       icount--;
+
+       }
+
+       TMP += X;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sbc_c_aby_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sbc_c_aby_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       TMP += Y;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sbc_c_idx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_sbc(read(TMP));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sbc_c_idx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP2);
+       icount--;
+
+       TMP2 += X;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_sbc(read(TMP));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sbc_c_idy_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       do_sbc(read(TMP+Y));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 7; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sbc_c_idy_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(page_changing(TMP, Y)) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read(set_l(TMP, TMP+Y));
+       icount--;
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       do_sbc(read(TMP+Y));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 7; return; }
+case 7:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sbc_c_imm_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sbc_c_imm_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sbc_c_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sbc_c_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP);
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sbc_c_zpi_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       do_sbc(read(TMP));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sbc_c_zpi_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       do_sbc(read(TMP));
+       icount--;
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sbc_c_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sbc_c_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = read(uint8_t(TMP+X));
+       icount--;
+
+       do_sbc(TMP);
+
+       if(P & F_D) {
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+               read_pc_noinc();
+       icount--;
+
+               set_nz(A);
+
+       }
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::smb_bzp_full()
+{
+
+       // Access pattern unknown but probable (built upon inc_zpg)
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 |= 1 << ((inst_state >> 4) & 7);
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::smb_bzp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       // Access pattern unknown but probable (built upon inc_zpg)
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       TMP2 |= 1 << ((inst_state >> 4) & 7);
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::sta_zpi_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::sta_zpi_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP2 = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = read(TMP2 & 0xff);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP = set_h(TMP, read((TMP2+1) & 0xff));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, A);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::stp_imp_full()
+{
+
+       for(;;) {
+
+       icount=0; inst_substate = 1; return;
+
+       }
+
+}
+
+void m65c02_device::stp_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       for(;;) {
+
+       icount=0; inst_substate = 1; return;
+case 1:;
+
+       }
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::stz_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, 0x00);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::stz_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, 0x00);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::stz_abx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP+X, 0x00);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::stz_abx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       read(set_l(TMP, TMP+X));
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP+X, 0x00);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::stz_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       write(TMP, 0x00);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::stz_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       write(TMP, 0x00);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::stz_zpx_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(uint8_t(TMP+X), 0x00);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::stz_zpx_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(uint8_t(TMP+X), 0x00);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::trb_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(A & TMP2)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       TMP2 &= ~A;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::trb_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(A & TMP2)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       TMP2 &= ~A;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::trb_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(A & TMP2)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       TMP2 &= ~A;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::trb_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       if(A & TMP2)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       TMP2 &= ~A;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::tsb_aba_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(A & TMP2)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       TMP2 |= A;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::tsb_aba_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP = set_h(TMP, read_pc());
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(A & TMP2)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       TMP2 |= A;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 6; return; }
+case 6:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::tsb_zpg_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(A & TMP2)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       TMP2 |= A;
+
+       if(icount == 0) { inst_substate = 4; return; }
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::tsb_zpg_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       TMP = read_pc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       TMP2 = read(TMP);
+       icount--;
+
+       if(icount == 0) { inst_substate = 3; return; }
+case 3:
+       write(TMP, TMP2);
+       icount--;
+
+       if(A & TMP2)
+
+               P &= ~F_Z;
+
+       else
+
+               P |= F_Z;
+
+       TMP2 |= A;
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       write(TMP, TMP2);
+       icount--;
+
+       if(icount == 0) { inst_substate = 5; return; }
+case 5:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+void m65c02_device::wai_imp_full()
+{
+
+       if(icount == 0) { inst_substate = 1; return; }
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+       read_pc_noinc();
+       icount--;
+
+       while(!nmi_state && !irq_state) {
+
+       icount=0; inst_substate = 3; return;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+       prefetch();
+       icount--;
+
+}
+
+void m65c02_device::wai_imp_partial()
+{
+switch(inst_substate) {
+case 0:
+
+       if(icount == 0) { inst_substate = 1; return; }
+case 1:
+       read_pc_noinc();
+       icount--;
+
+       if(icount == 0) { inst_substate = 2; return; }
+case 2:
+       read_pc_noinc();
+       icount--;
+
+       while(!nmi_state && !irq_state) {
+
+       icount=0; inst_substate = 3; return;
+case 3:;
+
+       }
+
+       if(icount == 0) { inst_substate = 4; return; }
+case 4:
+       prefetch();
+       icount--;
+
+}
+       inst_substate = 0;
+}
+
+
+
+
+void m65c02_device::do_exec_full()
+{
+       switch(inst_state) {
+
+       case 0x00: brk_c_imp_full(); break;
+       case 0x01: ora_idx_full(); break;
+       case 0x02: nop_imm_full(); break;
+       case 0x03: nop_c_imp_full(); break;
+       case 0x04: tsb_zpg_full(); break;
+       case 0x05: ora_zpg_full(); break;
+       case 0x06: asl_zpg_full(); break;
+       case 0x07: nop_c_imp_full(); break;
+       case 0x08: php_imp_full(); break;
+       case 0x09: ora_imm_full(); break;
+       case 0x0a: asl_acc_full(); break;
+       case 0x0b: nop_c_imp_full(); break;
+       case 0x0c: tsb_aba_full(); break;
+       case 0x0d: ora_aba_full(); break;
+       case 0x0e: asl_aba_full(); break;
+       case 0x0f: nop_c_imp_full(); break;
+       case 0x10: bpl_rel_full(); break;
+       case 0x11: ora_idy_full(); break;
+       case 0x12: ora_zpi_full(); break;
+       case 0x13: nop_c_imp_full(); break;
+       case 0x14: trb_zpg_full(); break;
+       case 0x15: ora_zpx_full(); break;
+       case 0x16: asl_zpx_full(); break;
+       case 0x17: nop_c_imp_full(); break;
+       case 0x18: clc_imp_full(); break;
+       case 0x19: ora_aby_full(); break;
+       case 0x1a: inc_acc_full(); break;
+       case 0x1b: nop_c_imp_full(); break;
+       case 0x1c: trb_aba_full(); break;
+       case 0x1d: ora_abx_full(); break;
+       case 0x1e: asl_c_abx_full(); break;
+       case 0x1f: nop_c_imp_full(); break;
+       case 0x20: jsr_adr_full(); break;
+       case 0x21: and_idx_full(); break;
+       case 0x22: nop_imm_full(); break;
+       case 0x23: nop_c_imp_full(); break;
+       case 0x24: bit_zpg_full(); break;
+       case 0x25: and_zpg_full(); break;
+       case 0x26: rol_zpg_full(); break;
+       case 0x27: nop_c_imp_full(); break;
+       case 0x28: plp_imp_full(); break;
+       case 0x29: and_imm_full(); break;
+       case 0x2a: rol_acc_full(); break;
+       case 0x2b: nop_c_imp_full(); break;
+       case 0x2c: bit_aba_full(); break;
+       case 0x2d: and_aba_full(); break;
+       case 0x2e: rol_aba_full(); break;
+       case 0x2f: nop_c_imp_full(); break;
+       case 0x30: bmi_rel_full(); break;
+       case 0x31: and_idy_full(); break;
+       case 0x32: and_zpi_full(); break;
+       case 0x33: nop_c_imp_full(); break;
+       case 0x34: bit_zpx_full(); break;
+       case 0x35: and_zpx_full(); break;
+       case 0x36: rol_zpx_full(); break;
+       case 0x37: nop_c_imp_full(); break;
+       case 0x38: sec_imp_full(); break;
+       case 0x39: and_aby_full(); break;
+       case 0x3a: dec_acc_full(); break;
+       case 0x3b: nop_c_imp_full(); break;
+       case 0x3c: bit_abx_full(); break;
+       case 0x3d: and_abx_full(); break;
+       case 0x3e: rol_c_abx_full(); break;
+       case 0x3f: nop_c_imp_full(); break;
+       case 0x40: rti_imp_full(); break;
+       case 0x41: eor_idx_full(); break;
+       case 0x42: nop_imm_full(); break;
+       case 0x43: nop_c_imp_full(); break;
+       case 0x44: nop_zpg_full(); break;
+       case 0x45: eor_zpg_full(); break;
+       case 0x46: lsr_zpg_full(); break;
+       case 0x47: nop_c_imp_full(); break;
+       case 0x48: pha_imp_full(); break;
+       case 0x49: eor_imm_full(); break;
+       case 0x4a: lsr_acc_full(); break;
+       case 0x4b: nop_c_imp_full(); break;
+       case 0x4c: jmp_adr_full(); break;
+       case 0x4d: eor_aba_full(); break;
+       case 0x4e: lsr_aba_full(); break;
+       case 0x4f: nop_c_imp_full(); break;
+       case 0x50: bvc_rel_full(); break;
+       case 0x51: eor_idy_full(); break;
+       case 0x52: eor_zpi_full(); break;
+       case 0x53: nop_c_imp_full(); break;
+       case 0x54: nop_zpx_full(); break;
+       case 0x55: eor_zpx_full(); break;
+       case 0x56: lsr_zpx_full(); break;
+       case 0x57: nop_c_imp_full(); break;
+       case 0x58: cli_imp_full(); break;
+       case 0x59: eor_aby_full(); break;
+       case 0x5a: phy_imp_full(); break;
+       case 0x5b: nop_c_imp_full(); break;
+       case 0x5c: nop_c_aba_full(); break;
+       case 0x5d: eor_abx_full(); break;
+       case 0x5e: lsr_c_abx_full(); break;
+       case 0x5f: nop_c_imp_full(); break;
+       case 0x60: rts_imp_full(); break;
+       case 0x61: adc_c_idx_full(); break;
+       case 0x62: nop_imm_full(); break;
+       case 0x63: nop_c_imp_full(); break;
+       case 0x64: stz_zpg_full(); break;
+       case 0x65: adc_c_zpg_full(); break;
+       case 0x66: ror_zpg_full(); break;
+       case 0x67: nop_c_imp_full(); break;
+       case 0x68: pla_imp_full(); break;
+       case 0x69: adc_c_imm_full(); break;
+       case 0x6a: ror_acc_full(); break;
+       case 0x6b: nop_c_imp_full(); break;
+       case 0x6c: jmp_c_ind_full(); break;
+       case 0x6d: adc_c_aba_full(); break;
+       case 0x6e: ror_aba_full(); break;
+       case 0x6f: nop_c_imp_full(); break;
+       case 0x70: bvs_rel_full(); break;
+       case 0x71: adc_c_idy_full(); break;
+       case 0x72: adc_c_zpi_full(); break;
+       case 0x73: nop_c_imp_full(); break;
+       case 0x74: stz_zpx_full(); break;
+       case 0x75: adc_c_zpx_full(); break;
+       case 0x76: ror_zpx_full(); break;
+       case 0x77: nop_c_imp_full(); break;
+       case 0x78: sei_imp_full(); break;
+       case 0x79: adc_c_aby_full(); break;
+       case 0x7a: ply_imp_full(); break;
+       case 0x7b: nop_c_imp_full(); break;
+       case 0x7c: jmp_iax_full(); break;
+       case 0x7d: adc_c_abx_full(); break;
+       case 0x7e: ror_c_abx_full(); break;
+       case 0x7f: nop_c_imp_full(); break;
+       case 0x80: bra_rel_full(); break;
+       case 0x81: sta_idx_full(); break;
+       case 0x82: nop_imm_full(); break;
+       case 0x83: nop_c_imp_full(); break;
+       case 0x84: sty_zpg_full(); break;
+       case 0x85: sta_zpg_full(); break;
+       case 0x86: stx_zpg_full(); break;
+       case 0x87: nop_c_imp_full(); break;
+       case 0x88: dey_imp_full(); break;
+       case 0x89: bit_imm_full(); break;
+       case 0x8a: txa_imp_full(); break;
+       case 0x8b: nop_c_imp_full(); break;
+       case 0x8c: sty_aba_full(); break;
+       case 0x8d: sta_aba_full(); break;
+       case 0x8e: stx_aba_full(); break;
+       case 0x8f: nop_c_imp_full(); break;
+       case 0x90: bcc_rel_full(); break;
+       case 0x91: sta_idy_full(); break;
+       case 0x92: sta_zpi_full(); break;
+       case 0x93: nop_c_imp_full(); break;
+       case 0x94: sty_zpx_full(); break;
+       case 0x95: sta_zpx_full(); break;
+       case 0x96: stx_zpy_full(); break;
+       case 0x97: nop_c_imp_full(); break;
+       case 0x98: tya_imp_full(); break;
+       case 0x99: sta_aby_full(); break;
+       case 0x9a: txs_imp_full(); break;
+       case 0x9b: nop_c_imp_full(); break;
+       case 0x9c: stz_aba_full(); break;
+       case 0x9d: sta_abx_full(); break;
+       case 0x9e: stz_abx_full(); break;
+       case 0x9f: nop_c_imp_full(); break;
+       case 0xa0: ldy_imm_full(); break;
+       case 0xa1: lda_idx_full(); break;
+       case 0xa2: ldx_imm_full(); break;
+       case 0xa3: nop_c_imp_full(); break;
+       case 0xa4: ldy_zpg_full(); break;
+       case 0xa5: lda_zpg_full(); break;
+       case 0xa6: ldx_zpg_full(); break;
+       case 0xa7: nop_c_imp_full(); break;
+       case 0xa8: tay_imp_full(); break;
+       case 0xa9: lda_imm_full(); break;
+       case 0xaa: tax_imp_full(); break;
+       case 0xab: nop_c_imp_full(); break;
+       case 0xac: ldy_aba_full(); break;
+       case 0xad: lda_aba_full(); break;
+       case 0xae: ldx_aba_full(); break;
+       case 0xaf: nop_c_imp_full(); break;
+       case 0xb0: bcs_rel_full(); break;
+       case 0xb1: lda_idy_full(); break;
+       case 0xb2: lda_zpi_full(); break;
+       case 0xb3: nop_c_imp_full(); break;
+       case 0xb4: ldy_zpx_full(); break;
+       case 0xb5: lda_zpx_full(); break;
+       case 0xb6: ldx_zpy_full(); break;
+       case 0xb7: nop_c_imp_full(); break;
+       case 0xb8: clv_imp_full(); break;
+       case 0xb9: lda_aby_full(); break;
+       case 0xba: tsx_imp_full(); break;
+       case 0xbb: nop_c_imp_full(); break;
+       case 0xbc: ldy_abx_full(); break;
+       case 0xbd: lda_abx_full(); break;
+       case 0xbe: ldx_aby_full(); break;
+       case 0xbf: nop_c_imp_full(); break;
+       case 0xc0: cpy_imm_full(); break;
+       case 0xc1: cmp_idx_full(); break;
+       case 0xc2: nop_imm_full(); break;
+       case 0xc3: nop_c_imp_full(); break;
+       case 0xc4: cpy_zpg_full(); break;
+       case 0xc5: cmp_zpg_full(); break;
+       case 0xc6: dec_zpg_full(); break;
+       case 0xc7: nop_c_imp_full(); break;
+       case 0xc8: iny_imp_full(); break;
+       case 0xc9: cmp_imm_full(); break;
+       case 0xca: dex_imp_full(); break;
+       case 0xcb: nop_c_imp_full(); break;
+       case 0xcc: cpy_aba_full(); break;
+       case 0xcd: cmp_aba_full(); break;
+       case 0xce: dec_aba_full(); break;
+       case 0xcf: nop_c_imp_full(); break;
+       case 0xd0: bne_rel_full(); break;
+       case 0xd1: cmp_idy_full(); break;
+       case 0xd2: cmp_zpi_full(); break;
+       case 0xd3: nop_c_imp_full(); break;
+       case 0xd4: nop_zpx_full(); break;
+       case 0xd5: cmp_zpx_full(); break;
+       case 0xd6: dec_zpx_full(); break;
+       case 0xd7: nop_c_imp_full(); break;
+       case 0xd8: cld_imp_full(); break;
+       case 0xd9: cmp_aby_full(); break;
+       case 0xda: phx_imp_full(); break;
+       case 0xdb: nop_c_imp_full(); break;
+       case 0xdc: nop_c_abx_full(); break;
+       case 0xdd: cmp_abx_full(); break;
+       case 0xde: dec_abx_full(); break;
+       case 0xdf: nop_c_imp_full(); break;
+       case 0xe0: cpx_imm_full(); break;
+       case 0xe1: sbc_c_idx_full(); break;
+       case 0xe2: nop_imm_full(); break;
+       case 0xe3: nop_c_imp_full(); break;
+       case 0xe4: cpx_zpg_full(); break;
+       case 0xe5: sbc_c_zpg_full(); break;
+       case 0xe6: inc_zpg_full(); break;
+       case 0xe7: nop_c_imp_full(); break;
+       case 0xe8: inx_imp_full(); break;
+       case 0xe9: sbc_c_imm_full(); break;
+       case 0xea: nop_imp_full(); break;
+       case 0xeb: nop_c_imp_full(); break;
+       case 0xec: cpx_aba_full(); break;
+       case 0xed: sbc_c_aba_full(); break;
+       case 0xee: inc_aba_full(); break;
+       case 0xef: nop_c_imp_full(); break;
+       case 0xf0: beq_rel_full(); break;
+       case 0xf1: sbc_c_idy_full(); break;
+       case 0xf2: sbc_c_zpi_full(); break;
+       case 0xf3: nop_c_imp_full(); break;
+       case 0xf4: nop_zpx_full(); break;
+       case 0xf5: sbc_c_zpx_full(); break;
+       case 0xf6: inc_zpx_full(); break;
+       case 0xf7: nop_c_imp_full(); break;
+       case 0xf8: sed_imp_full(); break;
+       case 0xf9: sbc_c_aby_full(); break;
+       case 0xfa: plx_imp_full(); break;
+       case 0xfb: nop_c_imp_full(); break;
+       case 0xfc: nop_c_abx_full(); break;
+       case 0xfd: sbc_c_abx_full(); break;
+       case 0xfe: inc_abx_full(); break;
+       case 0xff: nop_c_imp_full(); break;
+       case STATE_RESET: reset_full(); break;
+       }
+}
+
+void m65c02_device::do_exec_partial()
+{
+       switch(inst_state) {
+
+       case 0x00: brk_c_imp_partial(); break;
+       case 0x01: ora_idx_partial(); break;
+       case 0x02: nop_imm_partial(); break;
+       case 0x03: nop_c_imp_partial(); break;
+       case 0x04: tsb_zpg_partial(); break;
+       case 0x05: ora_zpg_partial(); break;
+       case 0x06: asl_zpg_partial(); break;
+       case 0x07: nop_c_imp_partial(); break;
+       case 0x08: php_imp_partial(); break;
+       case 0x09: ora_imm_partial(); break;
+       case 0x0a: asl_acc_partial(); break;
+       case 0x0b: nop_c_imp_partial(); break;
+       case 0x0c: tsb_aba_partial(); break;
+       case 0x0d: ora_aba_partial(); break;
+       case 0x0e: asl_aba_partial(); break;
+       case 0x0f: nop_c_imp_partial(); break;
+       case 0x10: bpl_rel_partial(); break;
+       case 0x11: ora_idy_partial(); break;
+       case 0x12: ora_zpi_partial(); break;
+       case 0x13: nop_c_imp_partial(); break;
+       case 0x14: trb_zpg_partial(); break;
+       case 0x15: ora_zpx_partial(); break;
+       case 0x16: asl_zpx_partial(); break;
+       case 0x17: nop_c_imp_partial(); break;
+       case 0x18: clc_imp_partial(); break;
+       case 0x19: ora_aby_partial(); break;
+       case 0x1a: inc_acc_partial(); break;
+       case 0x1b: nop_c_imp_partial(); break;
+       case 0x1c: trb_aba_partial(); break;
+       case 0x1d: ora_abx_partial(); break;
+       case 0x1e: asl_c_abx_partial(); break;
+       case 0x1f: nop_c_imp_partial(); break;
+       case 0x20: jsr_adr_partial(); break;
+       case 0x21: and_idx_partial(); break;
+       case 0x22: nop_imm_partial(); break;
+       case 0x23: nop_c_imp_partial(); break;
+       case 0x24: bit_zpg_partial(); break;
+       case 0x25: and_zpg_partial(); break;
+       case 0x26: rol_zpg_partial(); break;
+       case 0x27: nop_c_imp_partial(); break;
+       case 0x28: plp_imp_partial(); break;
+       case 0x29: and_imm_partial(); break;
+       case 0x2a: rol_acc_partial(); break;
+       case 0x2b: nop_c_imp_partial(); break;
+       case 0x2c: bit_aba_partial(); break;
+       case 0x2d: and_aba_partial(); break;
+       case 0x2e: rol_aba_partial(); break;
+       case 0x2f: nop_c_imp_partial(); break;
+       case 0x30: bmi_rel_partial(); break;
+       case 0x31: and_idy_partial(); break;
+       case 0x32: and_zpi_partial(); break;
+       case 0x33: nop_c_imp_partial(); break;
+       case 0x34: bit_zpx_partial(); break;
+       case 0x35: and_zpx_partial(); break;
+       case 0x36: rol_zpx_partial(); break;
+       case 0x37: nop_c_imp_partial(); break;
+       case 0x38: sec_imp_partial(); break;
+       case 0x39: and_aby_partial(); break;
+       case 0x3a: dec_acc_partial(); break;
+       case 0x3b: nop_c_imp_partial(); break;
+       case 0x3c: bit_abx_partial(); break;
+       case 0x3d: and_abx_partial(); break;
+       case 0x3e: rol_c_abx_partial(); break;
+       case 0x3f: nop_c_imp_partial(); break;
+       case 0x40: rti_imp_partial(); break;
+       case 0x41: eor_idx_partial(); break;
+       case 0x42: nop_imm_partial(); break;
+       case 0x43: nop_c_imp_partial(); break;
+       case 0x44: nop_zpg_partial(); break;
+       case 0x45: eor_zpg_partial(); break;
+       case 0x46: lsr_zpg_partial(); break;
+       case 0x47: nop_c_imp_partial(); break;
+       case 0x48: pha_imp_partial(); break;
+       case 0x49: eor_imm_partial(); break;
+       case 0x4a: lsr_acc_partial(); break;
+       case 0x4b: nop_c_imp_partial(); break;
+       case 0x4c: jmp_adr_partial(); break;
+       case 0x4d: eor_aba_partial(); break;
+       case 0x4e: lsr_aba_partial(); break;
+       case 0x4f: nop_c_imp_partial(); break;
+       case 0x50: bvc_rel_partial(); break;
+       case 0x51: eor_idy_partial(); break;
+       case 0x52: eor_zpi_partial(); break;
+       case 0x53: nop_c_imp_partial(); break;
+       case 0x54: nop_zpx_partial(); break;
+       case 0x55: eor_zpx_partial(); break;
+       case 0x56: lsr_zpx_partial(); break;
+       case 0x57: nop_c_imp_partial(); break;
+       case 0x58: cli_imp_partial(); break;
+       case 0x59: eor_aby_partial(); break;
+       case 0x5a: phy_imp_partial(); break;
+       case 0x5b: nop_c_imp_partial(); break;
+       case 0x5c: nop_c_aba_partial(); break;
+       case 0x5d: eor_abx_partial(); break;
+       case 0x5e: lsr_c_abx_partial(); break;
+       case 0x5f: nop_c_imp_partial(); break;
+       case 0x60: rts_imp_partial(); break;
+       case 0x61: adc_c_idx_partial(); break;
+       case 0x62: nop_imm_partial(); break;
+       case 0x63: nop_c_imp_partial(); break;
+       case 0x64: stz_zpg_partial(); break;
+       case 0x65: adc_c_zpg_partial(); break;
+       case 0x66: ror_zpg_partial(); break;
+       case 0x67: nop_c_imp_partial(); break;
+       case 0x68: pla_imp_partial(); break;
+       case 0x69: adc_c_imm_partial(); break;
+       case 0x6a: ror_acc_partial(); break;
+       case 0x6b: nop_c_imp_partial(); break;
+       case 0x6c: jmp_c_ind_partial(); break;
+       case 0x6d: adc_c_aba_partial(); break;
+       case 0x6e: ror_aba_partial(); break;
+       case 0x6f: nop_c_imp_partial(); break;
+       case 0x70: bvs_rel_partial(); break;
+       case 0x71: adc_c_idy_partial(); break;
+       case 0x72: adc_c_zpi_partial(); break;
+       case 0x73: nop_c_imp_partial(); break;
+       case 0x74: stz_zpx_partial(); break;
+       case 0x75: adc_c_zpx_partial(); break;
+       case 0x76: ror_zpx_partial(); break;
+       case 0x77: nop_c_imp_partial(); break;
+       case 0x78: sei_imp_partial(); break;
+       case 0x79: adc_c_aby_partial(); break;
+       case 0x7a: ply_imp_partial(); break;
+       case 0x7b: nop_c_imp_partial(); break;
+       case 0x7c: jmp_iax_partial(); break;
+       case 0x7d: adc_c_abx_partial(); break;
+       case 0x7e: ror_c_abx_partial(); break;
+       case 0x7f: nop_c_imp_partial(); break;
+       case 0x80: bra_rel_partial(); break;
+       case 0x81: sta_idx_partial(); break;
+       case 0x82: nop_imm_partial(); break;
+       case 0x83: nop_c_imp_partial(); break;
+       case 0x84: sty_zpg_partial(); break;
+       case 0x85: sta_zpg_partial(); break;
+       case 0x86: stx_zpg_partial(); break;
+       case 0x87: nop_c_imp_partial(); break;
+       case 0x88: dey_imp_partial(); break;
+       case 0x89: bit_imm_partial(); break;
+       case 0x8a: txa_imp_partial(); break;
+       case 0x8b: nop_c_imp_partial(); break;
+       case 0x8c: sty_aba_partial(); break;
+       case 0x8d: sta_aba_partial(); break;
+       case 0x8e: stx_aba_partial(); break;
+       case 0x8f: nop_c_imp_partial(); break;
+       case 0x90: bcc_rel_partial(); break;
+       case 0x91: sta_idy_partial(); break;
+       case 0x92: sta_zpi_partial(); break;
+       case 0x93: nop_c_imp_partial(); break;
+       case 0x94: sty_zpx_partial(); break;
+       case 0x95: sta_zpx_partial(); break;
+       case 0x96: stx_zpy_partial(); break;
+       case 0x97: nop_c_imp_partial(); break;
+       case 0x98: tya_imp_partial(); break;
+       case 0x99: sta_aby_partial(); break;
+       case 0x9a: txs_imp_partial(); break;
+       case 0x9b: nop_c_imp_partial(); break;
+       case 0x9c: stz_aba_partial(); break;
+       case 0x9d: sta_abx_partial(); break;
+       case 0x9e: stz_abx_partial(); break;
+       case 0x9f: nop_c_imp_partial(); break;
+       case 0xa0: ldy_imm_partial(); break;
+       case 0xa1: lda_idx_partial(); break;
+       case 0xa2: ldx_imm_partial(); break;
+       case 0xa3: nop_c_imp_partial(); break;
+       case 0xa4: ldy_zpg_partial(); break;
+       case 0xa5: lda_zpg_partial(); break;
+       case 0xa6: ldx_zpg_partial(); break;
+       case 0xa7: nop_c_imp_partial(); break;
+       case 0xa8: tay_imp_partial(); break;
+       case 0xa9: lda_imm_partial(); break;
+       case 0xaa: tax_imp_partial(); break;
+       case 0xab: nop_c_imp_partial(); break;
+       case 0xac: ldy_aba_partial(); break;
+       case 0xad: lda_aba_partial(); break;
+       case 0xae: ldx_aba_partial(); break;
+       case 0xaf: nop_c_imp_partial(); break;
+       case 0xb0: bcs_rel_partial(); break;
+       case 0xb1: lda_idy_partial(); break;
+       case 0xb2: lda_zpi_partial(); break;
+       case 0xb3: nop_c_imp_partial(); break;
+       case 0xb4: ldy_zpx_partial(); break;
+       case 0xb5: lda_zpx_partial(); break;
+       case 0xb6: ldx_zpy_partial(); break;
+       case 0xb7: nop_c_imp_partial(); break;
+       case 0xb8: clv_imp_partial(); break;
+       case 0xb9: lda_aby_partial(); break;
+       case 0xba: tsx_imp_partial(); break;
+       case 0xbb: nop_c_imp_partial(); break;
+       case 0xbc: ldy_abx_partial(); break;
+       case 0xbd: lda_abx_partial(); break;
+       case 0xbe: ldx_aby_partial(); break;
+       case 0xbf: nop_c_imp_partial(); break;
+       case 0xc0: cpy_imm_partial(); break;
+       case 0xc1: cmp_idx_partial(); break;
+       case 0xc2: nop_imm_partial(); break;
+       case 0xc3: nop_c_imp_partial(); break;
+       case 0xc4: cpy_zpg_partial(); break;
+       case 0xc5: cmp_zpg_partial(); break;
+       case 0xc6: dec_zpg_partial(); break;
+       case 0xc7: nop_c_imp_partial(); break;
+       case 0xc8: iny_imp_partial(); break;
+       case 0xc9: cmp_imm_partial(); break;
+       case 0xca: dex_imp_partial(); break;
+       case 0xcb: nop_c_imp_partial(); break;
+       case 0xcc: cpy_aba_partial(); break;
+       case 0xcd: cmp_aba_partial(); break;
+       case 0xce: dec_aba_partial(); break;
+       case 0xcf: nop_c_imp_partial(); break;
+       case 0xd0: bne_rel_partial(); break;
+       case 0xd1: cmp_idy_partial(); break;
+       case 0xd2: cmp_zpi_partial(); break;
+       case 0xd3: nop_c_imp_partial(); break;
+       case 0xd4: nop_zpx_partial(); break;
+       case 0xd5: cmp_zpx_partial(); break;
+       case 0xd6: dec_zpx_partial(); break;
+       case 0xd7: nop_c_imp_partial(); break;
+       case 0xd8: cld_imp_partial(); break;
+       case 0xd9: cmp_aby_partial(); break;
+       case 0xda: phx_imp_partial(); break;
+       case 0xdb: nop_c_imp_partial(); break;
+       case 0xdc: nop_c_abx_partial(); break;
+       case 0xdd: cmp_abx_partial(); break;
+       case 0xde: dec_abx_partial(); break;
+       case 0xdf: nop_c_imp_partial(); break;
+       case 0xe0: cpx_imm_partial(); break;
+       case 0xe1: sbc_c_idx_partial(); break;
+       case 0xe2: nop_imm_partial(); break;
+       case 0xe3: nop_c_imp_partial(); break;
+       case 0xe4: cpx_zpg_partial(); break;
+       case 0xe5: sbc_c_zpg_partial(); break;
+       case 0xe6: inc_zpg_partial(); break;
+       case 0xe7: nop_c_imp_partial(); break;
+       case 0xe8: inx_imp_partial(); break;
+       case 0xe9: sbc_c_imm_partial(); break;
+       case 0xea: nop_imp_partial(); break;
+       case 0xeb: nop_c_imp_partial(); break;
+       case 0xec: cpx_aba_partial(); break;
+       case 0xed: sbc_c_aba_partial(); break;
+       case 0xee: inc_aba_partial(); break;
+       case 0xef: nop_c_imp_partial(); break;
+       case 0xf0: beq_rel_partial(); break;
+       case 0xf1: sbc_c_idy_partial(); break;
+       case 0xf2: sbc_c_zpi_partial(); break;
+       case 0xf3: nop_c_imp_partial(); break;
+       case 0xf4: nop_zpx_partial(); break;
+       case 0xf5: sbc_c_zpx_partial(); break;
+       case 0xf6: inc_zpx_partial(); break;
+       case 0xf7: nop_c_imp_partial(); break;
+       case 0xf8: sed_imp_partial(); break;
+       case 0xf9: sbc_c_aby_partial(); break;
+       case 0xfa: plx_imp_partial(); break;
+       case 0xfb: nop_c_imp_partial(); break;
+       case 0xfc: nop_c_abx_partial(); break;
+       case 0xfd: sbc_c_abx_partial(); break;
+       case 0xfe: inc_abx_partial(); break;
+       case 0xff: nop_c_imp_partial(); break;
+       case STATE_RESET: reset_partial(); break;
+       }
+}
+
diff --git a/m6502/m65c02d.hxx b/m6502/m65c02d.hxx
new file mode 100644 (file)
index 0000000..65a9e0a
--- /dev/null
@@ -0,0 +1,260 @@
+const m65c02_disassembler::disasm_entry m65c02_disassembler::disasm_entries[0x100] = {
+
+       { "brk", DASM_imp, 0 },
+       { "ora", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "tsb", DASM_zpg, 0 },
+       { "ora", DASM_zpg, 0 },
+       { "asl", DASM_zpg, 0 },
+       { "nop", DASM_imp, 0 },
+       { "php", DASM_imp, 0 },
+       { "ora", DASM_imm, 0 },
+       { "asl", DASM_acc, 0 },
+       { "nop", DASM_imp, 0 },
+       { "tsb", DASM_aba, 0 },
+       { "ora", DASM_aba, 0 },
+       { "asl", DASM_aba, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bpl", DASM_rel, 0 },
+       { "ora", DASM_idy, 0 },
+       { "ora", DASM_zpi, 0 },
+       { "nop", DASM_imp, 0 },
+       { "trb", DASM_zpg, 0 },
+       { "ora", DASM_zpx, 0 },
+       { "asl", DASM_zpx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "clc", DASM_imp, 0 },
+       { "ora", DASM_aby, 0 },
+       { "inc", DASM_acc, 0 },
+       { "nop", DASM_imp, 0 },
+       { "trb", DASM_aba, 0 },
+       { "ora", DASM_abx, 0 },
+       { "asl", DASM_abx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "jsr", DASM_adr, STEP_OVER },
+       { "and", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bit", DASM_zpg, 0 },
+       { "and", DASM_zpg, 0 },
+       { "rol", DASM_zpg, 0 },
+       { "nop", DASM_imp, 0 },
+       { "plp", DASM_imp, 0 },
+       { "and", DASM_imm, 0 },
+       { "rol", DASM_acc, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bit", DASM_aba, 0 },
+       { "and", DASM_aba, 0 },
+       { "rol", DASM_aba, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bmi", DASM_rel, 0 },
+       { "and", DASM_idy, 0 },
+       { "and", DASM_zpi, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bit", DASM_zpx, 0 },
+       { "and", DASM_zpx, 0 },
+       { "rol", DASM_zpx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "sec", DASM_imp, 0 },
+       { "and", DASM_aby, 0 },
+       { "dec", DASM_acc, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bit", DASM_abx, 0 },
+       { "and", DASM_abx, 0 },
+       { "rol", DASM_abx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "rti", DASM_imp, STEP_OUT },
+       { "eor", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "nop", DASM_zpg, 0 },
+       { "eor", DASM_zpg, 0 },
+       { "lsr", DASM_zpg, 0 },
+       { "nop", DASM_imp, 0 },
+       { "pha", DASM_imp, 0 },
+       { "eor", DASM_imm, 0 },
+       { "lsr", DASM_acc, 0 },
+       { "nop", DASM_imp, 0 },
+       { "jmp", DASM_adr, 0 },
+       { "eor", DASM_aba, 0 },
+       { "lsr", DASM_aba, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bvc", DASM_rel, 0 },
+       { "eor", DASM_idy, 0 },
+       { "eor", DASM_zpi, 0 },
+       { "nop", DASM_imp, 0 },
+       { "nop", DASM_zpx, 0 },
+       { "eor", DASM_zpx, 0 },
+       { "lsr", DASM_zpx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "cli", DASM_imp, 0 },
+       { "eor", DASM_aby, 0 },
+       { "phy", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "nop", DASM_aba, 0 },
+       { "eor", DASM_abx, 0 },
+       { "lsr", DASM_abx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "rts", DASM_imp, STEP_OUT },
+       { "adc", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "stz", DASM_zpg, 0 },
+       { "adc", DASM_zpg, 0 },
+       { "ror", DASM_zpg, 0 },
+       { "nop", DASM_imp, 0 },
+       { "pla", DASM_imp, 0 },
+       { "adc", DASM_imm, 0 },
+       { "ror", DASM_acc, 0 },
+       { "nop", DASM_imp, 0 },
+       { "jmp", DASM_ind, 0 },
+       { "adc", DASM_aba, 0 },
+       { "ror", DASM_aba, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bvs", DASM_rel, 0 },
+       { "adc", DASM_idy, 0 },
+       { "adc", DASM_zpi, 0 },
+       { "nop", DASM_imp, 0 },
+       { "stz", DASM_zpx, 0 },
+       { "adc", DASM_zpx, 0 },
+       { "ror", DASM_zpx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "sei", DASM_imp, 0 },
+       { "adc", DASM_aby, 0 },
+       { "ply", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "jmp", DASM_iax, 0 },
+       { "adc", DASM_abx, 0 },
+       { "ror", DASM_abx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bra", DASM_rel, 0 },
+       { "sta", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "sty", DASM_zpg, 0 },
+       { "sta", DASM_zpg, 0 },
+       { "stx", DASM_zpg, 0 },
+       { "nop", DASM_imp, 0 },
+       { "dey", DASM_imp, 0 },
+       { "bit", DASM_imm, 0 },
+       { "txa", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "sty", DASM_aba, 0 },
+       { "sta", DASM_aba, 0 },
+       { "stx", DASM_aba, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bcc", DASM_rel, 0 },
+       { "sta", DASM_idy, 0 },
+       { "sta", DASM_zpi, 0 },
+       { "nop", DASM_imp, 0 },
+       { "sty", DASM_zpx, 0 },
+       { "sta", DASM_zpx, 0 },
+       { "stx", DASM_zpy, 0 },
+       { "nop", DASM_imp, 0 },
+       { "tya", DASM_imp, 0 },
+       { "sta", DASM_aby, 0 },
+       { "txs", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "stz", DASM_aba, 0 },
+       { "sta", DASM_abx, 0 },
+       { "stz", DASM_abx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "ldy", DASM_imm, 0 },
+       { "lda", DASM_idx, 0 },
+       { "ldx", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "ldy", DASM_zpg, 0 },
+       { "lda", DASM_zpg, 0 },
+       { "ldx", DASM_zpg, 0 },
+       { "nop", DASM_imp, 0 },
+       { "tay", DASM_imp, 0 },
+       { "lda", DASM_imm, 0 },
+       { "tax", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "ldy", DASM_aba, 0 },
+       { "lda", DASM_aba, 0 },
+       { "ldx", DASM_aba, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bcs", DASM_rel, 0 },
+       { "lda", DASM_idy, 0 },
+       { "lda", DASM_zpi, 0 },
+       { "nop", DASM_imp, 0 },
+       { "ldy", DASM_zpx, 0 },
+       { "lda", DASM_zpx, 0 },
+       { "ldx", DASM_zpy, 0 },
+       { "nop", DASM_imp, 0 },
+       { "clv", DASM_imp, 0 },
+       { "lda", DASM_aby, 0 },
+       { "tsx", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "ldy", DASM_abx, 0 },
+       { "lda", DASM_abx, 0 },
+       { "ldx", DASM_aby, 0 },
+       { "nop", DASM_imp, 0 },
+       { "cpy", DASM_imm, 0 },
+       { "cmp", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "cpy", DASM_zpg, 0 },
+       { "cmp", DASM_zpg, 0 },
+       { "dec", DASM_zpg, 0 },
+       { "nop", DASM_imp, 0 },
+       { "iny", DASM_imp, 0 },
+       { "cmp", DASM_imm, 0 },
+       { "dex", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "cpy", DASM_aba, 0 },
+       { "cmp", DASM_aba, 0 },
+       { "dec", DASM_aba, 0 },
+       { "nop", DASM_imp, 0 },
+       { "bne", DASM_rel, 0 },
+       { "cmp", DASM_idy, 0 },
+       { "cmp", DASM_zpi, 0 },
+       { "nop", DASM_imp, 0 },
+       { "nop", DASM_zpx, 0 },
+       { "cmp", DASM_zpx, 0 },
+       { "dec", DASM_zpx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "cld", DASM_imp, 0 },
+       { "cmp", DASM_aby, 0 },
+       { "phx", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "nop", DASM_abx, 0 },
+       { "cmp", DASM_abx, 0 },
+       { "dec", DASM_abx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "cpx", DASM_imm, 0 },
+       { "sbc", DASM_idx, 0 },
+       { "nop", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "cpx", DASM_zpg, 0 },
+       { "sbc", DASM_zpg, 0 },
+       { "inc", DASM_zpg, 0 },
+       { "nop", DASM_imp, 0 },
+       { "inx", DASM_imp, 0 },
+       { "sbc", DASM_imm, 0 },
+       { "nop", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "cpx", DASM_aba, 0 },
+       { "sbc", DASM_aba, 0 },
+       { "inc", DASM_aba, 0 },
+       { "nop", DASM_imp, 0 },
+       { "beq", DASM_rel, 0 },
+       { "sbc", DASM_idy, 0 },
+       { "sbc", DASM_zpi, 0 },
+       { "nop", DASM_imp, 0 },
+       { "nop", DASM_zpx, 0 },
+       { "sbc", DASM_zpx, 0 },
+       { "inc", DASM_zpx, 0 },
+       { "nop", DASM_imp, 0 },
+       { "sed", DASM_imp, 0 },
+       { "sbc", DASM_aby, 0 },
+       { "plx", DASM_imp, 0 },
+       { "nop", DASM_imp, 0 },
+       { "nop", DASM_abx, 0 },
+       { "sbc", DASM_abx, 0 },
+       { "inc", DASM_abx, 0 },
+       { "nop", DASM_imp, 0 },
+};
+
diff --git a/m6502/n.sh b/m6502/n.sh
new file mode 100755 (executable)
index 0000000..664fbb0
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+./m6502make.py s m6502 om6502.lst dm6502.lst m6502.hxx
+./m6502make.py d m6502 om6502.lst dm6502.lst m6502d.hxx
+./m6502make.py s m65c02 om65c02.lst dm65c02.lst m65c02.hxx
+./m6502make.py d m65c02 om65c02.lst dm65c02.lst m65c02d.hxx