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, hook_check=1, do_cyc_add=1
98 add REG_CYCLE, REG_CYCLE, #\n
100 subs REG_CYCLE, REG_CYCLE, #\n*48<<16
103 tst REG_P_REST, #1<<16
106 ldrb r0, [REG_PC], #1
107 tst REG_P_REST, #0xff<<8
108 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
110 @ do some messing to find out which IRQ is pending..
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 rom_optimize=1
211 tst REG_ADDR, #0x8000
214 tst REG_ADDR, #0xe000
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¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
239 tst REG_ADDR, #0x8000
241 tst REG_ADDR, #0xe000
244 bic REG_ADDR, REG_ADDR, #0x1800
245 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
246 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
255 bl write_byte @ rmw first writes unmodified data
259 bl write_byte @ and only then modified (Blaster Master)
263 @@@ Write r0 to [addr]
269 tst REG_ADDR, #0xe000
270 biceq REG_ADDR, REG_ADDR, #0x1800
271 addeq REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
273 streqb r0, [REG_ADDR, REG_OP_TABLE]
278 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
279 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
280 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
281 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
282 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
285 @ don't do ROM check, because we might be fetching important stuff like vectors
288 add REG_ADDR, REG_ADDR, #1
290 orr r0, REG_PC, r0, lsl #8
294 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
295 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
297 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
303 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
304 strb r0, [r1, REG_S, lsr #24]
305 sub REG_S, REG_S, #1 << 24
310 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
312 strb r2, [r1, REG_S, lsr #24]
313 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
314 sub REG_S, REG_S, #1 << 24
315 strb r0, [r1, REG_S, lsr #24]
316 sub REG_S, REG_S, #1 << 24
321 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
322 add REG_S, REG_S, #1 << 24
323 ldrb r0, [r0, REG_S, lsr #24]
328 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
329 add REG_S, REG_S, #1 << 24
330 ldrb r1, [r0, REG_S, lsr #24]
331 add REG_S, REG_S, #1 << 24
332 ldrb r0, [r0, REG_S, lsr #24]
333 orr r0, r1, r0, lsl #8
336 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
337 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
339 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
346 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
347 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
349 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
352 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
355 ldrb r0, [REG_PC], #1
358 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
361 ldrb REG_ADDR, [REG_PC], #1
364 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
368 add REG_ADDR, REG_ADDR, REG_X
369 and REG_ADDR, REG_ADDR, #0xFF
372 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
376 add REG_ADDR, REG_ADDR, REG_Y
377 and REG_ADDR, REG_ADDR, #0xFF
380 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
387 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
392 add REG_ADDR, REG_ADDR, REG_Y
393 bic REG_ADDR, REG_ADDR, #0x10000
394 and r0,REG_ADDR,#0xff
396 addgt REG_CYCLE, REG_CYCLE, #1
397 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
400 @ Indirect Indexed (for writes and rmws)
404 add REG_ADDR, REG_ADDR, REG_Y
405 bic REG_ADDR, REG_ADDR, #0x10000
409 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
410 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
412 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
415 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
420 ldrneb REG_ADDR, [REG_PC], #1
421 ldrneb r0, [REG_PC], #1
422 ldreqh REG_ADDR, [REG_PC], #2
423 orrne REG_ADDR, REG_ADDR, r0, lsl #8
426 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
430 add REG_ADDR, REG_ADDR, REG_X
431 bic REG_ADDR, REG_ADDR, #0x10000
432 and r0,REG_ADDR,#0xff
434 addgt REG_CYCLE, REG_CYCLE, #1
435 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
438 @ Absolute Indexed (for writes and rmws)
441 add REG_ADDR, REG_ADDR, REG_X
442 bic REG_ADDR, REG_ADDR, #0x10000
445 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
449 add REG_ADDR, REG_ADDR, REG_Y
450 bic REG_ADDR, REG_ADDR, #0x10000
451 and r0,REG_ADDR,#0xff
453 addgt REG_CYCLE, REG_CYCLE, #1
454 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
457 @ Absolute Indexed (for writes and rmws)
460 add REG_ADDR, REG_ADDR, REG_Y
461 bic REG_ADDR, REG_ADDR, #0x10000
464 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
467 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
468 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
469 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
475 orrne REG_NZ, REG_NZ, #0x80 << 24
477 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
478 and r0, r0, #P_REST_FLAGS
479 orr REG_P_REST, REG_P_REST, r0
484 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
485 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
488 and r0, REG_P_REST, #P_REST_FLAGS
489 tst REG_NZ, #0x80 << 24
490 orrne r0, r0, #P_N_FLAG
492 orreq r0, r0, #P_Z_FLAG
493 orr r0, r0, #P_R_FLAG
504 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
505 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
514 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
515 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
517 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
522 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
523 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
527 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
532 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
537 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
542 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
547 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
552 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
557 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
560 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
561 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
563 @@@ TAX/TXA/TAY/TYA/TSX/TXS
565 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
568 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
572 mov REG_X, REG_A, lsr #24
573 mov REG_NZ, REG_A, asr #24
578 mov REG_A, REG_X, lsl #24
579 mov REG_NZ, REG_A, asr #24
584 mov REG_Y, REG_A, lsr #24
585 mov REG_NZ, REG_A, asr #24
590 mov REG_A, REG_Y, lsl #24
591 mov REG_NZ, REG_A, asr #24
596 mov REG_X, REG_S, lsr #24
597 orr REG_NZ, REG_X, REG_X, lsl #24
602 bic REG_S, REG_S, #0xFF << 24
603 orr REG_S, REG_S, REG_X, lsl #24
607 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
608 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
613 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
617 mov r0, REG_A, lsr #24
624 orr r0, r0, #P_B_FLAG
631 mov REG_A, r0, lsl #24
632 mov REG_NZ, REG_A, asr #24
641 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
642 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
652 mov REG_A, r0, lsl #24
653 mov REG_NZ, REG_A, asr #24
658 orr REG_NZ, r0, r0, lsl #24
786 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
787 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
797 mov r0, REG_A, lsr #24
884 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
885 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
887 @@@ INC/INX/INY/DEC/DEX/DEY
888 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
889 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
898 orr REG_NZ, r0, r0, lsl #24
903 and \reg, \reg, #0xFF
904 orr REG_NZ, \reg, \reg, lsl #24
910 orr REG_NZ, r0, r0, lsl #24
915 and \reg, \reg, #0xFF
916 orr REG_NZ, \reg, \reg, lsl #24
1016 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1017 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1021 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1024 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1025 movs r1, REG_P_REST, lsr #1
1026 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1027 subcs r0, r0, #0x100
1028 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1029 adcs REG_A, REG_A, r0, ror #8
1030 mov REG_NZ, REG_A, asr #24
1031 adc REG_P_REST, r1, r1
1032 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1033 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1037 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1038 movs r1, REG_P_REST, lsr #1
1039 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1040 sbcs REG_A, REG_A, r0, lsl #24
1041 and REG_A, REG_A, #0xFF << 24
1042 mov REG_NZ, REG_A, asr #24
1043 adc REG_P_REST, r1, r1
1044 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1045 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1072 op7D: @ ADC $nnnn, X
1079 op79: @ ADC $nnnn, Y
1086 op61: @ ADC ($nn, X)
1093 op71: @ ADC ($nn), Y
1125 opFD: @ SBC $nnnn, X
1132 opF9: @ SBC $nnnn, Y
1139 opE1: @ SBC ($nn, X)
1146 opF1: @ SBC ($nn), Y
1154 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1155 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1159 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1165 and REG_A, REG_A, r0, lsl #24
1166 mov REG_NZ, REG_A, asr #24
1170 eor REG_A, REG_A, r0, lsl #24
1171 mov REG_NZ, REG_A, asr #24
1175 orr REG_A, REG_A, r0, lsl #24
1176 mov REG_NZ, REG_A, asr #24
1203 op3D: @ AND $nnnn, X
1210 op39: @ AND $nnnn, Y
1217 op21: @ AND ($nn, X)
1224 op31: @ AND ($nn), Y
1256 op5D: @ EOR $nnnn, X
1263 op59: @ EOR $nnnn, Y
1270 op41: @ EOR ($nn, X)
1277 op51: @ EOR ($nn), Y
1309 op1D: @ ORA $nnnn, X
1316 op19: @ ORA $nnnn, Y
1323 op01: @ ORA ($nn, X)
1330 op11: @ ORA ($nn), Y
1339 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1340 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1344 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1350 subs REG_NZ, REG_A, r0, lsl #24
1351 mov REG_NZ, REG_NZ, asr #24
1352 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1353 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1357 mov r1, \reg, lsl #24
1358 subs REG_NZ, r1, r0, lsl #24
1359 mov REG_NZ, REG_NZ, asr #24
1360 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1361 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1396 opDD: @ CMP $nnnn, X
1403 opD9: @ CMP $nnnn, Y
1410 opC1: @ CMP ($nn, X)
1417 opD1: @ CMP ($nn), Y
1463 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1464 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1468 @@@ Z <= A ¢Ê M == 0
1476 and REG_NZ, r0, REG_A, lsr #24
1477 @@ R0[7] => C, R0[6] => N
1478 movs r0, r0, lsl #25
1479 orrcs REG_NZ, REG_NZ, #0x80 << 24
1480 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1481 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1498 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1499 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1503 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1508 movs REG_NZ, r0, lsl #25
1509 mov r0, REG_NZ, lsr #24
1510 mov REG_NZ, REG_NZ, asr #24
1511 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1512 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1516 movs REG_A, REG_A, lsl #1
1517 mov REG_NZ, REG_A, asr #24
1518 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1519 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1526 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1527 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1532 movs REG_NZ, REG_A, lsr #25
1533 mov REG_A, REG_NZ, lsl #24
1534 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1535 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1569 op1E: @ ASL $nnnn, X
1613 op5E: @ LSR $nnnn, X
1626 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1627 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1637 movs r1, REG_P_REST, lsr #1
1640 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1641 orrs REG_NZ, r0, r0, lsl #24
1643 adc REG_P_REST, r1, r1
1648 movs r1, REG_P_REST, lsr #1
1649 orrcs REG_A, REG_A, #0x80 << 16
1650 movs REG_A, REG_A, lsl #1
1651 mov REG_NZ, REG_A, asr #24
1652 adc REG_P_REST, r1, r1
1656 movs r1, REG_P_REST, lsr #1
1657 orrcs r0, r0, #0x100
1659 orr REG_NZ, r0, r0, lsl #24
1660 adc REG_P_REST, r1, r1
1664 movs r1, REG_P_REST, lsr #1
1665 mov REG_NZ, REG_A, rrx
1666 movs REG_NZ, REG_NZ, asr #24
1667 mov REG_A, REG_NZ, lsl #24
1668 adc REG_P_REST, r1, r1
1703 op3E: @ ROL $nnnn, X
1747 op7E: @ ROR $nnnn, X
1760 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1761 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1763 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1770 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1772 mov r3, r1 @ preserve immediate
1776 @@ R1 <- (PC&0xFF)+ReadValue
1780 addne REG_CYCLE, REG_CYCLE, #1
1781 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1785 ldreqsb r1, [REG_PC], #1
1787 add REG_PC, REG_PC, r1
1788 addeq REG_CYCLE, REG_CYCLE, #1
1789 subeq REG_CYCLE, REG_CYCLE, #1*48<<16
1796 ldrnesb r1, [REG_PC], #1
1798 add REG_PC, REG_PC, r1
1799 addne REG_CYCLE, REG_CYCLE, #1
1800 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1807 tst REG_P_REST, #P_REST_C_FLAG
1814 tst REG_P_REST, #P_REST_C_FLAG
1830 tst REG_NZ, #0x80 << 24
1831 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1836 tst REG_NZ, #0x80 << 24
1842 tst REG_P_REST, #P_REST_V_FLAG
1849 tst REG_P_REST, #P_REST_V_FLAG
1855 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1856 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1861 mov REG_A, r0, lsl #24
1863 mov REG_NZ, REG_A, asr #24
1867 movs r0, r0, lsl #25
1869 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1870 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1874 mov REG_NZ, REG_A, asr #24
1875 @@restore value to write
1885 mov r0,REG_ADDR, lsr #8
1893 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1894 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1896 eor REG_A,REG_A,r0, lsl #24
1898 mov REG_NZ, REG_A, asr #24
1902 and r1,REG_X,REG_A, lsr #24
1904 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1905 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1907 orr REG_NZ, REG_X, REG_X, lsl #24
1917 movs r1, REG_P_REST, lsr #1
1920 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1921 orrs REG_NZ, r0, r0, lsl #24
1923 adc REG_P_REST, r1, r1
1924 and REG_A,REG_A,r0,lsl #24
1928 movs r1, REG_P_REST, lsr #1
1929 orrcs r0, r0, #0x100
1933 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1934 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1965 op5F: @ SRE $nnnn, X
1977 op5B: @ SRE $nnnn, Y
1989 op43: @ SRE ($nn, X)
2001 op53: @ SRE ($nn), Y
2014 op9C: @ SHY $nnnn, X
2066 opFB: @ ISB $nnnn, Y
2080 opE3: @ ISB ($nn, X)
2094 opF3: @ ISB ($nn), Y
2127 opBF: @ LAX $nnnn, Y
2134 opA3: @ LAX ($nn, X)
2141 opB3: @ LAX ($nn), Y
2175 op1F: @ SLO $nnnn, X
2187 op1B: @ SLO $nnnn, Y
2199 op03: @ SLO ($nn, X)
2211 op13: @ SLO ($nn), Y
2258 opDF: @ DCP $nnnn, X
2272 opDB: @ DCP $nnnn, Y
2287 opC3: @ DCP ($nn, X)
2301 opD3: @ DCP ($nn), Y
2341 op3F: @ RLA $nnnn, X
2353 op3B: @ RLA $nnnn, Y
2365 op23: @ RLA ($nn, X)
2377 op33: @ RLA ($nn), Y
2419 op7F: @ RRA $nnnn, X
2433 op7B: @ RRA $nnnn, Y
2447 op63: @ RRA ($nn, X)
2461 op73: @ RRA ($nn), Y
2479 add REG_PC,REG_PC,#1
2483 add REG_PC,REG_PC,#2
2492 add REG_PC,REG_PC,#1
2503 op1C: @ NOP $nnnn, X
2509 add REG_PC,REG_PC,#2
2517 add REG_PC,REG_PC,#1
2522 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2523 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2534 and r0, REG_ADDR, #0xFF
2536 beq jmp_indirect_bug
2542 @@ BUG is : to not read word at REG_ADDR, because it loops
2543 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2547 and REG_ADDR, REG_ADDR, #0xff00
2549 orr r0, REG_PC, r0, lsl #8
2555 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2556 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2571 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2572 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2582 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2592 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2593 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2602 add REG_PC, REG_PC, #1
2603 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2606 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2609 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2610 mov REG_ADDR, #0x10000
2611 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2616 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2617 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2633 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2634 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2651 @@@ WARNING: decrements REG_PC
2654 add REG_CYCLE, REG_CYCLE, #7
2655 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2656 sub REG_PC, REG_PC, #1
2659 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2662 tst REG_P_REST, #FCEU_IQNMI<<8
2663 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2664 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2665 mov REG_ADDR, #0x10000
2666 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2667 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2672 subs REG_CYCLE, REG_CYCLE, #7*48<<16
2674 ldrb r0, [REG_PC], #1
2675 tst REG_P_REST, #0xff<<8
2676 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2678 tst REG_P_REST, #P_REST_I_FLAG
2679 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2689 stmfd r13!,{r4-r11,lr}
2691 ldr r0, =nes_registers
2696 @@REG_P_REST = 0, don't touch REG_S
2697 bic REG_P_REST, REG_P_REST, #0xff
2699 @ fceu: set MapIRQHook present flag
2700 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2702 orrne REG_P_REST, REG_P_REST, #1<<16
2703 biceq REG_P_REST, REG_P_REST, #1<<16
2705 @@ R bit is always 1
2706 orr REG_NZ, REG_NZ, #P_R_FLAG
2709 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2711 mov REG_ADDR, #0x10000
2712 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2716 ldr r0, =nes_registers
2719 ldmfd r13!,{r4-r11,lr}
2723 @@@ low-level memhandlers
2727 @ try to avoid lookup of every address at least for ROM and RAM areas
2728 @ I've verified that if ARead[0xfff0] points to CartBR, it is always normal ROM read.
2729 #ifndef DEBUG_ASM_6502
2733 orr r1, r1, r1, lsr #4
2734 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2738 mov r1, REG_ADDR, lsr #11
2739 ldr r2, [r2, r1, lsl #2]
2740 ldrb r0, [r2, REG_ADDR]
2746 @ must preserve r3 for the callers too
2747 @ TODO: check if all of saves are needed, _DB (is full needed?)
2748 FLUSH_TIMESTAMP r2 @ needed for TryFixit1
2749 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2750 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2751 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2753 mov REG_P_REST, r3 @ r8
2755 #ifndef DEBUG_ASM_6502
2757 bic r0, REG_ADDR, #0x00ff0000
2759 ldr pc, [r2, r0, lsl #2]
2761 ldr r2, =dread_count_a
2769 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2772 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2773 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2774 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2775 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2780 FLUSH_TIMESTAMP r2 @ Blaster Master, more...
2781 #ifndef DEBUG_ASM_6502
2782 @ must preserve r0 (data) and r3 for the callers
2783 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2784 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2785 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2787 mov REG_P_REST, r3 @ r8
2788 mov REG_CYCLE, r0 @ r11
2792 bic r0, REG_ADDR, #0x00ff0000
2794 ldr pc, [r2, r0, lsl #2]
2796 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2800 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2801 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2802 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2804 ldr r1, =dwrite_count_a
2808 orr r0, r0, REG_ADDR, lsl #8
2809 str r0, [r2, r1, lsl #2]
2810 ldr r2, =dwrite_count_a
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
2843 tst REG_P_REST, #1<<16
2844 blne do_irq_hook_noflushts
2846 ldr r0, =nes_registers
2849 ldmfd r13!,{r4-r11,lr}
2853 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2857 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2858 @ they must be in the same section
2864 .long op00, op01, op02, op03, op04, op05, op06, op07
2865 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2867 .long op10, op11, op12, op13, op14, op15, op16, op17
2868 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2870 .long op20, op21, op22, op23, op24, op25, op26, op27
2871 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2873 .long op30, op31, op32, op33, op34, op35, op36, op37
2874 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2876 .long op40, op41, op42, op43, op44, op45, op46, op47
2877 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2879 .long op50, op51, op52, op53, op54, op55, op56, op57
2880 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2882 .long op60, op61, op62, op63, op64, op65, op66, op67
2883 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2885 .long op70, op71, op72, op73, op74, op75, op76, op77
2886 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2888 .long op80, op81, op82, op83, op84, op85, op86, op87
2889 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2891 .long op90, op91, op92, op93, op94, op95, op96, op97
2892 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2894 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2895 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
2897 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
2898 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
2900 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
2901 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
2903 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
2904 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
2906 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
2907 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
2909 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
2910 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
2913 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
2923 @ TODO: write code which keeps it up-to-date
2931 #ifndef DEBUG_ASM_6502
2934 X_: .fill 0x20, 1, 0
2943 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2944 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2946 @@@ Undefined Opcodes
2956 @opDF: @ DCP $nnnn, X
2957 @opDB: @ DCP $nnnn, Y
2958 @opC3: @ DCP ($nn, X)
2959 @opD3: @ DCP ($nn), Y
2966 @opFF: @ ISB $nnnn, X
2967 @opFB: @ ISB $nnnn, Y
2968 @opE3: @ ISB ($nn, X)
2969 @opF3: @ ISB ($nn), Y
2987 @opA3: @ LAX ($nn, X)
2991 @opBF: @ LAX $nnnn, Y
2993 @opB3: @ LAX ($nn), Y
2998 @op3F: @ RLA $nnnn, X
2999 @op23: @ RLA ($nn, X)
3003 @op7F: @ RRA $nnnn, X
3004 @op63: @ RRA ($nn, X)
3008 op83: @ SAX ($nn, X)
3010 op9F: @ SHA $nnnn, Y
3011 op93: @ SHA ($nn), Y
3012 op9B: @ SHS $nnnn, Y
3013 op9E: @ SHX $nnnn, Y
3014 @op03: @ SLO ($nn, X)
3018 @op1F: @ SLO $nnnn, X
3022 @op5F: @ SRE $nnnn, X
3023 @op5B: @ SRE $nnnn, Y
3024 @op43: @ SRE ($nn, X)
3030 @@@@@@@@@@@@@@@@@@@@@@@@@@
3032 @@@@@@@@@@@@@@@@@@@@@@@@@@
3043 .globl nes_registers @ TODO: hide?
3045 .globl MapIRQHook @ (int a)
3046 #ifndef DEBUG_ASM_6502
3051 .globl nes_internal_ram
3054 .globl X6502_Reset_a @ (void);
3055 .globl X6502_Power_a @ (void);
3056 .globl X6502_Run_a @ (int32 cycles);
3057 .globl TriggerIRQ_a @ (void);
3058 .globl TriggerNMI_a @ (void);
3059 .globl TriggerNMINSF_a @ (void);
3060 .globl X6502_AddCycles_a @ (int x);
3061 .globl X6502_IRQBegin_a @ (int w);
3062 .globl X6502_IRQEnd_a @ (int w);
3063 .globl X6502_Rebase_a @ (void);
3068 .equiv X6502_Reset_a, reset_cpu
3069 .equiv X6502_Run_a, cpu_exec
3076 ldr r1, =nes_registers
3081 bne X6502_Power_loop1
3082 ldr r0, =cpu_exec_table
3089 mov r0, #FCEU_IQTEMP
3092 ldr r2, =nes_registers
3094 ldr r1, [r2, #0x10] @ REG_P_REST
3095 orr r1, r1, r0, lsl #8
3101 ldr r2, =nes_registers
3104 bic r1, r1, r0, lsl #8
3121 ldr r2, =nes_registers
3125 ldrsh r1, [r2, #0x1e]
3126 mvn r3, #47 @ r3=-48
3128 ldr r1, =MapIRQHook @ hack..
3129 strh r3, [r2, #0x1e]
3136 @ rebase PC when not executing or in memhandlers
3138 stmfd sp!,{REG_PC,REG_OP_TABLE}
3139 ldr REG_OP_TABLE, =cpu_exec_table
3140 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3141 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3144 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3145 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3150 @ the nasty MapIRQHook thing from FCE..
3151 @ test Gradius 2 (J) if you change this
3155 do_irq_hook_noflushts:
3156 @ get irqhook cycles
3157 and r0, REG_CYCLE, #0xff00
3158 bic REG_CYCLE, REG_CYCLE, #0xff00
3160 #ifndef DEBUG_ASM_6502
3161 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3162 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3163 mov REG_P_REST, lr @ r8
3165 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3167 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3169 ldr REG_OP_TABLE, =cpu_exec_table @ 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
3180 @ vim:filetype=armasm