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
72 .macro FLUSH_TIMESTAMP reg
73 ldr r1, [REG_OP_TABLE, #OTOFFS_TIMESTAMP]
74 and \reg, REG_CYCLE, #0xff
76 bic REG_CYCLE, REG_CYCLE, #0xff
77 str r1, [REG_OP_TABLE, #OTOFFS_TIMESTAMP]
81 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
82 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
86 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
87 @@@ ¤¿¤À¤·³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤¤
89 @@@ ¤Ê¤ó¤«Ì¾Á°¤¬ÊѤÀ¤Ê(¤É¡¼¤Ç¤â¤¤¡¼¤±¤É¡¼
91 .macro CYCLE_NEXT n, hook_check=1
94 add REG_CYCLE, REG_CYCLE, #\n
95 subs REG_CYCLE, REG_CYCLE, #\n*48<<16
98 tst REG_P_REST, #1<<16
101 ldrb r0, [REG_PC], #1
102 tst REG_P_REST, #0xff<<8
103 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
105 @ do some messing to find out which IRQ is pending..
106 tst REG_P_REST, #FCEU_IQNMI<<8
108 tst REG_P_REST, #P_REST_I_FLAG
109 @@ if I_FLAG=1, continue execution, don't trigger IRQ
110 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
111 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
112 @@ I_FLAG=0 and REST is checked, we have a IRQ
117 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
118 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
122 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
123 @@@ CLI¡¦PHP¤Ê¤É¥Õ¥é¥°¤òÊѹ¹¤·¤¿¾ì¹ç¤Ï¤³¤ì
125 .macro CYCLE_NEXT_INT n
129 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
130 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
132 @@@ ¥¼¥í¥Ú¡¼¥¸¤«¤éÆɤà
135 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
136 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
140 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
151 ldrb REG_ADDR, [REG_ADDR, #1]
152 orr REG_ADDR, r0, REG_ADDR, lsl #8
155 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
156 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
160 .macro ZP_WRITE reg=r0
161 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
162 strb \reg, [REG_ADDR, REG_OP_TABLE]
166 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
173 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
174 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
176 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤
178 @@@ REG_ADDR => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
179 @@@ r0 => ½ñ¤¯¥Ð¥¤¥È(write)
180 @@@ r0 <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
184 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
187 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
189 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
191 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
199 tst REG_ADDR, #0x8000
201 tst REG_ADDR, #0xe000
204 bic r0, REG_ADDR, #0x1800
205 add r0, r0, #OTOFFS_NES_RAM
206 ldrb r0, [r0, REG_OP_TABLE]
207 @@ ¤È¤¤¤¦¤ï¤±¤Ç¥¸¥ã¥ó¥×¤¹¤ëɬÍפϤʤ¤
212 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
222 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
226 tst REG_ADDR, #0x8000
228 tst REG_ADDR, #0xe000
231 bic REG_ADDR, REG_ADDR, #0x1800
232 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
233 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
242 bl write_byte @ rmw first writes unmodified data
246 bl write_byte @ and only then modified (Blaster Master)
250 @@@ Write r0 to [addr]
256 tst REG_ADDR, #0xe000
257 biceq REG_ADDR, REG_ADDR, #0x1800
258 addeq REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
260 streqb r0, [REG_ADDR, REG_OP_TABLE]
265 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
266 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
267 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
268 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
269 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
274 add REG_ADDR, REG_ADDR, #1
276 orr r0, REG_PC, r0, lsl #8
280 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
281 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
283 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
289 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
290 strb r0, [r1, REG_S, lsr #24]
291 sub REG_S, REG_S, #1 << 24
296 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
298 strb r2, [r1, REG_S, lsr #24]
299 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
300 sub REG_S, REG_S, #1 << 24
301 strb r0, [r1, REG_S, lsr #24]
302 sub REG_S, REG_S, #1 << 24
307 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
308 add REG_S, REG_S, #1 << 24
309 ldrb r0, [r0, REG_S, lsr #24]
314 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
315 add REG_S, REG_S, #1 << 24
316 ldrb r1, [r0, REG_S, lsr #24]
317 add REG_S, REG_S, #1 << 24
318 ldrb r0, [r0, REG_S, lsr #24]
319 orr r0, r1, r0, lsl #8
322 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
323 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
325 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
332 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
333 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
335 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
338 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
341 ldrb r0, [REG_PC], #1
344 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
347 ldrb REG_ADDR, [REG_PC], #1
350 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
354 add REG_ADDR, REG_ADDR, REG_X
355 and REG_ADDR, REG_ADDR, #0xFF
358 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
362 add REG_ADDR, REG_ADDR, REG_Y
363 and REG_ADDR, REG_ADDR, #0xFF
366 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
373 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
378 add REG_ADDR, REG_ADDR, REG_Y
379 bic REG_ADDR, REG_ADDR, #0x10000
380 and r0,REG_ADDR,#0xff
382 addgt REG_CYCLE, REG_CYCLE, #1
383 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
386 @ Indirect Indexed (for writes and rmws)
390 add REG_ADDR, REG_ADDR, REG_Y
391 bic REG_ADDR, REG_ADDR, #0x10000
395 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
396 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
398 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
401 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
406 ldrneb REG_ADDR, [REG_PC], #1
407 ldrneb r0, [REG_PC], #1
408 ldreqh REG_ADDR, [REG_PC], #2
409 orrne REG_ADDR, REG_ADDR, r0, lsl #8
412 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
416 add REG_ADDR, REG_ADDR, REG_X
417 bic REG_ADDR, REG_ADDR, #0x10000
418 and r0,REG_ADDR,#0xff
420 addgt REG_CYCLE, REG_CYCLE, #1
421 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
424 @ Absolute Indexed (for writes and rmws)
427 add REG_ADDR, REG_ADDR, REG_X
428 bic REG_ADDR, REG_ADDR, #0x10000
431 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
435 add REG_ADDR, REG_ADDR, REG_Y
436 bic REG_ADDR, REG_ADDR, #0x10000
437 and r0,REG_ADDR,#0xff
439 addgt REG_CYCLE, REG_CYCLE, #1
440 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
443 @ Absolute Indexed (for writes and rmws)
446 add REG_ADDR, REG_ADDR, REG_Y
447 bic REG_ADDR, REG_ADDR, #0x10000
450 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
453 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
454 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
455 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
461 orrne REG_NZ, REG_NZ, #0x80 << 24
463 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
464 and r0, r0, #P_REST_FLAGS
465 orr REG_P_REST, REG_P_REST, r0
470 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
471 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
474 and r0, REG_P_REST, #P_REST_FLAGS
475 tst REG_NZ, #0x80 << 24
476 orrne r0, r0, #P_N_FLAG
478 orreq r0, r0, #P_Z_FLAG
479 orr r0, r0, #P_R_FLAG
490 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
491 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
500 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
501 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
503 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
508 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
509 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
513 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
518 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
523 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
528 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
533 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
538 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
543 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
546 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
547 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
549 @@@ TAX/TXA/TAY/TYA/TSX/TXS
551 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
554 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
558 mov REG_X, REG_A, lsr #24
559 mov REG_NZ, REG_A, asr #24
564 mov REG_A, REG_X, lsl #24
565 mov REG_NZ, REG_A, asr #24
570 mov REG_Y, REG_A, lsr #24
571 mov REG_NZ, REG_A, asr #24
576 mov REG_A, REG_Y, lsl #24
577 mov REG_NZ, REG_A, asr #24
582 mov REG_X, REG_S, lsr #24
583 orr REG_NZ, REG_X, REG_X, lsl #24
588 bic REG_S, REG_S, #0xFF << 24
589 orr REG_S, REG_S, REG_X, lsl #24
593 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
594 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
599 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
603 mov r0, REG_A, lsr #24
610 orr r0, r0, #P_B_FLAG
617 mov REG_A, r0, lsl #24
618 mov REG_NZ, REG_A, asr #24
627 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
628 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
638 mov REG_A, r0, lsl #24
639 mov REG_NZ, REG_A, asr #24
644 orr REG_NZ, r0, r0, lsl #24
763 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
764 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
774 mov r0, REG_A, lsr #24
854 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
855 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
857 @@@ INC/INX/INY/DEC/DEX/DEY
858 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
859 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
868 orr REG_NZ, r0, r0, lsl #24
873 and \reg, \reg, #0xFF
874 orr REG_NZ, \reg, \reg, lsl #24
880 orr REG_NZ, r0, r0, lsl #24
885 and \reg, \reg, #0xFF
886 orr REG_NZ, \reg, \reg, lsl #24
982 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
983 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
987 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
990 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
991 movs r1, REG_P_REST, lsr #1
992 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
994 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
995 adcs REG_A, REG_A, r0, ror #8
996 mov REG_NZ, REG_A, asr #24
997 adc REG_P_REST, r1, r1
998 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
999 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1003 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1004 movs r1, REG_P_REST, lsr #1
1005 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1006 sbcs REG_A, REG_A, r0, lsl #24
1007 and REG_A, REG_A, #0xFF << 24
1008 mov REG_NZ, REG_A, asr #24
1009 adc REG_P_REST, r1, r1
1010 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1011 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1037 op7D: @ ADC $nnnn, X
1043 op79: @ ADC $nnnn, Y
1049 op61: @ ADC ($nn, X)
1055 op71: @ ADC ($nn), Y
1085 opFD: @ SBC $nnnn, X
1091 opF9: @ SBC $nnnn, Y
1097 opE1: @ SBC ($nn, X)
1103 opF1: @ SBC ($nn), Y
1110 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1111 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1115 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1121 and REG_A, REG_A, r0, lsl #24
1122 mov REG_NZ, REG_A, asr #24
1126 eor REG_A, REG_A, r0, lsl #24
1127 mov REG_NZ, REG_A, asr #24
1131 orr REG_A, REG_A, r0, lsl #24
1132 mov REG_NZ, REG_A, asr #24
1158 op3D: @ AND $nnnn, X
1164 op39: @ AND $nnnn, Y
1170 op21: @ AND ($nn, X)
1176 op31: @ AND ($nn), Y
1206 op5D: @ EOR $nnnn, X
1212 op59: @ EOR $nnnn, Y
1218 op41: @ EOR ($nn, X)
1224 op51: @ EOR ($nn), Y
1254 op1D: @ ORA $nnnn, X
1260 op19: @ ORA $nnnn, Y
1266 op01: @ ORA ($nn, X)
1272 op11: @ ORA ($nn), Y
1280 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1281 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1285 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1291 subs REG_NZ, REG_A, r0, lsl #24
1292 mov REG_NZ, REG_NZ, asr #24
1293 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1294 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1298 mov r1, \reg, lsl #24
1299 subs REG_NZ, r1, r0, lsl #24
1300 mov REG_NZ, REG_NZ, asr #24
1301 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1302 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1336 opDD: @ CMP $nnnn, X
1342 opD9: @ CMP $nnnn, Y
1348 opC1: @ CMP ($nn, X)
1354 opD1: @ CMP ($nn), Y
1397 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1398 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1402 @@@ Z <= A ¢Ê M == 0
1410 and REG_NZ, r0, REG_A, lsr #24
1411 @@ R0[7] => C, R0[6] => N
1412 movs r0, r0, lsl #25
1413 orrcs REG_NZ, REG_NZ, #0x80 << 24
1414 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1415 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1431 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1432 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1436 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1441 movs REG_NZ, r0, lsl #25
1442 mov r0, REG_NZ, lsr #24
1443 mov REG_NZ, REG_NZ, asr #24
1444 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1445 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1449 movs REG_A, REG_A, lsl #1
1450 mov REG_NZ, REG_A, asr #24
1451 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1452 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1459 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1460 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1465 movs REG_NZ, REG_A, lsr #25
1466 mov REG_A, REG_NZ, lsl #24
1467 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1468 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1501 op1E: @ ASL $nnnn, X
1543 op5E: @ LSR $nnnn, X
1555 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1556 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1566 movs r1, REG_P_REST, lsr #1
1569 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1570 orrs REG_NZ, r0, r0, lsl #24
1572 adc REG_P_REST, r1, r1
1577 movs r1, REG_P_REST, lsr #1
1578 orrcs REG_A, REG_A, #0x80 << 16
1579 movs REG_A, REG_A, lsl #1
1580 mov REG_NZ, REG_A, asr #24
1581 adc REG_P_REST, r1, r1
1585 movs r1, REG_P_REST, lsr #1
1586 orrcs r0, r0, #0x100
1588 orr REG_NZ, r0, r0, lsl #24
1589 adc REG_P_REST, r1, r1
1593 movs r1, REG_P_REST, lsr #1
1594 mov REG_NZ, REG_A, rrx
1595 movs REG_NZ, REG_NZ, asr #24
1596 mov REG_A, REG_NZ, lsl #24
1597 adc REG_P_REST, r1, r1
1631 op3E: @ ROL $nnnn, X
1673 op7E: @ ROR $nnnn, X
1685 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1686 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1688 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1695 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1697 mov r3, r1 @ preserve immediate
1701 @@ R1 <- (PC&0xFF)+ReadValue
1705 addne REG_CYCLE, REG_CYCLE, #1
1706 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1710 ldreqsb r1, [REG_PC], #1
1712 add REG_PC, REG_PC, r1
1713 addeq REG_CYCLE, REG_CYCLE, #1
1714 subeq REG_CYCLE, REG_CYCLE, #1*48<<16
1721 ldrnesb r1, [REG_PC], #1
1723 add REG_PC, REG_PC, r1
1724 addne REG_CYCLE, REG_CYCLE, #1
1725 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1732 tst REG_P_REST, #P_REST_C_FLAG
1739 tst REG_P_REST, #P_REST_C_FLAG
1755 tst REG_NZ, #0x80 << 24
1756 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1761 tst REG_NZ, #0x80 << 24
1767 tst REG_P_REST, #P_REST_V_FLAG
1774 tst REG_P_REST, #P_REST_V_FLAG
1780 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1781 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1786 mov REG_A, r0, lsl #24
1788 mov REG_NZ, REG_A, asr #24
1792 movs r0, r0, lsl #25
1794 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1795 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1799 mov REG_NZ, REG_A, asr #24
1800 @@restore value to write
1810 mov r0,REG_ADDR, lsr #8
1818 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1819 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1821 eor REG_A,REG_A,r0, lsl #24
1823 mov REG_NZ, REG_A, asr #24
1827 and r1,REG_X,REG_A, lsr #24
1829 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1830 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1832 orr REG_NZ, REG_X, REG_X, lsl #24
1842 movs r1, REG_P_REST, lsr #1
1845 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1846 orrs REG_NZ, r0, r0, lsl #24
1848 adc REG_P_REST, r1, r1
1849 and REG_A,REG_A,r0,lsl #24
1853 movs r1, REG_P_REST, lsr #1
1854 orrcs r0, r0, #0x100
1858 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1859 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1889 op5F: @ SRE $nnnn, X
1900 op5B: @ SRE $nnnn, Y
1911 op43: @ SRE ($nn, X)
1922 op53: @ SRE ($nn), Y
1934 op9C: @ SHY $nnnn, X
1983 opFB: @ ISB $nnnn, Y
1996 opE3: @ ISB ($nn, X)
2009 opF3: @ ISB ($nn), Y
2040 opBF: @ LAX $nnnn, Y
2046 opA3: @ LAX ($nn, X)
2052 opB3: @ LAX ($nn), Y
2083 op1F: @ SLO $nnnn, X
2094 op1B: @ SLO $nnnn, Y
2105 op03: @ SLO ($nn, X)
2116 op13: @ SLO ($nn), Y
2161 opDF: @ DCP $nnnn, X
2174 opDB: @ DCP $nnnn, Y
2188 opC3: @ DCP ($nn, X)
2201 opD3: @ DCP ($nn), Y
2239 op3F: @ RLA $nnnn, X
2250 op3B: @ RLA $nnnn, Y
2261 op23: @ RLA ($nn, X)
2272 op33: @ RLA ($nn), Y
2312 op7F: @ RRA $nnnn, X
2325 op7B: @ RRA $nnnn, Y
2338 op63: @ RRA ($nn, X)
2351 op73: @ RRA ($nn), Y
2368 add REG_PC,REG_PC,#1
2372 add REG_PC,REG_PC,#2
2381 add REG_PC,REG_PC,#1
2392 op1C: @ NOP $nnnn, X
2398 add REG_PC,REG_PC,#2
2406 add REG_PC,REG_PC,#1
2411 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2412 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2422 and r0, REG_ADDR, #0xFF
2424 beq jmp_indirect_bug
2430 @@ BUG is : to not read word at REG_ADDR, because it loops
2431 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2435 and REG_ADDR, REG_ADDR, #0xff00
2437 orr r0, REG_PC, r0, lsl #8
2443 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2444 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2459 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2460 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2470 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2480 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2481 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2490 add REG_PC, REG_PC, #1
2491 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2494 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2497 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2498 mov REG_ADDR, #0x10000
2499 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2504 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2505 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2521 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2522 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2539 @@@ WARNING: decrements REG_PC
2542 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2543 sub REG_PC, REG_PC, #1
2546 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2549 tst REG_P_REST, #FCEU_IQNMI<<8
2550 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2551 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2552 mov REG_ADDR, #0x10000
2553 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2554 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2559 add REG_CYCLE, REG_CYCLE, #7
2560 subs REG_CYCLE, REG_CYCLE, #7*48<<16
2562 ldrb r0, [REG_PC], #1
2563 tst REG_P_REST, #0xff<<8
2564 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2566 tst REG_P_REST, #P_REST_I_FLAG
2567 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2577 stmfd r13!,{r4-r11,lr}
2579 ldr r0, =nes_registers
2584 @@REG_P_REST = 0, don't touch REG_S
2585 bic REG_P_REST, REG_P_REST, #0xff
2587 @ fceu: set MapIRQHook present flag
2588 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2590 orrne REG_P_REST, REG_P_REST, #1<<16
2591 biceq REG_P_REST, REG_P_REST, #1<<16
2593 @@ R bit is always 1
2594 orr REG_NZ, REG_NZ, #P_R_FLAG
2597 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2599 mov REG_ADDR, #0x10000
2600 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2604 ldr r0, =nes_registers
2607 ldmfd r13!,{r4-r11,lr}
2611 @@@ low-level memhandlers
2615 #ifndef DEBUG_ASM_6502
2619 orr r1, r1, r1, lsr #4
2620 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2624 mov r1, REG_ADDR, lsr #11
2625 ldr r2, [r2, r1, lsl #2]
2626 ldrb r0, [r2, REG_ADDR]
2632 @ must preserve r3 for the callers too
2633 @ TODO: check if all of saves are needed, _DB (is full needed?)
2634 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2635 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2636 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2638 mov REG_P_REST, r3 @ r8
2640 #ifndef DEBUG_ASM_6502
2642 bic r0, REG_ADDR, #0x00ff0000
2644 ldr pc, [r2, r0, lsl #2]
2646 ldr r2, =dread_count_a
2654 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2657 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2658 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2659 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2660 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2665 FLUSH_TIMESTAMP r2 @ Blaster Master, more...
2666 #ifndef DEBUG_ASM_6502
2667 @ must preserve r0 (data) and r3 for the callers
2668 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2669 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2670 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2672 mov REG_P_REST, r3 @ r8
2673 mov REG_CYCLE, r0 @ r11
2677 bic r0, REG_ADDR, #0x00ff0000
2679 ldr pc, [r2, r0, lsl #2]
2681 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2685 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2686 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2687 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2689 ldr r1, =dwrite_count_a
2693 orr r0, r0, REG_ADDR, lsl #8
2694 str r0, [r2, r1, lsl #2]
2695 ldr r2, =dwrite_count_a
2707 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2708 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2710 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2712 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2713 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2716 stmfd r13!,{r4-r11,lr}
2718 ldr r0, =nes_registers
2721 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2728 tst REG_P_REST, #1<<16
2729 blne do_irq_hook_noflushts
2731 ldr r0, =nes_registers
2734 ldmfd r13!,{r4-r11,lr}
2738 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2742 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2743 @ they must be in the same section
2749 .long op00, op01, op02, op03, op04, op05, op06, op07
2750 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2752 .long op10, op11, op12, op13, op14, op15, op16, op17
2753 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2755 .long op20, op21, op22, op23, op24, op25, op26, op27
2756 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2758 .long op30, op31, op32, op33, op34, op35, op36, op37
2759 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2761 .long op40, op41, op42, op43, op44, op45, op46, op47
2762 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2764 .long op50, op51, op52, op53, op54, op55, op56, op57
2765 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2767 .long op60, op61, op62, op63, op64, op65, op66, op67
2768 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2770 .long op70, op71, op72, op73, op74, op75, op76, op77
2771 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2773 .long op80, op81, op82, op83, op84, op85, op86, op87
2774 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2776 .long op90, op91, op92, op93, op94, op95, op96, op97
2777 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2779 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2780 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
2782 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
2783 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
2785 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
2786 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
2788 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
2789 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
2791 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
2792 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
2794 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
2795 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
2798 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
2808 @ TODO: write code which keeps it up-to-date
2816 #ifndef DEBUG_ASM_6502
2819 X_: .fill 0x20, 1, 0
2828 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2829 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2831 @@@ Undefined Opcodes
2841 @opDF: @ DCP $nnnn, X
2842 @opDB: @ DCP $nnnn, Y
2843 @opC3: @ DCP ($nn, X)
2844 @opD3: @ DCP ($nn), Y
2851 @opFF: @ ISB $nnnn, X
2852 @opFB: @ ISB $nnnn, Y
2853 @opE3: @ ISB ($nn, X)
2854 @opF3: @ ISB ($nn), Y
2872 @opA3: @ LAX ($nn, X)
2876 @opBF: @ LAX $nnnn, Y
2878 @opB3: @ LAX ($nn), Y
2883 @op3F: @ RLA $nnnn, X
2884 @op23: @ RLA ($nn, X)
2888 @op7F: @ RRA $nnnn, X
2889 @op63: @ RRA ($nn, X)
2893 op83: @ SAX ($nn, X)
2895 op9F: @ SHA $nnnn, Y
2896 op93: @ SHA ($nn), Y
2897 op9B: @ SHS $nnnn, Y
2898 op9E: @ SHX $nnnn, Y
2899 @op03: @ SLO ($nn, X)
2903 @op1F: @ SLO $nnnn, X
2907 @op5F: @ SRE $nnnn, X
2908 @op5B: @ SRE $nnnn, Y
2909 @op43: @ SRE ($nn, X)
2915 @@@@@@@@@@@@@@@@@@@@@@@@@@
2917 @@@@@@@@@@@@@@@@@@@@@@@@@@
2928 .globl nes_registers @ TODO: hide?
2930 .globl MapIRQHook @ (int a)
2931 #ifndef DEBUG_ASM_6502
2936 .globl nes_internal_ram
2939 .globl X6502_Reset_a @ (void);
2940 .globl X6502_Power_a @ (void);
2941 .globl X6502_Run_a @ (int32 cycles);
2942 .globl TriggerIRQ_a @ (void);
2943 .globl TriggerNMI_a @ (void);
2944 .globl TriggerNMINSF_a @ (void);
2945 .globl X6502_AddCycles_a @ (int x);
2946 .globl X6502_IRQBegin_a @ (int w);
2947 .globl X6502_IRQEnd_a @ (int w);
2948 .globl X6502_Rebase_a @ (void);
2953 .equiv X6502_Reset_a, reset_cpu
2954 .equiv X6502_Run_a, cpu_exec
2961 ldr r1, =nes_registers
2966 bne X6502_Power_loop1
2967 ldr r0, =cpu_exec_table
2974 mov r0, #FCEU_IQTEMP
2977 ldr r2, =nes_registers
2979 ldr r1, [r2, #0x10] @ REG_P_REST
2980 orr r1, r1, r0, lsl #8
2986 ldr r2, =nes_registers
2989 bic r1, r1, r0, lsl #8
3006 ldr r2, =nes_registers
3010 ldrsh r1, [r2, #0x1e]
3011 mvn r3, #47 @ r3=-48
3013 strh r0, [r2, #0x1e]
3017 @ rebase PC when not executing or in memhandlers
3019 stmfd sp!,{REG_PC,REG_OP_TABLE}
3020 ldr REG_OP_TABLE, =cpu_exec_table
3021 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3022 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3025 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3026 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3031 @ the nasty MapIRQHook thing from FCE..
3032 @ test Gradius 2 (J) if you change this
3036 do_irq_hook_noflushts:
3037 #ifndef DEBUG_ASM_6502
3038 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3039 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3040 mov REG_P_REST, lr @ r8
3042 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3044 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3046 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
3048 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3050 ldr r1, =mapirq_cyc_a
3057 @ vim:filetype=armasm