/*Snem 0.1 by Tom Walker 65816 emulation*/ #include #include "snes.h" void updatecpumode(); int inwai=0; reg a,x,y,s; unsigned long pbr,dbr; unsigned short pc,dp; int skipz,setzf; int ins; extern int output; extern int timetolive; void (*opcodes[256][5])(); int cpumode; /*Current opcode*/ unsigned char global_opcode; /*Global cycles count*/ int cycles; CPU_P p; /*Temporary variables*/ unsigned long addr; /*Addressing modes*/ static inline unsigned long absolute() { unsigned long temp=readmemw(pbr|pc); pc+=2; return temp|dbr; } static inline unsigned long absolutex() { unsigned long temp=(readmemw(pbr|pc))+x.w+dbr; pc+=2; return temp; } static inline unsigned long absolutey() { unsigned long temp=(readmemw(pbr|pc))+y.w+dbr; pc+=2; return temp; } static inline unsigned long absolutelong() { unsigned long temp=readmemw(pbr|pc); pc+=2; temp|=(snes_readmem(pbr|pc)<<16); pc++; return temp; } static inline unsigned long absolutelongx() { unsigned long temp=(readmemw(pbr|pc))+x.w; pc+=2; temp+=(snes_readmem(pbr|pc)<<16); pc++; return temp; } static inline unsigned long zeropage() /*It's actually direct page, but I'm used to calling it zero page*/ { unsigned long temp=snes_readmem(pbr|pc); pc++; temp+=dp; if (dp&0xFF) { cycles-=6; clockspc(6); } return temp&0xFFFF; } static inline unsigned long zeropagex() { unsigned long temp=snes_readmem(pbr|pc)+x.w; pc++; if (p.e) temp&=0xFF; temp+=dp; if (dp&0xFF) { cycles-=6; clockspc(6); } return temp&0xFFFF; } static inline unsigned long zeropagey() { unsigned long temp=snes_readmem(pbr|pc)+y.w; pc++; if (p.e) temp&=0xFF; temp+=dp; if (dp&0xFF) { cycles-=6; clockspc(6); } return temp&0xFFFF; } static inline unsigned long stack() { unsigned long temp=snes_readmem(pbr|pc); pc++; temp+=s.w; return temp&0xFFFF; } static inline unsigned long indirect() { unsigned long temp=(snes_readmem(pbr|pc)+dp)&0xFFFF; pc++; return (readmemw(temp))+dbr; } static inline unsigned long indirectx() { unsigned long temp=(snes_readmem(pbr|pc)+dp+x.w)&0xFFFF; pc++; return (readmemw(temp))+dbr; } static inline unsigned long jindirectx() /*JSR (,x) uses PBR instead of DBR, and 2 byte address insted of 1 + dp*/ { unsigned long temp=(snes_readmem(pbr|pc)+(snes_readmem((pbr|pc)+1)<<8)+x.w)+pbr; pc+=2; return temp; } static inline unsigned long indirecty() { unsigned long temp=(snes_readmem(pbr|pc)+dp)&0xFFFF; pc++; return (readmemw(temp))+y.w+dbr; } static inline unsigned long sindirecty() { unsigned long temp=(snes_readmem(pbr|pc)+s.w)&0xFFFF; pc++; return (readmemw(temp))+y.w+dbr; } static inline unsigned long indirectl() { unsigned long temp=(snes_readmem(pbr|pc)+dp)&0xFFFF; pc++; unsigned long address=readmemw(temp)|(snes_readmem(temp+2)<<16); return address; } static inline unsigned long indirectly() { unsigned long temp=(snes_readmem(pbr|pc)+dp)&0xFFFF; pc++; unsigned long address=(readmemw(temp)|(snes_readmem(temp+2)<<16))+y.w; return address; } /*Flag setting*/ #define setzn8(v) p.z=!(v); p.n=(v)&0x80 #define setzn16(v) p.z=!(v); p.n=(v)&0x8000 /*ADC/SBC macros*/ #define ADC8() tempw=a.b.l+temp+((p.c)?1:0); \ p.v=(!((a.b.l^temp)&0x80)&&((a.b.l^tempw)&0x80)); \ a.b.l=tempw&0xFF; \ setzn8(a.b.l); \ p.c=tempw&0x100; #define ADC16() templ=a.w+tempw+((p.c)?1:0); \ p.v=(!((a.w^tempw)&0x8000)&&((a.w^templ)&0x8000)); \ a.w=templ&0xFFFF; \ setzn16(a.w); \ p.c=templ&0x10000; #define ADCBCD8() \ tempw=(a.b.l&0xF)+(temp&0xF)+(p.c?1:0); \ if (tempw>9) \ { \ tempw+=6; \ } \ tempw+=((a.b.l&0xF0)+(temp&0xF0)); \ if (tempw>0x9F) \ { \ tempw+=0x60; \ } \ p.v=(!((a.b.l^temp)&0x80)&&((a.b.l^tempw)&0x80)); \ a.b.l=tempw&0xFF; \ setzn8(a.b.l); \ p.c=tempw>0xFF; \ cycles-=6; clockspc(6); #define ADCBCD16() \ templ=(a.w&0xF)+(tempw&0xF)+(p.c?1:0); \ if (templ>9) \ { \ templ+=6; \ } \ templ+=((a.w&0xF0)+(tempw&0xF0)); \ if (templ>0x9F) \ { \ templ+=0x60; \ } \ templ+=((a.w&0xF00)+(tempw&0xF00)); \ if (templ>0x9FF) \ { \ templ+=0x600; \ } \ templ+=((a.w&0xF000)+(tempw&0xF000)); \ if (templ>0x9FFF) \ { \ templ+=0x6000; \ } \ p.v=(!((a.w^tempw)&0x8000)&&((a.w^templ)&0x8000)); \ a.w=templ&0xFFFF; \ setzn16(a.w); \ p.c=templ>0xFFFF; \ cycles-=6; clockspc(6); #define SBC8() tempw=a.b.l-temp-((p.c)?0:1); \ p.v=(((a.b.l^temp)&0x80)&&((a.b.l^tempw)&0x80)); \ a.b.l=tempw&0xFF; \ setzn8(a.b.l); \ p.c=tempw<=0xFF; #define SBC16() templ=a.w-tempw-((p.c)?0:1); \ p.v=(((a.w^tempw)&(a.w^templ))&0x8000); \ a.w=templ&0xFFFF; \ setzn16(a.w); \ p.c=templ<=0xFFFF; #define SBCBCD8() \ tempw=(a.b.l&0xF)-(temp&0xF)-(p.c?0:1); \ if (tempw>9) \ { \ tempw-=6; \ } \ tempw+=((a.b.l&0xF0)-(temp&0xF0)); \ if (tempw>0x9F) \ { \ tempw-=0x60; \ } \ p.v=(((a.b.l^temp)&0x80)&&((a.b.l^tempw)&0x80)); \ a.b.l=tempw&0xFF; \ setzn8(a.b.l); \ p.c=tempw<=0xFF; \ cycles-=6; clockspc(6); #define SBCBCD16() \ templ=(a.w&0xF)-(tempw&0xF)-(p.c?0:1); \ if (templ>9) \ { \ templ-=6; \ } \ templ+=((a.w&0xF0)-(tempw&0xF0)); \ if (templ>0x9F) \ { \ templ-=0x60; \ } \ templ+=((a.w&0xF00)-(tempw&0xF00)); \ if (templ>0x9FF) \ { \ templ-=0x600; \ } \ templ+=((a.w&0xF000)-(tempw&0xF000)); \ if (templ>0x9FFF) \ { \ templ-=0x6000; \ } \ p.v=(((a.w^tempw)&0x8000)&&((a.w^templ)&0x8000)); \ a.w=templ&0xFFFF; \ setzn16(a.w); \ p.c=templ<=0xFFFF; \ cycles-=6; clockspc(6); /*Instructions*/ static inline void inca8() { snes_readmem(pbr|pc); a.b.l++; setzn8(a.b.l); } static inline void inca16() { snes_readmem(pbr|pc); a.w++; setzn16(a.w); } static inline void inx8() { snes_readmem(pbr|pc); x.b.l++; setzn8(x.b.l); } static inline void inx16() { snes_readmem(pbr|pc); x.w++; setzn16(x.w); } static inline void iny8() { snes_readmem(pbr|pc); y.b.l++; setzn8(y.b.l); } static inline void iny16() { snes_readmem(pbr|pc); y.w++; setzn16(y.w); } static inline void deca8() { snes_readmem(pbr|pc); a.b.l--; setzn8(a.b.l); } static inline void deca16() { snes_readmem(pbr|pc); a.w--; setzn16(a.w); } static inline void dex8() { snes_readmem(pbr|pc); x.b.l--; setzn8(x.b.l); } static inline void dex16() { snes_readmem(pbr|pc); x.w--; setzn16(x.w); } static inline void dey8() { snes_readmem(pbr|pc); y.b.l--; setzn8(y.b.l); } static inline void dey16() { snes_readmem(pbr|pc); y.w--; setzn16(y.w); } /*INC group*/ static inline void incZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); cycles-=6; clockspc(6); temp++; setzn8(temp); snes_writemem(addr,temp); } static inline void incZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); cycles-=6; clockspc(6); temp++; setzn16(temp); writememw2(addr,temp); } static inline void incZpx8() { unsigned char temp; addr=zeropagex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); temp++; setzn8(temp); snes_writemem(addr,temp); } static inline void incZpx16() { unsigned short temp; addr=zeropagex(); temp=readmemw(addr); cycles-=6; clockspc(6); temp++; setzn16(temp); writememw2(addr,temp); } static inline void incAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); cycles-=6; clockspc(6); temp++; setzn8(temp); snes_writemem(addr,temp); } static inline void incAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); cycles-=6; clockspc(6); temp++; setzn16(temp); writememw2(addr,temp); } static inline void incAbsx8() { unsigned char temp; addr=absolutex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); temp++; setzn8(temp); snes_writemem(addr,temp); } static inline void incAbsx16() { unsigned short temp; addr=absolutex(); temp=readmemw(addr); cycles-=6; clockspc(6); temp++; setzn16(temp); writememw2(addr,temp); } /*DEC group*/ static inline void decZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); cycles-=6; clockspc(6); temp--; setzn8(temp); snes_writemem(addr,temp); } static inline void decZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); cycles-=6; clockspc(6); temp--; setzn16(temp); writememw2(addr,temp); } static inline void decZpx8() { unsigned char temp; addr=zeropagex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); temp--; setzn8(temp); snes_writemem(addr,temp); } static inline void decZpx16() { unsigned short temp; addr=zeropagex(); temp=readmemw(addr); cycles-=6; clockspc(6); temp--; setzn16(temp); writememw2(addr,temp); } static inline void decAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); cycles-=6; clockspc(6); temp--; setzn8(temp); snes_writemem(addr,temp); } static inline void decAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); cycles-=6; clockspc(6); temp--; setzn16(temp); writememw2(addr,temp); } static inline void decAbsx8() { unsigned char temp; addr=absolutex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); temp--; setzn8(temp); snes_writemem(addr,temp); } static inline void decAbsx16() { unsigned short temp; addr=absolutex(); temp=readmemw(addr); cycles-=6; clockspc(6); temp--; setzn16(temp); writememw2(addr,temp); } /*Flag group*/ static inline void clc() { snes_readmem(pbr|pc); p.c=0; } static inline void cld() { snes_readmem(pbr|pc); p.d=0; } static inline void cli() { snes_readmem(pbr|pc); p.i=0; } static inline void clv() { snes_readmem(pbr|pc); p.v=0; } static inline void sec() { snes_readmem(pbr|pc); p.c=1; } static inline void sed() { snes_readmem(pbr|pc); p.d=1; } static inline void sei() { snes_readmem(pbr|pc); p.i=1; } static inline void xce() { int temp=p.c; p.c=p.e; p.e=temp; snes_readmem(pbr|pc); updatecpumode(); } static inline void sep() { unsigned char temp=snes_readmem(pbr|pc); pc++; if (temp&1) p.c=1; if (temp&2) p.z=1; if (temp&4) p.i=1; if (temp&8) p.d=1; if (temp&0x40) p.v=1; if (temp&0x80) p.n=1; if (!p.e) { if (temp&0x10) p.x=1; if (temp&0x20) p.m=1; updatecpumode(); } } static inline void rep() { unsigned char temp=snes_readmem(pbr|pc); pc++; if (temp&1) p.c=0; if (temp&2) p.z=0; if (temp&4) p.i=0; if (temp&8) p.d=0; if (temp&0x40) p.v=0; if (temp&0x80) p.n=0; if (!p.e) { if (temp&0x10) p.x=0; if (temp&0x20) p.m=0; updatecpumode(); } } /*Transfer group*/ static inline void tax8() { snes_readmem(pbr|pc); x.b.l=a.b.l; setzn8(x.b.l); } static inline void tay8() { snes_readmem(pbr|pc); y.b.l=a.b.l; setzn8(y.b.l); } static inline void txa8() { snes_readmem(pbr|pc); a.b.l=x.b.l; setzn8(a.b.l); } static inline void tya8() { snes_readmem(pbr|pc); a.b.l=y.b.l; setzn8(a.b.l); } static inline void tsx8() { snes_readmem(pbr|pc); x.b.l=s.b.l; setzn8(x.b.l); } static inline void txs8() { snes_readmem(pbr|pc); s.b.l=x.b.l; // setzn8(s.b.l); } static inline void txy8() { snes_readmem(pbr|pc); y.b.l=x.b.l; setzn8(y.b.l); } static inline void tyx8() { snes_readmem(pbr|pc); x.b.l=y.b.l; setzn8(x.b.l); } static inline void tax16() { snes_readmem(pbr|pc); x.w=a.w; setzn16(x.w); } static inline void tay16() { snes_readmem(pbr|pc); y.w=a.w; setzn16(y.w); } static inline void txa16() { snes_readmem(pbr|pc); a.w=x.w; setzn16(a.w); } static inline void tya16() { snes_readmem(pbr|pc); a.w=y.w; setzn16(a.w); } static inline void tsx16() { snes_readmem(pbr|pc); x.w=s.w; setzn16(x.w); } static inline void txs16() { snes_readmem(pbr|pc); s.w=x.w; // setzn16(s.w); } static inline void txy16() { snes_readmem(pbr|pc); y.w=x.w; setzn16(y.w); } static inline void tyx16() { snes_readmem(pbr|pc); x.w=y.w; setzn16(x.w); } /*LDX group*/ static inline void ldxImm8() { x.b.l=snes_readmem(pbr|pc); pc++; setzn8(x.b.l); } static inline void ldxZp8() { addr=zeropage(); x.b.l=snes_readmem(addr); setzn8(x.b.l); } static inline void ldxZpy8() { addr=zeropagey(); x.b.l=snes_readmem(addr); setzn8(x.b.l); } static inline void ldxAbs8() { addr=absolute(); x.b.l=snes_readmem(addr); setzn8(x.b.l); } static inline void ldxAbsy8() { addr=absolutey(); x.b.l=snes_readmem(addr); setzn8(x.b.l); } static inline void ldxImm16() { x.w=readmemw(pbr|pc); pc+=2; setzn16(x.w); } static inline void ldxZp16() { addr=zeropage(); x.w=readmemw(addr); setzn16(x.w); } static inline void ldxZpy16() { addr=zeropagey(); x.w=readmemw(addr); setzn16(x.w); } static inline void ldxAbs16() { addr=absolute(); x.w=readmemw(addr); setzn16(x.w); } static inline void ldxAbsy16() { addr=absolutey(); x.w=readmemw(addr); setzn16(x.w); } /*LDY group*/ static inline void ldyImm8() { y.b.l=snes_readmem(pbr|pc); pc++; setzn8(y.b.l); } static inline void ldyZp8() { addr=zeropage(); y.b.l=snes_readmem(addr); setzn8(y.b.l); } static inline void ldyZpx8() { addr=zeropagex(); y.b.l=snes_readmem(addr); setzn8(y.b.l); } static inline void ldyAbs8() { addr=absolute(); y.b.l=snes_readmem(addr); setzn8(y.b.l); } static inline void ldyAbsx8() { addr=absolutex(); y.b.l=snes_readmem(addr); setzn8(y.b.l); } static inline void ldyImm16() { y.w=readmemw(pbr|pc); pc+=2; setzn16(y.w); } static inline void ldyZp16() { addr=zeropage(); y.w=readmemw(addr); setzn16(y.w); } static inline void ldyZpx16() { addr=zeropagex(); y.w=readmemw(addr); setzn16(y.w); } static inline void ldyAbs16() { addr=absolute(); y.w=readmemw(addr); setzn16(y.w); } static inline void ldyAbsx16() { addr=absolutex(); y.w=readmemw(addr); setzn16(y.w); } /*LDA group*/ static inline void ldaImm8() { a.b.l=snes_readmem(pbr|pc); pc++; setzn8(a.b.l); } static inline void ldaZp8() { addr=zeropage(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaZpx8() { addr=zeropagex(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaSp8() { addr=stack(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaSIndirecty8() { addr=sindirecty(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaAbs8() { addr=absolute(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaAbsx8() { addr=absolutex(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaAbsy8() { addr=absolutey(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaLong8() { addr=absolutelong(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaLongx8() { addr=absolutelongx(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaIndirect8() { addr=indirect(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaIndirectx8() { addr=indirectx(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaIndirecty8() { addr=indirecty(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaIndirectLong8() { addr=indirectl(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaIndirectLongy8() { addr=indirectly(); a.b.l=snes_readmem(addr); setzn8(a.b.l); } static inline void ldaImm16() { a.w=readmemw(pbr|pc); pc+=2; setzn16(a.w); } static inline void ldaZp16() { addr=zeropage(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaZpx16() { addr=zeropagex(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaSp16() { addr=stack(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaSIndirecty16() { addr=sindirecty(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaAbs16() { addr=absolute(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaAbsx16() { addr=absolutex(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaAbsy16() { addr=absolutey(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaLong16() { addr=absolutelong(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaLongx16() { addr=absolutelongx(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaIndirect16() { addr=indirect(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaIndirectx16() { addr=indirectx(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaIndirecty16() { addr=indirecty(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaIndirectLong16() { addr=indirectl(); a.w=readmemw(addr); setzn16(a.w); } static inline void ldaIndirectLongy16() { addr=indirectly(); a.w=readmemw(addr); setzn16(a.w); } /*STA group*/ static inline void staZp8() { addr=zeropage(); snes_writemem(addr,a.b.l); } static inline void staZpx8() { addr=zeropagex(); snes_writemem(addr,a.b.l); } static inline void staAbs8() { addr=absolute(); snes_writemem(addr,a.b.l); } static inline void staAbsx8() { addr=absolutex(); snes_writemem(addr,a.b.l); } static inline void staAbsy8() { addr=absolutey(); snes_writemem(addr,a.b.l); } static inline void staLong8() { addr=absolutelong(); snes_writemem(addr,a.b.l); } static inline void staLongx8() { addr=absolutelongx(); snes_writemem(addr,a.b.l); } static inline void staIndirect8() { addr=indirect(); snes_writemem(addr,a.b.l); } static inline void staIndirectx8() { addr=indirectx(); snes_writemem(addr,a.b.l); } static inline void staIndirecty8() { addr=indirecty(); snes_writemem(addr,a.b.l); } static inline void staIndirectLong8() { addr=indirectl(); snes_writemem(addr,a.b.l); } static inline void staIndirectLongy8() { addr=indirectly(); snes_writemem(addr,a.b.l); } static inline void staSp8() { addr=stack(); snes_writemem(addr,a.b.l); } static inline void staSIndirecty8() { addr=sindirecty(); snes_writemem(addr,a.b.l); } static inline void staZp16() { addr=zeropage(); writememw(addr,a.w); } static inline void staZpx16() { addr=zeropagex(); writememw(addr,a.w); } static inline void staAbs16() { addr=absolute(); writememw(addr,a.w); } static inline void staAbsx16() { addr=absolutex(); writememw(addr,a.w); } static inline void staAbsy16() { addr=absolutey(); writememw(addr,a.w); } static inline void staLong16() { addr=absolutelong(); writememw(addr,a.w); } static inline void staLongx16() { addr=absolutelongx(); writememw(addr,a.w); } static inline void staIndirect16() { addr=indirect(); writememw(addr,a.w); } static inline void staIndirectx16() { addr=indirectx(); writememw(addr,a.w); } static inline void staIndirecty16() { addr=indirecty(); writememw(addr,a.w); } static inline void staIndirectLong16() { addr=indirectl(); writememw(addr,a.w); } static inline void staIndirectLongy16() { addr=indirectly(); writememw(addr,a.w); } static inline void staSp16() { addr=stack(); writememw(addr,a.w); } static inline void staSIndirecty16() { addr=sindirecty(); writememw(addr,a.w); } /*STX group*/ static inline void stxZp8() { addr=zeropage(); snes_writemem(addr,x.b.l); } static inline void stxZpy8() { addr=zeropagey(); snes_writemem(addr,x.b.l); } static inline void stxAbs8() { addr=absolute(); snes_writemem(addr,x.b.l); } static inline void stxZp16() { addr=zeropage(); writememw(addr,x.w); } static inline void stxZpy16() { addr=zeropagey(); writememw(addr,x.w); } static inline void stxAbs16() { addr=absolute(); writememw(addr,x.w); } /*STY group*/ static inline void styZp8() { addr=zeropage(); snes_writemem(addr,y.b.l); } static inline void styZpx8() { addr=zeropagex(); snes_writemem(addr,y.b.l); } static inline void styAbs8() { addr=absolute(); snes_writemem(addr,y.b.l); } static inline void styZp16() { addr=zeropage(); writememw(addr,y.w); } static inline void styZpx16() { addr=zeropagex(); writememw(addr,y.w); } static inline void styAbs16() { addr=absolute(); writememw(addr,y.w); } /*STZ group*/ static inline void stzZp8() { addr=zeropage(); snes_writemem(addr,0); } static inline void stzZpx8() { addr=zeropagex(); snes_writemem(addr,0); } static inline void stzAbs8() { addr=absolute(); snes_writemem(addr,0); } static inline void stzAbsx8() { addr=absolutex(); snes_writemem(addr,0); } static inline void stzZp16() { addr=zeropage(); writememw(addr,0); } static inline void stzZpx16() { addr=zeropagex(); writememw(addr,0); } static inline void stzAbs16() { addr=absolute(); writememw(addr,0); } static inline void stzAbsx16() { addr=absolutex(); writememw(addr,0); } /*ADC group*/ static inline void adcImm8() { unsigned short tempw; unsigned char temp=snes_readmem(pbr|pc); pc++; if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcZp8() { unsigned short tempw; unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcZpx8() { unsigned short tempw; unsigned char temp; addr=zeropagex(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcSp8() { unsigned short tempw; unsigned char temp; addr=stack(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcAbs8() { unsigned short tempw; unsigned char temp; addr=absolute(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcAbsx8() { unsigned short tempw; unsigned char temp; addr=absolutex(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcAbsy8() { unsigned short tempw; unsigned char temp; addr=absolutey(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcLong8() { unsigned short tempw; unsigned char temp; addr=absolutelong(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcLongx8() { unsigned short tempw; unsigned char temp; addr=absolutelongx(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcIndirect8() { unsigned short tempw; unsigned char temp; addr=indirect(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcIndirectx8() { unsigned short tempw; unsigned char temp; addr=indirectx(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcIndirecty8() { unsigned short tempw; unsigned char temp; addr=indirecty(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcsIndirecty8() { unsigned short tempw; unsigned char temp; addr=sindirecty(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcIndirectLong8() { unsigned short tempw; unsigned char temp; addr=indirectl(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcIndirectLongy8() { unsigned short tempw; unsigned char temp; addr=indirectly(); temp=snes_readmem(addr); if (p.d) { ADCBCD8(); } else { ADC8(); } } static inline void adcImm16() { unsigned long templ; unsigned short tempw; tempw=readmemw(pbr|pc); pc+=2; if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcZp16() { unsigned long templ; unsigned short tempw; addr=zeropage(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcZpx16() { unsigned long templ; unsigned short tempw; addr=zeropagex(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcSp16() { unsigned long templ; unsigned short tempw; addr=stack(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcAbs16() { unsigned long templ; unsigned short tempw; addr=absolute(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcAbsx16() { unsigned long templ; unsigned short tempw; addr=absolutex(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcAbsy16() { unsigned long templ; unsigned short tempw; addr=absolutey(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcLong16() { unsigned long templ; unsigned short tempw; addr=absolutelong(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcLongx16() { unsigned long templ; unsigned short tempw; addr=absolutelongx(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcIndirect16() { unsigned long templ; unsigned short tempw; addr=indirect(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcIndirectx16() { unsigned long templ; unsigned short tempw; addr=indirectx(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcIndirecty16() { unsigned long templ; unsigned short tempw; addr=indirecty(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcsIndirecty16() { unsigned long templ; unsigned short tempw; addr=sindirecty(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcIndirectLong16() { unsigned long templ; unsigned short tempw; addr=indirectl(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } static inline void adcIndirectLongy16() { unsigned long templ; unsigned short tempw; addr=indirectly(); tempw=readmemw(addr); if (p.d) { ADCBCD16(); } else { ADC16(); } } /*SBC group*/ static inline void sbcImm8() { unsigned short tempw; unsigned char temp=snes_readmem(pbr|pc); pc++; if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcZp8() { unsigned short tempw; unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcZpx8() { unsigned short tempw; unsigned char temp; addr=zeropagex(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcSp8() { unsigned short tempw; unsigned char temp; addr=stack(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcAbs8() { unsigned short tempw; unsigned char temp; addr=absolute(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcAbsx8() { unsigned short tempw; unsigned char temp; addr=absolutex(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcAbsy8() { unsigned short tempw; unsigned char temp; addr=absolutey(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcLong8() { unsigned short tempw; unsigned char temp; addr=absolutelong(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcLongx8() { unsigned short tempw; unsigned char temp; addr=absolutelongx(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcIndirect8() { unsigned short tempw; unsigned char temp; addr=indirect(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcIndirectx8() { unsigned short tempw; unsigned char temp; addr=indirectx(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcIndirecty8() { unsigned short tempw; unsigned char temp; addr=indirecty(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcIndirectLong8() { unsigned short tempw; unsigned char temp; addr=indirectl(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcIndirectLongy8() { unsigned short tempw; unsigned char temp; addr=indirectly(); temp=snes_readmem(addr); if (p.d) { SBCBCD8(); } else { SBC8(); } } static inline void sbcImm16() { unsigned long templ; unsigned short tempw; tempw=readmemw(pbr|pc); pc+=2; if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcZp16() { unsigned long templ; unsigned short tempw; addr=zeropage(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcZpx16() { unsigned long templ; unsigned short tempw; addr=zeropagex(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcSp16() { unsigned long templ; unsigned short tempw; addr=stack(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcAbs16() { unsigned long templ; unsigned short tempw; addr=absolute(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcAbsx16() { unsigned long templ; unsigned short tempw; addr=absolutex(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcAbsy16() { unsigned long templ; unsigned short tempw; addr=absolutey(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcLong16() { unsigned long templ; unsigned short tempw; addr=absolutelong(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcLongx16() { unsigned long templ; unsigned short tempw; addr=absolutelongx(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcIndirect16() { unsigned long templ; unsigned short tempw; addr=indirect(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcIndirectx16() { unsigned long templ; unsigned short tempw; addr=indirectx(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcIndirecty16() { unsigned long templ; unsigned short tempw; addr=indirecty(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcIndirectLong16() { unsigned long templ; unsigned short tempw; addr=indirectl(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } static inline void sbcIndirectLongy16() { unsigned long templ; unsigned short tempw; addr=indirectly(); tempw=readmemw(addr); if (p.d) { SBCBCD16(); } else { SBC16(); } } /*EOR group*/ static inline void eorImm8() { a.b.l^=snes_readmem(pbr|pc); pc++; setzn8(a.b.l); } static inline void eorZp8() { addr=zeropage(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorZpx8() { addr=zeropagex(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorSp8() { addr=stack(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorAbs8() { addr=absolute(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorAbsx8() { addr=absolutex(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorAbsy8() { addr=absolutey(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorLong8() { addr=absolutelong(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorLongx8() { addr=absolutelongx(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorIndirect8() { addr=indirect(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorIndirectx8() { addr=indirectx(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorIndirecty8() { addr=indirecty(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorIndirectLong8() { addr=indirectl(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorIndirectLongy8() { addr=indirectly(); a.b.l^=snes_readmem(addr); setzn8(a.b.l); } static inline void eorImm16() { a.w^=readmemw(pbr|pc); pc+=2; setzn16(a.w); } static inline void eorZp16() { addr=zeropage(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorZpx16() { addr=zeropagex(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorSp16() { addr=stack(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorAbs16() { addr=absolute(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorAbsx16() { addr=absolutex(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorAbsy16() { addr=absolutey(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorLong16() { addr=absolutelong(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorLongx16() { addr=absolutelongx(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorIndirect16() { addr=indirect(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorIndirectx16() { addr=indirectx(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorIndirecty16() { addr=indirecty(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorIndirectLong16() { addr=indirectl(); a.w^=readmemw(addr); setzn16(a.w); } static inline void eorIndirectLongy16() { addr=indirectly(); a.w^=readmemw(addr); setzn16(a.w); } /*AND group*/ static inline void andImm8() { a.b.l&=snes_readmem(pbr|pc); pc++; setzn8(a.b.l); } static inline void andZp8() { addr=zeropage(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andZpx8() { addr=zeropagex(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andSp8() { addr=stack(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andAbs8() { addr=absolute(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andAbsx8() { addr=absolutex(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andAbsy8() { addr=absolutey(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andLong8() { addr=absolutelong(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andLongx8() { addr=absolutelongx(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andIndirect8() { addr=indirect(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andIndirectx8() { addr=indirectx(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andIndirecty8() { addr=indirecty(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andIndirectLong8() { addr=indirectl(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andIndirectLongy8() { addr=indirectly(); a.b.l&=snes_readmem(addr); setzn8(a.b.l); } static inline void andImm16() { a.w&=readmemw(pbr|pc); pc+=2; setzn16(a.w); } static inline void andZp16() { addr=zeropage(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andZpx16() { addr=zeropagex(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andSp16() { addr=stack(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andAbs16() { addr=absolute(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andAbsx16() { addr=absolutex(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andAbsy16() { addr=absolutey(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andLong16() { addr=absolutelong(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andLongx16() { addr=absolutelongx(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andIndirect16() { addr=indirect(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andIndirectx16() { addr=indirectx(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andIndirecty16() { addr=indirecty(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andIndirectLong16() { addr=indirectl(); a.w&=readmemw(addr); setzn16(a.w); } static inline void andIndirectLongy16() { addr=indirectly(); a.w&=readmemw(addr); setzn16(a.w); } /*ORA group*/ static inline void oraImm8() { a.b.l|=snes_readmem(pbr|pc); pc++; setzn8(a.b.l); } static inline void oraZp8() { addr=zeropage(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraZpx8() { addr=zeropagex(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraSp8() { addr=stack(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraAbs8() { addr=absolute(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraAbsx8() { addr=absolutex(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraAbsy8() { addr=absolutey(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraLong8() { addr=absolutelong(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraLongx8() { addr=absolutelongx(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraIndirect8() { addr=indirect(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraIndirectx8() { addr=indirectx(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraIndirecty8() { addr=indirecty(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraIndirectLong8() { addr=indirectl(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraIndirectLongy8() { addr=indirectly(); a.b.l|=snes_readmem(addr); setzn8(a.b.l); } static inline void oraImm16() { a.w|=readmemw(pbr|pc); pc+=2; setzn16(a.w); } static inline void oraZp16() { addr=zeropage(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraZpx16() { addr=zeropagex(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraSp16() { addr=stack(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraAbs16() { addr=absolute(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraAbsx16() { addr=absolutex(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraAbsy16() { addr=absolutey(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraLong16() { addr=absolutelong(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraLongx16() { addr=absolutelongx(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraIndirect16() { addr=indirect(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraIndirectx16() { addr=indirectx(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraIndirecty16() { addr=indirecty(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraIndirectLong16() { addr=indirectl(); a.w|=readmemw(addr); setzn16(a.w); } static inline void oraIndirectLongy16() { addr=indirectly(); a.w|=readmemw(addr); setzn16(a.w); } /*BIT group*/ static inline void bitImm8() { unsigned char temp=snes_readmem(pbr|pc); pc++; p.z=!(temp&a.b.l); } static inline void bitImm16() { unsigned short temp=readmemw(pbr|pc); pc+=2; p.z=!(temp&a.w); setzf=0; } static inline void bitZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); p.z=!(temp&a.b.l); p.v=temp&0x40; p.n=temp&0x80; } static inline void bitZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); p.z=!(temp&a.w); p.v=temp&0x4000; p.n=temp&0x8000; } static inline void bitZpx8() { unsigned char temp; addr=zeropagex(); temp=snes_readmem(addr); p.z=!(temp&a.b.l); p.v=temp&0x40; p.n=temp&0x80; } static inline void bitZpx16() { unsigned short temp; addr=zeropagex(); temp=readmemw(addr); p.z=!(temp&a.w); p.v=temp&0x4000; p.n=temp&0x8000; } static inline void bitAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); p.z=!(temp&a.b.l); p.v=temp&0x40; p.n=temp&0x80; } static inline void bitAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); p.z=!(temp&a.w); p.v=temp&0x4000; p.n=temp&0x8000; } static inline void bitAbsx8() { unsigned char temp; addr=absolutex(); temp=snes_readmem(addr); p.z=!(temp&a.b.l); p.v=temp&0x40; p.n=temp&0x80; } static inline void bitAbsx16() { unsigned short temp; addr=absolutex(); temp=readmemw(addr); p.z=!(temp&a.w); p.v=temp&0x4000; p.n=temp&0x8000; } /*CMP group*/ static inline void cmpImm8() { unsigned char temp; temp=snes_readmem(pbr|pc); pc++; setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpZpx8() { unsigned char temp; addr=zeropagex(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpSp8() { unsigned char temp; addr=stack(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpAbsx8() { unsigned char temp; addr=absolutex(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpAbsy8() { unsigned char temp; addr=absolutey(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpLong8() { unsigned char temp; addr=absolutelong(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpLongx8() { unsigned char temp; addr=absolutelongx(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpIndirect8() { unsigned char temp; addr=indirect(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpIndirectx8() { unsigned char temp; addr=indirectx(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpIndirecty8() { unsigned char temp; addr=indirecty(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpIndirectLong8() { unsigned char temp; addr=indirectl(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpIndirectLongy8() { unsigned char temp; addr=indirectly(); temp=snes_readmem(addr); setzn8(a.b.l-temp); p.c=(a.b.l>=temp); } static inline void cmpImm16() { unsigned short temp; temp=readmemw(pbr|pc); pc+=2; setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpSp16() { unsigned short temp; addr=stack(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpZpx16() { unsigned short temp; addr=zeropagex(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpAbsx16() { unsigned short temp; addr=absolutex(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpAbsy16() { unsigned short temp; addr=absolutey(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpLong16() { unsigned short temp; addr=absolutelong(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpLongx16() { unsigned short temp; addr=absolutelongx(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpIndirect16() { unsigned short temp; addr=indirect(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpIndirectx16() { unsigned short temp; addr=indirectx(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpIndirecty16() { unsigned short temp; addr=indirecty(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpIndirectLong16() { unsigned short temp; addr=indirectl(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } static inline void cmpIndirectLongy16() { unsigned short temp; addr=indirectly(); temp=readmemw(addr); setzn16(a.w-temp); p.c=(a.w>=temp); } /*Stack Group*/ static inline void phb() { snes_readmem(pbr|pc); snes_writemem(s.w,dbr>>16); s.w--; } static inline void phbe() { snes_readmem(pbr|pc); snes_writemem(s.w,dbr>>16); s.b.l--; } static inline void phk() { snes_readmem(pbr|pc); snes_writemem(s.w,pbr>>16); s.w--; } static inline void phke() { snes_readmem(pbr|pc); snes_writemem(s.w,pbr>>16); s.b.l--; } static inline void pea() { addr=readmemw(pbr|pc); pc+=2; snes_writemem(s.w,addr>>8); s.w--; snes_writemem(s.w,addr&0xFF); s.w--; } static inline void pei() { addr=indirect(); snes_writemem(s.w,addr>>8); s.w--; snes_writemem(s.w,addr&0xFF); s.w--; } static inline void per() { addr=readmemw(pbr|pc); pc+=2; addr+=pc; snes_writemem(s.w,addr>>8); s.w--; snes_writemem(s.w,addr&0xFF); s.w--; } static inline void phd() { snes_writemem(s.w,dp>>8); s.w--; snes_writemem(s.w,dp&0xFF); s.w--; } static inline void pld() { snes_readmem(pbr|pc); s.w++; cycles-=6; clockspc(6); dp=snes_readmem(s.w); s.w++; dp|=(snes_readmem(s.w)<<8); } static inline void pha8() { snes_readmem(pbr|pc); snes_writemem(s.w,a.b.l); s.w--; } static inline void pha16() { snes_readmem(pbr|pc); snes_writemem(s.w,a.b.h); s.w--; snes_writemem(s.w,a.b.l); s.w--; } static inline void phx8() { snes_readmem(pbr|pc); snes_writemem(s.w,x.b.l); s.w--; } static inline void phx16() { snes_readmem(pbr|pc); snes_writemem(s.w,x.b.h); s.w--; snes_writemem(s.w,x.b.l); s.w--; } static inline void phy8() { snes_readmem(pbr|pc); snes_writemem(s.w,y.b.l); s.w--; } static inline void phy16() { snes_readmem(pbr|pc); snes_writemem(s.w,y.b.h); s.w--; snes_writemem(s.w,y.b.l); s.w--; } static inline void pla8() { snes_readmem(pbr|pc); s.w++; cycles-=6; clockspc(6); a.b.l=snes_readmem(s.w); setzn8(a.b.l); } static inline void pla16() { snes_readmem(pbr|pc); s.w++; cycles-=6; clockspc(6); a.b.l=snes_readmem(s.w); s.w++; a.b.h=snes_readmem(s.w); setzn16(a.w); } static inline void plx8() { snes_readmem(pbr|pc); s.w++; cycles-=6; clockspc(6); x.b.l=snes_readmem(s.w); setzn8(x.b.l); } static inline void plx16() { snes_readmem(pbr|pc); s.w++; cycles-=6; clockspc(6); x.b.l=snes_readmem(s.w); s.w++; x.b.h=snes_readmem(s.w); setzn16(x.w); } static inline void ply8() { snes_readmem(pbr|pc); s.w++; cycles-=6; clockspc(6); y.b.l=snes_readmem(s.w); setzn8(y.b.l); } static inline void ply16() { snes_readmem(pbr|pc); s.w++; cycles-=6; clockspc(6); y.b.l=snes_readmem(s.w); s.w++; y.b.h=snes_readmem(s.w); setzn16(y.w); } static inline void plb() { snes_readmem(pbr|pc); s.w++; cycles-=6; clockspc(6); dbr=snes_readmem(s.w)<<16; } static inline void plbe() { snes_readmem(pbr|pc); s.b.l++; cycles-=6; clockspc(6); dbr=snes_readmem(s.w)<<16; } static inline void plp() { unsigned char temp=snes_readmem(s.w+1); s.w++; p.c=temp&1; p.z=temp&2; p.i=temp&4; p.d=temp&8; p.x=temp&0x10; p.m=temp&0x20; p.v=temp&0x40; p.n=temp&0x80; cycles-=12; clockspc(12); updatecpumode(); } static inline void plpe() { unsigned char temp; s.b.l++; temp=snes_readmem(s.w); p.c=temp&1; p.z=temp&2; p.i=temp&4; p.d=temp&8; p.v=temp&0x40; p.n=temp&0x80; cycles-=12; clockspc(12); } static inline void php() { unsigned char temp=(p.c)?1:0; if (p.z) temp|=2; if (p.i) temp|=4; if (p.d) temp|=8; if (p.v) temp|=0x40; if (p.n) temp|=0x80; if (p.x) temp|=0x10; if (p.m) temp|=0x20; snes_readmem(pbr|pc); snes_writemem(s.w,temp); s.w--; } static inline void phpe() { unsigned char temp=(p.c)?1:0; if (p.z) temp|=2; if (p.i) temp|=4; if (p.d) temp|=8; if (p.v) temp|=0x40; if (p.n) temp|=0x80; temp|=0x30; snes_readmem(pbr|pc); snes_writemem(s.w,temp); s.b.l--; } /*CPX group*/ static inline void cpxImm8() { unsigned char temp=snes_readmem(pbr|pc); pc++; setzn8(x.b.l-temp); p.c=(x.b.l>=temp); } static inline void cpxImm16() { unsigned short temp=readmemw(pbr|pc); pc+=2; setzn16(x.w-temp); p.c=(x.w>=temp); } static inline void cpxZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); setzn8(x.b.l-temp); p.c=(x.b.l>=temp); } static inline void cpxZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); setzn16(x.w-temp); p.c=(x.w>=temp); } static inline void cpxAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); setzn8(x.b.l-temp); p.c=(x.b.l>=temp); } static inline void cpxAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); setzn16(x.w-temp); p.c=(x.w>=temp); } /*CPY group*/ static inline void cpyImm8() { unsigned char temp=snes_readmem(pbr|pc); pc++; setzn8(y.b.l-temp); p.c=(y.b.l>=temp); } static inline void cpyImm16() { unsigned short temp=readmemw(pbr|pc); pc+=2; setzn16(y.w-temp); p.c=(y.w>=temp); } static inline void cpyZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); setzn8(y.b.l-temp); p.c=(y.b.l>=temp); } static inline void cpyZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); setzn16(y.w-temp); p.c=(y.w>=temp); } static inline void cpyAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); setzn8(y.b.l-temp); p.c=(y.b.l>=temp); } static inline void cpyAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); setzn16(y.w-temp); p.c=(y.w>=temp); } /*Branch group*/ static inline void bcc() { signed char temp=(signed char)snes_readmem(pbr|pc); pc++; if (!p.c) { pc+=temp; cycles-=6; clockspc(6); } } static inline void bcs() { signed char temp=(signed char)snes_readmem(pbr|pc); pc++; if (p.c) { pc+=temp; cycles-=6; clockspc(6); } } static inline void beq() { signed char temp=(signed char)snes_readmem(pbr|pc); pc++; if (setzf>0) { p.z=0; } if (setzf<0) { p.z=1; } setzf=0; if (p.z) { pc+=temp; cycles-=6; clockspc(6); } } static inline void bne() { signed char temp=(signed char)snes_readmem(pbr|pc); pc++; if (setzf>0) { p.z=1; } if (setzf<0) { p.z=0; } setzf=0; if (!p.z) { pc+=temp; cycles-=6; clockspc(6); } skipz=0; } static inline void bpl() { signed char temp=(signed char)snes_readmem(pbr|pc); pc++; if (!p.n) { pc+=temp; cycles-=6; clockspc(6); } } static inline void bmi() { signed char temp=(signed char)snes_readmem(pbr|pc); pc++; if (p.n) { pc+=temp; cycles-=6; clockspc(6); } } static inline void bvc() { signed char temp=(signed char)snes_readmem(pbr|pc); pc++; if (!p.v) { pc+=temp; cycles-=6; clockspc(6); } } static inline void bvs() { signed char temp=(signed char)snes_readmem(pbr|pc); pc++; if (p.v) { pc+=temp; cycles-=6; clockspc(6); } } static inline void bra() { signed char temp=(signed char)snes_readmem(pbr|pc); pc++; pc+=temp; cycles-=6; clockspc(6); } static inline void brl() { unsigned short temp=readmemw(pbr|pc); pc+=2; pc+=temp; cycles-=6; clockspc(6); } /*Jump group*/ static inline void jmp() { addr=readmemw(pbr|pc); pc=addr&0xFFFF; } static inline void jmplong() { addr=readmemw(pbr|pc)|(snes_readmem((pbr|pc)+2)<<16); pc=addr&0xFFFF; pbr=addr&0xFF0000; } static inline void jmpind() { addr=readmemw(pbr|pc); pc=readmemw(addr); } static inline void jmpindx() { addr=(readmemw(pbr|pc))+x.w+pbr; pc=readmemw(addr); } static inline void jmlind() { addr=readmemw(pbr|pc); pc=readmemw(addr); pbr=snes_readmem(addr+2)<<16; } static inline void jsr() { addr=readmemw(pbr|pc); pc++; snes_readmem(pbr|pc); snes_writemem(s.w,pc>>8); s.w--; snes_writemem(s.w,pc&0xFF); s.w--; pc=addr&0xFFFF; } static inline void jsre() { addr=readmemw(pbr|pc); pc++; snes_readmem(pbr|pc); snes_writemem(s.w,pc>>8); s.b.l--; snes_writemem(s.w,pc&0xFF); s.b.l--; pc=addr&0xFFFF; } static inline void jsrIndx() { addr=jindirectx(); pc--; snes_writemem(s.w,pc>>8); s.w--; snes_writemem(s.w,pc&0xFF); s.w--; pc=readmemw(addr); } static inline void jsrIndxe() { addr=jindirectx(); pc--; snes_writemem(s.w,pc>>8); s.b.l--; snes_writemem(s.w,pc&0xFF); s.b.l--; pc=readmemw(addr); } static inline void jsl() { unsigned char temp; addr=readmemw(pbr|pc); pc+=2; temp=snes_readmem(pbr|pc); snes_writemem(s.w,pbr>>16); s.w--; snes_writemem(s.w,pc>>8); s.w--; snes_writemem(s.w,pc&0xFF); s.w--; pc=addr&0xFFFF; pbr=temp<<16; } static inline void jsle() { unsigned char temp; addr=readmemw(pbr|pc); pc+=2; temp=snes_readmem(pbr|pc); snes_writemem(s.w,pbr>>16); s.b.l--; snes_writemem(s.w,pc>>8); s.b.l--; snes_writemem(s.w,pc&0xFF); s.b.l--; pc=addr&0xFFFF; pbr=temp<<16; } static inline void rtl() { cycles-=18; clockspc(18); pc=readmemw(s.w+1); s.w+=2; pbr=snes_readmem(s.w+1)<<16; s.w++; pc++; } static inline void rtle() { cycles-=18; clockspc(18); s.b.l++; pc=snes_readmem(s.w); s.b.l++; pc|=(snes_readmem(s.w)<<8); s.b.l++; pbr=snes_readmem(s.w)<<16; } static inline void rts() { cycles-=18; clockspc(18); pc=readmemw(s.w+1); s.w+=2; pc++; } static inline void rtse() { cycles-=18; clockspc(18); s.b.l++; pc=snes_readmem(s.w); s.b.l++; pc|=(snes_readmem(s.w)<<8); } static inline void rti() { unsigned char temp; cycles-=6; s.w++; clockspc(6); temp=snes_readmem(s.w); p.c=temp&1; p.z=temp&2; p.i=temp&4; p.d=temp&8; p.x=temp&0x10; p.m=temp&0x20; p.v=temp&0x40; p.n=temp&0x80; s.w++; pc=snes_readmem(s.w); s.w++; pc|=(snes_readmem(s.w)<<8); s.w++; pbr=snes_readmem(s.w)<<16; updatecpumode(); } /*Shift group*/ static inline void asla8() { snes_readmem(pbr|pc); p.c=a.b.l&0x80; a.b.l<<=1; setzn8(a.b.l); } static inline void asla16() { snes_readmem(pbr|pc); p.c=a.w&0x8000; a.w<<=1; setzn16(a.w); } static inline void aslZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); cycles-=6; clockspc(6); p.c=temp&0x80; temp<<=1; setzn8(temp); snes_writemem(addr,temp); } static inline void aslZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); cycles-=6; clockspc(6); p.c=temp&0x8000; temp<<=1; setzn16(temp); writememw2(addr,temp); } static inline void aslZpx8() { unsigned char temp; addr=zeropagex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); p.c=temp&0x80; temp<<=1; setzn8(temp); snes_writemem(addr,temp); } static inline void aslZpx16() { unsigned short temp; addr=zeropagex(); temp=readmemw(addr); cycles-=6; clockspc(6); p.c=temp&0x8000; temp<<=1; setzn16(temp); writememw2(addr,temp); } static inline void aslAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); cycles-=6; clockspc(6); p.c=temp&0x80; temp<<=1; setzn8(temp); snes_writemem(addr,temp); } static inline void aslAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); cycles-=6; clockspc(6); p.c=temp&0x8000; temp<<=1; setzn16(temp); writememw2(addr,temp); } static inline void aslAbsx8() { unsigned char temp; addr=absolutex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); p.c=temp&0x80; temp<<=1; setzn8(temp); snes_writemem(addr,temp); } static inline void aslAbsx16() { unsigned short temp; addr=absolutex(); temp=readmemw(addr); cycles-=6; clockspc(6); p.c=temp&0x8000; temp<<=1; setzn16(temp); writememw2(addr,temp); } static inline void lsra8() { snes_readmem(pbr|pc); p.c=a.b.l&1; a.b.l>>=1; setzn8(a.b.l); } static inline void lsra16() { snes_readmem(pbr|pc); p.c=a.w&1; a.w>>=1; setzn16(a.w); } static inline void lsrZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); cycles-=6; clockspc(6); p.c=temp&1; temp>>=1; setzn8(temp); snes_writemem(addr,temp); } static inline void lsrZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); cycles-=6; clockspc(6); p.c=temp&1; temp>>=1; setzn16(temp); writememw2(addr,temp); } static inline void lsrZpx8() { unsigned char temp; addr=zeropagex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); p.c=temp&1; temp>>=1; setzn8(temp); snes_writemem(addr,temp); } static inline void lsrZpx16() { unsigned short temp; addr=zeropagex(); temp=readmemw(addr); cycles-=6; clockspc(6); p.c=temp&1; temp>>=1; setzn16(temp); writememw2(addr,temp); } static inline void lsrAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); cycles-=6; clockspc(6); p.c=temp&1; temp>>=1; setzn8(temp); snes_writemem(addr,temp); } static inline void lsrAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); cycles-=6; clockspc(6); p.c=temp&1; temp>>=1; setzn16(temp); writememw2(addr,temp); } static inline void lsrAbsx8() { unsigned char temp; addr=absolutex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); p.c=temp&1; temp>>=1; setzn8(temp); snes_writemem(addr,temp); } static inline void lsrAbsx16() { unsigned short temp; addr=absolutex(); temp=readmemw(addr); cycles-=6; clockspc(6); p.c=temp&1; temp>>=1; setzn16(temp); writememw2(addr,temp); } static inline void rola8() { snes_readmem(pbr|pc); addr=p.c; p.c=a.b.l&0x80; a.b.l<<=1; if (addr) a.b.l|=1; setzn8(a.b.l); } static inline void rola16() { snes_readmem(pbr|pc); addr=p.c; p.c=a.w&0x8000; a.w<<=1; if (addr) a.w|=1; setzn16(a.w); } static inline void rolZp8() { unsigned char temp; int tempc; addr=zeropage(); temp=snes_readmem(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&0x80; temp<<=1; if (tempc) temp|=1; setzn8(temp); snes_writemem(addr,temp); } static inline void rolZp16() { unsigned short temp; int tempc; addr=zeropage(); temp=readmemw(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&0x8000; temp<<=1; if (tempc) temp|=1; setzn16(temp); writememw2(addr,temp); } static inline void rolZpx8() { unsigned char temp; int tempc; addr=zeropagex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&0x80; temp<<=1; if (tempc) temp|=1; setzn8(temp); snes_writemem(addr,temp); } static inline void rolZpx16() { unsigned short temp; int tempc; addr=zeropagex(); temp=readmemw(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&0x8000; temp<<=1; if (tempc) temp|=1; setzn16(temp); writememw2(addr,temp); } static inline void rolAbs8() { unsigned char temp; int tempc; addr=absolute(); temp=snes_readmem(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&0x80; temp<<=1; if (tempc) temp|=1; setzn8(temp); snes_writemem(addr,temp); } static inline void rolAbs16() { unsigned short temp; int tempc; addr=absolute(); temp=readmemw(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&0x8000; temp<<=1; if (tempc) temp|=1; setzn16(temp); writememw2(addr,temp); } static inline void rolAbsx8() { unsigned char temp; int tempc; addr=absolutex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&0x80; temp<<=1; if (tempc) temp|=1; setzn8(temp); snes_writemem(addr,temp); } static inline void rolAbsx16() { unsigned short temp; int tempc; addr=absolutex(); temp=readmemw(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&0x8000; temp<<=1; if (tempc) temp|=1; setzn16(temp); writememw2(addr,temp); } static inline void rora8() { snes_readmem(pbr|pc); addr=p.c; p.c=a.b.l&1; a.b.l>>=1; if (addr) a.b.l|=0x80; setzn8(a.b.l); } static inline void rora16() { snes_readmem(pbr|pc); addr=p.c; p.c=a.w&1; a.w>>=1; if (addr) a.w|=0x8000; setzn16(a.w); } static inline void rorZp8() { unsigned char temp; int tempc; addr=zeropage(); temp=snes_readmem(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&1; temp>>=1; if (tempc) temp|=0x80; setzn8(temp); snes_writemem(addr,temp); } static inline void rorZp16() { unsigned short temp; int tempc; addr=zeropage(); temp=readmemw(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&1; temp>>=1; if (tempc) temp|=0x8000; setzn16(temp); writememw2(addr,temp); } static inline void rorZpx8() { unsigned char temp; int tempc; addr=zeropagex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&1; temp>>=1; if (tempc) temp|=0x80; setzn8(temp); snes_writemem(addr,temp); } static inline void rorZpx16() { unsigned short temp; int tempc; addr=zeropagex(); temp=readmemw(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&1; temp>>=1; if (tempc) temp|=0x8000; setzn16(temp); writememw2(addr,temp); } static inline void rorAbs8() { unsigned char temp; int tempc; addr=absolute(); temp=snes_readmem(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&1; temp>>=1; if (tempc) temp|=0x80; setzn8(temp); snes_writemem(addr,temp); } static inline void rorAbs16() { unsigned short temp; int tempc; addr=absolute(); temp=readmemw(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&1; temp>>=1; if (tempc) temp|=0x8000; setzn16(temp); writememw2(addr,temp); } static inline void rorAbsx8() { unsigned char temp; int tempc; addr=absolutex(); temp=snes_readmem(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&1; temp>>=1; if (tempc) temp|=0x80; setzn8(temp); snes_writemem(addr,temp); } static inline void rorAbsx16() { unsigned short temp; int tempc; addr=absolutex(); temp=readmemw(addr); cycles-=6; clockspc(6); tempc=p.c; p.c=temp&1; temp>>=1; if (tempc) temp|=0x8000; setzn16(temp); writememw2(addr,temp); } /*Misc group*/ static inline void xba() { snes_readmem(pbr|pc); a.w=(a.w>>8)|(a.w<<8); setzn8(a.b.l); } static inline void nop() { cycles-=6; clockspc(6); } static inline void tcd() { snes_readmem(pbr|pc); dp=a.w; setzn16(dp); } static inline void tdc() { snes_readmem(pbr|pc); a.w=dp; setzn16(a.w); } static inline void tcs() { snes_readmem(pbr|pc); s.w=a.w; } static inline void tsc() { snes_readmem(pbr|pc); a.w=s.w; setzn16(a.w); } static inline void trbZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); p.z=!(a.b.l&temp); temp&=~a.b.l; cycles-=6; clockspc(6); snes_writemem(addr,temp); } static inline void trbZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); p.z=!(a.w&temp); temp&=~a.w; cycles-=6; clockspc(6); writememw2(addr,temp); } static inline void trbAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); p.z=!(a.b.l&temp); temp&=~a.b.l; cycles-=6; clockspc(6); snes_writemem(addr,temp); } static inline void trbAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); p.z=!(a.w&temp); temp&=~a.w; cycles-=6; clockspc(6); writememw2(addr,temp); } static inline void tsbZp8() { unsigned char temp; addr=zeropage(); temp=snes_readmem(addr); p.z=!(a.b.l&temp); temp|=a.b.l; cycles-=6; clockspc(6); snes_writemem(addr,temp); } static inline void tsbZp16() { unsigned short temp; addr=zeropage(); temp=readmemw(addr); p.z=!(a.w&temp); temp|=a.w; cycles-=6; clockspc(6); writememw2(addr,temp); } static inline void tsbAbs8() { unsigned char temp; addr=absolute(); temp=snes_readmem(addr); p.z=!(a.b.l&temp); temp|=a.b.l; cycles-=6; clockspc(6); snes_writemem(addr,temp); } static inline void tsbAbs16() { unsigned short temp; addr=absolute(); temp=readmemw(addr); p.z=!(a.w&temp); temp|=a.w; cycles-=6; clockspc(6); writememw2(addr,temp); } static inline void wai() { snes_readmem(pbr|pc); inwai=1; pc--; } static inline void mvp() { unsigned char temp; dbr=(snes_readmem(pbr|pc))<<16; pc++; addr=(snes_readmem(pbr|pc))<<16; pc++; temp=snes_readmem(addr|x.w); snes_writemem(dbr|y.w,temp); x.w--; y.w--; a.w--; if (a.w!=0xFFFF) pc-=3; cycles-=12; clockspc(12); } static inline void mvn() { unsigned char temp; dbr=(snes_readmem(pbr|pc))<<16; pc++; addr=(snes_readmem(pbr|pc))<<16; pc++; temp=snes_readmem(addr|x.w); snes_writemem(dbr|y.w,temp); x.w++; y.w++; a.w--; if (a.w!=0xFFFF) pc-=3; cycles-=12; clockspc(12); } static inline void brk() { unsigned char temp=0; snes_writemem(s.w,pbr>>16); s.w--; snes_writemem(s.w,pc>>8); s.w--; snes_writemem(s.w,pc&0xFF); s.w--; if (p.c) temp|=1; if (p.z) temp|=2; if (p.i) temp|=4; if (p.d) temp|=8; if (p.x) temp|=0x10; if (p.m) temp|=0x20; if (p.v) temp|=0x40; if (p.n) temp|=0x80; snes_writemem(s.w,temp); s.w--; pc=readmemw(0xFFE6); pbr=0; p.i=1; p.d=0; } /*Functions*/ void reset65816() { pbr=dbr=0; s.w=0x1FF; cpumode=4; p.e=1; p.i=1; pc=readmemw(0xFFFC); a.w=x.w=y.w=0; p.x=p.m=1; skipz=0; } static inline void badopcode() { //snemlog(L"Bad opcode %02X\n",opcode); pc--; } void makeopcodetable() { int c,d; for (c=0;c<256;c++) { for (d=0;d<5;d++) { opcodes[c][d]=badopcode; } } /*LDA group*/ opcodes[0xA9][0]=opcodes[0xA9][2]=opcodes[0xA9][4]=ldaImm8; opcodes[0xA9][1]=opcodes[0xA9][3]=ldaImm16; opcodes[0xA5][0]=opcodes[0xA5][2]=opcodes[0xA5][4]=ldaZp8; opcodes[0xA5][1]=opcodes[0xA5][3]=ldaZp16; opcodes[0xB5][0]=opcodes[0xB5][2]=opcodes[0xB5][4]=ldaZpx8; opcodes[0xB5][1]=opcodes[0xB5][3]=ldaZpx16; opcodes[0xA3][0]=opcodes[0xA3][2]=opcodes[0xA3][4]=ldaSp8; opcodes[0xA3][1]=opcodes[0xA3][3]=ldaSp16; opcodes[0xB3][0]=opcodes[0xB3][2]=opcodes[0xB3][4]=ldaSIndirecty8; opcodes[0xB3][1]=opcodes[0xB3][3]=ldaSIndirecty16; opcodes[0xAD][0]=opcodes[0xAD][2]=opcodes[0xAD][4]=ldaAbs8; opcodes[0xAD][1]=opcodes[0xAD][3]=ldaAbs16; opcodes[0xBD][0]=opcodes[0xBD][2]=opcodes[0xBD][4]=ldaAbsx8; opcodes[0xBD][1]=opcodes[0xBD][3]=ldaAbsx16; opcodes[0xB9][0]=opcodes[0xB9][2]=opcodes[0xB9][4]=ldaAbsy8; opcodes[0xB9][1]=opcodes[0xB9][3]=ldaAbsy16; opcodes[0xAF][0]=opcodes[0xAF][2]=opcodes[0xAF][4]=ldaLong8; opcodes[0xAF][1]=opcodes[0xAF][3]=ldaLong16; opcodes[0xBF][0]=opcodes[0xBF][2]=opcodes[0xBF][4]=ldaLongx8; opcodes[0xBF][1]=opcodes[0xBF][3]=ldaLongx16; opcodes[0xB2][0]=opcodes[0xB2][2]=opcodes[0xB2][4]=ldaIndirect8; opcodes[0xB2][1]=opcodes[0xB2][3]=ldaIndirect16; opcodes[0xA1][0]=opcodes[0xA1][2]=opcodes[0xA1][4]=ldaIndirectx8; opcodes[0xA1][1]=opcodes[0xA1][3]=ldaIndirectx16; opcodes[0xB1][0]=opcodes[0xB1][2]=opcodes[0xB1][4]=ldaIndirecty8; opcodes[0xB1][1]=opcodes[0xB1][3]=ldaIndirecty16; opcodes[0xA7][0]=opcodes[0xA7][2]=opcodes[0xA7][4]=ldaIndirectLong8; opcodes[0xA7][1]=opcodes[0xA7][3]=ldaIndirectLong16; opcodes[0xB7][0]=opcodes[0xB7][2]=opcodes[0xB7][4]=ldaIndirectLongy8; opcodes[0xB7][1]=opcodes[0xB7][3]=ldaIndirectLongy16; /*LDX group*/ opcodes[0xA2][0]=opcodes[0xA2][1]=opcodes[0xA2][4]=ldxImm8; opcodes[0xA2][2]=opcodes[0xA2][3]=ldxImm16; opcodes[0xA6][0]=opcodes[0xA6][1]=opcodes[0xA6][4]=ldxZp8; opcodes[0xA6][2]=opcodes[0xA6][3]=ldxZp16; opcodes[0xB6][0]=opcodes[0xB6][1]=opcodes[0xB6][4]=ldxZpy8; opcodes[0xB6][2]=opcodes[0xB6][3]=ldxZpy16; opcodes[0xAE][0]=opcodes[0xAE][1]=opcodes[0xAE][4]=ldxAbs8; opcodes[0xAE][2]=opcodes[0xAE][3]=ldxAbs16; opcodes[0xBE][0]=opcodes[0xBE][1]=opcodes[0xBE][4]=ldxAbsy8; opcodes[0xBE][2]=opcodes[0xBE][3]=ldxAbsy16; /*LDY group*/ opcodes[0xA0][0]=opcodes[0xA0][1]=opcodes[0xA0][4]=ldyImm8; opcodes[0xA0][2]=opcodes[0xA0][3]=ldyImm16; opcodes[0xA4][0]=opcodes[0xA4][1]=opcodes[0xA4][4]=ldyZp8; opcodes[0xA4][2]=opcodes[0xA4][3]=ldyZp16; opcodes[0xB4][0]=opcodes[0xB4][1]=opcodes[0xB4][4]=ldyZpx8; opcodes[0xB4][2]=opcodes[0xB4][3]=ldyZpx16; opcodes[0xAC][0]=opcodes[0xAC][1]=opcodes[0xAC][4]=ldyAbs8; opcodes[0xAC][2]=opcodes[0xAC][3]=ldyAbs16; opcodes[0xBC][0]=opcodes[0xBC][1]=opcodes[0xBC][4]=ldyAbsx8; opcodes[0xBC][2]=opcodes[0xBC][3]=ldyAbsx16; /*STA group*/ opcodes[0x85][0]=opcodes[0x85][2]=opcodes[0x85][4]=staZp8; opcodes[0x85][1]=opcodes[0x85][3]=staZp16; opcodes[0x95][0]=opcodes[0x95][2]=opcodes[0x95][4]=staZpx8; opcodes[0x95][1]=opcodes[0x95][3]=staZpx16; opcodes[0x8D][0]=opcodes[0x8D][2]=opcodes[0x8D][4]=staAbs8; opcodes[0x8D][1]=opcodes[0x8D][3]=staAbs16; opcodes[0x9D][0]=opcodes[0x9D][2]=opcodes[0x9D][4]=staAbsx8; opcodes[0x9D][1]=opcodes[0x9D][3]=staAbsx16; opcodes[0x99][0]=opcodes[0x99][2]=opcodes[0x99][4]=staAbsy8; opcodes[0x99][1]=opcodes[0x99][3]=staAbsy16; opcodes[0x8F][0]=opcodes[0x8F][2]=opcodes[0x8F][4]=staLong8; opcodes[0x8F][1]=opcodes[0x8F][3]=staLong16; opcodes[0x9F][0]=opcodes[0x9F][2]=opcodes[0x9F][4]=staLongx8; opcodes[0x9F][1]=opcodes[0x9F][3]=staLongx16; opcodes[0x92][0]=opcodes[0x92][2]=opcodes[0x92][4]=staIndirect8; opcodes[0x92][1]=opcodes[0x92][3]=staIndirect16; opcodes[0x81][0]=opcodes[0x81][2]=opcodes[0x81][4]=staIndirectx8; opcodes[0x81][1]=opcodes[0x81][3]=staIndirectx16; opcodes[0x91][0]=opcodes[0x91][2]=opcodes[0x91][4]=staIndirecty8; opcodes[0x91][1]=opcodes[0x91][3]=staIndirecty16; opcodes[0x87][0]=opcodes[0x87][2]=opcodes[0x87][4]=staIndirectLong8; opcodes[0x87][1]=opcodes[0x87][3]=staIndirectLong16; opcodes[0x97][0]=opcodes[0x97][2]=opcodes[0x97][4]=staIndirectLongy8; opcodes[0x97][1]=opcodes[0x97][3]=staIndirectLongy16; opcodes[0x83][0]=opcodes[0x83][2]=opcodes[0x83][4]=staSp8; opcodes[0x83][1]=opcodes[0x83][3]=staSp16; opcodes[0x93][0]=opcodes[0x93][2]=opcodes[0x93][4]=staSIndirecty8; opcodes[0x93][1]=opcodes[0x93][3]=staSIndirecty16; /*STX group*/ opcodes[0x86][0]=opcodes[0x86][1]=opcodes[0x86][4]=stxZp8; opcodes[0x86][2]=opcodes[0x86][3]=stxZp16; opcodes[0x96][0]=opcodes[0x96][1]=opcodes[0x96][4]=stxZpy8; opcodes[0x96][2]=opcodes[0x96][3]=stxZpy16; opcodes[0x8E][0]=opcodes[0x8E][1]=opcodes[0x8E][4]=stxAbs8; opcodes[0x8E][2]=opcodes[0x8E][3]=stxAbs16; /*STY group*/ opcodes[0x84][0]=opcodes[0x84][1]=opcodes[0x84][4]=styZp8; opcodes[0x84][2]=opcodes[0x84][3]=styZp16; opcodes[0x94][0]=opcodes[0x94][1]=opcodes[0x94][4]=styZpx8; opcodes[0x94][2]=opcodes[0x94][3]=styZpx16; opcodes[0x8C][0]=opcodes[0x8C][1]=opcodes[0x8C][4]=styAbs8; opcodes[0x8C][2]=opcodes[0x8C][3]=styAbs16; /*STZ group*/ opcodes[0x64][0]=opcodes[0x64][2]=opcodes[0x64][4]=stzZp8; opcodes[0x64][1]=opcodes[0x64][3]=stzZp16; opcodes[0x74][0]=opcodes[0x74][2]=opcodes[0x74][4]=stzZpx8; opcodes[0x74][1]=opcodes[0x74][3]=stzZpx16; opcodes[0x9C][0]=opcodes[0x9C][2]=opcodes[0x9C][4]=stzAbs8; opcodes[0x9C][1]=opcodes[0x9C][3]=stzAbs16; opcodes[0x9E][0]=opcodes[0x9E][2]=opcodes[0x9E][4]=stzAbsx8; opcodes[0x9E][1]=opcodes[0x9E][3]=stzAbsx16; opcodes[0x3A][0]=opcodes[0x3A][2]=opcodes[0x3A][4]=deca8; opcodes[0x3A][1]=opcodes[0x3A][3]=deca16; opcodes[0xCA][0]=opcodes[0xCA][1]=opcodes[0xCA][4]=dex8; opcodes[0xCA][2]=opcodes[0xCA][3]=dex16; opcodes[0x88][0]=opcodes[0x88][1]=opcodes[0x88][4]=dey8; opcodes[0x88][2]=opcodes[0x88][3]=dey16; opcodes[0x1A][0]=opcodes[0x1A][2]=opcodes[0x1A][4]=inca8; opcodes[0x1A][1]=opcodes[0x1A][3]=inca16; opcodes[0xE8][0]=opcodes[0xE8][1]=opcodes[0xE8][4]=inx8; opcodes[0xE8][2]=opcodes[0xE8][3]=inx16; opcodes[0xC8][0]=opcodes[0xC8][1]=opcodes[0xC8][4]=iny8; opcodes[0xC8][2]=opcodes[0xC8][3]=iny16; /*INC group*/ opcodes[0xE6][0]=opcodes[0xE6][2]=opcodes[0xE6][4]=incZp8; opcodes[0xE6][1]=opcodes[0xE6][3]=incZp16; opcodes[0xF6][0]=opcodes[0xF6][2]=opcodes[0xF6][4]=incZpx8; opcodes[0xF6][1]=opcodes[0xF6][3]=incZpx16; opcodes[0xEE][0]=opcodes[0xEE][2]=opcodes[0xEE][4]=incAbs8; opcodes[0xEE][1]=opcodes[0xEE][3]=incAbs16; opcodes[0xFE][0]=opcodes[0xFE][2]=opcodes[0xFE][4]=incAbsx8; opcodes[0xFE][1]=opcodes[0xFE][3]=incAbsx16; /*DEC group*/ opcodes[0xC6][0]=opcodes[0xC6][2]=opcodes[0xC6][4]=decZp8; opcodes[0xC6][1]=opcodes[0xC6][3]=decZp16; opcodes[0xD6][0]=opcodes[0xD6][2]=opcodes[0xD6][4]=decZpx8; opcodes[0xD6][1]=opcodes[0xD6][3]=decZpx16; opcodes[0xCE][0]=opcodes[0xCE][2]=opcodes[0xCE][4]=decAbs8; opcodes[0xCE][1]=opcodes[0xCE][3]=decAbs16; opcodes[0xDE][0]=opcodes[0xDE][2]=opcodes[0xDE][4]=decAbsx8; opcodes[0xDE][1]=opcodes[0xDE][3]=decAbsx16; /*AND group*/ opcodes[0x29][0]=opcodes[0x29][2]=opcodes[0x29][4]=andImm8; opcodes[0x29][1]=opcodes[0x29][3]=andImm16; opcodes[0x25][0]=opcodes[0x25][2]=opcodes[0x25][4]=andZp8; opcodes[0x25][1]=opcodes[0x25][3]=andZp16; opcodes[0x35][0]=opcodes[0x35][2]=opcodes[0x35][4]=andZpx8; opcodes[0x35][1]=opcodes[0x35][3]=andZpx16; opcodes[0x23][0]=opcodes[0x23][2]=opcodes[0x23][4]=andSp8; opcodes[0x23][1]=opcodes[0x23][3]=andSp16; opcodes[0x2D][0]=opcodes[0x2D][2]=opcodes[0x2D][4]=andAbs8; opcodes[0x2D][1]=opcodes[0x2D][3]=andAbs16; opcodes[0x3D][0]=opcodes[0x3D][2]=opcodes[0x3D][4]=andAbsx8; opcodes[0x3D][1]=opcodes[0x3D][3]=andAbsx16; opcodes[0x39][0]=opcodes[0x39][2]=opcodes[0x39][4]=andAbsy8; opcodes[0x39][1]=opcodes[0x39][3]=andAbsy16; opcodes[0x2F][0]=opcodes[0x2F][2]=opcodes[0x2F][4]=andLong8; opcodes[0x2F][1]=opcodes[0x2F][3]=andLong16; opcodes[0x3F][0]=opcodes[0x3F][2]=opcodes[0x3F][4]=andLongx8; opcodes[0x3F][1]=opcodes[0x3F][3]=andLongx16; opcodes[0x32][0]=opcodes[0x32][2]=opcodes[0x32][4]=andIndirect8; opcodes[0x32][1]=opcodes[0x32][3]=andIndirect16; opcodes[0x21][0]=opcodes[0x21][2]=opcodes[0x21][4]=andIndirectx8; opcodes[0x21][1]=opcodes[0x21][3]=andIndirectx16; opcodes[0x31][0]=opcodes[0x31][2]=opcodes[0x31][4]=andIndirecty8; opcodes[0x31][1]=opcodes[0x31][3]=andIndirecty16; opcodes[0x27][0]=opcodes[0x27][2]=opcodes[0x27][4]=andIndirectLong8; opcodes[0x27][1]=opcodes[0x27][3]=andIndirectLong16; opcodes[0x37][0]=opcodes[0x37][2]=opcodes[0x37][4]=andIndirectLongy8; opcodes[0x37][1]=opcodes[0x37][3]=andIndirectLongy16; /*EOR group*/ opcodes[0x49][0]=opcodes[0x49][2]=opcodes[0x49][4]=eorImm8; opcodes[0x49][1]=opcodes[0x49][3]=eorImm16; opcodes[0x45][0]=opcodes[0x45][2]=opcodes[0x45][4]=eorZp8; opcodes[0x45][1]=opcodes[0x45][3]=eorZp16; opcodes[0x55][0]=opcodes[0x55][2]=opcodes[0x55][4]=eorZpx8; opcodes[0x55][1]=opcodes[0x55][3]=eorZpx16; opcodes[0x43][0]=opcodes[0x43][2]=opcodes[0x43][4]=eorSp8; opcodes[0x43][1]=opcodes[0x43][3]=eorSp16; opcodes[0x4D][0]=opcodes[0x4D][2]=opcodes[0x4D][4]=eorAbs8; opcodes[0x4D][1]=opcodes[0x4D][3]=eorAbs16; opcodes[0x5D][0]=opcodes[0x5D][2]=opcodes[0x5D][4]=eorAbsx8; opcodes[0x5D][1]=opcodes[0x5D][3]=eorAbsx16; opcodes[0x59][0]=opcodes[0x59][2]=opcodes[0x59][4]=eorAbsy8; opcodes[0x59][1]=opcodes[0x59][3]=eorAbsy16; opcodes[0x4F][0]=opcodes[0x4F][2]=opcodes[0x4F][4]=eorLong8; opcodes[0x4F][1]=opcodes[0x4F][3]=eorLong16; opcodes[0x5F][0]=opcodes[0x5F][2]=opcodes[0x5F][4]=eorLongx8; opcodes[0x5F][1]=opcodes[0x5F][3]=eorLongx16; opcodes[0x52][0]=opcodes[0x52][2]=opcodes[0x52][4]=eorIndirect8; opcodes[0x52][1]=opcodes[0x52][3]=eorIndirect16; opcodes[0x41][0]=opcodes[0x41][2]=opcodes[0x41][4]=eorIndirectx8; opcodes[0x41][1]=opcodes[0x41][3]=eorIndirectx16; opcodes[0x51][0]=opcodes[0x51][2]=opcodes[0x51][4]=eorIndirecty8; opcodes[0x51][1]=opcodes[0x51][3]=eorIndirecty16; opcodes[0x47][0]=opcodes[0x47][2]=opcodes[0x47][4]=eorIndirectLong8; opcodes[0x47][1]=opcodes[0x47][3]=eorIndirectLong16; opcodes[0x57][0]=opcodes[0x57][2]=opcodes[0x57][4]=eorIndirectLongy8; opcodes[0x57][1]=opcodes[0x57][3]=eorIndirectLongy16; /*ORA group*/ opcodes[0x09][0]=opcodes[0x09][2]=opcodes[0x09][4]=oraImm8; opcodes[0x09][1]=opcodes[0x09][3]=oraImm16; opcodes[0x05][0]=opcodes[0x05][2]=opcodes[0x05][4]=oraZp8; opcodes[0x05][1]=opcodes[0x05][3]=oraZp16; opcodes[0x15][0]=opcodes[0x15][2]=opcodes[0x15][4]=oraZpx8; opcodes[0x15][1]=opcodes[0x15][3]=oraZpx16; opcodes[0x03][0]=opcodes[0x03][2]=opcodes[0x03][4]=oraSp8; opcodes[0x03][1]=opcodes[0x03][3]=oraSp16; opcodes[0x0D][0]=opcodes[0x0D][2]=opcodes[0x0D][4]=oraAbs8; opcodes[0x0D][1]=opcodes[0x0D][3]=oraAbs16; opcodes[0x1D][0]=opcodes[0x1D][2]=opcodes[0x1D][4]=oraAbsx8; opcodes[0x1D][1]=opcodes[0x1D][3]=oraAbsx16; opcodes[0x19][0]=opcodes[0x19][2]=opcodes[0x19][4]=oraAbsy8; opcodes[0x19][1]=opcodes[0x19][3]=oraAbsy16; opcodes[0x0F][0]=opcodes[0x0F][2]=opcodes[0x0F][4]=oraLong8; opcodes[0x0F][1]=opcodes[0x0F][3]=oraLong16; opcodes[0x1F][0]=opcodes[0x1F][2]=opcodes[0x1F][4]=oraLongx8; opcodes[0x1F][1]=opcodes[0x1F][3]=oraLongx16; opcodes[0x12][0]=opcodes[0x12][2]=opcodes[0x12][4]=oraIndirect8; opcodes[0x12][1]=opcodes[0x12][3]=oraIndirect16; opcodes[0x01][0]=opcodes[0x01][2]=opcodes[0x01][4]=oraIndirectx8; opcodes[0x01][1]=opcodes[0x01][3]=oraIndirectx16; opcodes[0x11][0]=opcodes[0x11][2]=opcodes[0x11][4]=oraIndirecty8; opcodes[0x11][1]=opcodes[0x11][3]=oraIndirecty16; opcodes[0x07][0]=opcodes[0x07][2]=opcodes[0x07][4]=oraIndirectLong8; opcodes[0x07][1]=opcodes[0x07][3]=oraIndirectLong16; opcodes[0x17][0]=opcodes[0x17][2]=opcodes[0x17][4]=oraIndirectLongy8; opcodes[0x17][1]=opcodes[0x17][3]=oraIndirectLongy16; /*ADC group*/ opcodes[0x69][0]=opcodes[0x69][2]=opcodes[0x69][4]=adcImm8; opcodes[0x69][1]=opcodes[0x69][3]=adcImm16; opcodes[0x65][0]=opcodes[0x65][2]=opcodes[0x65][4]=adcZp8; opcodes[0x65][1]=opcodes[0x65][3]=adcZp16; opcodes[0x75][0]=opcodes[0x75][2]=opcodes[0x75][4]=adcZpx8; opcodes[0x75][1]=opcodes[0x75][3]=adcZpx16; opcodes[0x63][0]=opcodes[0x63][2]=opcodes[0x63][4]=adcSp8; opcodes[0x63][1]=opcodes[0x63][3]=adcSp16; opcodes[0x6D][0]=opcodes[0x6D][2]=opcodes[0x6D][4]=adcAbs8; opcodes[0x6D][1]=opcodes[0x6D][3]=adcAbs16; opcodes[0x7D][0]=opcodes[0x7D][2]=opcodes[0x7D][4]=adcAbsx8; opcodes[0x7D][1]=opcodes[0x7D][3]=adcAbsx16; opcodes[0x79][0]=opcodes[0x79][2]=opcodes[0x79][4]=adcAbsy8; opcodes[0x79][1]=opcodes[0x79][3]=adcAbsy16; opcodes[0x6F][0]=opcodes[0x6F][2]=opcodes[0x6F][4]=adcLong8; opcodes[0x6F][1]=opcodes[0x6F][3]=adcLong16; opcodes[0x7F][0]=opcodes[0x7F][2]=opcodes[0x7F][4]=adcLongx8; opcodes[0x7F][1]=opcodes[0x7F][3]=adcLongx16; opcodes[0x72][0]=opcodes[0x72][2]=opcodes[0x72][4]=adcIndirect8; opcodes[0x72][1]=opcodes[0x72][3]=adcIndirect16; opcodes[0x61][0]=opcodes[0x61][2]=opcodes[0x61][4]=adcIndirectx8; opcodes[0x61][1]=opcodes[0x61][3]=adcIndirectx16; opcodes[0x71][0]=opcodes[0x71][2]=opcodes[0x71][4]=adcIndirecty8; opcodes[0x71][1]=opcodes[0x71][3]=adcIndirecty16; opcodes[0x73][0]=opcodes[0x73][2]=opcodes[0x73][4]=adcsIndirecty8; opcodes[0x73][1]=opcodes[0x73][3]=adcsIndirecty16; opcodes[0x67][0]=opcodes[0x67][2]=opcodes[0x67][4]=adcIndirectLong8; opcodes[0x67][1]=opcodes[0x67][3]=adcIndirectLong16; opcodes[0x77][0]=opcodes[0x77][2]=opcodes[0x77][4]=adcIndirectLongy8; opcodes[0x77][1]=opcodes[0x77][3]=adcIndirectLongy16; /*SBC group*/ opcodes[0xE9][0]=opcodes[0xE9][2]=opcodes[0xE9][4]=sbcImm8; opcodes[0xE9][1]=opcodes[0xE9][3]=sbcImm16; opcodes[0xE5][0]=opcodes[0xE5][2]=opcodes[0xE5][4]=sbcZp8; opcodes[0xE5][1]=opcodes[0xE5][3]=sbcZp16; opcodes[0xE3][0]=opcodes[0xE3][2]=opcodes[0xE3][4]=sbcSp8; opcodes[0xE3][1]=opcodes[0xE3][3]=sbcSp16; opcodes[0xF5][0]=opcodes[0xF5][2]=opcodes[0xF5][4]=sbcZpx8; opcodes[0xF5][1]=opcodes[0xF5][3]=sbcZpx16; opcodes[0xED][0]=opcodes[0xED][2]=opcodes[0xED][4]=sbcAbs8; opcodes[0xED][1]=opcodes[0xED][3]=sbcAbs16; opcodes[0xFD][0]=opcodes[0xFD][2]=opcodes[0xFD][4]=sbcAbsx8; opcodes[0xFD][1]=opcodes[0xFD][3]=sbcAbsx16; opcodes[0xF9][0]=opcodes[0xF9][2]=opcodes[0xF9][4]=sbcAbsy8; opcodes[0xF9][1]=opcodes[0xF9][3]=sbcAbsy16; opcodes[0xEF][0]=opcodes[0xEF][2]=opcodes[0xEF][4]=sbcLong8; opcodes[0xEF][1]=opcodes[0xEF][3]=sbcLong16; opcodes[0xFF][0]=opcodes[0xFF][2]=opcodes[0xFF][4]=sbcLongx8; opcodes[0xFF][1]=opcodes[0xFF][3]=sbcLongx16; opcodes[0xF2][0]=opcodes[0xF2][2]=opcodes[0xF2][4]=sbcIndirect8; opcodes[0xF2][1]=opcodes[0xF2][3]=sbcIndirect16; opcodes[0xE1][0]=opcodes[0xE1][2]=opcodes[0xE1][4]=sbcIndirectx8; opcodes[0xE1][1]=opcodes[0xE1][3]=sbcIndirectx16; opcodes[0xF1][0]=opcodes[0xF1][2]=opcodes[0xF1][4]=sbcIndirecty8; opcodes[0xF1][1]=opcodes[0xF1][3]=sbcIndirecty16; opcodes[0xE7][0]=opcodes[0xE7][2]=opcodes[0xE7][4]=sbcIndirectLong8; opcodes[0xE7][1]=opcodes[0xE7][3]=sbcIndirectLong16; opcodes[0xF7][0]=opcodes[0xF7][2]=opcodes[0xF7][4]=sbcIndirectLongy8; opcodes[0xF7][1]=opcodes[0xF7][3]=sbcIndirectLongy16; /*Transfer group*/ opcodes[0xAA][0]=opcodes[0xAA][1]=opcodes[0xAA][4]=tax8; opcodes[0xAA][2]=opcodes[0xAA][3]=tax16; opcodes[0xA8][0]=opcodes[0xA8][1]=opcodes[0xA8][4]=tay8; opcodes[0xA8][2]=opcodes[0xA8][3]=tay16; opcodes[0x8A][0]=opcodes[0x8A][2]=opcodes[0x8A][4]=txa8; opcodes[0x8A][1]=opcodes[0x8A][3]=txa16; opcodes[0x98][0]=opcodes[0x98][2]=opcodes[0x98][4]=tya8; opcodes[0x98][1]=opcodes[0x98][3]=tya16; opcodes[0x9B][0]=opcodes[0x9B][1]=opcodes[0x9B][4]=txy8; opcodes[0x9B][2]=opcodes[0x9B][3]=txy16; opcodes[0xBB][0]=opcodes[0xBB][1]=opcodes[0xBB][4]=tyx8; opcodes[0xBB][2]=opcodes[0xBB][3]=tyx16; opcodes[0xBA][0]=opcodes[0xBA][1]=opcodes[0xBA][4]=tsx8; opcodes[0xBA][2]=opcodes[0xBA][3]=tsx16; opcodes[0x9A][0]=opcodes[0x9A][1]=opcodes[0x9A][4]=txs8; opcodes[0x9A][2]=opcodes[0x9A][3]=txs16; /*Flag Group*/ opcodes[0x18][0]=opcodes[0x18][1]=opcodes[0x18][2]= opcodes[0x18][3]=opcodes[0x18][4]=clc; opcodes[0xD8][0]=opcodes[0xD8][1]=opcodes[0xD8][2]= opcodes[0xD8][3]=opcodes[0xD8][4]=cld; opcodes[0x58][0]=opcodes[0x58][1]=opcodes[0x58][2]= opcodes[0x58][3]=opcodes[0x58][4]=cli; opcodes[0xB8][0]=opcodes[0xB8][1]=opcodes[0xB8][2]= opcodes[0xB8][3]=opcodes[0xB8][4]=clv; opcodes[0x38][0]=opcodes[0x38][1]=opcodes[0x38][2]= opcodes[0x38][3]=opcodes[0x38][4]=sec; opcodes[0xF8][0]=opcodes[0xF8][1]=opcodes[0xF8][2]= opcodes[0xF8][3]=opcodes[0xF8][4]=sed; opcodes[0x78][0]=opcodes[0x78][1]=opcodes[0x78][2]= opcodes[0x78][3]=opcodes[0x78][4]=sei; opcodes[0xFB][0]=opcodes[0xFB][1]=opcodes[0xFB][2]= opcodes[0xFB][3]=opcodes[0xFB][4]=xce; opcodes[0xE2][0]=opcodes[0xE2][1]=opcodes[0xE2][2]= opcodes[0xE2][3]=opcodes[0xE2][4]=sep; opcodes[0xC2][0]=opcodes[0xC2][1]=opcodes[0xC2][2]= opcodes[0xC2][3]=opcodes[0xC2][4]=rep; /*Stack group*/ opcodes[0x8B][0]=opcodes[0x8B][1]=opcodes[0x8B][2]= opcodes[0x8B][3]=phb; opcodes[0x8B][4]=phbe; opcodes[0x4B][0]=opcodes[0x4B][1]=opcodes[0x4B][2]= opcodes[0x4B][3]=phk; opcodes[0x4B][4]=phke; opcodes[0xAB][0]=opcodes[0xAB][1]=opcodes[0xAB][2]= opcodes[0xAB][3]=plb; opcodes[0xAB][4]=plbe; opcodes[0x08][0]=opcodes[0x08][1]=opcodes[0x08][2]= opcodes[0x08][3]=php; opcodes[0x08][4]=php; opcodes[0x28][0]=opcodes[0x28][1]=opcodes[0x28][2]= opcodes[0x28][3]=plp; opcodes[0x28][4]=plp; opcodes[0x48][0]=opcodes[0x48][2]=opcodes[0x48][4]=pha8; opcodes[0x48][1]=opcodes[0x48][3]=pha16; opcodes[0xDA][0]=opcodes[0xDA][1]=opcodes[0xDA][4]=phx8; opcodes[0xDA][2]=opcodes[0xDA][3]=phx16; opcodes[0x5A][0]=opcodes[0x5A][1]=opcodes[0x5A][4]=phy8; opcodes[0x5A][2]=opcodes[0x5A][3]=phy16; opcodes[0x68][0]=opcodes[0x68][2]=opcodes[0x68][4]=pla8; opcodes[0x68][1]=opcodes[0x68][3]=pla16; opcodes[0xFA][0]=opcodes[0xFA][1]=opcodes[0xFA][4]=plx8; opcodes[0xFA][2]=opcodes[0xFA][3]=plx16; opcodes[0x7A][0]=opcodes[0x7A][1]=opcodes[0x7A][4]=ply8; opcodes[0x7A][2]=opcodes[0x7A][3]=ply16; opcodes[0xD4][0]=opcodes[0xD4][1]=opcodes[0xD4][2]= opcodes[0xD4][3]=opcodes[0xD4][4]=pei; opcodes[0xF4][0]=opcodes[0xF4][1]=opcodes[0xF4][2]= opcodes[0xF4][3]=opcodes[0xF4][4]=pea; opcodes[0x62][0]=opcodes[0x62][1]=opcodes[0x62][2]= opcodes[0x62][3]=opcodes[0x62][4]=per; opcodes[0x0B][0]=opcodes[0x0B][1]=opcodes[0x0B][2]= opcodes[0x0B][3]=opcodes[0x0B][4]=phd; opcodes[0x2B][0]=opcodes[0x2B][1]=opcodes[0x2B][2]= opcodes[0x2B][3]=opcodes[0x2B][4]=pld; /*CMP group*/ opcodes[0xC9][0]=opcodes[0xC9][2]=opcodes[0xC9][4]=cmpImm8; opcodes[0xC9][1]=opcodes[0xC9][3]=cmpImm16; opcodes[0xC5][0]=opcodes[0xC5][2]=opcodes[0xC5][4]=cmpZp8; opcodes[0xC5][1]=opcodes[0xC5][3]=cmpZp16; opcodes[0xC3][0]=opcodes[0xC3][2]=opcodes[0xC3][4]=cmpSp8; opcodes[0xC3][1]=opcodes[0xC3][3]=cmpSp16; opcodes[0xD5][0]=opcodes[0xD5][2]=opcodes[0xD5][4]=cmpZpx8; opcodes[0xD5][1]=opcodes[0xD5][3]=cmpZpx16; opcodes[0xCD][0]=opcodes[0xCD][2]=opcodes[0xCD][4]=cmpAbs8; opcodes[0xCD][1]=opcodes[0xCD][3]=cmpAbs16; opcodes[0xDD][0]=opcodes[0xDD][2]=opcodes[0xDD][4]=cmpAbsx8; opcodes[0xDD][1]=opcodes[0xDD][3]=cmpAbsx16; opcodes[0xD9][0]=opcodes[0xD9][2]=opcodes[0xD9][4]=cmpAbsy8; opcodes[0xD9][1]=opcodes[0xD9][3]=cmpAbsy16; opcodes[0xCF][0]=opcodes[0xCF][2]=opcodes[0xCF][4]=cmpLong8; opcodes[0xCF][1]=opcodes[0xCF][3]=cmpLong16; opcodes[0xDF][0]=opcodes[0xDF][2]=opcodes[0xDF][4]=cmpLongx8; opcodes[0xDF][1]=opcodes[0xDF][3]=cmpLongx16; opcodes[0xD2][0]=opcodes[0xD2][2]=opcodes[0xD2][4]=cmpIndirect8; opcodes[0xD2][1]=opcodes[0xD2][3]=cmpIndirect16; opcodes[0xC1][0]=opcodes[0xC1][2]=opcodes[0xC1][4]=cmpIndirectx8; opcodes[0xC1][1]=opcodes[0xC1][3]=cmpIndirectx16; opcodes[0xD1][0]=opcodes[0xD1][2]=opcodes[0xD1][4]=cmpIndirecty8; opcodes[0xD1][1]=opcodes[0xD1][3]=cmpIndirecty16; opcodes[0xC7][0]=opcodes[0xC7][2]=opcodes[0xC7][4]=cmpIndirectLong8; opcodes[0xC7][1]=opcodes[0xC7][3]=cmpIndirectLong16; opcodes[0xD7][0]=opcodes[0xD7][2]=opcodes[0xD7][4]=cmpIndirectLongy8; opcodes[0xD7][1]=opcodes[0xD7][3]=cmpIndirectLongy16; /*CPX group*/ opcodes[0xE0][0]=opcodes[0xE0][1]=opcodes[0xE0][4]=cpxImm8; opcodes[0xE0][2]=opcodes[0xE0][3]=cpxImm16; opcodes[0xE4][0]=opcodes[0xE4][1]=opcodes[0xE4][4]=cpxZp8; opcodes[0xE4][2]=opcodes[0xE4][3]=cpxZp16; opcodes[0xEC][0]=opcodes[0xEC][1]=opcodes[0xEC][4]=cpxAbs8; opcodes[0xEC][2]=opcodes[0xEC][3]=cpxAbs16; /*CPY group*/ opcodes[0xC0][0]=opcodes[0xC0][1]=opcodes[0xC0][4]=cpyImm8; opcodes[0xC0][2]=opcodes[0xC0][3]=cpyImm16; opcodes[0xC4][0]=opcodes[0xC4][1]=opcodes[0xC4][4]=cpyZp8; opcodes[0xC4][2]=opcodes[0xC4][3]=cpyZp16; opcodes[0xCC][0]=opcodes[0xCC][1]=opcodes[0xCC][4]=cpyAbs8; opcodes[0xCC][2]=opcodes[0xCC][3]=cpyAbs16; /*Branch group*/ opcodes[0x90][0]=opcodes[0x90][1]=opcodes[0x90][2]= opcodes[0x90][3]=opcodes[0x90][4]=bcc; opcodes[0xB0][0]=opcodes[0xB0][1]=opcodes[0xB0][2]= opcodes[0xB0][3]=opcodes[0xB0][4]=bcs; opcodes[0xF0][0]=opcodes[0xF0][1]=opcodes[0xF0][2]= opcodes[0xF0][3]=opcodes[0xF0][4]=beq; opcodes[0xD0][0]=opcodes[0xD0][1]=opcodes[0xD0][2]= opcodes[0xD0][3]=opcodes[0xD0][4]=bne; opcodes[0x80][0]=opcodes[0x80][1]=opcodes[0x80][2]= opcodes[0x80][3]=opcodes[0x80][4]=bra; opcodes[0x82][0]=opcodes[0x82][1]=opcodes[0x82][2]= opcodes[0x82][3]=opcodes[0x82][4]=brl; opcodes[0x10][0]=opcodes[0x10][1]=opcodes[0x10][2]= opcodes[0x10][3]=opcodes[0x10][4]=bpl; opcodes[0x30][0]=opcodes[0x30][1]=opcodes[0x30][2]= opcodes[0x30][3]=opcodes[0x30][4]=bmi; opcodes[0x50][0]=opcodes[0x50][1]=opcodes[0x50][2]= opcodes[0x50][3]=opcodes[0x50][4]=bvc; opcodes[0x70][0]=opcodes[0x70][1]=opcodes[0x70][2]= opcodes[0x70][3]=opcodes[0x70][4]=bvs; /*Jump group*/ opcodes[0x4C][0]=opcodes[0x4C][1]=opcodes[0x4C][2]= opcodes[0x4C][3]=opcodes[0x4C][4]=jmp; opcodes[0x5C][0]=opcodes[0x5C][1]=opcodes[0x5C][2]= opcodes[0x5C][3]=opcodes[0x5C][4]=jmplong; opcodes[0x6C][0]=opcodes[0x6C][1]=opcodes[0x6C][2]= opcodes[0x6C][3]=opcodes[0x6C][4]=jmpind; opcodes[0x7C][0]=opcodes[0x7C][1]=opcodes[0x7C][2]= opcodes[0x7C][3]=opcodes[0x7C][4]=jmpindx; opcodes[0xDC][0]=opcodes[0xDC][1]=opcodes[0xDC][2]= opcodes[0xDC][3]=opcodes[0xDC][4]=jmlind; opcodes[0x20][0]=opcodes[0x20][1]=opcodes[0x20][2]= opcodes[0x20][3]=jsr; opcodes[0x20][4]=jsre; opcodes[0xFC][0]=opcodes[0xFC][1]=opcodes[0xFC][2]= opcodes[0xFC][3]=jsrIndx; opcodes[0xFC][4]=jsrIndxe; opcodes[0x60][0]=opcodes[0x60][1]=opcodes[0x60][2]= opcodes[0x60][3]=rts; opcodes[0x60][4]=rtse; opcodes[0x6B][0]=opcodes[0x6B][1]=opcodes[0x6B][2]= opcodes[0x6B][3]=rtl; opcodes[0x6B][4]=rtle; opcodes[0x40][0]=opcodes[0x40][1]=opcodes[0x40][2]= opcodes[0x40][3]=rti; opcodes[0x22][0]=opcodes[0x22][1]=opcodes[0x22][2]= opcodes[0x22][3]=jsl; opcodes[0x22][4]=jsle; /*Shift group*/ opcodes[0x0A][0]=opcodes[0x0A][2]=opcodes[0x0A][4]=asla8; opcodes[0x0A][1]=opcodes[0x0A][3]=asla16; opcodes[0x06][0]=opcodes[0x06][2]=opcodes[0x06][4]=aslZp8; opcodes[0x06][1]=opcodes[0x06][3]=aslZp16; opcodes[0x16][0]=opcodes[0x16][2]=opcodes[0x16][4]=aslZpx8; opcodes[0x16][1]=opcodes[0x16][3]=aslZpx16; opcodes[0x0E][0]=opcodes[0x0E][2]=opcodes[0x0E][4]=aslAbs8; opcodes[0x0E][1]=opcodes[0x0E][3]=aslAbs16; opcodes[0x1E][0]=opcodes[0x1E][2]=opcodes[0x1E][4]=aslAbsx8; opcodes[0x1E][1]=opcodes[0x1E][3]=aslAbsx16; opcodes[0x4A][0]=opcodes[0x4A][2]=opcodes[0x4A][4]=lsra8; opcodes[0x4A][1]=opcodes[0x4A][3]=lsra16; opcodes[0x46][0]=opcodes[0x46][2]=opcodes[0x46][4]=lsrZp8; opcodes[0x46][1]=opcodes[0x46][3]=lsrZp16; opcodes[0x56][0]=opcodes[0x56][2]=opcodes[0x56][4]=lsrZpx8; opcodes[0x56][1]=opcodes[0x56][3]=lsrZpx16; opcodes[0x4E][0]=opcodes[0x4E][2]=opcodes[0x4E][4]=lsrAbs8; opcodes[0x4E][1]=opcodes[0x4E][3]=lsrAbs16; opcodes[0x5E][0]=opcodes[0x5E][2]=opcodes[0x5E][4]=lsrAbsx8; opcodes[0x5E][1]=opcodes[0x5E][3]=lsrAbsx16; opcodes[0x2A][0]=opcodes[0x2A][2]=opcodes[0x2A][4]=rola8; opcodes[0x2A][1]=opcodes[0x2A][3]=rola16; opcodes[0x26][0]=opcodes[0x26][2]=opcodes[0x26][4]=rolZp8; opcodes[0x26][1]=opcodes[0x26][3]=rolZp16; opcodes[0x36][0]=opcodes[0x36][2]=opcodes[0x36][4]=rolZpx8; opcodes[0x36][1]=opcodes[0x36][3]=rolZpx16; opcodes[0x2E][0]=opcodes[0x2E][2]=opcodes[0x2E][4]=rolAbs8; opcodes[0x2E][1]=opcodes[0x2E][3]=rolAbs16; opcodes[0x3E][0]=opcodes[0x3E][2]=opcodes[0x3E][4]=rolAbsx8; opcodes[0x3E][1]=opcodes[0x3E][3]=rolAbsx16; opcodes[0x6A][0]=opcodes[0x6A][2]=opcodes[0x6A][4]=rora8; opcodes[0x6A][1]=opcodes[0x6A][3]=rora16; opcodes[0x66][0]=opcodes[0x66][2]=opcodes[0x66][4]=rorZp8; opcodes[0x66][1]=opcodes[0x66][3]=rorZp16; opcodes[0x76][0]=opcodes[0x76][2]=opcodes[0x76][4]=rorZpx8; opcodes[0x76][1]=opcodes[0x76][3]=rorZpx16; opcodes[0x6E][0]=opcodes[0x6E][2]=opcodes[0x6E][4]=rorAbs8; opcodes[0x6E][1]=opcodes[0x6E][3]=rorAbs16; opcodes[0x7E][0]=opcodes[0x7E][2]=opcodes[0x7E][4]=rorAbsx8; opcodes[0x7E][1]=opcodes[0x7E][3]=rorAbsx16; /*BIT group*/ opcodes[0x89][0]=opcodes[0x89][2]=opcodes[0x89][4]=bitImm8; opcodes[0x89][1]=opcodes[0x89][3]=bitImm16; opcodes[0x24][0]=opcodes[0x24][2]=opcodes[0x24][4]=bitZp8; opcodes[0x24][1]=opcodes[0x24][3]=bitZp16; opcodes[0x34][0]=opcodes[0x34][2]=opcodes[0x34][4]=bitZpx8; opcodes[0x34][1]=opcodes[0x34][3]=bitZpx16; opcodes[0x2C][0]=opcodes[0x2C][2]=opcodes[0x2C][4]=bitAbs8; opcodes[0x2C][1]=opcodes[0x2C][3]=bitAbs16; opcodes[0x3C][0]=opcodes[0x3C][2]=opcodes[0x3C][4]=bitAbsx8; opcodes[0x3C][1]=opcodes[0x3C][3]=bitAbsx16; /*Misc group*/ opcodes[0x00][0]=opcodes[0x00][1]=opcodes[0x00][2]= opcodes[0x00][3]=opcodes[0x00][4]=brk; opcodes[0xEB][0]=opcodes[0xEB][1]=opcodes[0xEB][2]= opcodes[0xEB][3]=opcodes[0xEB][4]=xba; opcodes[0xEA][0]=opcodes[0xEA][1]=opcodes[0xEA][2]= opcodes[0xEA][3]=opcodes[0xEA][4]=nop; opcodes[0x5B][0]=opcodes[0x5B][1]=opcodes[0x5B][2]= opcodes[0x5B][3]=opcodes[0x5B][4]=tcd; opcodes[0x7B][0]=opcodes[0x7B][1]=opcodes[0x7B][2]= opcodes[0x7B][3]=opcodes[0x7B][4]=tdc; opcodes[0x1B][0]=opcodes[0x1B][1]=opcodes[0x1B][2]= opcodes[0x1B][3]=opcodes[0x1B][4]=tcs; opcodes[0x3B][0]=opcodes[0x3B][1]=opcodes[0x3B][2]= opcodes[0x3B][3]=opcodes[0x3B][4]=tsc; opcodes[0xCB][0]=opcodes[0xCB][1]=opcodes[0xCB][2]= opcodes[0xCB][3]=opcodes[0xCB][4]=wai; opcodes[0x44][0]=opcodes[0x44][1]=opcodes[0x44][2]= opcodes[0x44][3]=opcodes[0x44][4]=mvp; opcodes[0x54][0]=opcodes[0x54][1]=opcodes[0x54][2]= opcodes[0x54][3]=opcodes[0x54][4]=mvn; opcodes[0x04][0]=opcodes[0x04][2]=opcodes[0x04][4]=tsbZp8; opcodes[0x04][1]=opcodes[0x04][3]=tsbZp16; opcodes[0x0C][0]=opcodes[0x0C][2]=opcodes[0x0C][4]=tsbAbs8; opcodes[0x0C][1]=opcodes[0x0C][3]=tsbAbs16; opcodes[0x14][0]=opcodes[0x14][2]=opcodes[0x14][4]=trbZp8; opcodes[0x14][1]=opcodes[0x14][3]=trbZp16; opcodes[0x1C][0]=opcodes[0x1C][2]=opcodes[0x1C][4]=trbAbs8; opcodes[0x1C][1]=opcodes[0x1C][3]=trbAbs16; } void updatecpumode() { if (p.e) { cpumode=4; x.b.h=y.b.h=0; } else { cpumode=0; if (!p.m) cpumode|=1; if (!p.x) cpumode|=2; if (p.x) x.b.h=y.b.h=0; } } void nmi65816() { unsigned char temp=0; // printf("NMI %i %i %i\n",p.i,inwai,irqenable); snes_readmem(pbr|pc); cycles-=6; clockspc(6); if (inwai) { pc++; } inwai=0; if (!p.e) { // //printf("%02X -> %04X\n",pbr>>16,s.w); snes_writemem(s.w,pbr>>16); s.w--; // //printf("%02X -> %04X\n",pc>>8,s.w); snes_writemem(s.w,pc>>8); s.w--; // //printf("%02X -> %04X\n",pc&0xFF,s.w); snes_writemem(s.w,pc&0xFF); s.w--; if (p.c) temp|=1; if (p.z) temp|=2; if (p.i) temp|=4; if (p.d) temp|=8; if (p.x) temp|=0x10; if (p.m) temp|=0x20; if (p.v) temp|=0x40; if (p.n) temp|=0x80; // //printf("%02X -> %04X\n",temp,s.w); snes_writemem(s.w,temp); s.w--; pc=readmemw(0xFFEA); pbr=0; p.i=1; p.d=0; // printf("NMI\n"); } else { //snemlog(L"Emulation mode NMI\n"); } } void irq65816() { unsigned char temp=0; // printf("IRQ %i %i %i\n",p.i,inwai,irqenable); snes_readmem(pbr|pc); cycles-=6; clockspc(6); if (inwai && p.i) { pc++; inwai=0; return; } if (inwai) pc++; inwai=0; if (!p.e) { snes_writemem(s.w,pbr>>16); s.w--; snes_writemem(s.w,pc>>8); s.w--; snes_writemem(s.w,pc&0xFF); s.w--; if (p.c) temp|=1; if (p.z) temp|=2; if (p.i) temp|=4; if (p.d) temp|=8; if (p.x) temp|=0x10; if (p.m) temp|=0x20; if (p.v) temp|=0x40; if (p.n) temp|=0x80; snes_writemem(s.w,temp); s.w--; pc=readmemw(0xFFEE); pbr=0; p.i=1; p.d=0; // printf("IRQ\n"); } else { //snemlog(L"Emulation mode IRQ\n"); } }