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]!
280 ldr pc, [pc, r3, lsl #2]
294 @@@ ½ñ¤¹þ¤ß¤À¤±¤Î¾ì¹ç
305 movs r1, REG_ADDR, lsr #13
307 ldrne pc, [lr, -r1, lsl #2]
308 bic REG_ADDR, REG_ADDR, #0x1800
309 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
311 strb r0, [REG_ADDR, REG_OP_TABLE]
326 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
327 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
328 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
329 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
330 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
335 add REG_ADDR, REG_ADDR, #1
337 orr r0, REG_PC, r0, lsl #8
341 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
342 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
344 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
350 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
351 strb r0, [r1, REG_S, lsr #24]
352 sub REG_S, REG_S, #1 << 24
357 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
359 strb r2, [r1, REG_S, lsr #24]
360 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
361 sub REG_S, REG_S, #1 << 24
362 strb r0, [r1, REG_S, lsr #24]
363 sub REG_S, REG_S, #1 << 24
368 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
369 add REG_S, REG_S, #1 << 24
370 ldrb r0, [r0, REG_S, lsr #24]
375 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
376 add REG_S, REG_S, #1 << 24
377 ldrb r1, [r0, REG_S, lsr #24]
378 add REG_S, REG_S, #1 << 24
379 ldrb r0, [r0, REG_S, lsr #24]
380 orr r0, r1, r0, lsl #8
383 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
384 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
386 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
393 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
394 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
396 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
399 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
402 ldrb r0, [REG_PC], #1
405 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
408 ldrb REG_ADDR, [REG_PC], #1
411 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
415 add REG_ADDR, REG_ADDR, REG_X
416 and REG_ADDR, REG_ADDR, #0xFF
419 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
423 add REG_ADDR, REG_ADDR, REG_Y
424 and REG_ADDR, REG_ADDR, #0xFF
427 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
434 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
439 add REG_ADDR, REG_ADDR, REG_Y
440 bic REG_ADDR, REG_ADDR, #0x10000
441 and r0,REG_ADDR,#0xff
443 subgt REG_CYCLE,REG_CYCLE,#1*48
446 @ Indirect Indexed (for writes and rmws)
450 add REG_ADDR, REG_ADDR, REG_Y
451 bic REG_ADDR, REG_ADDR, #0x10000
455 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
456 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
458 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
461 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
466 ldrneb REG_ADDR, [REG_PC], #1
467 ldrneb r0, [REG_PC], #1
468 ldreqh REG_ADDR, [REG_PC], #2
469 orrne REG_ADDR, REG_ADDR, r0, lsl #8
472 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
476 add REG_ADDR, REG_ADDR, REG_X
477 bic REG_ADDR, REG_ADDR, #0x10000
478 and r0,REG_ADDR,#0xff
480 subgt REG_CYCLE,REG_CYCLE,#1*48
483 @ Absolute Indexed (for writes and rmws)
486 add REG_ADDR, REG_ADDR, REG_X
487 bic REG_ADDR, REG_ADDR, #0x10000
490 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
494 add REG_ADDR, REG_ADDR, REG_Y
495 bic REG_ADDR, REG_ADDR, #0x10000
496 and r0,REG_ADDR,#0xff
498 subgt REG_CYCLE,REG_CYCLE,#1*48
501 @ Absolute Indexed (for writes and rmws)
504 add REG_ADDR, REG_ADDR, REG_Y
505 bic REG_ADDR, REG_ADDR, #0x10000
508 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
511 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
512 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
513 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
519 orrne REG_NZ, REG_NZ, #0x80 << 24
521 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
522 and r0, r0, #P_REST_FLAGS
523 orr REG_P_REST, REG_P_REST, r0
528 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
529 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
532 and r0, REG_P_REST, #P_REST_FLAGS
533 tst REG_NZ, #0x80 << 24
534 orrne r0, r0, #P_N_FLAG
536 orreq r0, r0, #P_Z_FLAG
537 orr r0, r0, #P_R_FLAG
548 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
549 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
558 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
559 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
561 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
566 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
567 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
571 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
576 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
581 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
586 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
591 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
596 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
601 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
604 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
605 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
607 @@@ TAX/TXA/TAY/TYA/TSX/TXS
609 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
612 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
616 mov REG_X, REG_A, lsr #24
617 mov REG_NZ, REG_A, asr #24
622 mov REG_A, REG_X, lsl #24
623 mov REG_NZ, REG_A, asr #24
628 mov REG_Y, REG_A, lsr #24
629 mov REG_NZ, REG_A, asr #24
634 mov REG_A, REG_Y, lsl #24
635 mov REG_NZ, REG_A, asr #24
640 mov REG_X, REG_S, lsr #24
641 orr REG_NZ, REG_X, REG_X, lsl #24
646 bic REG_S, REG_S, #0xFF << 24
647 orr REG_S, REG_S, REG_X, lsl #24
651 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
652 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
657 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
661 mov r0, REG_A, lsr #24
668 orr r0, r0, #P_B_FLAG
675 mov REG_A, r0, lsl #24
676 mov REG_NZ, REG_A, asr #24
685 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
686 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
696 mov REG_A, r0, lsl #24
697 mov REG_NZ, REG_A, asr #24
702 orr REG_NZ, r0, r0, lsl #24
849 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
850 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
860 mov r0, REG_A, lsr #24
954 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
955 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
957 @@@ INC/INX/INY/DEC/DEX/DEY
958 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
959 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
968 orr REG_NZ, r0, r0, lsl #24
973 and \reg, \reg, #0xFF
974 orr REG_NZ, \reg, \reg, lsl #24
980 orr REG_NZ, r0, r0, lsl #24
985 and \reg, \reg, #0xFF
986 orr REG_NZ, \reg, \reg, lsl #24
1014 opFE: @ INC $nnnn, X
1060 opDE: @ DEC $nnnn, X
1082 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1083 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1087 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1090 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1091 movs r1, REG_P_REST, lsr #1
1092 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1093 subcs r0, r0, #0x100
1094 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1095 adcs REG_A, REG_A, r0, ror #8
1096 mov REG_NZ, REG_A, asr #24
1097 adc REG_P_REST, r1, r1
1098 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1099 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1103 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1104 movs r1, REG_P_REST, lsr #1
1105 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1106 sbcs REG_A, REG_A, r0, lsl #24
1107 and REG_A, REG_A, #0xFF << 24
1108 mov REG_NZ, REG_A, asr #24
1109 adc REG_P_REST, r1, r1
1110 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1111 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1140 op7D: @ ADC $nnnn, X
1149 op79: @ ADC $nnnn, Y
1158 op61: @ ADC ($nn, X)
1167 op71: @ ADC ($nn), Y
1203 opFD: @ SBC $nnnn, X
1212 opF9: @ SBC $nnnn, Y
1221 opE1: @ SBC ($nn, X)
1230 opF1: @ SBC ($nn), Y
1240 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1241 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1245 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1251 and REG_A, REG_A, r0, lsl #24
1252 mov REG_NZ, REG_A, asr #24
1256 eor REG_A, REG_A, r0, lsl #24
1257 mov REG_NZ, REG_A, asr #24
1261 orr REG_A, REG_A, r0, lsl #24
1262 mov REG_NZ, REG_A, asr #24
1291 op3D: @ AND $nnnn, X
1300 op39: @ AND $nnnn, Y
1309 op21: @ AND ($nn, X)
1318 op31: @ AND ($nn), Y
1354 op5D: @ EOR $nnnn, X
1363 op59: @ EOR $nnnn, Y
1372 op41: @ EOR ($nn, X)
1381 op51: @ EOR ($nn), Y
1417 op1D: @ ORA $nnnn, X
1426 op19: @ ORA $nnnn, Y
1435 op01: @ ORA ($nn, X)
1444 op11: @ ORA ($nn), Y
1455 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1456 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1460 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1466 subs REG_NZ, REG_A, r0, lsl #24
1467 mov REG_NZ, REG_NZ, asr #24
1468 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1469 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1473 mov r1, \reg, lsl #24
1474 subs REG_NZ, r1, r0, lsl #24
1475 mov REG_NZ, REG_NZ, asr #24
1476 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1477 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1514 opDD: @ CMP $nnnn, X
1523 opD9: @ CMP $nnnn, Y
1532 opC1: @ CMP ($nn, X)
1541 opD1: @ CMP ($nn), Y
1593 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1594 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1598 @@@ Z <= A ¢Ê M == 0
1606 and REG_NZ, r0, REG_A, lsr #24
1607 @@ R0[7] => C, R0[6] => N
1608 movs r0, r0, lsl #25
1609 orrcs REG_NZ, REG_NZ, #0x80 << 24
1610 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1611 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1630 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1631 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1635 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1640 movs REG_NZ, r0, lsl #25
1641 mov r0, REG_NZ, lsr #24
1642 mov REG_NZ, REG_NZ, asr #24
1643 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1644 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1648 movs REG_A, REG_A, lsl #1
1649 mov REG_NZ, REG_A, asr #24
1650 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1651 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1658 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1659 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1664 movs REG_NZ, REG_A, lsr #25
1665 mov REG_A, REG_NZ, lsl #24
1666 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1667 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1700 op1E: @ ASL $nnnn, X
1742 op5E: @ LSR $nnnn, X
1754 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1755 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1765 movs r1, REG_P_REST, lsr #1
1768 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1769 orrs REG_NZ, r0, r0, lsl #24
1771 adc REG_P_REST, r1, r1
1776 movs r1, REG_P_REST, lsr #1
1777 orrcs REG_A, REG_A, #0x80 << 16
1778 movs REG_A, REG_A, lsl #1
1779 mov REG_NZ, REG_A, asr #24
1780 adc REG_P_REST, r1, r1
1784 movs r1, REG_P_REST, lsr #1
1785 orrcs r0, r0, #0x100
1787 orr REG_NZ, r0, r0, lsl #24
1788 adc REG_P_REST, r1, r1
1792 movs r1, REG_P_REST, lsr #1
1793 mov REG_NZ, REG_A, rrx
1794 movs REG_NZ, REG_NZ, asr #24
1795 mov REG_A, REG_NZ, lsl #24
1796 adc REG_P_REST, r1, r1
1830 op3E: @ ROL $nnnn, X
1872 op7E: @ ROR $nnnn, X
1884 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1885 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1887 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1894 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1896 mov r3, r1 @ preserve immediate
1900 @@ R1 <- (PC&0xFF)+ReadValue
1904 subne REG_CYCLE,REG_CYCLE, #1*48
1908 ldreqsb r1, [REG_PC], #1
1910 add REG_PC, REG_PC, r1
1911 subeq REG_CYCLE, REG_CYCLE, #1*48
1918 ldrnesb r1, [REG_PC], #1
1920 add REG_PC, REG_PC, r1
1921 subne REG_CYCLE, REG_CYCLE, #1*48
1928 tst REG_P_REST, #P_REST_C_FLAG
1935 tst REG_P_REST, #P_REST_C_FLAG
1951 tst REG_NZ, #0x80 << 24
1952 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1957 tst REG_NZ, #0x80 << 24
1963 tst REG_P_REST, #P_REST_V_FLAG
1970 tst REG_P_REST, #P_REST_V_FLAG
1976 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1977 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1982 mov REG_A, r0, lsl #24
1984 mov REG_NZ, REG_A, asr #24
1988 movs r0, r0, lsl #25
1990 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1991 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1995 mov REG_NZ, REG_A, asr #24
1996 @@restore value to write
2006 mov r0,REG_ADDR, lsr #8
2014 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2015 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2017 eor REG_A,REG_A,r0, lsl #24
2019 mov REG_NZ, REG_A, asr #24
2023 and r1,REG_X,REG_A, lsr #24
2025 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2026 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2028 orr REG_NZ, REG_X, REG_X, lsl #24
2038 movs r1, REG_P_REST, lsr #1
2041 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
2042 orrs REG_NZ, r0, r0, lsl #24
2044 adc REG_P_REST, r1, r1
2045 and REG_A,REG_A,r0,lsl #24
2049 movs r1, REG_P_REST, lsr #1
2050 orrcs r0, r0, #0x100
2054 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2055 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2085 op5F: @ SRE $nnnn, X
2096 op5B: @ SRE $nnnn, Y
2107 op43: @ SRE ($nn, X)
2118 op53: @ SRE ($nn), Y
2130 op9C: @ SHY $nnnn, X
2181 opFB: @ ISB $nnnn, Y
2194 opE3: @ ISB ($nn, X)
2207 opF3: @ ISB ($nn), Y
2241 opBF: @ LAX $nnnn, Y
2250 opA3: @ LAX ($nn, X)
2259 opB3: @ LAX ($nn), Y
2293 op1F: @ SLO $nnnn, X
2304 op1B: @ SLO $nnnn, Y
2315 op03: @ SLO ($nn, X)
2326 op13: @ SLO ($nn), Y
2371 opDF: @ DCP $nnnn, X
2384 opDB: @ DCP $nnnn, Y
2398 opC3: @ DCP ($nn, X)
2411 opD3: @ DCP ($nn), Y
2449 op3F: @ RLA $nnnn, X
2460 op3B: @ RLA $nnnn, Y
2471 op23: @ RLA ($nn, X)
2482 op33: @ RLA ($nn), Y
2522 op7F: @ RRA $nnnn, X
2535 op7B: @ RRA $nnnn, Y
2548 op63: @ RRA ($nn, X)
2561 op73: @ RRA ($nn), Y
2578 add REG_PC,REG_PC,#1
2582 add REG_PC,REG_PC,#2
2591 add REG_PC,REG_PC,#1
2602 op1C: @ NOP $nnnn, X
2608 add REG_PC,REG_PC,#2
2616 add REG_PC,REG_PC,#1
2621 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2622 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2632 and r0, REG_ADDR, #0xFF
2634 beq jmp_indirect_bug
2640 @@ BUG is : to not read word at REG_ADDR, because it loops
2641 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2645 and REG_ADDR, REG_ADDR, #0xff00
2647 orr r0, REG_PC, r0, lsl #8
2653 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2654 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2669 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2670 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2680 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2690 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2691 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2700 add REG_PC, REG_PC, #1
2701 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2704 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2707 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2708 mov REG_ADDR, #0x10000
2709 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2714 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2715 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2731 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2732 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2749 @@@ WARNING: decrements REG_PC
2752 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2753 sub REG_PC, REG_PC, #1
2756 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2759 tst REG_P_REST, #FCEU_IQNMI<<8
2760 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2761 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2762 mov REG_ADDR, #0x10000
2763 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2764 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2769 subs REG_CYCLE, REG_CYCLE, #7*48
2771 ldrb r0, [REG_PC], #1
2772 tst REG_P_REST, #0xff<<8
2773 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2775 tst REG_P_REST, #P_REST_I_FLAG
2776 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2786 stmfd r13!,{r4-r11,lr}
2788 ldr r0, =nes_registers
2793 @@REG_P_REST = 0, don't touch REG_S
2794 bic REG_P_REST, REG_P_REST, #0xff
2796 @ fceu: set MapIRQHook present flag
2797 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2799 orrne REG_P_REST, REG_P_REST, #1<<16
2800 biceq REG_P_REST, REG_P_REST, #1<<16
2802 @@ R bit is always 1
2803 orr REG_NZ, REG_NZ, #P_R_FLAG
2806 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2808 mov REG_ADDR, #0x10000
2809 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2813 ldr r0, =nes_registers
2816 ldmfd r13!,{r4-r11,lr}
2820 @@@ low-level memhandlers
2824 #ifndef DEBUG_ASM_6502
2828 orr r1, r1, r1, lsr #4
2829 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2833 mov r1, REG_ADDR, lsr #11
2834 ldr r2, [r2, r1, lsl #2]
2835 ldrb r0, [r2, REG_ADDR]
2843 @ must preserve r3 for the callers too
2844 @ TODO: check if all of saves are needed, _DB (is full needed?)
2845 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2846 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2847 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2849 mov REG_P_REST, r3 @ r8
2851 #ifndef DEBUG_ASM_6502
2853 bic r0, REG_ADDR, #0x00ff0000
2855 ldr pc, [r2, r0, lsl #2]
2857 ldr r2, =dread_count_a
2865 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2868 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2869 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2870 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2871 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2879 #ifndef DEBUG_ASM_6502
2880 @ must preserve r3 for the callers too
2881 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2882 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2883 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2885 mov REG_P_REST, r3 @ r8
2889 bic r0, REG_ADDR, #0x00ff0000
2891 ldr pc, [r2, r0, lsl #2]
2893 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2896 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2897 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2898 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2900 ldr r1, =dwrite_count_a
2904 orr r0, r0, REG_ADDR, lsl #8
2905 str r0, [r2, r1, lsl #2]
2906 ldr r2, =dwrite_count_a
2917 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2918 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2920 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2922 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2923 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2926 stmfd r13!,{r4-r11,lr}
2928 ldr r0, =nes_registers
2931 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2933 tst REG_P_REST, #1<<16
2934 strne REG_CYCLE, [REG_OP_TABLE, #OTOFFS_IRQH_CYC]
2939 tst REG_P_REST, #1<<16
2942 ldr r0, =nes_registers
2945 ldmfd r13!,{r4-r11,lr}
2949 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2953 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2954 @ they must be in the same section
2960 .long op00, op01, op02, op03, op04, op05, op06, op07
2961 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2963 .long op10, op11, op12, op13, op14, op15, op16, op17
2964 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2966 .long op20, op21, op22, op23, op24, op25, op26, op27
2967 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2969 .long op30, op31, op32, op33, op34, op35, op36, op37
2970 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2972 .long op40, op41, op42, op43, op44, op45, op46, op47
2973 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2975 .long op50, op51, op52, op53, op54, op55, op56, op57
2976 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2978 .long op60, op61, op62, op63, op64, op65, op66, op67
2979 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2981 .long op70, op71, op72, op73, op74, op75, op76, op77
2982 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2984 .long op80, op81, op82, op83, op84, op85, op86, op87
2985 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2987 .long op90, op91, op92, op93, op94, op95, op96, op97
2988 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2990 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2991 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
2993 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
2994 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
2996 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
2997 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
2999 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
3000 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
3002 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
3003 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
3005 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
3006 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
3009 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
3019 @ TODO: write code which keeps it up-to-date
3028 #ifndef DEBUG_ASM_6502
3031 X_: .fill 0x20, 1, 0
3040 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3041 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3043 @@@ Undefined Opcodes
3053 @opDF: @ DCP $nnnn, X
3054 @opDB: @ DCP $nnnn, Y
3055 @opC3: @ DCP ($nn, X)
3056 @opD3: @ DCP ($nn), Y
3063 @opFF: @ ISB $nnnn, X
3064 @opFB: @ ISB $nnnn, Y
3065 @opE3: @ ISB ($nn, X)
3066 @opF3: @ ISB ($nn), Y
3084 @opA3: @ LAX ($nn, X)
3088 @opBF: @ LAX $nnnn, Y
3090 @opB3: @ LAX ($nn), Y
3095 @op3F: @ RLA $nnnn, X
3096 @op23: @ RLA ($nn, X)
3100 @op7F: @ RRA $nnnn, X
3101 @op63: @ RRA ($nn, X)
3105 op83: @ SAX ($nn, X)
3107 op9F: @ SHA $nnnn, Y
3108 op93: @ SHA ($nn), Y
3109 op9B: @ SHS $nnnn, Y
3110 op9E: @ SHX $nnnn, Y
3111 @op03: @ SLO ($nn, X)
3115 @op1F: @ SLO $nnnn, X
3119 @op5F: @ SRE $nnnn, X
3120 @op5B: @ SRE $nnnn, Y
3121 @op43: @ SRE ($nn, X)
3127 @@@@@@@@@@@@@@@@@@@@@@@@@@
3129 @@@@@@@@@@@@@@@@@@@@@@@@@@
3140 .globl nes_registers @ TODO: hide?
3142 .globl MapIRQHook @ (int a)
3143 #ifndef DEBUG_ASM_6502
3148 .globl nes_internal_ram
3150 .globl X6502_Reset_a @ (void);
3151 .globl X6502_Power_a @ (void);
3152 .globl X6502_Run_a @ (int32 cycles);
3153 .globl TriggerIRQ_a @ (void);
3154 .globl TriggerNMI_a @ (void);
3155 .globl TriggerNMINSF_a @ (void);
3156 .globl X6502_AddCycles_a @ (int x);
3157 .globl X6502_IRQBegin_a @ (int w);
3158 .globl X6502_IRQEnd_a @ (int w);
3159 .globl X6502_Rebase_a @ (void);
3164 .equiv X6502_Reset_a, reset_cpu
3165 .equiv X6502_Run_a, cpu_exec
3172 ldr r1, =nes_registers
3177 bne X6502_Power_loop1
3178 ldr r0, =cpu_exec_table
3185 mov r0, #FCEU_IQTEMP
3188 ldr r2, =nes_registers
3190 ldr r1, [r2, #0x10] @ REG_P_REST
3191 orr r1, r1, r0, lsl #8
3197 ldr r2, =nes_registers
3200 bic r1, r1, r0, lsl #8
3216 ldr r2, =nes_registers
3218 mvn r3, #47 @ r3=-48
3224 @ rebase PC when not executing or in memhandlers
3226 stmfd sp!,{REG_PC,REG_OP_TABLE}
3227 ldr REG_OP_TABLE, =cpu_exec_table
3228 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3229 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3232 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3233 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3238 @ the nasty MapIRQHook thing from FCE..
3239 @ test Gradius 2 (J) if you change this
3241 @ ((cycles >> 4) * 43) >> 7; // aproximating /= 48
3242 ldr r1, [REG_OP_TABLE, #OTOFFS_IRQH_CYC]
3243 str REG_CYCLE, [REG_OP_TABLE, #OTOFFS_IRQH_CYC]
3245 sub r1, r1, REG_CYCLE
3249 #ifndef DEBUG_ASM_6502
3250 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3251 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3252 mov REG_P_REST, lr @ r8
3254 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3256 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3258 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
3260 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3262 ldr r1, =mapirq_cyc_a
3269 @ vim:filetype=armasm