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_TIMESTAMP (timestamp - cpu_exec_table)
20 #define OTOFFS_X (X_ - cpu_exec_table)
23 #define FCEU_IQNMI 0x08
24 #define FCEU_IQTEMP 0x80
27 @@@@@@@@@@@@@@@@@@@@@@@@@@
39 stmfd sp!,{r0-r3,r12,lr}
43 ldmfd sp!,{r0-r3,r12,lr}
47 @@@ r0 = Address (unbased)
48 @@@ uses REG_OP_TABLE; sets REG_PC; trashes r1,r2; keeps r0
51 @ FIXME: do something with mem not in Page[].
52 @ stmfd sp!, {r0-r3,r12,lr}
56 @ ldmfd sp!, {r0-r3,r12,lr}
61 ldrge r2, [r1, r2, lsl #2]
63 addlt r1, REG_OP_TABLE, #OTOFFS_NES_RAM
65 str r2, [REG_OP_TABLE, #OTOFFS_PC_BASE]
70 @ updates fceu "timestamp" variable
71 @ loads cycles to reg, reg!=r1, trashes r1
72 .macro FLUSH_TIMESTAMP reg
73 ldr r1, [REG_OP_TABLE, #OTOFFS_TIMESTAMP]
74 and \reg, REG_CYCLE, #0xff
76 bic REG_CYCLE, REG_CYCLE, #0xff
77 str r1, [REG_OP_TABLE, #OTOFFS_TIMESTAMP]
81 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
82 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
86 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
87 @@@ ¤¿¤À¤·³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤¤
89 @@@ ¤Ê¤ó¤«Ì¾Á°¤¬ÊѤÀ¤Ê(¤É¡¼¤Ç¤â¤¤¡¼¤±¤É¡¼
91 .macro CYCLE_NEXT n, hook_check=1
94 add REG_CYCLE, REG_CYCLE, #\n
95 subs REG_CYCLE, REG_CYCLE, #\n*48<<16
98 tst REG_P_REST, #1<<16
101 ldrb r0, [REG_PC], #1
102 tst REG_P_REST, #0xff<<8
103 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
105 @ do some messing to find out which IRQ is pending..
106 tst REG_P_REST, #FCEU_IQNMI<<8
108 tst REG_P_REST, #P_REST_I_FLAG
109 @@ if I_FLAG=1, continue execution, don't trigger IRQ
110 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
111 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
112 @@ I_FLAG=0 and REST is checked, we have a IRQ
117 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
118 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
122 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
123 @@@ CLI¡¦PHP¤Ê¤É¥Õ¥é¥°¤òÊѹ¹¤·¤¿¾ì¹ç¤Ï¤³¤ì
125 .macro CYCLE_NEXT_INT n
129 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
130 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
132 @@@ ¥¼¥í¥Ú¡¼¥¸¤«¤éÆɤà
135 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
136 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
140 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
151 ldrb REG_ADDR, [REG_ADDR, #1]
152 orr REG_ADDR, r0, REG_ADDR, lsl #8
155 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
156 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
160 .macro ZP_WRITE reg=r0
161 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
162 strb \reg, [REG_ADDR, REG_OP_TABLE]
166 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
173 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
174 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
176 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤
178 @@@ REG_ADDR => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
179 @@@ r0 => ½ñ¤¯¥Ð¥¤¥È(write)
180 @@@ r0 <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
184 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
187 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
189 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
191 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
194 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é¥í¡¼¥É¤Î¤ß
196 @@@ RAM¤«¤é¤Î¥í¡¼¥É¤¬°ìÈÖ¿¤¤¤Î¤ÇÍ¥À褹¤ë
206 movs r1, REG_ADDR, lsr #13
208 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
209 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
210 ldrne pc, [lr, -r1, lsl #2]
212 bic r0, REG_ADDR, #0x1800
213 add r0, r0, #OTOFFS_NES_RAM
214 ldrb r0, [r0, REG_OP_TABLE]
229 mov r1, REG_ADDR, lsr #13
231 ldr pc, [pc, r1, lsl #2]
242 bic r0, REG_ADDR, #0x1800
243 add r0, r0, #OTOFFS_NES_RAM
244 ldrb r0, [r0, REG_OP_TABLE]
245 @@ ¤È¤¤¤¦¤ï¤±¤Ç¥¸¥ã¥ó¥×¤¹¤ëɬÍפϤʤ¤
250 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
260 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
263 movs r3, REG_ADDR, lsr #13
265 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
266 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
267 ldrne pc, [lr, -r3, lsl #2]
269 bic REG_ADDR, REG_ADDR, #0x1800
270 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
271 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
280 ldr pc, [pc, r3, lsl #2]
302 READ_WRITE_W @ rmw first writes unmodified data
306 READ_WRITE_W @ and only then modified (Blaster Master)
310 @@@ ½ñ¤¹þ¤ß¤À¤±¤Î¾ì¹ç
321 movs r1, REG_ADDR, lsr #13
323 ldrne pc, [lr, -r1, lsl #2]
324 bic REG_ADDR, REG_ADDR, #0x1800
325 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
327 strb r0, [REG_ADDR, REG_OP_TABLE]
342 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
343 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
344 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
345 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
346 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
351 add REG_ADDR, REG_ADDR, #1
353 orr r0, REG_PC, r0, lsl #8
357 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
358 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
360 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
366 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
367 strb r0, [r1, REG_S, lsr #24]
368 sub REG_S, REG_S, #1 << 24
373 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
375 strb r2, [r1, REG_S, lsr #24]
376 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
377 sub REG_S, REG_S, #1 << 24
378 strb r0, [r1, REG_S, lsr #24]
379 sub REG_S, REG_S, #1 << 24
384 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
385 add REG_S, REG_S, #1 << 24
386 ldrb r0, [r0, REG_S, lsr #24]
391 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
392 add REG_S, REG_S, #1 << 24
393 ldrb r1, [r0, REG_S, lsr #24]
394 add REG_S, REG_S, #1 << 24
395 ldrb r0, [r0, REG_S, lsr #24]
396 orr r0, r1, r0, lsl #8
399 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
400 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
402 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
409 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
410 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
412 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
415 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
418 ldrb r0, [REG_PC], #1
421 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
424 ldrb REG_ADDR, [REG_PC], #1
427 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
431 add REG_ADDR, REG_ADDR, REG_X
432 and REG_ADDR, REG_ADDR, #0xFF
435 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
439 add REG_ADDR, REG_ADDR, REG_Y
440 and REG_ADDR, REG_ADDR, #0xFF
443 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
450 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
455 add REG_ADDR, REG_ADDR, REG_Y
456 bic REG_ADDR, REG_ADDR, #0x10000
457 and r0,REG_ADDR,#0xff
459 addgt REG_CYCLE, REG_CYCLE, #1
460 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
463 @ Indirect Indexed (for writes and rmws)
467 add REG_ADDR, REG_ADDR, REG_Y
468 bic REG_ADDR, REG_ADDR, #0x10000
472 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
473 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
475 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
478 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
483 ldrneb REG_ADDR, [REG_PC], #1
484 ldrneb r0, [REG_PC], #1
485 ldreqh REG_ADDR, [REG_PC], #2
486 orrne REG_ADDR, REG_ADDR, r0, lsl #8
489 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
493 add REG_ADDR, REG_ADDR, REG_X
494 bic REG_ADDR, REG_ADDR, #0x10000
495 and r0,REG_ADDR,#0xff
497 addgt REG_CYCLE, REG_CYCLE, #1
498 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
501 @ Absolute Indexed (for writes and rmws)
504 add REG_ADDR, REG_ADDR, REG_X
505 bic REG_ADDR, REG_ADDR, #0x10000
508 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
512 add REG_ADDR, REG_ADDR, REG_Y
513 bic REG_ADDR, REG_ADDR, #0x10000
514 and r0,REG_ADDR,#0xff
516 addgt REG_CYCLE, REG_CYCLE, #1
517 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
520 @ Absolute Indexed (for writes and rmws)
523 add REG_ADDR, REG_ADDR, REG_Y
524 bic REG_ADDR, REG_ADDR, #0x10000
527 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
530 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
531 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
532 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
538 orrne REG_NZ, REG_NZ, #0x80 << 24
540 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
541 and r0, r0, #P_REST_FLAGS
542 orr REG_P_REST, REG_P_REST, r0
547 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
548 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
551 and r0, REG_P_REST, #P_REST_FLAGS
552 tst REG_NZ, #0x80 << 24
553 orrne r0, r0, #P_N_FLAG
555 orreq r0, r0, #P_Z_FLAG
556 orr r0, r0, #P_R_FLAG
567 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
568 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
577 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
578 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
580 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
585 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
586 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
590 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
595 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
600 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
605 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
610 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
615 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
620 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
623 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
624 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
626 @@@ TAX/TXA/TAY/TYA/TSX/TXS
628 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
631 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
635 mov REG_X, REG_A, lsr #24
636 mov REG_NZ, REG_A, asr #24
641 mov REG_A, REG_X, lsl #24
642 mov REG_NZ, REG_A, asr #24
647 mov REG_Y, REG_A, lsr #24
648 mov REG_NZ, REG_A, asr #24
653 mov REG_A, REG_Y, lsl #24
654 mov REG_NZ, REG_A, asr #24
659 mov REG_X, REG_S, lsr #24
660 orr REG_NZ, REG_X, REG_X, lsl #24
665 bic REG_S, REG_S, #0xFF << 24
666 orr REG_S, REG_S, REG_X, lsl #24
670 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
671 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
676 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
680 mov r0, REG_A, lsr #24
687 orr r0, r0, #P_B_FLAG
694 mov REG_A, r0, lsl #24
695 mov REG_NZ, REG_A, asr #24
704 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
705 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
715 mov REG_A, r0, lsl #24
716 mov REG_NZ, REG_A, asr #24
721 orr REG_NZ, r0, r0, lsl #24
868 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
869 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
879 mov r0, REG_A, lsr #24
973 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
974 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
976 @@@ INC/INX/INY/DEC/DEX/DEY
977 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
978 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
987 orr REG_NZ, r0, r0, lsl #24
992 and \reg, \reg, #0xFF
993 orr REG_NZ, \reg, \reg, lsl #24
999 orr REG_NZ, r0, r0, lsl #24
1004 and \reg, \reg, #0xFF
1005 orr REG_NZ, \reg, \reg, lsl #24
1033 opFE: @ INC $nnnn, X
1079 opDE: @ DEC $nnnn, X
1101 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1102 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1106 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1109 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1110 movs r1, REG_P_REST, lsr #1
1111 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1112 subcs r0, r0, #0x100
1113 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1114 adcs REG_A, REG_A, r0, ror #8
1115 mov REG_NZ, REG_A, asr #24
1116 adc REG_P_REST, r1, r1
1117 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1118 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1122 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1123 movs r1, REG_P_REST, lsr #1
1124 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1125 sbcs REG_A, REG_A, r0, lsl #24
1126 and REG_A, REG_A, #0xFF << 24
1127 mov REG_NZ, REG_A, asr #24
1128 adc REG_P_REST, r1, r1
1129 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1130 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1159 op7D: @ ADC $nnnn, X
1168 op79: @ ADC $nnnn, Y
1177 op61: @ ADC ($nn, X)
1186 op71: @ ADC ($nn), Y
1222 opFD: @ SBC $nnnn, X
1231 opF9: @ SBC $nnnn, Y
1240 opE1: @ SBC ($nn, X)
1249 opF1: @ SBC ($nn), Y
1259 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1260 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1264 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1270 and REG_A, REG_A, r0, lsl #24
1271 mov REG_NZ, REG_A, asr #24
1275 eor REG_A, REG_A, r0, lsl #24
1276 mov REG_NZ, REG_A, asr #24
1280 orr REG_A, REG_A, r0, lsl #24
1281 mov REG_NZ, REG_A, asr #24
1310 op3D: @ AND $nnnn, X
1319 op39: @ AND $nnnn, Y
1328 op21: @ AND ($nn, X)
1337 op31: @ AND ($nn), Y
1373 op5D: @ EOR $nnnn, X
1382 op59: @ EOR $nnnn, Y
1391 op41: @ EOR ($nn, X)
1400 op51: @ EOR ($nn), Y
1436 op1D: @ ORA $nnnn, X
1445 op19: @ ORA $nnnn, Y
1454 op01: @ ORA ($nn, X)
1463 op11: @ ORA ($nn), Y
1474 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1475 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1479 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1485 subs REG_NZ, REG_A, r0, lsl #24
1486 mov REG_NZ, REG_NZ, asr #24
1487 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1488 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1492 mov r1, \reg, lsl #24
1493 subs REG_NZ, r1, r0, lsl #24
1494 mov REG_NZ, REG_NZ, asr #24
1495 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1496 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1533 opDD: @ CMP $nnnn, X
1542 opD9: @ CMP $nnnn, Y
1551 opC1: @ CMP ($nn, X)
1560 opD1: @ CMP ($nn), Y
1612 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1613 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1617 @@@ Z <= A ¢Ê M == 0
1625 and REG_NZ, r0, REG_A, lsr #24
1626 @@ R0[7] => C, R0[6] => N
1627 movs r0, r0, lsl #25
1628 orrcs REG_NZ, REG_NZ, #0x80 << 24
1629 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1630 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1649 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1650 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1654 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1659 movs REG_NZ, r0, lsl #25
1660 mov r0, REG_NZ, lsr #24
1661 mov REG_NZ, REG_NZ, asr #24
1662 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1663 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1667 movs REG_A, REG_A, lsl #1
1668 mov REG_NZ, REG_A, asr #24
1669 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1670 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1677 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1678 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1683 movs REG_NZ, REG_A, lsr #25
1684 mov REG_A, REG_NZ, lsl #24
1685 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1686 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1719 op1E: @ ASL $nnnn, X
1761 op5E: @ LSR $nnnn, X
1773 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1774 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1784 movs r1, REG_P_REST, lsr #1
1787 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1788 orrs REG_NZ, r0, r0, lsl #24
1790 adc REG_P_REST, r1, r1
1795 movs r1, REG_P_REST, lsr #1
1796 orrcs REG_A, REG_A, #0x80 << 16
1797 movs REG_A, REG_A, lsl #1
1798 mov REG_NZ, REG_A, asr #24
1799 adc REG_P_REST, r1, r1
1803 movs r1, REG_P_REST, lsr #1
1804 orrcs r0, r0, #0x100
1806 orr REG_NZ, r0, r0, lsl #24
1807 adc REG_P_REST, r1, r1
1811 movs r1, REG_P_REST, lsr #1
1812 mov REG_NZ, REG_A, rrx
1813 movs REG_NZ, REG_NZ, asr #24
1814 mov REG_A, REG_NZ, lsl #24
1815 adc REG_P_REST, r1, r1
1849 op3E: @ ROL $nnnn, X
1891 op7E: @ ROR $nnnn, X
1903 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1904 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1906 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1913 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1915 mov r3, r1 @ preserve immediate
1919 @@ R1 <- (PC&0xFF)+ReadValue
1923 addne REG_CYCLE, REG_CYCLE, #1
1924 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1928 ldreqsb r1, [REG_PC], #1
1930 add REG_PC, REG_PC, r1
1931 addeq REG_CYCLE, REG_CYCLE, #1
1932 subeq REG_CYCLE, REG_CYCLE, #1*48<<16
1939 ldrnesb r1, [REG_PC], #1
1941 add REG_PC, REG_PC, r1
1942 addne REG_CYCLE, REG_CYCLE, #1
1943 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1950 tst REG_P_REST, #P_REST_C_FLAG
1957 tst REG_P_REST, #P_REST_C_FLAG
1973 tst REG_NZ, #0x80 << 24
1974 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1979 tst REG_NZ, #0x80 << 24
1985 tst REG_P_REST, #P_REST_V_FLAG
1992 tst REG_P_REST, #P_REST_V_FLAG
1998 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1999 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2004 mov REG_A, r0, lsl #24
2006 mov REG_NZ, REG_A, asr #24
2010 movs r0, r0, lsl #25
2012 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2013 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2017 mov REG_NZ, REG_A, asr #24
2018 @@restore value to write
2028 mov r0,REG_ADDR, lsr #8
2036 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2037 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2039 eor REG_A,REG_A,r0, lsl #24
2041 mov REG_NZ, REG_A, asr #24
2045 and r1,REG_X,REG_A, lsr #24
2047 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2048 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2050 orr REG_NZ, REG_X, REG_X, lsl #24
2060 movs r1, REG_P_REST, lsr #1
2063 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
2064 orrs REG_NZ, r0, r0, lsl #24
2066 adc REG_P_REST, r1, r1
2067 and REG_A,REG_A,r0,lsl #24
2071 movs r1, REG_P_REST, lsr #1
2072 orrcs r0, r0, #0x100
2076 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2077 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2107 op5F: @ SRE $nnnn, X
2118 op5B: @ SRE $nnnn, Y
2129 op43: @ SRE ($nn, X)
2140 op53: @ SRE ($nn), Y
2152 op9C: @ SHY $nnnn, X
2203 opFB: @ ISB $nnnn, Y
2216 opE3: @ ISB ($nn, X)
2229 opF3: @ ISB ($nn), Y
2263 opBF: @ LAX $nnnn, Y
2272 opA3: @ LAX ($nn, X)
2281 opB3: @ LAX ($nn), Y
2315 op1F: @ SLO $nnnn, X
2326 op1B: @ SLO $nnnn, Y
2337 op03: @ SLO ($nn, X)
2348 op13: @ SLO ($nn), Y
2393 opDF: @ DCP $nnnn, X
2406 opDB: @ DCP $nnnn, Y
2420 opC3: @ DCP ($nn, X)
2433 opD3: @ DCP ($nn), Y
2471 op3F: @ RLA $nnnn, X
2482 op3B: @ RLA $nnnn, Y
2493 op23: @ RLA ($nn, X)
2504 op33: @ RLA ($nn), Y
2544 op7F: @ RRA $nnnn, X
2557 op7B: @ RRA $nnnn, Y
2570 op63: @ RRA ($nn, X)
2583 op73: @ RRA ($nn), Y
2600 add REG_PC,REG_PC,#1
2604 add REG_PC,REG_PC,#2
2613 add REG_PC,REG_PC,#1
2624 op1C: @ NOP $nnnn, X
2630 add REG_PC,REG_PC,#2
2638 add REG_PC,REG_PC,#1
2643 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2644 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2654 and r0, REG_ADDR, #0xFF
2656 beq jmp_indirect_bug
2662 @@ BUG is : to not read word at REG_ADDR, because it loops
2663 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2667 and REG_ADDR, REG_ADDR, #0xff00
2669 orr r0, REG_PC, r0, lsl #8
2675 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2676 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2691 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2692 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2702 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2712 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2713 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2722 add REG_PC, REG_PC, #1
2723 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2726 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2729 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2730 mov REG_ADDR, #0x10000
2731 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2736 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2737 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2753 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2754 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2771 @@@ WARNING: decrements REG_PC
2774 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2775 sub REG_PC, REG_PC, #1
2778 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2781 tst REG_P_REST, #FCEU_IQNMI<<8
2782 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2783 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2784 mov REG_ADDR, #0x10000
2785 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2786 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2791 add REG_CYCLE, REG_CYCLE, #7
2792 subs REG_CYCLE, REG_CYCLE, #7*48<<16
2794 ldrb r0, [REG_PC], #1
2795 tst REG_P_REST, #0xff<<8
2796 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2798 tst REG_P_REST, #P_REST_I_FLAG
2799 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2809 stmfd r13!,{r4-r11,lr}
2811 ldr r0, =nes_registers
2816 @@REG_P_REST = 0, don't touch REG_S
2817 bic REG_P_REST, REG_P_REST, #0xff
2819 @ fceu: set MapIRQHook present flag
2820 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2822 orrne REG_P_REST, REG_P_REST, #1<<16
2823 biceq REG_P_REST, REG_P_REST, #1<<16
2825 @@ R bit is always 1
2826 orr REG_NZ, REG_NZ, #P_R_FLAG
2829 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2831 mov REG_ADDR, #0x10000
2832 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2836 ldr r0, =nes_registers
2839 ldmfd r13!,{r4-r11,lr}
2843 @@@ low-level memhandlers
2847 #ifndef DEBUG_ASM_6502
2851 orr r1, r1, r1, lsr #4
2852 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2856 mov r1, REG_ADDR, lsr #11
2857 ldr r2, [r2, r1, lsl #2]
2858 ldrb r0, [r2, REG_ADDR]
2866 @ must preserve r3 for the callers too
2867 @ TODO: check if all of saves are needed, _DB (is full needed?)
2868 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2869 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2870 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2872 mov REG_P_REST, r3 @ r8
2874 #ifndef DEBUG_ASM_6502
2876 bic r0, REG_ADDR, #0x00ff0000
2878 ldr pc, [r2, r0, lsl #2]
2880 ldr r2, =dread_count_a
2888 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2891 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2892 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2893 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2894 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2902 FLUSH_TIMESTAMP r2 @ Blaster Master, more...
2903 #ifndef DEBUG_ASM_6502
2904 @ must preserve r0 (data) and r3 for the callers
2905 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2906 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2907 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2909 mov REG_P_REST, r3 @ r8
2910 mov REG_CYCLE, r0 @ r11
2914 bic r0, REG_ADDR, #0x00ff0000
2916 ldr pc, [r2, r0, lsl #2]
2918 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2922 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2923 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2924 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2926 ldr r1, =dwrite_count_a
2930 orr r0, r0, REG_ADDR, lsl #8
2931 str r0, [r2, r1, lsl #2]
2932 ldr r2, =dwrite_count_a
2944 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2945 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2947 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2949 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2950 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2953 stmfd r13!,{r4-r11,lr}
2955 ldr r0, =nes_registers
2958 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2965 tst REG_P_REST, #1<<16
2966 blne do_irq_hook_noflushts
2968 ldr r0, =nes_registers
2971 ldmfd r13!,{r4-r11,lr}
2975 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2979 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2980 @ they must be in the same section
2986 .long op00, op01, op02, op03, op04, op05, op06, op07
2987 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2989 .long op10, op11, op12, op13, op14, op15, op16, op17
2990 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2992 .long op20, op21, op22, op23, op24, op25, op26, op27
2993 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2995 .long op30, op31, op32, op33, op34, op35, op36, op37
2996 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2998 .long op40, op41, op42, op43, op44, op45, op46, op47
2999 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
3001 .long op50, op51, op52, op53, op54, op55, op56, op57
3002 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
3004 .long op60, op61, op62, op63, op64, op65, op66, op67
3005 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
3007 .long op70, op71, op72, op73, op74, op75, op76, op77
3008 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
3010 .long op80, op81, op82, op83, op84, op85, op86, op87
3011 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
3013 .long op90, op91, op92, op93, op94, op95, op96, op97
3014 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
3016 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
3017 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
3019 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
3020 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
3022 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
3023 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
3025 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
3026 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
3028 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
3029 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
3031 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
3032 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
3035 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
3045 @ TODO: write code which keeps it up-to-date
3053 #ifndef DEBUG_ASM_6502
3056 X_: .fill 0x20, 1, 0
3065 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3066 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3068 @@@ Undefined Opcodes
3078 @opDF: @ DCP $nnnn, X
3079 @opDB: @ DCP $nnnn, Y
3080 @opC3: @ DCP ($nn, X)
3081 @opD3: @ DCP ($nn), Y
3088 @opFF: @ ISB $nnnn, X
3089 @opFB: @ ISB $nnnn, Y
3090 @opE3: @ ISB ($nn, X)
3091 @opF3: @ ISB ($nn), Y
3109 @opA3: @ LAX ($nn, X)
3113 @opBF: @ LAX $nnnn, Y
3115 @opB3: @ LAX ($nn), Y
3120 @op3F: @ RLA $nnnn, X
3121 @op23: @ RLA ($nn, X)
3125 @op7F: @ RRA $nnnn, X
3126 @op63: @ RRA ($nn, X)
3130 op83: @ SAX ($nn, X)
3132 op9F: @ SHA $nnnn, Y
3133 op93: @ SHA ($nn), Y
3134 op9B: @ SHS $nnnn, Y
3135 op9E: @ SHX $nnnn, Y
3136 @op03: @ SLO ($nn, X)
3140 @op1F: @ SLO $nnnn, X
3144 @op5F: @ SRE $nnnn, X
3145 @op5B: @ SRE $nnnn, Y
3146 @op43: @ SRE ($nn, X)
3152 @@@@@@@@@@@@@@@@@@@@@@@@@@
3154 @@@@@@@@@@@@@@@@@@@@@@@@@@
3165 .globl nes_registers @ TODO: hide?
3167 .globl MapIRQHook @ (int a)
3168 #ifndef DEBUG_ASM_6502
3173 .globl nes_internal_ram
3176 .globl X6502_Reset_a @ (void);
3177 .globl X6502_Power_a @ (void);
3178 .globl X6502_Run_a @ (int32 cycles);
3179 .globl TriggerIRQ_a @ (void);
3180 .globl TriggerNMI_a @ (void);
3181 .globl TriggerNMINSF_a @ (void);
3182 .globl X6502_AddCycles_a @ (int x);
3183 .globl X6502_IRQBegin_a @ (int w);
3184 .globl X6502_IRQEnd_a @ (int w);
3185 .globl X6502_Rebase_a @ (void);
3190 .equiv X6502_Reset_a, reset_cpu
3191 .equiv X6502_Run_a, cpu_exec
3198 ldr r1, =nes_registers
3203 bne X6502_Power_loop1
3204 ldr r0, =cpu_exec_table
3211 mov r0, #FCEU_IQTEMP
3214 ldr r2, =nes_registers
3216 ldr r1, [r2, #0x10] @ REG_P_REST
3217 orr r1, r1, r0, lsl #8
3223 ldr r2, =nes_registers
3226 bic r1, r1, r0, lsl #8
3242 ldr r2, =nes_registers
3243 ldrsh r1, [r2, #0x1e]
3244 mvn r3, #47 @ r3=-48
3246 strh r0, [r2, #0x1e]
3250 @ rebase PC when not executing or in memhandlers
3252 stmfd sp!,{REG_PC,REG_OP_TABLE}
3253 ldr REG_OP_TABLE, =cpu_exec_table
3254 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3255 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3258 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3259 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3264 @ the nasty MapIRQHook thing from FCE..
3265 @ test Gradius 2 (J) if you change this
3269 do_irq_hook_noflushts:
3270 #ifndef DEBUG_ASM_6502
3271 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3272 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3273 mov REG_P_REST, lr @ r8
3275 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3277 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3279 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
3281 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3283 ldr r1, =mapirq_cyc_a
3290 @ vim:filetype=armasm