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)
20 #define FCEU_IQNMI 0x08
21 #define FCEU_IQTEMP 0x80
24 @@@@@@@@@@@@@@@@@@@@@@@@@@
34 @@@ r0 = Address (unbased)
35 @@@ uses REG_OP_TABLE; sets REG_PC; trashes r1,r2; keeps r0
38 @ FIXME: do something with mem not in Page[].
42 ldrge r2, [r1, r2, lsl #2]
44 addlt r1, REG_OP_TABLE, #OTOFFS_NES_RAM
46 str r2, [REG_OP_TABLE, #OTOFFS_PC_BASE]
51 .macro RETURN_FROM_CPU_EXEC
56 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
57 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
61 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
62 @@@ ¤¿¤À¤·³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤¤
64 @@@ ¤Ê¤ó¤«Ì¾Á°¤¬ÊѤÀ¤Ê(¤É¡¼¤Ç¤â¤¤¡¼¤±¤É¡¼
69 subs REG_CYCLE, REG_CYCLE, #\n*48
72 tst REG_P_REST, #0xff<<8
73 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
75 @ do some messing to find out which IRQ is pending..
76 tst REG_P_REST, #FCEU_IQNMI<<8
78 tst REG_P_REST, #P_REST_I_FLAG
79 @@ if I_FLAG=1, continue execution, don't trigger IRQ
80 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
81 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
82 @@ I_FLAG=0 and REST is checked, we have a IRQ
87 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
88 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
92 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
93 @@@ CLI¡¦PHP¤Ê¤É¥Õ¥é¥°¤òÊѹ¹¤·¤¿¾ì¹ç¤Ï¤³¤ì
95 .macro CYCLE_NEXT_INT n
98 @ subs REG_CYCLE, REG_CYCLE, #\n*48
99 @ bgt cpu_exec_check_int
100 @ RETURN_FROM_CPU_EXEC
104 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
105 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
107 @@@ ¥¼¥í¥Ú¡¼¥¸¤«¤éÆɤà
110 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
111 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
115 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
126 ldrb REG_ADDR, [REG_ADDR, #1]
127 orr REG_ADDR, r0, REG_ADDR, lsl #8
130 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
131 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
135 .macro ZP_WRITE reg=r0
136 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
137 strb \reg, [REG_ADDR, REG_OP_TABLE]
141 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
148 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
149 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
151 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤
153 @@@ REG_ADDR => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
154 @@@ r0 => ½ñ¤¯¥Ð¥¤¥È(write)
155 @@@ r0 <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
159 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
162 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
164 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
166 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
169 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é¥í¡¼¥É¤Î¤ß
171 @@@ RAM¤«¤é¤Î¥í¡¼¥É¤¬°ìÈÖ¿¤¤¤Î¤ÇÍ¥À褹¤ë
181 movs r1, REG_ADDR, lsr #13
183 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
184 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
185 ldrne pc, [lr, -r1, lsl #2]
187 bic r0, REG_ADDR, #0x1800
188 add r0, r0, #OTOFFS_NES_RAM
189 ldrb r0, [r0, REG_OP_TABLE]
204 mov r1, REG_ADDR, lsr #13
206 ldr pc, [pc, r1, lsl #2]
217 bic r0, REG_ADDR, #0x1800
218 add r0, r0, #OTOFFS_NES_RAM
219 ldrb r0, [r0, REG_OP_TABLE]
220 @@ ¤È¤¤¤¦¤ï¤±¤Ç¥¸¥ã¥ó¥×¤¹¤ëɬÍפϤʤ¤
225 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
235 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
238 movs r3, REG_ADDR, lsr #13
240 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
241 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
242 ldrne pc, [lr, -r3, lsl #2]
244 bic REG_ADDR, REG_ADDR, #0x1800
245 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
246 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
266 ldr pc, [pc, r3, lsl #2]
280 @@@ ½ñ¤¹þ¤ß¤À¤±¤Î¾ì¹ç
291 movs r1, REG_ADDR, lsr #13
293 ldrne pc, [lr, -r1, lsl #2]
294 bic REG_ADDR, REG_ADDR, #0x1800
295 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
297 strb r0, [REG_ADDR, REG_OP_TABLE]
312 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
313 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
314 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
315 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
316 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
321 add REG_ADDR, REG_ADDR, #1
323 orr r0, REG_PC, r0, lsl #8
327 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
328 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
330 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
336 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
337 strb r0, [r1, REG_S, lsr #24]
338 sub REG_S, REG_S, #1 << 24
343 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
345 strb r2, [r1, REG_S, lsr #24]
346 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
347 sub REG_S, REG_S, #1 << 24
348 strb r0, [r1, REG_S, lsr #24]
349 sub REG_S, REG_S, #1 << 24
354 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
355 add REG_S, REG_S, #1 << 24
356 ldrb r0, [r0, REG_S, lsr #24]
361 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
362 add REG_S, REG_S, #1 << 24
363 ldrb r1, [r0, REG_S, lsr #24]
364 add REG_S, REG_S, #1 << 24
365 ldrb r0, [r0, REG_S, lsr #24]
366 orr r0, r1, r0, lsl #8
369 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
370 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
372 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
379 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
380 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
382 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
385 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
388 ldrb r0, [REG_PC], #1
391 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
394 ldrb REG_ADDR, [REG_PC], #1
397 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
401 add REG_ADDR, REG_ADDR, REG_X
402 and REG_ADDR, REG_ADDR, #0xFF
405 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
409 add REG_ADDR, REG_ADDR, REG_Y
410 and REG_ADDR, REG_ADDR, #0xFF
413 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
420 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
425 add REG_ADDR, REG_ADDR, REG_Y
426 bic REG_ADDR, REG_ADDR, #0x10000
427 and r0,REG_ADDR,#0xff
429 subgt REG_CYCLE,REG_CYCLE,#1*48
433 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
434 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
436 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
439 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
444 ldrneb REG_ADDR, [REG_PC], #1
445 ldrneb r0, [REG_PC], #1
446 ldreqh REG_ADDR, [REG_PC], #2
447 orrne REG_ADDR, REG_ADDR, r0, lsl #8
450 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
454 add REG_ADDR, REG_ADDR, REG_X
455 bic REG_ADDR, REG_ADDR, #0x10000
456 and r0,REG_ADDR,#0xff
458 subgt REG_CYCLE,REG_CYCLE,#1*48
461 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
465 add REG_ADDR, REG_ADDR, REG_Y
466 bic REG_ADDR, REG_ADDR, #0x10000
467 and r0,REG_ADDR,#0xff
469 subgt REG_CYCLE,REG_CYCLE,#1*48
473 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
474 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
475 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
481 orrne REG_NZ, REG_NZ, #0x80 << 24
483 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
484 and r0, r0, #P_REST_FLAGS
485 orr REG_P_REST, REG_P_REST, r0
490 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
491 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
494 and r0, REG_P_REST, #P_REST_FLAGS
495 tst REG_NZ, #0x80 << 24
496 orrne r0, r0, #P_N_FLAG
498 orreq r0, r0, #P_Z_FLAG
499 orr r0, r0, #P_R_FLAG
510 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
511 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
520 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
521 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
523 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
528 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
529 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
533 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
538 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
543 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
548 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
553 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
558 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
563 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
566 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
567 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
569 @@@ TAX/TXA/TAY/TYA/TSX/TXS
571 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
574 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
578 mov REG_X, REG_A, lsr #24
579 mov REG_NZ, REG_A, asr #24
584 mov REG_A, REG_X, lsl #24
585 mov REG_NZ, REG_A, asr #24
590 mov REG_Y, REG_A, lsr #24
591 mov REG_NZ, REG_A, asr #24
596 mov REG_A, REG_Y, lsl #24
597 mov REG_NZ, REG_A, asr #24
602 mov REG_X, REG_S, lsr #24
603 orr REG_NZ, REG_X, REG_X, lsl #24
608 bic REG_S, REG_S, #0xFF << 24
609 orr REG_S, REG_S, REG_X, lsl #24
613 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
614 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
619 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
623 mov r0, REG_A, lsr #24
630 orr r0, r0, #P_B_FLAG
637 mov REG_A, r0, lsl #24
638 mov REG_NZ, REG_A, asr #24
647 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
648 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
658 mov REG_A, r0, lsl #24
659 mov REG_NZ, REG_A, asr #24
664 orr REG_NZ, r0, r0, lsl #24
811 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
812 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
822 mov r0, REG_A, lsr #24
916 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
917 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
919 @@@ INC/INX/INY/DEC/DEX/DEY
920 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
921 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
930 orr REG_NZ, r0, r0, lsl #24
935 and \reg, \reg, #0xFF
936 orr REG_NZ, \reg, \reg, lsl #24
942 orr REG_NZ, r0, r0, lsl #24
947 and \reg, \reg, #0xFF
948 orr REG_NZ, \reg, \reg, lsl #24
1022 opDE: @ DEC $nnnn, X
1044 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1045 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1049 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1052 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1053 movs r1, REG_P_REST, lsr #1
1054 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1055 subcs r0, r0, #0x100
1056 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1057 adcs REG_A, REG_A, r0, ror #8
1058 mov REG_NZ, REG_A, asr #24
1059 adc REG_P_REST, r1, r1
1060 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1061 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1065 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1066 movs r1, REG_P_REST, lsr #1
1067 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1068 sbcs REG_A, REG_A, r0, lsl #24
1069 and REG_A, REG_A, #0xFF << 24
1070 mov REG_NZ, REG_A, asr #24
1071 adc REG_P_REST, r1, r1
1072 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1073 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1102 op7D: @ ADC $nnnn, X
1111 op79: @ ADC $nnnn, Y
1120 op61: @ ADC ($nn, X)
1129 op71: @ ADC ($nn), Y
1165 opFD: @ SBC $nnnn, X
1174 opF9: @ SBC $nnnn, Y
1183 opE1: @ SBC ($nn, X)
1192 opF1: @ SBC ($nn), Y
1202 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1203 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1207 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1213 and REG_A, REG_A, r0, lsl #24
1214 mov REG_NZ, REG_A, asr #24
1218 eor REG_A, REG_A, r0, lsl #24
1219 mov REG_NZ, REG_A, asr #24
1223 orr REG_A, REG_A, r0, lsl #24
1224 mov REG_NZ, REG_A, asr #24
1253 op3D: @ AND $nnnn, X
1262 op39: @ AND $nnnn, Y
1271 op21: @ AND ($nn, X)
1280 op31: @ AND ($nn), Y
1316 op5D: @ EOR $nnnn, X
1325 op59: @ EOR $nnnn, Y
1334 op41: @ EOR ($nn, X)
1343 op51: @ EOR ($nn), Y
1379 op1D: @ ORA $nnnn, X
1388 op19: @ ORA $nnnn, Y
1397 op01: @ ORA ($nn, X)
1406 op11: @ ORA ($nn), Y
1417 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1418 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1422 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1428 subs REG_NZ, REG_A, r0, lsl #24
1429 mov REG_NZ, REG_NZ, asr #24
1430 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1431 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1435 mov r1, \reg, lsl #24
1436 subs REG_NZ, r1, r0, lsl #24
1437 mov REG_NZ, REG_NZ, asr #24
1438 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1439 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1476 opDD: @ CMP $nnnn, X
1485 opD9: @ CMP $nnnn, Y
1494 opC1: @ CMP ($nn, X)
1503 opD1: @ CMP ($nn), Y
1555 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1556 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1560 @@@ Z <= A ¢Ê M == 0
1568 and REG_NZ, r0, REG_A, lsr #24
1569 @@ R0[7] => C, R0[6] => N
1570 movs r0, r0, lsl #25
1571 orrcs REG_NZ, REG_NZ, #0x80 << 24
1572 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1573 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1592 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1593 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1597 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1602 movs REG_NZ, r0, lsl #25
1603 mov r0, REG_NZ, lsr #24
1604 mov REG_NZ, REG_NZ, asr #24
1605 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1606 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1610 movs REG_A, REG_A, lsl #1
1611 mov REG_NZ, REG_A, asr #24
1612 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1613 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1620 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1621 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1626 movs REG_NZ, REG_A, lsr #25
1627 mov REG_A, REG_NZ, lsl #24
1628 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1629 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1662 op1E: @ ASL $nnnn, X
1704 op5E: @ LSR $nnnn, X
1716 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1717 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1727 movs r1, REG_P_REST, lsr #1
1730 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1731 orrs REG_NZ, r0, r0, lsl #24
1733 adc REG_P_REST, r1, r1
1738 movs r1, REG_P_REST, lsr #1
1739 orrcs REG_A, REG_A, #0x80 << 16
1740 movs REG_A, REG_A, lsl #1
1741 mov REG_NZ, REG_A, asr #24
1742 adc REG_P_REST, r1, r1
1746 movs r1, REG_P_REST, lsr #1
1747 orrcs r0, r0, #0x100
1749 orr REG_NZ, r0, r0, lsl #24
1750 adc REG_P_REST, r1, r1
1754 movs r1, REG_P_REST, lsr #1
1755 mov REG_NZ, REG_A, rrx
1756 movs REG_NZ, REG_NZ, asr #24
1757 mov REG_A, REG_NZ, lsl #24
1758 adc REG_P_REST, r1, r1
1792 op3E: @ ROL $nnnn, X
1834 op7E: @ ROR $nnnn, X
1846 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1847 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1849 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1856 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1858 mov r3, r1 @ preserve immediate
1862 @@ R1 <- (PC&0xFF)+ReadValue
1866 subne REG_CYCLE,REG_CYCLE, #1*48
1870 ldreqsb r1, [REG_PC], #1
1872 add REG_PC, REG_PC, r1
1873 subeq REG_CYCLE, REG_CYCLE, #1*48
1880 ldrnesb r1, [REG_PC], #1
1882 add REG_PC, REG_PC, r1
1883 subne REG_CYCLE, REG_CYCLE, #1*48
1890 tst REG_P_REST, #P_REST_C_FLAG
1897 tst REG_P_REST, #P_REST_C_FLAG
1913 tst REG_NZ, #0x80 << 24
1914 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1919 tst REG_NZ, #0x80 << 24
1925 tst REG_P_REST, #P_REST_V_FLAG
1932 tst REG_P_REST, #P_REST_V_FLAG
1938 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1939 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1944 mov REG_A, r0, lsl #24
1946 mov REG_NZ, REG_A, asr #24
1950 movs r0, r0, lsl #25
1952 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1953 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1957 mov REG_NZ, REG_A, asr #24
1958 @@restore value to write
1968 mov r0,REG_ADDR, lsr #8
1976 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1977 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1979 eor REG_A,REG_A,r0, lsl #24
1981 mov REG_NZ, REG_A, asr #24
1985 and r1,REG_X,REG_A, lsr #24
1987 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1988 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1990 orr REG_NZ, REG_X, REG_X, lsl #24
2000 movs r1, REG_P_REST, lsr #1
2003 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
2004 orrs REG_NZ, r0, r0, lsl #24
2006 adc REG_P_REST, r1, r1
2007 and REG_A,REG_A,r0,lsl #24
2011 movs r1, REG_P_REST, lsr #1
2012 orrcs r0, r0, #0x100
2016 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2017 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2047 op5F: @ SRE $nnnn, X
2058 op5B: @ SRE $nnnn, Y
2069 op43: @ SRE ($nn, X)
2080 op53: @ SRE ($nn), Y
2092 op9C: @ SHY $nnnn, X
2143 opFB: @ ISB $nnnn, Y
2156 opE3: @ ISB ($nn, X)
2169 opF3: @ ISB ($nn), Y
2203 opBF: @ LAX $nnnn, Y
2212 opA3: @ LAX ($nn, X)
2221 opB3: @ LAX ($nn), Y
2255 op1F: @ SLO $nnnn, X
2266 op1B: @ SLO $nnnn, Y
2277 op03: @ SLO ($nn, X)
2288 op13: @ SLO ($nn), Y
2333 opDF: @ DCP $nnnn, X
2346 opDB: @ DCP $nnnn, Y
2360 opC3: @ DCP ($nn, X)
2373 opD3: @ DCP ($nn), Y
2411 op3F: @ RLA $nnnn, X
2422 op3B: @ RLA $nnnn, Y
2433 op23: @ RLA ($nn, X)
2444 op33: @ RLA ($nn), Y
2484 op7F: @ RRA $nnnn, X
2497 op7B: @ RRA $nnnn, Y
2510 op63: @ RRA ($nn, X)
2523 op73: @ RRA ($nn), Y
2540 add REG_PC,REG_PC,#1
2544 add REG_PC,REG_PC,#2
2553 add REG_PC,REG_PC,#1
2564 op1C: @ NOP $nnnn, X
2570 add REG_PC,REG_PC,#2
2578 add REG_PC,REG_PC,#1
2583 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2584 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2594 and r0, REG_ADDR, #0xFF
2596 beq jmp_indirect_bug
2602 @@ BUG is : to not read word at REG_ADDR, because it loops
2603 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2607 and REG_ADDR, REG_ADDR, #0xff00
2609 orr r0, REG_PC, r0, lsl #8
2615 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2616 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2631 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2632 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2642 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2652 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2653 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2662 add REG_PC, REG_PC, #1
2663 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2666 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2669 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2670 mov REG_ADDR, #0x10000
2671 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2676 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2677 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2693 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2694 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2713 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2716 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2719 tst REG_P_REST, #FCEU_IQNMI<<8
2720 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2721 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2722 mov REG_ADDR, #0x10000
2723 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2724 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2735 stmfd r13!,{r4-r11,lr}
2737 ldr r0, =nes_registers
2742 @@REG_P_REST = 0, don't touch REG_S
2743 bic REG_P_REST, REG_P_REST, #0xff
2745 @@ R bit is always 1
2746 orr REG_NZ, REG_NZ, #P_R_FLAG
2749 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2751 mov REG_ADDR, #0x10000
2752 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2756 ldr r0, =nes_registers
2759 ldmfd r13!,{r4-r11,lr}
2763 @@@ low-level memhandlers
2770 @ must preserve r3 for the callers too
2771 @ TODO: check if all of saves are needed, optimize read_rom_byte, _DB
2772 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2773 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2774 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2776 mov REG_P_REST, r3 @ r8
2779 bic r0, REG_ADDR, #0x00ff0000
2781 ldr pc, [r2, r0, lsl #2]
2783 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2786 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2787 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2788 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2796 @ must preserve r3 for the callers too
2797 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2798 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2799 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2801 mov REG_P_REST, r3 @ r8
2805 bic r0, REG_ADDR, #0x00ff0000
2807 ldr pc, [r2, r0, lsl #2]
2809 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2812 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2813 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2814 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2822 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2823 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2825 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2827 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2828 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2831 stmfd r13!,{r4-r11,lr}
2833 ldr r0, =nes_registers
2836 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2841 ldr r0, =nes_registers
2844 ldmfd r13!,{r4-r11,lr}
2848 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2852 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2853 @ they must be in the same section
2859 .long op00, op01, op02, op03, op04, op05, op06, op07
2860 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2862 .long op10, op11, op12, op13, op14, op15, op16, op17
2863 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2865 .long op20, op21, op22, op23, op24, op25, op26, op27
2866 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2868 .long op30, op31, op32, op33, op34, op35, op36, op37
2869 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2871 .long op40, op41, op42, op43, op44, op45, op46, op47
2872 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2874 .long op50, op51, op52, op53, op54, op55, op56, op57
2875 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2877 .long op60, op61, op62, op63, op64, op65, op66, op67
2878 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2880 .long op70, op71, op72, op73, op74, op75, op76, op77
2881 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2883 .long op80, op81, op82, op83, op84, op85, op86, op87
2884 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2886 .long op90, op91, op92, op93, op94, op95, op96, op97
2887 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2889 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2890 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
2892 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
2893 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
2895 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
2896 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
2898 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
2899 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
2901 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
2902 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
2904 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
2905 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
2908 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
2918 @ TODO: write code which keeps it up-to-date
2929 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2930 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2932 @@@ Undefined Opcodes
2942 @opDF: @ DCP $nnnn, X
2943 @opDB: @ DCP $nnnn, Y
2944 @opC3: @ DCP ($nn, X)
2945 @opD3: @ DCP ($nn), Y
2952 @opFF: @ ISB $nnnn, X
2953 @opFB: @ ISB $nnnn, Y
2954 @opE3: @ ISB ($nn, X)
2955 @opF3: @ ISB ($nn), Y
2973 @opA3: @ LAX ($nn, X)
2977 @opBF: @ LAX $nnnn, Y
2979 @opB3: @ LAX ($nn), Y
2984 @op3F: @ RLA $nnnn, X
2985 @op3B: @ RLA $nnnn, Y
2986 @op23: @ RLA ($nn, X)
2987 @op33: @ RLA ($nn), Y
2991 @op7F: @ RRA $nnnn, X
2992 @op7B: @ RRA $nnnn, Y
2993 @op63: @ RRA ($nn, X)
2994 @op73: @ RRA ($nn), Y
2998 op83: @ SAX ($nn, X)
3000 op9F: @ SHA $nnnn, Y
3001 op93: @ SHA ($nn), Y
3002 op9B: @ SHS $nnnn, Y
3003 op9E: @ SHX $nnnn, Y
3004 @op9C: @ SHY $nnnn, X
3005 @op03: @ SLO ($nn, X)
3009 @op1F: @ SLO $nnnn, X
3010 @op1B: @ SLO $nnnn, Y
3011 @op13: @ SLO ($nn), Y
3015 @op5F: @ SRE $nnnn, X
3016 @op5B: @ SRE $nnnn, Y
3017 @op43: @ SRE ($nn, X)
3018 @op53: @ SRE ($nn), Y
3024 @@@@@@@@@@@@@@@@@@@@@@@@@@
3026 @@@@@@@@@@@@@@@@@@@@@@@@@@
3038 .globl nes_registers @ TODO: hide?
3041 @ .globl MapIRQHook @ (int a)
3042 @ TODO... .. conversion X <-> nes_registers for savestates
3044 @MapIRQHook: .long 0
3045 @X: .fill 0x20, 1, 0
3046 .globl X6502_Reset_a @ (void);
3047 .globl X6502_Power_a @ (void);
3048 .globl X6502_Run_a @ (int32 cycles);
3049 .globl TriggerIRQ_a @ (void);
3050 .globl TriggerNMI_a @ (void);
3051 .globl TriggerNMINSF_a @ (void);
3052 .globl X6502_AddCycles_a @ (int x);
3053 .globl X6502_IRQBegin_a @ (int w);
3054 .globl X6502_IRQEnd_a @ (int w);
3055 .globl X6502_rebase_a @ (void);
3060 .equiv X6502_Reset_a, reset_cpu
3061 .equiv X6502_Run_a, cpu_exec
3068 ldr r1, =nes_registers
3073 bne X6502_Power_loop1
3074 ldr r0, =cpu_exec_table
3081 mov r0, #FCEU_IQTEMP
3084 ldr r2, =nes_registers
3086 ldr r1, [r2, #0x10] @ REG_P_REST
3087 orr r1, r1, r0, lsl #8
3093 ldr r2, =nes_registers
3096 bic r1, r1, r0, lsl #8
3102 mov r0, #FCEU_IQTEMP
3112 ldr r2, =nes_registers
3120 @ rebase PC when not executing or in memhandlers
3122 stmfd sp!,{REG_PC,REG_OP_TABLE}
3123 ldr REG_OP_TABLE, =cpu_exec_table
3124 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3125 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3128 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3129 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3134 @ vim:filetype=armasm