1 /*Snem 0.1 by Tom Walker
2 65816 emulation*/
3 
4 #include <stdio.h>
5 #include "snes.h"
6 
7 void updatecpumode();
8 int inwai=0;
9 
10 reg a,x,y,s;
11 unsigned long pbr,dbr;
12 unsigned short pc,dp;
13 int skipz,setzf;
14 int ins;
15 extern int output;
16 extern int timetolive;
17 void (*opcodes[256][5])();
18 int cpumode;
19 
20 /*Current opcode*/
21 unsigned char global_opcode;
22 /*Global cycles count*/
23 int cycles;
24 
25 CPU_P p;
26 
27 
28 /*Temporary variables*/
29 unsigned long addr;
30 
31 /*Addressing modes*/
absolute()32 static inline unsigned long absolute()
33 {
34 	unsigned long temp=readmemw(pbr|pc); pc+=2;
35 	return temp|dbr;
36 }
37 
absolutex()38 static inline unsigned long absolutex()
39 {
40 	unsigned long temp=(readmemw(pbr|pc))+x.w+dbr; pc+=2;
41 	return temp;
42 }
43 
absolutey()44 static inline unsigned long absolutey()
45 {
46 	unsigned long temp=(readmemw(pbr|pc))+y.w+dbr; pc+=2;
47 	return temp;
48 }
49 
absolutelong()50 static inline unsigned long absolutelong()
51 {
52 	unsigned long temp=readmemw(pbr|pc); pc+=2;
53 	temp|=(snes_readmem(pbr|pc)<<16); pc++;
54 	return temp;
55 }
56 
absolutelongx()57 static inline unsigned long absolutelongx()
58 {
59 	unsigned long temp=(readmemw(pbr|pc))+x.w; pc+=2;
60 	temp+=(snes_readmem(pbr|pc)<<16); pc++;
61 	return temp;
62 }
63 
zeropage()64 static inline unsigned long zeropage() /*It's actually direct page, but I'm used to calling it zero page*/
65 {
66 	unsigned long temp=snes_readmem(pbr|pc); pc++;
67 	temp+=dp;
68 	if (dp&0xFF) { cycles-=6; clockspc(6); }
69 	return temp&0xFFFF;
70 }
71 
zeropagex()72 static inline unsigned long zeropagex()
73 {
74 	unsigned long temp=snes_readmem(pbr|pc)+x.w; pc++;
75 	if (p.e) temp&=0xFF;
76 	temp+=dp;
77 	if (dp&0xFF) { cycles-=6; clockspc(6); }
78 	return temp&0xFFFF;
79 }
80 
zeropagey()81 static inline unsigned long zeropagey()
82 {
83 	unsigned long temp=snes_readmem(pbr|pc)+y.w; pc++;
84 	if (p.e) temp&=0xFF;
85 	temp+=dp;
86 	if (dp&0xFF) { cycles-=6; clockspc(6); }
87 	return temp&0xFFFF;
88 }
89 
stack()90 static inline unsigned long stack()
91 {
92 	unsigned long temp=snes_readmem(pbr|pc); pc++;
93 	temp+=s.w;
94 	return temp&0xFFFF;
95 }
96 
indirect()97 static inline unsigned long indirect()
98 {
99 	unsigned long temp=(snes_readmem(pbr|pc)+dp)&0xFFFF; pc++;
100 	return (readmemw(temp))+dbr;
101 }
102 
indirectx()103 static inline unsigned long indirectx()
104 {
105 	unsigned long temp=(snes_readmem(pbr|pc)+dp+x.w)&0xFFFF; pc++;
106 	return (readmemw(temp))+dbr;
107 }
jindirectx()108 static inline unsigned long jindirectx() /*JSR (,x) uses PBR instead of DBR, and 2 byte address insted of 1 + dp*/
109 {
110 	unsigned long temp=(snes_readmem(pbr|pc)+(snes_readmem((pbr|pc)+1)<<8)+x.w)+pbr; pc+=2;
111 	return temp;
112 }
113 
indirecty()114 static inline unsigned long indirecty()
115 {
116 	unsigned long temp=(snes_readmem(pbr|pc)+dp)&0xFFFF; pc++;
117 	return (readmemw(temp))+y.w+dbr;
118 }
sindirecty()119 static inline unsigned long sindirecty()
120 {
121 	unsigned long temp=(snes_readmem(pbr|pc)+s.w)&0xFFFF; pc++;
122 	return (readmemw(temp))+y.w+dbr;
123 }
124 
indirectl()125 static inline unsigned long indirectl()
126 {
127 	unsigned long temp=(snes_readmem(pbr|pc)+dp)&0xFFFF; pc++;
128 	unsigned long address=readmemw(temp)|(snes_readmem(temp+2)<<16);
129 	return address;
130 }
131 
indirectly()132 static inline unsigned long indirectly()
133 {
134 	unsigned long temp=(snes_readmem(pbr|pc)+dp)&0xFFFF; pc++;
135 	unsigned long address=(readmemw(temp)|(snes_readmem(temp+2)<<16))+y.w;
136 	return address;
137 }
138 
139 /*Flag setting*/
140 #define setzn8(v)  p.z=!(v); p.n=(v)&0x80
141 #define setzn16(v) p.z=!(v); p.n=(v)&0x8000
142 
143 /*ADC/SBC macros*/
144 #define ADC8()  tempw=a.b.l+temp+((p.c)?1:0);                          \
145 	p.v=(!((a.b.l^temp)&0x80)&&((a.b.l^tempw)&0x80));       \
146 	a.b.l=tempw&0xFF;                                       \
147 	setzn8(a.b.l);                                          \
148 	p.c=tempw&0x100;
149 
150 #define ADC16() templ=a.w+tempw+((p.c)?1:0);                           \
151 	p.v=(!((a.w^tempw)&0x8000)&&((a.w^templ)&0x8000));      \
152 	a.w=templ&0xFFFF;                                       \
153 	setzn16(a.w);                                           \
154 	p.c=templ&0x10000;
155 
156 #define ADCBCD8()                                                       \
157 	tempw=(a.b.l&0xF)+(temp&0xF)+(p.c?1:0);                 \
158 	if (tempw>9)                                            \
159 {                                                       \
160 	tempw+=6;                                       \
161 }                                                       \
162 	tempw+=((a.b.l&0xF0)+(temp&0xF0));                      \
163 	if (tempw>0x9F)                                         \
164 {                                                       \
165 	tempw+=0x60;                                    \
166 }                                                       \
167 	p.v=(!((a.b.l^temp)&0x80)&&((a.b.l^tempw)&0x80));       \
168 	a.b.l=tempw&0xFF;                                       \
169 	setzn8(a.b.l);                                          \
170 	p.c=tempw>0xFF;                                         \
171 	cycles-=6; clockspc(6);
172 
173 #define ADCBCD16()                                                      \
174 	templ=(a.w&0xF)+(tempw&0xF)+(p.c?1:0);                  \
175 	if (templ>9)                                            \
176 {                                                       \
177 	templ+=6;                                       \
178 }                                                       \
179 	templ+=((a.w&0xF0)+(tempw&0xF0));                       \
180 	if (templ>0x9F)                                         \
181 {                                                       \
182 	templ+=0x60;                                    \
183 }                                                       \
184 	templ+=((a.w&0xF00)+(tempw&0xF00));                     \
185 	if (templ>0x9FF)                                        \
186 {                                                       \
187 	templ+=0x600;                                   \
188 }                                                       \
189 	templ+=((a.w&0xF000)+(tempw&0xF000));                   \
190 	if (templ>0x9FFF)                                       \
191 {                                                       \
192 	templ+=0x6000;                                  \
193 }                                                       \
194 	p.v=(!((a.w^tempw)&0x8000)&&((a.w^templ)&0x8000));      \
195 	a.w=templ&0xFFFF;                                       \
196 	setzn16(a.w);                                           \
197 	p.c=templ>0xFFFF;                                       \
198 	cycles-=6; clockspc(6);
199 
200 #define SBC8()  tempw=a.b.l-temp-((p.c)?0:1);                          \
201 	p.v=(((a.b.l^temp)&0x80)&&((a.b.l^tempw)&0x80));        \
202 	a.b.l=tempw&0xFF;                                       \
203 	setzn8(a.b.l);                                          \
204 	p.c=tempw<=0xFF;
205 
206 #define SBC16() templ=a.w-tempw-((p.c)?0:1);                           \
207 	p.v=(((a.w^tempw)&(a.w^templ))&0x8000);                 \
208 	a.w=templ&0xFFFF;                                       \
209 	setzn16(a.w);                                           \
210 	p.c=templ<=0xFFFF;
211 
212 #define SBCBCD8()                                                       \
213 	tempw=(a.b.l&0xF)-(temp&0xF)-(p.c?0:1);                 \
214 	if (tempw>9)                                            \
215 {                                                       \
216 	tempw-=6;                                       \
217 }                                                       \
218 	tempw+=((a.b.l&0xF0)-(temp&0xF0));                      \
219 	if (tempw>0x9F)                                         \
220 {                                                       \
221 	tempw-=0x60;                                    \
222 }                                                       \
223 	p.v=(((a.b.l^temp)&0x80)&&((a.b.l^tempw)&0x80));        \
224 	a.b.l=tempw&0xFF;                                       \
225 	setzn8(a.b.l);                                          \
226 	p.c=tempw<=0xFF;                                        \
227 	cycles-=6; clockspc(6);
228 
229 #define SBCBCD16()                                                      \
230 	templ=(a.w&0xF)-(tempw&0xF)-(p.c?0:1);                  \
231 	if (templ>9)                                            \
232 {                                                       \
233 	templ-=6;                                       \
234 }                                                       \
235 	templ+=((a.w&0xF0)-(tempw&0xF0));                       \
236 	if (templ>0x9F)                                         \
237 {                                                       \
238 	templ-=0x60;                                    \
239 }                                                       \
240 	templ+=((a.w&0xF00)-(tempw&0xF00));                     \
241 	if (templ>0x9FF)                                        \
242 {                                                       \
243 	templ-=0x600;                                   \
244 }                                                       \
245 	templ+=((a.w&0xF000)-(tempw&0xF000));                   \
246 	if (templ>0x9FFF)                                       \
247 {                                                       \
248 	templ-=0x6000;                                  \
249 }                                                       \
250 	p.v=(((a.w^tempw)&0x8000)&&((a.w^templ)&0x8000));       \
251 	a.w=templ&0xFFFF;                                       \
252 	setzn16(a.w);                                           \
253 	p.c=templ<=0xFFFF;                                      \
254 	cycles-=6; clockspc(6);
255 
256 /*Instructions*/
inca8()257 static inline void inca8()
258 {
259 	snes_readmem(pbr|pc);
260 	a.b.l++;
261 	setzn8(a.b.l);
262 }
inca16()263 static inline void inca16()
264 {
265 	snes_readmem(pbr|pc);
266 	a.w++;
267 	setzn16(a.w);
268 }
inx8()269 static inline void inx8()
270 {
271 	snes_readmem(pbr|pc);
272 	x.b.l++;
273 	setzn8(x.b.l);
274 }
inx16()275 static inline void inx16()
276 {
277 	snes_readmem(pbr|pc);
278 	x.w++;
279 	setzn16(x.w);
280 }
iny8()281 static inline void iny8()
282 {
283 	snes_readmem(pbr|pc);
284 	y.b.l++;
285 	setzn8(y.b.l);
286 }
iny16()287 static inline void iny16()
288 {
289 	snes_readmem(pbr|pc);
290 	y.w++;
291 	setzn16(y.w);
292 }
293 
deca8()294 static inline void deca8()
295 {
296 	snes_readmem(pbr|pc);
297 	a.b.l--;
298 	setzn8(a.b.l);
299 }
deca16()300 static inline void deca16()
301 {
302 	snes_readmem(pbr|pc);
303 	a.w--;
304 	setzn16(a.w);
305 }
dex8()306 static inline void dex8()
307 {
308 	snes_readmem(pbr|pc);
309 	x.b.l--;
310 	setzn8(x.b.l);
311 }
dex16()312 static inline void dex16()
313 {
314 	snes_readmem(pbr|pc);
315 	x.w--;
316 	setzn16(x.w);
317 }
dey8()318 static inline void dey8()
319 {
320 	snes_readmem(pbr|pc);
321 	y.b.l--;
322 	setzn8(y.b.l);
323 }
dey16()324 static inline void dey16()
325 {
326 	snes_readmem(pbr|pc);
327 	y.w--;
328 	setzn16(y.w);
329 }
330 
331 /*INC group*/
incZp8()332 static inline void incZp8()
333 {
334 	unsigned char temp;
335 	addr=zeropage();
336 	temp=snes_readmem(addr);
337 	cycles-=6; clockspc(6);
338 	temp++;
339 	setzn8(temp);
340 	snes_writemem(addr,temp);
341 }
incZp16()342 static inline void incZp16()
343 {
344 	unsigned short temp;
345 	addr=zeropage();
346 	temp=readmemw(addr);
347 	cycles-=6; clockspc(6);
348 	temp++;
349 	setzn16(temp);
350 	writememw2(addr,temp);
351 }
352 
incZpx8()353 static inline void incZpx8()
354 {
355 	unsigned char temp;
356 	addr=zeropagex();
357 	temp=snes_readmem(addr);
358 	cycles-=6; clockspc(6);
359 	temp++;
360 	setzn8(temp);
361 	snes_writemem(addr,temp);
362 }
incZpx16()363 static inline void incZpx16()
364 {
365 	unsigned short temp;
366 	addr=zeropagex();
367 	temp=readmemw(addr);
368 	cycles-=6; clockspc(6);
369 	temp++;
370 	setzn16(temp);
371 	writememw2(addr,temp);
372 }
373 
incAbs8()374 static inline void incAbs8()
375 {
376 	unsigned char temp;
377 	addr=absolute();
378 	temp=snes_readmem(addr);
379 	cycles-=6; clockspc(6);
380 	temp++;
381 	setzn8(temp);
382 	snes_writemem(addr,temp);
383 }
incAbs16()384 static inline void incAbs16()
385 {
386 	unsigned short temp;
387 	addr=absolute();
388 	temp=readmemw(addr);
389 	cycles-=6; clockspc(6);
390 	temp++;
391 	setzn16(temp);
392 	writememw2(addr,temp);
393 }
394 
incAbsx8()395 static inline void incAbsx8()
396 {
397 	unsigned char temp;
398 	addr=absolutex();
399 	temp=snes_readmem(addr);
400 	cycles-=6; clockspc(6);
401 	temp++;
402 	setzn8(temp);
403 	snes_writemem(addr,temp);
404 }
incAbsx16()405 static inline void incAbsx16()
406 {
407 	unsigned short temp;
408 	addr=absolutex();
409 	temp=readmemw(addr);
410 	cycles-=6; clockspc(6);
411 	temp++;
412 	setzn16(temp);
413 	writememw2(addr,temp);
414 }
415 
416 /*DEC group*/
decZp8()417 static inline void decZp8()
418 {
419 	unsigned char temp;
420 	addr=zeropage();
421 	temp=snes_readmem(addr);
422 	cycles-=6; clockspc(6);
423 	temp--;
424 	setzn8(temp);
425 	snes_writemem(addr,temp);
426 }
decZp16()427 static inline void decZp16()
428 {
429 	unsigned short temp;
430 	addr=zeropage();
431 	temp=readmemw(addr);
432 	cycles-=6; clockspc(6);
433 	temp--;
434 	setzn16(temp);
435 	writememw2(addr,temp);
436 }
437 
decZpx8()438 static inline void decZpx8()
439 {
440 	unsigned char temp;
441 	addr=zeropagex();
442 	temp=snes_readmem(addr);
443 	cycles-=6; clockspc(6);
444 	temp--;
445 	setzn8(temp);
446 	snes_writemem(addr,temp);
447 }
decZpx16()448 static inline void decZpx16()
449 {
450 	unsigned short temp;
451 	addr=zeropagex();
452 	temp=readmemw(addr);
453 	cycles-=6; clockspc(6);
454 	temp--;
455 	setzn16(temp);
456 	writememw2(addr,temp);
457 }
458 
decAbs8()459 static inline void decAbs8()
460 {
461 	unsigned char temp;
462 	addr=absolute();
463 	temp=snes_readmem(addr);
464 	cycles-=6; clockspc(6);
465 	temp--;
466 	setzn8(temp);
467 	snes_writemem(addr,temp);
468 }
469 
decAbs16()470 static inline void decAbs16()
471 {
472 	unsigned short temp;
473 	addr=absolute();
474 	temp=readmemw(addr);
475 	cycles-=6; clockspc(6);
476 	temp--;
477 	setzn16(temp);
478 	writememw2(addr,temp);
479 }
480 
decAbsx8()481 static inline void decAbsx8()
482 {
483 	unsigned char temp;
484 	addr=absolutex();
485 	temp=snes_readmem(addr);
486 	cycles-=6; clockspc(6);
487 	temp--;
488 	setzn8(temp);
489 	snes_writemem(addr,temp);
490 }
491 
decAbsx16()492 static inline void decAbsx16()
493 {
494 	unsigned short temp;
495 	addr=absolutex();
496 	temp=readmemw(addr);
497 	cycles-=6; clockspc(6);
498 	temp--;
499 	setzn16(temp);
500 	writememw2(addr,temp);
501 }
502 
503 /*Flag group*/
clc()504 static inline void clc()
505 {
506 	snes_readmem(pbr|pc);
507 	p.c=0;
508 }
cld()509 static inline void cld()
510 {
511 	snes_readmem(pbr|pc);
512 	p.d=0;
513 }
cli()514 static inline void cli()
515 {
516 	snes_readmem(pbr|pc);
517 	p.i=0;
518 }
clv()519 static inline void clv()
520 {
521 	snes_readmem(pbr|pc);
522 	p.v=0;
523 }
524 
sec()525 static inline void sec()
526 {
527 	snes_readmem(pbr|pc);
528 	p.c=1;
529 }
sed()530 static inline void sed()
531 {
532 	snes_readmem(pbr|pc);
533 	p.d=1;
534 }
sei()535 static inline void sei()
536 {
537 	snes_readmem(pbr|pc);
538 	p.i=1;
539 }
540 
xce()541 static inline void xce()
542 {
543 	int temp=p.c;
544 	p.c=p.e;
545 	p.e=temp;
546 	snes_readmem(pbr|pc);
547 	updatecpumode();
548 }
549 
sep()550 static inline void sep()
551 {
552 	unsigned char temp=snes_readmem(pbr|pc); pc++;
553 	if (temp&1) p.c=1;
554 	if (temp&2) p.z=1;
555 	if (temp&4) p.i=1;
556 	if (temp&8) p.d=1;
557 	if (temp&0x40) p.v=1;
558 	if (temp&0x80) p.n=1;
559 	if (!p.e)
560 	{
561 		if (temp&0x10) p.x=1;
562 		if (temp&0x20) p.m=1;
563 		updatecpumode();
564 	}
565 }
566 
rep()567 static inline void rep()
568 {
569 	unsigned char temp=snes_readmem(pbr|pc); pc++;
570 	if (temp&1) p.c=0;
571 	if (temp&2) p.z=0;
572 	if (temp&4) p.i=0;
573 	if (temp&8) p.d=0;
574 	if (temp&0x40) p.v=0;
575 	if (temp&0x80) p.n=0;
576 	if (!p.e)
577 	{
578 		if (temp&0x10) p.x=0;
579 		if (temp&0x20) p.m=0;
580 		updatecpumode();
581 	}
582 }
583 
584 /*Transfer group*/
tax8()585 static inline void tax8()
586 {
587 	snes_readmem(pbr|pc);
588 	x.b.l=a.b.l;
589 	setzn8(x.b.l);
590 }
tay8()591 static inline void tay8()
592 {
593 	snes_readmem(pbr|pc);
594 	y.b.l=a.b.l;
595 	setzn8(y.b.l);
596 }
txa8()597 static inline void txa8()
598 {
599 	snes_readmem(pbr|pc);
600 	a.b.l=x.b.l;
601 	setzn8(a.b.l);
602 }
tya8()603 static inline void tya8()
604 {
605 	snes_readmem(pbr|pc);
606 	a.b.l=y.b.l;
607 	setzn8(a.b.l);
608 }
tsx8()609 static inline void tsx8()
610 {
611 	snes_readmem(pbr|pc);
612 	x.b.l=s.b.l;
613 	setzn8(x.b.l);
614 }
txs8()615 static inline void txs8()
616 {
617 	snes_readmem(pbr|pc);
618 	s.b.l=x.b.l;
619 	//        setzn8(s.b.l);
620 }
txy8()621 static inline void txy8()
622 {
623 	snes_readmem(pbr|pc);
624 	y.b.l=x.b.l;
625 	setzn8(y.b.l);
626 }
tyx8()627 static inline void tyx8()
628 {
629 	snes_readmem(pbr|pc);
630 	x.b.l=y.b.l;
631 	setzn8(x.b.l);
632 }
633 
tax16()634 static inline void tax16()
635 {
636 	snes_readmem(pbr|pc);
637 	x.w=a.w;
638 	setzn16(x.w);
639 }
tay16()640 static inline void tay16()
641 {
642 	snes_readmem(pbr|pc);
643 	y.w=a.w;
644 	setzn16(y.w);
645 }
txa16()646 static inline void txa16()
647 {
648 	snes_readmem(pbr|pc);
649 	a.w=x.w;
650 	setzn16(a.w);
651 }
tya16()652 static inline void tya16()
653 {
654 	snes_readmem(pbr|pc);
655 	a.w=y.w;
656 	setzn16(a.w);
657 }
tsx16()658 static inline void tsx16()
659 {
660 	snes_readmem(pbr|pc);
661 	x.w=s.w;
662 	setzn16(x.w);
663 }
txs16()664 static inline void txs16()
665 {
666 	snes_readmem(pbr|pc);
667 	s.w=x.w;
668 	//        setzn16(s.w);
669 }
txy16()670 static inline void txy16()
671 {
672 	snes_readmem(pbr|pc);
673 	y.w=x.w;
674 	setzn16(y.w);
675 }
tyx16()676 static inline void tyx16()
677 {
678 	snes_readmem(pbr|pc);
679 	x.w=y.w;
680 	setzn16(x.w);
681 }
682 
683 /*LDX group*/
ldxImm8()684 static inline void ldxImm8()
685 {
686 	x.b.l=snes_readmem(pbr|pc); pc++;
687 	setzn8(x.b.l);
688 }
689 
ldxZp8()690 static inline void ldxZp8()
691 {
692 	addr=zeropage();
693 	x.b.l=snes_readmem(addr);
694 	setzn8(x.b.l);
695 }
696 
ldxZpy8()697 static inline void ldxZpy8()
698 {
699 	addr=zeropagey();
700 	x.b.l=snes_readmem(addr);
701 	setzn8(x.b.l);
702 }
703 
ldxAbs8()704 static inline void ldxAbs8()
705 {
706 	addr=absolute();
707 	x.b.l=snes_readmem(addr);
708 	setzn8(x.b.l);
709 }
ldxAbsy8()710 static inline void ldxAbsy8()
711 {
712 	addr=absolutey();
713 	x.b.l=snes_readmem(addr);
714 	setzn8(x.b.l);
715 }
716 
ldxImm16()717 static inline void ldxImm16()
718 {
719 	x.w=readmemw(pbr|pc); pc+=2;
720 	setzn16(x.w);
721 }
ldxZp16()722 static inline void ldxZp16()
723 {
724 	addr=zeropage();
725 	x.w=readmemw(addr);
726 	setzn16(x.w);
727 }
ldxZpy16()728 static inline void ldxZpy16()
729 {
730 	addr=zeropagey();
731 	x.w=readmemw(addr);
732 	setzn16(x.w);
733 }
ldxAbs16()734 static inline void ldxAbs16()
735 {
736 	addr=absolute();
737 	x.w=readmemw(addr);
738 	setzn16(x.w);
739 }
ldxAbsy16()740 static inline void ldxAbsy16()
741 {
742 	addr=absolutey();
743 	x.w=readmemw(addr);
744 	setzn16(x.w);
745 }
746 
747 /*LDY group*/
ldyImm8()748 static inline void ldyImm8()
749 {
750 	y.b.l=snes_readmem(pbr|pc); pc++;
751 	setzn8(y.b.l);
752 }
ldyZp8()753 static inline void ldyZp8()
754 {
755 	addr=zeropage();
756 	y.b.l=snes_readmem(addr);
757 	setzn8(y.b.l);
758 }
ldyZpx8()759 static inline void ldyZpx8()
760 {
761 	addr=zeropagex();
762 	y.b.l=snes_readmem(addr);
763 	setzn8(y.b.l);
764 }
ldyAbs8()765 static inline void ldyAbs8()
766 {
767 	addr=absolute();
768 	y.b.l=snes_readmem(addr);
769 	setzn8(y.b.l);
770 }
ldyAbsx8()771 static inline void ldyAbsx8()
772 {
773 	addr=absolutex();
774 	y.b.l=snes_readmem(addr);
775 	setzn8(y.b.l);
776 }
777 
ldyImm16()778 static inline void ldyImm16()
779 {
780 	y.w=readmemw(pbr|pc);
781 	pc+=2;
782 	setzn16(y.w);
783 }
ldyZp16()784 static inline void ldyZp16()
785 {
786 	addr=zeropage();
787 	y.w=readmemw(addr);
788 	setzn16(y.w);
789 }
ldyZpx16()790 static inline void ldyZpx16()
791 {
792 	addr=zeropagex();
793 	y.w=readmemw(addr);
794 	setzn16(y.w);
795 }
ldyAbs16()796 static inline void ldyAbs16()
797 {
798 	addr=absolute();
799 	y.w=readmemw(addr);
800 	setzn16(y.w);
801 }
ldyAbsx16()802 static inline void ldyAbsx16()
803 {
804 	addr=absolutex();
805 	y.w=readmemw(addr);
806 	setzn16(y.w);
807 }
808 
809 /*LDA group*/
ldaImm8()810 static inline void ldaImm8()
811 {
812 	a.b.l=snes_readmem(pbr|pc); pc++;
813 	setzn8(a.b.l);
814 }
ldaZp8()815 static inline void ldaZp8()
816 {
817 	addr=zeropage();
818 	a.b.l=snes_readmem(addr);
819 	setzn8(a.b.l);
820 }
ldaZpx8()821 static inline void ldaZpx8()
822 {
823 	addr=zeropagex();
824 	a.b.l=snes_readmem(addr);
825 	setzn8(a.b.l);
826 }
ldaSp8()827 static inline void ldaSp8()
828 {
829 	addr=stack();
830 	a.b.l=snes_readmem(addr);
831 	setzn8(a.b.l);
832 }
ldaSIndirecty8()833 static inline void ldaSIndirecty8()
834 {
835 	addr=sindirecty();
836 	a.b.l=snes_readmem(addr);
837 	setzn8(a.b.l);
838 }
ldaAbs8()839 static inline void ldaAbs8()
840 {
841 	addr=absolute();
842 	a.b.l=snes_readmem(addr);
843 	setzn8(a.b.l);
844 }
ldaAbsx8()845 static inline void ldaAbsx8()
846 {
847 	addr=absolutex();
848 	a.b.l=snes_readmem(addr);
849 	setzn8(a.b.l);
850 }
ldaAbsy8()851 static inline void ldaAbsy8()
852 {
853 	addr=absolutey();
854 	a.b.l=snes_readmem(addr);
855 	setzn8(a.b.l);
856 }
ldaLong8()857 static inline void ldaLong8()
858 {
859 	addr=absolutelong();
860 	a.b.l=snes_readmem(addr);
861 	setzn8(a.b.l);
862 }
ldaLongx8()863 static inline void ldaLongx8()
864 {
865 	addr=absolutelongx();
866 	a.b.l=snes_readmem(addr);
867 	setzn8(a.b.l);
868 }
ldaIndirect8()869 static inline void ldaIndirect8()
870 {
871 	addr=indirect();
872 	a.b.l=snes_readmem(addr);
873 	setzn8(a.b.l);
874 }
ldaIndirectx8()875 static inline void ldaIndirectx8()
876 {
877 	addr=indirectx();
878 	a.b.l=snes_readmem(addr);
879 	setzn8(a.b.l);
880 }
ldaIndirecty8()881 static inline void ldaIndirecty8()
882 {
883 	addr=indirecty();
884 	a.b.l=snes_readmem(addr);
885 	setzn8(a.b.l);
886 }
ldaIndirectLong8()887 static inline void ldaIndirectLong8()
888 {
889 	addr=indirectl();
890 	a.b.l=snes_readmem(addr);
891 	setzn8(a.b.l);
892 }
ldaIndirectLongy8()893 static inline void ldaIndirectLongy8()
894 {
895 	addr=indirectly();
896 	a.b.l=snes_readmem(addr);
897 	setzn8(a.b.l);
898 }
899 
ldaImm16()900 static inline void ldaImm16()
901 {
902 	a.w=readmemw(pbr|pc); pc+=2;
903 	setzn16(a.w);
904 }
ldaZp16()905 static inline void ldaZp16()
906 {
907 	addr=zeropage();
908 	a.w=readmemw(addr);
909 	setzn16(a.w);
910 }
ldaZpx16()911 static inline void ldaZpx16()
912 {
913 	addr=zeropagex();
914 	a.w=readmemw(addr);
915 	setzn16(a.w);
916 }
ldaSp16()917 static inline void ldaSp16()
918 {
919 	addr=stack();
920 	a.w=readmemw(addr);
921 	setzn16(a.w);
922 }
ldaSIndirecty16()923 static inline void ldaSIndirecty16()
924 {
925 	addr=sindirecty();
926 	a.w=readmemw(addr);
927 	setzn16(a.w);
928 }
ldaAbs16()929 static inline void ldaAbs16()
930 {
931 	addr=absolute();
932 	a.w=readmemw(addr);
933 	setzn16(a.w);
934 }
ldaAbsx16()935 static inline void ldaAbsx16()
936 {
937 	addr=absolutex();
938 	a.w=readmemw(addr);
939 	setzn16(a.w);
940 }
ldaAbsy16()941 static inline void ldaAbsy16()
942 {
943 	addr=absolutey();
944 	a.w=readmemw(addr);
945 	setzn16(a.w);
946 }
ldaLong16()947 static inline void ldaLong16()
948 {
949 	addr=absolutelong();
950 	a.w=readmemw(addr);
951 	setzn16(a.w);
952 }
ldaLongx16()953 static inline void ldaLongx16()
954 {
955 	addr=absolutelongx();
956 	a.w=readmemw(addr);
957 	setzn16(a.w);
958 }
ldaIndirect16()959 static inline void ldaIndirect16()
960 {
961 	addr=indirect();
962 	a.w=readmemw(addr);
963 	setzn16(a.w);
964 }
ldaIndirectx16()965 static inline void ldaIndirectx16()
966 {
967 	addr=indirectx();
968 	a.w=readmemw(addr);
969 	setzn16(a.w);
970 }
ldaIndirecty16()971 static inline void ldaIndirecty16()
972 {
973 	addr=indirecty();
974 	a.w=readmemw(addr);
975 	setzn16(a.w);
976 }
ldaIndirectLong16()977 static inline void ldaIndirectLong16()
978 {
979 	addr=indirectl();
980 	a.w=readmemw(addr);
981 	setzn16(a.w);
982 }
ldaIndirectLongy16()983 static inline void ldaIndirectLongy16()
984 {
985 	addr=indirectly();
986 	a.w=readmemw(addr);
987 	setzn16(a.w);
988 }
989 
990 /*STA group*/
staZp8()991 static inline void staZp8()
992 {
993 	addr=zeropage();
994 	snes_writemem(addr,a.b.l);
995 }
staZpx8()996 static inline void staZpx8()
997 {
998 	addr=zeropagex();
999 	snes_writemem(addr,a.b.l);
1000 }
staAbs8()1001 static inline void staAbs8()
1002 {
1003 	addr=absolute();
1004 	snes_writemem(addr,a.b.l);
1005 }
staAbsx8()1006 static inline void staAbsx8()
1007 {
1008 	addr=absolutex();
1009 	snes_writemem(addr,a.b.l);
1010 }
staAbsy8()1011 static inline void staAbsy8()
1012 {
1013 	addr=absolutey();
1014 	snes_writemem(addr,a.b.l);
1015 }
staLong8()1016 static inline void staLong8()
1017 {
1018 	addr=absolutelong();
1019 	snes_writemem(addr,a.b.l);
1020 }
staLongx8()1021 static inline void staLongx8()
1022 {
1023 	addr=absolutelongx();
1024 	snes_writemem(addr,a.b.l);
1025 }
staIndirect8()1026 static inline void staIndirect8()
1027 {
1028 	addr=indirect();
1029 	snes_writemem(addr,a.b.l);
1030 }
staIndirectx8()1031 static inline void staIndirectx8()
1032 {
1033 	addr=indirectx();
1034 	snes_writemem(addr,a.b.l);
1035 }
staIndirecty8()1036 static inline void staIndirecty8()
1037 {
1038 	addr=indirecty();
1039 	snes_writemem(addr,a.b.l);
1040 }
staIndirectLong8()1041 static inline void staIndirectLong8()
1042 {
1043 	addr=indirectl();
1044 	snes_writemem(addr,a.b.l);
1045 }
staIndirectLongy8()1046 static inline void staIndirectLongy8()
1047 {
1048 	addr=indirectly();
1049 	snes_writemem(addr,a.b.l);
1050 }
staSp8()1051 static inline void staSp8()
1052 {
1053 	addr=stack();
1054 	snes_writemem(addr,a.b.l);
1055 }
staSIndirecty8()1056 static inline void staSIndirecty8()
1057 {
1058 	addr=sindirecty();
1059 	snes_writemem(addr,a.b.l);
1060 }
1061 
staZp16()1062 static inline void staZp16()
1063 {
1064 	addr=zeropage();
1065 	writememw(addr,a.w);
1066 }
staZpx16()1067 static inline void staZpx16()
1068 {
1069 	addr=zeropagex();
1070 	writememw(addr,a.w);
1071 }
staAbs16()1072 static inline void staAbs16()
1073 {
1074 	addr=absolute();
1075 	writememw(addr,a.w);
1076 }
staAbsx16()1077 static inline void staAbsx16()
1078 {
1079 	addr=absolutex();
1080 	writememw(addr,a.w);
1081 }
staAbsy16()1082 static inline void staAbsy16()
1083 {
1084 	addr=absolutey();
1085 	writememw(addr,a.w);
1086 }
staLong16()1087 static inline void staLong16()
1088 {
1089 	addr=absolutelong();
1090 	writememw(addr,a.w);
1091 }
staLongx16()1092 static inline void staLongx16()
1093 {
1094 	addr=absolutelongx();
1095 	writememw(addr,a.w);
1096 }
staIndirect16()1097 static inline void staIndirect16()
1098 {
1099 	addr=indirect();
1100 	writememw(addr,a.w);
1101 }
staIndirectx16()1102 static inline void staIndirectx16()
1103 {
1104 	addr=indirectx();
1105 	writememw(addr,a.w);
1106 }
staIndirecty16()1107 static inline void staIndirecty16()
1108 {
1109 	addr=indirecty();
1110 	writememw(addr,a.w);
1111 }
staIndirectLong16()1112 static inline void staIndirectLong16()
1113 {
1114 	addr=indirectl();
1115 	writememw(addr,a.w);
1116 }
staIndirectLongy16()1117 static inline void staIndirectLongy16()
1118 {
1119 	addr=indirectly();
1120 	writememw(addr,a.w);
1121 }
staSp16()1122 static inline void staSp16()
1123 {
1124 	addr=stack();
1125 	writememw(addr,a.w);
1126 }
staSIndirecty16()1127 static inline void staSIndirecty16()
1128 {
1129 	addr=sindirecty();
1130 	writememw(addr,a.w);
1131 }
1132 
1133 /*STX group*/
stxZp8()1134 static inline void stxZp8()
1135 {
1136 	addr=zeropage();
1137 	snes_writemem(addr,x.b.l);
1138 }
stxZpy8()1139 static inline void stxZpy8()
1140 {
1141 	addr=zeropagey();
1142 	snes_writemem(addr,x.b.l);
1143 }
stxAbs8()1144 static inline void stxAbs8()
1145 {
1146 	addr=absolute();
1147 	snes_writemem(addr,x.b.l);
1148 }
1149 
stxZp16()1150 static inline void stxZp16()
1151 {
1152 	addr=zeropage();
1153 	writememw(addr,x.w);
1154 }
stxZpy16()1155 static inline void stxZpy16()
1156 {
1157 	addr=zeropagey();
1158 	writememw(addr,x.w);
1159 }
stxAbs16()1160 static inline void stxAbs16()
1161 {
1162 	addr=absolute();
1163 	writememw(addr,x.w);
1164 }
1165 
1166 /*STY group*/
styZp8()1167 static inline void styZp8()
1168 {
1169 	addr=zeropage();
1170 	snes_writemem(addr,y.b.l);
1171 }
styZpx8()1172 static inline void styZpx8()
1173 {
1174 	addr=zeropagex();
1175 	snes_writemem(addr,y.b.l);
1176 }
styAbs8()1177 static inline void styAbs8()
1178 {
1179 	addr=absolute();
1180 	snes_writemem(addr,y.b.l);
1181 }
1182 
styZp16()1183 static inline void styZp16()
1184 {
1185 	addr=zeropage();
1186 	writememw(addr,y.w);
1187 }
styZpx16()1188 static inline void styZpx16()
1189 {
1190 	addr=zeropagex();
1191 	writememw(addr,y.w);
1192 }
styAbs16()1193 static inline void styAbs16()
1194 {
1195 	addr=absolute();
1196 	writememw(addr,y.w);
1197 }
1198 
1199 /*STZ group*/
stzZp8()1200 static inline void stzZp8()
1201 {
1202 	addr=zeropage();
1203 	snes_writemem(addr,0);
1204 }
stzZpx8()1205 static inline void stzZpx8()
1206 {
1207 	addr=zeropagex();
1208 	snes_writemem(addr,0);
1209 }
stzAbs8()1210 static inline void stzAbs8()
1211 {
1212 	addr=absolute();
1213 	snes_writemem(addr,0);
1214 }
stzAbsx8()1215 static inline void stzAbsx8()
1216 {
1217 	addr=absolutex();
1218 	snes_writemem(addr,0);
1219 }
1220 
stzZp16()1221 static inline void stzZp16()
1222 {
1223 	addr=zeropage();
1224 	writememw(addr,0);
1225 }
stzZpx16()1226 static inline void stzZpx16()
1227 {
1228 	addr=zeropagex();
1229 	writememw(addr,0);
1230 }
stzAbs16()1231 static inline void stzAbs16()
1232 {
1233 	addr=absolute();
1234 	writememw(addr,0);
1235 }
stzAbsx16()1236 static inline void stzAbsx16()
1237 {
1238 	addr=absolutex();
1239 	writememw(addr,0);
1240 }
1241 
1242 /*ADC group*/
adcImm8()1243 static inline void adcImm8()
1244 {
1245 	unsigned short tempw;
1246 	unsigned char temp=snes_readmem(pbr|pc); pc++;
1247 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1248 }
adcZp8()1249 static inline void adcZp8()
1250 {
1251 	unsigned short tempw;
1252 	unsigned char temp;
1253 	addr=zeropage();
1254 	temp=snes_readmem(addr);
1255 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1256 }
adcZpx8()1257 static inline void adcZpx8()
1258 {
1259 	unsigned short tempw;
1260 	unsigned char temp;
1261 	addr=zeropagex();
1262 	temp=snes_readmem(addr);
1263 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1264 }
adcSp8()1265 static inline void adcSp8()
1266 {
1267 	unsigned short tempw;
1268 	unsigned char temp;
1269 	addr=stack();
1270 	temp=snes_readmem(addr);
1271 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1272 }
adcAbs8()1273 static inline void adcAbs8()
1274 {
1275 	unsigned short tempw;
1276 	unsigned char temp;
1277 	addr=absolute();
1278 	temp=snes_readmem(addr);
1279 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1280 }
adcAbsx8()1281 static inline void adcAbsx8()
1282 {
1283 	unsigned short tempw;
1284 	unsigned char temp;
1285 	addr=absolutex();
1286 	temp=snes_readmem(addr);
1287 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1288 }
adcAbsy8()1289 static inline void adcAbsy8()
1290 {
1291 	unsigned short tempw;
1292 	unsigned char temp;
1293 	addr=absolutey();
1294 	temp=snes_readmem(addr);
1295 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1296 }
adcLong8()1297 static inline void adcLong8()
1298 {
1299 	unsigned short tempw;
1300 	unsigned char temp;
1301 	addr=absolutelong();
1302 	temp=snes_readmem(addr);
1303 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1304 }
adcLongx8()1305 static inline void adcLongx8()
1306 {
1307 	unsigned short tempw;
1308 	unsigned char temp;
1309 	addr=absolutelongx();
1310 	temp=snes_readmem(addr);
1311 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1312 }
adcIndirect8()1313 static inline void adcIndirect8()
1314 {
1315 	unsigned short tempw;
1316 	unsigned char temp;
1317 	addr=indirect();
1318 	temp=snes_readmem(addr);
1319 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1320 }
adcIndirectx8()1321 static inline void adcIndirectx8()
1322 {
1323 	unsigned short tempw;
1324 	unsigned char temp;
1325 	addr=indirectx();
1326 	temp=snes_readmem(addr);
1327 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1328 }
adcIndirecty8()1329 static inline void adcIndirecty8()
1330 {
1331 	unsigned short tempw;
1332 	unsigned char temp;
1333 	addr=indirecty();
1334 	temp=snes_readmem(addr);
1335 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1336 }
adcsIndirecty8()1337 static inline void adcsIndirecty8()
1338 {
1339 	unsigned short tempw;
1340 	unsigned char temp;
1341 	addr=sindirecty();
1342 	temp=snes_readmem(addr);
1343 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1344 }
adcIndirectLong8()1345 static inline void adcIndirectLong8()
1346 {
1347 	unsigned short tempw;
1348 	unsigned char temp;
1349 	addr=indirectl();
1350 	temp=snes_readmem(addr);
1351 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1352 }
adcIndirectLongy8()1353 static inline void adcIndirectLongy8()
1354 {
1355 	unsigned short tempw;
1356 	unsigned char temp;
1357 	addr=indirectly();
1358 	temp=snes_readmem(addr);
1359 	if (p.d) { ADCBCD8(); } else { ADC8(); }
1360 }
1361 
adcImm16()1362 static inline void adcImm16()
1363 {
1364 	unsigned long templ;
1365 	unsigned short tempw;
1366 	tempw=readmemw(pbr|pc); pc+=2;
1367 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1368 }
adcZp16()1369 static inline void adcZp16()
1370 {
1371 	unsigned long templ;
1372 	unsigned short tempw;
1373 	addr=zeropage();
1374 	tempw=readmemw(addr);
1375 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1376 }
adcZpx16()1377 static inline void adcZpx16()
1378 {
1379 	unsigned long templ;
1380 	unsigned short tempw;
1381 	addr=zeropagex();
1382 	tempw=readmemw(addr);
1383 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1384 }
adcSp16()1385 static inline void adcSp16()
1386 {
1387 	unsigned long templ;
1388 	unsigned short tempw;
1389 	addr=stack();
1390 	tempw=readmemw(addr);
1391 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1392 }
adcAbs16()1393 static inline void adcAbs16()
1394 {
1395 	unsigned long templ;
1396 	unsigned short tempw;
1397 	addr=absolute();
1398 	tempw=readmemw(addr);
1399 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1400 }
adcAbsx16()1401 static inline void adcAbsx16()
1402 {
1403 	unsigned long templ;
1404 	unsigned short tempw;
1405 	addr=absolutex();
1406 	tempw=readmemw(addr);
1407 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1408 }
adcAbsy16()1409 static inline void adcAbsy16()
1410 {
1411 	unsigned long templ;
1412 	unsigned short tempw;
1413 	addr=absolutey();
1414 	tempw=readmemw(addr);
1415 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1416 }
adcLong16()1417 static inline void adcLong16()
1418 {
1419 	unsigned long templ;
1420 	unsigned short tempw;
1421 	addr=absolutelong();
1422 	tempw=readmemw(addr);
1423 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1424 }
adcLongx16()1425 static inline void adcLongx16()
1426 {
1427 	unsigned long templ;
1428 	unsigned short tempw;
1429 	addr=absolutelongx();
1430 	tempw=readmemw(addr);
1431 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1432 }
adcIndirect16()1433 static inline void adcIndirect16()
1434 {
1435 	unsigned long templ;
1436 	unsigned short tempw;
1437 	addr=indirect();
1438 	tempw=readmemw(addr);
1439 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1440 }
adcIndirectx16()1441 static inline void adcIndirectx16()
1442 {
1443 	unsigned long templ;
1444 	unsigned short tempw;
1445 	addr=indirectx();
1446 	tempw=readmemw(addr);
1447 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1448 }
adcIndirecty16()1449 static inline void adcIndirecty16()
1450 {
1451 	unsigned long templ;
1452 	unsigned short tempw;
1453 	addr=indirecty();
1454 	tempw=readmemw(addr);
1455 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1456 }
adcsIndirecty16()1457 static inline void adcsIndirecty16()
1458 {
1459 	unsigned long templ;
1460 	unsigned short tempw;
1461 	addr=sindirecty();
1462 	tempw=readmemw(addr);
1463 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1464 }
adcIndirectLong16()1465 static inline void adcIndirectLong16()
1466 {
1467 	unsigned long templ;
1468 	unsigned short tempw;
1469 	addr=indirectl();
1470 	tempw=readmemw(addr);
1471 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1472 }
adcIndirectLongy16()1473 static inline void adcIndirectLongy16()
1474 {
1475 	unsigned long templ;
1476 	unsigned short tempw;
1477 	addr=indirectly();
1478 	tempw=readmemw(addr);
1479 	if (p.d) { ADCBCD16(); } else { ADC16(); }
1480 }
1481 
1482 /*SBC group*/
sbcImm8()1483 static inline void sbcImm8()
1484 {
1485 	unsigned short tempw;
1486 	unsigned char temp=snes_readmem(pbr|pc); pc++;
1487 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1488 }
sbcZp8()1489 static inline void sbcZp8()
1490 {
1491 	unsigned short tempw;
1492 	unsigned char temp;
1493 	addr=zeropage();
1494 	temp=snes_readmem(addr);
1495 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1496 }
sbcZpx8()1497 static inline void sbcZpx8()
1498 {
1499 	unsigned short tempw;
1500 	unsigned char temp;
1501 	addr=zeropagex();
1502 	temp=snes_readmem(addr);
1503 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1504 }
sbcSp8()1505 static inline void sbcSp8()
1506 {
1507 	unsigned short tempw;
1508 	unsigned char temp;
1509 	addr=stack();
1510 	temp=snes_readmem(addr);
1511 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1512 }
sbcAbs8()1513 static inline void sbcAbs8()
1514 {
1515 	unsigned short tempw;
1516 	unsigned char temp;
1517 	addr=absolute();
1518 	temp=snes_readmem(addr);
1519 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1520 }
sbcAbsx8()1521 static inline void sbcAbsx8()
1522 {
1523 	unsigned short tempw;
1524 	unsigned char temp;
1525 	addr=absolutex();
1526 	temp=snes_readmem(addr);
1527 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1528 }
sbcAbsy8()1529 static inline void sbcAbsy8()
1530 {
1531 	unsigned short tempw;
1532 	unsigned char temp;
1533 	addr=absolutey();
1534 	temp=snes_readmem(addr);
1535 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1536 }
sbcLong8()1537 static inline void sbcLong8()
1538 {
1539 	unsigned short tempw;
1540 	unsigned char temp;
1541 	addr=absolutelong();
1542 	temp=snes_readmem(addr);
1543 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1544 }
sbcLongx8()1545 static inline void sbcLongx8()
1546 {
1547 	unsigned short tempw;
1548 	unsigned char temp;
1549 	addr=absolutelongx();
1550 	temp=snes_readmem(addr);
1551 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1552 }
sbcIndirect8()1553 static inline void sbcIndirect8()
1554 {
1555 	unsigned short tempw;
1556 	unsigned char temp;
1557 	addr=indirect();
1558 	temp=snes_readmem(addr);
1559 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1560 }
sbcIndirectx8()1561 static inline void sbcIndirectx8()
1562 {
1563 	unsigned short tempw;
1564 	unsigned char temp;
1565 	addr=indirectx();
1566 	temp=snes_readmem(addr);
1567 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1568 }
sbcIndirecty8()1569 static inline void sbcIndirecty8()
1570 {
1571 	unsigned short tempw;
1572 	unsigned char temp;
1573 	addr=indirecty();
1574 	temp=snes_readmem(addr);
1575 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1576 }
sbcIndirectLong8()1577 static inline void sbcIndirectLong8()
1578 {
1579 	unsigned short tempw;
1580 	unsigned char temp;
1581 	addr=indirectl();
1582 	temp=snes_readmem(addr);
1583 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1584 }
sbcIndirectLongy8()1585 static inline void sbcIndirectLongy8()
1586 {
1587 	unsigned short tempw;
1588 	unsigned char temp;
1589 	addr=indirectly();
1590 	temp=snes_readmem(addr);
1591 	if (p.d) { SBCBCD8(); } else { SBC8(); }
1592 }
1593 
sbcImm16()1594 static inline void sbcImm16()
1595 {
1596 	unsigned long templ;
1597 	unsigned short tempw;
1598 	tempw=readmemw(pbr|pc); pc+=2;
1599 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1600 }
sbcZp16()1601 static inline void sbcZp16()
1602 {
1603 	unsigned long templ;
1604 	unsigned short tempw;
1605 	addr=zeropage();
1606 	tempw=readmemw(addr);
1607 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1608 }
sbcZpx16()1609 static inline void sbcZpx16()
1610 {
1611 	unsigned long templ;
1612 	unsigned short tempw;
1613 	addr=zeropagex();
1614 	tempw=readmemw(addr);
1615 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1616 }
sbcSp16()1617 static inline void sbcSp16()
1618 {
1619 	unsigned long templ;
1620 	unsigned short tempw;
1621 	addr=stack();
1622 	tempw=readmemw(addr);
1623 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1624 }
sbcAbs16()1625 static inline void sbcAbs16()
1626 {
1627 	unsigned long templ;
1628 	unsigned short tempw;
1629 	addr=absolute();
1630 	tempw=readmemw(addr);
1631 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1632 }
sbcAbsx16()1633 static inline void sbcAbsx16()
1634 {
1635 	unsigned long templ;
1636 	unsigned short tempw;
1637 	addr=absolutex();
1638 	tempw=readmemw(addr);
1639 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1640 }
sbcAbsy16()1641 static inline void sbcAbsy16()
1642 {
1643 	unsigned long templ;
1644 	unsigned short tempw;
1645 	addr=absolutey();
1646 	tempw=readmemw(addr);
1647 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1648 }
sbcLong16()1649 static inline void sbcLong16()
1650 {
1651 	unsigned long templ;
1652 	unsigned short tempw;
1653 	addr=absolutelong();
1654 	tempw=readmemw(addr);
1655 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1656 }
sbcLongx16()1657 static inline void sbcLongx16()
1658 {
1659 	unsigned long templ;
1660 	unsigned short tempw;
1661 	addr=absolutelongx();
1662 	tempw=readmemw(addr);
1663 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1664 }
sbcIndirect16()1665 static inline void sbcIndirect16()
1666 {
1667 	unsigned long templ;
1668 	unsigned short tempw;
1669 	addr=indirect();
1670 	tempw=readmemw(addr);
1671 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1672 }
sbcIndirectx16()1673 static inline void sbcIndirectx16()
1674 {
1675 	unsigned long templ;
1676 	unsigned short tempw;
1677 	addr=indirectx();
1678 	tempw=readmemw(addr);
1679 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1680 }
sbcIndirecty16()1681 static inline void sbcIndirecty16()
1682 {
1683 	unsigned long templ;
1684 	unsigned short tempw;
1685 	addr=indirecty();
1686 	tempw=readmemw(addr);
1687 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1688 }
sbcIndirectLong16()1689 static inline void sbcIndirectLong16()
1690 {
1691 	unsigned long templ;
1692 	unsigned short tempw;
1693 	addr=indirectl();
1694 	tempw=readmemw(addr);
1695 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1696 }
sbcIndirectLongy16()1697 static inline void sbcIndirectLongy16()
1698 {
1699 	unsigned long templ;
1700 	unsigned short tempw;
1701 	addr=indirectly();
1702 	tempw=readmemw(addr);
1703 	if (p.d) { SBCBCD16(); } else { SBC16(); }
1704 }
1705 
1706 /*EOR group*/
eorImm8()1707 static inline void eorImm8()
1708 {
1709 	a.b.l^=snes_readmem(pbr|pc); pc++;
1710 	setzn8(a.b.l);
1711 }
eorZp8()1712 static inline void eorZp8()
1713 {
1714 	addr=zeropage();
1715 	a.b.l^=snes_readmem(addr);
1716 	setzn8(a.b.l);
1717 }
eorZpx8()1718 static inline void eorZpx8()
1719 {
1720 	addr=zeropagex();
1721 	a.b.l^=snes_readmem(addr);
1722 	setzn8(a.b.l);
1723 }
eorSp8()1724 static inline void eorSp8()
1725 {
1726 	addr=stack();
1727 	a.b.l^=snes_readmem(addr);
1728 	setzn8(a.b.l);
1729 }
eorAbs8()1730 static inline void eorAbs8()
1731 {
1732 	addr=absolute();
1733 	a.b.l^=snes_readmem(addr);
1734 	setzn8(a.b.l);
1735 }
eorAbsx8()1736 static inline void eorAbsx8()
1737 {
1738 	addr=absolutex();
1739 	a.b.l^=snes_readmem(addr);
1740 	setzn8(a.b.l);
1741 }
eorAbsy8()1742 static inline void eorAbsy8()
1743 {
1744 	addr=absolutey();
1745 	a.b.l^=snes_readmem(addr);
1746 	setzn8(a.b.l);
1747 }
eorLong8()1748 static inline void eorLong8()
1749 {
1750 	addr=absolutelong();
1751 	a.b.l^=snes_readmem(addr);
1752 	setzn8(a.b.l);
1753 }
eorLongx8()1754 static inline void eorLongx8()
1755 {
1756 	addr=absolutelongx();
1757 	a.b.l^=snes_readmem(addr);
1758 	setzn8(a.b.l);
1759 }
eorIndirect8()1760 static inline void eorIndirect8()
1761 {
1762 	addr=indirect();
1763 	a.b.l^=snes_readmem(addr);
1764 	setzn8(a.b.l);
1765 }
eorIndirectx8()1766 static inline void eorIndirectx8()
1767 {
1768 	addr=indirectx();
1769 	a.b.l^=snes_readmem(addr);
1770 	setzn8(a.b.l);
1771 }
1772 
eorIndirecty8()1773 static inline void eorIndirecty8()
1774 {
1775 	addr=indirecty();
1776 	a.b.l^=snes_readmem(addr);
1777 	setzn8(a.b.l);
1778 }
1779 
eorIndirectLong8()1780 static inline void eorIndirectLong8()
1781 {
1782 	addr=indirectl();
1783 	a.b.l^=snes_readmem(addr);
1784 	setzn8(a.b.l);
1785 }
1786 
eorIndirectLongy8()1787 static inline void eorIndirectLongy8()
1788 {
1789 	addr=indirectly();
1790 	a.b.l^=snes_readmem(addr);
1791 	setzn8(a.b.l);
1792 }
1793 
eorImm16()1794 static inline void eorImm16()
1795 {
1796 	a.w^=readmemw(pbr|pc); pc+=2;
1797 	setzn16(a.w);
1798 }
1799 
eorZp16()1800 static inline void eorZp16()
1801 {
1802 	addr=zeropage();
1803 	a.w^=readmemw(addr);
1804 	setzn16(a.w);
1805 }
1806 
eorZpx16()1807 static inline void eorZpx16()
1808 {
1809 	addr=zeropagex();
1810 	a.w^=readmemw(addr);
1811 	setzn16(a.w);
1812 }
1813 
eorSp16()1814 static inline void eorSp16()
1815 {
1816 	addr=stack();
1817 	a.w^=readmemw(addr);
1818 	setzn16(a.w);
1819 }
1820 
eorAbs16()1821 static inline void eorAbs16()
1822 {
1823 	addr=absolute();
1824 	a.w^=readmemw(addr);
1825 	setzn16(a.w);
1826 }
1827 
eorAbsx16()1828 static inline void eorAbsx16()
1829 {
1830 	addr=absolutex();
1831 	a.w^=readmemw(addr);
1832 	setzn16(a.w);
1833 }
1834 
eorAbsy16()1835 static inline void eorAbsy16()
1836 {
1837 	addr=absolutey();
1838 	a.w^=readmemw(addr);
1839 	setzn16(a.w);
1840 }
1841 
eorLong16()1842 static inline void eorLong16()
1843 {
1844 	addr=absolutelong();
1845 	a.w^=readmemw(addr);
1846 	setzn16(a.w);
1847 }
1848 
eorLongx16()1849 static inline void eorLongx16()
1850 {
1851 	addr=absolutelongx();
1852 	a.w^=readmemw(addr);
1853 	setzn16(a.w);
1854 }
1855 
eorIndirect16()1856 static inline void eorIndirect16()
1857 {
1858 	addr=indirect();
1859 	a.w^=readmemw(addr);
1860 	setzn16(a.w);
1861 }
eorIndirectx16()1862 static inline void eorIndirectx16()
1863 {
1864 	addr=indirectx();
1865 	a.w^=readmemw(addr);
1866 	setzn16(a.w);
1867 }
1868 
eorIndirecty16()1869 static inline void eorIndirecty16()
1870 {
1871 	addr=indirecty();
1872 	a.w^=readmemw(addr);
1873 	setzn16(a.w);
1874 }
1875 
eorIndirectLong16()1876 static inline void eorIndirectLong16()
1877 {
1878 	addr=indirectl();
1879 	a.w^=readmemw(addr);
1880 	setzn16(a.w);
1881 }
1882 
eorIndirectLongy16()1883 static inline void eorIndirectLongy16()
1884 {
1885 	addr=indirectly();
1886 	a.w^=readmemw(addr);
1887 	setzn16(a.w);
1888 }
1889 
1890 /*AND group*/
andImm8()1891 static inline void andImm8()
1892 {
1893 	a.b.l&=snes_readmem(pbr|pc); pc++;
1894 	setzn8(a.b.l);
1895 }
andZp8()1896 static inline void andZp8()
1897 {
1898 	addr=zeropage();
1899 	a.b.l&=snes_readmem(addr);
1900 	setzn8(a.b.l);
1901 }
andZpx8()1902 static inline void andZpx8()
1903 {
1904 	addr=zeropagex();
1905 	a.b.l&=snes_readmem(addr);
1906 	setzn8(a.b.l);
1907 }
1908 
andSp8()1909 static inline void andSp8()
1910 {
1911 	addr=stack();
1912 	a.b.l&=snes_readmem(addr);
1913 	setzn8(a.b.l);
1914 }
andAbs8()1915 static inline void andAbs8()
1916 {
1917 	addr=absolute();
1918 	a.b.l&=snes_readmem(addr);
1919 	setzn8(a.b.l);
1920 }
andAbsx8()1921 static inline void andAbsx8()
1922 {
1923 	addr=absolutex();
1924 	a.b.l&=snes_readmem(addr);
1925 	setzn8(a.b.l);
1926 }
andAbsy8()1927 static inline void andAbsy8()
1928 {
1929 	addr=absolutey();
1930 	a.b.l&=snes_readmem(addr);
1931 	setzn8(a.b.l);
1932 }
andLong8()1933 static inline void andLong8()
1934 {
1935 	addr=absolutelong();
1936 	a.b.l&=snes_readmem(addr);
1937 	setzn8(a.b.l);
1938 }
andLongx8()1939 static inline void andLongx8()
1940 {
1941 	addr=absolutelongx();
1942 	a.b.l&=snes_readmem(addr);
1943 	setzn8(a.b.l);
1944 }
andIndirect8()1945 static inline void andIndirect8()
1946 {
1947 	addr=indirect();
1948 	a.b.l&=snes_readmem(addr);
1949 	setzn8(a.b.l);
1950 }
andIndirectx8()1951 static inline void andIndirectx8()
1952 {
1953 	addr=indirectx();
1954 	a.b.l&=snes_readmem(addr);
1955 	setzn8(a.b.l);
1956 }
andIndirecty8()1957 static inline void andIndirecty8()
1958 {
1959 	addr=indirecty();
1960 	a.b.l&=snes_readmem(addr);
1961 	setzn8(a.b.l);
1962 }
andIndirectLong8()1963 static inline void andIndirectLong8()
1964 {
1965 	addr=indirectl();
1966 	a.b.l&=snes_readmem(addr);
1967 	setzn8(a.b.l);
1968 }
andIndirectLongy8()1969 static inline void andIndirectLongy8()
1970 {
1971 	addr=indirectly();
1972 	a.b.l&=snes_readmem(addr);
1973 	setzn8(a.b.l);
1974 }
1975 
andImm16()1976 static inline void andImm16()
1977 {
1978 	a.w&=readmemw(pbr|pc); pc+=2;
1979 	setzn16(a.w);
1980 }
andZp16()1981 static inline void andZp16()
1982 {
1983 	addr=zeropage();
1984 	a.w&=readmemw(addr);
1985 	setzn16(a.w);
1986 }
andZpx16()1987 static inline void andZpx16()
1988 {
1989 	addr=zeropagex();
1990 	a.w&=readmemw(addr);
1991 	setzn16(a.w);
1992 }
andSp16()1993 static inline void andSp16()
1994 {
1995 	addr=stack();
1996 	a.w&=readmemw(addr);
1997 	setzn16(a.w);
1998 }
andAbs16()1999 static inline void andAbs16()
2000 {
2001 	addr=absolute();
2002 	a.w&=readmemw(addr);
2003 	setzn16(a.w);
2004 }
andAbsx16()2005 static inline void andAbsx16()
2006 {
2007 	addr=absolutex();
2008 	a.w&=readmemw(addr);
2009 	setzn16(a.w);
2010 }
andAbsy16()2011 static inline void andAbsy16()
2012 {
2013 	addr=absolutey();
2014 	a.w&=readmemw(addr);
2015 	setzn16(a.w);
2016 }
andLong16()2017 static inline void andLong16()
2018 {
2019 	addr=absolutelong();
2020 	a.w&=readmemw(addr);
2021 	setzn16(a.w);
2022 }
andLongx16()2023 static inline void andLongx16()
2024 {
2025 	addr=absolutelongx();
2026 	a.w&=readmemw(addr);
2027 	setzn16(a.w);
2028 }
andIndirect16()2029 static inline void andIndirect16()
2030 {
2031 	addr=indirect();
2032 	a.w&=readmemw(addr);
2033 	setzn16(a.w);
2034 }
andIndirectx16()2035 static inline void andIndirectx16()
2036 {
2037 	addr=indirectx();
2038 	a.w&=readmemw(addr);
2039 	setzn16(a.w);
2040 }
andIndirecty16()2041 static inline void andIndirecty16()
2042 {
2043 	addr=indirecty();
2044 	a.w&=readmemw(addr);
2045 	setzn16(a.w);
2046 }
andIndirectLong16()2047 static inline void andIndirectLong16()
2048 {
2049 	addr=indirectl();
2050 	a.w&=readmemw(addr);
2051 	setzn16(a.w);
2052 }
andIndirectLongy16()2053 static inline void andIndirectLongy16()
2054 {
2055 	addr=indirectly();
2056 	a.w&=readmemw(addr);
2057 	setzn16(a.w);
2058 }
2059 
2060 /*ORA group*/
oraImm8()2061 static inline void oraImm8()
2062 {
2063 	a.b.l|=snes_readmem(pbr|pc); pc++;
2064 	setzn8(a.b.l);
2065 }
oraZp8()2066 static inline void oraZp8()
2067 {
2068 	addr=zeropage();
2069 	a.b.l|=snes_readmem(addr);
2070 	setzn8(a.b.l);
2071 }
oraZpx8()2072 static inline void oraZpx8()
2073 {
2074 	addr=zeropagex();
2075 	a.b.l|=snes_readmem(addr);
2076 	setzn8(a.b.l);
2077 }
oraSp8()2078 static inline void oraSp8()
2079 {
2080 	addr=stack();
2081 	a.b.l|=snes_readmem(addr);
2082 	setzn8(a.b.l);
2083 }
oraAbs8()2084 static inline void oraAbs8()
2085 {
2086 	addr=absolute();
2087 	a.b.l|=snes_readmem(addr);
2088 	setzn8(a.b.l);
2089 }
oraAbsx8()2090 static inline void oraAbsx8()
2091 {
2092 	addr=absolutex();
2093 	a.b.l|=snes_readmem(addr);
2094 	setzn8(a.b.l);
2095 }
oraAbsy8()2096 static inline void oraAbsy8()
2097 {
2098 	addr=absolutey();
2099 	a.b.l|=snes_readmem(addr);
2100 	setzn8(a.b.l);
2101 }
oraLong8()2102 static inline void oraLong8()
2103 {
2104 	addr=absolutelong();
2105 	a.b.l|=snes_readmem(addr);
2106 	setzn8(a.b.l);
2107 }
oraLongx8()2108 static inline void oraLongx8()
2109 {
2110 	addr=absolutelongx();
2111 	a.b.l|=snes_readmem(addr);
2112 	setzn8(a.b.l);
2113 }
oraIndirect8()2114 static inline void oraIndirect8()
2115 {
2116 	addr=indirect();
2117 	a.b.l|=snes_readmem(addr);
2118 	setzn8(a.b.l);
2119 }
oraIndirectx8()2120 static inline void oraIndirectx8()
2121 {
2122 	addr=indirectx();
2123 	a.b.l|=snes_readmem(addr);
2124 	setzn8(a.b.l);
2125 }
oraIndirecty8()2126 static inline void oraIndirecty8()
2127 {
2128 	addr=indirecty();
2129 	a.b.l|=snes_readmem(addr);
2130 	setzn8(a.b.l);
2131 }
oraIndirectLong8()2132 static inline void oraIndirectLong8()
2133 {
2134 	addr=indirectl();
2135 	a.b.l|=snes_readmem(addr);
2136 	setzn8(a.b.l);
2137 }
oraIndirectLongy8()2138 static inline void oraIndirectLongy8()
2139 {
2140 	addr=indirectly();
2141 	a.b.l|=snes_readmem(addr);
2142 	setzn8(a.b.l);
2143 }
2144 
oraImm16()2145 static inline void oraImm16()
2146 {
2147 	a.w|=readmemw(pbr|pc); pc+=2;
2148 	setzn16(a.w);
2149 }
oraZp16()2150 static inline void oraZp16()
2151 {
2152 	addr=zeropage();
2153 	a.w|=readmemw(addr);
2154 	setzn16(a.w);
2155 }
oraZpx16()2156 static inline void oraZpx16()
2157 {
2158 	addr=zeropagex();
2159 	a.w|=readmemw(addr);
2160 	setzn16(a.w);
2161 }
oraSp16()2162 static inline void oraSp16()
2163 {
2164 	addr=stack();
2165 	a.w|=readmemw(addr);
2166 	setzn16(a.w);
2167 }
oraAbs16()2168 static inline void oraAbs16()
2169 {
2170 	addr=absolute();
2171 	a.w|=readmemw(addr);
2172 	setzn16(a.w);
2173 }
oraAbsx16()2174 static inline void oraAbsx16()
2175 {
2176 	addr=absolutex();
2177 	a.w|=readmemw(addr);
2178 	setzn16(a.w);
2179 }
oraAbsy16()2180 static inline void oraAbsy16()
2181 {
2182 	addr=absolutey();
2183 	a.w|=readmemw(addr);
2184 	setzn16(a.w);
2185 }
oraLong16()2186 static inline void oraLong16()
2187 {
2188 	addr=absolutelong();
2189 	a.w|=readmemw(addr);
2190 	setzn16(a.w);
2191 }
oraLongx16()2192 static inline void oraLongx16()
2193 {
2194 	addr=absolutelongx();
2195 	a.w|=readmemw(addr);
2196 	setzn16(a.w);
2197 }
oraIndirect16()2198 static inline void oraIndirect16()
2199 {
2200 	addr=indirect();
2201 	a.w|=readmemw(addr);
2202 	setzn16(a.w);
2203 }
oraIndirectx16()2204 static inline void oraIndirectx16()
2205 {
2206 	addr=indirectx();
2207 	a.w|=readmemw(addr);
2208 	setzn16(a.w);
2209 }
oraIndirecty16()2210 static inline void oraIndirecty16()
2211 {
2212 	addr=indirecty();
2213 	a.w|=readmemw(addr);
2214 	setzn16(a.w);
2215 }
oraIndirectLong16()2216 static inline void oraIndirectLong16()
2217 {
2218 	addr=indirectl();
2219 	a.w|=readmemw(addr);
2220 	setzn16(a.w);
2221 }
oraIndirectLongy16()2222 static inline void oraIndirectLongy16()
2223 {
2224 	addr=indirectly();
2225 	a.w|=readmemw(addr);
2226 	setzn16(a.w);
2227 }
2228 
2229 /*BIT group*/
bitImm8()2230 static inline void bitImm8()
2231 {
2232 	unsigned char temp=snes_readmem(pbr|pc); pc++;
2233 	p.z=!(temp&a.b.l);
2234 }
bitImm16()2235 static inline void bitImm16()
2236 {
2237 	unsigned short temp=readmemw(pbr|pc); pc+=2;
2238 	p.z=!(temp&a.w);
2239 	setzf=0;
2240 }
2241 
bitZp8()2242 static inline void bitZp8()
2243 {
2244 	unsigned char temp;
2245 	addr=zeropage();
2246 	temp=snes_readmem(addr);
2247 	p.z=!(temp&a.b.l);
2248 	p.v=temp&0x40;
2249 	p.n=temp&0x80;
2250 }
bitZp16()2251 static inline void bitZp16()
2252 {
2253 	unsigned short temp;
2254 	addr=zeropage();
2255 	temp=readmemw(addr);
2256 	p.z=!(temp&a.w);
2257 	p.v=temp&0x4000;
2258 	p.n=temp&0x8000;
2259 }
2260 
bitZpx8()2261 static inline void bitZpx8()
2262 {
2263 	unsigned char temp;
2264 	addr=zeropagex();
2265 	temp=snes_readmem(addr);
2266 	p.z=!(temp&a.b.l);
2267 	p.v=temp&0x40;
2268 	p.n=temp&0x80;
2269 }
bitZpx16()2270 static inline void bitZpx16()
2271 {
2272 	unsigned short temp;
2273 	addr=zeropagex();
2274 	temp=readmemw(addr);
2275 	p.z=!(temp&a.w);
2276 	p.v=temp&0x4000;
2277 	p.n=temp&0x8000;
2278 }
2279 
bitAbs8()2280 static inline void bitAbs8()
2281 {
2282 	unsigned char temp;
2283 	addr=absolute();
2284 	temp=snes_readmem(addr);
2285 	p.z=!(temp&a.b.l);
2286 	p.v=temp&0x40;
2287 	p.n=temp&0x80;
2288 }
bitAbs16()2289 static inline void bitAbs16()
2290 {
2291 	unsigned short temp;
2292 	addr=absolute();
2293 	temp=readmemw(addr);
2294 	p.z=!(temp&a.w);
2295 	p.v=temp&0x4000;
2296 	p.n=temp&0x8000;
2297 }
2298 
bitAbsx8()2299 static inline void bitAbsx8()
2300 {
2301 	unsigned char temp;
2302 	addr=absolutex();
2303 	temp=snes_readmem(addr);
2304 	p.z=!(temp&a.b.l);
2305 	p.v=temp&0x40;
2306 	p.n=temp&0x80;
2307 }
bitAbsx16()2308 static inline void bitAbsx16()
2309 {
2310 	unsigned short temp;
2311 	addr=absolutex();
2312 	temp=readmemw(addr);
2313 	p.z=!(temp&a.w);
2314 	p.v=temp&0x4000;
2315 	p.n=temp&0x8000;
2316 }
2317 
2318 /*CMP group*/
cmpImm8()2319 static inline void cmpImm8()
2320 {
2321 	unsigned char temp;
2322 	temp=snes_readmem(pbr|pc); pc++;
2323 	setzn8(a.b.l-temp);
2324 	p.c=(a.b.l>=temp);
2325 }
cmpZp8()2326 static inline void cmpZp8()
2327 {
2328 	unsigned char temp;
2329 	addr=zeropage();
2330 	temp=snes_readmem(addr);
2331 	setzn8(a.b.l-temp);
2332 	p.c=(a.b.l>=temp);
2333 }
cmpZpx8()2334 static inline void cmpZpx8()
2335 {
2336 	unsigned char temp;
2337 	addr=zeropagex();
2338 	temp=snes_readmem(addr);
2339 	setzn8(a.b.l-temp);
2340 	p.c=(a.b.l>=temp);
2341 }
cmpSp8()2342 static inline void cmpSp8()
2343 {
2344 	unsigned char temp;
2345 	addr=stack();
2346 	temp=snes_readmem(addr);
2347 	setzn8(a.b.l-temp);
2348 	p.c=(a.b.l>=temp);
2349 }
cmpAbs8()2350 static inline void cmpAbs8()
2351 {
2352 	unsigned char temp;
2353 	addr=absolute();
2354 	temp=snes_readmem(addr);
2355 	setzn8(a.b.l-temp);
2356 	p.c=(a.b.l>=temp);
2357 }
cmpAbsx8()2358 static inline void cmpAbsx8()
2359 {
2360 	unsigned char temp;
2361 	addr=absolutex();
2362 	temp=snes_readmem(addr);
2363 	setzn8(a.b.l-temp);
2364 	p.c=(a.b.l>=temp);
2365 }
cmpAbsy8()2366 static inline void cmpAbsy8()
2367 {
2368 	unsigned char temp;
2369 	addr=absolutey();
2370 	temp=snes_readmem(addr);
2371 	setzn8(a.b.l-temp);
2372 	p.c=(a.b.l>=temp);
2373 }
cmpLong8()2374 static inline void cmpLong8()
2375 {
2376 	unsigned char temp;
2377 	addr=absolutelong();
2378 	temp=snes_readmem(addr);
2379 	setzn8(a.b.l-temp);
2380 	p.c=(a.b.l>=temp);
2381 }
cmpLongx8()2382 static inline void cmpLongx8()
2383 {
2384 	unsigned char temp;
2385 	addr=absolutelongx();
2386 	temp=snes_readmem(addr);
2387 	setzn8(a.b.l-temp);
2388 	p.c=(a.b.l>=temp);
2389 }
cmpIndirect8()2390 static inline void cmpIndirect8()
2391 {
2392 	unsigned char temp;
2393 	addr=indirect();
2394 	temp=snes_readmem(addr);
2395 	setzn8(a.b.l-temp);
2396 	p.c=(a.b.l>=temp);
2397 }
cmpIndirectx8()2398 static inline void cmpIndirectx8()
2399 {
2400 	unsigned char temp;
2401 	addr=indirectx();
2402 	temp=snes_readmem(addr);
2403 	setzn8(a.b.l-temp);
2404 	p.c=(a.b.l>=temp);
2405 }
cmpIndirecty8()2406 static inline void cmpIndirecty8()
2407 {
2408 	unsigned char temp;
2409 	addr=indirecty();
2410 	temp=snes_readmem(addr);
2411 	setzn8(a.b.l-temp);
2412 	p.c=(a.b.l>=temp);
2413 }
cmpIndirectLong8()2414 static inline void cmpIndirectLong8()
2415 {
2416 	unsigned char temp;
2417 	addr=indirectl();
2418 	temp=snes_readmem(addr);
2419 	setzn8(a.b.l-temp);
2420 	p.c=(a.b.l>=temp);
2421 }
cmpIndirectLongy8()2422 static inline void cmpIndirectLongy8()
2423 {
2424 	unsigned char temp;
2425 	addr=indirectly();
2426 	temp=snes_readmem(addr);
2427 	setzn8(a.b.l-temp);
2428 	p.c=(a.b.l>=temp);
2429 }
2430 
cmpImm16()2431 static inline void cmpImm16()
2432 {
2433 	unsigned short temp;
2434 	temp=readmemw(pbr|pc); pc+=2;
2435 	setzn16(a.w-temp);
2436 	p.c=(a.w>=temp);
2437 }
cmpZp16()2438 static inline void cmpZp16()
2439 {
2440 	unsigned short temp;
2441 	addr=zeropage();
2442 	temp=readmemw(addr);
2443 	setzn16(a.w-temp);
2444 	p.c=(a.w>=temp);
2445 }
cmpSp16()2446 static inline void cmpSp16()
2447 {
2448 	unsigned short temp;
2449 	addr=stack();
2450 	temp=readmemw(addr);
2451 	setzn16(a.w-temp);
2452 	p.c=(a.w>=temp);
2453 }
cmpZpx16()2454 static inline void cmpZpx16()
2455 {
2456 	unsigned short temp;
2457 	addr=zeropagex();
2458 	temp=readmemw(addr);
2459 	setzn16(a.w-temp);
2460 	p.c=(a.w>=temp);
2461 }
cmpAbs16()2462 static inline void cmpAbs16()
2463 {
2464 	unsigned short temp;
2465 	addr=absolute();
2466 	temp=readmemw(addr);
2467 	setzn16(a.w-temp);
2468 	p.c=(a.w>=temp);
2469 }
cmpAbsx16()2470 static inline void cmpAbsx16()
2471 {
2472 	unsigned short temp;
2473 	addr=absolutex();
2474 	temp=readmemw(addr);
2475 	setzn16(a.w-temp);
2476 	p.c=(a.w>=temp);
2477 }
cmpAbsy16()2478 static inline void cmpAbsy16()
2479 {
2480 	unsigned short temp;
2481 	addr=absolutey();
2482 	temp=readmemw(addr);
2483 	setzn16(a.w-temp);
2484 	p.c=(a.w>=temp);
2485 }
cmpLong16()2486 static inline void cmpLong16()
2487 {
2488 	unsigned short temp;
2489 	addr=absolutelong();
2490 	temp=readmemw(addr);
2491 	setzn16(a.w-temp);
2492 	p.c=(a.w>=temp);
2493 }
cmpLongx16()2494 static inline void cmpLongx16()
2495 {
2496 	unsigned short temp;
2497 	addr=absolutelongx();
2498 	temp=readmemw(addr);
2499 	setzn16(a.w-temp);
2500 	p.c=(a.w>=temp);
2501 }
cmpIndirect16()2502 static inline void cmpIndirect16()
2503 {
2504 	unsigned short temp;
2505 	addr=indirect();
2506 	temp=readmemw(addr);
2507 	setzn16(a.w-temp);
2508 	p.c=(a.w>=temp);
2509 }
cmpIndirectx16()2510 static inline void cmpIndirectx16()
2511 {
2512 	unsigned short temp;
2513 	addr=indirectx();
2514 	temp=readmemw(addr);
2515 	setzn16(a.w-temp);
2516 	p.c=(a.w>=temp);
2517 }
cmpIndirecty16()2518 static inline void cmpIndirecty16()
2519 {
2520 	unsigned short temp;
2521 	addr=indirecty();
2522 	temp=readmemw(addr);
2523 	setzn16(a.w-temp);
2524 	p.c=(a.w>=temp);
2525 }
cmpIndirectLong16()2526 static inline void cmpIndirectLong16()
2527 {
2528 	unsigned short temp;
2529 	addr=indirectl();
2530 	temp=readmemw(addr);
2531 	setzn16(a.w-temp);
2532 	p.c=(a.w>=temp);
2533 }
cmpIndirectLongy16()2534 static inline void cmpIndirectLongy16()
2535 {
2536 	unsigned short temp;
2537 	addr=indirectly();
2538 	temp=readmemw(addr);
2539 	setzn16(a.w-temp);
2540 	p.c=(a.w>=temp);
2541 }
2542 
2543 /*Stack Group*/
phb()2544 static inline void phb()
2545 {
2546 	snes_readmem(pbr|pc);
2547 	snes_writemem(s.w,dbr>>16);
2548 	s.w--;
2549 }
phbe()2550 static inline void phbe()
2551 {
2552 	snes_readmem(pbr|pc);
2553 	snes_writemem(s.w,dbr>>16);
2554 	s.b.l--;
2555 }
2556 
phk()2557 static inline void phk()
2558 {
2559 	snes_readmem(pbr|pc);
2560 	snes_writemem(s.w,pbr>>16);
2561 	s.w--;
2562 }
phke()2563 static inline void phke()
2564 {
2565 	snes_readmem(pbr|pc);
2566 	snes_writemem(s.w,pbr>>16);
2567 	s.b.l--;
2568 }
2569 
pea()2570 static inline void pea()
2571 {
2572 	addr=readmemw(pbr|pc); pc+=2;
2573 	snes_writemem(s.w,addr>>8);
2574 	s.w--;
2575 	snes_writemem(s.w,addr&0xFF);
2576 	s.w--;
2577 }
2578 
pei()2579 static inline void pei()
2580 {
2581 	addr=indirect();
2582 	snes_writemem(s.w,addr>>8);
2583 	s.w--;
2584 	snes_writemem(s.w,addr&0xFF);
2585 	s.w--;
2586 }
2587 
per()2588 static inline void per()
2589 {
2590 	addr=readmemw(pbr|pc); pc+=2;
2591 	addr+=pc;
2592 	snes_writemem(s.w,addr>>8);
2593 	s.w--;
2594 	snes_writemem(s.w,addr&0xFF);
2595 	s.w--;
2596 }
2597 
phd()2598 static inline void phd()
2599 {
2600 	snes_writemem(s.w,dp>>8);
2601 	s.w--;
2602 	snes_writemem(s.w,dp&0xFF);
2603 	s.w--;
2604 }
pld()2605 static inline void pld()
2606 {
2607 	snes_readmem(pbr|pc);
2608 	s.w++;
2609 	cycles-=6;
2610 	clockspc(6);
2611 	dp=snes_readmem(s.w);
2612 	s.w++;
2613 	dp|=(snes_readmem(s.w)<<8);
2614 }
2615 
pha8()2616 static inline void pha8()
2617 {
2618 	snes_readmem(pbr|pc);
2619 	snes_writemem(s.w,a.b.l);
2620 	s.w--;
2621 }
pha16()2622 static inline void pha16()
2623 {
2624 	snes_readmem(pbr|pc);
2625 	snes_writemem(s.w,a.b.h);
2626 	s.w--;
2627 	snes_writemem(s.w,a.b.l);
2628 	s.w--;
2629 }
2630 
phx8()2631 static inline void phx8()
2632 {
2633 	snes_readmem(pbr|pc);
2634 	snes_writemem(s.w,x.b.l);
2635 	s.w--;
2636 }
phx16()2637 static inline void phx16()
2638 {
2639 	snes_readmem(pbr|pc);
2640 	snes_writemem(s.w,x.b.h);
2641 	s.w--;
2642 	snes_writemem(s.w,x.b.l);
2643 	s.w--;
2644 }
2645 
phy8()2646 static inline void phy8()
2647 {
2648 	snes_readmem(pbr|pc);
2649 	snes_writemem(s.w,y.b.l);
2650 	s.w--;
2651 }
phy16()2652 static inline void phy16()
2653 {
2654 	snes_readmem(pbr|pc);
2655 	snes_writemem(s.w,y.b.h);
2656 	s.w--;
2657 	snes_writemem(s.w,y.b.l);
2658 	s.w--;
2659 }
2660 
pla8()2661 static inline void pla8()
2662 {
2663 	snes_readmem(pbr|pc);
2664 	s.w++;
2665 	cycles-=6;
2666 	clockspc(6);
2667 	a.b.l=snes_readmem(s.w);
2668 	setzn8(a.b.l);
2669 }
pla16()2670 static inline void pla16()
2671 {
2672 	snes_readmem(pbr|pc);
2673 	s.w++; cycles-=6;
2674 	clockspc(6);
2675 	a.b.l=snes_readmem(s.w);
2676 	s.w++;
2677 	a.b.h=snes_readmem(s.w);
2678 	setzn16(a.w);
2679 }
2680 
plx8()2681 static inline void plx8()
2682 {
2683 	snes_readmem(pbr|pc);
2684 	s.w++;
2685 	cycles-=6;
2686 	clockspc(6);
2687 	x.b.l=snes_readmem(s.w);
2688 	setzn8(x.b.l);
2689 }
plx16()2690 static inline void plx16()
2691 {
2692 	snes_readmem(pbr|pc);
2693 	s.w++; cycles-=6;
2694 	clockspc(6);
2695 	x.b.l=snes_readmem(s.w);
2696 	s.w++;
2697 	x.b.h=snes_readmem(s.w);
2698 	setzn16(x.w);
2699 }
2700 
ply8()2701 static inline void ply8()
2702 {
2703 	snes_readmem(pbr|pc);
2704 	s.w++;
2705 	cycles-=6;
2706 	clockspc(6);
2707 	y.b.l=snes_readmem(s.w);
2708 	setzn8(y.b.l);
2709 }
ply16()2710 static inline void ply16()
2711 {
2712 	snes_readmem(pbr|pc);
2713 	s.w++;
2714 	cycles-=6;
2715 	clockspc(6);
2716 	y.b.l=snes_readmem(s.w);
2717 	s.w++; y.b.h=snes_readmem(s.w);
2718 	setzn16(y.w);
2719 }
2720 
plb()2721 static inline void plb()
2722 {
2723 	snes_readmem(pbr|pc);
2724 	s.w++;
2725 	cycles-=6;
2726 	clockspc(6);
2727 	dbr=snes_readmem(s.w)<<16;
2728 }
plbe()2729 static inline void plbe()
2730 {
2731 	snes_readmem(pbr|pc);
2732 	s.b.l++;
2733 	cycles-=6;
2734 	clockspc(6);
2735 	dbr=snes_readmem(s.w)<<16;
2736 }
2737 
plp()2738 static inline void plp()
2739 {
2740 	unsigned char temp=snes_readmem(s.w+1); s.w++;
2741 	p.c=temp&1;
2742 	p.z=temp&2;
2743 	p.i=temp&4;
2744 	p.d=temp&8;
2745 	p.x=temp&0x10;
2746 	p.m=temp&0x20;
2747 	p.v=temp&0x40;
2748 	p.n=temp&0x80;
2749 	cycles-=12;
2750 	clockspc(12);
2751 	updatecpumode();
2752 }
plpe()2753 static inline void plpe()
2754 {
2755 	unsigned char temp;
2756 	s.b.l++; temp=snes_readmem(s.w);
2757 	p.c=temp&1;
2758 	p.z=temp&2;
2759 	p.i=temp&4;
2760 	p.d=temp&8;
2761 	p.v=temp&0x40;
2762 	p.n=temp&0x80;
2763 	cycles-=12;
2764 	clockspc(12);
2765 }
2766 
php()2767 static inline void php()
2768 {
2769 	unsigned char temp=(p.c)?1:0;
2770 	if (p.z) temp|=2;
2771 	if (p.i) temp|=4;
2772 	if (p.d) temp|=8;
2773 	if (p.v) temp|=0x40;
2774 	if (p.n) temp|=0x80;
2775 	if (p.x) temp|=0x10;
2776 	if (p.m) temp|=0x20;
2777 	snes_readmem(pbr|pc);
2778 	snes_writemem(s.w,temp); s.w--;
2779 }
phpe()2780 static inline void phpe()
2781 {
2782 	unsigned char temp=(p.c)?1:0;
2783 	if (p.z) temp|=2;
2784 	if (p.i) temp|=4;
2785 	if (p.d) temp|=8;
2786 	if (p.v) temp|=0x40;
2787 	if (p.n) temp|=0x80;
2788 	temp|=0x30;
2789 	snes_readmem(pbr|pc);
2790 	snes_writemem(s.w,temp);
2791 	s.b.l--;
2792 }
2793 
2794 /*CPX group*/
cpxImm8()2795 static inline void cpxImm8()
2796 {
2797 	unsigned char temp=snes_readmem(pbr|pc); pc++;
2798 	setzn8(x.b.l-temp);
2799 	p.c=(x.b.l>=temp);
2800 }
2801 
cpxImm16()2802 static inline void cpxImm16()
2803 {
2804 	unsigned short temp=readmemw(pbr|pc); pc+=2;
2805 	setzn16(x.w-temp);
2806 	p.c=(x.w>=temp);
2807 }
2808 
cpxZp8()2809 static inline void cpxZp8()
2810 {
2811 	unsigned char temp;
2812 	addr=zeropage();
2813 	temp=snes_readmem(addr);
2814 	setzn8(x.b.l-temp);
2815 	p.c=(x.b.l>=temp);
2816 }
cpxZp16()2817 static inline void cpxZp16()
2818 {
2819 	unsigned short temp;
2820 	addr=zeropage();
2821 	temp=readmemw(addr);
2822 	setzn16(x.w-temp);
2823 	p.c=(x.w>=temp);
2824 }
2825 
cpxAbs8()2826 static inline void cpxAbs8()
2827 {
2828 	unsigned char temp;
2829 	addr=absolute();
2830 	temp=snes_readmem(addr);
2831 	setzn8(x.b.l-temp);
2832 	p.c=(x.b.l>=temp);
2833 }
cpxAbs16()2834 static inline void cpxAbs16()
2835 {
2836 	unsigned short temp;
2837 	addr=absolute();
2838 	temp=readmemw(addr);
2839 	setzn16(x.w-temp);
2840 	p.c=(x.w>=temp);
2841 }
2842 
2843 /*CPY group*/
cpyImm8()2844 static inline void cpyImm8()
2845 {
2846 	unsigned char temp=snes_readmem(pbr|pc); pc++;
2847 	setzn8(y.b.l-temp);
2848 	p.c=(y.b.l>=temp);
2849 }
cpyImm16()2850 static inline void cpyImm16()
2851 {
2852 	unsigned short temp=readmemw(pbr|pc); pc+=2;
2853 	setzn16(y.w-temp);
2854 	p.c=(y.w>=temp);
2855 }
2856 
cpyZp8()2857 static inline void cpyZp8()
2858 {
2859 	unsigned char temp;
2860 	addr=zeropage();
2861 	temp=snes_readmem(addr);
2862 	setzn8(y.b.l-temp);
2863 	p.c=(y.b.l>=temp);
2864 }
cpyZp16()2865 static inline void cpyZp16()
2866 {
2867 	unsigned short temp;
2868 	addr=zeropage();
2869 	temp=readmemw(addr);
2870 	setzn16(y.w-temp);
2871 	p.c=(y.w>=temp);
2872 }
2873 
cpyAbs8()2874 static inline void cpyAbs8()
2875 {
2876 	unsigned char temp;
2877 	addr=absolute();
2878 	temp=snes_readmem(addr);
2879 	setzn8(y.b.l-temp);
2880 	p.c=(y.b.l>=temp);
2881 }
2882 
cpyAbs16()2883 static inline void cpyAbs16()
2884 {
2885 	unsigned short temp;
2886 	addr=absolute();
2887 	temp=readmemw(addr);
2888 	setzn16(y.w-temp);
2889 	p.c=(y.w>=temp);
2890 }
2891 
2892 /*Branch group*/
bcc()2893 static inline void bcc()
2894 {
2895 	signed char temp=(signed char)snes_readmem(pbr|pc); pc++;
2896 	if (!p.c)
2897 	{
2898 		pc+=temp;
2899 		cycles-=6;
2900 		clockspc(6);
2901 	}
2902 }
2903 
bcs()2904 static inline void bcs()
2905 {
2906 	signed char temp=(signed char)snes_readmem(pbr|pc); pc++;
2907 	if (p.c)
2908 	{
2909 		pc+=temp;
2910 		cycles-=6;
2911 		clockspc(6);
2912 	}
2913 }
2914 
beq()2915 static inline void beq()
2916 {
2917 	signed char temp=(signed char)snes_readmem(pbr|pc); pc++;
2918 	if (setzf>0)
2919 	{
2920 		p.z=0;
2921 	}
2922 	if (setzf<0)
2923 	{
2924 		p.z=1;
2925 	}
2926 	setzf=0;
2927 	if (p.z)
2928 	{
2929 		pc+=temp;
2930 		cycles-=6;
2931 		clockspc(6);
2932 	}
2933 }
2934 
bne()2935 static inline void bne()
2936 {
2937 	signed char temp=(signed char)snes_readmem(pbr|pc); pc++;
2938 	if (setzf>0)
2939 	{
2940 		p.z=1;
2941 	}
2942 	if (setzf<0)
2943 	{
2944 		p.z=0;
2945 	}
2946 	setzf=0;
2947 	if (!p.z)
2948 	{
2949 		pc+=temp;
2950 		cycles-=6; clockspc(6);
2951 	}
2952 	skipz=0;
2953 }
2954 
bpl()2955 static inline void bpl()
2956 {
2957 	signed char temp=(signed char)snes_readmem(pbr|pc); pc++;
2958 	if (!p.n)
2959 	{
2960 		pc+=temp;
2961 		cycles-=6; clockspc(6);
2962 	}
2963 }
2964 
bmi()2965 static inline void bmi()
2966 {
2967 	signed char temp=(signed char)snes_readmem(pbr|pc); pc++;
2968 	if (p.n)
2969 	{
2970 		pc+=temp;
2971 		cycles-=6; clockspc(6);
2972 	}
2973 }
2974 
bvc()2975 static inline void bvc()
2976 {
2977 	signed char temp=(signed char)snes_readmem(pbr|pc); pc++;
2978 	if (!p.v)
2979 	{
2980 		pc+=temp;
2981 		cycles-=6; clockspc(6);
2982 	}
2983 }
2984 
bvs()2985 static inline void bvs()
2986 {
2987 	signed char temp=(signed char)snes_readmem(pbr|pc); pc++;
2988 	if (p.v)
2989 	{
2990 		pc+=temp;
2991 		cycles-=6; clockspc(6);
2992 	}
2993 }
2994 
bra()2995 static inline void bra()
2996 {
2997 	signed char temp=(signed char)snes_readmem(pbr|pc); pc++;
2998 	pc+=temp;
2999 	cycles-=6; clockspc(6);
3000 }
3001 
brl()3002 static inline void brl()
3003 {
3004 	unsigned short temp=readmemw(pbr|pc); pc+=2;
3005 	pc+=temp;
3006 	cycles-=6; clockspc(6);
3007 }
3008 
3009 /*Jump group*/
jmp()3010 static inline void jmp()
3011 {
3012 	addr=readmemw(pbr|pc);
3013 	pc=addr&0xFFFF;
3014 }
3015 
jmplong()3016 static inline void jmplong()
3017 {
3018 	addr=readmemw(pbr|pc)|(snes_readmem((pbr|pc)+2)<<16);
3019 	pc=addr&0xFFFF;
3020 	pbr=addr&0xFF0000;
3021 }
3022 
jmpind()3023 static inline void jmpind()
3024 {
3025 	addr=readmemw(pbr|pc);
3026 	pc=readmemw(addr);
3027 }
3028 
jmpindx()3029 static inline void jmpindx()
3030 {
3031 	addr=(readmemw(pbr|pc))+x.w+pbr;
3032 	pc=readmemw(addr);
3033 }
3034 
jmlind()3035 static inline void jmlind()
3036 {
3037 	addr=readmemw(pbr|pc);
3038 	pc=readmemw(addr);
3039 	pbr=snes_readmem(addr+2)<<16;
3040 }
3041 
jsr()3042 static inline void jsr()
3043 {
3044 	addr=readmemw(pbr|pc);  pc++;
3045 	snes_readmem(pbr|pc);
3046 	snes_writemem(s.w,pc>>8);   s.w--;
3047 	snes_writemem(s.w,pc&0xFF); s.w--;
3048 	pc=addr&0xFFFF;
3049 }
3050 
jsre()3051 static inline void jsre()
3052 {
3053 	addr=readmemw(pbr|pc);  pc++;
3054 	snes_readmem(pbr|pc);
3055 	snes_writemem(s.w,pc>>8);   s.b.l--;
3056 	snes_writemem(s.w,pc&0xFF); s.b.l--;
3057 	pc=addr&0xFFFF;
3058 }
3059 
jsrIndx()3060 static inline void jsrIndx()
3061 {
3062 	addr=jindirectx(); pc--;
3063 	snes_writemem(s.w,pc>>8);   s.w--;
3064 	snes_writemem(s.w,pc&0xFF); s.w--;
3065 	pc=readmemw(addr);
3066 }
3067 
jsrIndxe()3068 static inline void jsrIndxe()
3069 {
3070 	addr=jindirectx(); pc--;
3071 	snes_writemem(s.w,pc>>8);   s.b.l--;
3072 	snes_writemem(s.w,pc&0xFF); s.b.l--;
3073 	pc=readmemw(addr);
3074 }
3075 
jsl()3076 static inline void jsl()
3077 {
3078 	unsigned char temp;
3079 	addr=readmemw(pbr|pc);  pc+=2;
3080 	temp=snes_readmem(pbr|pc);
3081 	snes_writemem(s.w,pbr>>16); s.w--;
3082 	snes_writemem(s.w,pc>>8);   s.w--;
3083 	snes_writemem(s.w,pc&0xFF); s.w--;
3084 	pc=addr&0xFFFF;
3085 	pbr=temp<<16;
3086 }
3087 
jsle()3088 static inline void jsle()
3089 {
3090 	unsigned char temp;
3091 	addr=readmemw(pbr|pc);  pc+=2;
3092 	temp=snes_readmem(pbr|pc);
3093 	snes_writemem(s.w,pbr>>16); s.b.l--;
3094 	snes_writemem(s.w,pc>>8);   s.b.l--;
3095 	snes_writemem(s.w,pc&0xFF); s.b.l--;
3096 	pc=addr&0xFFFF;
3097 	pbr=temp<<16;
3098 }
3099 
rtl()3100 static inline void rtl()
3101 {
3102 	cycles-=18; clockspc(18);
3103 	pc=readmemw(s.w+1); s.w+=2;
3104 	pbr=snes_readmem(s.w+1)<<16; s.w++;
3105 	pc++;
3106 }
3107 
rtle()3108 static inline void rtle()
3109 {
3110 	cycles-=18; clockspc(18);
3111 	s.b.l++; pc=snes_readmem(s.w);
3112 	s.b.l++; pc|=(snes_readmem(s.w)<<8);
3113 	s.b.l++; pbr=snes_readmem(s.w)<<16;
3114 }
3115 
rts()3116 static inline void rts()
3117 {
3118 	cycles-=18; clockspc(18);
3119 	pc=readmemw(s.w+1); s.w+=2;
3120 	pc++;
3121 }
3122 
rtse()3123 static inline void rtse()
3124 {
3125 	cycles-=18; clockspc(18);
3126 	s.b.l++;
3127 	pc=snes_readmem(s.w);
3128 	s.b.l++;
3129 	pc|=(snes_readmem(s.w)<<8);
3130 }
3131 
rti()3132 static inline void rti()
3133 {
3134 	unsigned char temp;
3135 	cycles-=6;
3136 	s.w++;
3137 	clockspc(6);
3138 	temp=snes_readmem(s.w);
3139 	p.c=temp&1;
3140 	p.z=temp&2;
3141 	p.i=temp&4;
3142 	p.d=temp&8;
3143 	p.x=temp&0x10;
3144 	p.m=temp&0x20;
3145 	p.v=temp&0x40;
3146 	p.n=temp&0x80;
3147 	s.w++;
3148 	pc=snes_readmem(s.w);
3149 	s.w++;
3150 	pc|=(snes_readmem(s.w)<<8);
3151 	s.w++;
3152 	pbr=snes_readmem(s.w)<<16;
3153 	updatecpumode();
3154 }
3155 
3156 /*Shift group*/
asla8()3157 static inline void asla8()
3158 {
3159 	snes_readmem(pbr|pc);
3160 	p.c=a.b.l&0x80;
3161 	a.b.l<<=1;
3162 	setzn8(a.b.l);
3163 }
asla16()3164 static inline void asla16()
3165 {
3166 	snes_readmem(pbr|pc);
3167 	p.c=a.w&0x8000;
3168 	a.w<<=1;
3169 	setzn16(a.w);
3170 }
3171 
aslZp8()3172 static inline void aslZp8()
3173 {
3174 	unsigned char temp;
3175 
3176 	addr=zeropage();
3177 	temp=snes_readmem(addr);
3178 	cycles-=6; clockspc(6);
3179 	p.c=temp&0x80;
3180 	temp<<=1;
3181 	setzn8(temp);
3182 	snes_writemem(addr,temp);
3183 }
3184 
aslZp16()3185 static inline void aslZp16()
3186 {
3187 	unsigned short temp;
3188 
3189 	addr=zeropage();
3190 	temp=readmemw(addr);
3191 	cycles-=6; clockspc(6);
3192 	p.c=temp&0x8000;
3193 	temp<<=1;
3194 	setzn16(temp);
3195 	writememw2(addr,temp);
3196 }
3197 
aslZpx8()3198 static inline void aslZpx8()
3199 {
3200 	unsigned char temp;
3201 
3202 	addr=zeropagex();
3203 	temp=snes_readmem(addr);
3204 	cycles-=6; clockspc(6);
3205 	p.c=temp&0x80;
3206 	temp<<=1;
3207 	setzn8(temp);
3208 	snes_writemem(addr,temp);
3209 }
3210 
aslZpx16()3211 static inline void aslZpx16()
3212 {
3213 	unsigned short temp;
3214 
3215 	addr=zeropagex();
3216 	temp=readmemw(addr);
3217 	cycles-=6; clockspc(6);
3218 	p.c=temp&0x8000;
3219 	temp<<=1;
3220 	setzn16(temp);
3221 	writememw2(addr,temp);
3222 }
3223 
aslAbs8()3224 static inline void aslAbs8()
3225 {
3226 	unsigned char temp;
3227 
3228 	addr=absolute();
3229 	temp=snes_readmem(addr);
3230 	cycles-=6; clockspc(6);
3231 	p.c=temp&0x80;
3232 	temp<<=1;
3233 	setzn8(temp);
3234 	snes_writemem(addr,temp);
3235 }
3236 
aslAbs16()3237 static inline void aslAbs16()
3238 {
3239 	unsigned short temp;
3240 
3241 	addr=absolute();
3242 	temp=readmemw(addr);
3243 	cycles-=6; clockspc(6);
3244 	p.c=temp&0x8000;
3245 	temp<<=1;
3246 	setzn16(temp);
3247 	writememw2(addr,temp);
3248 }
3249 
aslAbsx8()3250 static inline void aslAbsx8()
3251 {
3252 	unsigned char temp;
3253 
3254 	addr=absolutex();
3255 	temp=snes_readmem(addr);
3256 	cycles-=6; clockspc(6);
3257 	p.c=temp&0x80;
3258 	temp<<=1;
3259 	setzn8(temp);
3260 	snes_writemem(addr,temp);
3261 }
3262 
aslAbsx16()3263 static inline void aslAbsx16()
3264 {
3265 	unsigned short temp;
3266 
3267 	addr=absolutex();
3268 	temp=readmemw(addr);
3269 	cycles-=6; clockspc(6);
3270 	p.c=temp&0x8000;
3271 	temp<<=1;
3272 	setzn16(temp);
3273 	writememw2(addr,temp);
3274 }
3275 
lsra8()3276 static inline void lsra8()
3277 {
3278 	snes_readmem(pbr|pc);
3279 	p.c=a.b.l&1;
3280 	a.b.l>>=1;
3281 	setzn8(a.b.l);
3282 }
lsra16()3283 static inline void lsra16()
3284 {
3285 	snes_readmem(pbr|pc);
3286 	p.c=a.w&1;
3287 	a.w>>=1;
3288 	setzn16(a.w);
3289 }
3290 
lsrZp8()3291 static inline void lsrZp8()
3292 {
3293 	unsigned char temp;
3294 
3295 	addr=zeropage();
3296 	temp=snes_readmem(addr);
3297 	cycles-=6; clockspc(6);
3298 	p.c=temp&1;
3299 	temp>>=1;
3300 	setzn8(temp);
3301 	snes_writemem(addr,temp);
3302 }
3303 
lsrZp16()3304 static inline void lsrZp16()
3305 {
3306 	unsigned short temp;
3307 
3308 	addr=zeropage();
3309 	temp=readmemw(addr);
3310 	cycles-=6; clockspc(6);
3311 	p.c=temp&1;
3312 	temp>>=1;
3313 	setzn16(temp);
3314 	writememw2(addr,temp);
3315 }
3316 
lsrZpx8()3317 static inline void lsrZpx8()
3318 {
3319 	unsigned char temp;
3320 
3321 	addr=zeropagex();
3322 	temp=snes_readmem(addr);
3323 	cycles-=6; clockspc(6);
3324 	p.c=temp&1;
3325 	temp>>=1;
3326 	setzn8(temp);
3327 	snes_writemem(addr,temp);
3328 }
3329 
lsrZpx16()3330 static inline void lsrZpx16()
3331 {
3332 	unsigned short temp;
3333 
3334 	addr=zeropagex();
3335 	temp=readmemw(addr);
3336 	cycles-=6; clockspc(6);
3337 	p.c=temp&1;
3338 	temp>>=1;
3339 	setzn16(temp);
3340 	writememw2(addr,temp);
3341 }
3342 
lsrAbs8()3343 static inline void lsrAbs8()
3344 {
3345 	unsigned char temp;
3346 
3347 	addr=absolute();
3348 	temp=snes_readmem(addr);
3349 	cycles-=6; clockspc(6);
3350 	p.c=temp&1;
3351 	temp>>=1;
3352 	setzn8(temp);
3353 	snes_writemem(addr,temp);
3354 }
3355 
lsrAbs16()3356 static inline void lsrAbs16()
3357 {
3358 	unsigned short temp;
3359 
3360 	addr=absolute();
3361 	temp=readmemw(addr);
3362 	cycles-=6; clockspc(6);
3363 	p.c=temp&1;
3364 	temp>>=1;
3365 	setzn16(temp);
3366 	writememw2(addr,temp);
3367 }
3368 
lsrAbsx8()3369 static inline void lsrAbsx8()
3370 {
3371 	unsigned char temp;
3372 
3373 	addr=absolutex();
3374 	temp=snes_readmem(addr);
3375 	cycles-=6; clockspc(6);
3376 	p.c=temp&1;
3377 	temp>>=1;
3378 	setzn8(temp);
3379 	snes_writemem(addr,temp);
3380 }
3381 
lsrAbsx16()3382 static inline void lsrAbsx16()
3383 {
3384 	unsigned short temp;
3385 
3386 	addr=absolutex();
3387 	temp=readmemw(addr);
3388 	cycles-=6; clockspc(6);
3389 	p.c=temp&1;
3390 	temp>>=1;
3391 	setzn16(temp);
3392 	writememw2(addr,temp);
3393 }
3394 
rola8()3395 static inline void rola8()
3396 {
3397 	snes_readmem(pbr|pc);
3398 	addr=p.c;
3399 	p.c=a.b.l&0x80;
3400 	a.b.l<<=1;
3401 	if (addr) a.b.l|=1;
3402 	setzn8(a.b.l);
3403 }
3404 
rola16()3405 static inline void rola16()
3406 {
3407 	snes_readmem(pbr|pc);
3408 	addr=p.c;
3409 	p.c=a.w&0x8000;
3410 	a.w<<=1;
3411 	if (addr) a.w|=1;
3412 	setzn16(a.w);
3413 }
3414 
rolZp8()3415 static inline void rolZp8()
3416 {
3417 	unsigned char temp;
3418 	int tempc;
3419 	addr=zeropage();
3420 	temp=snes_readmem(addr);
3421 	cycles-=6; clockspc(6);
3422 	tempc=p.c;
3423 	p.c=temp&0x80;
3424 	temp<<=1;
3425 	if (tempc) temp|=1;
3426 	setzn8(temp);
3427 	snes_writemem(addr,temp);
3428 }
3429 
rolZp16()3430 static inline void rolZp16()
3431 {
3432 	unsigned short temp;
3433 	int tempc;
3434 	addr=zeropage();
3435 	temp=readmemw(addr);
3436 	cycles-=6; clockspc(6);
3437 	tempc=p.c;
3438 	p.c=temp&0x8000;
3439 	temp<<=1;
3440 	if (tempc) temp|=1;
3441 	setzn16(temp);
3442 	writememw2(addr,temp);
3443 }
3444 
rolZpx8()3445 static inline void rolZpx8()
3446 {
3447 	unsigned char temp;
3448 	int tempc;
3449 	addr=zeropagex();
3450 	temp=snes_readmem(addr);
3451 	cycles-=6; clockspc(6);
3452 	tempc=p.c;
3453 	p.c=temp&0x80;
3454 	temp<<=1;
3455 	if (tempc) temp|=1;
3456 	setzn8(temp);
3457 	snes_writemem(addr,temp);
3458 }
rolZpx16()3459 static inline void rolZpx16()
3460 {
3461 	unsigned short temp;
3462 	int tempc;
3463 	addr=zeropagex();
3464 	temp=readmemw(addr);
3465 	cycles-=6; clockspc(6);
3466 	tempc=p.c;
3467 	p.c=temp&0x8000;
3468 	temp<<=1;
3469 	if (tempc) temp|=1;
3470 	setzn16(temp);
3471 	writememw2(addr,temp);
3472 }
3473 
rolAbs8()3474 static inline void rolAbs8()
3475 {
3476 	unsigned char temp;
3477 	int tempc;
3478 	addr=absolute();
3479 	temp=snes_readmem(addr);
3480 	cycles-=6; clockspc(6);
3481 	tempc=p.c;
3482 	p.c=temp&0x80;
3483 	temp<<=1;
3484 	if (tempc) temp|=1;
3485 	setzn8(temp);
3486 	snes_writemem(addr,temp);
3487 }
rolAbs16()3488 static inline void rolAbs16()
3489 {
3490 	unsigned short temp;
3491 	int tempc;
3492 	addr=absolute();
3493 	temp=readmemw(addr);
3494 	cycles-=6; clockspc(6);
3495 	tempc=p.c;
3496 	p.c=temp&0x8000;
3497 	temp<<=1;
3498 	if (tempc) temp|=1;
3499 	setzn16(temp);
3500 	writememw2(addr,temp);
3501 }
3502 
rolAbsx8()3503 static inline void rolAbsx8()
3504 {
3505 	unsigned char temp;
3506 	int tempc;
3507 	addr=absolutex();
3508 	temp=snes_readmem(addr);
3509 	cycles-=6; clockspc(6);
3510 	tempc=p.c;
3511 	p.c=temp&0x80;
3512 	temp<<=1;
3513 	if (tempc) temp|=1;
3514 	setzn8(temp);
3515 	snes_writemem(addr,temp);
3516 }
rolAbsx16()3517 static inline void rolAbsx16()
3518 {
3519 	unsigned short temp;
3520 	int tempc;
3521 	addr=absolutex();
3522 	temp=readmemw(addr);
3523 	cycles-=6; clockspc(6);
3524 	tempc=p.c;
3525 	p.c=temp&0x8000;
3526 	temp<<=1;
3527 	if (tempc) temp|=1;
3528 	setzn16(temp);
3529 	writememw2(addr,temp);
3530 }
3531 
rora8()3532 static inline void rora8()
3533 {
3534 	snes_readmem(pbr|pc);
3535 	addr=p.c;
3536 	p.c=a.b.l&1;
3537 	a.b.l>>=1;
3538 	if (addr) a.b.l|=0x80;
3539 	setzn8(a.b.l);
3540 }
rora16()3541 static inline void rora16()
3542 {
3543 	snes_readmem(pbr|pc);
3544 	addr=p.c;
3545 	p.c=a.w&1;
3546 	a.w>>=1;
3547 	if (addr) a.w|=0x8000;
3548 	setzn16(a.w);
3549 }
3550 
rorZp8()3551 static inline void rorZp8()
3552 {
3553 	unsigned char temp;
3554 	int tempc;
3555 	addr=zeropage();
3556 	temp=snes_readmem(addr);
3557 	cycles-=6; clockspc(6);
3558 	tempc=p.c;
3559 	p.c=temp&1;
3560 	temp>>=1;
3561 	if (tempc) temp|=0x80;
3562 	setzn8(temp);
3563 	snes_writemem(addr,temp);
3564 }
rorZp16()3565 static inline void rorZp16()
3566 {
3567 	unsigned short temp;
3568 	int tempc;
3569 	addr=zeropage();
3570 	temp=readmemw(addr);
3571 	cycles-=6; clockspc(6);
3572 	tempc=p.c;
3573 	p.c=temp&1;
3574 	temp>>=1;
3575 	if (tempc) temp|=0x8000;
3576 	setzn16(temp);
3577 	writememw2(addr,temp);
3578 }
3579 
rorZpx8()3580 static inline void rorZpx8()
3581 {
3582 	unsigned char temp;
3583 	int tempc;
3584 	addr=zeropagex();
3585 	temp=snes_readmem(addr);
3586 	cycles-=6; clockspc(6);
3587 	tempc=p.c;
3588 	p.c=temp&1;
3589 	temp>>=1;
3590 	if (tempc) temp|=0x80;
3591 	setzn8(temp);
3592 	snes_writemem(addr,temp);
3593 }
rorZpx16()3594 static inline void rorZpx16()
3595 {
3596 	unsigned short temp;
3597 	int tempc;
3598 	addr=zeropagex();
3599 	temp=readmemw(addr);
3600 	cycles-=6; clockspc(6);
3601 	tempc=p.c;
3602 	p.c=temp&1;
3603 	temp>>=1;
3604 	if (tempc) temp|=0x8000;
3605 	setzn16(temp);
3606 	writememw2(addr,temp);
3607 }
3608 
rorAbs8()3609 static inline void rorAbs8()
3610 {
3611 	unsigned char temp;
3612 	int tempc;
3613 	addr=absolute();
3614 	temp=snes_readmem(addr);
3615 	cycles-=6; clockspc(6);
3616 	tempc=p.c;
3617 	p.c=temp&1;
3618 	temp>>=1;
3619 	if (tempc) temp|=0x80;
3620 	setzn8(temp);
3621 	snes_writemem(addr,temp);
3622 }
rorAbs16()3623 static inline void rorAbs16()
3624 {
3625 	unsigned short temp;
3626 	int tempc;
3627 	addr=absolute();
3628 	temp=readmemw(addr);
3629 	cycles-=6; clockspc(6);
3630 	tempc=p.c;
3631 	p.c=temp&1;
3632 	temp>>=1;
3633 	if (tempc) temp|=0x8000;
3634 	setzn16(temp);
3635 	writememw2(addr,temp);
3636 }
3637 
rorAbsx8()3638 static inline void rorAbsx8()
3639 {
3640 	unsigned char temp;
3641 	int tempc;
3642 	addr=absolutex();
3643 	temp=snes_readmem(addr);
3644 	cycles-=6; clockspc(6);
3645 	tempc=p.c;
3646 	p.c=temp&1;
3647 	temp>>=1;
3648 	if (tempc) temp|=0x80;
3649 	setzn8(temp);
3650 	snes_writemem(addr,temp);
3651 }
rorAbsx16()3652 static inline void rorAbsx16()
3653 {
3654 	unsigned short temp;
3655 	int tempc;
3656 	addr=absolutex();
3657 	temp=readmemw(addr);
3658 	cycles-=6; clockspc(6);
3659 	tempc=p.c;
3660 	p.c=temp&1;
3661 	temp>>=1;
3662 	if (tempc) temp|=0x8000;
3663 	setzn16(temp);
3664 	writememw2(addr,temp);
3665 }
3666 
3667 /*Misc group*/
xba()3668 static inline void xba()
3669 {
3670 	snes_readmem(pbr|pc);
3671 	a.w=(a.w>>8)|(a.w<<8);
3672 	setzn8(a.b.l);
3673 }
nop()3674 static inline void nop()
3675 {
3676 	cycles-=6; clockspc(6);
3677 }
3678 
tcd()3679 static inline void tcd()
3680 {
3681 	snes_readmem(pbr|pc);
3682 	dp=a.w;
3683 	setzn16(dp);
3684 }
3685 
tdc()3686 static inline void tdc()
3687 {
3688 	snes_readmem(pbr|pc);
3689 	a.w=dp;
3690 	setzn16(a.w);
3691 }
3692 
tcs()3693 static inline void tcs()
3694 {
3695 	snes_readmem(pbr|pc);
3696 	s.w=a.w;
3697 }
3698 
tsc()3699 static inline void tsc()
3700 {
3701 	snes_readmem(pbr|pc);
3702 	a.w=s.w;
3703 	setzn16(a.w);
3704 }
3705 
trbZp8()3706 static inline void trbZp8()
3707 {
3708 	unsigned char temp;
3709 	addr=zeropage();
3710 	temp=snes_readmem(addr);
3711 	p.z=!(a.b.l&temp);
3712 	temp&=~a.b.l;
3713 	cycles-=6; clockspc(6);
3714 	snes_writemem(addr,temp);
3715 }
trbZp16()3716 static inline void trbZp16()
3717 {
3718 	unsigned short temp;
3719 	addr=zeropage();
3720 	temp=readmemw(addr);
3721 	p.z=!(a.w&temp);
3722 	temp&=~a.w;
3723 	cycles-=6; clockspc(6);
3724 	writememw2(addr,temp);
3725 }
3726 
trbAbs8()3727 static inline void trbAbs8()
3728 {
3729 	unsigned char temp;
3730 	addr=absolute();
3731 	temp=snes_readmem(addr);
3732 	p.z=!(a.b.l&temp);
3733 	temp&=~a.b.l;
3734 	cycles-=6; clockspc(6);
3735 	snes_writemem(addr,temp);
3736 }
trbAbs16()3737 static inline void trbAbs16()
3738 {
3739 	unsigned short temp;
3740 	addr=absolute();
3741 	temp=readmemw(addr);
3742 	p.z=!(a.w&temp);
3743 	temp&=~a.w;
3744 	cycles-=6; clockspc(6);
3745 	writememw2(addr,temp);
3746 }
3747 
tsbZp8()3748 static inline void tsbZp8()
3749 {
3750 	unsigned char temp;
3751 	addr=zeropage();
3752 	temp=snes_readmem(addr);
3753 	p.z=!(a.b.l&temp);
3754 	temp|=a.b.l;
3755 	cycles-=6; clockspc(6);
3756 	snes_writemem(addr,temp);
3757 }
tsbZp16()3758 static inline void tsbZp16()
3759 {
3760 	unsigned short temp;
3761 	addr=zeropage();
3762 	temp=readmemw(addr);
3763 	p.z=!(a.w&temp);
3764 	temp|=a.w;
3765 	cycles-=6; clockspc(6);
3766 	writememw2(addr,temp);
3767 }
3768 
tsbAbs8()3769 static inline void tsbAbs8()
3770 {
3771 	unsigned char temp;
3772 	addr=absolute();
3773 	temp=snes_readmem(addr);
3774 	p.z=!(a.b.l&temp);
3775 	temp|=a.b.l;
3776 	cycles-=6; clockspc(6);
3777 	snes_writemem(addr,temp);
3778 }
tsbAbs16()3779 static inline void tsbAbs16()
3780 {
3781 	unsigned short temp;
3782 	addr=absolute();
3783 	temp=readmemw(addr);
3784 	p.z=!(a.w&temp);
3785 	temp|=a.w;
3786 	cycles-=6; clockspc(6);
3787 	writememw2(addr,temp);
3788 }
3789 
wai()3790 static inline void wai()
3791 {
3792 	snes_readmem(pbr|pc);
3793 	inwai=1;
3794 	pc--;
3795 
3796 }
3797 
mvp()3798 static inline void mvp()
3799 {
3800 	unsigned char temp;
3801 	dbr=(snes_readmem(pbr|pc))<<16; pc++;
3802 	addr=(snes_readmem(pbr|pc))<<16; pc++;
3803 	temp=snes_readmem(addr|x.w);
3804 	snes_writemem(dbr|y.w,temp);
3805 	x.w--;
3806 	y.w--;
3807 	a.w--;
3808 	if (a.w!=0xFFFF) pc-=3;
3809 	cycles-=12; clockspc(12);
3810 }
3811 
mvn()3812 static inline void mvn()
3813 {
3814 	unsigned char temp;
3815 	dbr=(snes_readmem(pbr|pc))<<16; pc++;
3816 	addr=(snes_readmem(pbr|pc))<<16; pc++;
3817 	temp=snes_readmem(addr|x.w);
3818 	snes_writemem(dbr|y.w,temp);
3819 	x.w++;
3820 	y.w++;
3821 	a.w--;
3822 	if (a.w!=0xFFFF) pc-=3;
3823 	cycles-=12; clockspc(12);
3824 }
3825 
brk()3826 static inline void brk()
3827 {
3828 	unsigned char temp=0;
3829 	snes_writemem(s.w,pbr>>16); s.w--;
3830 	snes_writemem(s.w,pc>>8);   s.w--;
3831 	snes_writemem(s.w,pc&0xFF);  s.w--;
3832 	if (p.c) temp|=1;
3833 	if (p.z) temp|=2;
3834 	if (p.i) temp|=4;
3835 	if (p.d) temp|=8;
3836 	if (p.x) temp|=0x10;
3837 	if (p.m) temp|=0x20;
3838 	if (p.v) temp|=0x40;
3839 	if (p.n) temp|=0x80;
3840 	snes_writemem(s.w,temp);    s.w--;
3841 	pc=readmemw(0xFFE6);
3842 	pbr=0;
3843 	p.i=1;
3844 	p.d=0;
3845 }
3846 
3847 /*Functions*/
reset65816()3848 void reset65816()
3849 {
3850 	pbr=dbr=0;
3851 	s.w=0x1FF;
3852 	cpumode=4;
3853 	p.e=1;
3854 	p.i=1;
3855 	pc=readmemw(0xFFFC);
3856 	a.w=x.w=y.w=0;
3857 	p.x=p.m=1;
3858 	skipz=0;
3859 }
3860 
badopcode()3861 static inline void badopcode()
3862 {
3863 	//snemlog(L"Bad opcode %02X\n",opcode);
3864 	pc--;
3865 }
3866 
makeopcodetable()3867 void makeopcodetable()
3868 {
3869 	int c,d;
3870 	for (c=0;c<256;c++)
3871 	{
3872 		for (d=0;d<5;d++)
3873 		{
3874 			opcodes[c][d]=badopcode;
3875 		}
3876 	}
3877 	/*LDA group*/
3878 	opcodes[0xA9][0]=opcodes[0xA9][2]=opcodes[0xA9][4]=ldaImm8;
3879 	opcodes[0xA9][1]=opcodes[0xA9][3]=ldaImm16;
3880 	opcodes[0xA5][0]=opcodes[0xA5][2]=opcodes[0xA5][4]=ldaZp8;
3881 	opcodes[0xA5][1]=opcodes[0xA5][3]=ldaZp16;
3882 	opcodes[0xB5][0]=opcodes[0xB5][2]=opcodes[0xB5][4]=ldaZpx8;
3883 	opcodes[0xB5][1]=opcodes[0xB5][3]=ldaZpx16;
3884 	opcodes[0xA3][0]=opcodes[0xA3][2]=opcodes[0xA3][4]=ldaSp8;
3885 	opcodes[0xA3][1]=opcodes[0xA3][3]=ldaSp16;
3886 	opcodes[0xB3][0]=opcodes[0xB3][2]=opcodes[0xB3][4]=ldaSIndirecty8;
3887 	opcodes[0xB3][1]=opcodes[0xB3][3]=ldaSIndirecty16;
3888 	opcodes[0xAD][0]=opcodes[0xAD][2]=opcodes[0xAD][4]=ldaAbs8;
3889 	opcodes[0xAD][1]=opcodes[0xAD][3]=ldaAbs16;
3890 	opcodes[0xBD][0]=opcodes[0xBD][2]=opcodes[0xBD][4]=ldaAbsx8;
3891 	opcodes[0xBD][1]=opcodes[0xBD][3]=ldaAbsx16;
3892 	opcodes[0xB9][0]=opcodes[0xB9][2]=opcodes[0xB9][4]=ldaAbsy8;
3893 	opcodes[0xB9][1]=opcodes[0xB9][3]=ldaAbsy16;
3894 	opcodes[0xAF][0]=opcodes[0xAF][2]=opcodes[0xAF][4]=ldaLong8;
3895 	opcodes[0xAF][1]=opcodes[0xAF][3]=ldaLong16;
3896 	opcodes[0xBF][0]=opcodes[0xBF][2]=opcodes[0xBF][4]=ldaLongx8;
3897 	opcodes[0xBF][1]=opcodes[0xBF][3]=ldaLongx16;
3898 	opcodes[0xB2][0]=opcodes[0xB2][2]=opcodes[0xB2][4]=ldaIndirect8;
3899 	opcodes[0xB2][1]=opcodes[0xB2][3]=ldaIndirect16;
3900 	opcodes[0xA1][0]=opcodes[0xA1][2]=opcodes[0xA1][4]=ldaIndirectx8;
3901 	opcodes[0xA1][1]=opcodes[0xA1][3]=ldaIndirectx16;
3902 	opcodes[0xB1][0]=opcodes[0xB1][2]=opcodes[0xB1][4]=ldaIndirecty8;
3903 	opcodes[0xB1][1]=opcodes[0xB1][3]=ldaIndirecty16;
3904 	opcodes[0xA7][0]=opcodes[0xA7][2]=opcodes[0xA7][4]=ldaIndirectLong8;
3905 	opcodes[0xA7][1]=opcodes[0xA7][3]=ldaIndirectLong16;
3906 	opcodes[0xB7][0]=opcodes[0xB7][2]=opcodes[0xB7][4]=ldaIndirectLongy8;
3907 	opcodes[0xB7][1]=opcodes[0xB7][3]=ldaIndirectLongy16;
3908 	/*LDX group*/
3909 	opcodes[0xA2][0]=opcodes[0xA2][1]=opcodes[0xA2][4]=ldxImm8;
3910 	opcodes[0xA2][2]=opcodes[0xA2][3]=ldxImm16;
3911 	opcodes[0xA6][0]=opcodes[0xA6][1]=opcodes[0xA6][4]=ldxZp8;
3912 	opcodes[0xA6][2]=opcodes[0xA6][3]=ldxZp16;
3913 	opcodes[0xB6][0]=opcodes[0xB6][1]=opcodes[0xB6][4]=ldxZpy8;
3914 	opcodes[0xB6][2]=opcodes[0xB6][3]=ldxZpy16;
3915 	opcodes[0xAE][0]=opcodes[0xAE][1]=opcodes[0xAE][4]=ldxAbs8;
3916 	opcodes[0xAE][2]=opcodes[0xAE][3]=ldxAbs16;
3917 	opcodes[0xBE][0]=opcodes[0xBE][1]=opcodes[0xBE][4]=ldxAbsy8;
3918 	opcodes[0xBE][2]=opcodes[0xBE][3]=ldxAbsy16;
3919 	/*LDY group*/
3920 	opcodes[0xA0][0]=opcodes[0xA0][1]=opcodes[0xA0][4]=ldyImm8;
3921 	opcodes[0xA0][2]=opcodes[0xA0][3]=ldyImm16;
3922 	opcodes[0xA4][0]=opcodes[0xA4][1]=opcodes[0xA4][4]=ldyZp8;
3923 	opcodes[0xA4][2]=opcodes[0xA4][3]=ldyZp16;
3924 	opcodes[0xB4][0]=opcodes[0xB4][1]=opcodes[0xB4][4]=ldyZpx8;
3925 	opcodes[0xB4][2]=opcodes[0xB4][3]=ldyZpx16;
3926 	opcodes[0xAC][0]=opcodes[0xAC][1]=opcodes[0xAC][4]=ldyAbs8;
3927 	opcodes[0xAC][2]=opcodes[0xAC][3]=ldyAbs16;
3928 	opcodes[0xBC][0]=opcodes[0xBC][1]=opcodes[0xBC][4]=ldyAbsx8;
3929 	opcodes[0xBC][2]=opcodes[0xBC][3]=ldyAbsx16;
3930 
3931 	/*STA group*/
3932 	opcodes[0x85][0]=opcodes[0x85][2]=opcodes[0x85][4]=staZp8;
3933 	opcodes[0x85][1]=opcodes[0x85][3]=staZp16;
3934 	opcodes[0x95][0]=opcodes[0x95][2]=opcodes[0x95][4]=staZpx8;
3935 	opcodes[0x95][1]=opcodes[0x95][3]=staZpx16;
3936 	opcodes[0x8D][0]=opcodes[0x8D][2]=opcodes[0x8D][4]=staAbs8;
3937 	opcodes[0x8D][1]=opcodes[0x8D][3]=staAbs16;
3938 	opcodes[0x9D][0]=opcodes[0x9D][2]=opcodes[0x9D][4]=staAbsx8;
3939 	opcodes[0x9D][1]=opcodes[0x9D][3]=staAbsx16;
3940 	opcodes[0x99][0]=opcodes[0x99][2]=opcodes[0x99][4]=staAbsy8;
3941 	opcodes[0x99][1]=opcodes[0x99][3]=staAbsy16;
3942 	opcodes[0x8F][0]=opcodes[0x8F][2]=opcodes[0x8F][4]=staLong8;
3943 	opcodes[0x8F][1]=opcodes[0x8F][3]=staLong16;
3944 	opcodes[0x9F][0]=opcodes[0x9F][2]=opcodes[0x9F][4]=staLongx8;
3945 	opcodes[0x9F][1]=opcodes[0x9F][3]=staLongx16;
3946 	opcodes[0x92][0]=opcodes[0x92][2]=opcodes[0x92][4]=staIndirect8;
3947 	opcodes[0x92][1]=opcodes[0x92][3]=staIndirect16;
3948 	opcodes[0x81][0]=opcodes[0x81][2]=opcodes[0x81][4]=staIndirectx8;
3949 	opcodes[0x81][1]=opcodes[0x81][3]=staIndirectx16;
3950 	opcodes[0x91][0]=opcodes[0x91][2]=opcodes[0x91][4]=staIndirecty8;
3951 	opcodes[0x91][1]=opcodes[0x91][3]=staIndirecty16;
3952 	opcodes[0x87][0]=opcodes[0x87][2]=opcodes[0x87][4]=staIndirectLong8;
3953 	opcodes[0x87][1]=opcodes[0x87][3]=staIndirectLong16;
3954 	opcodes[0x97][0]=opcodes[0x97][2]=opcodes[0x97][4]=staIndirectLongy8;
3955 	opcodes[0x97][1]=opcodes[0x97][3]=staIndirectLongy16;
3956 	opcodes[0x83][0]=opcodes[0x83][2]=opcodes[0x83][4]=staSp8;
3957 	opcodes[0x83][1]=opcodes[0x83][3]=staSp16;
3958 	opcodes[0x93][0]=opcodes[0x93][2]=opcodes[0x93][4]=staSIndirecty8;
3959 	opcodes[0x93][1]=opcodes[0x93][3]=staSIndirecty16;
3960 	/*STX group*/
3961 	opcodes[0x86][0]=opcodes[0x86][1]=opcodes[0x86][4]=stxZp8;
3962 	opcodes[0x86][2]=opcodes[0x86][3]=stxZp16;
3963 	opcodes[0x96][0]=opcodes[0x96][1]=opcodes[0x96][4]=stxZpy8;
3964 	opcodes[0x96][2]=opcodes[0x96][3]=stxZpy16;
3965 	opcodes[0x8E][0]=opcodes[0x8E][1]=opcodes[0x8E][4]=stxAbs8;
3966 	opcodes[0x8E][2]=opcodes[0x8E][3]=stxAbs16;
3967 	/*STY group*/
3968 	opcodes[0x84][0]=opcodes[0x84][1]=opcodes[0x84][4]=styZp8;
3969 	opcodes[0x84][2]=opcodes[0x84][3]=styZp16;
3970 	opcodes[0x94][0]=opcodes[0x94][1]=opcodes[0x94][4]=styZpx8;
3971 	opcodes[0x94][2]=opcodes[0x94][3]=styZpx16;
3972 	opcodes[0x8C][0]=opcodes[0x8C][1]=opcodes[0x8C][4]=styAbs8;
3973 	opcodes[0x8C][2]=opcodes[0x8C][3]=styAbs16;
3974 	/*STZ group*/
3975 	opcodes[0x64][0]=opcodes[0x64][2]=opcodes[0x64][4]=stzZp8;
3976 	opcodes[0x64][1]=opcodes[0x64][3]=stzZp16;
3977 	opcodes[0x74][0]=opcodes[0x74][2]=opcodes[0x74][4]=stzZpx8;
3978 	opcodes[0x74][1]=opcodes[0x74][3]=stzZpx16;
3979 	opcodes[0x9C][0]=opcodes[0x9C][2]=opcodes[0x9C][4]=stzAbs8;
3980 	opcodes[0x9C][1]=opcodes[0x9C][3]=stzAbs16;
3981 	opcodes[0x9E][0]=opcodes[0x9E][2]=opcodes[0x9E][4]=stzAbsx8;
3982 	opcodes[0x9E][1]=opcodes[0x9E][3]=stzAbsx16;
3983 
3984 	opcodes[0x3A][0]=opcodes[0x3A][2]=opcodes[0x3A][4]=deca8;
3985 	opcodes[0x3A][1]=opcodes[0x3A][3]=deca16;
3986 	opcodes[0xCA][0]=opcodes[0xCA][1]=opcodes[0xCA][4]=dex8;
3987 	opcodes[0xCA][2]=opcodes[0xCA][3]=dex16;
3988 	opcodes[0x88][0]=opcodes[0x88][1]=opcodes[0x88][4]=dey8;
3989 	opcodes[0x88][2]=opcodes[0x88][3]=dey16;
3990 	opcodes[0x1A][0]=opcodes[0x1A][2]=opcodes[0x1A][4]=inca8;
3991 	opcodes[0x1A][1]=opcodes[0x1A][3]=inca16;
3992 	opcodes[0xE8][0]=opcodes[0xE8][1]=opcodes[0xE8][4]=inx8;
3993 	opcodes[0xE8][2]=opcodes[0xE8][3]=inx16;
3994 	opcodes[0xC8][0]=opcodes[0xC8][1]=opcodes[0xC8][4]=iny8;
3995 	opcodes[0xC8][2]=opcodes[0xC8][3]=iny16;
3996 
3997 	/*INC group*/
3998 	opcodes[0xE6][0]=opcodes[0xE6][2]=opcodes[0xE6][4]=incZp8;
3999 	opcodes[0xE6][1]=opcodes[0xE6][3]=incZp16;
4000 	opcodes[0xF6][0]=opcodes[0xF6][2]=opcodes[0xF6][4]=incZpx8;
4001 	opcodes[0xF6][1]=opcodes[0xF6][3]=incZpx16;
4002 	opcodes[0xEE][0]=opcodes[0xEE][2]=opcodes[0xEE][4]=incAbs8;
4003 	opcodes[0xEE][1]=opcodes[0xEE][3]=incAbs16;
4004 	opcodes[0xFE][0]=opcodes[0xFE][2]=opcodes[0xFE][4]=incAbsx8;
4005 	opcodes[0xFE][1]=opcodes[0xFE][3]=incAbsx16;
4006 
4007 	/*DEC group*/
4008 	opcodes[0xC6][0]=opcodes[0xC6][2]=opcodes[0xC6][4]=decZp8;
4009 	opcodes[0xC6][1]=opcodes[0xC6][3]=decZp16;
4010 	opcodes[0xD6][0]=opcodes[0xD6][2]=opcodes[0xD6][4]=decZpx8;
4011 	opcodes[0xD6][1]=opcodes[0xD6][3]=decZpx16;
4012 	opcodes[0xCE][0]=opcodes[0xCE][2]=opcodes[0xCE][4]=decAbs8;
4013 	opcodes[0xCE][1]=opcodes[0xCE][3]=decAbs16;
4014 	opcodes[0xDE][0]=opcodes[0xDE][2]=opcodes[0xDE][4]=decAbsx8;
4015 	opcodes[0xDE][1]=opcodes[0xDE][3]=decAbsx16;
4016 
4017 	/*AND group*/
4018 	opcodes[0x29][0]=opcodes[0x29][2]=opcodes[0x29][4]=andImm8;
4019 	opcodes[0x29][1]=opcodes[0x29][3]=andImm16;
4020 	opcodes[0x25][0]=opcodes[0x25][2]=opcodes[0x25][4]=andZp8;
4021 	opcodes[0x25][1]=opcodes[0x25][3]=andZp16;
4022 	opcodes[0x35][0]=opcodes[0x35][2]=opcodes[0x35][4]=andZpx8;
4023 	opcodes[0x35][1]=opcodes[0x35][3]=andZpx16;
4024 	opcodes[0x23][0]=opcodes[0x23][2]=opcodes[0x23][4]=andSp8;
4025 	opcodes[0x23][1]=opcodes[0x23][3]=andSp16;
4026 	opcodes[0x2D][0]=opcodes[0x2D][2]=opcodes[0x2D][4]=andAbs8;
4027 	opcodes[0x2D][1]=opcodes[0x2D][3]=andAbs16;
4028 	opcodes[0x3D][0]=opcodes[0x3D][2]=opcodes[0x3D][4]=andAbsx8;
4029 	opcodes[0x3D][1]=opcodes[0x3D][3]=andAbsx16;
4030 	opcodes[0x39][0]=opcodes[0x39][2]=opcodes[0x39][4]=andAbsy8;
4031 	opcodes[0x39][1]=opcodes[0x39][3]=andAbsy16;
4032 	opcodes[0x2F][0]=opcodes[0x2F][2]=opcodes[0x2F][4]=andLong8;
4033 	opcodes[0x2F][1]=opcodes[0x2F][3]=andLong16;
4034 	opcodes[0x3F][0]=opcodes[0x3F][2]=opcodes[0x3F][4]=andLongx8;
4035 	opcodes[0x3F][1]=opcodes[0x3F][3]=andLongx16;
4036 	opcodes[0x32][0]=opcodes[0x32][2]=opcodes[0x32][4]=andIndirect8;
4037 	opcodes[0x32][1]=opcodes[0x32][3]=andIndirect16;
4038 	opcodes[0x21][0]=opcodes[0x21][2]=opcodes[0x21][4]=andIndirectx8;
4039 	opcodes[0x21][1]=opcodes[0x21][3]=andIndirectx16;
4040 	opcodes[0x31][0]=opcodes[0x31][2]=opcodes[0x31][4]=andIndirecty8;
4041 	opcodes[0x31][1]=opcodes[0x31][3]=andIndirecty16;
4042 	opcodes[0x27][0]=opcodes[0x27][2]=opcodes[0x27][4]=andIndirectLong8;
4043 	opcodes[0x27][1]=opcodes[0x27][3]=andIndirectLong16;
4044 	opcodes[0x37][0]=opcodes[0x37][2]=opcodes[0x37][4]=andIndirectLongy8;
4045 	opcodes[0x37][1]=opcodes[0x37][3]=andIndirectLongy16;
4046 
4047 	/*EOR group*/
4048 	opcodes[0x49][0]=opcodes[0x49][2]=opcodes[0x49][4]=eorImm8;
4049 	opcodes[0x49][1]=opcodes[0x49][3]=eorImm16;
4050 	opcodes[0x45][0]=opcodes[0x45][2]=opcodes[0x45][4]=eorZp8;
4051 	opcodes[0x45][1]=opcodes[0x45][3]=eorZp16;
4052 	opcodes[0x55][0]=opcodes[0x55][2]=opcodes[0x55][4]=eorZpx8;
4053 	opcodes[0x55][1]=opcodes[0x55][3]=eorZpx16;
4054 	opcodes[0x43][0]=opcodes[0x43][2]=opcodes[0x43][4]=eorSp8;
4055 	opcodes[0x43][1]=opcodes[0x43][3]=eorSp16;
4056 	opcodes[0x4D][0]=opcodes[0x4D][2]=opcodes[0x4D][4]=eorAbs8;
4057 	opcodes[0x4D][1]=opcodes[0x4D][3]=eorAbs16;
4058 	opcodes[0x5D][0]=opcodes[0x5D][2]=opcodes[0x5D][4]=eorAbsx8;
4059 	opcodes[0x5D][1]=opcodes[0x5D][3]=eorAbsx16;
4060 	opcodes[0x59][0]=opcodes[0x59][2]=opcodes[0x59][4]=eorAbsy8;
4061 	opcodes[0x59][1]=opcodes[0x59][3]=eorAbsy16;
4062 	opcodes[0x4F][0]=opcodes[0x4F][2]=opcodes[0x4F][4]=eorLong8;
4063 	opcodes[0x4F][1]=opcodes[0x4F][3]=eorLong16;
4064 	opcodes[0x5F][0]=opcodes[0x5F][2]=opcodes[0x5F][4]=eorLongx8;
4065 	opcodes[0x5F][1]=opcodes[0x5F][3]=eorLongx16;
4066 	opcodes[0x52][0]=opcodes[0x52][2]=opcodes[0x52][4]=eorIndirect8;
4067 	opcodes[0x52][1]=opcodes[0x52][3]=eorIndirect16;
4068 	opcodes[0x41][0]=opcodes[0x41][2]=opcodes[0x41][4]=eorIndirectx8;
4069 	opcodes[0x41][1]=opcodes[0x41][3]=eorIndirectx16;
4070 	opcodes[0x51][0]=opcodes[0x51][2]=opcodes[0x51][4]=eorIndirecty8;
4071 	opcodes[0x51][1]=opcodes[0x51][3]=eorIndirecty16;
4072 	opcodes[0x47][0]=opcodes[0x47][2]=opcodes[0x47][4]=eorIndirectLong8;
4073 	opcodes[0x47][1]=opcodes[0x47][3]=eorIndirectLong16;
4074 	opcodes[0x57][0]=opcodes[0x57][2]=opcodes[0x57][4]=eorIndirectLongy8;
4075 	opcodes[0x57][1]=opcodes[0x57][3]=eorIndirectLongy16;
4076 
4077 	/*ORA group*/
4078 	opcodes[0x09][0]=opcodes[0x09][2]=opcodes[0x09][4]=oraImm8;
4079 	opcodes[0x09][1]=opcodes[0x09][3]=oraImm16;
4080 	opcodes[0x05][0]=opcodes[0x05][2]=opcodes[0x05][4]=oraZp8;
4081 	opcodes[0x05][1]=opcodes[0x05][3]=oraZp16;
4082 	opcodes[0x15][0]=opcodes[0x15][2]=opcodes[0x15][4]=oraZpx8;
4083 	opcodes[0x15][1]=opcodes[0x15][3]=oraZpx16;
4084 	opcodes[0x03][0]=opcodes[0x03][2]=opcodes[0x03][4]=oraSp8;
4085 	opcodes[0x03][1]=opcodes[0x03][3]=oraSp16;
4086 	opcodes[0x0D][0]=opcodes[0x0D][2]=opcodes[0x0D][4]=oraAbs8;
4087 	opcodes[0x0D][1]=opcodes[0x0D][3]=oraAbs16;
4088 	opcodes[0x1D][0]=opcodes[0x1D][2]=opcodes[0x1D][4]=oraAbsx8;
4089 	opcodes[0x1D][1]=opcodes[0x1D][3]=oraAbsx16;
4090 	opcodes[0x19][0]=opcodes[0x19][2]=opcodes[0x19][4]=oraAbsy8;
4091 	opcodes[0x19][1]=opcodes[0x19][3]=oraAbsy16;
4092 	opcodes[0x0F][0]=opcodes[0x0F][2]=opcodes[0x0F][4]=oraLong8;
4093 	opcodes[0x0F][1]=opcodes[0x0F][3]=oraLong16;
4094 	opcodes[0x1F][0]=opcodes[0x1F][2]=opcodes[0x1F][4]=oraLongx8;
4095 	opcodes[0x1F][1]=opcodes[0x1F][3]=oraLongx16;
4096 	opcodes[0x12][0]=opcodes[0x12][2]=opcodes[0x12][4]=oraIndirect8;
4097 	opcodes[0x12][1]=opcodes[0x12][3]=oraIndirect16;
4098 	opcodes[0x01][0]=opcodes[0x01][2]=opcodes[0x01][4]=oraIndirectx8;
4099 	opcodes[0x01][1]=opcodes[0x01][3]=oraIndirectx16;
4100 	opcodes[0x11][0]=opcodes[0x11][2]=opcodes[0x11][4]=oraIndirecty8;
4101 	opcodes[0x11][1]=opcodes[0x11][3]=oraIndirecty16;
4102 	opcodes[0x07][0]=opcodes[0x07][2]=opcodes[0x07][4]=oraIndirectLong8;
4103 	opcodes[0x07][1]=opcodes[0x07][3]=oraIndirectLong16;
4104 	opcodes[0x17][0]=opcodes[0x17][2]=opcodes[0x17][4]=oraIndirectLongy8;
4105 	opcodes[0x17][1]=opcodes[0x17][3]=oraIndirectLongy16;
4106 
4107 	/*ADC group*/
4108 	opcodes[0x69][0]=opcodes[0x69][2]=opcodes[0x69][4]=adcImm8;
4109 	opcodes[0x69][1]=opcodes[0x69][3]=adcImm16;
4110 	opcodes[0x65][0]=opcodes[0x65][2]=opcodes[0x65][4]=adcZp8;
4111 	opcodes[0x65][1]=opcodes[0x65][3]=adcZp16;
4112 	opcodes[0x75][0]=opcodes[0x75][2]=opcodes[0x75][4]=adcZpx8;
4113 	opcodes[0x75][1]=opcodes[0x75][3]=adcZpx16;
4114 	opcodes[0x63][0]=opcodes[0x63][2]=opcodes[0x63][4]=adcSp8;
4115 	opcodes[0x63][1]=opcodes[0x63][3]=adcSp16;
4116 	opcodes[0x6D][0]=opcodes[0x6D][2]=opcodes[0x6D][4]=adcAbs8;
4117 	opcodes[0x6D][1]=opcodes[0x6D][3]=adcAbs16;
4118 	opcodes[0x7D][0]=opcodes[0x7D][2]=opcodes[0x7D][4]=adcAbsx8;
4119 	opcodes[0x7D][1]=opcodes[0x7D][3]=adcAbsx16;
4120 	opcodes[0x79][0]=opcodes[0x79][2]=opcodes[0x79][4]=adcAbsy8;
4121 	opcodes[0x79][1]=opcodes[0x79][3]=adcAbsy16;
4122 	opcodes[0x6F][0]=opcodes[0x6F][2]=opcodes[0x6F][4]=adcLong8;
4123 	opcodes[0x6F][1]=opcodes[0x6F][3]=adcLong16;
4124 	opcodes[0x7F][0]=opcodes[0x7F][2]=opcodes[0x7F][4]=adcLongx8;
4125 	opcodes[0x7F][1]=opcodes[0x7F][3]=adcLongx16;
4126 	opcodes[0x72][0]=opcodes[0x72][2]=opcodes[0x72][4]=adcIndirect8;
4127 	opcodes[0x72][1]=opcodes[0x72][3]=adcIndirect16;
4128 	opcodes[0x61][0]=opcodes[0x61][2]=opcodes[0x61][4]=adcIndirectx8;
4129 	opcodes[0x61][1]=opcodes[0x61][3]=adcIndirectx16;
4130 	opcodes[0x71][0]=opcodes[0x71][2]=opcodes[0x71][4]=adcIndirecty8;
4131 	opcodes[0x71][1]=opcodes[0x71][3]=adcIndirecty16;
4132 	opcodes[0x73][0]=opcodes[0x73][2]=opcodes[0x73][4]=adcsIndirecty8;
4133 	opcodes[0x73][1]=opcodes[0x73][3]=adcsIndirecty16;
4134 	opcodes[0x67][0]=opcodes[0x67][2]=opcodes[0x67][4]=adcIndirectLong8;
4135 	opcodes[0x67][1]=opcodes[0x67][3]=adcIndirectLong16;
4136 	opcodes[0x77][0]=opcodes[0x77][2]=opcodes[0x77][4]=adcIndirectLongy8;
4137 	opcodes[0x77][1]=opcodes[0x77][3]=adcIndirectLongy16;
4138 
4139 	/*SBC group*/
4140 	opcodes[0xE9][0]=opcodes[0xE9][2]=opcodes[0xE9][4]=sbcImm8;
4141 	opcodes[0xE9][1]=opcodes[0xE9][3]=sbcImm16;
4142 	opcodes[0xE5][0]=opcodes[0xE5][2]=opcodes[0xE5][4]=sbcZp8;
4143 	opcodes[0xE5][1]=opcodes[0xE5][3]=sbcZp16;
4144 	opcodes[0xE3][0]=opcodes[0xE3][2]=opcodes[0xE3][4]=sbcSp8;
4145 	opcodes[0xE3][1]=opcodes[0xE3][3]=sbcSp16;
4146 	opcodes[0xF5][0]=opcodes[0xF5][2]=opcodes[0xF5][4]=sbcZpx8;
4147 	opcodes[0xF5][1]=opcodes[0xF5][3]=sbcZpx16;
4148 	opcodes[0xED][0]=opcodes[0xED][2]=opcodes[0xED][4]=sbcAbs8;
4149 	opcodes[0xED][1]=opcodes[0xED][3]=sbcAbs16;
4150 	opcodes[0xFD][0]=opcodes[0xFD][2]=opcodes[0xFD][4]=sbcAbsx8;
4151 	opcodes[0xFD][1]=opcodes[0xFD][3]=sbcAbsx16;
4152 	opcodes[0xF9][0]=opcodes[0xF9][2]=opcodes[0xF9][4]=sbcAbsy8;
4153 	opcodes[0xF9][1]=opcodes[0xF9][3]=sbcAbsy16;
4154 	opcodes[0xEF][0]=opcodes[0xEF][2]=opcodes[0xEF][4]=sbcLong8;
4155 	opcodes[0xEF][1]=opcodes[0xEF][3]=sbcLong16;
4156 	opcodes[0xFF][0]=opcodes[0xFF][2]=opcodes[0xFF][4]=sbcLongx8;
4157 	opcodes[0xFF][1]=opcodes[0xFF][3]=sbcLongx16;
4158 	opcodes[0xF2][0]=opcodes[0xF2][2]=opcodes[0xF2][4]=sbcIndirect8;
4159 	opcodes[0xF2][1]=opcodes[0xF2][3]=sbcIndirect16;
4160 	opcodes[0xE1][0]=opcodes[0xE1][2]=opcodes[0xE1][4]=sbcIndirectx8;
4161 	opcodes[0xE1][1]=opcodes[0xE1][3]=sbcIndirectx16;
4162 	opcodes[0xF1][0]=opcodes[0xF1][2]=opcodes[0xF1][4]=sbcIndirecty8;
4163 	opcodes[0xF1][1]=opcodes[0xF1][3]=sbcIndirecty16;
4164 	opcodes[0xE7][0]=opcodes[0xE7][2]=opcodes[0xE7][4]=sbcIndirectLong8;
4165 	opcodes[0xE7][1]=opcodes[0xE7][3]=sbcIndirectLong16;
4166 	opcodes[0xF7][0]=opcodes[0xF7][2]=opcodes[0xF7][4]=sbcIndirectLongy8;
4167 	opcodes[0xF7][1]=opcodes[0xF7][3]=sbcIndirectLongy16;
4168 
4169 	/*Transfer group*/
4170 	opcodes[0xAA][0]=opcodes[0xAA][1]=opcodes[0xAA][4]=tax8;
4171 	opcodes[0xAA][2]=opcodes[0xAA][3]=tax16;
4172 	opcodes[0xA8][0]=opcodes[0xA8][1]=opcodes[0xA8][4]=tay8;
4173 	opcodes[0xA8][2]=opcodes[0xA8][3]=tay16;
4174 	opcodes[0x8A][0]=opcodes[0x8A][2]=opcodes[0x8A][4]=txa8;
4175 	opcodes[0x8A][1]=opcodes[0x8A][3]=txa16;
4176 	opcodes[0x98][0]=opcodes[0x98][2]=opcodes[0x98][4]=tya8;
4177 	opcodes[0x98][1]=opcodes[0x98][3]=tya16;
4178 	opcodes[0x9B][0]=opcodes[0x9B][1]=opcodes[0x9B][4]=txy8;
4179 	opcodes[0x9B][2]=opcodes[0x9B][3]=txy16;
4180 	opcodes[0xBB][0]=opcodes[0xBB][1]=opcodes[0xBB][4]=tyx8;
4181 	opcodes[0xBB][2]=opcodes[0xBB][3]=tyx16;
4182 	opcodes[0xBA][0]=opcodes[0xBA][1]=opcodes[0xBA][4]=tsx8;
4183 	opcodes[0xBA][2]=opcodes[0xBA][3]=tsx16;
4184 	opcodes[0x9A][0]=opcodes[0x9A][1]=opcodes[0x9A][4]=txs8;
4185 	opcodes[0x9A][2]=opcodes[0x9A][3]=txs16;
4186 
4187 	/*Flag Group*/
4188 	opcodes[0x18][0]=opcodes[0x18][1]=opcodes[0x18][2]=
4189 		opcodes[0x18][3]=opcodes[0x18][4]=clc;
4190 	opcodes[0xD8][0]=opcodes[0xD8][1]=opcodes[0xD8][2]=
4191 		opcodes[0xD8][3]=opcodes[0xD8][4]=cld;
4192 	opcodes[0x58][0]=opcodes[0x58][1]=opcodes[0x58][2]=
4193 		opcodes[0x58][3]=opcodes[0x58][4]=cli;
4194 	opcodes[0xB8][0]=opcodes[0xB8][1]=opcodes[0xB8][2]=
4195 		opcodes[0xB8][3]=opcodes[0xB8][4]=clv;
4196 	opcodes[0x38][0]=opcodes[0x38][1]=opcodes[0x38][2]=
4197 		opcodes[0x38][3]=opcodes[0x38][4]=sec;
4198 	opcodes[0xF8][0]=opcodes[0xF8][1]=opcodes[0xF8][2]=
4199 		opcodes[0xF8][3]=opcodes[0xF8][4]=sed;
4200 	opcodes[0x78][0]=opcodes[0x78][1]=opcodes[0x78][2]=
4201 		opcodes[0x78][3]=opcodes[0x78][4]=sei;
4202 	opcodes[0xFB][0]=opcodes[0xFB][1]=opcodes[0xFB][2]=
4203 		opcodes[0xFB][3]=opcodes[0xFB][4]=xce;
4204 	opcodes[0xE2][0]=opcodes[0xE2][1]=opcodes[0xE2][2]=
4205 		opcodes[0xE2][3]=opcodes[0xE2][4]=sep;
4206 	opcodes[0xC2][0]=opcodes[0xC2][1]=opcodes[0xC2][2]=
4207 		opcodes[0xC2][3]=opcodes[0xC2][4]=rep;
4208 
4209 	/*Stack group*/
4210 	opcodes[0x8B][0]=opcodes[0x8B][1]=opcodes[0x8B][2]=
4211 		opcodes[0x8B][3]=phb;
4212 	opcodes[0x8B][4]=phbe;
4213 	opcodes[0x4B][0]=opcodes[0x4B][1]=opcodes[0x4B][2]=
4214 		opcodes[0x4B][3]=phk;
4215 	opcodes[0x4B][4]=phke;
4216 	opcodes[0xAB][0]=opcodes[0xAB][1]=opcodes[0xAB][2]=
4217 		opcodes[0xAB][3]=plb;
4218 	opcodes[0xAB][4]=plbe;
4219 	opcodes[0x08][0]=opcodes[0x08][1]=opcodes[0x08][2]=
4220 		opcodes[0x08][3]=php;
4221 	opcodes[0x08][4]=php;
4222 	opcodes[0x28][0]=opcodes[0x28][1]=opcodes[0x28][2]=
4223 		opcodes[0x28][3]=plp;
4224 	opcodes[0x28][4]=plp;
4225 	opcodes[0x48][0]=opcodes[0x48][2]=opcodes[0x48][4]=pha8;
4226 	opcodes[0x48][1]=opcodes[0x48][3]=pha16;
4227 	opcodes[0xDA][0]=opcodes[0xDA][1]=opcodes[0xDA][4]=phx8;
4228 	opcodes[0xDA][2]=opcodes[0xDA][3]=phx16;
4229 	opcodes[0x5A][0]=opcodes[0x5A][1]=opcodes[0x5A][4]=phy8;
4230 	opcodes[0x5A][2]=opcodes[0x5A][3]=phy16;
4231 	opcodes[0x68][0]=opcodes[0x68][2]=opcodes[0x68][4]=pla8;
4232 	opcodes[0x68][1]=opcodes[0x68][3]=pla16;
4233 	opcodes[0xFA][0]=opcodes[0xFA][1]=opcodes[0xFA][4]=plx8;
4234 	opcodes[0xFA][2]=opcodes[0xFA][3]=plx16;
4235 	opcodes[0x7A][0]=opcodes[0x7A][1]=opcodes[0x7A][4]=ply8;
4236 	opcodes[0x7A][2]=opcodes[0x7A][3]=ply16;
4237 	opcodes[0xD4][0]=opcodes[0xD4][1]=opcodes[0xD4][2]=
4238 		opcodes[0xD4][3]=opcodes[0xD4][4]=pei;
4239 	opcodes[0xF4][0]=opcodes[0xF4][1]=opcodes[0xF4][2]=
4240 		opcodes[0xF4][3]=opcodes[0xF4][4]=pea;
4241 	opcodes[0x62][0]=opcodes[0x62][1]=opcodes[0x62][2]=
4242 		opcodes[0x62][3]=opcodes[0x62][4]=per;
4243 	opcodes[0x0B][0]=opcodes[0x0B][1]=opcodes[0x0B][2]=
4244 		opcodes[0x0B][3]=opcodes[0x0B][4]=phd;
4245 	opcodes[0x2B][0]=opcodes[0x2B][1]=opcodes[0x2B][2]=
4246 		opcodes[0x2B][3]=opcodes[0x2B][4]=pld;
4247 
4248 	/*CMP group*/
4249 	opcodes[0xC9][0]=opcodes[0xC9][2]=opcodes[0xC9][4]=cmpImm8;
4250 	opcodes[0xC9][1]=opcodes[0xC9][3]=cmpImm16;
4251 	opcodes[0xC5][0]=opcodes[0xC5][2]=opcodes[0xC5][4]=cmpZp8;
4252 	opcodes[0xC5][1]=opcodes[0xC5][3]=cmpZp16;
4253 	opcodes[0xC3][0]=opcodes[0xC3][2]=opcodes[0xC3][4]=cmpSp8;
4254 	opcodes[0xC3][1]=opcodes[0xC3][3]=cmpSp16;
4255 	opcodes[0xD5][0]=opcodes[0xD5][2]=opcodes[0xD5][4]=cmpZpx8;
4256 	opcodes[0xD5][1]=opcodes[0xD5][3]=cmpZpx16;
4257 	opcodes[0xCD][0]=opcodes[0xCD][2]=opcodes[0xCD][4]=cmpAbs8;
4258 	opcodes[0xCD][1]=opcodes[0xCD][3]=cmpAbs16;
4259 	opcodes[0xDD][0]=opcodes[0xDD][2]=opcodes[0xDD][4]=cmpAbsx8;
4260 	opcodes[0xDD][1]=opcodes[0xDD][3]=cmpAbsx16;
4261 	opcodes[0xD9][0]=opcodes[0xD9][2]=opcodes[0xD9][4]=cmpAbsy8;
4262 	opcodes[0xD9][1]=opcodes[0xD9][3]=cmpAbsy16;
4263 	opcodes[0xCF][0]=opcodes[0xCF][2]=opcodes[0xCF][4]=cmpLong8;
4264 	opcodes[0xCF][1]=opcodes[0xCF][3]=cmpLong16;
4265 	opcodes[0xDF][0]=opcodes[0xDF][2]=opcodes[0xDF][4]=cmpLongx8;
4266 	opcodes[0xDF][1]=opcodes[0xDF][3]=cmpLongx16;
4267 	opcodes[0xD2][0]=opcodes[0xD2][2]=opcodes[0xD2][4]=cmpIndirect8;
4268 	opcodes[0xD2][1]=opcodes[0xD2][3]=cmpIndirect16;
4269 	opcodes[0xC1][0]=opcodes[0xC1][2]=opcodes[0xC1][4]=cmpIndirectx8;
4270 	opcodes[0xC1][1]=opcodes[0xC1][3]=cmpIndirectx16;
4271 	opcodes[0xD1][0]=opcodes[0xD1][2]=opcodes[0xD1][4]=cmpIndirecty8;
4272 	opcodes[0xD1][1]=opcodes[0xD1][3]=cmpIndirecty16;
4273 	opcodes[0xC7][0]=opcodes[0xC7][2]=opcodes[0xC7][4]=cmpIndirectLong8;
4274 	opcodes[0xC7][1]=opcodes[0xC7][3]=cmpIndirectLong16;
4275 	opcodes[0xD7][0]=opcodes[0xD7][2]=opcodes[0xD7][4]=cmpIndirectLongy8;
4276 	opcodes[0xD7][1]=opcodes[0xD7][3]=cmpIndirectLongy16;
4277 
4278 	/*CPX group*/
4279 	opcodes[0xE0][0]=opcodes[0xE0][1]=opcodes[0xE0][4]=cpxImm8;
4280 	opcodes[0xE0][2]=opcodes[0xE0][3]=cpxImm16;
4281 	opcodes[0xE4][0]=opcodes[0xE4][1]=opcodes[0xE4][4]=cpxZp8;
4282 	opcodes[0xE4][2]=opcodes[0xE4][3]=cpxZp16;
4283 	opcodes[0xEC][0]=opcodes[0xEC][1]=opcodes[0xEC][4]=cpxAbs8;
4284 	opcodes[0xEC][2]=opcodes[0xEC][3]=cpxAbs16;
4285 
4286 	/*CPY group*/
4287 	opcodes[0xC0][0]=opcodes[0xC0][1]=opcodes[0xC0][4]=cpyImm8;
4288 	opcodes[0xC0][2]=opcodes[0xC0][3]=cpyImm16;
4289 	opcodes[0xC4][0]=opcodes[0xC4][1]=opcodes[0xC4][4]=cpyZp8;
4290 	opcodes[0xC4][2]=opcodes[0xC4][3]=cpyZp16;
4291 	opcodes[0xCC][0]=opcodes[0xCC][1]=opcodes[0xCC][4]=cpyAbs8;
4292 	opcodes[0xCC][2]=opcodes[0xCC][3]=cpyAbs16;
4293 
4294 	/*Branch group*/
4295 	opcodes[0x90][0]=opcodes[0x90][1]=opcodes[0x90][2]=
4296 		opcodes[0x90][3]=opcodes[0x90][4]=bcc;
4297 	opcodes[0xB0][0]=opcodes[0xB0][1]=opcodes[0xB0][2]=
4298 		opcodes[0xB0][3]=opcodes[0xB0][4]=bcs;
4299 	opcodes[0xF0][0]=opcodes[0xF0][1]=opcodes[0xF0][2]=
4300 		opcodes[0xF0][3]=opcodes[0xF0][4]=beq;
4301 	opcodes[0xD0][0]=opcodes[0xD0][1]=opcodes[0xD0][2]=
4302 		opcodes[0xD0][3]=opcodes[0xD0][4]=bne;
4303 	opcodes[0x80][0]=opcodes[0x80][1]=opcodes[0x80][2]=
4304 		opcodes[0x80][3]=opcodes[0x80][4]=bra;
4305 	opcodes[0x82][0]=opcodes[0x82][1]=opcodes[0x82][2]=
4306 		opcodes[0x82][3]=opcodes[0x82][4]=brl;
4307 	opcodes[0x10][0]=opcodes[0x10][1]=opcodes[0x10][2]=
4308 		opcodes[0x10][3]=opcodes[0x10][4]=bpl;
4309 	opcodes[0x30][0]=opcodes[0x30][1]=opcodes[0x30][2]=
4310 		opcodes[0x30][3]=opcodes[0x30][4]=bmi;
4311 	opcodes[0x50][0]=opcodes[0x50][1]=opcodes[0x50][2]=
4312 		opcodes[0x50][3]=opcodes[0x50][4]=bvc;
4313 	opcodes[0x70][0]=opcodes[0x70][1]=opcodes[0x70][2]=
4314 		opcodes[0x70][3]=opcodes[0x70][4]=bvs;
4315 
4316 	/*Jump group*/
4317 	opcodes[0x4C][0]=opcodes[0x4C][1]=opcodes[0x4C][2]=
4318 		opcodes[0x4C][3]=opcodes[0x4C][4]=jmp;
4319 	opcodes[0x5C][0]=opcodes[0x5C][1]=opcodes[0x5C][2]=
4320 		opcodes[0x5C][3]=opcodes[0x5C][4]=jmplong;
4321 	opcodes[0x6C][0]=opcodes[0x6C][1]=opcodes[0x6C][2]=
4322 		opcodes[0x6C][3]=opcodes[0x6C][4]=jmpind;
4323 	opcodes[0x7C][0]=opcodes[0x7C][1]=opcodes[0x7C][2]=
4324 		opcodes[0x7C][3]=opcodes[0x7C][4]=jmpindx;
4325 	opcodes[0xDC][0]=opcodes[0xDC][1]=opcodes[0xDC][2]=
4326 		opcodes[0xDC][3]=opcodes[0xDC][4]=jmlind;
4327 	opcodes[0x20][0]=opcodes[0x20][1]=opcodes[0x20][2]=
4328 		opcodes[0x20][3]=jsr;
4329 	opcodes[0x20][4]=jsre;
4330 	opcodes[0xFC][0]=opcodes[0xFC][1]=opcodes[0xFC][2]=
4331 		opcodes[0xFC][3]=jsrIndx;
4332 	opcodes[0xFC][4]=jsrIndxe;
4333 	opcodes[0x60][0]=opcodes[0x60][1]=opcodes[0x60][2]=
4334 		opcodes[0x60][3]=rts;
4335 	opcodes[0x60][4]=rtse;
4336 	opcodes[0x6B][0]=opcodes[0x6B][1]=opcodes[0x6B][2]=
4337 		opcodes[0x6B][3]=rtl;
4338 	opcodes[0x6B][4]=rtle;
4339 	opcodes[0x40][0]=opcodes[0x40][1]=opcodes[0x40][2]=
4340 		opcodes[0x40][3]=rti;
4341 	opcodes[0x22][0]=opcodes[0x22][1]=opcodes[0x22][2]=
4342 		opcodes[0x22][3]=jsl;
4343 	opcodes[0x22][4]=jsle;
4344 
4345 	/*Shift group*/
4346 	opcodes[0x0A][0]=opcodes[0x0A][2]=opcodes[0x0A][4]=asla8;
4347 	opcodes[0x0A][1]=opcodes[0x0A][3]=asla16;
4348 	opcodes[0x06][0]=opcodes[0x06][2]=opcodes[0x06][4]=aslZp8;
4349 	opcodes[0x06][1]=opcodes[0x06][3]=aslZp16;
4350 	opcodes[0x16][0]=opcodes[0x16][2]=opcodes[0x16][4]=aslZpx8;
4351 	opcodes[0x16][1]=opcodes[0x16][3]=aslZpx16;
4352 	opcodes[0x0E][0]=opcodes[0x0E][2]=opcodes[0x0E][4]=aslAbs8;
4353 	opcodes[0x0E][1]=opcodes[0x0E][3]=aslAbs16;
4354 	opcodes[0x1E][0]=opcodes[0x1E][2]=opcodes[0x1E][4]=aslAbsx8;
4355 	opcodes[0x1E][1]=opcodes[0x1E][3]=aslAbsx16;
4356 
4357 	opcodes[0x4A][0]=opcodes[0x4A][2]=opcodes[0x4A][4]=lsra8;
4358 	opcodes[0x4A][1]=opcodes[0x4A][3]=lsra16;
4359 	opcodes[0x46][0]=opcodes[0x46][2]=opcodes[0x46][4]=lsrZp8;
4360 	opcodes[0x46][1]=opcodes[0x46][3]=lsrZp16;
4361 	opcodes[0x56][0]=opcodes[0x56][2]=opcodes[0x56][4]=lsrZpx8;
4362 	opcodes[0x56][1]=opcodes[0x56][3]=lsrZpx16;
4363 	opcodes[0x4E][0]=opcodes[0x4E][2]=opcodes[0x4E][4]=lsrAbs8;
4364 	opcodes[0x4E][1]=opcodes[0x4E][3]=lsrAbs16;
4365 	opcodes[0x5E][0]=opcodes[0x5E][2]=opcodes[0x5E][4]=lsrAbsx8;
4366 	opcodes[0x5E][1]=opcodes[0x5E][3]=lsrAbsx16;
4367 
4368 	opcodes[0x2A][0]=opcodes[0x2A][2]=opcodes[0x2A][4]=rola8;
4369 	opcodes[0x2A][1]=opcodes[0x2A][3]=rola16;
4370 	opcodes[0x26][0]=opcodes[0x26][2]=opcodes[0x26][4]=rolZp8;
4371 	opcodes[0x26][1]=opcodes[0x26][3]=rolZp16;
4372 	opcodes[0x36][0]=opcodes[0x36][2]=opcodes[0x36][4]=rolZpx8;
4373 	opcodes[0x36][1]=opcodes[0x36][3]=rolZpx16;
4374 	opcodes[0x2E][0]=opcodes[0x2E][2]=opcodes[0x2E][4]=rolAbs8;
4375 	opcodes[0x2E][1]=opcodes[0x2E][3]=rolAbs16;
4376 	opcodes[0x3E][0]=opcodes[0x3E][2]=opcodes[0x3E][4]=rolAbsx8;
4377 	opcodes[0x3E][1]=opcodes[0x3E][3]=rolAbsx16;
4378 
4379 	opcodes[0x6A][0]=opcodes[0x6A][2]=opcodes[0x6A][4]=rora8;
4380 	opcodes[0x6A][1]=opcodes[0x6A][3]=rora16;
4381 	opcodes[0x66][0]=opcodes[0x66][2]=opcodes[0x66][4]=rorZp8;
4382 	opcodes[0x66][1]=opcodes[0x66][3]=rorZp16;
4383 	opcodes[0x76][0]=opcodes[0x76][2]=opcodes[0x76][4]=rorZpx8;
4384 	opcodes[0x76][1]=opcodes[0x76][3]=rorZpx16;
4385 	opcodes[0x6E][0]=opcodes[0x6E][2]=opcodes[0x6E][4]=rorAbs8;
4386 	opcodes[0x6E][1]=opcodes[0x6E][3]=rorAbs16;
4387 	opcodes[0x7E][0]=opcodes[0x7E][2]=opcodes[0x7E][4]=rorAbsx8;
4388 	opcodes[0x7E][1]=opcodes[0x7E][3]=rorAbsx16;
4389 
4390 	/*BIT group*/
4391 	opcodes[0x89][0]=opcodes[0x89][2]=opcodes[0x89][4]=bitImm8;
4392 	opcodes[0x89][1]=opcodes[0x89][3]=bitImm16;
4393 	opcodes[0x24][0]=opcodes[0x24][2]=opcodes[0x24][4]=bitZp8;
4394 	opcodes[0x24][1]=opcodes[0x24][3]=bitZp16;
4395 	opcodes[0x34][0]=opcodes[0x34][2]=opcodes[0x34][4]=bitZpx8;
4396 	opcodes[0x34][1]=opcodes[0x34][3]=bitZpx16;
4397 	opcodes[0x2C][0]=opcodes[0x2C][2]=opcodes[0x2C][4]=bitAbs8;
4398 	opcodes[0x2C][1]=opcodes[0x2C][3]=bitAbs16;
4399 	opcodes[0x3C][0]=opcodes[0x3C][2]=opcodes[0x3C][4]=bitAbsx8;
4400 	opcodes[0x3C][1]=opcodes[0x3C][3]=bitAbsx16;
4401 
4402 	/*Misc group*/
4403 	opcodes[0x00][0]=opcodes[0x00][1]=opcodes[0x00][2]=
4404 		opcodes[0x00][3]=opcodes[0x00][4]=brk;
4405 	opcodes[0xEB][0]=opcodes[0xEB][1]=opcodes[0xEB][2]=
4406 		opcodes[0xEB][3]=opcodes[0xEB][4]=xba;
4407 	opcodes[0xEA][0]=opcodes[0xEA][1]=opcodes[0xEA][2]=
4408 		opcodes[0xEA][3]=opcodes[0xEA][4]=nop;
4409 	opcodes[0x5B][0]=opcodes[0x5B][1]=opcodes[0x5B][2]=
4410 		opcodes[0x5B][3]=opcodes[0x5B][4]=tcd;
4411 	opcodes[0x7B][0]=opcodes[0x7B][1]=opcodes[0x7B][2]=
4412 		opcodes[0x7B][3]=opcodes[0x7B][4]=tdc;
4413 	opcodes[0x1B][0]=opcodes[0x1B][1]=opcodes[0x1B][2]=
4414 		opcodes[0x1B][3]=opcodes[0x1B][4]=tcs;
4415 	opcodes[0x3B][0]=opcodes[0x3B][1]=opcodes[0x3B][2]=
4416 		opcodes[0x3B][3]=opcodes[0x3B][4]=tsc;
4417 	opcodes[0xCB][0]=opcodes[0xCB][1]=opcodes[0xCB][2]=
4418 		opcodes[0xCB][3]=opcodes[0xCB][4]=wai;
4419 	opcodes[0x44][0]=opcodes[0x44][1]=opcodes[0x44][2]=
4420 		opcodes[0x44][3]=opcodes[0x44][4]=mvp;
4421 	opcodes[0x54][0]=opcodes[0x54][1]=opcodes[0x54][2]=
4422 		opcodes[0x54][3]=opcodes[0x54][4]=mvn;
4423 	opcodes[0x04][0]=opcodes[0x04][2]=opcodes[0x04][4]=tsbZp8;
4424 	opcodes[0x04][1]=opcodes[0x04][3]=tsbZp16;
4425 	opcodes[0x0C][0]=opcodes[0x0C][2]=opcodes[0x0C][4]=tsbAbs8;
4426 	opcodes[0x0C][1]=opcodes[0x0C][3]=tsbAbs16;
4427 	opcodes[0x14][0]=opcodes[0x14][2]=opcodes[0x14][4]=trbZp8;
4428 	opcodes[0x14][1]=opcodes[0x14][3]=trbZp16;
4429 	opcodes[0x1C][0]=opcodes[0x1C][2]=opcodes[0x1C][4]=trbAbs8;
4430 	opcodes[0x1C][1]=opcodes[0x1C][3]=trbAbs16;
4431 }
4432 
updatecpumode()4433 void updatecpumode()
4434 {
4435 	if (p.e)
4436 	{
4437 		cpumode=4;
4438 		x.b.h=y.b.h=0;
4439 	}
4440 	else
4441 	{
4442 		cpumode=0;
4443 		if (!p.m) cpumode|=1;
4444 		if (!p.x) cpumode|=2;
4445 		if (p.x) x.b.h=y.b.h=0;
4446 	}
4447 }
4448 
nmi65816()4449 void nmi65816()
4450 {
4451 	unsigned char temp=0;
4452 	//        printf("NMI %i %i %i\n",p.i,inwai,irqenable);
4453 	snes_readmem(pbr|pc);
4454 	cycles-=6;
4455 	clockspc(6);
4456 	if (inwai)
4457 	{
4458 		pc++;
4459 	}
4460 	inwai=0;
4461 	if (!p.e)
4462 	{
4463 		//                //printf("%02X -> %04X\n",pbr>>16,s.w);
4464 		snes_writemem(s.w,pbr>>16); s.w--;
4465 		//                //printf("%02X -> %04X\n",pc>>8,s.w);
4466 		snes_writemem(s.w,pc>>8);   s.w--;
4467 		//                //printf("%02X -> %04X\n",pc&0xFF,s.w);
4468 		snes_writemem(s.w,pc&0xFF);  s.w--;
4469 		if (p.c) temp|=1;
4470 		if (p.z) temp|=2;
4471 		if (p.i) temp|=4;
4472 		if (p.d) temp|=8;
4473 		if (p.x) temp|=0x10;
4474 		if (p.m) temp|=0x20;
4475 		if (p.v) temp|=0x40;
4476 		if (p.n) temp|=0x80;
4477 		//                //printf("%02X -> %04X\n",temp,s.w);
4478 		snes_writemem(s.w,temp);    s.w--;
4479 		pc=readmemw(0xFFEA);
4480 		pbr=0;
4481 		p.i=1;
4482 		p.d=0;
4483 		//                printf("NMI\n");
4484 	}
4485 	else
4486 	{
4487 		//snemlog(L"Emulation mode NMI\n");
4488 	}
4489 }
4490 
irq65816()4491 void irq65816()
4492 {
4493 	unsigned char temp=0;
4494 	//        printf("IRQ %i %i %i\n",p.i,inwai,irqenable);
4495 	snes_readmem(pbr|pc);
4496 	cycles-=6; clockspc(6);
4497 	if (inwai && p.i)
4498 	{
4499 		pc++;
4500 		inwai=0;
4501 		return;
4502 	}
4503 	if (inwai) pc++;
4504 	inwai=0;
4505 	if (!p.e)
4506 	{
4507 		snes_writemem(s.w,pbr>>16); s.w--;
4508 		snes_writemem(s.w,pc>>8);   s.w--;
4509 		snes_writemem(s.w,pc&0xFF);  s.w--;
4510 		if (p.c) temp|=1;
4511 		if (p.z) temp|=2;
4512 		if (p.i) temp|=4;
4513 		if (p.d) temp|=8;
4514 		if (p.x) temp|=0x10;
4515 		if (p.m) temp|=0x20;
4516 		if (p.v) temp|=0x40;
4517 		if (p.n) temp|=0x80;
4518 		snes_writemem(s.w,temp);    s.w--;
4519 		pc=readmemw(0xFFEE);
4520 		pbr=0;
4521 		p.i=1;
4522 		p.d=0;
4523 		//                printf("IRQ\n");
4524 	}
4525 	else
4526 	{
4527 		//snemlog(L"Emulation mode IRQ\n");
4528 	}
4529 }
4530