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_X (X - cpu_exec_table)
22 #define FCEU_IQNMI 0x08
23 #define FCEU_IQTEMP 0x80
26 @@@@@@@@@@@@@@@@@@@@@@@@@@
36 @@@ r0 = Address (unbased)
37 @@@ uses REG_OP_TABLE; sets REG_PC; trashes r1,r2; keeps r0
40 @ FIXME: do something with mem not in Page[].
44 ldrge r2, [r1, r2, lsl #2]
46 addlt r1, REG_OP_TABLE, #OTOFFS_NES_RAM
48 str r2, [REG_OP_TABLE, #OTOFFS_PC_BASE]
54 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
55 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
59 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
60 @@@ ¤¿¤À¤·³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤¤
62 @@@ ¤Ê¤ó¤«Ì¾Á°¤¬ÊѤÀ¤Ê(¤É¡¼¤Ç¤â¤¤¡¼¤±¤É¡¼
67 subs REG_CYCLE, REG_CYCLE, #\n*48
69 tst REG_P_REST, #1<<16
73 tst REG_P_REST, #0xff<<8
74 ldreq pc, [REG_OP_TABLE, r0, lsl #2]
76 @ do some messing to find out which IRQ is pending..
77 tst REG_P_REST, #FCEU_IQNMI<<8
79 tst REG_P_REST, #P_REST_I_FLAG
80 @@ if I_FLAG=1, continue execution, don't trigger IRQ
81 bicne REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
82 ldrne pc, [REG_OP_TABLE, r0, lsl #2]
83 @@ I_FLAG=0 and REST is checked, we have a IRQ
88 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
89 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
93 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
94 @@@ CLI¡¦PHP¤Ê¤É¥Õ¥é¥°¤òÊѹ¹¤·¤¿¾ì¹ç¤Ï¤³¤ì
96 .macro CYCLE_NEXT_INT n
99 @ subs REG_CYCLE, REG_CYCLE, #\n*48
100 @ bgt cpu_exec_check_int
101 @ RETURN_FROM_CPU_EXEC
105 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
106 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
108 @@@ ¥¼¥í¥Ú¡¼¥¸¤«¤éÆɤà
111 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
112 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
116 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
127 ldrb REG_ADDR, [REG_ADDR, #1]
128 orr REG_ADDR, r0, REG_ADDR, lsl #8
131 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
132 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
136 .macro ZP_WRITE reg=r0
137 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
138 strb \reg, [REG_ADDR, REG_OP_TABLE]
142 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
149 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
150 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
152 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤
154 @@@ REG_ADDR => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
155 @@@ r0 => ½ñ¤¯¥Ð¥¤¥È(write)
156 @@@ r0 <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
160 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
163 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
165 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
167 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
170 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é¥í¡¼¥É¤Î¤ß
172 @@@ RAM¤«¤é¤Î¥í¡¼¥É¤¬°ìÈÖ¿¤¤¤Î¤ÇÍ¥À褹¤ë
182 movs r1, REG_ADDR, lsr #13
184 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
185 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
186 ldrne pc, [lr, -r1, lsl #2]
188 bic r0, REG_ADDR, #0x1800
189 add r0, r0, #OTOFFS_NES_RAM
190 ldrb r0, [r0, REG_OP_TABLE]
205 mov r1, REG_ADDR, lsr #13
207 ldr pc, [pc, r1, lsl #2]
218 bic r0, REG_ADDR, #0x1800
219 add r0, r0, #OTOFFS_NES_RAM
220 ldrb r0, [r0, REG_OP_TABLE]
221 @@ ¤È¤¤¤¦¤ï¤±¤Ç¥¸¥ã¥ó¥×¤¹¤ëɬÍפϤʤ¤
226 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
236 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
239 movs r3, REG_ADDR, lsr #13
241 @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
242 @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
243 ldrne pc, [lr, -r3, lsl #2]
245 bic REG_ADDR, REG_ADDR, #0x1800
246 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
247 ldrb r0, [REG_ADDR, REG_OP_TABLE]!
267 ldr pc, [pc, r3, lsl #2]
281 @@@ ½ñ¤¹þ¤ß¤À¤±¤Î¾ì¹ç
292 movs r1, REG_ADDR, lsr #13
294 ldrne pc, [lr, -r1, lsl #2]
295 bic REG_ADDR, REG_ADDR, #0x1800
296 add REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
298 strb r0, [REG_ADDR, REG_OP_TABLE]
313 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
314 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
315 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
316 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
317 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
322 add REG_ADDR, REG_ADDR, #1
324 orr r0, REG_PC, r0, lsl #8
328 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
329 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
331 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
337 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
338 strb r0, [r1, REG_S, lsr #24]
339 sub REG_S, REG_S, #1 << 24
344 add r1, REG_OP_TABLE, #OTOFFS_NES_STACK
346 strb r2, [r1, REG_S, lsr #24]
347 @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
348 sub REG_S, REG_S, #1 << 24
349 strb r0, [r1, REG_S, lsr #24]
350 sub REG_S, REG_S, #1 << 24
355 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
356 add REG_S, REG_S, #1 << 24
357 ldrb r0, [r0, REG_S, lsr #24]
362 add r0, REG_OP_TABLE, #OTOFFS_NES_STACK
363 add REG_S, REG_S, #1 << 24
364 ldrb r1, [r0, REG_S, lsr #24]
365 add REG_S, REG_S, #1 << 24
366 ldrb r0, [r0, REG_S, lsr #24]
367 orr r0, r1, r0, lsl #8
370 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
371 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
373 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
380 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
381 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
383 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
386 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
389 ldrb r0, [REG_PC], #1
392 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
395 ldrb REG_ADDR, [REG_PC], #1
398 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
402 add REG_ADDR, REG_ADDR, REG_X
403 and REG_ADDR, REG_ADDR, #0xFF
406 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
410 add REG_ADDR, REG_ADDR, REG_Y
411 and REG_ADDR, REG_ADDR, #0xFF
414 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
421 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
426 add REG_ADDR, REG_ADDR, REG_Y
427 bic REG_ADDR, REG_ADDR, #0x10000
428 and r0,REG_ADDR,#0xff
430 subgt REG_CYCLE,REG_CYCLE,#1*48
433 @ Indirect Indexed (for writes and rmws)
437 add REG_ADDR, REG_ADDR, REG_Y
438 bic REG_ADDR, REG_ADDR, #0x10000
442 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
443 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
445 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
448 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
453 ldrneb REG_ADDR, [REG_PC], #1
454 ldrneb r0, [REG_PC], #1
455 ldreqh REG_ADDR, [REG_PC], #2
456 orrne REG_ADDR, REG_ADDR, r0, lsl #8
459 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
463 add REG_ADDR, REG_ADDR, REG_X
464 bic REG_ADDR, REG_ADDR, #0x10000
465 and r0,REG_ADDR,#0xff
467 subgt REG_CYCLE,REG_CYCLE,#1*48
470 @ Absolute Indexed (for writes and rmws)
473 add REG_ADDR, REG_ADDR, REG_X
474 bic REG_ADDR, REG_ADDR, #0x10000
477 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
481 add REG_ADDR, REG_ADDR, REG_Y
482 bic REG_ADDR, REG_ADDR, #0x10000
483 and r0,REG_ADDR,#0xff
485 subgt REG_CYCLE,REG_CYCLE,#1*48
488 @ Absolute Indexed (for writes and rmws)
491 add REG_ADDR, REG_ADDR, REG_Y
492 bic REG_ADDR, REG_ADDR, #0x10000
495 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
498 @@@ r0 => 6502 ¤Î P ¥ì¥¸¥¹¥¿
499 @@@ REG_NZ <= Éü¸µ¤µ¤ì¤¿ REG_NZ
500 @@@ REG_P_REST <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
506 orrne REG_NZ, REG_NZ, #0x80 << 24
508 bic REG_P_REST, REG_P_REST, #P_REST_FLAGS
509 and r0, r0, #P_REST_FLAGS
510 orr REG_P_REST, REG_P_REST, r0
515 @@@ REG_NZ => ¸µ¤Ë¤¹¤ë REG_NZ
516 @@@ REG_P_REST => ¸µ¤Ë¤¹¤ë REG_P_REST
519 and r0, REG_P_REST, #P_REST_FLAGS
520 tst REG_NZ, #0x80 << 24
521 orrne r0, r0, #P_N_FLAG
523 orreq r0, r0, #P_Z_FLAG
524 orr r0, r0, #P_R_FLAG
535 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
536 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
545 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
546 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
548 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
553 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
554 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
558 bic REG_P_REST, REG_P_REST, #P_REST_C_FLAG
563 orr REG_P_REST, REG_P_REST, #P_REST_C_FLAG
568 @@bic REG_P_REST, REG_P_REST, #P_REST_D_FLAG
573 @@orr REG_P_REST, REG_P_REST, #P_REST_D_FLAG
578 bic REG_P_REST, REG_P_REST, #P_REST_I_FLAG
583 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
588 bic REG_P_REST, REG_P_REST, #P_REST_V_FLAG
591 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
592 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
594 @@@ TAX/TXA/TAY/TYA/TSX/TXS
596 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
599 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
603 mov REG_X, REG_A, lsr #24
604 mov REG_NZ, REG_A, asr #24
609 mov REG_A, REG_X, lsl #24
610 mov REG_NZ, REG_A, asr #24
615 mov REG_Y, REG_A, lsr #24
616 mov REG_NZ, REG_A, asr #24
621 mov REG_A, REG_Y, lsl #24
622 mov REG_NZ, REG_A, asr #24
627 mov REG_X, REG_S, lsr #24
628 orr REG_NZ, REG_X, REG_X, lsl #24
633 bic REG_S, REG_S, #0xFF << 24
634 orr REG_S, REG_S, REG_X, lsl #24
638 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
639 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
644 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
648 mov r0, REG_A, lsr #24
655 orr r0, r0, #P_B_FLAG
662 mov REG_A, r0, lsl #24
663 mov REG_NZ, REG_A, asr #24
672 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
673 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
683 mov REG_A, r0, lsl #24
684 mov REG_NZ, REG_A, asr #24
689 orr REG_NZ, r0, r0, lsl #24
836 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
837 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
847 mov r0, REG_A, lsr #24
941 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
942 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
944 @@@ INC/INX/INY/DEC/DEX/DEY
945 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
946 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
955 orr REG_NZ, r0, r0, lsl #24
960 and \reg, \reg, #0xFF
961 orr REG_NZ, \reg, \reg, lsl #24
967 orr REG_NZ, r0, r0, lsl #24
972 and \reg, \reg, #0xFF
973 orr REG_NZ, \reg, \reg, lsl #24
1001 opFE: @ INC $nnnn, X
1047 opDE: @ DEC $nnnn, X
1069 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1070 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1074 @@@ ¥¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤¤Î²Ã»»/¸º»»
1077 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1078 movs r1, REG_P_REST, lsr #1
1079 @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1080 subcs r0, r0, #0x100
1081 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î²Ã»»
1082 adcs REG_A, REG_A, r0, ror #8
1083 mov REG_NZ, REG_A, asr #24
1084 adc REG_P_REST, r1, r1
1085 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1086 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1090 @@ ¥¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1091 movs r1, REG_P_REST, lsr #1
1092 @@ ¥¥ã¥ê¡¼¤Ä¤¤Î¸º»»
1093 sbcs REG_A, REG_A, r0, lsl #24
1094 and REG_A, REG_A, #0xFF << 24
1095 mov REG_NZ, REG_A, asr #24
1096 adc REG_P_REST, r1, r1
1097 orrvs REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1098 bicvc REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1127 op7D: @ ADC $nnnn, X
1136 op79: @ ADC $nnnn, Y
1145 op61: @ ADC ($nn, X)
1154 op71: @ ADC ($nn), Y
1190 opFD: @ SBC $nnnn, X
1199 opF9: @ SBC $nnnn, Y
1208 opE1: @ SBC ($nn, X)
1217 opF1: @ SBC ($nn), Y
1227 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1228 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1232 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1238 and REG_A, REG_A, r0, lsl #24
1239 mov REG_NZ, REG_A, asr #24
1243 eor REG_A, REG_A, r0, lsl #24
1244 mov REG_NZ, REG_A, asr #24
1248 orr REG_A, REG_A, r0, lsl #24
1249 mov REG_NZ, REG_A, asr #24
1278 op3D: @ AND $nnnn, X
1287 op39: @ AND $nnnn, Y
1296 op21: @ AND ($nn, X)
1305 op31: @ AND ($nn), Y
1341 op5D: @ EOR $nnnn, X
1350 op59: @ EOR $nnnn, Y
1359 op41: @ EOR ($nn, X)
1368 op51: @ EOR ($nn), Y
1404 op1D: @ ORA $nnnn, X
1413 op19: @ ORA $nnnn, Y
1422 op01: @ ORA ($nn, X)
1431 op11: @ ORA ($nn), Y
1442 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1443 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1447 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1453 subs REG_NZ, REG_A, r0, lsl #24
1454 mov REG_NZ, REG_NZ, asr #24
1455 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1456 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1460 mov r1, \reg, lsl #24
1461 subs REG_NZ, r1, r0, lsl #24
1462 mov REG_NZ, REG_NZ, asr #24
1463 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1464 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1501 opDD: @ CMP $nnnn, X
1510 opD9: @ CMP $nnnn, Y
1519 opC1: @ CMP ($nn, X)
1528 opD1: @ CMP ($nn), Y
1580 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1581 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1585 @@@ Z <= A ¢Ê M == 0
1593 and REG_NZ, r0, REG_A, lsr #24
1594 @@ R0[7] => C, R0[6] => N
1595 movs r0, r0, lsl #25
1596 orrcs REG_NZ, REG_NZ, #0x80 << 24
1597 orrmi REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1598 bicpl REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1617 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1618 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1622 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1627 movs REG_NZ, r0, lsl #25
1628 mov r0, REG_NZ, lsr #24
1629 mov REG_NZ, REG_NZ, asr #24
1630 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1631 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1635 movs REG_A, REG_A, lsl #1
1636 mov REG_NZ, REG_A, asr #24
1637 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1638 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1645 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1646 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1651 movs REG_NZ, REG_A, lsr #25
1652 mov REG_A, REG_NZ, lsl #24
1653 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1654 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1687 op1E: @ ASL $nnnn, X
1729 op5E: @ LSR $nnnn, X
1741 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1742 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1752 movs r1, REG_P_REST, lsr #1
1755 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
1756 orrs REG_NZ, r0, r0, lsl #24
1758 adc REG_P_REST, r1, r1
1763 movs r1, REG_P_REST, lsr #1
1764 orrcs REG_A, REG_A, #0x80 << 16
1765 movs REG_A, REG_A, lsl #1
1766 mov REG_NZ, REG_A, asr #24
1767 adc REG_P_REST, r1, r1
1771 movs r1, REG_P_REST, lsr #1
1772 orrcs r0, r0, #0x100
1774 orr REG_NZ, r0, r0, lsl #24
1775 adc REG_P_REST, r1, r1
1779 movs r1, REG_P_REST, lsr #1
1780 mov REG_NZ, REG_A, rrx
1781 movs REG_NZ, REG_NZ, asr #24
1782 mov REG_A, REG_NZ, lsl #24
1783 adc REG_P_REST, r1, r1
1817 op3E: @ ROL $nnnn, X
1859 op7E: @ ROR $nnnn, X
1871 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1872 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1874 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1881 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1883 mov r3, r1 @ preserve immediate
1887 @@ R1 <- (PC&0xFF)+ReadValue
1891 subne REG_CYCLE,REG_CYCLE, #1*48
1895 ldreqsb r1, [REG_PC], #1
1897 add REG_PC, REG_PC, r1
1898 subeq REG_CYCLE, REG_CYCLE, #1*48
1905 ldrnesb r1, [REG_PC], #1
1907 add REG_PC, REG_PC, r1
1908 subne REG_CYCLE, REG_CYCLE, #1*48
1915 tst REG_P_REST, #P_REST_C_FLAG
1922 tst REG_P_REST, #P_REST_C_FLAG
1938 tst REG_NZ, #0x80 << 24
1939 @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1944 tst REG_NZ, #0x80 << 24
1950 tst REG_P_REST, #P_REST_V_FLAG
1957 tst REG_P_REST, #P_REST_V_FLAG
1963 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1964 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1969 mov REG_A, r0, lsl #24
1971 mov REG_NZ, REG_A, asr #24
1975 movs r0, r0, lsl #25
1977 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1978 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1982 mov REG_NZ, REG_A, asr #24
1983 @@restore value to write
1993 mov r0,REG_ADDR, lsr #8
2001 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2002 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2004 eor REG_A,REG_A,r0, lsl #24
2006 mov REG_NZ, REG_A, asr #24
2010 and r1,REG_X,REG_A, lsr #24
2012 orrcs REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2013 biccc REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2015 orr REG_NZ, REG_X, REG_X, lsl #24
2025 movs r1, REG_P_REST, lsr #1
2028 @@ NZ¤È¥¥ã¥ê¡¼¤ò¥»¥Ã¥È
2029 orrs REG_NZ, r0, r0, lsl #24
2031 adc REG_P_REST, r1, r1
2032 and REG_A,REG_A,r0,lsl #24
2036 movs r1, REG_P_REST, lsr #1
2037 orrcs r0, r0, #0x100
2041 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2042 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2072 op5F: @ SRE $nnnn, X
2083 op5B: @ SRE $nnnn, Y
2094 op43: @ SRE ($nn, X)
2105 op53: @ SRE ($nn), Y
2117 op9C: @ SHY $nnnn, X
2168 opFB: @ ISB $nnnn, Y
2181 opE3: @ ISB ($nn, X)
2194 opF3: @ ISB ($nn), Y
2228 opBF: @ LAX $nnnn, Y
2237 opA3: @ LAX ($nn, X)
2246 opB3: @ LAX ($nn), Y
2280 op1F: @ SLO $nnnn, X
2291 op1B: @ SLO $nnnn, Y
2302 op03: @ SLO ($nn, X)
2313 op13: @ SLO ($nn), Y
2358 opDF: @ DCP $nnnn, X
2371 opDB: @ DCP $nnnn, Y
2385 opC3: @ DCP ($nn, X)
2398 opD3: @ DCP ($nn), Y
2436 op3F: @ RLA $nnnn, X
2447 op3B: @ RLA $nnnn, Y
2458 op23: @ RLA ($nn, X)
2469 op33: @ RLA ($nn), Y
2509 op7F: @ RRA $nnnn, X
2522 op7B: @ RRA $nnnn, Y
2535 op63: @ RRA ($nn, X)
2548 op73: @ RRA ($nn), Y
2565 add REG_PC,REG_PC,#1
2569 add REG_PC,REG_PC,#2
2578 add REG_PC,REG_PC,#1
2589 op1C: @ NOP $nnnn, X
2595 add REG_PC,REG_PC,#2
2603 add REG_PC,REG_PC,#1
2608 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2609 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2619 and r0, REG_ADDR, #0xFF
2621 beq jmp_indirect_bug
2627 @@ BUG is : to not read word at REG_ADDR, because it loops
2628 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2632 and REG_ADDR, REG_ADDR, #0xff00
2634 orr r0, REG_PC, r0, lsl #8
2640 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2641 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2656 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2657 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2667 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2677 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2678 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2687 add REG_PC, REG_PC, #1
2688 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2691 orr REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2694 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2695 mov REG_ADDR, #0x10000
2696 sub REG_ADDR, REG_ADDR, #IRQ_VECTOR
2701 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2702 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2718 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2719 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2736 @@@ WARNING: decrements REG_PC
2739 ldr r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2740 sub REG_PC, REG_PC, #1
2743 bic REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2746 tst REG_P_REST, #FCEU_IQNMI<<8
2747 orreq REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2748 bic REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2749 mov REG_ADDR, #0x10000
2750 subeq REG_ADDR, REG_ADDR, #IRQ_VECTOR
2751 subne REG_ADDR, REG_ADDR, #NMI_VECTOR
2762 stmfd r13!,{r4-r11,lr}
2764 ldr r0, =nes_registers
2769 @@REG_P_REST = 0, don't touch REG_S
2770 bic REG_P_REST, REG_P_REST, #0xff
2772 @ fceu: set MapIRQHook present flag
2773 ldr r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2775 orrne REG_P_REST, REG_P_REST, #1<<16
2776 biceq REG_P_REST, REG_P_REST, #1<<16
2778 @@ R bit is always 1
2779 orr REG_NZ, REG_NZ, #P_R_FLAG
2782 orr REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2784 mov REG_ADDR, #0x10000
2785 sub REG_ADDR, REG_ADDR, #RESET_VECTOR
2789 ldr r0, =nes_registers
2792 ldmfd r13!,{r4-r11,lr}
2796 @@@ low-level memhandlers
2803 orr r1, r1, r1, lsr #4
2804 ldr r1, [r2, r1, lsl #2] @ if (ARead[0xfff0] == CartBR)
2808 mov r1, REG_ADDR, lsr #11
2809 ldr r2, [r2, r1, lsl #2]
2810 ldrb r0, [r2, REG_ADDR]
2817 @ must preserve r3 for the callers too
2818 @ TODO: check if all of saves are needed, _DB (is full needed?)
2819 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2820 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2821 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2823 mov REG_P_REST, r3 @ r8
2826 bic r0, REG_ADDR, #0x00ff0000
2828 ldr pc, [r2, r0, lsl #2]
2830 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2833 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2834 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2835 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2836 strb r0, [REG_OP_TABLE, #(OTOFFS_X + 0x10)] @ X.DB
2844 @ must preserve r3 for the callers too
2845 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2846 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2847 str REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2849 mov REG_P_REST, r3 @ r8
2853 bic r0, REG_ADDR, #0x00ff0000
2855 ldr pc, [r2, r0, lsl #2]
2857 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
2860 ldr REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)] @ might get rebased
2861 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
2862 ldr REG_CYCLE, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)] @ might get used
2870 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2871 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2873 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2875 @@@ REG_CYCLE => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2876 @@@ REG_CYCLE <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2879 stmfd r13!,{r4-r11,lr}
2881 ldr r0, =nes_registers
2884 @ ldr REG_OP_TABLE, = cpu_exec_table @ set on init
2889 ldr r0, =nes_registers
2892 ldmfd r13!,{r4-r11,lr}
2896 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2900 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2901 @ they must be in the same section
2907 .long op00, op01, op02, op03, op04, op05, op06, op07
2908 .long op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2910 .long op10, op11, op12, op13, op14, op15, op16, op17
2911 .long op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2913 .long op20, op21, op22, op23, op24, op25, op26, op27
2914 .long op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2916 .long op30, op31, op32, op33, op34, op35, op36, op37
2917 .long op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2919 .long op40, op41, op42, op43, op44, op45, op46, op47
2920 .long op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2922 .long op50, op51, op52, op53, op54, op55, op56, op57
2923 .long op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2925 .long op60, op61, op62, op63, op64, op65, op66, op67
2926 .long op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2928 .long op70, op71, op72, op73, op74, op75, op76, op77
2929 .long op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2931 .long op80, op81, op82, op83, op84, op85, op86, op87
2932 .long op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2934 .long op90, op91, op92, op93, op94, op95, op96, op97
2935 .long op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2937 .long opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2938 .long opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
2940 .long opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
2941 .long opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
2943 .long opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
2944 .long opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
2946 .long opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
2947 .long opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
2949 .long opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
2950 .long opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
2952 .long opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
2953 .long opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
2956 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
2961 #ifndef DEBUG_ASM_6502
2968 @ TODO: write code which keeps it up-to-date
2971 #ifndef DEBUG_ASM_6502
2986 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2987 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2989 @@@ Undefined Opcodes
2999 @opDF: @ DCP $nnnn, X
3000 @opDB: @ DCP $nnnn, Y
3001 @opC3: @ DCP ($nn, X)
3002 @opD3: @ DCP ($nn), Y
3009 @opFF: @ ISB $nnnn, X
3010 @opFB: @ ISB $nnnn, Y
3011 @opE3: @ ISB ($nn, X)
3012 @opF3: @ ISB ($nn), Y
3030 @opA3: @ LAX ($nn, X)
3034 @opBF: @ LAX $nnnn, Y
3036 @opB3: @ LAX ($nn), Y
3041 @op3F: @ RLA $nnnn, X
3042 @op23: @ RLA ($nn, X)
3046 @op7F: @ RRA $nnnn, X
3047 @op63: @ RRA ($nn, X)
3051 op83: @ SAX ($nn, X)
3053 op9F: @ SHA $nnnn, Y
3054 op93: @ SHA ($nn), Y
3055 op9B: @ SHS $nnnn, Y
3056 op9E: @ SHX $nnnn, Y
3057 @op03: @ SLO ($nn, X)
3061 @op1F: @ SLO $nnnn, X
3065 @op5F: @ SRE $nnnn, X
3066 @op5B: @ SRE $nnnn, Y
3067 @op43: @ SRE ($nn, X)
3073 @@@@@@@@@@@@@@@@@@@@@@@@@@
3075 @@@@@@@@@@@@@@@@@@@@@@@@@@
3086 .globl nes_registers @ TODO: hide?
3088 #ifndef DEBUG_ASM_6502
3092 .globl MapIRQHook @ (int a)
3094 .globl X6502_Reset_a @ (void);
3095 .globl X6502_Power_a @ (void);
3096 .globl X6502_Run_a @ (int32 cycles);
3097 .globl TriggerIRQ_a @ (void);
3098 .globl TriggerNMI_a @ (void);
3099 .globl TriggerNMINSF_a @ (void);
3100 .globl X6502_AddCycles_a @ (int x);
3101 .globl X6502_IRQBegin_a @ (int w);
3102 .globl X6502_IRQEnd_a @ (int w);
3103 .globl X6502_rebase_a @ (void);
3108 .equiv X6502_Reset_a, reset_cpu
3109 .equiv X6502_Run_a, cpu_exec
3116 ldr r1, =nes_registers
3121 bne X6502_Power_loop1
3122 ldr r0, =cpu_exec_table
3129 mov r0, #FCEU_IQTEMP
3132 ldr r2, =nes_registers
3134 ldr r1, [r2, #0x10] @ REG_P_REST
3135 orr r1, r1, r0, lsl #8
3141 ldr r2, =nes_registers
3144 bic r1, r1, r0, lsl #8
3160 ldr r2, =nes_registers
3162 mvn r3, #47 @ r3=-48
3168 @ rebase PC when not executing or in memhandlers
3170 stmfd sp!,{REG_PC,REG_OP_TABLE}
3171 ldr REG_OP_TABLE, =cpu_exec_table
3172 ldr r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3173 ldr r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3176 str REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3177 ldmfd sp!,{REG_PC,REG_OP_TABLE}
3182 @ the nasty MapIRQHook thing from FCE..
3184 @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3185 str REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3186 mov REG_P_REST, lr @ r8
3188 @ if somebody modifies MapIRQHook without calling reset, we are doomed
3190 ldr pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3192 ldr REG_OP_TABLE, =cpu_exec_table @ got trashed because was in r12
3194 ldr REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)] @ might set irq
3198 @ vim:filetype=armasm