1 /*************************************
5 modified and adapted by Yoyo.
6 adapted for fceu by notaz, 2007.
7 **************************************/
12 @@@ Offets from REG_OP_TABLE
14 #define OTOFFS_NES_RAM (nes_internal_ram - cpu_exec_table)
15 #define OTOFFS_NES_STACK (nes_stack - cpu_exec_table)
16 #define OTOFFS_NES_REGS (nes_registers - cpu_exec_table)
17 #define OTOFFS_PC_BASE (pc_base - cpu_exec_table)
18 #define OTOFFS_IRQ_HOOK (MapIRQHook - cpu_exec_table)
19 #define OTOFFS_X (X_ - cpu_exec_table)
22 #define FCEU_IQNMI 0x08
23 #define FCEU_IQTEMP 0x80
26 @@@@@@@@@@@@@@@@@@@@@@@@@@
40 @@@ r0 = Address (unbased)
41 @@@ uses REG_OP_TABLE; sets REG_PC; trashes r1,r2; keeps r0
44 @ FIXME: do something with mem not in Page[].
45 @ stmfd sp!, {r0-r3,r12,lr}
49 @ ldmfd sp!, {r0-r3,r12,lr}
54 ldrge r2, [r1, r2, lsl #2]
56 addlt r1, REG_OP_TABLE, #OTOFFS_NES_RAM
58 str r2, [REG_OP_TABLE, #OTOFFS_PC_BASE]
64 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
65 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
69 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
70 @@@ ¤¿¤À¤·³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤¤
72 @@@ ¤Ê¤ó¤«Ì¾Á°¤¬ÊѤÀ¤Ê(¤É¡¼¤Ç¤â¤¤¡¼¤±¤É¡¼
77 subs REG_CYCLE, REG_CYCLE, #\n*48
79 tst REG_P_REST, #1<<16
83 tst REG_P_REST, #0xff<<8
84 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
86 @ do some messing to find out which IRQ is pending..
87 tst REG_P_REST, #FCEU_IQNMI<<8
89 tst REG_P_REST, #P_REST_I_FLAG
90 @@ if I_FLAG=1, continue execution, don't trigger IRQ
91 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
92 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
93 @@ I_FLAG=0 and REST is checked, we have a IRQ
98 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
99 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
103 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
104 @@@ CLI¡¦PHP¤Ê¤É¥Õ¥é¥°¤òÊѹ¹¤·¤¿¾ì¹ç¤Ï¤³¤ì
106 .macro CYCLE_NEXT_INT n
109 @ subs REG_CYCLE, REG_CYCLE, #\n*48
110 @ bgt cpu_exec_check_int
111 @ RETURN_FROM_CPU_EXEC
115 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
116 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
118 @@@ ¥¼¥í¥Ú¡¼¥¸¤«¤éÆɤà
121 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
122 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
126 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
137 ldrb REG_ADDR, [REG_ADDR, #1]
138 orr REG_ADDR, r0, REG_ADDR, lsl #8
141 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
142 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
146 .macro ZP_WRITE reg=r0
147 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
148 strb \reg, [REG_ADDR, REG_OP_TABLE]
152 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
159 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
160 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
162 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤
164 @@@ REG_ADDR => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
165 @@@ r0 => ½ñ¤¯¥Ð¥¤¥È(write)
166 @@@ r0 <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
170 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
173 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
175 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
177 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
180 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é¥í¡¼¥É¤Î¤ß
182 @@@ RAM¤«¤é¤Î¥í¡¼¥É¤¬°ìÈÖ¿¤¤¤Î¤ÇÍ¥À褹¤ë
192 movs r1, REG_ADDR, lsr #13
194 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
195 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
196 ldrne pc, [lr, -r1, lsl #2]
198 bic r0, REG_ADDR, #0x1800
199 add r0, r0, #OTOFFS_NES_RAM
200 ldrb r0, [r0, REG_OP_TABLE]
215 mov r1, REG_ADDR, lsr #13
217 ldr pc, [pc, r1, lsl #2]
228 bic r0, REG_ADDR, #0x1800
229 add r0, r0, #OTOFFS_NES_RAM
230 ldrb r0, [r0, REG_OP_TABLE]
231 @@ ¤È¤¤¤¦¤ï¤±¤Ç¥¸¥ã¥ó¥×¤¹¤ëɬÍפϤʤ¤
236 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
246 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
249 movs r3, REG_ADDR, lsr #13
251 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
252 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
253 ldrne pc, [lr, -r3, lsl #2]
255 bic REG_ADDR, REG_ADDR, #0x1800
256 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
257 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
277 ldr pc, [pc, r3, lsl #2]
291 @@@ ½ñ¤¹þ¤ß¤À¤±¤Î¾ì¹ç
302 movs r1, REG_ADDR, lsr #13
304 ldrne pc, [lr, -r1, lsl #2]
305 bic REG_ADDR, REG_ADDR, #0x1800
306 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
308 strb r0, [REG_ADDR, REG_OP_TABLE]
323 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
324 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
325 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
326 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
327 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
332 add REG_ADDR, REG_ADDR, #1
334 orr r0, REG_PC, r0, lsl #8
338 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
339 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
341 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
347 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
348 strb r0, [r1, REG_S, lsr #24]
349 sub REG_S, REG_S, #1 << 24
354 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
356 strb r2, [r1, REG_S, lsr #24]
357 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
358 sub REG_S, REG_S, #1 << 24
359 strb r0, [r1, REG_S, lsr #24]
360 sub REG_S, REG_S, #1 << 24
365 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
366 add REG_S, REG_S, #1 << 24
367 ldrb r0, [r0, REG_S, lsr #24]
372 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
373 add REG_S, REG_S, #1 << 24
374 ldrb r1, [r0, REG_S, lsr #24]
375 add REG_S, REG_S, #1 << 24
376 ldrb r0, [r0, REG_S, lsr #24]
377 orr r0, r1, r0, lsl #8
380 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
381 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
383 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
390 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
391 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
393 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
396 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
399 ldrb r0, [REG_PC], #1
402 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
405 ldrb REG_ADDR, [REG_PC], #1
408 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
412 add REG_ADDR, REG_ADDR, REG_X
413 and REG_ADDR, REG_ADDR, #0xFF
416 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
420 add REG_ADDR, REG_ADDR, REG_Y
421 and REG_ADDR, REG_ADDR, #0xFF
424 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
431 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
436 add REG_ADDR, REG_ADDR, REG_Y
437 bic REG_ADDR, REG_ADDR, #0x10000
438 and r0,REG_ADDR,#0xff
440 subgt REG_CYCLE,REG_CYCLE,#1*48
443 @ Indirect Indexed (for writes and rmws)
447 add REG_ADDR, REG_ADDR, REG_Y
448 bic REG_ADDR, REG_ADDR, #0x10000
452 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
453 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
455 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
458 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
463 ldrneb REG_ADDR, [REG_PC], #1
464 ldrneb r0, [REG_PC], #1
465 ldreqh REG_ADDR, [REG_PC], #2
466 orrne REG_ADDR, REG_ADDR, r0, lsl #8
469 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
473 add REG_ADDR, REG_ADDR, REG_X
474 bic REG_ADDR, REG_ADDR, #0x10000
475 and r0,REG_ADDR,#0xff
477 subgt REG_CYCLE,REG_CYCLE,#1*48
480 @ Absolute Indexed (for writes and rmws)
483 add REG_ADDR, REG_ADDR, REG_X
484 bic REG_ADDR, REG_ADDR, #0x10000
487 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
491 add REG_ADDR, REG_ADDR, REG_Y
492 bic REG_ADDR, REG_ADDR, #0x10000
493 and r0,REG_ADDR,#0xff
495 subgt REG_CYCLE,REG_CYCLE,#1*48
498 @ Absolute Indexed (for writes and rmws)
501 add REG_ADDR, REG_ADDR, REG_Y
502 bic REG_ADDR, REG_ADDR, #0x10000
505 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
508 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
509 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
510 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
516 orrne REG_NZ, REG_NZ, #0x80 << 24
518 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
519 and r0, r0, #P_REST_FLAGS
520 orr REG_P_REST, REG_P_REST, r0
525 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
526 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
529 and r0, REG_P_REST, #P_REST_FLAGS
530 tst REG_NZ, #0x80 << 24
531 orrne r0, r0, #P_N_FLAG
533 orreq r0, r0, #P_Z_FLAG
534 orr r0, r0, #P_R_FLAG
545 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
546 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
555 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
556 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
558 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
563 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
564 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
568 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
573 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
578 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
583 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
588 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
593 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
598 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
601 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
602 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
604 @@@ TAX/TXA/TAY/TYA/TSX/TXS
606 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
609 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
613 mov REG_X, REG_A, lsr #24
614 mov REG_NZ, REG_A, asr #24
619 mov REG_A, REG_X, lsl #24
620 mov REG_NZ, REG_A, asr #24
625 mov REG_Y, REG_A, lsr #24
626 mov REG_NZ, REG_A, asr #24
631 mov REG_A, REG_Y, lsl #24
632 mov REG_NZ, REG_A, asr #24
637 mov REG_X, REG_S, lsr #24
638 orr REG_NZ, REG_X, REG_X, lsl #24
643 bic REG_S, REG_S, #0xFF << 24
644 orr REG_S, REG_S, REG_X, lsl #24
648 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
649 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
654 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
658 mov r0, REG_A, lsr #24
665 orr r0, r0, #P_B_FLAG
672 mov REG_A, r0, lsl #24
673 mov REG_NZ, REG_A, asr #24
682 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
683 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
693 mov REG_A, r0, lsl #24
694 mov REG_NZ, REG_A, asr #24
699 orr REG_NZ, r0, r0, lsl #24
846 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
847 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
857 mov r0, REG_A, lsr #24
951 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
952 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
954 @@@ INC/INX/INY/DEC/DEX/DEY
955 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
956 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
965 orr REG_NZ, r0, r0, lsl #24
970 and \reg, \reg, #0xFF
971 orr REG_NZ, \reg, \reg, lsl #24
977 orr REG_NZ, r0, r0, lsl #24
982 and \reg, \reg, #0xFF
983 orr REG_NZ, \reg, \reg, lsl #24
1011 opFE: @ INC $nnnn, X
1057 opDE: @ DEC $nnnn, X
1079 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1080 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1084 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1087 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1088 movs r1, REG_P_REST, lsr #1
1089 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1090 subcs r0, r0, #0x100
1091 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1092 adcs REG_A, REG_A, r0, ror #8
1093 mov REG_NZ, REG_A, asr #24
1094 adc REG_P_REST, r1, r1
1095 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1096 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1100 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1101 movs r1, REG_P_REST, lsr #1
1102 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1103 sbcs REG_A, REG_A, r0, lsl #24
1104 and REG_A, REG_A, #0xFF << 24
1105 mov REG_NZ, REG_A, asr #24
1106 adc REG_P_REST, r1, r1
1107 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1108 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1137 op7D: @ ADC $nnnn, X
1146 op79: @ ADC $nnnn, Y
1155 op61: @ ADC ($nn, X)
1164 op71: @ ADC ($nn), Y
1200 opFD: @ SBC $nnnn, X
1209 opF9: @ SBC $nnnn, Y
1218 opE1: @ SBC ($nn, X)
1227 opF1: @ SBC ($nn), Y
1237 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1238 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1242 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1248 and REG_A, REG_A, r0, lsl #24
1249 mov REG_NZ, REG_A, asr #24
1253 eor REG_A, REG_A, r0, lsl #24
1254 mov REG_NZ, REG_A, asr #24
1258 orr REG_A, REG_A, r0, lsl #24
1259 mov REG_NZ, REG_A, asr #24
1288 op3D: @ AND $nnnn, X
1297 op39: @ AND $nnnn, Y
1306 op21: @ AND ($nn, X)
1315 op31: @ AND ($nn), Y
1351 op5D: @ EOR $nnnn, X
1360 op59: @ EOR $nnnn, Y
1369 op41: @ EOR ($nn, X)
1378 op51: @ EOR ($nn), Y
1414 op1D: @ ORA $nnnn, X
1423 op19: @ ORA $nnnn, Y
1432 op01: @ ORA ($nn, X)
1441 op11: @ ORA ($nn), Y
1452 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1453 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1457 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1463 subs REG_NZ, REG_A, r0, lsl #24
1464 mov REG_NZ, REG_NZ, asr #24
1465 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1466 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1470 mov r1, \reg, lsl #24
1471 subs REG_NZ, r1, r0, lsl #24
1472 mov REG_NZ, REG_NZ, asr #24
1473 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1474 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1511 opDD: @ CMP $nnnn, X
1520 opD9: @ CMP $nnnn, Y
1529 opC1: @ CMP ($nn, X)
1538 opD1: @ CMP ($nn), Y
1590 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1591 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1595 @@@ Z <= A ¢Ê M == 0
1603 and REG_NZ, r0, REG_A, lsr #24
1604 @@ R0[7] => C, R0[6] => N
1605 movs r0, r0, lsl #25
1606 orrcs REG_NZ, REG_NZ, #0x80 << 24
1607 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1608 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1627 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1628 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1632 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1637 movs REG_NZ, r0, lsl #25
1638 mov r0, REG_NZ, lsr #24
1639 mov REG_NZ, REG_NZ, asr #24
1640 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1641 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1645 movs REG_A, REG_A, lsl #1
1646 mov REG_NZ, REG_A, asr #24
1647 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1648 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1655 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1656 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1661 movs REG_NZ, REG_A, lsr #25
1662 mov REG_A, REG_NZ, lsl #24
1663 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1664 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1697 op1E: @ ASL $nnnn, X
1739 op5E: @ LSR $nnnn, X
1751 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1752 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1762 movs r1, REG_P_REST, lsr #1
1765 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1766 orrs REG_NZ, r0, r0, lsl #24
1768 adc REG_P_REST, r1, r1
1773 movs r1, REG_P_REST, lsr #1
1774 orrcs REG_A, REG_A, #0x80 << 16
1775 movs REG_A, REG_A, lsl #1
1776 mov REG_NZ, REG_A, asr #24
1777 adc REG_P_REST, r1, r1
1781 movs r1, REG_P_REST, lsr #1
1782 orrcs r0, r0, #0x100
1784 orr REG_NZ, r0, r0, lsl #24
1785 adc REG_P_REST, r1, r1
1789 movs r1, REG_P_REST, lsr #1
1790 mov REG_NZ, REG_A, rrx
1791 movs REG_NZ, REG_NZ, asr #24
1792 mov REG_A, REG_NZ, lsl #24
1793 adc REG_P_REST, r1, r1
1827 op3E: @ ROL $nnnn, X
1869 op7E: @ ROR $nnnn, X
1881 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1882 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1884 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1891 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1893 mov r3, r1 @ preserve immediate
1897 @@ R1 <- (PC&0xFF)+ReadValue
1901 subne REG_CYCLE,REG_CYCLE, #1*48
1905 ldreqsb r1, [REG_PC], #1
1907 add REG_PC, REG_PC, r1
1908 subeq REG_CYCLE, REG_CYCLE, #1*48
1915 ldrnesb r1, [REG_PC], #1
1917 add REG_PC, REG_PC, r1
1918 subne REG_CYCLE, REG_CYCLE, #1*48
1925 tst REG_P_REST, #P_REST_C_FLAG
1932 tst REG_P_REST, #P_REST_C_FLAG
1948 tst REG_NZ, #0x80 << 24
1949 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1954 tst REG_NZ, #0x80 << 24
1960 tst REG_P_REST, #P_REST_V_FLAG
1967 tst REG_P_REST, #P_REST_V_FLAG
1973 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1974 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1979 mov REG_A, r0, lsl #24
1981 mov REG_NZ, REG_A, asr #24
1985 movs r0, r0, lsl #25
1987 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1988 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1992 mov REG_NZ, REG_A, asr #24
1993 @@restore value to write
2003 mov r0,REG_ADDR, lsr #8
2011 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2012 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2014 eor REG_A,REG_A,r0, lsl #24
2016 mov REG_NZ, REG_A, asr #24
2020 and r1,REG_X,REG_A, lsr #24
2022 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2023 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2025 orr REG_NZ, REG_X, REG_X, lsl #24
2035 movs r1, REG_P_REST, lsr #1
2038 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
2039 orrs REG_NZ, r0, r0, lsl #24
2041 adc REG_P_REST, r1, r1
2042 and REG_A,REG_A,r0,lsl #24
2046 movs r1, REG_P_REST, lsr #1
2047 orrcs r0, r0, #0x100
2051 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2052 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2082 op5F: @ SRE $nnnn, X
2093 op5B: @ SRE $nnnn, Y
2104 op43: @ SRE ($nn, X)
2115 op53: @ SRE ($nn), Y
2127 op9C: @ SHY $nnnn, X
2178 opFB: @ ISB $nnnn, Y
2191 opE3: @ ISB ($nn, X)
2204 opF3: @ ISB ($nn), Y
2238 opBF: @ LAX $nnnn, Y
2247 opA3: @ LAX ($nn, X)
2256 opB3: @ LAX ($nn), Y
2290 op1F: @ SLO $nnnn, X
2301 op1B: @ SLO $nnnn, Y
2312 op03: @ SLO ($nn, X)
2323 op13: @ SLO ($nn), Y
2368 opDF: @ DCP $nnnn, X
2381 opDB: @ DCP $nnnn, Y
2395 opC3: @ DCP ($nn, X)
2408 opD3: @ DCP ($nn), Y
2446 op3F: @ RLA $nnnn, X
2457 op3B: @ RLA $nnnn, Y
2468 op23: @ RLA ($nn, X)
2479 op33: @ RLA ($nn), Y
2519 op7F: @ RRA $nnnn, X
2532 op7B: @ RRA $nnnn, Y
2545 op63: @ RRA ($nn, X)
2558 op73: @ RRA ($nn), Y
2575 add REG_PC,REG_PC,#1
2579 add REG_PC,REG_PC,#2
2588 add REG_PC,REG_PC,#1
2599 op1C: @ NOP $nnnn, X
2605 add REG_PC,REG_PC,#2
2613 add REG_PC,REG_PC,#1
2618 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2619 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2629 and r0, REG_ADDR, #0xFF
2631 beq jmp_indirect_bug
2637 @@ BUG is : to not read word at REG_ADDR, because it loops
2638 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2642 and REG_ADDR, REG_ADDR, #0xff00
2644 orr r0, REG_PC, r0, lsl #8
2650 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2651 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2666 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2667 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2677 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2687 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2688 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2697 add REG_PC, REG_PC, #1
2698 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2701 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2704 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2705 mov REG_ADDR, #0x10000
2706 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2711 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2712 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2728 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2729 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2746 @@@ WARNING: decrements REG_PC
2749 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2750 sub REG_PC, REG_PC, #1
2753 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2756 tst REG_P_REST, #FCEU_IQNMI<<8
2757 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2758 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2759 mov REG_ADDR, #0x10000
2760 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2761 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2772 stmfd r13!,{r4-r11,lr}
2774 ldr r0, =nes_registers
2779 @@REG_P_REST = 0, don't touch REG_S
2780 bic REG_P_REST, REG_P_REST, #0xff
2782 @ fceu: set MapIRQHook present flag
2783 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2785 orrne REG_P_REST, REG_P_REST, #1<<16
2786 biceq REG_P_REST, REG_P_REST, #1<<16
2788 @@ R bit is always 1
2789 orr REG_NZ, REG_NZ, #P_R_FLAG
2792 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2794 mov REG_ADDR, #0x10000
2795 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2799 ldr r0, =nes_registers
2802 ldmfd r13!,{r4-r11,lr}
2806 @@@ low-level memhandlers
2810 #ifndef DEBUG_ASM_6502
2814 orr r1, r1, r1, lsr #4
2815 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2819 mov r1, REG_ADDR, lsr #11
2820 ldr r2, [r2, r1, lsl #2]
2821 ldrb r0, [r2, REG_ADDR]
2829 @ must preserve r3 for the callers too
2830 @ TODO: check if all of saves are needed, _DB (is full needed?)
2831 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2832 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2833 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2835 mov REG_P_REST, r3 @ r8
2837 #ifndef DEBUG_ASM_6502
2839 bic r0, REG_ADDR, #0x00ff0000
2841 ldr pc, [r2, r0, lsl #2]
2843 ldr r2, =dread_count_a
2851 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2854 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2855 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2856 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2857 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2865 #ifndef DEBUG_ASM_6502
2866 @ must preserve r3 for the callers too
2867 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2868 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2869 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2871 mov REG_P_REST, r3 @ r8
2875 bic r0, REG_ADDR, #0x00ff0000
2877 ldr pc, [r2, r0, lsl #2]
2879 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2882 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2883 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2884 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2886 ldr r1, =dwrite_count_a
2890 orr r0, r0, REG_ADDR, lsl #8
2891 str r0, [r2, r1, lsl #2]
2892 ldr r2, =dwrite_count_a
2903 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2904 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2906 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2908 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2909 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2912 stmfd r13!,{r4-r11,lr}
2914 ldr r0, =nes_registers
2917 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2922 ldr r0, =nes_registers
2925 ldmfd r13!,{r4-r11,lr}
2929 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2933 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2934 @ they must be in the same section
2940 .long op00, op01, op02, op03, op04, op05, op06, op07
2941 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2943 .long op10, op11, op12, op13, op14, op15, op16, op17
2944 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2946 .long op20, op21, op22, op23, op24, op25, op26, op27
2947 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2949 .long op30, op31, op32, op33, op34, op35, op36, op37
2950 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2952 .long op40, op41, op42, op43, op44, op45, op46, op47
2953 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2955 .long op50, op51, op52, op53, op54, op55, op56, op57
2956 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2958 .long op60, op61, op62, op63, op64, op65, op66, op67
2959 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2961 .long op70, op71, op72, op73, op74, op75, op76, op77
2962 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2964 .long op80, op81, op82, op83, op84, op85, op86, op87
2965 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2967 .long op90, op91, op92, op93, op94, op95, op96, op97
2968 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2970 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2971 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
2973 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
2974 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
2976 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
2977 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
2979 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
2980 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
2982 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
2983 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
2985 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
2986 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
2989 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
2999 @ TODO: write code which keeps it up-to-date
3006 #ifndef DEBUG_ASM_6502
3009 X_: .fill 0x20, 1, 0
3018 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3019 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3021 @@@ Undefined Opcodes
3031 @opDF: @ DCP $nnnn, X
3032 @opDB: @ DCP $nnnn, Y
3033 @opC3: @ DCP ($nn, X)
3034 @opD3: @ DCP ($nn), Y
3041 @opFF: @ ISB $nnnn, X
3042 @opFB: @ ISB $nnnn, Y
3043 @opE3: @ ISB ($nn, X)
3044 @opF3: @ ISB ($nn), Y
3062 @opA3: @ LAX ($nn, X)
3066 @opBF: @ LAX $nnnn, Y
3068 @opB3: @ LAX ($nn), Y
3073 @op3F: @ RLA $nnnn, X
3074 @op23: @ RLA ($nn, X)
3078 @op7F: @ RRA $nnnn, X
3079 @op63: @ RRA ($nn, X)
3083 op83: @ SAX ($nn, X)
3085 op9F: @ SHA $nnnn, Y
3086 op93: @ SHA ($nn), Y
3087 op9B: @ SHS $nnnn, Y
3088 op9E: @ SHX $nnnn, Y
3089 @op03: @ SLO ($nn, X)
3093 @op1F: @ SLO $nnnn, X
3097 @op5F: @ SRE $nnnn, X
3098 @op5B: @ SRE $nnnn, Y
3099 @op43: @ SRE ($nn, X)
3105 @@@@@@@@@@@@@@@@@@@@@@@@@@
3107 @@@@@@@@@@@@@@@@@@@@@@@@@@
3118 .globl nes_registers @ TODO: hide?
3120 #ifndef DEBUG_ASM_6502
3124 .globl MapIRQHook @ (int a)
3126 .globl nes_internal_ram
3128 .globl X6502_Reset_a @ (void);
3129 .globl X6502_Power_a @ (void);
3130 .globl X6502_Run_a @ (int32 cycles);
3131 .globl TriggerIRQ_a @ (void);
3132 .globl TriggerNMI_a @ (void);
3133 .globl TriggerNMINSF_a @ (void);
3134 .globl X6502_AddCycles_a @ (int x);
3135 .globl X6502_IRQBegin_a @ (int w);
3136 .globl X6502_IRQEnd_a @ (int w);
3137 .globl X6502_Rebase_a @ (void);
3142 .equiv X6502_Reset_a, reset_cpu
3143 .equiv X6502_Run_a, cpu_exec
3150 ldr r1, =nes_registers
3155 bne X6502_Power_loop1
3156 ldr r0, =cpu_exec_table
3163 mov r0, #FCEU_IQTEMP
3166 ldr r2, =nes_registers
3168 ldr r1, [r2, #0x10] @ REG_P_REST
3169 orr r1, r1, r0, lsl #8
3175 ldr r2, =nes_registers
3178 bic r1, r1, r0, lsl #8
3194 ldr r2, =nes_registers
3196 mvn r3, #47 @ r3=-48
3202 @ rebase PC when not executing or in memhandlers
3204 stmfd sp!,{REG_PC,REG_OP_TABLE}
3205 ldr REG_OP_TABLE, =cpu_exec_table
3206 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3207 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3210 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3211 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3216 @ the nasty MapIRQHook thing from FCE..
3218 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3219 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3220 mov REG_P_REST, lr @ r8
3222 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3224 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3226 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
3228 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3232 @ vim:filetype=armasm