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, kills flags
72 .macro FLUSH_TIMESTAMP reg
73 ands \reg, REG_CYCLE, #0xff
75 ldr r1, [REG_OP_TABLE, #OTOFFS_TIMESTAMP]
76 orr REG_CYCLE, REG_CYCLE, \reg, lsl #8 @ put cycles for do_irq_hook
78 bic REG_CYCLE, REG_CYCLE, #0xff
79 str r1, [REG_OP_TABLE, #OTOFFS_TIMESTAMP]
84 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
85 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
89 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
90 @@@ ¤¿¤À¤·³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤¤
92 @@@ ¤Ê¤ó¤«Ì¾Á°¤¬ÊѤÀ¤Ê(¤É¡¼¤Ç¤â¤¤¡¼¤±¤É¡¼
94 .macro CYCLE_NEXT n, unused=0, do_cyc_add=1
98 add REG_CYCLE, REG_CYCLE, #\n
100 subs REG_CYCLE, REG_CYCLE, #\n*48<<16
102 tst REG_P_REST, #1<<16
105 ldrb r0, [REG_PC], #1
106 tst REG_P_REST, #0xff<<8
107 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
109 @ do some messing to find out which IRQ is pending..
110 @ assumption: NMI can be set only on very first run, because it is only set once before vblank..
111 @ tst REG_P_REST, #FCEU_IQNMI<<8
113 tst REG_P_REST, #P_REST_I_FLAG
114 @@ if I_FLAG=1, continue execution, don't trigger IRQ
115 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
116 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
117 @@ I_FLAG=0 and REST is checked, we have a IRQ
121 @ fceu needs timestamp cycles to be inremented before doing actual opcode.
122 @ this is only needed for ops which do memory i/o
124 add REG_CYCLE, REG_CYCLE, #\n
128 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
129 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
133 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
134 @@@ CLI¡¦PHP¤Ê¤É¥Õ¥é¥°¤òÊѹ¹¤·¤¿¾ì¹ç¤Ï¤³¤ì
136 .macro CYCLE_NEXT_INT n
140 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
141 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
143 @@@ ¥¼¥í¥Ú¡¼¥¸¤«¤éÆɤà
146 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
147 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
151 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
162 ldrb REG_ADDR, [REG_ADDR, #1]
163 orr REG_ADDR, r0, REG_ADDR, lsl #8
166 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
167 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
171 .macro ZP_WRITE reg=r0
172 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
173 strb \reg, [REG_ADDR, REG_OP_TABLE]
177 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
184 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
185 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
187 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤
189 @@@ REG_ADDR => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
190 @@@ r0 => ½ñ¤¯¥Ð¥¤¥È(write)
191 @@@ r0 <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
195 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
198 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
200 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
202 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
208 .macro READ unused_param
209 tst REG_ADDR, #0xe000
211 biceq r0, REG_ADDR, #0x1800
212 addeq r0, r0, #OTOFFS_NES_RAM
213 ldreqb r0, [r0, REG_OP_TABLE]
218 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
228 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
231 tst REG_ADDR, #0xe000
235 bic REG_ADDR, REG_ADDR, #0x1800
236 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
237 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
246 bl write_byte @ rmw first writes unmodified data
250 bl write_byte @ and only then modified (Blaster Master)
254 @@@ Write r0 to [addr]
260 tst REG_ADDR, #0xe000
261 biceq REG_ADDR, REG_ADDR, #0x1800
262 addeq REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
264 streqb r0, [REG_ADDR, REG_OP_TABLE]
269 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
270 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
271 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
272 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
273 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
278 add REG_ADDR, REG_ADDR, #1
280 orr r0, REG_PC, r0, lsl #8
284 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
285 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
287 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
293 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
294 strb r0, [r1, REG_S, lsr #24]
295 sub REG_S, REG_S, #1 << 24
300 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
302 strb r2, [r1, REG_S, lsr #24]
303 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
304 sub REG_S, REG_S, #1 << 24
305 strb r0, [r1, REG_S, lsr #24]
306 sub REG_S, REG_S, #1 << 24
311 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
312 add REG_S, REG_S, #1 << 24
313 ldrb r0, [r0, REG_S, lsr #24]
318 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
319 add REG_S, REG_S, #1 << 24
320 ldrb r1, [r0, REG_S, lsr #24]
321 add REG_S, REG_S, #1 << 24
322 ldrb r0, [r0, REG_S, lsr #24]
323 orr r0, r1, r0, lsl #8
326 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
327 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
329 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
336 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
337 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
339 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
342 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
345 ldrb r0, [REG_PC], #1
348 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
351 ldrb REG_ADDR, [REG_PC], #1
354 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
358 add REG_ADDR, REG_ADDR, REG_X
359 and REG_ADDR, REG_ADDR, #0xFF
362 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
366 add REG_ADDR, REG_ADDR, REG_Y
367 and REG_ADDR, REG_ADDR, #0xFF
370 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
377 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
382 add REG_ADDR, REG_ADDR, REG_Y
383 bic REG_ADDR, REG_ADDR, #0x10000
384 and r0,REG_ADDR,#0xff
386 addgt REG_CYCLE, REG_CYCLE, #1
387 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
390 @ Indirect Indexed (for writes and rmws)
394 add REG_ADDR, REG_ADDR, REG_Y
395 bic REG_ADDR, REG_ADDR, #0x10000
399 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
400 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
402 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
405 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
410 ldrneb REG_ADDR, [REG_PC], #1
411 ldrneb r0, [REG_PC], #1
412 ldreqh REG_ADDR, [REG_PC], #2
413 orrne REG_ADDR, REG_ADDR, r0, lsl #8
416 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
420 add REG_ADDR, REG_ADDR, REG_X
421 bic REG_ADDR, REG_ADDR, #0x10000
422 and r0,REG_ADDR,#0xff
424 addgt REG_CYCLE, REG_CYCLE, #1
425 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
428 @ Absolute Indexed (for writes and rmws)
431 add REG_ADDR, REG_ADDR, REG_X
432 bic REG_ADDR, REG_ADDR, #0x10000
435 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
439 add REG_ADDR, REG_ADDR, REG_Y
440 bic REG_ADDR, REG_ADDR, #0x10000
441 and r0,REG_ADDR,#0xff
443 addgt REG_CYCLE, REG_CYCLE, #1
444 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
447 @ Absolute Indexed (for writes and rmws)
450 add REG_ADDR, REG_ADDR, REG_Y
451 bic REG_ADDR, REG_ADDR, #0x10000
454 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
457 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
458 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
459 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
465 orrne REG_NZ, REG_NZ, #0x80 << 24
467 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
468 and r0, r0, #P_REST_FLAGS
469 orr REG_P_REST, REG_P_REST, r0
474 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
475 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
478 and r0, REG_P_REST, #P_REST_FLAGS
479 tst REG_NZ, #0x80 << 24
480 orrne r0, r0, #P_N_FLAG
482 orreq r0, r0, #P_Z_FLAG
483 orr r0, r0, #P_R_FLAG
494 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
495 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
504 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
505 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
507 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
512 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
513 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
517 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
522 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
527 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
532 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
537 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
542 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
547 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
550 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
551 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
553 @@@ TAX/TXA/TAY/TYA/TSX/TXS
555 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
558 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
562 mov REG_X, REG_A, lsr #24
563 mov REG_NZ, REG_A, asr #24
568 mov REG_A, REG_X, lsl #24
569 mov REG_NZ, REG_A, asr #24
574 mov REG_Y, REG_A, lsr #24
575 mov REG_NZ, REG_A, asr #24
580 mov REG_A, REG_Y, lsl #24
581 mov REG_NZ, REG_A, asr #24
586 mov REG_X, REG_S, lsr #24
587 orr REG_NZ, REG_X, REG_X, lsl #24
592 bic REG_S, REG_S, #0xFF << 24
593 orr REG_S, REG_S, REG_X, lsl #24
597 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
598 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
603 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
607 mov r0, REG_A, lsr #24
614 orr r0, r0, #P_B_FLAG
621 mov REG_A, r0, lsl #24
622 mov REG_NZ, REG_A, asr #24
631 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
632 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
642 mov REG_A, r0, lsl #24
643 mov REG_NZ, REG_A, asr #24
648 orr REG_NZ, r0, r0, lsl #24
776 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
777 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
787 mov r0, REG_A, lsr #24
874 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
875 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
877 @@@ INC/INX/INY/DEC/DEX/DEY
878 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
879 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
888 orr REG_NZ, r0, r0, lsl #24
893 and \reg, \reg, #0xFF
894 orr REG_NZ, \reg, \reg, lsl #24
900 orr REG_NZ, r0, r0, lsl #24
905 and \reg, \reg, #0xFF
906 orr REG_NZ, \reg, \reg, lsl #24
1006 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1007 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1011 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1014 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1015 movs r1, REG_P_REST, lsr #1
1016 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1017 subcs r0, r0, #0x100
1018 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1019 adcs REG_A, REG_A, r0, ror #8
1020 mov REG_NZ, REG_A, asr #24
1021 adc REG_P_REST, r1, r1
1022 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1023 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1027 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1028 movs r1, REG_P_REST, lsr #1
1029 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1030 sbcs REG_A, REG_A, r0, lsl #24
1031 and REG_A, REG_A, #0xFF << 24
1032 mov REG_NZ, REG_A, asr #24
1033 adc REG_P_REST, r1, r1
1034 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1035 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1062 op7D: @ ADC $nnnn, X
1069 op79: @ ADC $nnnn, Y
1076 op61: @ ADC ($nn, X)
1083 op71: @ ADC ($nn), Y
1115 opFD: @ SBC $nnnn, X
1122 opF9: @ SBC $nnnn, Y
1129 opE1: @ SBC ($nn, X)
1136 opF1: @ SBC ($nn), Y
1144 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1145 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1149 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1155 and REG_A, REG_A, r0, lsl #24
1156 mov REG_NZ, REG_A, asr #24
1160 eor REG_A, REG_A, r0, lsl #24
1161 mov REG_NZ, REG_A, asr #24
1165 orr REG_A, REG_A, r0, lsl #24
1166 mov REG_NZ, REG_A, asr #24
1193 op3D: @ AND $nnnn, X
1200 op39: @ AND $nnnn, Y
1207 op21: @ AND ($nn, X)
1214 op31: @ AND ($nn), Y
1246 op5D: @ EOR $nnnn, X
1253 op59: @ EOR $nnnn, Y
1260 op41: @ EOR ($nn, X)
1267 op51: @ EOR ($nn), Y
1299 op1D: @ ORA $nnnn, X
1306 op19: @ ORA $nnnn, Y
1313 op01: @ ORA ($nn, X)
1320 op11: @ ORA ($nn), Y
1329 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1330 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1334 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1340 subs REG_NZ, REG_A, r0, lsl #24
1341 mov REG_NZ, REG_NZ, asr #24
1342 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1343 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1347 mov r1, \reg, lsl #24
1348 subs REG_NZ, r1, r0, lsl #24
1349 mov REG_NZ, REG_NZ, asr #24
1350 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1351 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1386 opDD: @ CMP $nnnn, X
1393 opD9: @ CMP $nnnn, Y
1400 opC1: @ CMP ($nn, X)
1407 opD1: @ CMP ($nn), Y
1453 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1454 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1458 @@@ Z <= A ¢Ê M == 0
1466 and REG_NZ, r0, REG_A, lsr #24
1467 @@ R0[7] => C, R0[6] => N
1468 movs r0, r0, lsl #25
1469 orrcs REG_NZ, REG_NZ, #0x80 << 24
1470 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1471 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1488 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1489 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1493 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1498 movs REG_NZ, r0, lsl #25
1499 mov r0, REG_NZ, lsr #24
1500 mov REG_NZ, REG_NZ, asr #24
1501 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1502 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1506 movs REG_A, REG_A, lsl #1
1507 mov REG_NZ, REG_A, asr #24
1508 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1509 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1516 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1517 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1522 movs REG_NZ, REG_A, lsr #25
1523 mov REG_A, REG_NZ, lsl #24
1524 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1525 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1559 op1E: @ ASL $nnnn, X
1603 op5E: @ LSR $nnnn, X
1616 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1617 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1627 movs r1, REG_P_REST, lsr #1
1630 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1631 orrs REG_NZ, r0, r0, lsl #24
1633 adc REG_P_REST, r1, r1
1638 movs r1, REG_P_REST, lsr #1
1639 orrcs REG_A, REG_A, #0x80 << 16
1640 movs REG_A, REG_A, lsl #1
1641 mov REG_NZ, REG_A, asr #24
1642 adc REG_P_REST, r1, r1
1646 movs r1, REG_P_REST, lsr #1
1647 orrcs r0, r0, #0x100
1649 orr REG_NZ, r0, r0, lsl #24
1650 adc REG_P_REST, r1, r1
1654 movs r1, REG_P_REST, lsr #1
1655 mov REG_NZ, REG_A, rrx
1656 movs REG_NZ, REG_NZ, asr #24
1657 mov REG_A, REG_NZ, lsl #24
1658 adc REG_P_REST, r1, r1
1693 op3E: @ ROL $nnnn, X
1737 op7E: @ ROR $nnnn, X
1750 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1751 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1753 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1760 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1762 mov r3, r1 @ preserve immediate
1766 @@ R1 <- (PC&0xFF)+ReadValue
1770 addne REG_CYCLE, REG_CYCLE, #1
1771 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1775 ldreqsb r1, [REG_PC], #1
1777 add REG_PC, REG_PC, r1
1778 addeq REG_CYCLE, REG_CYCLE, #1
1779 subeq REG_CYCLE, REG_CYCLE, #1*48<<16
1786 ldrnesb r1, [REG_PC], #1
1788 add REG_PC, REG_PC, r1
1789 addne REG_CYCLE, REG_CYCLE, #1
1790 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1797 tst REG_P_REST, #P_REST_C_FLAG
1804 tst REG_P_REST, #P_REST_C_FLAG
1820 tst REG_NZ, #0x80 << 24
1821 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1826 tst REG_NZ, #0x80 << 24
1832 tst REG_P_REST, #P_REST_V_FLAG
1839 tst REG_P_REST, #P_REST_V_FLAG
1845 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1846 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1851 mov REG_A, r0, lsl #24
1853 mov REG_NZ, REG_A, asr #24
1857 movs r0, r0, lsl #25
1859 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1860 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1864 mov REG_NZ, REG_A, asr #24
1865 @@restore value to write
1875 mov r0,REG_ADDR, lsr #8
1883 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1884 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1886 eor REG_A,REG_A,r0, lsl #24
1888 mov REG_NZ, REG_A, asr #24
1892 and r1,REG_X,REG_A, lsr #24
1894 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1895 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1897 orr REG_NZ, REG_X, REG_X, lsl #24
1907 movs r1, REG_P_REST, lsr #1
1910 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1911 orrs REG_NZ, r0, r0, lsl #24
1913 adc REG_P_REST, r1, r1
1914 and REG_A,REG_A,r0,lsl #24
1918 movs r1, REG_P_REST, lsr #1
1919 orrcs r0, r0, #0x100
1923 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1924 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1955 op5F: @ SRE $nnnn, X
1967 op5B: @ SRE $nnnn, Y
1979 op43: @ SRE ($nn, X)
1991 op53: @ SRE ($nn), Y
2004 op9C: @ SHY $nnnn, X
2056 opFB: @ ISB $nnnn, Y
2070 opE3: @ ISB ($nn, X)
2084 opF3: @ ISB ($nn), Y
2117 opBF: @ LAX $nnnn, Y
2124 opA3: @ LAX ($nn, X)
2131 opB3: @ LAX ($nn), Y
2165 op1F: @ SLO $nnnn, X
2177 op1B: @ SLO $nnnn, Y
2189 op03: @ SLO ($nn, X)
2201 op13: @ SLO ($nn), Y
2248 opDF: @ DCP $nnnn, X
2262 opDB: @ DCP $nnnn, Y
2277 opC3: @ DCP ($nn, X)
2291 opD3: @ DCP ($nn), Y
2331 op3F: @ RLA $nnnn, X
2343 op3B: @ RLA $nnnn, Y
2355 op23: @ RLA ($nn, X)
2367 op33: @ RLA ($nn), Y
2409 op7F: @ RRA $nnnn, X
2423 op7B: @ RRA $nnnn, Y
2437 op63: @ RRA ($nn, X)
2451 op73: @ RRA ($nn), Y
2469 add REG_PC,REG_PC,#1
2473 add REG_PC,REG_PC,#2
2482 add REG_PC,REG_PC,#1
2493 op1C: @ NOP $nnnn, X
2499 add REG_PC,REG_PC,#2
2507 add REG_PC,REG_PC,#1
2512 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2513 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2524 and r0, REG_ADDR, #0xFF
2526 beq jmp_indirect_bug
2532 @@ BUG is : to not read word at REG_ADDR, because it loops
2533 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2537 and REG_ADDR, REG_ADDR, #0xff00
2539 orr r0, REG_PC, r0, lsl #8
2545 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2546 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2561 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2562 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2572 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2582 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2583 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2592 add REG_PC, REG_PC, #1
2593 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2596 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2599 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2600 mov REG_ADDR, #0x10000
2601 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2606 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2607 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2623 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2624 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2641 @@@ WARNING: decrements REG_PC
2644 add REG_CYCLE, REG_CYCLE, #7
2645 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2646 sub REG_PC, REG_PC, #1
2649 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2652 tst REG_P_REST, #FCEU_IQNMI<<8
2653 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2654 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2655 mov REG_ADDR, #0x10000
2656 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2657 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2662 subs REG_CYCLE, REG_CYCLE, #7*48<<16
2664 ldrb r0, [REG_PC], #1
2665 tst REG_P_REST, #0xff<<8
2666 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2668 tst REG_P_REST, #P_REST_I_FLAG
2669 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2679 stmfd r13!,{r4-r11,lr}
2681 ldr r0, =nes_registers
2686 @@REG_P_REST = 0, don't touch REG_S
2687 bic REG_P_REST, REG_P_REST, #0xff
2689 @ fceu: set MapIRQHook present flag
2690 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2692 orrne REG_P_REST, REG_P_REST, #1<<16
2693 biceq REG_P_REST, REG_P_REST, #1<<16
2695 @@ R bit is always 1
2696 orr REG_NZ, REG_NZ, #P_R_FLAG
2699 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2701 mov REG_ADDR, #0x10000
2702 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2706 ldr r0, =nes_registers
2709 ldmfd r13!,{r4-r11,lr}
2713 @@@ low-level memhandlers
2717 @ disabled because no improvements noticed, only causes trouble (with gg for example)
2719 @ try to avoid lookup of every address at least for ROM and RAM areas
2720 @ I've verified that if ARead[0xfff0] points to CartBR, it is always normal ROM read.
2724 orr r1, r1, r1, lsr #4
2725 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2729 mov r1, REG_ADDR, lsr #11
2730 ldr r2, [r2, r1, lsl #2]
2731 ldrb r0, [r2, REG_ADDR]
2737 @ must preserve r3 for the callers too
2738 @ TODO: check if all of saves are needed, _DB (is full needed?)
2739 FLUSH_TIMESTAMP r2 @ needed for TryFixit1
2740 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2741 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2742 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2744 mov REG_P_REST, r3 @ r8
2746 #ifndef DEBUG_ASM_6502
2748 bic r0, REG_ADDR, #0x00ff0000
2750 ldr pc, [r2, r0, lsl #2]
2752 ldr r2, =dread_count_a
2760 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2763 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2764 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2765 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2766 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2771 FLUSH_TIMESTAMP r2 @ Blaster Master, more...
2772 #ifndef DEBUG_ASM_6502
2773 @ must preserve r0 (data) and r3 for the callers
2774 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2775 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2776 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2778 mov REG_P_REST, r3 @ r8
2779 mov REG_CYCLE, r0 @ r11
2783 bic r0, REG_ADDR, #0x00ff0000
2785 ldr pc, [r2, r0, lsl #2]
2787 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2791 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2792 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2793 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2795 ldr r1, =dwrite_count_a
2799 orr r0, r0, REG_ADDR, lsl #8
2800 str r0, [r2, r1, lsl #2]
2801 ldr r2, =dwrite_count_a
2813 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2814 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2816 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2818 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2819 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2822 stmfd r13!,{r4-r11,lr}
2824 ldr r0, =nes_registers
2827 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2829 ldrb r0, [REG_PC], #1
2830 tst REG_P_REST, #0xff<<8
2831 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2833 @ assumption: NMI can be set only on very first run, because it is only set once before vblank..
2834 tst REG_P_REST, #FCEU_IQNMI<<8
2836 tst REG_P_REST, #P_REST_I_FLAG
2837 @@ if I_FLAG=1, continue execution, don't trigger IRQ
2838 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
2839 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2840 @@ I_FLAG=0 and REST is checked, we have a IRQ
2847 tst REG_P_REST, #1<<16
2848 bne do_irq_hook_final
2850 ldr r0, =nes_registers
2853 ldmfd r13!,{r4-r11,lr}
2857 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2861 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2862 @ they must be in the same section
2868 .long op00, op01, op02, op03, op04, op05, op06, op07
2869 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2871 .long op10, op11, op12, op13, op14, op15, op16, op17
2872 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2874 .long op20, op21, op22, op23, op24, op25, op26, op27
2875 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2877 .long op30, op31, op32, op33, op34, op35, op36, op37
2878 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2880 .long op40, op41, op42, op43, op44, op45, op46, op47
2881 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2883 .long op50, op51, op52, op53, op54, op55, op56, op57
2884 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2886 .long op60, op61, op62, op63, op64, op65, op66, op67
2887 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2889 .long op70, op71, op72, op73, op74, op75, op76, op77
2890 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2892 .long op80, op81, op82, op83, op84, op85, op86, op87
2893 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2895 .long op90, op91, op92, op93, op94, op95, op96, op97
2896 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2898 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2899 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
2901 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
2902 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
2904 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
2905 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
2907 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
2908 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
2910 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
2911 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
2913 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
2914 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
2917 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
2934 #ifndef DEBUG_ASM_6502
2937 X_: .fill 0x20, 1, 0
2946 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2947 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2949 @@@ Undefined Opcodes
2959 @opDF: @ DCP $nnnn, X
2960 @opDB: @ DCP $nnnn, Y
2961 @opC3: @ DCP ($nn, X)
2962 @opD3: @ DCP ($nn), Y
2969 @opFF: @ ISB $nnnn, X
2970 @opFB: @ ISB $nnnn, Y
2971 @opE3: @ ISB ($nn, X)
2972 @opF3: @ ISB ($nn), Y
2990 @opA3: @ LAX ($nn, X)
2994 @opBF: @ LAX $nnnn, Y
2996 @opB3: @ LAX ($nn), Y
3001 @op3F: @ RLA $nnnn, X
3002 @op23: @ RLA ($nn, X)
3006 @op7F: @ RRA $nnnn, X
3007 @op63: @ RRA ($nn, X)
3011 op83: @ SAX ($nn, X)
3013 op9F: @ SHA $nnnn, Y
3014 op93: @ SHA ($nn), Y
3015 op9B: @ SHS $nnnn, Y
3016 op9E: @ SHX $nnnn, Y
3017 @op03: @ SLO ($nn, X)
3021 @op1F: @ SLO $nnnn, X
3025 @op5F: @ SRE $nnnn, X
3026 @op5B: @ SRE $nnnn, Y
3027 @op43: @ SRE ($nn, X)
3033 @@@@@@@@@@@@@@@@@@@@@@@@@@
3035 @@@@@@@@@@@@@@@@@@@@@@@@@@
3046 .globl nes_registers @ TODO: hide?
3048 .globl MapIRQHook @ (int a)
3049 #ifndef DEBUG_ASM_6502
3054 .globl nes_internal_ram
3057 .globl X6502_Reset_a @ (void);
3058 .globl X6502_Power_a @ (void);
3059 .globl X6502_Run_a @ (int32 cycles);
3060 .globl TriggerIRQ_a @ (void);
3061 .globl TriggerNMI_a @ (void);
3062 .globl TriggerNMINSF_a @ (void);
3063 .globl X6502_AddCycles_a @ (int x);
3064 .globl X6502_IRQBegin_a @ (int w);
3065 .globl X6502_IRQEnd_a @ (int w);
3066 .globl X6502_Rebase_a @ (void);
3071 .equiv X6502_Reset_a, reset_cpu
3072 .equiv X6502_Run_a, cpu_exec
3079 ldr r1, =nes_registers
3084 bne X6502_Power_loop1
3085 ldr r0, =cpu_exec_table
3092 mov r0, #FCEU_IQTEMP
3095 ldr r2, =nes_registers
3097 ldr r1, [r2, #0x10] @ REG_P_REST
3098 orr r1, r1, r0, lsl #8
3104 ldr r2, =nes_registers
3107 bic r1, r1, r0, lsl #8
3124 ldr r2, =nes_registers
3128 ldrsh r1, [r2, #0x1e]
3129 mvn r3, #47 @ r3=-48
3131 ldr r1, =MapIRQHook @ hack..
3132 strh r3, [r2, #0x1e]
3139 @ rebase PC when not executing or in memhandlers
3141 stmfd sp!,{REG_PC,REG_OP_TABLE}
3142 ldr REG_OP_TABLE, =cpu_exec_table
3143 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3144 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3147 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3148 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3153 @ the nasty MapIRQHook thing from FCE..
3154 @ test Gradius 2 (J) if you change this
3158 @ get irqhook cycles
3159 and r0, REG_CYCLE, #0xff00
3161 #ifndef DEBUG_ASM_6502
3162 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3163 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3164 mov REG_P_REST, REG_OP_TABLE @ r8
3166 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3168 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3170 mov REG_OP_TABLE, REG_P_REST @ got trashed because was in r12
3171 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3173 ldr r1, =mapirq_cyc_a
3178 ldrb r0, [REG_PC], #1
3179 bic REG_CYCLE, REG_CYCLE, #0xff00
3180 tst REG_P_REST, #0xff<<8
3181 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
3183 @ do some messing to find out which IRQ is pending..
3184 tst REG_P_REST, #P_REST_I_FLAG
3185 @@ if I_FLAG=1, continue execution, don't trigger IRQ
3186 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
3187 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
3188 @@ I_FLAG=0 and REST is checked, we have a IRQ
3193 ldr r1, =nes_registers
3195 @ get irqhook cycles
3196 and r0, REG_CYCLE, #0xff00
3197 bic REG_CYCLE, REG_CYCLE, #0xff00
3202 ldmfd r13!,{r4-r11,lr}
3204 #ifndef DEBUG_ASM_6502
3205 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3207 ldr r1, =mapirq_cyc_a
3214 @ vim:filetype=armasm