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 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
166 ldrb REG_ADDR, [REG_ADDR, #1]
167 orr REG_ADDR, r0, REG_ADDR, lsl #8
170 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
171 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
175 .macro ZP_WRITE reg=r0
176 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
177 strb \reg, [REG_ADDR, REG_OP_TABLE]
181 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
188 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
189 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
191 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤
193 @@@ REG_ADDR => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
194 @@@ r0 => ½ñ¤¯¥Ð¥¤¥È(write)
195 @@@ r0 <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
199 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
202 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
204 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
206 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
212 .macro READ unused_param
213 tst REG_ADDR, #0xe000
215 biceq r0, REG_ADDR, #0x1800
216 addeq r0, r0, #OTOFFS_NES_RAM
217 ldreqb r0, [r0, REG_OP_TABLE]
222 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
232 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
235 tst REG_ADDR, #0xe000
239 bic REG_ADDR, REG_ADDR, #0x1800
240 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
241 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
250 bl write_byte @ rmw first writes unmodified data
254 bl write_byte @ and only then modified (Blaster Master)
258 @@@ Write r0 to [addr]
264 tst REG_ADDR, #0xe000
265 biceq REG_ADDR, REG_ADDR, #0x1800
266 addeq REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
268 streqb r0, [REG_ADDR, REG_OP_TABLE]
273 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
274 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
275 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
276 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
277 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
282 add REG_ADDR, REG_ADDR, #1
284 orr r0, REG_PC, r0, lsl #8
288 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
289 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
291 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
297 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
298 strb r0, [r1, REG_S, lsr #24]
299 sub REG_S, REG_S, #1 << 24
304 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
306 strb r2, [r1, REG_S, lsr #24]
307 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
308 sub REG_S, REG_S, #1 << 24
309 strb r0, [r1, REG_S, lsr #24]
310 sub REG_S, REG_S, #1 << 24
315 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
316 add REG_S, REG_S, #1 << 24
317 ldrb r0, [r0, REG_S, lsr #24]
322 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
323 add REG_S, REG_S, #1 << 24
324 ldrb r1, [r0, REG_S, lsr #24]
325 add REG_S, REG_S, #1 << 24
326 ldrb r0, [r0, REG_S, lsr #24]
327 orr r0, r1, r0, lsl #8
330 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
331 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
333 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
340 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
341 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
343 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
346 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
349 ldrb r0, [REG_PC], #1
352 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
355 ldrb REG_ADDR, [REG_PC], #1
358 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
362 add REG_ADDR, REG_ADDR, REG_X
363 and REG_ADDR, REG_ADDR, #0xFF
366 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
370 add REG_ADDR, REG_ADDR, REG_Y
371 and REG_ADDR, REG_ADDR, #0xFF
374 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
381 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
386 add REG_ADDR, REG_ADDR, REG_Y
387 bic REG_ADDR, REG_ADDR, #0x10000
388 and r0,REG_ADDR,#0xff
390 addgt REG_CYCLE, REG_CYCLE, #1
391 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
394 @ Indirect Indexed (for writes and rmws)
398 add REG_ADDR, REG_ADDR, REG_Y
399 bic REG_ADDR, REG_ADDR, #0x10000
403 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
404 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
406 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
409 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
412 .macro ABS_ADDR update_db=0
414 ldrb r0, [REG_PC, #1]
415 ldrb REG_ADDR, [REG_PC], #2
416 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
417 orr REG_ADDR, REG_ADDR, r0, lsl #8
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
427 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
430 ABS_ADDR DO_DUMMY_READS
431 add REG_ADDR, REG_ADDR, REG_X
432 bic REG_ADDR, REG_ADDR, #0x10000
433 and r0,REG_ADDR,#0xff
435 addgt REG_CYCLE, REG_CYCLE, #1
436 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
439 @ Absolute Indexed (for writes and rmws)
442 add REG_ADDR, REG_ADDR, REG_X
443 bic REG_ADDR, REG_ADDR, #0x10000
446 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
449 ABS_ADDR DO_DUMMY_READS @ a hack needed for Paperboy, Dirty Harry controls to work
450 add REG_ADDR, REG_ADDR, REG_Y
451 bic REG_ADDR, REG_ADDR, #0x10000
452 and r0,REG_ADDR,#0xff
454 addgt REG_CYCLE, REG_CYCLE, #1
455 subgt REG_CYCLE, REG_CYCLE, #1*48<<16
458 @ Absolute Indexed (for writes and rmws)
461 add REG_ADDR, REG_ADDR, REG_Y
462 bic REG_ADDR, REG_ADDR, #0x10000
465 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
468 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
469 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
470 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
476 orrne REG_NZ, REG_NZ, #0x80 << 24
478 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
479 and r0, r0, #P_REST_FLAGS
480 orr REG_P_REST, REG_P_REST, r0
485 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
486 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
489 and r0, REG_P_REST, #P_REST_FLAGS
490 tst REG_NZ, #0x80 << 24
491 orrne r0, r0, #P_N_FLAG
493 orreq r0, r0, #P_Z_FLAG
494 orr r0, r0, #P_R_FLAG
505 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
506 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
515 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
516 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
518 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
523 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
524 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
528 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
533 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
538 bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
543 orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
548 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
553 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
558 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
561 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
562 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
564 @@@ TAX/TXA/TAY/TYA/TSX/TXS
566 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
569 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
573 mov REG_X, REG_A, lsr #24
574 mov REG_NZ, REG_A, asr #24
579 mov REG_A, REG_X, lsl #24
580 mov REG_NZ, REG_A, asr #24
585 mov REG_Y, REG_A, lsr #24
586 mov REG_NZ, REG_A, asr #24
591 mov REG_A, REG_Y, lsl #24
592 mov REG_NZ, REG_A, asr #24
597 mov REG_X, REG_S, lsr #24
598 orr REG_NZ, REG_X, REG_X, lsl #24
603 bic REG_S, REG_S, #0xFF << 24
604 orr REG_S, REG_S, REG_X, lsl #24
608 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
609 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
614 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
618 mov r0, REG_A, lsr #24
625 orr r0, r0, #P_B_FLAG
632 mov REG_A, r0, lsl #24
633 mov REG_NZ, REG_A, asr #24
642 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
643 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
653 mov REG_A, r0, lsl #24
654 mov REG_NZ, REG_A, asr #24
659 orr REG_NZ, r0, r0, lsl #24
787 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
788 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
798 mov r0, REG_A, lsr #24
885 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
886 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
888 @@@ INC/INX/INY/DEC/DEX/DEY
889 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
890 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
899 orr REG_NZ, r0, r0, lsl #24
904 and \reg, \reg, #0xFF
905 orr REG_NZ, \reg, \reg, lsl #24
911 orr REG_NZ, r0, r0, lsl #24
916 and \reg, \reg, #0xFF
917 orr REG_NZ, \reg, \reg, lsl #24
1017 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1018 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1022 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1025 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1026 movs r1, REG_P_REST, lsr #1
1027 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1028 subcs r0, r0, #0x100
1029 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1030 adcs REG_A, REG_A, r0, ror #8
1031 mov REG_NZ, REG_A, asr #24
1032 adc REG_P_REST, r1, r1
1033 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1034 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1038 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1039 movs r1, REG_P_REST, lsr #1
1040 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1041 sbcs REG_A, REG_A, r0, lsl #24
1042 and REG_A, REG_A, #0xFF << 24
1043 mov REG_NZ, REG_A, asr #24
1044 adc REG_P_REST, r1, r1
1045 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1046 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1073 op7D: @ ADC $nnnn, X
1080 op79: @ ADC $nnnn, Y
1087 op61: @ ADC ($nn, X)
1094 op71: @ ADC ($nn), Y
1126 opFD: @ SBC $nnnn, X
1133 opF9: @ SBC $nnnn, Y
1140 opE1: @ SBC ($nn, X)
1147 opF1: @ SBC ($nn), Y
1155 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1156 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1160 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1166 and REG_A, REG_A, r0, lsl #24
1167 mov REG_NZ, REG_A, asr #24
1171 eor REG_A, REG_A, r0, lsl #24
1172 mov REG_NZ, REG_A, asr #24
1176 orr REG_A, REG_A, r0, lsl #24
1177 mov REG_NZ, REG_A, asr #24
1204 op3D: @ AND $nnnn, X
1211 op39: @ AND $nnnn, Y
1218 op21: @ AND ($nn, X)
1225 op31: @ AND ($nn), Y
1257 op5D: @ EOR $nnnn, X
1264 op59: @ EOR $nnnn, Y
1271 op41: @ EOR ($nn, X)
1278 op51: @ EOR ($nn), Y
1310 op1D: @ ORA $nnnn, X
1317 op19: @ ORA $nnnn, Y
1324 op01: @ ORA ($nn, X)
1331 op11: @ ORA ($nn), Y
1340 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1341 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1345 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1351 subs REG_NZ, REG_A, r0, lsl #24
1352 mov REG_NZ, REG_NZ, asr #24
1353 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1354 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1358 mov r1, \reg, lsl #24
1359 subs REG_NZ, r1, r0, lsl #24
1360 mov REG_NZ, REG_NZ, asr #24
1361 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1362 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1397 opDD: @ CMP $nnnn, X
1404 opD9: @ CMP $nnnn, Y
1411 opC1: @ CMP ($nn, X)
1418 opD1: @ CMP ($nn), Y
1464 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1465 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1469 @@@ Z <= A ¢Ê M == 0
1477 and REG_NZ, r0, REG_A, lsr #24
1478 @@ R0[7] => C, R0[6] => N
1479 movs r0, r0, lsl #25
1480 orrcs REG_NZ, REG_NZ, #0x80 << 24
1481 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1482 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1499 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1500 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1504 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1509 movs REG_NZ, r0, lsl #25
1510 mov r0, REG_NZ, lsr #24
1511 mov REG_NZ, REG_NZ, asr #24
1512 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1513 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1517 movs REG_A, REG_A, lsl #1
1518 mov REG_NZ, REG_A, asr #24
1519 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1520 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1527 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1528 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1533 movs REG_NZ, REG_A, lsr #25
1534 mov REG_A, REG_NZ, lsl #24
1535 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1536 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1570 op1E: @ ASL $nnnn, X
1614 op5E: @ LSR $nnnn, X
1627 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1628 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1638 movs r1, REG_P_REST, lsr #1
1641 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1642 orrs REG_NZ, r0, r0, lsl #24
1644 adc REG_P_REST, r1, r1
1649 movs r1, REG_P_REST, lsr #1
1650 orrcs REG_A, REG_A, #0x80 << 16
1651 movs REG_A, REG_A, lsl #1
1652 mov REG_NZ, REG_A, asr #24
1653 adc REG_P_REST, r1, r1
1657 movs r1, REG_P_REST, lsr #1
1658 orrcs r0, r0, #0x100
1660 orr REG_NZ, r0, r0, lsl #24
1661 adc REG_P_REST, r1, r1
1665 movs r1, REG_P_REST, lsr #1
1666 mov REG_NZ, REG_A, rrx
1667 movs REG_NZ, REG_NZ, asr #24
1668 mov REG_A, REG_NZ, lsl #24
1669 adc REG_P_REST, r1, r1
1704 op3E: @ ROL $nnnn, X
1748 op7E: @ ROR $nnnn, X
1761 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1762 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1764 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1771 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1773 mov r3, r1 @ preserve immediate
1777 @@ R1 <- (PC&0xFF)+ReadValue
1781 addne REG_CYCLE, REG_CYCLE, #1
1782 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1786 ldreqsb r1, [REG_PC], #1
1788 add REG_PC, REG_PC, r1
1789 addeq REG_CYCLE, REG_CYCLE, #1
1790 subeq REG_CYCLE, REG_CYCLE, #1*48<<16
1797 ldrnesb r1, [REG_PC], #1
1799 add REG_PC, REG_PC, r1
1800 addne REG_CYCLE, REG_CYCLE, #1
1801 subne REG_CYCLE, REG_CYCLE, #1*48<<16
1808 tst REG_P_REST, #P_REST_C_FLAG
1815 tst REG_P_REST, #P_REST_C_FLAG
1831 tst REG_NZ, #0x80 << 24
1832 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1837 tst REG_NZ, #0x80 << 24
1843 tst REG_P_REST, #P_REST_V_FLAG
1850 tst REG_P_REST, #P_REST_V_FLAG
1856 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1857 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1862 mov REG_A, r0, lsl #24
1864 mov REG_NZ, REG_A, asr #24
1868 movs r0, r0, lsl #25
1870 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1871 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1875 mov REG_NZ, REG_A, asr #24
1876 @@restore value to write
1888 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1889 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1891 eor REG_A,REG_A,r0, lsl #24
1893 mov REG_NZ, REG_A, asr #24
1897 and r1,REG_X,REG_A, lsr #24
1899 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1900 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1902 orr REG_NZ, REG_X, REG_X, lsl #24
1912 movs r1, REG_P_REST, lsr #1
1915 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1916 orrs REG_NZ, r0, r0, lsl #24
1918 adc REG_P_REST, r1, r1
1919 and REG_A,REG_A,r0,lsl #24
1920 orr REG_NZ, REG_A, REG_A, lsr #24 @ according to fceu
1924 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1925 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1956 op5F: @ SRE $nnnn, X
1968 op5B: @ SRE $nnnn, Y
1980 op43: @ SRE ($nn, X)
1992 op53: @ SRE ($nn), Y
2050 opFB: @ ISB $nnnn, Y
2064 opE3: @ ISB ($nn, X)
2078 opF3: @ ISB ($nn), Y
2111 opBF: @ LAX $nnnn, Y
2118 opA3: @ LAX ($nn, X)
2125 opB3: @ LAX ($nn), Y
2159 op1F: @ SLO $nnnn, X
2171 op1B: @ SLO $nnnn, Y
2183 op03: @ SLO ($nn, X)
2195 op13: @ SLO ($nn), Y
2242 opDF: @ DCP $nnnn, X
2256 opDB: @ DCP $nnnn, Y
2271 opC3: @ DCP ($nn, X)
2285 opD3: @ DCP ($nn), Y
2325 op3F: @ RLA $nnnn, X
2337 op3B: @ RLA $nnnn, Y
2349 op23: @ RLA ($nn, X)
2361 op33: @ RLA ($nn), Y
2403 op7F: @ RRA $nnnn, X
2417 op7B: @ RRA $nnnn, Y
2431 op63: @ RRA ($nn, X)
2445 op73: @ RRA ($nn), Y
2463 add REG_PC,REG_PC,#1
2472 add REG_PC,REG_PC,#2
2482 add REG_PC,REG_PC,#1
2493 op1C: @ NOP $nnnn, X
2504 add REG_PC,REG_PC,#2
2512 add REG_PC,REG_PC,#1
2516 add REG_PC,REG_PC,#1
2519 op02: @ JAM: try to be compatible with fceu
2531 sub REG_PC,REG_PC,#1
2532 add REG_CYCLE, REG_CYCLE, #0x10
2534 add REG_CYCLE, REG_CYCLE, #0xef
2535 sub REG_CYCLE, REG_CYCLE, #0x00d00000 @ 0xff*48<<16
2536 sub REG_CYCLE, REG_CYCLE, #0x2f000000
2543 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2544 orr REG_P_REST, REG_P_REST, REG_A, lsr #31
2556 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2557 eor r0, REG_A, REG_A, lsr #1
2558 and r0, r0, #0x40000000
2559 orr REG_P_REST, REG_P_REST, r0, lsr #24
2563 op83: @ SAX/AAX ($nn, X)
2566 and r0, REG_X, REG_A, lsr #24
2572 and r0, REG_X, REG_A, lsr #24
2576 op8B: @ ANE/XAA #$nn
2577 orr REG_A, REG_A, #0xee000000
2578 and REG_A, REG_A, REG_X, lsl #24
2583 op8F: @ SAX/AAX $nnnn
2586 and r0, REG_X, REG_A, lsr #24
2591 sub r0, REG_ADDR, REG_Y
2596 op93: @ SHA/AXA ($nn), Y
2601 and r0, r0, REG_A, lsr #24
2605 op97: @ SAX,AAX $nn, Y
2607 and r0, REG_X, REG_A, lsr #24
2611 op9B: @ SHS/XAS $nnnn, Y
2612 and r0, REG_X, REG_A, lsr #24
2613 bic REG_S, REG_S, #0xFF << 24
2614 orr REG_S, REG_S, r0, lsl #24
2617 and r0, r0, REG_S, lsr #24
2621 op9C: @ SHY/SYA $nnnn, X
2624 sub r0, REG_ADDR, REG_X
2631 op9E: @ SHX/SXA $nnnn, Y
2638 op9F: @ SHA/AXA $nnnn, Y
2643 and r0, r0, REG_A, lsr #24
2647 opAB: @ LXA/ATX/OAL #$nn
2649 orr REG_A, REG_A, #0xee000000
2651 mov REG_X, REG_A, lsr #24
2654 opBB: @ LAS/LAR $nnnn,Y
2662 opBB_: and REG_X, r0, REG_S, lsr #24
2663 bic REG_S, REG_S, #0xff<<24
2664 orr REG_S, REG_S, REG_X, lsl #24
2665 mov REG_A, REG_X, lsl #24
2666 orr REG_NZ, REG_A, REG_A, lsr #24
2672 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2673 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2684 and r0, REG_ADDR, #0xFF
2686 beq jmp_indirect_bug
2692 @@ BUG is : to not read word at REG_ADDR, because it loops
2693 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2697 and REG_ADDR, REG_ADDR, #0xff00
2699 orr r0, REG_PC, r0, lsl #8
2705 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2706 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2721 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2722 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2732 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2742 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2743 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2752 add REG_PC, REG_PC, #1
2753 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2756 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2759 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2760 mov REG_ADDR, #0x10000
2761 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2766 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2767 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2783 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2784 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2801 @@@ WARNING: decrements REG_PC
2804 add REG_CYCLE, REG_CYCLE, #7
2805 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2806 sub REG_PC, REG_PC, #1
2809 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2812 tst REG_P_REST, #FCEU_IQNMI<<8
2813 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2814 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2815 mov REG_ADDR, #0x10000
2816 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2817 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2822 subs REG_CYCLE, REG_CYCLE, #7*48<<16
2824 ldrb r0, [REG_PC], #1
2825 tst REG_P_REST, #0xff<<8
2826 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2828 tst REG_P_REST, #P_REST_I_FLAG
2829 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
2839 stmfd r13!,{r4-r11,lr}
2841 ldr r0, =nes_registers
2846 @@REG_P_REST = 0, don't touch REG_S
2847 bic REG_P_REST, REG_P_REST, #0xff
2849 @ fceu: set MapIRQHook present flag
2850 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2852 orrne REG_P_REST, REG_P_REST, #1<<16
2853 biceq REG_P_REST, REG_P_REST, #1<<16
2855 @@ R bit is always 1
2856 orr REG_NZ, REG_NZ, #P_R_FLAG
2859 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2861 mov REG_ADDR, #0x10000
2862 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2866 ldr r0, =nes_registers
2869 ldmfd r13!,{r4-r11,lr}
2873 @@@ low-level memhandlers
2877 @ disabled because no improvements noticed, only causes trouble (with gg for example)
2879 @ try to avoid lookup of every address at least for ROM and RAM areas
2880 @ I've verified that if ARead[0xfff0] points to CartBR, it is always normal ROM read.
2884 orr r1, r1, r1, lsr #4
2885 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2889 mov r1, REG_ADDR, lsr #11
2890 ldr r2, [r2, r1, lsl #2]
2891 ldrb r0, [r2, REG_ADDR]
2897 @ must preserve r3 for the callers too
2898 @ TODO: check if all of saves are needed, _DB (is full needed?)
2899 FLUSH_TIMESTAMP r2 @ needed for TryFixit1
2900 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2901 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2902 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2904 mov REG_P_REST, r3 @ r8
2906 #ifndef DEBUG_ASM_6502
2908 bic r0, REG_ADDR, #0x00ff0000
2910 ldr pc, [r2, r0, lsl #2]
2912 ldr r2, =dread_count_a
2920 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2923 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2924 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2925 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2926 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2931 FLUSH_TIMESTAMP r2 @ Blaster Master, more...
2932 #ifndef DEBUG_ASM_6502
2933 @ must preserve r0 (data) and r3 for the callers
2934 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2935 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2936 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2938 mov REG_P_REST, r3 @ r8
2939 mov REG_CYCLE, r0 @ r11
2943 bic r0, REG_ADDR, #0x00ff0000
2945 ldr pc, [r2, r0, lsl #2]
2947 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2951 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2952 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2953 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2955 ldr r1, =dwrite_count_a
2959 orr r0, r0, REG_ADDR, lsl #8
2960 str r0, [r2, r1, lsl #2]
2961 ldr r2, =dwrite_count_a
2973 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2974 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2976 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2978 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2979 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2982 stmfd r13!,{r4-r11,lr}
2984 ldr r0, =nes_registers
2987 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2989 ldrb r0, [REG_PC], #1
2990 tst REG_P_REST, #0xff<<8
2991 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
2993 @ assumption: NMI can be set only on very first run, because it is only set once before vblank..
2994 tst REG_P_REST, #FCEU_IQNMI<<8
2996 tst REG_P_REST, #P_REST_I_FLAG
2997 @@ if I_FLAG=1, continue execution, don't trigger IRQ
2998 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
2999 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
3000 @@ I_FLAG=0 and REST is checked, we have a IRQ
3007 tst REG_P_REST, #1<<16
3008 bne do_irq_hook_final
3010 ldr r0, =nes_registers
3013 ldmfd r13!,{r4-r11,lr}
3017 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
3021 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
3022 @ they must be in the same section
3028 .long op00, op01, op02, op03, op04, op05, op06, op07
3029 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
3031 .long op10, op11, op12, op13, op14, op15, op16, op17
3032 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
3034 .long op20, op21, op22, op23, op24, op25, op26, op27
3035 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
3037 .long op30, op31, op32, op33, op34, op35, op36, op37
3038 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
3040 .long op40, op41, op42, op43, op44, op45, op46, op47
3041 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
3043 .long op50, op51, op52, op53, op54, op55, op56, op57
3044 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
3046 .long op60, op61, op62, op63, op64, op65, op66, op67
3047 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
3049 .long op70, op71, op72, op73, op74, op75, op76, op77
3050 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
3052 .long op80, op81, op82, op83, op84, op85, op86, op87
3053 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
3055 .long op90, op91, op92, op93, op94, op95, op96, op97
3056 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
3058 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
3059 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
3061 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
3062 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
3064 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
3065 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
3067 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
3068 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
3070 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
3071 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
3073 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
3074 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
3077 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
3094 #ifndef DEBUG_ASM_6502
3097 X_: .fill 0x20, 1, 0
3107 @@@@@@@@@@@@@@@@@@@@@@@@@@
3109 @@@@@@@@@@@@@@@@@@@@@@@@@@
3120 .globl nes_registers @ TODO: hide?
3122 .globl MapIRQHook @ (int a)
3123 #ifndef DEBUG_ASM_6502
3129 .globl nes_internal_ram
3132 .globl X6502_Reset_a @ (void);
3133 .globl X6502_Power_a @ (void);
3134 .globl X6502_Run_a @ (int32 cycles);
3135 .globl TriggerIRQ_a @ (void);
3136 .globl TriggerNMI_a @ (void);
3137 .globl X6502_AddCycles_a @ (int x);
3138 .globl X6502_IRQBegin_a @ (int w);
3139 .globl X6502_IRQEnd_a @ (int w);
3140 .globl X6502_Rebase_a @ (void);
3145 .equiv X6502_Reset_a, reset_cpu
3146 .equiv X6502_Run_a, cpu_exec
3153 ldr r1, =nes_registers
3158 bne X6502_Power_loop1
3159 ldr r0, =cpu_exec_table
3166 mov r0, #FCEU_IQTEMP
3169 ldr r2, =nes_registers
3171 ldr r1, [r2, #0x10] @ REG_P_REST
3172 orr r1, r1, r0, lsl #8
3178 ldr r2, =nes_registers
3181 bic r1, r1, r0, lsl #8
3193 ldr r2, =nes_registers
3197 ldrsh r1, [r2, #0x1e]
3198 mvn r3, #47 @ r3=-48
3200 ldr r1, =MapIRQHook @ hack..
3201 strh r3, [r2, #0x1e]
3208 @ rebase PC when not executing or in memhandlers
3210 stmfd sp!,{REG_PC,REG_OP_TABLE}
3211 ldr REG_OP_TABLE, =cpu_exec_table
3212 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3213 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3216 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3217 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3222 @ the nasty MapIRQHook thing from FCE..
3223 @ test Gradius 2 (J) if you change this
3227 @ get irqhook cycles
3228 and r0, REG_CYCLE, #0xff00
3230 #ifndef DEBUG_ASM_6502
3231 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3232 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3233 mov REG_P_REST, REG_OP_TABLE @ r8
3235 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3237 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3239 mov REG_OP_TABLE, REG_P_REST @ got trashed because was in r12
3240 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3242 ldr r1, =mapirq_cyc_a
3247 ldrb r0, [REG_PC], #1
3248 bic REG_CYCLE, REG_CYCLE, #0xff00
3249 tst REG_P_REST, #0xff<<8
3250 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
3252 @ do some messing to find out which IRQ is pending..
3253 tst REG_P_REST, #P_REST_I_FLAG
3254 @@ if I_FLAG=1, continue execution, don't trigger IRQ
3255 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
3256 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
3257 @@ I_FLAG=0 and REST is checked, we have a IRQ
3262 ldr r1, =nes_registers
3264 @ get irqhook cycles
3265 and r0, REG_CYCLE, #0xff00
3266 bic REG_CYCLE, REG_CYCLE, #0xff00
3271 ldmfd r13!,{r4-r11,lr}
3273 #ifndef DEBUG_ASM_6502
3274 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3276 ldr r1, =mapirq_cyc_a
3283 @ vim:filetype=armasm