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, #0xee000000
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]
2759 orr REG_P_REST, REG_P_REST, #P_REST_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
2812 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2815 tst REG_P_REST, #FCEU_IQNMI<<8
2816 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2817 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2818 mov REG_ADDR, #0x10000
2819 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2820 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2825 subs REG_CYCLE, REG_CYCLE, #7*48<<16
2827 ldrb r0, [REG_PC], #1
2828 tst REG_P_REST, #0xff<<8
2829 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2831 tst REG_P_REST, #P_REST_I_FLAG
2832 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2842 stmfd r13!,{r4-r11,lr}
2844 ldr r0, =nes_registers
2849 @@REG_P_REST = 0, don't touch REG_S
2850 bic REG_P_REST, REG_P_REST, #0xff
2852 @ fceu: set MapIRQHook present flag
2853 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2855 orrne REG_P_REST, REG_P_REST, #1<<16
2856 biceq REG_P_REST, REG_P_REST, #1<<16
2858 @@ R bit is always 1
2859 orr REG_NZ, REG_NZ, #P_R_FLAG
2862 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2864 mov REG_ADDR, #0x10000
2865 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2869 ldr r0, =nes_registers
2872 ldmfd r13!,{r4-r11,lr}
2876 @@@ low-level memhandlers
2880 @ disabled because no improvements noticed, only causes trouble (with gg for example)
2882 @ try to avoid lookup of every address at least for ROM and RAM areas
2883 @ I've verified that if ARead[0xfff0] points to CartBR, it is always normal ROM read.
2887 orr r1, r1, r1, lsr #4
2888 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2892 mov r1, REG_ADDR, lsr #11
2893 ldr r2, [r2, r1, lsl #2]
2894 ldrb r0, [r2, REG_ADDR]
2900 @ must preserve r3 for the callers too
2901 @ TODO: check if all of saves are needed, _DB (is full needed?)
2902 FLUSH_TIMESTAMP r2 @ needed for TryFixit1
2903 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2904 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2905 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2907 mov REG_P_REST, r3 @ r8
2909 #ifndef DEBUG_ASM_6502
2911 bic r0, REG_ADDR, #0x00ff0000
2913 ldr pc, [r2, r0, lsl #2]
2915 ldr r2, =dread_count_a
2923 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2926 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2927 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2928 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2929 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2934 FLUSH_TIMESTAMP r2 @ Blaster Master, more...
2935 #ifndef DEBUG_ASM_6502
2936 @ must preserve r0 (data) and r3 for the callers
2937 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2938 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2939 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2941 mov REG_P_REST, r3 @ r8
2942 mov REG_CYCLE, r0 @ r11
2946 bic r0, REG_ADDR, #0x00ff0000
2948 ldr pc, [r2, r0, lsl #2]
2950 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2954 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2955 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2956 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2958 ldr r1, =dwrite_count_a
2962 orr r0, r0, REG_ADDR, lsl #8
2963 str r0, [r2, r1, lsl #2]
2964 ldr r2, =dwrite_count_a
2976 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2977 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2979 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2981 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2982 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2985 stmfd r13!,{r4-r11,lr}
2987 ldr r0, =nes_registers
2990 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2992 ldrb r0, [REG_PC], #1
2993 tst REG_P_REST, #0xff<<8
2994 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2996 @ assumption: NMI can be set only on very first run, because it is only set once before vblank..
2997 tst REG_P_REST, #FCEU_IQNMI<<8
2999 tst REG_P_REST, #P_REST_I_FLAG
3000 @@ if I_FLAG=1, continue execution, don't trigger IRQ
3001 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
3002 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
3003 @@ I_FLAG=0 and REST is checked, we have a IRQ
3010 tst REG_P_REST, #1<<16
3011 bne do_irq_hook_final
3013 ldr r0, =nes_registers
3016 ldmfd r13!,{r4-r11,lr}
3020 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
3024 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
3025 @ they must be in the same section
3031 .long op00, op01, op02, op03, op04, op05, op06, op07
3032 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
3034 .long op10, op11, op12, op13, op14, op15, op16, op17
3035 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
3037 .long op20, op21, op22, op23, op24, op25, op26, op27
3038 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
3040 .long op30, op31, op32, op33, op34, op35, op36, op37
3041 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
3043 .long op40, op41, op42, op43, op44, op45, op46, op47
3044 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
3046 .long op50, op51, op52, op53, op54, op55, op56, op57
3047 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
3049 .long op60, op61, op62, op63, op64, op65, op66, op67
3050 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
3052 .long op70, op71, op72, op73, op74, op75, op76, op77
3053 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
3055 .long op80, op81, op82, op83, op84, op85, op86, op87
3056 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
3058 .long op90, op91, op92, op93, op94, op95, op96, op97
3059 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
3061 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
3062 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
3064 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
3065 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
3067 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
3068 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
3070 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
3071 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
3073 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
3074 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
3076 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
3077 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
3080 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
3097 #ifndef DEBUG_ASM_6502
3100 X_: .fill 0x20, 1, 0
3110 @@@@@@@@@@@@@@@@@@@@@@@@@@
3112 @@@@@@@@@@@@@@@@@@@@@@@@@@
3123 .globl nes_registers @ TODO: hide?
3125 .globl MapIRQHook @ (int a)
3126 #ifndef DEBUG_ASM_6502
3132 .globl nes_internal_ram
3135 .globl X6502_Reset_a @ (void);
3136 .globl X6502_Power_a @ (void);
3137 .globl X6502_Run_a @ (int32 cycles);
3138 .globl TriggerIRQ_a @ (void);
3139 .globl TriggerNMI_a @ (void);
3140 .globl X6502_AddCycles_a @ (int x);
3141 .globl X6502_IRQBegin_a @ (int w);
3142 .globl X6502_IRQEnd_a @ (int w);
3143 .globl X6502_Rebase_a @ (void);
3148 .equiv X6502_Reset_a, reset_cpu
3149 .equiv X6502_Run_a, cpu_exec
3156 ldr r1, =nes_registers
3161 bne X6502_Power_loop1
3162 ldr r0, =cpu_exec_table
3169 mov r0, #FCEU_IQTEMP
3172 ldr r2, =nes_registers
3174 ldr r1, [r2, #0x10] @ REG_P_REST
3175 orr r1, r1, r0, lsl #8
3181 ldr r2, =nes_registers
3184 bic r1, r1, r0, lsl #8
3196 ldr r2, =nes_registers
3200 ldrsh r1, [r2, #0x1e]
3201 mvn r3, #47 @ r3=-48
3203 ldr r1, =MapIRQHook @ hack..
3204 strh r3, [r2, #0x1e]
3211 @ rebase PC when not executing or in memhandlers
3213 stmfd sp!,{REG_PC,REG_OP_TABLE}
3214 ldr REG_OP_TABLE, =cpu_exec_table
3215 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3216 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3219 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3220 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3225 @ the nasty MapIRQHook thing from FCE..
3226 @ test Gradius 2 (J) if you change this
3230 @ get irqhook cycles
3231 and r0, REG_CYCLE, #0xff00
3233 #ifndef DEBUG_ASM_6502
3234 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3235 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3236 mov REG_P_REST, REG_OP_TABLE @ r8
3238 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3240 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3242 mov REG_OP_TABLE, REG_P_REST @ got trashed because was in r12
3243 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3245 ldr r1, =mapirq_cyc_a
3250 ldrb r0, [REG_PC], #1
3251 bic REG_CYCLE, REG_CYCLE, #0xff00
3252 tst REG_P_REST, #0xff<<8
3253 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
3255 @ do some messing to find out which IRQ is pending..
3256 tst REG_P_REST, #P_REST_I_FLAG
3257 @@ if I_FLAG=1, continue execution, don't trigger IRQ
3258 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
3259 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
3260 @@ I_FLAG=0 and REST is checked, we have a IRQ
3265 ldr r1, =nes_registers
3267 @ get irqhook cycles
3268 and r0, REG_CYCLE, #0xff00
3269 bic REG_CYCLE, REG_CYCLE, #0xff00
3274 ldmfd r13!,{r4-r11,lr}
3276 #ifndef DEBUG_ASM_6502
3277 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3279 ldr r1, =mapirq_cyc_a
3286 @ vim:filetype=armasm