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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
408 .macro ABS_ADDR update_db=0
410 ldrb r0, [REG_PC, #1]
411 ldrb REG_ADDR, [REG_PC], #2
412 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
413 orr REG_ADDR, REG_ADDR, r0, lsl #8
416 ldrneb REG_ADDR, [REG_PC], #1
417 ldrneb r0, [REG_PC], #1
418 ldreqh REG_ADDR, [REG_PC], #2
419 orrne REG_ADDR, REG_ADDR, r0, lsl #8
423 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
427 add REG_ADDR, REG_ADDR, REG_X
428 bic REG_ADDR, REG_ADDR, #0x10000
429 and r0,REG_ADDR,#0xff
431 addgt REG_CYCLE, REG_CYCLE, #1
432 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
435 @ Absolute Indexed (for writes and rmws)
438 add REG_ADDR, REG_ADDR, REG_X
439 bic REG_ADDR, REG_ADDR, #0x10000
442 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
445 ABS_ADDR 1 @ a hack needed for Paperboy, Dirty Harry controls to work
446 add REG_ADDR, REG_ADDR, REG_Y
447 bic REG_ADDR, REG_ADDR, #0x10000
448 and r0,REG_ADDR,#0xff
450 addgt REG_CYCLE, REG_CYCLE, #1
451 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
454 @ Absolute Indexed (for writes and rmws)
457 add REG_ADDR, REG_ADDR, REG_Y
458 bic REG_ADDR, REG_ADDR, #0x10000
461 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
464 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
465 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
466 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
472 orrne REG_NZ, REG_NZ, #0x80 << 24
474 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
475 and r0, r0, #P_REST_FLAGS
476 orr REG_P_REST, REG_P_REST, r0
481 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
482 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
485 and r0, REG_P_REST, #P_REST_FLAGS
486 tst REG_NZ, #0x80 << 24
487 orrne r0, r0, #P_N_FLAG
489 orreq r0, r0, #P_Z_FLAG
490 orr r0, r0, #P_R_FLAG
501 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
502 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
511 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
512 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
514 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
519 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
520 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
524 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
529 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
534 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
539 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
544 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
549 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
554 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
557 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
558 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
560 @@@ TAX/TXA/TAY/TYA/TSX/TXS
562 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
565 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
569 mov REG_X, REG_A, lsr #24
570 mov REG_NZ, REG_A, asr #24
575 mov REG_A, REG_X, lsl #24
576 mov REG_NZ, REG_A, asr #24
581 mov REG_Y, REG_A, lsr #24
582 mov REG_NZ, REG_A, asr #24
587 mov REG_A, REG_Y, lsl #24
588 mov REG_NZ, REG_A, asr #24
593 mov REG_X, REG_S, lsr #24
594 orr REG_NZ, REG_X, REG_X, lsl #24
599 bic REG_S, REG_S, #0xFF << 24
600 orr REG_S, REG_S, REG_X, lsl #24
604 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
605 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
610 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
614 mov r0, REG_A, lsr #24
621 orr r0, r0, #P_B_FLAG
628 mov REG_A, r0, lsl #24
629 mov REG_NZ, REG_A, asr #24
638 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
639 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
649 mov REG_A, r0, lsl #24
650 mov REG_NZ, REG_A, asr #24
655 orr REG_NZ, r0, r0, lsl #24
783 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
784 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
794 mov r0, REG_A, lsr #24
881 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
882 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
884 @@@ INC/INX/INY/DEC/DEX/DEY
885 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
886 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
895 orr REG_NZ, r0, r0, lsl #24
900 and \reg, \reg, #0xFF
901 orr REG_NZ, \reg, \reg, lsl #24
907 orr REG_NZ, r0, r0, lsl #24
912 and \reg, \reg, #0xFF
913 orr REG_NZ, \reg, \reg, lsl #24
1013 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1014 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1018 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1021 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1022 movs r1, REG_P_REST, lsr #1
1023 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1024 subcs r0, r0, #0x100
1025 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1026 adcs REG_A, REG_A, r0, ror #8
1027 mov REG_NZ, REG_A, asr #24
1028 adc REG_P_REST, r1, r1
1029 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1030 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1034 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1035 movs r1, REG_P_REST, lsr #1
1036 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1037 sbcs REG_A, REG_A, r0, lsl #24
1038 and REG_A, REG_A, #0xFF << 24
1039 mov REG_NZ, REG_A, asr #24
1040 adc REG_P_REST, r1, r1
1041 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1042 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1069 op7D: @ ADC $nnnn, X
1076 op79: @ ADC $nnnn, Y
1083 op61: @ ADC ($nn, X)
1090 op71: @ ADC ($nn), Y
1122 opFD: @ SBC $nnnn, X
1129 opF9: @ SBC $nnnn, Y
1136 opE1: @ SBC ($nn, X)
1143 opF1: @ SBC ($nn), Y
1151 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1152 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1156 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1162 and REG_A, REG_A, r0, lsl #24
1163 mov REG_NZ, REG_A, asr #24
1167 eor REG_A, REG_A, r0, lsl #24
1168 mov REG_NZ, REG_A, asr #24
1172 orr REG_A, REG_A, r0, lsl #24
1173 mov REG_NZ, REG_A, asr #24
1200 op3D: @ AND $nnnn, X
1207 op39: @ AND $nnnn, Y
1214 op21: @ AND ($nn, X)
1221 op31: @ AND ($nn), Y
1253 op5D: @ EOR $nnnn, X
1260 op59: @ EOR $nnnn, Y
1267 op41: @ EOR ($nn, X)
1274 op51: @ EOR ($nn), Y
1306 op1D: @ ORA $nnnn, X
1313 op19: @ ORA $nnnn, Y
1320 op01: @ ORA ($nn, X)
1327 op11: @ ORA ($nn), Y
1336 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1337 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1341 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1347 subs REG_NZ, REG_A, r0, lsl #24
1348 mov REG_NZ, REG_NZ, asr #24
1349 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1350 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1354 mov r1, \reg, lsl #24
1355 subs REG_NZ, r1, r0, lsl #24
1356 mov REG_NZ, REG_NZ, asr #24
1357 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1358 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1393 opDD: @ CMP $nnnn, X
1400 opD9: @ CMP $nnnn, Y
1407 opC1: @ CMP ($nn, X)
1414 opD1: @ CMP ($nn), Y
1460 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1461 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1465 @@@ Z <= A ¢Ê M == 0
1473 and REG_NZ, r0, REG_A, lsr #24
1474 @@ R0[7] => C, R0[6] => N
1475 movs r0, r0, lsl #25
1476 orrcs REG_NZ, REG_NZ, #0x80 << 24
1477 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1478 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1495 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1496 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1500 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1505 movs REG_NZ, r0, lsl #25
1506 mov r0, REG_NZ, lsr #24
1507 mov REG_NZ, REG_NZ, 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
1513 movs REG_A, REG_A, lsl #1
1514 mov REG_NZ, REG_A, asr #24
1515 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1516 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1523 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1524 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1529 movs REG_NZ, REG_A, lsr #25
1530 mov REG_A, REG_NZ, lsl #24
1531 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1532 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1566 op1E: @ ASL $nnnn, X
1610 op5E: @ LSR $nnnn, X
1623 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1624 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1634 movs r1, REG_P_REST, lsr #1
1637 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1638 orrs REG_NZ, r0, r0, lsl #24
1640 adc REG_P_REST, r1, r1
1645 movs r1, REG_P_REST, lsr #1
1646 orrcs REG_A, REG_A, #0x80 << 16
1647 movs REG_A, REG_A, lsl #1
1648 mov REG_NZ, REG_A, asr #24
1649 adc REG_P_REST, r1, r1
1653 movs r1, REG_P_REST, lsr #1
1654 orrcs r0, r0, #0x100
1656 orr REG_NZ, r0, r0, lsl #24
1657 adc REG_P_REST, r1, r1
1661 movs r1, REG_P_REST, lsr #1
1662 mov REG_NZ, REG_A, rrx
1663 movs REG_NZ, REG_NZ, asr #24
1664 mov REG_A, REG_NZ, lsl #24
1665 adc REG_P_REST, r1, r1
1700 op3E: @ ROL $nnnn, X
1744 op7E: @ ROR $nnnn, X
1757 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1758 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1760 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1767 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1769 mov r3, r1 @ preserve immediate
1773 @@ R1 <- (PC&0xFF)+ReadValue
1777 addne REG_CYCLE, REG_CYCLE, #1
1778 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1782 ldreqsb r1, [REG_PC], #1
1784 add REG_PC, REG_PC, r1
1785 addeq REG_CYCLE, REG_CYCLE, #1
1786 subeq REG_CYCLE, REG_CYCLE, #1*48<<16
1793 ldrnesb r1, [REG_PC], #1
1795 add REG_PC, REG_PC, r1
1796 addne REG_CYCLE, REG_CYCLE, #1
1797 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1804 tst REG_P_REST, #P_REST_C_FLAG
1811 tst REG_P_REST, #P_REST_C_FLAG
1827 tst REG_NZ, #0x80 << 24
1828 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1833 tst REG_NZ, #0x80 << 24
1839 tst REG_P_REST, #P_REST_V_FLAG
1846 tst REG_P_REST, #P_REST_V_FLAG
1852 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1853 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1858 mov REG_A, r0, lsl #24
1860 mov REG_NZ, REG_A, asr #24
1864 movs r0, r0, lsl #25
1866 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1867 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1871 mov REG_NZ, REG_A, asr #24
1872 @@restore value to write
1882 mov r0,REG_ADDR, lsr #8
1890 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1891 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1893 eor REG_A,REG_A,r0, lsl #24
1895 mov REG_NZ, REG_A, asr #24
1899 and r1,REG_X,REG_A, lsr #24
1901 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1902 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1904 orr REG_NZ, REG_X, REG_X, lsl #24
1914 movs r1, REG_P_REST, lsr #1
1917 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1918 orrs REG_NZ, r0, r0, lsl #24
1920 adc REG_P_REST, r1, r1
1921 and REG_A,REG_A,r0,lsl #24
1925 movs r1, REG_P_REST, lsr #1
1926 orrcs r0, r0, #0x100
1930 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1931 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1962 op5F: @ SRE $nnnn, X
1974 op5B: @ SRE $nnnn, Y
1986 op43: @ SRE ($nn, X)
1998 op53: @ SRE ($nn), Y
2011 op9C: @ SHY $nnnn, X
2063 opFB: @ ISB $nnnn, Y
2077 opE3: @ ISB ($nn, X)
2091 opF3: @ ISB ($nn), Y
2124 opBF: @ LAX $nnnn, Y
2131 opA3: @ LAX ($nn, X)
2138 opB3: @ LAX ($nn), Y
2172 op1F: @ SLO $nnnn, X
2184 op1B: @ SLO $nnnn, Y
2196 op03: @ SLO ($nn, X)
2208 op13: @ SLO ($nn), Y
2255 opDF: @ DCP $nnnn, X
2269 opDB: @ DCP $nnnn, Y
2284 opC3: @ DCP ($nn, X)
2298 opD3: @ DCP ($nn), Y
2338 op3F: @ RLA $nnnn, X
2350 op3B: @ RLA $nnnn, Y
2362 op23: @ RLA ($nn, X)
2374 op33: @ RLA ($nn), Y
2416 op7F: @ RRA $nnnn, X
2430 op7B: @ RRA $nnnn, Y
2444 op63: @ RRA ($nn, X)
2458 op73: @ RRA ($nn), Y
2476 add REG_PC,REG_PC,#1
2480 add REG_PC,REG_PC,#2
2489 add REG_PC,REG_PC,#1
2500 op1C: @ NOP $nnnn, X
2506 add REG_PC,REG_PC,#2
2514 add REG_PC,REG_PC,#1
2519 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2520 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2531 and r0, REG_ADDR, #0xFF
2533 beq jmp_indirect_bug
2539 @@ BUG is : to not read word at REG_ADDR, because it loops
2540 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2544 and REG_ADDR, REG_ADDR, #0xff00
2546 orr r0, REG_PC, r0, lsl #8
2552 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2553 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2568 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2569 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2579 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2589 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2590 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2599 add REG_PC, REG_PC, #1
2600 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2603 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2606 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2607 mov REG_ADDR, #0x10000
2608 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2613 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2614 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2630 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2631 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2648 @@@ WARNING: decrements REG_PC
2651 add REG_CYCLE, REG_CYCLE, #7
2652 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2653 sub REG_PC, REG_PC, #1
2656 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2659 tst REG_P_REST, #FCEU_IQNMI<<8
2660 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2661 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2662 mov REG_ADDR, #0x10000
2663 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2664 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2669 subs REG_CYCLE, REG_CYCLE, #7*48<<16
2671 ldrb r0, [REG_PC], #1
2672 tst REG_P_REST, #0xff<<8
2673 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2675 tst REG_P_REST, #P_REST_I_FLAG
2676 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2686 stmfd r13!,{r4-r11,lr}
2688 ldr r0, =nes_registers
2693 @@REG_P_REST = 0, don't touch REG_S
2694 bic REG_P_REST, REG_P_REST, #0xff
2696 @ fceu: set MapIRQHook present flag
2697 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2699 orrne REG_P_REST, REG_P_REST, #1<<16
2700 biceq REG_P_REST, REG_P_REST, #1<<16
2702 @@ R bit is always 1
2703 orr REG_NZ, REG_NZ, #P_R_FLAG
2706 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2708 mov REG_ADDR, #0x10000
2709 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2713 ldr r0, =nes_registers
2716 ldmfd r13!,{r4-r11,lr}
2720 @@@ low-level memhandlers
2724 @ disabled because no improvements noticed, only causes trouble (with gg for example)
2726 @ try to avoid lookup of every address at least for ROM and RAM areas
2727 @ I've verified that if ARead[0xfff0] points to CartBR, it is always normal ROM read.
2731 orr r1, r1, r1, lsr #4
2732 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2736 mov r1, REG_ADDR, lsr #11
2737 ldr r2, [r2, r1, lsl #2]
2738 ldrb r0, [r2, REG_ADDR]
2744 @ must preserve r3 for the callers too
2745 @ TODO: check if all of saves are needed, _DB (is full needed?)
2746 FLUSH_TIMESTAMP r2 @ needed for TryFixit1
2747 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2748 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2749 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2751 mov REG_P_REST, r3 @ r8
2753 #ifndef DEBUG_ASM_6502
2755 bic r0, REG_ADDR, #0x00ff0000
2757 ldr pc, [r2, r0, lsl #2]
2759 ldr r2, =dread_count_a
2767 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2770 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2771 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2772 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2773 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2778 FLUSH_TIMESTAMP r2 @ Blaster Master, more...
2779 #ifndef DEBUG_ASM_6502
2780 @ must preserve r0 (data) and r3 for the callers
2781 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2782 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2783 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2785 mov REG_P_REST, r3 @ r8
2786 mov REG_CYCLE, r0 @ r11
2790 bic r0, REG_ADDR, #0x00ff0000
2792 ldr pc, [r2, r0, lsl #2]
2794 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2798 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2799 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2800 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2802 ldr r1, =dwrite_count_a
2806 orr r0, r0, REG_ADDR, lsl #8
2807 str r0, [r2, r1, lsl #2]
2808 ldr r2, =dwrite_count_a
2820 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2821 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2823 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2825 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2826 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2829 stmfd r13!,{r4-r11,lr}
2831 ldr r0, =nes_registers
2834 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2836 ldrb r0, [REG_PC], #1
2837 tst REG_P_REST, #0xff<<8
2838 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2840 @ assumption: NMI can be set only on very first run, because it is only set once before vblank..
2841 tst REG_P_REST, #FCEU_IQNMI<<8
2843 tst REG_P_REST, #P_REST_I_FLAG
2844 @@ if I_FLAG=1, continue execution, don't trigger IRQ
2845 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
2846 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2847 @@ I_FLAG=0 and REST is checked, we have a IRQ
2854 tst REG_P_REST, #1<<16
2855 bne do_irq_hook_final
2857 ldr r0, =nes_registers
2860 ldmfd r13!,{r4-r11,lr}
2864 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2868 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2869 @ they must be in the same section
2875 .long op00, op01, op02, op03, op04, op05, op06, op07
2876 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2878 .long op10, op11, op12, op13, op14, op15, op16, op17
2879 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2881 .long op20, op21, op22, op23, op24, op25, op26, op27
2882 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2884 .long op30, op31, op32, op33, op34, op35, op36, op37
2885 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2887 .long op40, op41, op42, op43, op44, op45, op46, op47
2888 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2890 .long op50, op51, op52, op53, op54, op55, op56, op57
2891 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2893 .long op60, op61, op62, op63, op64, op65, op66, op67
2894 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2896 .long op70, op71, op72, op73, op74, op75, op76, op77
2897 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2899 .long op80, op81, op82, op83, op84, op85, op86, op87
2900 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2902 .long op90, op91, op92, op93, op94, op95, op96, op97
2903 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2905 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2906 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
2908 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
2909 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
2911 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
2912 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
2914 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
2915 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
2917 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
2918 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
2920 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
2921 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
2924 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
2941 #ifndef DEBUG_ASM_6502
2944 X_: .fill 0x20, 1, 0
2953 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2954 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2956 @@@ Undefined Opcodes
2966 @opDF: @ DCP $nnnn, X
2967 @opDB: @ DCP $nnnn, Y
2968 @opC3: @ DCP ($nn, X)
2969 @opD3: @ DCP ($nn), Y
2976 @opFF: @ ISB $nnnn, X
2977 @opFB: @ ISB $nnnn, Y
2978 @opE3: @ ISB ($nn, X)
2979 @opF3: @ ISB ($nn), Y
2997 @opA3: @ LAX ($nn, X)
3001 @opBF: @ LAX $nnnn, Y
3003 @opB3: @ LAX ($nn), Y
3008 @op3F: @ RLA $nnnn, X
3009 @op23: @ RLA ($nn, X)
3013 @op7F: @ RRA $nnnn, X
3014 @op63: @ RRA ($nn, X)
3018 op83: @ SAX ($nn, X)
3020 op9F: @ SHA $nnnn, Y
3021 op93: @ SHA ($nn), Y
3022 op9B: @ SHS $nnnn, Y
3023 op9E: @ SHX $nnnn, Y
3024 @op03: @ SLO ($nn, X)
3028 @op1F: @ SLO $nnnn, X
3032 @op5F: @ SRE $nnnn, X
3033 @op5B: @ SRE $nnnn, Y
3034 @op43: @ SRE ($nn, X)
3040 @@@@@@@@@@@@@@@@@@@@@@@@@@
3042 @@@@@@@@@@@@@@@@@@@@@@@@@@
3053 .globl nes_registers @ TODO: hide?
3055 .globl MapIRQHook @ (int a)
3056 #ifndef DEBUG_ASM_6502
3062 .globl nes_internal_ram
3065 .globl X6502_Reset_a @ (void);
3066 .globl X6502_Power_a @ (void);
3067 .globl X6502_Run_a @ (int32 cycles);
3068 .globl TriggerIRQ_a @ (void);
3069 .globl TriggerNMI_a @ (void);
3070 .globl TriggerNMINSF_a @ (void);
3071 .globl X6502_AddCycles_a @ (int x);
3072 .globl X6502_IRQBegin_a @ (int w);
3073 .globl X6502_IRQEnd_a @ (int w);
3074 .globl X6502_Rebase_a @ (void);
3079 .equiv X6502_Reset_a, reset_cpu
3080 .equiv X6502_Run_a, cpu_exec
3087 ldr r1, =nes_registers
3092 bne X6502_Power_loop1
3093 ldr r0, =cpu_exec_table
3100 mov r0, #FCEU_IQTEMP
3103 ldr r2, =nes_registers
3105 ldr r1, [r2, #0x10] @ REG_P_REST
3106 orr r1, r1, r0, lsl #8
3112 ldr r2, =nes_registers
3115 bic r1, r1, r0, lsl #8
3132 ldr r2, =nes_registers
3136 ldrsh r1, [r2, #0x1e]
3137 mvn r3, #47 @ r3=-48
3139 ldr r1, =MapIRQHook @ hack..
3140 strh r3, [r2, #0x1e]
3147 @ rebase PC when not executing or in memhandlers
3149 stmfd sp!,{REG_PC,REG_OP_TABLE}
3150 ldr REG_OP_TABLE, =cpu_exec_table
3151 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3152 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3155 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3156 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3161 @ the nasty MapIRQHook thing from FCE..
3162 @ test Gradius 2 (J) if you change this
3166 @ get irqhook cycles
3167 and r0, REG_CYCLE, #0xff00
3169 #ifndef DEBUG_ASM_6502
3170 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3171 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3172 mov REG_P_REST, REG_OP_TABLE @ r8
3174 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3176 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3178 mov REG_OP_TABLE, REG_P_REST @ got trashed because was in r12
3179 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3181 ldr r1, =mapirq_cyc_a
3186 ldrb r0, [REG_PC], #1
3187 bic REG_CYCLE, REG_CYCLE, #0xff00
3188 tst REG_P_REST, #0xff<<8
3189 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
3191 @ do some messing to find out which IRQ is pending..
3192 tst REG_P_REST, #P_REST_I_FLAG
3193 @@ if I_FLAG=1, continue execution, don't trigger IRQ
3194 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
3195 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
3196 @@ I_FLAG=0 and REST is checked, we have a IRQ
3201 ldr r1, =nes_registers
3203 @ get irqhook cycles
3204 and r0, REG_CYCLE, #0xff00
3205 bic REG_CYCLE, REG_CYCLE, #0xff00
3210 ldmfd r13!,{r4-r11,lr}
3212 #ifndef DEBUG_ASM_6502
3213 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3215 ldr r1, =mapirq_cyc_a
3222 @ vim:filetype=armasm