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_IRQH_CYC (MapIRQHookCyc - cpu_exec_table)
20 #define OTOFFS_X (X_ - cpu_exec_table)
23 #define FCEU_IQNMI 0x08
24 #define FCEU_IQTEMP 0x80
27 @@@@@@@@@@@@@@@@@@@@@@@@@@
42 @@@ r0 = Address (unbased)
43 @@@ uses REG_OP_TABLE; sets REG_PC; trashes r1,r2; keeps r0
46 @ FIXME: do something with mem not in Page[].
47 @ stmfd sp!, {r0-r3,r12,lr}
51 @ ldmfd sp!, {r0-r3,r12,lr}
56 ldrge r2, [r1, r2, lsl #2]
58 addlt r1, REG_OP_TABLE, #OTOFFS_NES_RAM
60 str r2, [REG_OP_TABLE, #OTOFFS_PC_BASE]
66 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
67 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
71 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
72 @@@ ¤¿¤À¤·³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤¤
74 @@@ ¤Ê¤ó¤«Ì¾Á°¤¬ÊѤÀ¤Ê(¤É¡¼¤Ç¤â¤¤¡¼¤±¤É¡¼
76 .macro CYCLE_NEXT n, hook_check=1
79 subs REG_CYCLE, REG_CYCLE, #\n*48
82 tst REG_P_REST, #1<<16
86 tst REG_P_REST, #0xff<<8
87 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
89 @ do some messing to find out which IRQ is pending..
90 tst REG_P_REST, #FCEU_IQNMI<<8
92 tst REG_P_REST, #P_REST_I_FLAG
93 @@ if I_FLAG=1, continue execution, don't trigger IRQ
94 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
95 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
96 @@ I_FLAG=0 and REST is checked, we have a IRQ
101 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
102 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
106 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
107 @@@ CLI¡¦PHP¤Ê¤É¥Õ¥é¥°¤òÊѹ¹¤·¤¿¾ì¹ç¤Ï¤³¤ì
109 .macro CYCLE_NEXT_INT n
112 @ subs REG_CYCLE, REG_CYCLE, #\n*48
113 @ bgt cpu_exec_check_int
114 @ RETURN_FROM_CPU_EXEC
118 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
119 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
121 @@@ ¥¼¥í¥Ú¡¼¥¸¤«¤éÆɤà
124 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
125 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
129 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
140 ldrb REG_ADDR, [REG_ADDR, #1]
141 orr REG_ADDR, r0, REG_ADDR, lsl #8
144 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
145 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
149 .macro ZP_WRITE reg=r0
150 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
151 strb \reg, [REG_ADDR, REG_OP_TABLE]
155 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
162 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
163 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
165 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤
167 @@@ REG_ADDR => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
168 @@@ r0 => ½ñ¤¯¥Ð¥¤¥È(write)
169 @@@ r0 <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
173 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
176 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
178 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
180 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
183 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é¥í¡¼¥É¤Î¤ß
185 @@@ RAM¤«¤é¤Î¥í¡¼¥É¤¬°ìÈÖ¿¤¤¤Î¤ÇÍ¥À褹¤ë
195 movs r1, REG_ADDR, lsr #13
197 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
198 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
199 ldrne pc, [lr, -r1, lsl #2]
201 bic r0, REG_ADDR, #0x1800
202 add r0, r0, #OTOFFS_NES_RAM
203 ldrb r0, [r0, REG_OP_TABLE]
218 mov r1, REG_ADDR, lsr #13
220 ldr pc, [pc, r1, lsl #2]
231 bic r0, REG_ADDR, #0x1800
232 add r0, r0, #OTOFFS_NES_RAM
233 ldrb r0, [r0, REG_OP_TABLE]
234 @@ ¤È¤¤¤¦¤ï¤±¤Ç¥¸¥ã¥ó¥×¤¹¤ëɬÍפϤʤ¤
239 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
249 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
252 movs r3, REG_ADDR, lsr #13
254 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
255 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
256 ldrne pc, [lr, -r3, lsl #2]
258 bic REG_ADDR, REG_ADDR, #0x1800
259 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
260 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
269 ldr pc, [pc, r3, lsl #2]
291 READ_WRITE_W @ rmw first writes unmodified data
295 READ_WRITE_W @ and only then modified (Blaster Master)
299 @@@ ½ñ¤¹þ¤ß¤À¤±¤Î¾ì¹ç
310 movs r1, REG_ADDR, lsr #13
312 ldrne pc, [lr, -r1, lsl #2]
313 bic REG_ADDR, REG_ADDR, #0x1800
314 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
316 strb r0, [REG_ADDR, REG_OP_TABLE]
331 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
332 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
333 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
334 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
335 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
340 add REG_ADDR, REG_ADDR, #1
342 orr r0, REG_PC, r0, lsl #8
346 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
347 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
349 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
355 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
356 strb r0, [r1, REG_S, lsr #24]
357 sub REG_S, REG_S, #1 << 24
362 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
364 strb r2, [r1, REG_S, lsr #24]
365 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
366 sub REG_S, REG_S, #1 << 24
367 strb r0, [r1, REG_S, lsr #24]
368 sub REG_S, REG_S, #1 << 24
373 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
374 add REG_S, REG_S, #1 << 24
375 ldrb r0, [r0, REG_S, lsr #24]
380 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
381 add REG_S, REG_S, #1 << 24
382 ldrb r1, [r0, REG_S, lsr #24]
383 add REG_S, REG_S, #1 << 24
384 ldrb r0, [r0, REG_S, lsr #24]
385 orr r0, r1, r0, lsl #8
388 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
389 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
391 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
398 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
399 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
401 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
404 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
407 ldrb r0, [REG_PC], #1
410 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
413 ldrb REG_ADDR, [REG_PC], #1
416 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
420 add REG_ADDR, REG_ADDR, REG_X
421 and REG_ADDR, REG_ADDR, #0xFF
424 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
428 add REG_ADDR, REG_ADDR, REG_Y
429 and REG_ADDR, REG_ADDR, #0xFF
432 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
439 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
444 add REG_ADDR, REG_ADDR, REG_Y
445 bic REG_ADDR, REG_ADDR, #0x10000
446 and r0,REG_ADDR,#0xff
448 subgt REG_CYCLE,REG_CYCLE,#1*48
451 @ Indirect Indexed (for writes and rmws)
455 add REG_ADDR, REG_ADDR, REG_Y
456 bic REG_ADDR, REG_ADDR, #0x10000
460 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
461 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
463 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
466 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
471 ldrneb REG_ADDR, [REG_PC], #1
472 ldrneb r0, [REG_PC], #1
473 ldreqh REG_ADDR, [REG_PC], #2
474 orrne REG_ADDR, REG_ADDR, r0, lsl #8
477 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
481 add REG_ADDR, REG_ADDR, REG_X
482 bic REG_ADDR, REG_ADDR, #0x10000
483 and r0,REG_ADDR,#0xff
485 subgt REG_CYCLE,REG_CYCLE,#1*48
488 @ Absolute Indexed (for writes and rmws)
491 add REG_ADDR, REG_ADDR, REG_X
492 bic REG_ADDR, REG_ADDR, #0x10000
495 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
499 add REG_ADDR, REG_ADDR, REG_Y
500 bic REG_ADDR, REG_ADDR, #0x10000
501 and r0,REG_ADDR,#0xff
503 subgt REG_CYCLE,REG_CYCLE,#1*48
506 @ Absolute Indexed (for writes and rmws)
509 add REG_ADDR, REG_ADDR, REG_Y
510 bic REG_ADDR, REG_ADDR, #0x10000
513 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
516 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
517 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
518 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
524 orrne REG_NZ, REG_NZ, #0x80 << 24
526 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
527 and r0, r0, #P_REST_FLAGS
528 orr REG_P_REST, REG_P_REST, r0
533 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
534 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
537 and r0, REG_P_REST, #P_REST_FLAGS
538 tst REG_NZ, #0x80 << 24
539 orrne r0, r0, #P_N_FLAG
541 orreq r0, r0, #P_Z_FLAG
542 orr r0, r0, #P_R_FLAG
553 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
554 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
563 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
564 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
566 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
571 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
572 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
576 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
581 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
586 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
591 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
596 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
601 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
606 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
609 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
610 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
612 @@@ TAX/TXA/TAY/TYA/TSX/TXS
614 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
617 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
621 mov REG_X, REG_A, lsr #24
622 mov REG_NZ, REG_A, asr #24
627 mov REG_A, REG_X, lsl #24
628 mov REG_NZ, REG_A, asr #24
633 mov REG_Y, REG_A, lsr #24
634 mov REG_NZ, REG_A, asr #24
639 mov REG_A, REG_Y, lsl #24
640 mov REG_NZ, REG_A, asr #24
645 mov REG_X, REG_S, lsr #24
646 orr REG_NZ, REG_X, REG_X, lsl #24
651 bic REG_S, REG_S, #0xFF << 24
652 orr REG_S, REG_S, REG_X, lsl #24
656 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
657 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
662 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
666 mov r0, REG_A, lsr #24
673 orr r0, r0, #P_B_FLAG
680 mov REG_A, r0, lsl #24
681 mov REG_NZ, REG_A, asr #24
690 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
691 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
701 mov REG_A, r0, lsl #24
702 mov REG_NZ, REG_A, asr #24
707 orr REG_NZ, r0, r0, lsl #24
854 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
855 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
865 mov r0, REG_A, lsr #24
959 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
960 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
962 @@@ INC/INX/INY/DEC/DEX/DEY
963 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
964 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
973 orr REG_NZ, r0, r0, lsl #24
978 and \reg, \reg, #0xFF
979 orr REG_NZ, \reg, \reg, lsl #24
985 orr REG_NZ, r0, r0, lsl #24
990 and \reg, \reg, #0xFF
991 orr REG_NZ, \reg, \reg, lsl #24
1019 opFE: @ INC $nnnn, X
1065 opDE: @ DEC $nnnn, X
1087 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1088 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1092 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1095 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1096 movs r1, REG_P_REST, lsr #1
1097 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1098 subcs r0, r0, #0x100
1099 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1100 adcs REG_A, REG_A, r0, ror #8
1101 mov REG_NZ, REG_A, asr #24
1102 adc REG_P_REST, r1, r1
1103 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1104 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1108 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1109 movs r1, REG_P_REST, lsr #1
1110 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1111 sbcs REG_A, REG_A, r0, lsl #24
1112 and REG_A, REG_A, #0xFF << 24
1113 mov REG_NZ, REG_A, asr #24
1114 adc REG_P_REST, r1, r1
1115 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1116 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1145 op7D: @ ADC $nnnn, X
1154 op79: @ ADC $nnnn, Y
1163 op61: @ ADC ($nn, X)
1172 op71: @ ADC ($nn), Y
1208 opFD: @ SBC $nnnn, X
1217 opF9: @ SBC $nnnn, Y
1226 opE1: @ SBC ($nn, X)
1235 opF1: @ SBC ($nn), Y
1245 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1246 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1250 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1256 and REG_A, REG_A, r0, lsl #24
1257 mov REG_NZ, REG_A, asr #24
1261 eor REG_A, REG_A, r0, lsl #24
1262 mov REG_NZ, REG_A, asr #24
1266 orr REG_A, REG_A, r0, lsl #24
1267 mov REG_NZ, REG_A, asr #24
1296 op3D: @ AND $nnnn, X
1305 op39: @ AND $nnnn, Y
1314 op21: @ AND ($nn, X)
1323 op31: @ AND ($nn), Y
1359 op5D: @ EOR $nnnn, X
1368 op59: @ EOR $nnnn, Y
1377 op41: @ EOR ($nn, X)
1386 op51: @ EOR ($nn), Y
1422 op1D: @ ORA $nnnn, X
1431 op19: @ ORA $nnnn, Y
1440 op01: @ ORA ($nn, X)
1449 op11: @ ORA ($nn), Y
1460 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1461 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1465 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1471 subs REG_NZ, REG_A, 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
1478 mov r1, \reg, lsl #24
1479 subs REG_NZ, r1, r0, lsl #24
1480 mov REG_NZ, REG_NZ, asr #24
1481 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1482 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1519 opDD: @ CMP $nnnn, X
1528 opD9: @ CMP $nnnn, Y
1537 opC1: @ CMP ($nn, X)
1546 opD1: @ CMP ($nn), Y
1598 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1599 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1603 @@@ Z <= A ¢Ê M == 0
1611 and REG_NZ, r0, REG_A, lsr #24
1612 @@ R0[7] => C, R0[6] => N
1613 movs r0, r0, lsl #25
1614 orrcs REG_NZ, REG_NZ, #0x80 << 24
1615 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1616 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1635 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1636 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1640 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1645 movs REG_NZ, r0, lsl #25
1646 mov r0, REG_NZ, lsr #24
1647 mov REG_NZ, REG_NZ, asr #24
1648 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1649 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1653 movs REG_A, REG_A, lsl #1
1654 mov REG_NZ, REG_A, asr #24
1655 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1656 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1663 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1664 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1669 movs REG_NZ, REG_A, lsr #25
1670 mov REG_A, REG_NZ, lsl #24
1671 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1672 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1705 op1E: @ ASL $nnnn, X
1747 op5E: @ LSR $nnnn, X
1759 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1760 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1770 movs r1, REG_P_REST, lsr #1
1773 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1774 orrs REG_NZ, r0, r0, lsl #24
1776 adc REG_P_REST, r1, r1
1781 movs r1, REG_P_REST, lsr #1
1782 orrcs REG_A, REG_A, #0x80 << 16
1783 movs REG_A, REG_A, lsl #1
1784 mov REG_NZ, REG_A, asr #24
1785 adc REG_P_REST, r1, r1
1789 movs r1, REG_P_REST, lsr #1
1790 orrcs r0, r0, #0x100
1792 orr REG_NZ, r0, r0, lsl #24
1793 adc REG_P_REST, r1, r1
1797 movs r1, REG_P_REST, lsr #1
1798 mov REG_NZ, REG_A, rrx
1799 movs REG_NZ, REG_NZ, asr #24
1800 mov REG_A, REG_NZ, lsl #24
1801 adc REG_P_REST, r1, r1
1835 op3E: @ ROL $nnnn, X
1877 op7E: @ ROR $nnnn, X
1889 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1890 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1892 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1899 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1901 mov r3, r1 @ preserve immediate
1905 @@ R1 <- (PC&0xFF)+ReadValue
1909 subne REG_CYCLE,REG_CYCLE, #1*48
1913 ldreqsb r1, [REG_PC], #1
1915 add REG_PC, REG_PC, r1
1916 subeq REG_CYCLE, REG_CYCLE, #1*48
1923 ldrnesb r1, [REG_PC], #1
1925 add REG_PC, REG_PC, r1
1926 subne REG_CYCLE, REG_CYCLE, #1*48
1933 tst REG_P_REST, #P_REST_C_FLAG
1940 tst REG_P_REST, #P_REST_C_FLAG
1956 tst REG_NZ, #0x80 << 24
1957 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1962 tst REG_NZ, #0x80 << 24
1968 tst REG_P_REST, #P_REST_V_FLAG
1975 tst REG_P_REST, #P_REST_V_FLAG
1981 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1982 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1987 mov REG_A, r0, lsl #24
1989 mov REG_NZ, REG_A, asr #24
1993 movs r0, r0, lsl #25
1995 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1996 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2000 mov REG_NZ, REG_A, asr #24
2001 @@restore value to write
2011 mov r0,REG_ADDR, lsr #8
2019 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2020 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2022 eor REG_A,REG_A,r0, lsl #24
2024 mov REG_NZ, REG_A, asr #24
2028 and r1,REG_X,REG_A, lsr #24
2030 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2031 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2033 orr REG_NZ, REG_X, REG_X, lsl #24
2043 movs r1, REG_P_REST, lsr #1
2046 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
2047 orrs REG_NZ, r0, r0, lsl #24
2049 adc REG_P_REST, r1, r1
2050 and REG_A,REG_A,r0,lsl #24
2054 movs r1, REG_P_REST, lsr #1
2055 orrcs r0, r0, #0x100
2059 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2060 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2090 op5F: @ SRE $nnnn, X
2101 op5B: @ SRE $nnnn, Y
2112 op43: @ SRE ($nn, X)
2123 op53: @ SRE ($nn), Y
2135 op9C: @ SHY $nnnn, X
2186 opFB: @ ISB $nnnn, Y
2199 opE3: @ ISB ($nn, X)
2212 opF3: @ ISB ($nn), Y
2246 opBF: @ LAX $nnnn, Y
2255 opA3: @ LAX ($nn, X)
2264 opB3: @ LAX ($nn), Y
2298 op1F: @ SLO $nnnn, X
2309 op1B: @ SLO $nnnn, Y
2320 op03: @ SLO ($nn, X)
2331 op13: @ SLO ($nn), Y
2376 opDF: @ DCP $nnnn, X
2389 opDB: @ DCP $nnnn, Y
2403 opC3: @ DCP ($nn, X)
2416 opD3: @ DCP ($nn), Y
2454 op3F: @ RLA $nnnn, X
2465 op3B: @ RLA $nnnn, Y
2476 op23: @ RLA ($nn, X)
2487 op33: @ RLA ($nn), Y
2527 op7F: @ RRA $nnnn, X
2540 op7B: @ RRA $nnnn, Y
2553 op63: @ RRA ($nn, X)
2566 op73: @ RRA ($nn), Y
2583 add REG_PC,REG_PC,#1
2587 add REG_PC,REG_PC,#2
2596 add REG_PC,REG_PC,#1
2607 op1C: @ NOP $nnnn, X
2613 add REG_PC,REG_PC,#2
2621 add REG_PC,REG_PC,#1
2626 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2627 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2637 and r0, REG_ADDR, #0xFF
2639 beq jmp_indirect_bug
2645 @@ BUG is : to not read word at REG_ADDR, because it loops
2646 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2650 and REG_ADDR, REG_ADDR, #0xff00
2652 orr r0, REG_PC, r0, lsl #8
2658 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2659 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2674 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2675 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2685 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2695 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2696 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2705 add REG_PC, REG_PC, #1
2706 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2709 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2712 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2713 mov REG_ADDR, #0x10000
2714 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2719 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2720 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2736 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2737 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2754 @@@ WARNING: decrements REG_PC
2757 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2758 sub REG_PC, REG_PC, #1
2761 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2764 tst REG_P_REST, #FCEU_IQNMI<<8
2765 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2766 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2767 mov REG_ADDR, #0x10000
2768 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2769 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2774 subs REG_CYCLE, REG_CYCLE, #7*48
2776 ldrb r0, [REG_PC], #1
2777 tst REG_P_REST, #0xff<<8
2778 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2780 tst REG_P_REST, #P_REST_I_FLAG
2781 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2791 stmfd r13!,{r4-r11,lr}
2793 ldr r0, =nes_registers
2798 @@REG_P_REST = 0, don't touch REG_S
2799 bic REG_P_REST, REG_P_REST, #0xff
2801 @ fceu: set MapIRQHook present flag
2802 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2804 orrne REG_P_REST, REG_P_REST, #1<<16
2805 biceq REG_P_REST, REG_P_REST, #1<<16
2807 @@ R bit is always 1
2808 orr REG_NZ, REG_NZ, #P_R_FLAG
2811 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2813 mov REG_ADDR, #0x10000
2814 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2818 ldr r0, =nes_registers
2821 ldmfd r13!,{r4-r11,lr}
2825 @@@ low-level memhandlers
2829 #ifndef DEBUG_ASM_6502
2833 orr r1, r1, r1, lsr #4
2834 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2838 mov r1, REG_ADDR, lsr #11
2839 ldr r2, [r2, r1, lsl #2]
2840 ldrb r0, [r2, REG_ADDR]
2848 @ must preserve r3 for the callers too
2849 @ TODO: check if all of saves are needed, _DB (is full needed?)
2850 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2851 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2852 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2854 mov REG_P_REST, r3 @ r8
2856 #ifndef DEBUG_ASM_6502
2858 bic r0, REG_ADDR, #0x00ff0000
2860 ldr pc, [r2, r0, lsl #2]
2862 ldr r2, =dread_count_a
2870 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2873 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2874 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2875 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2876 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2884 #ifndef DEBUG_ASM_6502
2885 @ must preserve r0 (data) and r3 for the callers
2886 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2887 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2888 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2890 mov REG_P_REST, r3 @ r8
2891 mov REG_CYCLE, r0 @ r11
2895 bic r0, REG_ADDR, #0x00ff0000
2897 ldr pc, [r2, r0, lsl #2]
2899 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2903 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2904 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2905 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2907 ldr r1, =dwrite_count_a
2911 orr r0, r0, REG_ADDR, lsl #8
2912 str r0, [r2, r1, lsl #2]
2913 ldr r2, =dwrite_count_a
2924 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2925 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2927 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2929 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2930 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2933 stmfd r13!,{r4-r11,lr}
2935 ldr r0, =nes_registers
2938 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2940 tst REG_P_REST, #1<<16
2941 strne REG_CYCLE, [REG_OP_TABLE, #OTOFFS_IRQH_CYC]
2946 tst REG_P_REST, #1<<16
2949 ldr r0, =nes_registers
2952 ldmfd r13!,{r4-r11,lr}
2956 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2960 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2961 @ they must be in the same section
2967 .long op00, op01, op02, op03, op04, op05, op06, op07
2968 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2970 .long op10, op11, op12, op13, op14, op15, op16, op17
2971 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2973 .long op20, op21, op22, op23, op24, op25, op26, op27
2974 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2976 .long op30, op31, op32, op33, op34, op35, op36, op37
2977 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2979 .long op40, op41, op42, op43, op44, op45, op46, op47
2980 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2982 .long op50, op51, op52, op53, op54, op55, op56, op57
2983 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2985 .long op60, op61, op62, op63, op64, op65, op66, op67
2986 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2988 .long op70, op71, op72, op73, op74, op75, op76, op77
2989 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2991 .long op80, op81, op82, op83, op84, op85, op86, op87
2992 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2994 .long op90, op91, op92, op93, op94, op95, op96, op97
2995 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2997 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2998 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
3000 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
3001 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
3003 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
3004 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
3006 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
3007 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
3009 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
3010 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
3012 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
3013 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
3016 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
3026 @ TODO: write code which keeps it up-to-date
3035 #ifndef DEBUG_ASM_6502
3038 X_: .fill 0x20, 1, 0
3047 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3048 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3050 @@@ Undefined Opcodes
3060 @opDF: @ DCP $nnnn, X
3061 @opDB: @ DCP $nnnn, Y
3062 @opC3: @ DCP ($nn, X)
3063 @opD3: @ DCP ($nn), Y
3070 @opFF: @ ISB $nnnn, X
3071 @opFB: @ ISB $nnnn, Y
3072 @opE3: @ ISB ($nn, X)
3073 @opF3: @ ISB ($nn), Y
3091 @opA3: @ LAX ($nn, X)
3095 @opBF: @ LAX $nnnn, Y
3097 @opB3: @ LAX ($nn), Y
3102 @op3F: @ RLA $nnnn, X
3103 @op23: @ RLA ($nn, X)
3107 @op7F: @ RRA $nnnn, X
3108 @op63: @ RRA ($nn, X)
3112 op83: @ SAX ($nn, X)
3114 op9F: @ SHA $nnnn, Y
3115 op93: @ SHA ($nn), Y
3116 op9B: @ SHS $nnnn, Y
3117 op9E: @ SHX $nnnn, Y
3118 @op03: @ SLO ($nn, X)
3122 @op1F: @ SLO $nnnn, X
3126 @op5F: @ SRE $nnnn, X
3127 @op5B: @ SRE $nnnn, Y
3128 @op43: @ SRE ($nn, X)
3134 @@@@@@@@@@@@@@@@@@@@@@@@@@
3136 @@@@@@@@@@@@@@@@@@@@@@@@@@
3147 .globl nes_registers @ TODO: hide?
3149 .globl MapIRQHook @ (int a)
3150 #ifndef DEBUG_ASM_6502
3155 .globl nes_internal_ram
3157 .globl X6502_Reset_a @ (void);
3158 .globl X6502_Power_a @ (void);
3159 .globl X6502_Run_a @ (int32 cycles);
3160 .globl TriggerIRQ_a @ (void);
3161 .globl TriggerNMI_a @ (void);
3162 .globl TriggerNMINSF_a @ (void);
3163 .globl X6502_AddCycles_a @ (int x);
3164 .globl X6502_IRQBegin_a @ (int w);
3165 .globl X6502_IRQEnd_a @ (int w);
3166 .globl X6502_Rebase_a @ (void);
3171 .equiv X6502_Reset_a, reset_cpu
3172 .equiv X6502_Run_a, cpu_exec
3179 ldr r1, =nes_registers
3184 bne X6502_Power_loop1
3185 ldr r0, =cpu_exec_table
3192 mov r0, #FCEU_IQTEMP
3195 ldr r2, =nes_registers
3197 ldr r1, [r2, #0x10] @ REG_P_REST
3198 orr r1, r1, r0, lsl #8
3204 ldr r2, =nes_registers
3207 bic r1, r1, r0, lsl #8
3223 ldr r2, =nes_registers
3225 mvn r3, #47 @ r3=-48
3231 @ rebase PC when not executing or in memhandlers
3233 stmfd sp!,{REG_PC,REG_OP_TABLE}
3234 ldr REG_OP_TABLE, =cpu_exec_table
3235 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3236 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3239 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3240 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3245 @ the nasty MapIRQHook thing from FCE..
3246 @ test Gradius 2 (J) if you change this
3248 @ ((cycles >> 4) * 43) >> 7; // aproximating /= 48
3249 ldr r1, [REG_OP_TABLE, #OTOFFS_IRQH_CYC]
3250 str REG_CYCLE, [REG_OP_TABLE, #OTOFFS_IRQH_CYC]
3252 sub r1, r1, REG_CYCLE
3256 #ifndef DEBUG_ASM_6502
3257 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3258 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3259 mov REG_P_REST, lr @ r8
3261 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3263 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3265 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
3267 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3269 ldr r1, =mapirq_cyc_a
3276 @ vim:filetype=armasm