1 /*************************************
5 modified and adapted by Yoyo.
6 timing fixed, missing opcodes added
7 and adapted for fceu by notaz, 2007.
8 **************************************/
12 /* emulate (some) dummy reads (may need that because they affect open bus) */
13 #define DO_DUMMY_READS 1
16 @@@ Offets from REG_OP_TABLE
18 #define OTOFFS_NES_RAM (nes_internal_ram - cpu_exec_table)
19 #define OTOFFS_NES_STACK (nes_stack - cpu_exec_table)
20 #define OTOFFS_NES_REGS (nes_registers - cpu_exec_table)
21 #define OTOFFS_PC_BASE (pc_base - cpu_exec_table)
22 #define OTOFFS_IRQ_HOOK (MapIRQHook - cpu_exec_table)
23 #define OTOFFS_TIMESTAMP (timestamp - cpu_exec_table)
24 #define OTOFFS_X (X_ - cpu_exec_table)
27 #define FCEU_IQNMI 0x08
28 #define FCEU_IQTEMP 0x80
31 @@@@@@@@@@@@@@@@@@@@@@@@@@
43 stmfd sp!,{r0-r3,r12,lr}
47 ldmfd sp!,{r0-r3,r12,lr}
51 @@@ r0 = Address (unbased)
52 @@@ uses REG_OP_TABLE; sets REG_PC; trashes r1,r2; keeps r0
55 @ FIXME: do something with mem not in Page[].
56 @ stmfd sp!, {r0-r3,r12,lr}
60 @ ldmfd sp!, {r0-r3,r12,lr}
65 ldrge r2, [r1, r2, lsl #2]
67 addlt r1, REG_OP_TABLE, #OTOFFS_NES_RAM
69 str r2, [REG_OP_TABLE, #OTOFFS_PC_BASE]
74 @ updates fceu "timestamp" variable
75 @ loads cycles to reg, reg!=r1, trashes r1, kills flags
76 .macro FLUSH_TIMESTAMP reg
77 ands \reg, REG_CYCLE, #0xff
79 ldr r1, [REG_OP_TABLE, #OTOFFS_TIMESTAMP]
80 orr REG_CYCLE, REG_CYCLE, \reg, lsl #8 @ put cycles for do_irq_hook
82 bic REG_CYCLE, REG_CYCLE, #0xff
83 str r1, [REG_OP_TABLE, #OTOFFS_TIMESTAMP]
88 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
89 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
93 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
94 @@@ ¤¿¤À¤·³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤¤
96 @@@ ¤Ê¤ó¤«Ì¾Á°¤¬ÊѤÀ¤Ê(¤É¡¼¤Ç¤â¤¤¡¼¤±¤É¡¼
98 .macro CYCLE_NEXT n, unused=0, do_cyc_add=1
102 add REG_CYCLE, REG_CYCLE, #\n
104 subs REG_CYCLE, REG_CYCLE, #\n*48<<16
106 tst REG_P_REST, #1<<16
109 ldrb r0, [REG_PC], #1
110 tst REG_P_REST, #0xff<<8
111 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
113 @ do some messing to find out which IRQ is pending..
114 @ assumption: NMI can be set only on very first run, because it is only set once before vblank..
115 @ tst REG_P_REST, #FCEU_IQNMI<<8
117 tst REG_P_REST, #P_REST_I_FLAG
118 @@ if I_FLAG=1, continue execution, don't trigger IRQ
119 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
120 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
121 @@ I_FLAG=0 and REST is checked, we have a IRQ
125 @ fceu needs timestamp cycles to be inremented before doing actual opcode.
126 @ this is only needed for ops which do memory i/o
128 add REG_CYCLE, REG_CYCLE, #\n
132 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
133 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
137 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
138 @@@ CLI¡¦PHP¤Ê¤É¥Õ¥é¥°¤òÊѹ¹¤·¤¿¾ì¹ç¤Ï¤³¤ì
140 .macro CYCLE_NEXT_INT n
144 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
145 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
147 @@@ ¥¼¥í¥Ú¡¼¥¸¤«¤éÆɤà
150 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
151 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
155 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
164 .macro ZP_READ_ADDR update_db=0
166 ldrb REG_ADDR, [REG_ADDR, #1]
167 orr REG_ADDR, r0, REG_ADDR, lsl #8
169 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
173 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
174 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
178 .macro ZP_WRITE reg=r0
179 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
180 strb \reg, [REG_ADDR, REG_OP_TABLE]
184 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
191 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
192 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
194 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤
196 @@@ REG_ADDR => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
197 @@@ r0 => ½ñ¤¯¥Ð¥¤¥È(write)
198 @@@ r0 <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
202 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
205 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
207 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
209 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
215 .macro READ unused_param
216 tst REG_ADDR, #0xe000
218 biceq r0, REG_ADDR, #0x1800
219 addeq r0, r0, #OTOFFS_NES_RAM
220 ldreqb r0, [r0, REG_OP_TABLE]
225 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
235 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
238 tst REG_ADDR, #0xe000
242 bic REG_ADDR, REG_ADDR, #0x1800
243 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
244 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
253 bl write_byte @ rmw first writes unmodified data
257 bl write_byte @ and only then modified (Blaster Master)
261 @@@ Write r0 to [addr]
267 tst REG_ADDR, #0xe000
268 biceq REG_ADDR, REG_ADDR, #0x1800
269 addeq REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
271 streqb r0, [REG_ADDR, REG_OP_TABLE]
276 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
277 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
278 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
279 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
280 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
285 add REG_ADDR, REG_ADDR, #1
287 orr r0, REG_PC, r0, lsl #8
291 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
292 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
294 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
300 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
301 strb r0, [r1, REG_S, lsr #24]
302 sub REG_S, REG_S, #1 << 24
307 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
309 strb r2, [r1, REG_S, lsr #24]
310 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
311 sub REG_S, REG_S, #1 << 24
312 strb r0, [r1, REG_S, lsr #24]
313 sub REG_S, REG_S, #1 << 24
318 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
319 add REG_S, REG_S, #1 << 24
320 ldrb r0, [r0, REG_S, lsr #24]
325 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
326 add REG_S, REG_S, #1 << 24
327 ldrb r1, [r0, REG_S, lsr #24]
328 add REG_S, REG_S, #1 << 24
329 ldrb r0, [r0, REG_S, lsr #24]
330 orr r0, r1, r0, lsl #8
333 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
334 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
336 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
343 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
344 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
346 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
349 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
352 ldrb r0, [REG_PC], #1
355 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
358 ldrb REG_ADDR, [REG_PC], #1
361 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
365 add REG_ADDR, REG_ADDR, REG_X
366 and REG_ADDR, REG_ADDR, #0xFF
369 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
373 add REG_ADDR, REG_ADDR, REG_Y
374 and REG_ADDR, REG_ADDR, #0xFF
377 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
384 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
388 ZP_READ_ADDR 1 @ SMB3 relies on open bus here
389 add REG_ADDR, REG_ADDR, REG_Y
390 bic REG_ADDR, REG_ADDR, #0x10000
391 and r0,REG_ADDR,#0xff
393 addgt REG_CYCLE, REG_CYCLE, #1
394 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
397 @ Indirect Indexed (for writes and rmws)
401 add REG_ADDR, REG_ADDR, REG_Y
402 bic REG_ADDR, REG_ADDR, #0x10000
406 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
407 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
409 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
412 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
415 .macro ABS_ADDR update_db=0
417 ldrb r0, [REG_PC, #1]
418 ldrb REG_ADDR, [REG_PC], #2
419 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
420 orr REG_ADDR, REG_ADDR, r0, lsl #8
423 ldrneb REG_ADDR, [REG_PC], #1
424 ldrneb r0, [REG_PC], #1
425 ldreqh REG_ADDR, [REG_PC], #2
426 orrne REG_ADDR, REG_ADDR, r0, lsl #8
430 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
433 ABS_ADDR DO_DUMMY_READS
434 add REG_ADDR, REG_ADDR, REG_X
435 bic REG_ADDR, REG_ADDR, #0x10000
436 and r0,REG_ADDR,#0xff
438 addgt REG_CYCLE, REG_CYCLE, #1
439 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
442 @ Absolute Indexed (for writes and rmws)
445 add REG_ADDR, REG_ADDR, REG_X
446 bic REG_ADDR, REG_ADDR, #0x10000
449 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
452 ABS_ADDR DO_DUMMY_READS @ a hack needed for Paperboy, Dirty Harry controls to work
453 add REG_ADDR, REG_ADDR, REG_Y
454 bic REG_ADDR, REG_ADDR, #0x10000
455 and r0,REG_ADDR,#0xff
457 addgt REG_CYCLE, REG_CYCLE, #1
458 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
461 @ Absolute Indexed (for writes and rmws)
464 add REG_ADDR, REG_ADDR, REG_Y
465 bic REG_ADDR, REG_ADDR, #0x10000
468 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
471 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
472 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
473 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
479 orrne REG_NZ, REG_NZ, #0x80 << 24
481 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
482 and r0, r0, #P_REST_FLAGS
483 orr REG_P_REST, REG_P_REST, r0
488 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
489 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
492 and r0, REG_P_REST, #P_REST_FLAGS
493 tst REG_NZ, #0x80 << 24
494 orrne r0, r0, #P_N_FLAG
496 orreq r0, r0, #P_Z_FLAG
497 orr r0, r0, #P_R_FLAG
508 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
509 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
518 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
519 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
521 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
526 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
527 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
531 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
536 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
541 bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
546 orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
551 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
556 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
561 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
564 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
565 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
567 @@@ TAX/TXA/TAY/TYA/TSX/TXS
569 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
572 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
576 mov REG_X, REG_A, lsr #24
577 mov REG_NZ, REG_A, asr #24
582 mov REG_A, REG_X, lsl #24
583 mov REG_NZ, REG_A, asr #24
588 mov REG_Y, REG_A, lsr #24
589 mov REG_NZ, REG_A, asr #24
594 mov REG_A, REG_Y, lsl #24
595 mov REG_NZ, REG_A, asr #24
600 mov REG_X, REG_S, lsr #24
601 orr REG_NZ, REG_X, REG_X, lsl #24
606 bic REG_S, REG_S, #0xFF << 24
607 orr REG_S, REG_S, REG_X, lsl #24
611 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
612 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
617 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
621 mov r0, REG_A, lsr #24
628 orr r0, r0, #P_B_FLAG
635 mov REG_A, r0, lsl #24
636 mov REG_NZ, REG_A, asr #24
645 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
646 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
656 mov REG_A, r0, lsl #24
657 mov REG_NZ, REG_A, asr #24
662 orr REG_NZ, r0, r0, lsl #24
790 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
791 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
801 mov r0, REG_A, lsr #24
888 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
889 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
891 @@@ INC/INX/INY/DEC/DEX/DEY
892 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
893 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
902 orr REG_NZ, r0, r0, lsl #24
907 and \reg, \reg, #0xFF
908 orr REG_NZ, \reg, \reg, lsl #24
914 orr REG_NZ, r0, r0, lsl #24
919 and \reg, \reg, #0xFF
920 orr REG_NZ, \reg, \reg, lsl #24
1020 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1021 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1025 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1028 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1029 movs r1, REG_P_REST, lsr #1
1030 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1031 subcs r0, r0, #0x100
1032 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1033 adcs REG_A, REG_A, r0, ror #8
1034 mov REG_NZ, REG_A, asr #24
1035 adc REG_P_REST, r1, r1
1036 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1037 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1041 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1042 movs r1, REG_P_REST, lsr #1
1043 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1044 sbcs REG_A, REG_A, r0, lsl #24
1045 and REG_A, REG_A, #0xFF << 24
1046 mov REG_NZ, REG_A, asr #24
1047 adc REG_P_REST, r1, r1
1048 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1049 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1076 op7D: @ ADC $nnnn, X
1083 op79: @ ADC $nnnn, Y
1090 op61: @ ADC ($nn, X)
1097 op71: @ ADC ($nn), Y
1129 opFD: @ SBC $nnnn, X
1136 opF9: @ SBC $nnnn, Y
1143 opE1: @ SBC ($nn, X)
1150 opF1: @ SBC ($nn), Y
1158 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1159 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1163 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1169 and REG_A, REG_A, r0, lsl #24
1170 mov REG_NZ, REG_A, asr #24
1174 eor REG_A, REG_A, r0, lsl #24
1175 mov REG_NZ, REG_A, asr #24
1179 orr REG_A, REG_A, r0, lsl #24
1180 mov REG_NZ, REG_A, asr #24
1207 op3D: @ AND $nnnn, X
1214 op39: @ AND $nnnn, Y
1221 op21: @ AND ($nn, X)
1228 op31: @ AND ($nn), Y
1260 op5D: @ EOR $nnnn, X
1267 op59: @ EOR $nnnn, Y
1274 op41: @ EOR ($nn, X)
1281 op51: @ EOR ($nn), Y
1313 op1D: @ ORA $nnnn, X
1320 op19: @ ORA $nnnn, Y
1327 op01: @ ORA ($nn, X)
1334 op11: @ ORA ($nn), Y
1343 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1344 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1348 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1354 subs REG_NZ, REG_A, r0, lsl #24
1355 mov REG_NZ, REG_NZ, asr #24
1356 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1357 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1361 mov r1, \reg, lsl #24
1362 subs REG_NZ, r1, r0, lsl #24
1363 mov REG_NZ, REG_NZ, asr #24
1364 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1365 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1400 opDD: @ CMP $nnnn, X
1407 opD9: @ CMP $nnnn, Y
1414 opC1: @ CMP ($nn, X)
1421 opD1: @ CMP ($nn), Y
1467 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1468 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1472 @@@ Z <= A ¢Ê M == 0
1480 and REG_NZ, r0, REG_A, lsr #24
1481 @@ R0[7] => C, R0[6] => N
1482 movs r0, r0, lsl #25
1483 orrcs REG_NZ, REG_NZ, #0x80 << 24
1484 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1485 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1502 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1503 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1507 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1512 movs REG_NZ, r0, lsl #25
1513 mov r0, REG_NZ, lsr #24
1514 mov REG_NZ, REG_NZ, 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
1520 movs REG_A, REG_A, lsl #1
1521 mov REG_NZ, REG_A, asr #24
1522 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1523 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1530 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1531 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1536 movs REG_NZ, REG_A, lsr #25
1537 mov REG_A, REG_NZ, lsl #24
1538 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1539 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1573 op1E: @ ASL $nnnn, X
1617 op5E: @ LSR $nnnn, X
1630 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1631 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1641 movs r1, REG_P_REST, lsr #1
1644 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1645 orrs REG_NZ, r0, r0, lsl #24
1647 adc REG_P_REST, r1, r1
1652 movs r1, REG_P_REST, lsr #1
1653 orrcs REG_A, REG_A, #0x80 << 16
1654 movs REG_A, REG_A, lsl #1
1655 mov REG_NZ, REG_A, asr #24
1656 adc REG_P_REST, r1, r1
1660 movs r1, REG_P_REST, lsr #1
1661 orrcs r0, r0, #0x100
1663 orr REG_NZ, r0, r0, lsl #24
1664 adc REG_P_REST, r1, r1
1668 movs r1, REG_P_REST, lsr #1
1669 mov REG_NZ, REG_A, rrx
1670 movs REG_NZ, REG_NZ, asr #24
1671 mov REG_A, REG_NZ, lsl #24
1672 adc REG_P_REST, r1, r1
1707 op3E: @ ROL $nnnn, X
1751 op7E: @ ROR $nnnn, X
1764 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1765 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1767 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1774 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1776 mov r3, r1 @ preserve immediate
1780 @@ R1 <- (PC&0xFF)+ReadValue
1784 addne REG_CYCLE, REG_CYCLE, #1
1785 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1789 ldreqsb r1, [REG_PC], #1
1791 add REG_PC, REG_PC, r1
1792 addeq REG_CYCLE, REG_CYCLE, #1
1793 subeq REG_CYCLE, REG_CYCLE, #1*48<<16
1800 ldrnesb r1, [REG_PC], #1
1802 add REG_PC, REG_PC, r1
1803 addne REG_CYCLE, REG_CYCLE, #1
1804 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1811 tst REG_P_REST, #P_REST_C_FLAG
1818 tst REG_P_REST, #P_REST_C_FLAG
1834 tst REG_NZ, #0x80 << 24
1835 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1840 tst REG_NZ, #0x80 << 24
1846 tst REG_P_REST, #P_REST_V_FLAG
1853 tst REG_P_REST, #P_REST_V_FLAG
1859 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1860 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1865 mov REG_A, r0, lsl #24
1867 mov REG_NZ, REG_A, asr #24
1871 movs r0, r0, lsl #25
1873 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1874 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1878 mov REG_NZ, REG_A, asr #24
1879 @@restore value to write
1891 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1892 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1894 eor REG_A,REG_A,r0, lsl #24
1896 mov REG_NZ, REG_A, asr #24
1900 and r1,REG_X,REG_A, lsr #24
1902 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1903 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1905 orr REG_NZ, REG_X, REG_X, lsl #24
1915 movs r1, REG_P_REST, lsr #1
1918 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1919 orrs REG_NZ, r0, r0, lsl #24
1921 adc REG_P_REST, r1, r1
1922 and REG_A,REG_A,r0,lsl #24
1923 orr REG_NZ, REG_A, REG_A, lsr #24 @ according to fceu
1927 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1928 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1959 op5F: @ SRE $nnnn, X
1971 op5B: @ SRE $nnnn, Y
1983 op43: @ SRE ($nn, X)
1995 op53: @ SRE ($nn), Y
2053 opFB: @ ISB $nnnn, Y
2067 opE3: @ ISB ($nn, X)
2081 opF3: @ ISB ($nn), Y
2114 opBF: @ LAX $nnnn, Y
2121 opA3: @ LAX ($nn, X)
2128 opB3: @ LAX ($nn), Y
2162 op1F: @ SLO $nnnn, X
2174 op1B: @ SLO $nnnn, Y
2186 op03: @ SLO ($nn, X)
2198 op13: @ SLO ($nn), Y
2245 opDF: @ DCP $nnnn, X
2259 opDB: @ DCP $nnnn, Y
2274 opC3: @ DCP ($nn, X)
2288 opD3: @ DCP ($nn), Y
2328 op3F: @ RLA $nnnn, X
2340 op3B: @ RLA $nnnn, Y
2352 op23: @ RLA ($nn, X)
2364 op33: @ RLA ($nn), Y
2406 op7F: @ RRA $nnnn, X
2420 op7B: @ RRA $nnnn, Y
2434 op63: @ RRA ($nn, X)
2448 op73: @ RRA ($nn), Y
2466 add REG_PC,REG_PC,#1
2475 add REG_PC,REG_PC,#2
2485 add REG_PC,REG_PC,#1
2496 op1C: @ NOP $nnnn, X
2507 add REG_PC,REG_PC,#2
2515 add REG_PC,REG_PC,#1
2519 add REG_PC,REG_PC,#1
2522 op02: @ JAM: try to be compatible with fceu
2534 sub REG_PC,REG_PC,#1
2535 add REG_CYCLE, REG_CYCLE, #0x10
2537 add REG_CYCLE, REG_CYCLE, #0xef
2538 sub REG_CYCLE, REG_CYCLE, #0x00d00000 @ 0xff*48<<16
2539 sub REG_CYCLE, REG_CYCLE, #0x2f000000
2546 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2547 orr REG_P_REST, REG_P_REST, REG_A, lsr #31
2559 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2560 eor r0, REG_A, REG_A, lsr #1
2561 and r0, r0, #0x40000000
2562 orr REG_P_REST, REG_P_REST, r0, lsr #24
2566 op83: @ SAX/AAX ($nn, X)
2569 and r0, REG_X, REG_A, lsr #24
2575 and r0, REG_X, REG_A, lsr #24
2579 op8B: @ ANE/XAA #$nn
2580 orr REG_A, REG_A, #0xee000000
2581 and REG_A, REG_A, REG_X, lsl #24
2586 op8F: @ SAX/AAX $nnnn
2589 and r0, REG_X, REG_A, lsr #24
2594 sub r0, REG_ADDR, REG_Y
2599 op93: @ SHA/AXA ($nn), Y
2604 and r0, r0, REG_A, lsr #24
2608 op97: @ SAX,AAX $nn, Y
2610 and r0, REG_X, REG_A, lsr #24
2614 op9B: @ SHS/XAS $nnnn, Y
2615 and r0, REG_X, REG_A, lsr #24
2616 bic REG_S, REG_S, #0xFF << 24
2617 orr REG_S, REG_S, r0, lsl #24
2620 and r0, r0, REG_S, lsr #24
2624 op9C: @ SHY/SYA $nnnn, X
2627 sub r0, REG_ADDR, REG_X
2634 op9E: @ SHX/SXA $nnnn, Y
2641 op9F: @ SHA/AXA $nnnn, Y
2646 and r0, r0, REG_A, lsr #24
2650 opAB: @ LXA/ATX/OAL #$nn
2652 orr REG_A, REG_A, #0xff000000
2654 mov REG_X, REG_A, lsr #24
2657 opBB: @ LAS/LAR $nnnn,Y
2665 opBB_: and REG_X, r0, REG_S, lsr #24
2666 bic REG_S, REG_S, #0xff<<24
2667 orr REG_S, REG_S, REG_X, lsl #24
2668 mov REG_A, REG_X, lsl #24
2669 orr REG_NZ, REG_A, REG_A, lsr #24
2675 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2676 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2687 and r0, REG_ADDR, #0xFF
2689 beq jmp_indirect_bug
2695 @@ BUG is : to not read word at REG_ADDR, because it loops
2696 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2700 and REG_ADDR, REG_ADDR, #0xff00
2702 orr r0, REG_PC, r0, lsl #8
2708 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2709 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2724 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2725 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2735 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2745 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2746 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2755 add REG_PC, REG_PC, #1
2756 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2760 orr r0, r0, #P_B_FLAG
2762 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2763 mov REG_ADDR, #0x10000
2764 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2769 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2770 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2786 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2787 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2804 @@@ WARNING: decrements REG_PC
2807 add REG_CYCLE, REG_CYCLE, #7
2808 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2809 sub REG_PC, REG_PC, #1
2813 bic r0, r0, #P_B_FLAG
2815 tst REG_P_REST, #FCEU_IQNMI<<8
2816 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2817 biceq REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
2818 bicne REG_P_REST, REG_P_REST, #FCEU_IQNMI<<8
2819 mov REG_ADDR, #0x10000
2820 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2821 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2826 subs REG_CYCLE, REG_CYCLE, #7*48<<16
2828 ldrb r0, [REG_PC], #1
2829 ldr pc, [REG_OP_TABLE, r0, lsl #2]
2838 stmfd r13!,{r4-r11,lr}
2840 ldr r0, =nes_registers
2845 @@REG_P_REST = 0, don't touch REG_S
2846 bic REG_P_REST, REG_P_REST, #0xff
2848 @ fceu: set MapIRQHook present flag
2849 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2851 orrne REG_P_REST, REG_P_REST, #1<<16
2852 biceq REG_P_REST, REG_P_REST, #1<<16
2854 @@ R bit is always 1
2855 orr REG_NZ, REG_NZ, #P_R_FLAG
2858 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2860 mov REG_ADDR, #0x10000
2861 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2865 ldr r0, =nes_registers
2868 ldmfd r13!,{r4-r11,lr}
2872 @@@ low-level memhandlers
2876 @ disabled because no improvements noticed, only causes trouble (with gg for example)
2878 @ try to avoid lookup of every address at least for ROM and RAM areas
2879 @ I've verified that if ARead[0xfff0] points to CartBR, it is always normal ROM read.
2883 orr r1, r1, r1, lsr #4
2884 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2888 mov r1, REG_ADDR, lsr #11
2889 ldr r2, [r2, r1, lsl #2]
2890 ldrb r0, [r2, REG_ADDR]
2896 @ must preserve r3 for the callers too
2897 @ TODO: check if all of saves are needed, _DB (is full needed?)
2898 FLUSH_TIMESTAMP r2 @ needed for TryFixit1
2899 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2900 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2901 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2903 mov REG_P_REST, r3 @ r8
2905 #ifndef DEBUG_ASM_6502
2907 bic r0, REG_ADDR, #0x00ff0000
2909 ldr pc, [r2, r0, lsl #2]
2911 ldr r2, =dread_count_a
2919 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2922 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2923 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2924 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2925 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2930 FLUSH_TIMESTAMP r2 @ Blaster Master, more...
2931 #ifndef DEBUG_ASM_6502
2932 @ must preserve r0 (data) and r3 for the callers
2933 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2934 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2935 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2937 mov REG_P_REST, r3 @ r8
2938 mov REG_CYCLE, r0 @ r11
2942 bic r0, REG_ADDR, #0x00ff0000
2944 ldr pc, [r2, r0, lsl #2]
2946 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2950 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2951 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2952 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2954 ldr r1, =dwrite_count_a
2958 orr r0, r0, REG_ADDR, lsl #8
2959 str r0, [r2, r1, lsl #2]
2960 ldr r2, =dwrite_count_a
2972 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2973 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2975 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2977 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2978 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2981 stmfd r13!,{r4-r11,lr}
2983 ldr r0, =nes_registers
2986 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2988 ldrb r0, [REG_PC], #1
2989 tst REG_P_REST, #0xff<<8
2990 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2992 @ assumption: NMI can be set only on very first run, because it is only set once before vblank..
2993 tst REG_P_REST, #FCEU_IQNMI<<8
2995 tst REG_P_REST, #P_REST_I_FLAG
2996 @@ if I_FLAG=1, continue execution, don't trigger IRQ
2997 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
2998 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2999 @@ I_FLAG=0 and REST is checked, we have a IRQ
3006 tst REG_P_REST, #1<<16
3007 bne do_irq_hook_final
3009 ldr r0, =nes_registers
3012 ldmfd r13!,{r4-r11,lr}
3016 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
3020 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
3021 @ they must be in the same section
3027 .long op00, op01, op02, op03, op04, op05, op06, op07
3028 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
3030 .long op10, op11, op12, op13, op14, op15, op16, op17
3031 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
3033 .long op20, op21, op22, op23, op24, op25, op26, op27
3034 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
3036 .long op30, op31, op32, op33, op34, op35, op36, op37
3037 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
3039 .long op40, op41, op42, op43, op44, op45, op46, op47
3040 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
3042 .long op50, op51, op52, op53, op54, op55, op56, op57
3043 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
3045 .long op60, op61, op62, op63, op64, op65, op66, op67
3046 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
3048 .long op70, op71, op72, op73, op74, op75, op76, op77
3049 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
3051 .long op80, op81, op82, op83, op84, op85, op86, op87
3052 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
3054 .long op90, op91, op92, op93, op94, op95, op96, op97
3055 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
3057 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
3058 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
3060 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
3061 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
3063 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
3064 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
3066 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
3067 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
3069 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
3070 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
3072 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
3073 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
3076 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
3093 #ifndef DEBUG_ASM_6502
3096 X_: .fill 0x20, 1, 0
3106 @@@@@@@@@@@@@@@@@@@@@@@@@@
3108 @@@@@@@@@@@@@@@@@@@@@@@@@@
3119 .globl nes_registers @ TODO: hide?
3121 .globl MapIRQHook @ (int a)
3122 #ifndef DEBUG_ASM_6502
3128 .globl nes_internal_ram
3131 .globl X6502_Reset_a @ (void);
3132 .globl X6502_Power_a @ (void);
3133 .globl X6502_Run_a @ (int32 cycles);
3134 .globl TriggerIRQ_a @ (void);
3135 .globl TriggerNMI_a @ (void);
3136 .globl X6502_AddCycles_a @ (int x);
3137 .globl X6502_IRQBegin_a @ (int w);
3138 .globl X6502_IRQEnd_a @ (int w);
3139 .globl X6502_Rebase_a @ (void);
3144 .equiv X6502_Reset_a, reset_cpu
3145 .equiv X6502_Run_a, cpu_exec
3152 ldr r1, =nes_registers
3157 bne X6502_Power_loop1
3158 ldr r0, =cpu_exec_table
3165 mov r0, #FCEU_IQTEMP
3168 ldr r2, =nes_registers
3170 ldr r1, [r2, #0x10] @ REG_P_REST
3171 orr r1, r1, r0, lsl #8
3177 ldr r2, =nes_registers
3180 bic r1, r1, r0, lsl #8
3192 ldr r2, =nes_registers
3196 ldrsh r1, [r2, #0x1e]
3197 mvn r3, #47 @ r3=-48
3199 ldr r1, =MapIRQHook @ hack..
3200 strh r3, [r2, #0x1e]
3207 @ rebase PC when not executing or in memhandlers
3209 stmfd sp!,{REG_PC,REG_OP_TABLE}
3210 ldr REG_OP_TABLE, =cpu_exec_table
3211 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3212 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3215 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3216 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3221 @ the nasty MapIRQHook thing from FCE..
3222 @ test Gradius 2 (J) if you change this
3226 @ get irqhook cycles
3227 and r0, REG_CYCLE, #0xff00
3229 #ifndef DEBUG_ASM_6502
3230 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3231 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3232 mov REG_P_REST, REG_OP_TABLE @ r8
3234 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3236 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3238 mov REG_OP_TABLE, REG_P_REST @ got trashed because was in r12
3239 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3241 ldr r1, =mapirq_cyc_a
3246 ldrb r0, [REG_PC], #1
3247 bic REG_CYCLE, REG_CYCLE, #0xff00
3248 tst REG_P_REST, #0xff<<8
3249 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
3251 @ do some messing to find out which IRQ is pending..
3252 tst REG_P_REST, #P_REST_I_FLAG
3253 @@ if I_FLAG=1, continue execution, don't trigger IRQ
3254 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
3255 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
3256 @@ I_FLAG=0 and REST is checked, we have a IRQ
3261 ldr r1, =nes_registers
3263 @ get irqhook cycles
3264 and r0, REG_CYCLE, #0xff00
3265 bic REG_CYCLE, REG_CYCLE, #0xff00
3270 ldmfd r13!,{r4-r11,lr}
3272 #ifndef DEBUG_ASM_6502
3273 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3275 ldr r1, =mapirq_cyc_a
3282 @ vim:filetype=armasm