d649f9a9add7414091de117da49dd8d4e8dd5191
[fceu.git] / ncpu.S
1 /*************************************
2   Little John GP32
3   File : ncpu.S
4   Authors : FCA author
5             modified and adapted by Yoyo.
6             adapted for fceu by notaz, 2007.
7 **************************************/
8
9 #include "ncpu.h"
10
11 @@@
12 @@@ Offets from REG_OP_TABLE
13 @@@
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_IRQH_CYC  (MapIRQHookCyc    - cpu_exec_table)
20 #define OTOFFS_X         (X_               - cpu_exec_table)
21
22 @ fceu
23 #define FCEU_IQNMI      0x08
24 #define FCEU_IQTEMP     0x80
25
26
27 @@@@@@@@@@@@@@@@@@@@@@@@@@
28
29
30 @       SECTION_FAST
31         SECTION_TEXT
32         ALIGN
33
34 /*
35 bbbb:
36 .ascii "rebase: %04x"
37 .byte 0x0a,0
38 .align 4
39 */
40
41 @@@
42 @@@ r0  =  Address (unbased)
43 @@@ uses REG_OP_TABLE; sets REG_PC; trashes r1,r2; keeps r0
44 @@@
45 .macro  REBASE_PC
46         @ FIXME: do something with mem not in Page[].
47 @       stmfd   sp!, {r0-r3,r12,lr}
48 @       mov     r1, r0
49 @       ldr     r0, =bbbb
50 @       bl      printf
51 @       ldmfd   sp!, {r0-r3,r12,lr}
52
53         cmp     r0, #0x2000
54         ldrge   r1, =Page
55         movge   r2, r0, lsr #11
56         ldrge   r2, [r1, r2, lsl #2]
57         andlt   r2, r0, #0xf800
58         addlt   r1, REG_OP_TABLE, #OTOFFS_NES_RAM
59         sublt   r2, r1, r2
60         str     r2, [REG_OP_TABLE, #OTOFFS_PC_BASE]
61         add     REG_PC, r2, r0
62 .endm
63
64
65
66 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
67 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
68 @@@
69 @@@ CYCLE_NEXT
70 @@@
71 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
72 @@@ ¤¿¤À¤·³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤¤
73 @@@
74 @@@ ¤Ê¤ó¤«Ì¾Á°¤¬ÊѤÀ¤Ê(¤É¡¼¤Ç¤â¤¤¡¼¤±¤É¡¼
75 @@@
76 .macro  CYCLE_NEXT      n, hook_check=1
77         @@DEBUG_INFO
78
79         subs    REG_CYCLE, REG_CYCLE, #\n*48
80         ble     cpu_exec_end
81 .if \hook_check
82         tst     REG_P_REST, #1<<16
83         blne    do_irq_hook
84 .endif
85         ldrb    r0, [REG_PC], #1
86         tst     REG_P_REST, #0xff<<8
87         ldreq   pc, [REG_OP_TABLE, r0, lsl #2]
88
89         @ do some messing to find out which IRQ is pending..
90         tst     REG_P_REST, #FCEU_IQNMI<<8
91         bne     do_int
92         tst     REG_P_REST, #P_REST_I_FLAG
93         @@ if I_FLAG=1, continue execution, don't trigger IRQ
94         bicne   REG_P_REST, REG_P_REST, #FCEU_IQTEMP<<8
95         ldrne   pc, [REG_OP_TABLE, r0, lsl #2]
96         @@ I_FLAG=0 and REST is checked, we have a IRQ
97         b       do_int
98 .endm
99
100
101 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
102 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
103 @@@
104 @@@ CYCLE_NEXT_INT
105 @@@
106 @@@ »Ä¤ê¥µ¥¤¥¯¥ë¤ò¥Á¥§¥Ã¥¯¤·¤Æ»Ä¤Ã¤Æ¤¤¤ì¤Ð¼¡¤ÎÌ¿Îá¤ò¼Â¹Ô
107 @@@ CLI¡¦PHP¤Ê¤É¥Õ¥é¥°¤òÊѹ¹¤·¤¿¾ì¹ç¤Ï¤³¤ì
108 @@@
109 .macro  CYCLE_NEXT_INT  n
110 @       @@DEBUG_INFO
111 @
112 @       subs    REG_CYCLE, REG_CYCLE, #\n*48
113 @       bgt     cpu_exec_check_int
114 @       RETURN_FROM_CPU_EXEC
115         CYCLE_NEXT      \n
116 .endm
117
118 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
119 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
120 @@@
121 @@@ ¥¼¥í¥Ú¡¼¥¸¤«¤éÆɤà
122 @@@
123 .macro  ZP_READ
124         add     REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
125         ldrb    r0, [REG_ADDR, REG_OP_TABLE]!
126 .endm
127
128 @@@
129 @@@ Æɤó¤À¸å¡¤½ñ¤¯¾ì¹ç¤Ï¤³¤ì¤ò»È¤¦(¥·¥Õ¥È¤Ê¤É)¡£¤Ç¤â¡¤¾å¤ÈƱ¤¸
130 @@@
131 .macro  ZP_READ_W
132         ZP_READ
133 .endm
134
135 @@@
136 @@@ ¥¢¥É¥ì¥¹¤òÆɤà
137 @@@
138 .macro  ZP_READ_ADDR
139         ZP_READ
140         ldrb    REG_ADDR, [REG_ADDR, #1]
141         orr     REG_ADDR, r0, REG_ADDR, lsl #8
142 .endm
143
144 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
145 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
146 @@@
147 @@@ ¥¼¥í¥Ú¡¼¥¸¤Ë½ñ¤¯
148 @@@
149 .macro  ZP_WRITE        reg=r0
150         add     REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
151         strb    \reg, [REG_ADDR, REG_OP_TABLE]
152 .endm
153
154 @@@
155 @@@ ZP_READ_W ¤ÇÆɤó¤À¸å¡¤Æ±¤¸¥¢¥É¥ì¥¹¤Ë½ñ¤¯
156 @@@
157 .macro  ZP_WRITE_W
158         strb    r0, [REG_ADDR]
159 .endm
160
161
162 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
163 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
164 @@@
165 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤ÎÆɤ߽ñ¤­
166 @@@
167 @@@ REG_ADDR    => 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹
168 @@@ r0          => ½ñ¤¯¥Ð¥¤¥È(write)
169 @@@ r0          <= Æɤó¤À¥Ð¥¤¥È(read)¡¦½ñ¤¤¤¿¥Ð¥¤¥È(write)
170 @@@
171
172 @@@
173 @@@ 3¼ïÎà¤ÎÌ¿Î᤬¤¢¤ë
174 @@@
175 @@@ °ìÈÖ¿¤¤¤Î¤¬
176 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é8¥Ó¥Ã¥È¥í¡¼¥É¤¹¤ë¤À¤±¤ÎÌ¿Îá
177 @@@ ¼¡¤Ë¿¤¤¤Î¤¬
178 @@@ ¥í¡¼¥É¡¤·×»»¡¤¥¹¥È¥¢¤ò¤¹¤ëÌ¿Îá
179 @@@ »Ä¤ê¤Ï
180 @@@ ¥¹¥È¥¢¤¹¤ë¤À¤±¤ÎÌ¿Îá
181
182 @@@
183 @@@ 16¥Ó¥Ã¥È¥¢¥É¥ì¥¹¤«¤é¥í¡¼¥É¤Î¤ß
184 @@@
185 @@@ RAM¤«¤é¤Î¥í¡¼¥É¤¬°ìÈÖ¿¤¤¤Î¤ÇÍ¥À褹¤ë
186 @@@
187 @@@ READ_1
188 @@@ OP
189 @@@ READ_2
190 @@@ OP
191 @@@
192 @@@ ¤Î¤è¤¦¤Ë»È¤¦
193
194 .macro  READ_1
195         movs    r1, REG_ADDR, lsr #13
196         adr     lr, 9999f
197         @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
198         @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
199         ldrne   pc, [lr, -r1, lsl #2]
200         @@ RAM¤«¤é¥í¡¼¥É
201         bic     r0, REG_ADDR, #0x1800
202         add     r0, r0, #OTOFFS_NES_RAM
203         ldrb    r0, [r0, REG_OP_TABLE]
204 .endm
205
206 .macro  READ_2
207         .long   read_rom_byte
208         .long   read_rom_byte
209         .long   read_rom_byte
210         .long   read_rom_byte
211         .long   read_save_ram
212         .long   read_high_reg
213         .long   read_ppu_reg
214 9999:
215 .endm
216
217 .macro  READ
218         mov     r1, REG_ADDR, lsr #13
219         adr     lr, 1f
220         ldr     pc, [pc, r1, lsl #2]
221         nop
222         .long   2f              @ fast path
223         .long   read_ppu_reg
224         .long   read_high_reg
225         .long   read_save_ram
226         .long   read_rom_byte
227         .long   read_rom_byte
228         .long   read_rom_byte
229         .long   read_rom_byte
230 2:
231         bic     r0, REG_ADDR, #0x1800
232         add     r0, r0, #OTOFFS_NES_RAM
233         ldrb    r0, [r0, REG_OP_TABLE]
234         @@ ¤È¤¤¤¦¤ï¤±¤Ç¥¸¥ã¥ó¥×¤¹¤ëɬÍפϤʤ¤
235 1:
236 .endm
237
238 @@@
239 @@@ Æɤó¤À¤¢¤È½ñ¤¯¾ì¹ç
240 @@@
241 @@@ READ_WRITE_1
242 @@@ OP
243 @@@ READ_WRITE_2
244 @@@
245 @@@ READ_WRITE_3
246 @@@ OP
247 @@@ READ_WRITE_4
248 @@@ ¤Î¤è¤¦¤Ë»È¤¦
249 @@@ OP¤Ç¤Ïr3¤òÊݸ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
250
251 .macro  READ_WRITE_1
252         movs    r3, REG_ADDR, lsr #13
253         adr     lr, 9999f
254         @@ 0¤Ç¤Ê¤¤»þ¤Ï¥¸¥ã¥ó¥×¤¹¤ë¡£
255         @@ ¤Á¤ç¤Ã¤È¹©Éפ·¤Æ1¥¯¥í¥Ã¥¯¸º¤é¤¹
256         ldrne   pc, [lr, -r3, lsl #2]
257         @@ RAM¤«¤é¥í¡¼¥É
258         bic     REG_ADDR, REG_ADDR, #0x1800
259         add     REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
260         ldrb    r0, [REG_ADDR, REG_OP_TABLE]!
261 .endm
262
263 .macro  READ_WRITE_2
264         strb    r0, [REG_ADDR]
265 .endm
266
267 .macro  READ_WRITE_3
268         .long   read_rom_byte
269         .long   read_rom_byte
270         .long   read_rom_byte
271         .long   read_rom_byte
272         .long   read_save_ram
273         .long   read_high_reg
274         .long   read_ppu_reg
275 9999:
276 .endm
277
278 .macro  READ_WRITE_4
279         adr     lr, 1f
280         ldr     pc, [pc, r3, lsl #2]
281         nop
282         nop
283         .long   write_ppu_reg
284         .long   write_high_reg
285         .long   write_save_ram
286         .long   write_rom_byte
287         .long   write_rom_byte
288         .long   write_rom_byte
289         .long   write_rom_byte
290 1:
291 .endm
292
293 @@@
294 @@@ ½ñ¤­¹þ¤ß¤À¤±¤Î¾ì¹ç
295 @@@
296 @@@ WRITE_1
297 @@@ TAIL
298 @@@ WRITE_2
299 @@@ TAIL
300 @@@ ¤È¤¹¤ë
301
302 .macro  WRITE_1
303         @@DEBUG_INFO
304
305         movs    r1, REG_ADDR, lsr #13
306         adr     lr, 9999f
307         ldrne   pc, [lr, -r1, lsl #2]
308         bic     REG_ADDR, REG_ADDR, #0x1800
309         add     REG_ADDR, REG_ADDR, #OTOFFS_NES_RAM
310
311         strb    r0, [REG_ADDR, REG_OP_TABLE]
312 .endm
313
314 .macro  WRITE_2
315         .long   write_rom_byte
316         .long   write_rom_byte
317         .long   write_rom_byte
318         .long   write_rom_byte
319         .long   write_save_ram
320         .long   write_high_reg
321         .long   write_ppu_reg
322 9999:
323 .endm
324
325 @@@
326 @@@ ¤½¤·¤Æ¡¤¤³¤ì¤òɬÍפȤ¹¤ë¤Î¤Ï¥¸¥ã¥ó¥×Ì¿Îᡦ³ä¤ê¹þ¤ß¡¦¥ê¥»¥Ã¥È¤Î¤ß¤Ç¤¢¤ë
327 @@@ ¤¢¤Þ¤ê½ÅÍפǤʤ¤¤Î¤ÇŬÅö¤Ç¤è¤¤¡£
328 @@@ ¥Æ¥ó¥Ý¥é¥ê¤Ë»È¤¨¤ë¥ì¥¸¥¹¥¿¤¬Â­¤ê¤Ê¤¤¤Î¤Ç REG_PC ¤ò»È¤¦¤¬µ¤¤Ë¤¹¤ë¤Ê
329 @@@ ¤¹¤°¸å¤Ç¾å½ñ¤­¤µ¤ì¤ë¡£
330 @@@ REG_ADDR¤òÊѹ¹¤¹¤ë¤¬µ¤¤Ë¤¹¤ë¤Ê
331 @@@
332 .macro  READ_WORD
333         READ
334         mov     REG_PC, r0
335         add     REG_ADDR, REG_ADDR, #1
336         READ
337         orr     r0, REG_PC, r0, lsl #8
338 .endm
339
340
341 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
342 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
343 @@@
344 @@@ ¥¹¥¿¥Ã¥¯¤Î¥×¥Ã¥·¥å¡¦¥Ý¥Ã¥×
345 @@@
346 @@@
347
348 @@  Push byte <- r0
349 .macro  PUSH_BYTE
350         add     r1, REG_OP_TABLE, #OTOFFS_NES_STACK
351         strb    r0, [r1, REG_S, lsr #24]
352         sub     REG_S, REG_S, #1 << 24
353 .endm
354
355 @@  Push word <- r0
356 .macro  PUSH_WORD
357         add     r1, REG_OP_TABLE, #OTOFFS_NES_STACK
358         mov     r2, r0, lsr #8
359         strb    r2, [r1, REG_S, lsr #24]
360         @@ ¤¤¤Á¤ª¤¦ REG_S ¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤òµ¤¤Ë¤·¤Æ¤ß¤ë
361         sub     REG_S, REG_S, #1 << 24
362         strb    r0, [r1, REG_S, lsr #24]
363         sub     REG_S, REG_S, #1 << 24
364 .endm
365
366 @@  Pop byte -> r0
367 .macro  POP_BYTE
368         add     r0, REG_OP_TABLE, #OTOFFS_NES_STACK
369         add     REG_S, REG_S, #1 << 24
370         ldrb    r0, [r0, REG_S, lsr #24]
371 .endm
372
373 @@  Pop word -> r0
374 .macro  POP_WORD
375         add     r0, REG_OP_TABLE, #OTOFFS_NES_STACK
376         add     REG_S, REG_S, #1 << 24
377         ldrb    r1, [r0, REG_S, lsr #24]
378         add     REG_S, REG_S, #1 << 24
379         ldrb    r0, [r0, REG_S, lsr #24]
380         orr     r0, r1, r0, lsl #8
381 .endm
382
383 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
384 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
385 @@@
386 @@@ ¥¢¥É¥ì¥Ã¥·¥ó¥°¥â¡¼¥É
387 @@@
388
389 .macro  IMPLIED
390         @@ ¤Ê¤Ë¤âɬÍפʤ¤
391 .endm
392
393 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
394 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
395 @@@
396 @@@ ¥ª¥Ú¥é¥ó¥É¤¬1¥Ð¥¤¥È¤Î¾ì¹ç
397 @@@
398
399 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
400 @@@ #$nn
401 .macro  IMM_VALUE
402         ldrb    r0, [REG_PC], #1
403 .endm
404
405 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
406 @@@ $nn
407 .macro  ZERO_ADDR
408         ldrb    REG_ADDR, [REG_PC], #1
409 .endm
410
411 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
412 @@@ $nn, X
413 .macro  ZEROX_ADDR
414         ZERO_ADDR
415         add     REG_ADDR, REG_ADDR, REG_X
416         and     REG_ADDR, REG_ADDR, #0xFF
417 .endm
418
419 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
420 @@@ $nn, Y
421 .macro  ZEROY_ADDR
422         ZERO_ADDR
423         add     REG_ADDR, REG_ADDR, REG_Y
424         and     REG_ADDR, REG_ADDR, #0xFF
425 .endm
426
427 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
428 @@@ ($nn, X)
429 .macro  INDX_ADDR
430         ZEROX_ADDR
431         ZP_READ_ADDR
432 .endm
433
434 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
435 @@@ ($nn), Y
436 .macro  INDY_ADDR
437         ZERO_ADDR
438         ZP_READ_ADDR
439         add     REG_ADDR, REG_ADDR, REG_Y
440         bic     REG_ADDR, REG_ADDR, #0x10000
441         and     r0,REG_ADDR,#0xff
442         cmp     REG_Y,r0
443         subgt   REG_CYCLE,REG_CYCLE,#1*48
444 .endm
445
446 @ Indirect Indexed (for writes and rmws)
447 .macro  INDY_ADDR_W
448         ZERO_ADDR
449         ZP_READ_ADDR
450         add     REG_ADDR, REG_ADDR, REG_Y
451         bic     REG_ADDR, REG_ADDR, #0x10000
452 .endm
453
454
455 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
456 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
457 @@@
458 @@@ ¥ª¥Ú¥é¥ó¥É¤¬2¥Ð¥¤¥È¤Î¾ì¹ç
459 @@@
460
461 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
462 @@@ $nnnn
463
464 .macro  ABS_ADDR
465         tst     REG_PC, #1
466         ldrneb  REG_ADDR, [REG_PC], #1
467         ldrneb  r0, [REG_PC], #1
468         ldreqh  REG_ADDR, [REG_PC], #2
469         orrne   REG_ADDR, REG_ADDR, r0, lsl #8
470 .endm
471
472 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
473 @@@ $nnnn, X
474 .macro  ABSX_ADDR
475         ABS_ADDR
476         add     REG_ADDR, REG_ADDR, REG_X
477         bic     REG_ADDR, REG_ADDR, #0x10000
478         and     r0,REG_ADDR,#0xff
479         cmp     REG_X,r0
480         subgt   REG_CYCLE,REG_CYCLE,#1*48
481 .endm
482
483 @ Absolute Indexed (for writes and rmws)
484 .macro  ABSX_ADDR_W
485         ABS_ADDR
486         add     REG_ADDR, REG_ADDR, REG_X
487         bic     REG_ADDR, REG_ADDR, #0x10000
488 .endm
489
490 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
491 @@@ $nnnn, Y
492 .macro  ABSY_ADDR
493         ABS_ADDR
494         add     REG_ADDR, REG_ADDR, REG_Y
495         bic     REG_ADDR, REG_ADDR, #0x10000
496         and     r0,REG_ADDR,#0xff
497         cmp     REG_Y,r0
498         subgt   REG_CYCLE,REG_CYCLE,#1*48
499 .endm
500
501 @ Absolute Indexed (for writes and rmws)
502 .macro  ABSY_ADDR_W
503         ABS_ADDR
504         add     REG_ADDR, REG_ADDR, REG_Y
505         bic     REG_ADDR, REG_ADDR, #0x10000
506 .endm
507
508 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
509
510 @@@ P ¤òÉü¸µ¤¹¤ë
511 @@@ r0          => 6502 ¤Î P ¥ì¥¸¥¹¥¿
512 @@@ REG_NZ      <= Éü¸µ¤µ¤ì¤¿ REG_NZ
513 @@@ REG_P_REST  <= Éü¸µ¤µ¤ì¤¿ REG_P_REST
514 .macro  LOAD_P
515         mov     REG_NZ, #0
516         tst     r0, #P_Z_FLAG
517         moveq   REG_NZ, #0x01
518         tst     r0, #P_N_FLAG
519         orrne   REG_NZ, REG_NZ, #0x80 << 24
520
521         bic     REG_P_REST, REG_P_REST, #P_REST_FLAGS
522         and     r0, r0, #P_REST_FLAGS
523         orr     REG_P_REST, REG_P_REST, r0
524 .endm
525
526 @@@ P ¤òÊݸ¤¹¤ë
527 @@@
528 @@@ REG_NZ      => ¸µ¤Ë¤¹¤ë REG_NZ
529 @@@ REG_P_REST  => ¸µ¤Ë¤¹¤ë REG_P_REST
530 @@@ r0          <= 6502 ¤Î P
531 .macro  SAVE_P
532         and     r0, REG_P_REST, #P_REST_FLAGS
533         tst     REG_NZ, #0x80 << 24
534         orrne   r0, r0, #P_N_FLAG
535         tst     REG_NZ, #0xFF
536         orreq   r0, r0, #P_Z_FLAG
537         orr     r0, r0, #P_R_FLAG
538 .endm
539
540 @       SECTION_FAST
541         SECTION_TEXT
542         ALIGN
543 @@@
544 @@@ Op-codes
545 @@@
546
547
548 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
549 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
550 @@@
551 @@@ NOP
552 @@@
553 @@@ ¤Ê¤Ë¤â¤·¤Ê¤¤
554 opEA:   @ NOP
555         IMPLIED
556         CYCLE_NEXT      2
557
558 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
559 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
560 @@@
561 @@@ CLC/SEC/CLD/SED/CLI/SEI/CLV
562 @@@
563 @@@ ¥Õ¥é¥°ÁàºîÌ¿Îá
564 @@@ ¤¹¤Ù¤Æ1¥Ð¥¤¥È
565 @@@
566 @@@ ¤³¤ì¤ÇÊѹ¹¤Ç¤­¤ë¥Õ¥é¥°¤ÏÁ´¤ÆREG_P_REST¤Ë¤¢¤ë
567 @@@ I¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ï³ä¤ê¹þ¤ß¤ò¥Á¥§¥Ã¥¯¤·¤Ê¤ì¤Ð¤Ê¤é¤Ê¤¤
568 @@@
569 op18:   @ CLC
570         IMPLIED
571         bic     REG_P_REST, REG_P_REST, #P_REST_C_FLAG
572         CYCLE_NEXT      2
573
574 op38:   @ SEC
575         IMPLIED
576         orr     REG_P_REST, REG_P_REST, #P_REST_C_FLAG
577         CYCLE_NEXT      2
578
579 opD8:   @ CLD
580         IMPLIED
581         @@bic   REG_P_REST, REG_P_REST, #P_REST_D_FLAG
582         CYCLE_NEXT      2
583
584 opF8:   @ SED
585         IMPLIED
586         @@orr   REG_P_REST, REG_P_REST, #P_REST_D_FLAG
587         CYCLE_NEXT      2
588
589 op58:   @ CLI
590         IMPLIED
591         bic     REG_P_REST, REG_P_REST, #P_REST_I_FLAG
592         CYCLE_NEXT_INT  2
593
594 op78:   @ SEI
595         IMPLIED
596         orr     REG_P_REST, REG_P_REST, #P_REST_I_FLAG
597         CYCLE_NEXT      2
598
599 opB8:   @ CLV
600         IMPLIED
601         bic     REG_P_REST, REG_P_REST, #P_REST_V_FLAG
602         CYCLE_NEXT      2
603
604 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
605 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
606 @@@
607 @@@ TAX/TXA/TAY/TYA/TSX/TXS
608 @@@
609 @@@ ¥ì¥¸¥¹¥¿´ÖžÁ÷Ì¿Îá
610 @@@ ¤¹¤Ù¤Æ1¥Ð¥¤¥È
611 @@@
612 @@@ TXS°Ê³°¤ÏNZ¤òÊѹ¹¤¹¤ë
613 @@@
614 opAA:   @ TAX
615         IMPLIED
616         mov     REG_X, REG_A, lsr #24
617         mov     REG_NZ, REG_A, asr #24
618         CYCLE_NEXT      2
619
620 op8A:   @ TXA
621         IMPLIED
622         mov     REG_A, REG_X, lsl #24
623         mov     REG_NZ, REG_A, asr #24
624         CYCLE_NEXT      2
625
626 opA8:   @ TAY
627         IMPLIED
628         mov     REG_Y, REG_A, lsr #24
629         mov     REG_NZ, REG_A, asr #24
630         CYCLE_NEXT      2
631
632 op98:   @ TYA
633         IMPLIED
634         mov     REG_A, REG_Y, lsl #24
635         mov     REG_NZ, REG_A, asr #24
636         CYCLE_NEXT      2
637
638 opBA:   @ TSX
639         IMPLIED
640         mov     REG_X, REG_S, lsr #24
641         orr     REG_NZ, REG_X, REG_X, lsl #24
642         CYCLE_NEXT      2
643
644 op9A:   @ TXS
645         IMPLIED
646         bic     REG_S, REG_S, #0xFF << 24
647         orr     REG_S, REG_S, REG_X, lsl #24
648         CYCLE_NEXT      2
649
650
651 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
652 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
653 @@@
654 @@@ PHA/PHP/PLA/PLP
655 @@@
656 @@@ ¥¹¥¿¥Ã¥¯ÁàºîÌ¿Îá
657 @@@ PLA¤ÏNZ¤òPLP¤ÏÁ´¤Æ¤Î¥Õ¥é¥°¤òÊѹ¹¤¹¤ë
658 @@@
659 op48:   @ PHA
660         IMPLIED
661         mov     r0, REG_A, lsr #24
662         PUSH_BYTE
663         CYCLE_NEXT      3
664
665 op08:   @ PHP
666         IMPLIED
667         SAVE_P
668         orr     r0, r0, #P_B_FLAG
669         PUSH_BYTE
670         CYCLE_NEXT      3
671
672 op68:   @ PLA
673         IMPLIED
674         POP_BYTE
675         mov     REG_A, r0, lsl #24
676         mov     REG_NZ, REG_A, asr #24
677         CYCLE_NEXT      4
678
679 op28:   @ PLP
680         IMPLIED
681         POP_BYTE
682         LOAD_P
683         CYCLE_NEXT      4
684
685 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
686 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
687 @@@
688 @@@ LDA/LDX/LDY
689 @@@
690 @@@ ¥ì¥¸¥¹¥¿¤Ë¥í¡¼¥É
691 @@@
692 @@@ NZVC
693 @@@ ----
694 @@@ **--
695 .macro  OP_LDA
696         mov     REG_A, r0, lsl #24
697         mov     REG_NZ, REG_A, asr #24
698 .endm
699
700 .macro  OP_LDXY reg
701         mov     \reg, r0
702         orr     REG_NZ, r0, r0, lsl #24
703 .endm
704
705 .macro  OP_LDX
706         OP_LDXY REG_X
707 .endm
708 .macro  OP_LDY
709         OP_LDXY REG_Y
710 .endm
711
712 opA9:   @ LDA #$nn
713         IMM_VALUE
714         OP_LDA
715         CYCLE_NEXT      2
716
717 opA5:   @ LDA $nn
718         ZERO_ADDR
719         ZP_READ
720         OP_LDA
721         CYCLE_NEXT      3
722
723 opB5:   @ LDA $nn, X
724         ZEROX_ADDR
725         ZP_READ
726         OP_LDA
727         CYCLE_NEXT      4
728
729 opAD:   @ LDA $nnnn
730         ABS_ADDR
731         READ_1
732         OP_LDA
733         CYCLE_NEXT      4
734         READ_2
735         OP_LDA
736         CYCLE_NEXT      4
737
738 opBD:   @ LDA $nnnn, X
739         ABSX_ADDR
740         READ_1
741         OP_LDA
742         CYCLE_NEXT      4
743         READ_2
744         OP_LDA
745         CYCLE_NEXT      4
746
747 opB9:   @ LDA $nnnn, Y
748         ABSY_ADDR
749         READ_1
750         OP_LDA
751         CYCLE_NEXT      4
752         READ_2
753         OP_LDA
754         CYCLE_NEXT      4
755
756 opA1:   @ LDA ($nn, X)
757         INDX_ADDR
758         READ_1
759         OP_LDA
760         CYCLE_NEXT      6
761         READ_2
762         OP_LDA
763         CYCLE_NEXT      6
764
765 opB1:   @ LDA ($nn), Y
766         INDY_ADDR
767         READ_1
768         OP_LDA
769         CYCLE_NEXT      5
770         READ_2
771         OP_LDA
772         CYCLE_NEXT      5
773
774
775 opA2:   @ LDX #$nn
776         IMM_VALUE
777         OP_LDX
778         CYCLE_NEXT      2
779
780 opA6:   @ LDX $nn
781         ZERO_ADDR
782         ZP_READ
783         OP_LDX
784         CYCLE_NEXT      3
785
786 opB6:   @ LDX $nn, Y
787         ZEROY_ADDR
788         ZP_READ
789         OP_LDX
790         CYCLE_NEXT      4
791
792 opAE:   @ LDX $nnnn
793         ABS_ADDR
794         READ_1
795         OP_LDX
796         CYCLE_NEXT      4
797         READ_2
798         OP_LDX
799         CYCLE_NEXT      4
800
801 opBE:   @ LDX $nnnn, Y
802         ABSY_ADDR
803         READ_1
804         OP_LDX
805         CYCLE_NEXT      4
806         READ_2
807         OP_LDX
808         CYCLE_NEXT      4
809
810
811
812 opA0:   @ LDY #$nn
813         IMM_VALUE
814         OP_LDY
815         CYCLE_NEXT      2
816
817 opA4:   @ LDY $nn
818         ZERO_ADDR
819         ZP_READ
820         OP_LDY
821         CYCLE_NEXT      3
822
823 opB4:   @ LDY $nn, X
824         ZEROX_ADDR
825         ZP_READ
826         OP_LDY
827         CYCLE_NEXT      4
828
829
830
831 opAC:   @ LDY $nnnn
832         ABS_ADDR
833         READ_1
834         OP_LDY
835         CYCLE_NEXT      4
836         READ_2
837         OP_LDY
838         CYCLE_NEXT      4
839
840 opBC:   @ LDY $nnnn, X
841         ABSX_ADDR
842         READ_1
843         OP_LDY
844         CYCLE_NEXT      4
845         READ_2
846         OP_LDY
847         CYCLE_NEXT      4
848
849 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
850 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
851 @@@
852 @@@ STA/STX/STY
853 @@@
854 @@@ ¥ì¥¸¥¹¥¿¤Î¥¹¥È¥¢
855 @@@
856 @@@ NZVC
857 @@@ ----
858 @@@ ----
859 .macro  OP_STA
860         mov     r0, REG_A, lsr #24
861 .endm
862
863 op85:   @ STA $nn
864         ZERO_ADDR
865         OP_STA
866         ZP_WRITE
867         CYCLE_NEXT      3
868
869 op95:   @ STA $nn, X
870         ZEROX_ADDR
871         OP_STA
872         ZP_WRITE
873         CYCLE_NEXT      4
874
875 op8D:   @ STA $nnnn
876         ABS_ADDR
877         OP_STA
878         WRITE_1
879         CYCLE_NEXT 4
880         WRITE_2
881         CYCLE_NEXT 4
882
883 op9D:   @ STA $nnnn, X
884         ABSX_ADDR_W
885         OP_STA
886         WRITE_1
887         CYCLE_NEXT 5
888         WRITE_2
889         CYCLE_NEXT 5
890
891 op99:   @ STA $nnnn, Y
892         ABSY_ADDR_W
893         OP_STA
894         WRITE_1
895         CYCLE_NEXT 5
896         WRITE_2
897         CYCLE_NEXT 5
898
899 op81:   @ STA ($nn, X)
900         INDX_ADDR
901         OP_STA
902         WRITE_1
903         CYCLE_NEXT 6
904         WRITE_2
905         CYCLE_NEXT 6
906
907 op91:   @ STA ($nn), Y
908         INDY_ADDR_W
909         OP_STA
910         WRITE_1
911         CYCLE_NEXT 6
912         WRITE_2
913         CYCLE_NEXT 6
914
915
916 op86:   @ STX $nn
917         ZERO_ADDR
918         ZP_WRITE        REG_X
919         CYCLE_NEXT      3
920
921 op96:   @ STX $nn, Y
922         ZEROY_ADDR
923         ZP_WRITE        REG_X
924         CYCLE_NEXT      4
925
926 op8E:   @ STX $nnnn
927         ABS_ADDR
928         mov     r0, REG_X
929         WRITE_1
930         CYCLE_NEXT 4
931         WRITE_2
932         CYCLE_NEXT 4
933
934
935 op84:   @ STY $nn
936         ZERO_ADDR
937         ZP_WRITE        REG_Y
938         CYCLE_NEXT      3
939
940 op94:   @ STY $nn, X
941         ZEROX_ADDR
942         ZP_WRITE        REG_Y
943         CYCLE_NEXT      4
944
945 op8C:   @ STY $nnnn
946         ABS_ADDR
947         mov     r0, REG_Y
948         WRITE_1
949         CYCLE_NEXT 4
950         WRITE_2
951         CYCLE_NEXT 4
952
953
954 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
955 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
956 @@@
957 @@@ INC/INX/INY/DEC/DEX/DEY
958 @@@ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¤¥Ç¥¯¥ê¥á¥ó¥È
959 @@@ ¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë¡£C¤ÏÊѹ¹¤·¤Ê¤¤
960 @@@
961 @@@ NZVC
962 @@@ ----
963 @@@ **--
964
965 .macro  OP_INC
966         add     r0, r0, #1
967         and     r0, r0, #0xFF
968         orr     REG_NZ, r0, r0, lsl #24
969 .endm
970
971 .macro  OP_INXY reg
972         add     \reg, \reg, #1
973         and     \reg, \reg, #0xFF
974         orr     REG_NZ, \reg, \reg, lsl #24
975 .endm
976
977 .macro  OP_DEC
978         sub     r0, r0, #1
979         and     r0, r0, #0xFF
980         orr     REG_NZ, r0, r0, lsl #24
981 .endm
982
983 .macro  OP_DEXY reg
984         sub     \reg, \reg, #1
985         and     \reg, \reg, #0xFF
986         orr     REG_NZ, \reg, \reg, lsl #24
987 .endm
988
989 opE6:   @ INC $nn
990         ZERO_ADDR
991         ZP_READ_W
992         OP_INC
993         ZP_WRITE_W
994         CYCLE_NEXT      5
995
996 opF6:   @ INC $nn, X
997         ZEROX_ADDR
998         ZP_READ_W
999         OP_INC
1000         ZP_WRITE_W
1001         CYCLE_NEXT      6
1002
1003 opEE:   @ INC $nnnn
1004         ABS_ADDR
1005         READ_WRITE_1
1006         OP_INC
1007         READ_WRITE_2
1008         CYCLE_NEXT      6
1009         READ_WRITE_3
1010         OP_INC
1011         READ_WRITE_4
1012         CYCLE_NEXT      6
1013
1014 opFE:   @ INC $nnnn, X
1015         ABSX_ADDR_W
1016         READ_WRITE_1
1017         OP_INC
1018         READ_WRITE_2
1019         CYCLE_NEXT      7
1020         READ_WRITE_3
1021         OP_INC
1022         READ_WRITE_4
1023         CYCLE_NEXT      7
1024
1025 opE8:   @ INX
1026         IMPLIED
1027         OP_INXY REG_X
1028         CYCLE_NEXT      2
1029
1030 opC8:   @ INY
1031         IMPLIED
1032         OP_INXY REG_Y
1033         CYCLE_NEXT      2
1034
1035 opC6:   @ DEC $nn
1036         ZERO_ADDR
1037         ZP_READ_W
1038         OP_DEC
1039         ZP_WRITE_W
1040         CYCLE_NEXT      5
1041
1042 opD6:   @ DEC $nn, X
1043         ZEROX_ADDR
1044         ZP_READ_W
1045         OP_DEC
1046         ZP_WRITE_W
1047         CYCLE_NEXT      6
1048
1049 opCE:   @ DEC $nnnn
1050         ABS_ADDR
1051         READ_WRITE_1
1052         OP_DEC
1053         READ_WRITE_2
1054         CYCLE_NEXT      6
1055         READ_WRITE_3
1056         OP_DEC
1057         READ_WRITE_4
1058         CYCLE_NEXT      6
1059
1060 opDE:   @ DEC $nnnn, X
1061         ABSX_ADDR_W
1062         READ_WRITE_1
1063         OP_DEC
1064         READ_WRITE_2
1065         CYCLE_NEXT      7
1066         READ_WRITE_3
1067         OP_DEC
1068         READ_WRITE_4
1069         CYCLE_NEXT      7
1070
1071 opCA:   @ DEX
1072         IMPLIED
1073         OP_DEXY REG_X
1074         CYCLE_NEXT      2
1075
1076 op88:   @ DEY
1077         IMPLIED
1078         OP_DEXY REG_Y
1079         CYCLE_NEXT      2
1080
1081
1082 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1083 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1084 @@@
1085 @@@ ADC/SBC
1086 @@@
1087 @@@ ¥­¥ã¥ê¡¼/¥Ü¥í¡¼¤Ä¤­¤Î²Ã»»/¸º»»
1088
1089 .macro  OP_ADC
1090         @@ ¥­¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1091         movs    r1, REG_P_REST, lsr #1
1092         @@ ¾å24¥Ó¥Ã¥È¤òÁ´¤Æ1¤Ë
1093         subcs   r0, r0, #0x100
1094         @@ ¥­¥ã¥ê¡¼¤Ä¤­¤Î²Ã»»
1095         adcs    REG_A, REG_A, r0, ror #8
1096         mov     REG_NZ, REG_A, asr #24
1097         adc     REG_P_REST, r1, r1
1098         orrvs   REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1099         bicvc   REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1100 .endm
1101
1102 .macro  OP_SBC
1103         @@ ¥­¥ã¥ê¡¼¤ò¥»¥Ã¥È¤·¤Æ
1104         movs    r1, REG_P_REST, lsr #1
1105         @@ ¥­¥ã¥ê¡¼¤Ä¤­¤Î¸º»»
1106         sbcs    REG_A, REG_A, r0, lsl #24
1107         and     REG_A, REG_A, #0xFF << 24
1108         mov     REG_NZ, REG_A, asr #24
1109         adc     REG_P_REST, r1, r1
1110         orrvs   REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1111         bicvc   REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1112 .endm
1113
1114 op69:   @ ADC #$nn
1115         IMM_VALUE
1116         OP_ADC
1117         CYCLE_NEXT      2
1118
1119 op65:   @ ADC $nn
1120         ZERO_ADDR
1121         ZP_READ
1122         OP_ADC
1123         CYCLE_NEXT      3
1124
1125 op75:   @ ADC $nn, X
1126         ZEROX_ADDR
1127         ZP_READ
1128         OP_ADC
1129         CYCLE_NEXT      4
1130
1131 op6D:   @ ADC $nnnn
1132         ABS_ADDR
1133         READ_1
1134         OP_ADC
1135         CYCLE_NEXT      4
1136         READ_2
1137         OP_ADC
1138         CYCLE_NEXT      4
1139
1140 op7D:   @ ADC $nnnn, X
1141         ABSX_ADDR
1142         READ_1
1143         OP_ADC
1144         CYCLE_NEXT      4
1145         READ_2
1146         OP_ADC
1147         CYCLE_NEXT      4
1148
1149 op79:   @ ADC $nnnn, Y
1150         ABSY_ADDR
1151         READ_1
1152         OP_ADC
1153         CYCLE_NEXT      4
1154         READ_2
1155         OP_ADC
1156         CYCLE_NEXT      4
1157
1158 op61:   @ ADC ($nn, X)
1159         INDX_ADDR
1160         READ_1
1161         OP_ADC
1162         CYCLE_NEXT      6
1163         READ_2
1164         OP_ADC
1165         CYCLE_NEXT      6
1166
1167 op71:   @ ADC ($nn), Y
1168         INDY_ADDR
1169         READ_1
1170         OP_ADC
1171         CYCLE_NEXT      5
1172         READ_2
1173         OP_ADC
1174         CYCLE_NEXT      5
1175
1176 opEB:   @ USBC #$nn
1177 opE9:   @ SBC #$nn
1178         IMM_VALUE
1179         OP_SBC
1180         CYCLE_NEXT      2
1181
1182 opE5:   @ SBC $nn
1183         ZERO_ADDR
1184         ZP_READ
1185         OP_SBC
1186         CYCLE_NEXT      3
1187
1188 opF5:   @ SBC $nn, X
1189         ZEROX_ADDR
1190         ZP_READ
1191         OP_SBC
1192         CYCLE_NEXT      4
1193
1194 opED:   @ SBC $nnnn
1195         ABS_ADDR
1196         READ_1
1197         OP_SBC
1198         CYCLE_NEXT      4
1199         READ_2
1200         OP_SBC
1201         CYCLE_NEXT      4
1202
1203 opFD:   @ SBC $nnnn, X
1204         ABSX_ADDR
1205         READ_1
1206         OP_SBC
1207         CYCLE_NEXT      4
1208         READ_2
1209         OP_SBC
1210         CYCLE_NEXT      4
1211
1212 opF9:   @ SBC $nnnn, Y
1213         ABSY_ADDR
1214         READ_1
1215         OP_SBC
1216         CYCLE_NEXT      4
1217         READ_2
1218         OP_SBC
1219         CYCLE_NEXT      4
1220
1221 opE1:   @ SBC ($nn, X)
1222         INDX_ADDR
1223         READ_1
1224         OP_SBC
1225         CYCLE_NEXT      6
1226         READ_2
1227         OP_SBC
1228         CYCLE_NEXT      6
1229
1230 opF1:   @ SBC ($nn), Y
1231         INDY_ADDR
1232         READ_1
1233         OP_SBC
1234         CYCLE_NEXT      5
1235         READ_2
1236         OP_SBC
1237         CYCLE_NEXT      5
1238
1239
1240 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1241 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1242 @@@
1243 @@@ AND/EOR/ORA
1244 @@@
1245 @@@ ¥Ó¥Ã¥È±é»»¡£¤¹¤Ù¤ÆNZ¤òÊѹ¹¤¹¤ë
1246 @@@
1247 @@@ NZVC
1248 @@@ ----
1249 @@@ **--
1250 .macro  OP_AND
1251         and     REG_A, REG_A, r0, lsl #24
1252         mov     REG_NZ, REG_A, asr #24
1253 .endm
1254
1255 .macro  OP_EOR
1256         eor     REG_A, REG_A, r0, lsl #24
1257         mov     REG_NZ, REG_A, asr #24
1258 .endm
1259
1260 .macro  OP_ORA
1261         orr     REG_A, REG_A, r0, lsl #24
1262         mov     REG_NZ, REG_A, asr #24
1263 .endm
1264
1265 op29:   @ AND #$nn
1266         IMM_VALUE
1267         OP_AND
1268         CYCLE_NEXT      2
1269
1270 op25:   @ AND $nn
1271         ZERO_ADDR
1272         ZP_READ
1273         OP_AND
1274         CYCLE_NEXT      3
1275
1276 op35:   @ AND $nn, X
1277         ZEROX_ADDR
1278         ZP_READ
1279         OP_AND
1280         CYCLE_NEXT      4
1281
1282 op2D:   @ AND $nnnn
1283         ABS_ADDR
1284         READ_1
1285         OP_AND
1286         CYCLE_NEXT      4
1287         READ_2
1288         OP_AND
1289         CYCLE_NEXT      4
1290
1291 op3D:   @ AND $nnnn, X
1292         ABSX_ADDR
1293         READ_1
1294         OP_AND
1295         CYCLE_NEXT      4
1296         READ_2
1297         OP_AND
1298         CYCLE_NEXT      4
1299
1300 op39:   @ AND $nnnn, Y
1301         ABSY_ADDR
1302         READ_1
1303         OP_AND
1304         CYCLE_NEXT      4
1305         READ_2
1306         OP_AND
1307         CYCLE_NEXT      4
1308
1309 op21:   @ AND ($nn, X)
1310         INDX_ADDR
1311         READ_1
1312         OP_AND
1313         CYCLE_NEXT      6
1314         READ_2
1315         OP_AND
1316         CYCLE_NEXT      6
1317
1318 op31:   @ AND ($nn), Y
1319         INDY_ADDR
1320         READ_1
1321         OP_AND
1322         CYCLE_NEXT      5
1323         READ_2
1324         OP_AND
1325         CYCLE_NEXT      5
1326
1327
1328 op49:   @ EOR #$nn
1329         IMM_VALUE
1330         OP_EOR
1331         CYCLE_NEXT      2
1332
1333 op45:   @ EOR $nn
1334         ZERO_ADDR
1335         ZP_READ
1336         OP_EOR
1337         CYCLE_NEXT      3
1338
1339 op55:   @ EOR $nn, X
1340         ZEROX_ADDR
1341         ZP_READ
1342         OP_EOR
1343         CYCLE_NEXT      4
1344
1345 op4D:   @ EOR $nnnn
1346         ABS_ADDR
1347         READ_1
1348         OP_EOR
1349         CYCLE_NEXT      4
1350         READ_2
1351         OP_EOR
1352         CYCLE_NEXT      4
1353
1354 op5D:   @ EOR $nnnn, X
1355         ABSX_ADDR
1356         READ_1
1357         OP_EOR
1358         CYCLE_NEXT      4
1359         READ_2
1360         OP_EOR
1361         CYCLE_NEXT      4
1362
1363 op59:   @ EOR $nnnn, Y
1364         ABSY_ADDR
1365         READ_1
1366         OP_EOR
1367         CYCLE_NEXT      4
1368         READ_2
1369         OP_EOR
1370         CYCLE_NEXT      4
1371
1372 op41:   @ EOR ($nn, X)
1373         INDX_ADDR
1374         READ_1
1375         OP_EOR
1376         CYCLE_NEXT      6
1377         READ_2
1378         OP_EOR
1379         CYCLE_NEXT      6
1380
1381 op51:   @ EOR ($nn), Y
1382         INDY_ADDR
1383         READ_1
1384         OP_EOR
1385         CYCLE_NEXT      5
1386         READ_2
1387         OP_EOR
1388         CYCLE_NEXT      5
1389
1390
1391 op09:   @ ORA #$nn
1392         IMM_VALUE
1393         OP_ORA
1394         CYCLE_NEXT      2
1395
1396 op05:   @ ORA $nn
1397         ZERO_ADDR
1398         ZP_READ
1399         OP_ORA
1400         CYCLE_NEXT      3
1401
1402 op15:   @ ORA $nn, X
1403         ZEROX_ADDR
1404         ZP_READ
1405         OP_ORA
1406         CYCLE_NEXT      4
1407
1408 op0D:   @ ORA $nnnn
1409         ABS_ADDR
1410         READ_1
1411         OP_ORA
1412         CYCLE_NEXT      4
1413         READ_2
1414         OP_ORA
1415         CYCLE_NEXT      4
1416
1417 op1D:   @ ORA $nnnn, X
1418         ABSX_ADDR
1419         READ_1
1420         OP_ORA
1421         CYCLE_NEXT      4
1422         READ_2
1423         OP_ORA
1424         CYCLE_NEXT      4
1425
1426 op19:   @ ORA $nnnn, Y
1427         ABSY_ADDR
1428         READ_1
1429         OP_ORA
1430         CYCLE_NEXT      4
1431         READ_2
1432         OP_ORA
1433         CYCLE_NEXT      4
1434
1435 op01:   @ ORA ($nn, X)
1436         INDX_ADDR
1437         READ_1
1438         OP_ORA
1439         CYCLE_NEXT      6
1440         READ_2
1441         OP_ORA
1442         CYCLE_NEXT      6
1443
1444 op11:   @ ORA ($nn), Y
1445         INDY_ADDR
1446         READ_1
1447         OP_ORA
1448         CYCLE_NEXT      5
1449         READ_2
1450         OP_ORA
1451         CYCLE_NEXT      5
1452
1453
1454
1455 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1456 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1457 @@@
1458 @@@ CMP/CPX/CPY
1459 @@@
1460 @@@ Èæ³Ó¡£¤¹¤Ù¤ÆNZC¤òÊѹ¹¤¹¤ë
1461 @@@
1462 @@@ NZVC
1463 @@@ ----
1464 @@@ **-*
1465 .macro  OP_CMP
1466         subs    REG_NZ, REG_A, r0, lsl #24
1467         mov     REG_NZ, REG_NZ, asr #24
1468         orrcs   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1469         biccc   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1470 .endm
1471
1472 .macro  OP_CPXY reg
1473         mov     r1, \reg, lsl #24
1474         subs    REG_NZ, r1, r0, lsl #24
1475         mov     REG_NZ, REG_NZ, asr #24
1476         orrcs   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1477         biccc   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1478 .endm
1479
1480 .macro  OP_CPX
1481         OP_CPXY REG_X
1482 .endm
1483
1484 .macro  OP_CPY
1485         OP_CPXY REG_Y
1486 .endm
1487
1488 opC9:   @ CMP #$nn
1489         IMM_VALUE
1490         OP_CMP
1491         CYCLE_NEXT      2
1492
1493 opC5:   @ CMP $nn
1494         ZERO_ADDR
1495         ZP_READ
1496         OP_CMP
1497         CYCLE_NEXT      3
1498
1499 opD5:   @ CMP $nn, X
1500         ZEROX_ADDR
1501         ZP_READ
1502         OP_CMP
1503         CYCLE_NEXT      4
1504
1505 opCD:   @ CMP $nnnn
1506         ABS_ADDR
1507         READ_1
1508         OP_CMP
1509         CYCLE_NEXT      4
1510         READ_2
1511         OP_CMP
1512         CYCLE_NEXT      4
1513
1514 opDD:   @ CMP $nnnn, X
1515         ABSX_ADDR
1516         READ_1
1517         OP_CMP
1518         CYCLE_NEXT      4
1519         READ_2
1520         OP_CMP
1521         CYCLE_NEXT      4
1522
1523 opD9:   @ CMP $nnnn, Y
1524         ABSY_ADDR
1525         READ_1
1526         OP_CMP
1527         CYCLE_NEXT      4
1528         READ_2
1529         OP_CMP
1530         CYCLE_NEXT      4
1531
1532 opC1:   @ CMP ($nn, X)
1533         INDX_ADDR
1534         READ_1
1535         OP_CMP
1536         CYCLE_NEXT      6
1537         READ_2
1538         OP_CMP
1539         CYCLE_NEXT      6
1540
1541 opD1:   @ CMP ($nn), Y
1542         INDY_ADDR
1543         READ_1
1544         OP_CMP
1545         CYCLE_NEXT      5
1546         READ_2
1547         OP_CMP
1548         CYCLE_NEXT      5
1549
1550
1551 opE0:   @ CPX #$nn
1552         IMM_VALUE
1553         OP_CPX
1554         CYCLE_NEXT      2
1555
1556 opE4:   @ CPX $nn
1557         ZERO_ADDR
1558         ZP_READ
1559         OP_CPX
1560         CYCLE_NEXT      3
1561
1562 opEC:   @ CPX $nnnn
1563         ABS_ADDR
1564         READ_1
1565         OP_CPX
1566         CYCLE_NEXT      4
1567         READ_2
1568         OP_CPX
1569         CYCLE_NEXT      4
1570
1571
1572 opC0:   @ CPY #$nn
1573         IMM_VALUE
1574         OP_CPY
1575         CYCLE_NEXT      2
1576
1577 opC4:   @ CPY $nn
1578         ZERO_ADDR
1579         ZP_READ
1580         OP_CPY
1581         CYCLE_NEXT      3
1582
1583 opCC:   @ CPY $nnnn
1584         ABS_ADDR
1585         READ_1
1586         OP_CPY
1587         CYCLE_NEXT      4
1588         READ_2
1589         OP_CPY
1590         CYCLE_NEXT      4
1591
1592
1593 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1594 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1595 @@@
1596 @@@ BIT
1597 @@@
1598 @@@ Z <= A ¢Ê M == 0
1599 @@@ N <= M[7]
1600 @@@ V <= M[6]
1601 @@@
1602 @@@ NZVC
1603 @@@ ----
1604 @@@ ***-
1605 .macro  OP_BIT
1606         and     REG_NZ, r0, REG_A, lsr #24
1607         @@ R0[7] => C, R0[6] => N
1608         movs    r0, r0, lsl #25
1609         orrcs   REG_NZ, REG_NZ, #0x80 << 24
1610         orrmi   REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1611         bicpl   REG_P_REST, REG_P_REST, #P_REST_V_FLAG
1612 .endm
1613
1614 op24:   @ BIT $nn
1615         ZERO_ADDR
1616         ZP_READ
1617         OP_BIT
1618         CYCLE_NEXT      3
1619
1620 op2C:   @ BIT $nnnn
1621         ABS_ADDR
1622         READ_1
1623         OP_BIT
1624         CYCLE_NEXT      4
1625         READ_2
1626         OP_BIT
1627         CYCLE_NEXT      4
1628
1629
1630 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1631 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1632 @@@
1633 @@@ ASL/LSR
1634 @@@
1635 @@@ ±¦¥·¥Õ¥È¡¦º¸¥·¥Õ¥È
1636 @@@
1637 @@@ NZC¤òÊѹ¹¤¹¤ë
1638 @@@
1639 .macro  OP_ASL
1640         movs    REG_NZ, r0, lsl #25
1641         mov     r0, REG_NZ, lsr #24
1642         mov     REG_NZ, REG_NZ, asr #24
1643         orrcs   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1644         biccc   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1645 .endm
1646
1647 .macro  OP_ASL_A
1648         movs    REG_A, REG_A, lsl #1
1649         mov     REG_NZ, REG_A, asr #24
1650         orrcs   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1651         biccc   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1652 .endm
1653
1654 .macro  OP_LSR
1655         movs    r0, r0, lsr #1
1656         @@ N¤ÏΩ¤¿¤Ê¤¤
1657         mov     REG_NZ, r0
1658         orrcs   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1659         biccc   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1660 .endm
1661
1662 .macro  OP_LSR_A
1663         @@ N¤ÏΩ¤¿¤Ê¤¤
1664         movs    REG_NZ, REG_A, lsr #25
1665         mov     REG_A, REG_NZ, lsl #24
1666         orrcs   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1667         biccc   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1668 .endm
1669
1670 op0A:   @ ASL A
1671         IMPLIED
1672         OP_ASL_A
1673         CYCLE_NEXT      2
1674
1675 op06:   @ ASL $nn
1676         ZERO_ADDR
1677         ZP_READ_W
1678         OP_ASL
1679         ZP_WRITE_W
1680         CYCLE_NEXT      5
1681
1682 op16:   @ ASL $nn, X
1683         ZEROX_ADDR
1684         ZP_READ_W
1685         OP_ASL
1686         ZP_WRITE_W
1687         CYCLE_NEXT      6
1688
1689 op0E:   @ ASL $nnnn
1690         ABS_ADDR
1691         READ_WRITE_1
1692         OP_ASL
1693         READ_WRITE_2
1694         CYCLE_NEXT      6
1695         READ_WRITE_3
1696         OP_ASL
1697         READ_WRITE_4
1698         CYCLE_NEXT      6
1699
1700 op1E:   @ ASL $nnnn, X
1701         ABSX_ADDR_W
1702         READ_WRITE_1
1703         OP_ASL
1704         READ_WRITE_2
1705         CYCLE_NEXT      7
1706         READ_WRITE_3
1707         OP_ASL
1708         READ_WRITE_4
1709         CYCLE_NEXT      7
1710
1711
1712 op4A:   @ LSR A
1713         IMPLIED
1714         OP_LSR_A
1715         CYCLE_NEXT      2
1716
1717 op46:   @ LSR $nn
1718         ZERO_ADDR
1719         ZP_READ_W
1720         OP_LSR
1721         ZP_WRITE_W
1722         CYCLE_NEXT      5
1723
1724 op56:   @ LSR $nn, X
1725         ZEROX_ADDR
1726         ZP_READ_W
1727         OP_LSR
1728         ZP_WRITE_W
1729         CYCLE_NEXT      6
1730
1731 op4E:   @ LSR $nnnn
1732         ABS_ADDR
1733         READ_WRITE_1
1734         OP_LSR
1735         READ_WRITE_2
1736         CYCLE_NEXT      6
1737         READ_WRITE_3
1738         OP_LSR
1739         READ_WRITE_4
1740         CYCLE_NEXT      6
1741
1742 op5E:   @ LSR $nnnn, X
1743         ABSX_ADDR_W
1744         READ_WRITE_1
1745         OP_LSR
1746         READ_WRITE_2
1747         CYCLE_NEXT      7
1748         READ_WRITE_3
1749         OP_LSR
1750         READ_WRITE_4
1751         CYCLE_NEXT      7
1752
1753
1754 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1755 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1756 @@@
1757 @@@ ROL/ROR
1758 @@@
1759 @@@ º¸²óž/±¦²óž
1760 @@@
1761 @@@ NZC¤òÊѹ¹¤¹¤ë
1762 @@@
1763 .macro  OP_ROL
1764         @@ ¥­¥ã¥ê¡¼¤ò¥»¥Ã¥È
1765         movs    r1, REG_P_REST, lsr #1
1766         @@ ¥·¥Õ¥È
1767         adc     r0, r0, r0
1768         @@ NZ¤È¥­¥ã¥ê¡¼¤ò¥»¥Ã¥È
1769         orrs    REG_NZ, r0, r0, lsl #24
1770         @@ ¥­¥ã¥ê¡¼¤òÊݸ
1771         adc     REG_P_REST, r1, r1
1772 .endm
1773
1774 .macro  OP_ROL_A
1775         @@ ¥­¥ã¥ê¡¼¤ò¥»¥Ã¥È
1776         movs    r1, REG_P_REST, lsr #1
1777         orrcs   REG_A, REG_A, #0x80 << 16
1778         movs    REG_A, REG_A, lsl #1
1779         mov     REG_NZ, REG_A, asr #24
1780         adc     REG_P_REST, r1, r1
1781 .endm
1782
1783 .macro  OP_ROR
1784         movs    r1, REG_P_REST, lsr #1
1785         orrcs   r0, r0, #0x100
1786         movs    r0, r0, lsr #1
1787         orr     REG_NZ, r0, r0, lsl #24
1788         adc     REG_P_REST, r1, r1
1789 .endm
1790
1791 .macro  OP_ROR_A
1792         movs    r1, REG_P_REST, lsr #1
1793         mov     REG_NZ, REG_A, rrx
1794         movs    REG_NZ, REG_NZ, asr #24
1795         mov     REG_A, REG_NZ, lsl #24
1796         adc     REG_P_REST, r1, r1
1797 .endm
1798
1799 op2A:   @ ROL A
1800         IMPLIED
1801         OP_ROL_A
1802         CYCLE_NEXT      2
1803
1804 op26:   @ ROL $nn
1805         ZERO_ADDR
1806         ZP_READ_W
1807         OP_ROL
1808         ZP_WRITE_W
1809         CYCLE_NEXT      5
1810
1811 op36:   @ ROL $nn, X
1812         ZEROX_ADDR
1813         ZP_READ_W
1814         OP_ROL
1815         ZP_WRITE_W
1816         CYCLE_NEXT      6
1817
1818 op2E:   @ ROL $nnnn
1819         ABS_ADDR
1820         READ_WRITE_1
1821         OP_ROL
1822         READ_WRITE_2
1823         CYCLE_NEXT      6
1824         READ_WRITE_3
1825         OP_ROL
1826         READ_WRITE_4
1827         CYCLE_NEXT      6
1828
1829
1830 op3E:   @ ROL $nnnn, X
1831         ABSX_ADDR_W
1832         READ_WRITE_1
1833         OP_ROL
1834         READ_WRITE_2
1835         CYCLE_NEXT      7
1836         READ_WRITE_3
1837         OP_ROL
1838         READ_WRITE_4
1839         CYCLE_NEXT      7
1840
1841
1842 op6A:   @ ROR A
1843         IMPLIED
1844         OP_ROR_A
1845         CYCLE_NEXT      2
1846
1847 op66:   @ ROR $nn
1848         ZERO_ADDR
1849         ZP_READ_W
1850         OP_ROR
1851         ZP_WRITE_W
1852         CYCLE_NEXT      5
1853
1854 op76:   @ ROR $nn, X
1855         ZEROX_ADDR
1856         ZP_READ_W
1857         OP_ROR
1858         ZP_WRITE_W
1859         CYCLE_NEXT      6
1860
1861 op6E:   @ ROR $nnnn
1862         ABS_ADDR
1863         READ_WRITE_1
1864         OP_ROR
1865         READ_WRITE_2
1866         CYCLE_NEXT      6
1867         READ_WRITE_3
1868         OP_ROR
1869         READ_WRITE_4
1870         CYCLE_NEXT      6
1871
1872 op7E:   @ ROR $nnnn, X
1873         ABSX_ADDR_W
1874         READ_WRITE_1
1875         OP_ROR
1876         READ_WRITE_2
1877         CYCLE_NEXT      7
1878         READ_WRITE_3
1879         OP_ROR
1880         READ_WRITE_4
1881         CYCLE_NEXT      7
1882
1883
1884 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1885 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1886 @@@
1887 @@@ BCC/BCS/BNE/BEQ/BPL/BMI/BVC/BVS
1888 @@@
1889 @@@ Ê¬´ô
1890 @@@
1891
1892 .macro HAD_BRANCH
1893         @@ R0 <- PC
1894         ldr     r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
1895         sub     r0, REG_PC, r0
1896         mov     r3, r1          @ preserve immediate
1897         REBASE_PC
1898
1899         sub     r1,r0,r3
1900         @@ R1 <- (PC&0xFF)+ReadValue
1901         and     r1,r1,#0xff
1902         add     r1,r3,r1
1903         tst     r1,#0x100
1904         subne   REG_CYCLE,REG_CYCLE, #1*48
1905 .endm
1906
1907 .macro  BRANCH_EQ
1908         ldreqsb r1, [REG_PC], #1
1909         movne   r1, #1
1910         add     REG_PC, REG_PC, r1
1911         subeq   REG_CYCLE, REG_CYCLE, #1*48
1912         bne     1f
1913         HAD_BRANCH
1914 1:
1915 .endm
1916
1917 .macro  BRANCH_NE
1918         ldrnesb r1, [REG_PC], #1
1919         moveq   r1, #1
1920         add     REG_PC, REG_PC, r1
1921         subne   REG_CYCLE, REG_CYCLE, #1*48
1922         beq     1f
1923         HAD_BRANCH
1924 1:
1925 .endm
1926
1927 op90:   @ BCC $nn
1928         tst     REG_P_REST, #P_REST_C_FLAG
1929         @@ Z ¤¬Î©¤Æ¤Ð
1930         BRANCH_EQ
1931         CYCLE_NEXT      2
1932         .pool
1933
1934 opB0:   @ BCS $nn
1935         tst     REG_P_REST, #P_REST_C_FLAG
1936         @@ Z ¤¬²¼¤ê¤Æ¤ì¤Ð
1937         BRANCH_NE
1938         CYCLE_NEXT      2
1939
1940 opD0:   @ BNE $nn
1941         tst     REG_NZ, #0xFF
1942         BRANCH_NE
1943         CYCLE_NEXT      2
1944
1945 opF0:   @ BEQ $nn
1946         tst     REG_NZ, #0xFF
1947         BRANCH_EQ
1948         CYCLE_NEXT      2
1949
1950 op30:   @ BMI $nn
1951         tst     REG_NZ, #0x80 << 24
1952         @@ ·ë²Ì¤¬0¤Ç¤Ê¤¤¤Ê¤é
1953         BRANCH_NE
1954         CYCLE_NEXT      2
1955
1956 op10:   @ BPL $nn
1957         tst     REG_NZ, #0x80 << 24
1958         @@ ·ë²Ì¤¬0¤Ê¤é
1959         BRANCH_EQ
1960         CYCLE_NEXT      2
1961
1962 op50:   @ BVC $nn
1963         tst     REG_P_REST, #P_REST_V_FLAG
1964         @@ ·ë²Ì¤¬0¤Ê¤é
1965         BRANCH_EQ
1966         CYCLE_NEXT      2
1967
1968
1969 op70:   @ BVS $nn
1970         tst     REG_P_REST, #P_REST_V_FLAG
1971         @@ ·ë²Ì0¤Ç¤Ê¤¤¤Ê¤é
1972         BRANCH_NE
1973         CYCLE_NEXT      2
1974         .pool
1975
1976 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1977 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1978 @@  UNDOC
1979 @@  LAX
1980 @@
1981 .macro  OP_LAX
1982         mov     REG_A, r0, lsl #24
1983         mov     REG_X, r0
1984         mov     REG_NZ, REG_A, asr #24
1985 .endm
1986
1987 .macro  OP_SLO
1988         movs    r0, r0, lsl #25
1989  @@set C flag
1990         orrcs   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1991         biccc   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
1992
1993         orr     REG_A,REG_A,r0
1994  @@set NZ flag
1995         mov     REG_NZ, REG_A, asr #24
1996  @@restore value to write
1997         mov     r0, r0, lsr #24
1998 .endm
1999
2000 .macro  OP_ISB
2001         add     r0, r0, #1
2002         and     r0, r0, #0xFF
2003 .endm
2004
2005 .macro  OP_SHY
2006         mov     r0,REG_ADDR, lsr #8
2007         add     r0,r0,#1
2008         and     r0,r0,REG_Y
2009 .endm
2010
2011 .macro  OP_SRE
2012         movs    r0, r0, lsr #1
2013  @@set C flag
2014         orrcs   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2015         biccc   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2016
2017         eor     REG_A,REG_A,r0, lsl #24
2018  @@set NZ flag
2019         mov     REG_NZ, REG_A, asr #24
2020 .endm
2021
2022 .macro  OP_SBX
2023         and     r1,REG_X,REG_A, lsr #24
2024         subs    r0,r1,r0
2025         orrcs   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2026         biccc   REG_P_REST, REG_P_REST, #P_REST_C_FLAG
2027         and     REG_X,r0,#0xFF
2028         orr     REG_NZ, REG_X, REG_X, lsl #24
2029 .endm
2030
2031 .macro  OP_DCP
2032         sub     r0,r0,#1
2033         and     r0,r0,#0xFF
2034 .endm
2035
2036 .macro  OP_RLA
2037         @@ ¥­¥ã¥ê¡¼¤ò¥»¥Ã¥È
2038         movs    r1, REG_P_REST, lsr #1
2039         @@ ¥·¥Õ¥È
2040         adc     r0, r0, r0
2041         @@ NZ¤È¥­¥ã¥ê¡¼¤ò¥»¥Ã¥È
2042         orrs    REG_NZ, r0, r0, lsl #24
2043         @@ ¥­¥ã¥ê¡¼¤òÊݸ
2044         adc     REG_P_REST, r1, r1
2045         and     REG_A,REG_A,r0,lsl #24
2046 .endm
2047
2048 .macro  OP_RRA
2049         movs    r1, REG_P_REST, lsr #1
2050         orrcs   r0, r0, #0x100
2051         movs    r0, r0, lsr #1
2052 .endm
2053
2054 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2055 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2056 @@
2057 @@  UNDOCUMENTED
2058 @@
2059
2060 op47:   @ SRE $nn
2061         ZERO_ADDR
2062         ZP_READ_W
2063         OP_SRE
2064         ZP_WRITE_W
2065         CYCLE_NEXT      5
2066
2067 op57:   @ SRE $nn, X
2068         ZEROX_ADDR
2069         ZP_READ_W
2070         OP_SRE
2071         ZP_WRITE_W
2072         CYCLE_NEXT      6
2073
2074 op4F:   @ SRE $nnnn
2075         ABS_ADDR
2076         READ_WRITE_1
2077         OP_SRE
2078         READ_WRITE_2
2079         CYCLE_NEXT      6
2080         READ_WRITE_3
2081         OP_SRE
2082         READ_WRITE_4
2083         CYCLE_NEXT      6
2084
2085 op5F:   @ SRE $nnnn, X
2086         ABSX_ADDR
2087         READ_WRITE_1
2088         OP_SRE
2089         READ_WRITE_2
2090         CYCLE_NEXT      7
2091         READ_WRITE_3
2092         OP_SRE
2093         READ_WRITE_4
2094         CYCLE_NEXT      7
2095
2096 op5B:   @ SRE $nnnn, Y
2097         ABSY_ADDR
2098         READ_WRITE_1
2099         OP_SRE
2100         READ_WRITE_2
2101         CYCLE_NEXT      7
2102         READ_WRITE_3
2103         OP_SRE
2104         READ_WRITE_4
2105         CYCLE_NEXT      7
2106
2107 op43:   @ SRE ($nn, X)
2108         INDX_ADDR
2109         READ_WRITE_1
2110         OP_SRE
2111         READ_WRITE_2
2112         CYCLE_NEXT      8
2113         READ_WRITE_3
2114         OP_SRE
2115         READ_WRITE_4
2116         CYCLE_NEXT      8
2117
2118 op53:   @ SRE ($nn), Y
2119         INDY_ADDR_W
2120         READ_WRITE_1
2121         OP_SRE
2122         READ_WRITE_2
2123         CYCLE_NEXT      8
2124         READ_WRITE_3
2125         OP_SRE
2126         READ_WRITE_4
2127         CYCLE_NEXT      8
2128
2129
2130 op9C:   @ SHY $nnnn, X
2131         ABSX_ADDR_W
2132         OP_SHY
2133         WRITE_1
2134         CYCLE_NEXT 5
2135         WRITE_2
2136         CYCLE_NEXT 5
2137
2138 opE7:   @ ISB $nn
2139         ZERO_ADDR
2140         ZP_READ_W
2141         OP_ISB
2142         ZP_WRITE_W
2143         OP_SBC
2144         CYCLE_NEXT      5
2145
2146 opF7:   @ ISB $nn, X
2147         ZEROX_ADDR
2148         ZP_READ_W
2149         OP_ISB
2150         ZP_WRITE_W
2151         OP_SBC
2152         CYCLE_NEXT      6
2153
2154 opEF:   @ ISB $nnnn
2155         ABS_ADDR
2156         READ_WRITE_1
2157         OP_ISB
2158         READ_WRITE_2
2159         OP_SBC
2160         CYCLE_NEXT      6
2161         READ_WRITE_3
2162         OP_ISB
2163         READ_WRITE_4
2164         OP_SBC
2165         CYCLE_NEXT      6
2166
2167
2168 opFF:   @ ISB $nnnn,X
2169         ABSX_ADDR
2170         READ_WRITE_1
2171         OP_ISB
2172         READ_WRITE_2
2173         OP_SBC
2174         CYCLE_NEXT      7
2175         READ_WRITE_3
2176         OP_ISB
2177         READ_WRITE_4
2178         OP_SBC
2179         CYCLE_NEXT      7
2180
2181 opFB:   @ ISB $nnnn, Y
2182         ABSY_ADDR
2183         READ_WRITE_1
2184         OP_ISB
2185         READ_WRITE_2
2186         OP_SBC
2187         CYCLE_NEXT      7
2188         READ_WRITE_3
2189         OP_ISB
2190         READ_WRITE_4
2191         OP_SBC
2192         CYCLE_NEXT      7
2193
2194 opE3:   @ ISB ($nn, X)
2195         INDX_ADDR
2196         READ_WRITE_1
2197         OP_ISB
2198         READ_WRITE_2
2199         OP_SBC
2200         CYCLE_NEXT      7
2201         READ_WRITE_3
2202         OP_ISB
2203         READ_WRITE_4
2204         OP_SBC
2205         CYCLE_NEXT      7
2206
2207 opF3:   @ ISB ($nn), Y
2208         INDY_ADDR
2209         READ_WRITE_1
2210         OP_ISB
2211         READ_WRITE_2
2212         OP_SBC
2213         CYCLE_NEXT      7
2214         READ_WRITE_3
2215         OP_ISB
2216         READ_WRITE_4
2217         OP_SBC
2218         CYCLE_NEXT      7
2219
2220 opA7:   @ LAX $nn
2221         ZERO_ADDR
2222         ZP_READ
2223         OP_LAX
2224         CYCLE_NEXT      3
2225
2226 opB7:   @ LAX $nn, Y
2227         ZEROY_ADDR
2228         ZP_READ
2229         OP_LAX
2230         CYCLE_NEXT      4
2231
2232 opAF:   @ LAX $nnnn
2233         ABS_ADDR
2234         READ_1
2235         OP_LAX
2236         CYCLE_NEXT      4
2237         READ_2
2238         OP_LAX
2239         CYCLE_NEXT      4
2240
2241 opBF:   @ LAX $nnnn, Y
2242         ABSY_ADDR
2243         READ_1
2244         OP_LAX
2245         CYCLE_NEXT      4
2246         READ_2
2247         OP_LAX
2248         CYCLE_NEXT      4
2249
2250 opA3:   @ LAX ($nn, X)
2251         INDX_ADDR
2252         READ_1
2253         OP_LAX
2254         CYCLE_NEXT      6
2255         READ_2
2256         OP_LAX
2257         CYCLE_NEXT      6
2258
2259 opB3:   @ LAX ($nn), Y
2260         INDY_ADDR
2261         READ_1
2262         OP_LAX
2263         CYCLE_NEXT      5
2264         READ_2
2265         OP_LAX
2266         CYCLE_NEXT      5
2267
2268 op07:   @ SLO $nn
2269         ZERO_ADDR
2270         ZP_READ_W
2271         OP_SLO
2272         ZP_WRITE_W
2273         CYCLE_NEXT      5
2274
2275 op17:   @ SLO $nn, X
2276         ZEROX_ADDR
2277         ZP_READ_W
2278         OP_SLO
2279         ZP_WRITE_W
2280         CYCLE_NEXT      6
2281
2282 op0F:   @ SLO $nnnn
2283         ABS_ADDR
2284         READ_WRITE_1
2285         OP_SLO
2286         READ_WRITE_2
2287         CYCLE_NEXT      6
2288         READ_WRITE_3
2289         OP_SLO
2290         READ_WRITE_4
2291         CYCLE_NEXT      6
2292
2293 op1F:   @ SLO $nnnn, X
2294         ABSX_ADDR
2295         READ_WRITE_1
2296         OP_SLO
2297         READ_WRITE_2
2298         CYCLE_NEXT      7
2299         READ_WRITE_3
2300         OP_SLO
2301         READ_WRITE_4
2302         CYCLE_NEXT      7
2303
2304 op1B:   @ SLO $nnnn, Y
2305         ABSY_ADDR_W
2306         READ_WRITE_1
2307         OP_SLO
2308         READ_WRITE_2
2309         CYCLE_NEXT      7
2310         READ_WRITE_3
2311         OP_SLO
2312         READ_WRITE_4
2313         CYCLE_NEXT      7
2314
2315 op03:   @ SLO ($nn, X)
2316         INDX_ADDR
2317         READ_WRITE_1
2318         OP_SLO
2319         READ_WRITE_2
2320         CYCLE_NEXT      8
2321         READ_WRITE_3
2322         OP_SLO
2323         READ_WRITE_4
2324         CYCLE_NEXT      8
2325
2326 op13:   @ SLO ($nn), Y
2327         INDY_ADDR_W
2328         READ_WRITE_1
2329         OP_SLO
2330         READ_WRITE_2
2331         CYCLE_NEXT      8
2332         READ_WRITE_3
2333         OP_SLO
2334         READ_WRITE_4
2335         CYCLE_NEXT      8
2336
2337 opCB:   @ SBX #$nn
2338         IMM_VALUE
2339         OP_SBX
2340         CYCLE_NEXT      2
2341
2342 opC7:   @ DCP $nn
2343         ZERO_ADDR
2344         ZP_READ_W
2345         OP_DCP
2346         ZP_WRITE_W
2347         OP_CMP
2348         CYCLE_NEXT      5
2349
2350 opD7:   @ DCP $nn, X
2351         ZEROX_ADDR
2352         ZP_READ_W
2353         OP_DCP
2354         ZP_WRITE_W
2355         OP_CMP
2356         CYCLE_NEXT      6
2357
2358 opCF:   @ DCP $nnnn
2359         ABS_ADDR
2360         READ_WRITE_1
2361         OP_DCP
2362         READ_WRITE_2
2363         OP_CMP
2364         CYCLE_NEXT      6
2365         READ_WRITE_3
2366         OP_DCP
2367         READ_WRITE_4
2368         OP_CMP
2369         CYCLE_NEXT      6
2370
2371 opDF:   @ DCP $nnnn, X
2372         ABSX_ADDR
2373         READ_WRITE_1
2374         OP_DCP
2375         READ_WRITE_2
2376         OP_CMP
2377         CYCLE_NEXT      7
2378         READ_WRITE_3
2379         OP_DCP
2380         READ_WRITE_4
2381         OP_CMP
2382         CYCLE_NEXT      7
2383
2384 opDB:   @ DCP $nnnn, Y
2385         ABSY_ADDR
2386         READ_WRITE_1
2387         OP_DCP
2388         READ_WRITE_2
2389         OP_CMP
2390         CYCLE_NEXT      7
2391         READ_WRITE_3
2392         OP_DCP
2393         READ_WRITE_4
2394         OP_CMP
2395         CYCLE_NEXT      7
2396
2397
2398 opC3:   @ DCP ($nn, X)
2399         INDX_ADDR
2400         READ_WRITE_1
2401         OP_DCP
2402         READ_WRITE_2
2403         OP_CMP
2404         CYCLE_NEXT      8
2405         READ_WRITE_3
2406         OP_DCP
2407         READ_WRITE_4
2408         OP_CMP
2409         CYCLE_NEXT      8
2410
2411 opD3:   @ DCP ($nn), Y
2412         INDY_ADDR
2413         READ_WRITE_1
2414         OP_DCP
2415         READ_WRITE_2
2416         OP_CMP
2417         CYCLE_NEXT      8
2418         READ_WRITE_3
2419         OP_DCP
2420         READ_WRITE_4
2421         OP_CMP
2422         CYCLE_NEXT      8
2423
2424 op27:   @ RLA $nn
2425         ZERO_ADDR
2426         ZP_READ_W
2427         OP_RLA
2428         ZP_WRITE_W
2429         CYCLE_NEXT      5
2430
2431 op37:   @ RLA $nn, X
2432         ZEROX_ADDR
2433         ZP_READ_W
2434         OP_RLA
2435         ZP_WRITE_W
2436         CYCLE_NEXT      6
2437
2438 op2F:   @ RLA $nnnn
2439         ABS_ADDR
2440         READ_WRITE_1
2441         OP_RLA
2442         READ_WRITE_2
2443         CYCLE_NEXT      6
2444         READ_WRITE_3
2445         OP_RLA
2446         READ_WRITE_4
2447         CYCLE_NEXT      6
2448
2449 op3F:   @ RLA $nnnn, X
2450         ABSX_ADDR_W
2451         READ_WRITE_1
2452         OP_RLA
2453         READ_WRITE_2
2454         CYCLE_NEXT      7
2455         READ_WRITE_3
2456         OP_RLA
2457         READ_WRITE_4
2458         CYCLE_NEXT      7
2459
2460 op3B:   @ RLA $nnnn, Y
2461         ABSY_ADDR_W
2462         READ_WRITE_1
2463         OP_RLA
2464         READ_WRITE_2
2465         CYCLE_NEXT      7
2466         READ_WRITE_3
2467         OP_RLA
2468         READ_WRITE_4
2469         CYCLE_NEXT      7
2470
2471 op23:   @ RLA ($nn, X)
2472         INDX_ADDR
2473         READ_WRITE_1
2474         OP_RLA
2475         READ_WRITE_2
2476         CYCLE_NEXT      8
2477         READ_WRITE_3
2478         OP_RLA
2479         READ_WRITE_4
2480         CYCLE_NEXT      8
2481
2482 op33:   @ RLA ($nn), Y
2483         INDY_ADDR_W
2484         READ_WRITE_1
2485         OP_RLA
2486         READ_WRITE_2
2487         CYCLE_NEXT      8
2488         READ_WRITE_3
2489         OP_RLA
2490         READ_WRITE_4
2491         CYCLE_NEXT      8
2492
2493 op67:   @ RRA $nn
2494         ZERO_ADDR
2495         ZP_READ_W
2496         OP_RRA
2497         ZP_WRITE_W
2498         OP_ADC
2499         CYCLE_NEXT      5
2500
2501 op77:   @ RRA $nn, X
2502         ZEROX_ADDR
2503         ZP_READ_W
2504         OP_RRA
2505         ZP_WRITE_W
2506         OP_ADC
2507         CYCLE_NEXT      6
2508
2509 op6F:   @ RRA $nnnn
2510         ABS_ADDR
2511         READ_WRITE_1
2512         OP_RRA
2513         READ_WRITE_2
2514         OP_ADC
2515         CYCLE_NEXT      6
2516         READ_WRITE_3
2517         OP_RRA
2518         READ_WRITE_4
2519         OP_ADC
2520         CYCLE_NEXT      6
2521
2522 op7F:   @ RRA $nnnn, X
2523         ABSX_ADDR_W
2524         READ_WRITE_1
2525         OP_RRA
2526         READ_WRITE_2
2527         OP_ADC
2528         CYCLE_NEXT      7
2529         READ_WRITE_3
2530         OP_RRA
2531         READ_WRITE_4
2532         OP_ADC
2533         CYCLE_NEXT      7
2534
2535 op7B:   @ RRA $nnnn, Y
2536         ABSY_ADDR_W
2537         READ_WRITE_1
2538         OP_RRA
2539         READ_WRITE_2
2540         OP_ADC
2541         CYCLE_NEXT      7
2542         READ_WRITE_3
2543         OP_RRA
2544         READ_WRITE_4
2545         OP_ADC
2546         CYCLE_NEXT      7
2547
2548 op63:   @ RRA ($nn, X)
2549         INDX_ADDR
2550         READ_WRITE_1
2551         OP_RRA
2552         READ_WRITE_2
2553         OP_ADC
2554         CYCLE_NEXT      8
2555         READ_WRITE_3
2556         OP_RRA
2557         READ_WRITE_4
2558         OP_ADC
2559         CYCLE_NEXT      8
2560
2561 op73:   @ RRA ($nn), Y
2562         INDY_ADDR_W
2563         READ_WRITE_1
2564         OP_RRA
2565         READ_WRITE_2
2566         OP_ADC
2567         CYCLE_NEXT      8
2568         READ_WRITE_3
2569         OP_RRA
2570         READ_WRITE_4
2571         OP_ADC
2572         CYCLE_NEXT      8
2573
2574
2575 op04:   @ NOP $nn
2576 op44:
2577 op64:
2578         add     REG_PC,REG_PC,#1
2579         CYCLE_NEXT  3
2580
2581 op0C:   @ NOP $nnnn
2582         add     REG_PC,REG_PC,#2
2583         CYCLE_NEXT   4
2584
2585 op14:   @ NOP $nn, X
2586 op34:
2587 op54:
2588 op74:
2589 opD4:
2590 opF4:
2591         add     REG_PC,REG_PC,#1
2592         CYCLE_NEXT  4
2593
2594 op1A:   @ NOP
2595 op3A:
2596 op5A:
2597 op7A:
2598 opDA:
2599 opFA:
2600        CYCLE_NEXT   2
2601
2602 op1C:   @ NOP $nnnn, X
2603 op3C:
2604 op5C:
2605 op7C:
2606 opDC:
2607 opFC:
2608         add     REG_PC,REG_PC,#2
2609         CYCLE_NEXT   4
2610
2611 op80:   @ NOP #$nn
2612 op82:
2613 op89:
2614 opC2:
2615 opE2:
2616         add     REG_PC,REG_PC,#1
2617         CYCLE_NEXT   2
2618
2619
2620
2621 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2622 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2623 @@@
2624 @@@ JMP_INDIRECT
2625 @@@
2626 @@@ NZVC
2627 @@@ ----
2628 @@@ ----
2629 @ JMP ($nnnn)
2630 op6C:
2631         ABS_ADDR
2632         and     r0, REG_ADDR, #0xFF
2633         teq     r0, #0xFF
2634         beq     jmp_indirect_bug
2635         READ_WORD
2636         REBASE_PC
2637         CYCLE_NEXT      5
2638 jmp_indirect_bug:
2639 @@
2640 @@ BUG is : to not read word at REG_ADDR, because it loops
2641 @@ but read low part at REG_ADDR and high part at REG_ADDR&0xFF00 instead of REG_ADDR+1
2642 @@
2643         READ
2644         mov     REG_PC, r0
2645         and     REG_ADDR, REG_ADDR, #0xff00
2646         READ
2647         orr     r0, REG_PC, r0, lsl #8
2648         REBASE_PC
2649
2650         CYCLE_NEXT      5
2651
2652
2653 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2654 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2655 @@@
2656 @@@ JMP_ABSOLUTE
2657 @@@
2658 @@@ NZVC
2659 @@@ ----
2660 @@@ ----
2661 @ JMP $nnnn
2662 op4C:
2663         ABS_ADDR
2664         mov     r0, REG_ADDR
2665         @sub    r3, REG_PC, #3
2666         REBASE_PC
2667         CYCLE_NEXT      3
2668
2669 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2670 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2671 @@@
2672 @@@ JSR
2673 @@@
2674 @@@ NZVC
2675 @@@ ----
2676 @@@ ----
2677 @ JSR $nnnn
2678 op20:
2679         ABS_ADDR
2680         ldr     r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2681         sub     r0, REG_PC, r0
2682         sub     r0, r0, #1
2683         PUSH_WORD
2684         mov     r0, REG_ADDR
2685         REBASE_PC
2686         CYCLE_NEXT      6
2687
2688
2689
2690 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2691 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2692 @@@
2693 @@@ BRK
2694 @@@
2695 @@@ NZVC BI
2696 @@@ ---- --
2697 @@@ ---- 11
2698 op00:   @ BRK
2699         IMPLIED
2700         add     REG_PC, REG_PC, #1
2701         ldr     r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2702         sub     r0, REG_PC, r0
2703         PUSH_WORD
2704         orr     REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2705         SAVE_P
2706         PUSH_BYTE
2707         orr     REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2708         mov     REG_ADDR, #0x10000
2709         sub     REG_ADDR, REG_ADDR, #IRQ_VECTOR
2710         READ_WORD
2711         REBASE_PC
2712         CYCLE_NEXT      7
2713
2714 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2715 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2716 @@@
2717 @@@ RTI
2718 @@@
2719 @@@ NZVC
2720 @@@ ----
2721 @@@ ----
2722 @ RTI
2723 op40:
2724         IMPLIED
2725         POP_BYTE
2726         LOAD_P
2727         POP_WORD
2728         REBASE_PC
2729         CYCLE_NEXT_INT  6
2730
2731 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2732 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2733 @@@
2734 @@@ RTS
2735 @@@
2736 @@@ NZVC
2737 @@@ ----
2738 @@@ ----
2739 @ RTS
2740 op60:
2741         IMPLIED
2742         POP_WORD
2743         add     r0, r0, #1
2744         REBASE_PC
2745         CYCLE_NEXT      6
2746
2747 @@@
2748 @@@ ³ä¤ê¹þ¤ß¤Î½èÍý
2749 @@@ WARNING: decrements REG_PC
2750 @@@
2751 do_int:
2752         ldr     r0, [REG_OP_TABLE, #OTOFFS_PC_BASE]
2753         sub     REG_PC, REG_PC, #1
2754         sub     r0, REG_PC, r0
2755         PUSH_WORD
2756         bic     REG_P_REST, REG_P_REST, #P_REST_B_FLAG
2757         SAVE_P
2758         PUSH_BYTE
2759         tst     REG_P_REST, #FCEU_IQNMI<<8
2760         orreq   REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2761         bic     REG_P_REST, REG_P_REST, #((FCEU_IQNMI|FCEU_IQTEMP)<<8)
2762         mov     REG_ADDR, #0x10000
2763         subeq   REG_ADDR, REG_ADDR, #IRQ_VECTOR
2764         subne   REG_ADDR, REG_ADDR, #NMI_VECTOR
2765         READ_WORD
2766         REBASE_PC
2767 @       CYCLE_NEXT      7
2768
2769         subs    REG_CYCLE, REG_CYCLE, #7*48
2770         ble     cpu_exec_end
2771         ldrb    r0, [REG_PC], #1
2772         tst     REG_P_REST, #0xff<<8
2773         ldreq   pc, [REG_OP_TABLE, r0, lsl #2]
2774
2775         tst     REG_P_REST, #P_REST_I_FLAG
2776         ldrne   pc, [REG_OP_TABLE, r0, lsl #2]
2777         b       do_int
2778
2779
2780 @@@
2781 @@@ ¥ê¥»¥Ã¥È¤Î½èÍý
2782 @@@
2783         .globl  reset_cpu
2784
2785 reset_cpu:
2786         stmfd   r13!,{r4-r11,lr}
2787
2788         ldr     r0, =nes_registers
2789         ldmia   r0, {r4-r12}
2790
2791         @@  Set Z, clear N
2792         mov     REG_NZ, #0
2793         @@REG_P_REST = 0, don't touch REG_S
2794         bic     REG_P_REST, REG_P_REST, #0xff
2795
2796         @ fceu: set MapIRQHook present flag
2797         ldr     r0, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
2798         tst     r0, r0
2799         orrne   REG_P_REST, REG_P_REST, #1<<16
2800         biceq   REG_P_REST, REG_P_REST, #1<<16
2801
2802         @@ R bit is always 1
2803         orr     REG_NZ, REG_NZ, #P_R_FLAG
2804
2805         @@ INTERRUPT
2806         orr     REG_P_REST, REG_P_REST, #P_REST_I_FLAG
2807
2808         mov     REG_ADDR, #0x10000
2809         sub     REG_ADDR, REG_ADDR, #RESET_VECTOR
2810         READ_WORD
2811         REBASE_PC
2812
2813         ldr     r0, =nes_registers
2814         stmia   r0, {r4-r12}
2815
2816         ldmfd   r13!,{r4-r11,lr}
2817         bx      lr
2818
2819 @@@
2820 @@@ low-level memhandlers
2821 @@@
2822
2823 read_rom_byte:
2824 #ifndef DEBUG_ASM_6502
2825         ldr     r0, =CartBR
2826         ldr     r2, =ARead
2827         mov     r1, #0xff00
2828         orr     r1, r1, r1, lsr #4
2829         ldr     r1, [r2, r1, lsl #2]            @ if (ARead[0xfff0] == CartBR)
2830         cmp     r0, r1
2831         bne     read_ppu_reg
2832         ldr     r2, =Page
2833         mov     r1, REG_ADDR, lsr #11
2834         ldr     r2, [r2, r1, lsl #2]
2835         ldrb    r0, [r2, REG_ADDR]
2836         bx      lr
2837 #endif
2838
2839
2840 read_ppu_reg:
2841 read_high_reg:
2842 read_save_ram:
2843         @ must preserve r3 for the callers too
2844         @ TODO: check if all of saves are needed, _DB (is full needed?)
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
2848         mov     REG_PC, lr                      @ r7
2849         mov     REG_P_REST, r3                  @ r8
2850
2851 #ifndef DEBUG_ASM_6502
2852         ldr     r2, =ARead
2853         bic     r0, REG_ADDR, #0x00ff0000
2854         mov     lr, pc
2855         ldr     pc, [r2, r0, lsl #2]
2856 #else
2857         ldr     r2, =dread_count_a
2858         ldr     r0, =dreads
2859         ldr     r1, [r2]
2860         ldrb    r0, [r0, r1]
2861         add     r1, r1, #1
2862         str     r1, [r2]
2863 #endif
2864
2865         ldr     REG_OP_TABLE, =cpu_exec_table   @ got trashed because was in r12
2866         mov     lr, REG_PC
2867         mov     r3, REG_P_REST
2868         ldr     REG_PC,     [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)]   @ might get rebased
2869         ldr     REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)]   @ might set irq
2870         ldr     REG_CYCLE,  [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)]   @ might get used
2871         strb    r0,         [REG_OP_TABLE, #(OTOFFS_X + 0x10)]          @ X.DB
2872         bx      lr
2873
2874
2875 write_ppu_reg:
2876 write_high_reg:
2877 write_save_ram:
2878 write_rom_byte:
2879 #ifndef DEBUG_ASM_6502
2880         @ must preserve r3 for the callers too
2881         str     REG_PC,     [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)]   @ might get rebased
2882         str     REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)]   @ might set irq
2883         str     REG_CYCLE,  [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)]   @ might get used
2884         mov     REG_PC, lr                      @ r7
2885         mov     REG_P_REST, r3                  @ r8
2886
2887         ldr     r2, =BWrite
2888         mov     r1, r0
2889         bic     r0, REG_ADDR, #0x00ff0000
2890         mov     lr, pc
2891         ldr     pc, [r2, r0, lsl #2]
2892
2893         ldr     REG_OP_TABLE, =cpu_exec_table   @ got trashed because was in r12
2894         mov     lr, REG_PC
2895         mov     r3, REG_P_REST
2896         ldr     REG_PC,     [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x0c)]   @ might get rebased
2897         ldr     REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)]   @ might set irq
2898         ldr     REG_CYCLE,  [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x1c)]   @ might get used
2899 #else
2900         ldr     r1, =dwrite_count_a
2901         ldr     r2, =dwrites_a
2902         ldr     r1, [r1]
2903         and     r0, r0, #0xff
2904         orr     r0, r0, REG_ADDR, lsl #8
2905         str     r0, [r2, r1, lsl #2]
2906         ldr     r2, =dwrite_count_a
2907         add     r1, r1, #1
2908         str     r1, [r2]
2909 #endif
2910         bx      lr
2911
2912
2913 .pool
2914
2915
2916
2917 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2918 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2919 @@@
2920 @@@ 6502 ¤ò¥¨¥ß¥å¥ì¡¼¥È¤¹¤ë
2921 @@@
2922 @@@ REG_CYCLE   => ¼Â¹Ô¤¹¤ë¥µ¥¤¥¯¥ë
2923 @@@ REG_CYCLE   <= »Ä¤Ã¤Æ¤¤¤ë¥µ¥¤¥¯¥ë(Îí¤Þ¤¿¤ÏÉé)
2924         .globl  cpu_exec
2925 cpu_exec:
2926         stmfd   r13!,{r4-r11,lr}
2927
2928         ldr     r0, =nes_registers
2929         ldmia   r0, {r4-r12}
2930
2931 @       ldr   REG_OP_TABLE, = cpu_exec_table @ set on init
2932
2933         tst     REG_P_REST, #1<<16
2934         strne   REG_CYCLE, [REG_OP_TABLE, #OTOFFS_IRQH_CYC]
2935
2936         CYCLE_NEXT      0, 0
2937
2938 cpu_exec_end:
2939         tst     REG_P_REST, #1<<16
2940         blne    do_irq_hook
2941
2942         ldr     r0, =nes_registers
2943         stmia   r0, {r4-r12}
2944
2945         ldmfd   r13!,{r4-r11,lr}
2946         bx      lr
2947
2948 @@@
2949 @@@ ¤ß¤ì¤Ð¤ï¤«¤ë¤è¤¦¤Ë¥ª¥Ú¥³¡¼¥É¤ò¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤·¤¿¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë
2950 @@@ 0x400¥Ð¥¤¥È
2951 @@@
2952
2953 @ the code does RAM accesses through cpu_exec_table pointer + offset, so
2954 @ they must be in the same section
2955
2956         SECTION_DATA
2957         ALIGN
2958
2959 cpu_exec_table:
2960         .long   op00, op01, op02, op03, op04, op05, op06, op07
2961         .long   op08, op09, op0A, op0B, op0C, op0D, op0E, op0F
2962
2963         .long   op10, op11, op12, op13, op14, op15, op16, op17
2964         .long   op18, op19, op1A, op1B, op1C, op1D, op1E, op1F
2965
2966         .long   op20, op21, op22, op23, op24, op25, op26, op27
2967         .long   op28, op29, op2A, op2B, op2C, op2D, op2E, op2F
2968
2969         .long   op30, op31, op32, op33, op34, op35, op36, op37
2970         .long   op38, op39, op3A, op3B, op3C, op3D, op3E, op3F
2971
2972         .long   op40, op41, op42, op43, op44, op45, op46, op47
2973         .long   op48, op49, op4A, op4B, op4C, op4D, op4E, op4F
2974
2975         .long   op50, op51, op52, op53, op54, op55, op56, op57
2976         .long   op58, op59, op5A, op5B, op5C, op5D, op5E, op5F
2977
2978         .long   op60, op61, op62, op63, op64, op65, op66, op67
2979         .long   op68, op69, op6A, op6B, op6C, op6D, op6E, op6F
2980
2981         .long   op70, op71, op72, op73, op74, op75, op76, op77
2982         .long   op78, op79, op7A, op7B, op7C, op7D, op7E, op7F
2983
2984         .long   op80, op81, op82, op83, op84, op85, op86, op87
2985         .long   op88, op89, op8A, op8B, op8C, op8D, op8E, op8F
2986
2987         .long   op90, op91, op92, op93, op94, op95, op96, op97
2988         .long   op98, op99, op9A, op9B, op9C, op9D, op9E, op9F
2989
2990         .long   opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7
2991         .long   opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF
2992
2993         .long   opB0, opB1, opB2, opB3, opB4, opB5, opB6, opB7
2994         .long   opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF
2995
2996         .long   opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7
2997         .long   opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF
2998
2999         .long   opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7
3000         .long   opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF
3001
3002         .long   opE0, opE1, opE2, opE3, opE4, opE5, opE6, opE7
3003         .long   opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF
3004
3005         .long   opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7
3006         .long   opF8, opF9, opFA, opFB, opFC, opFD, opFE, opFF
3007
3008 @@@
3009 @@@ ¥ª¥Ú¥³¡¼¥É¥Æ¡¼¥Ö¥ë¤Îľ¸å¤Ë¤³¤ì¤òÃÖ¤¯REG_OP_TABLEÁêÂФÇ
3010 @@@ ÍøÍѤǤ­¤ë
3011 @@@
3012 nes_registers:
3013         .fill   0x40, 1, 0
3014 RAM:
3015 nes_internal_ram:
3016         .fill   0x100, 1, 0
3017 nes_stack:
3018         .fill   0x700, 1, 0
3019 @ TODO: write code which keeps it up-to-date
3020 pc_base:
3021         .long   0
3022 MapIRQHook:
3023         .long   0
3024 MapIRQHookCyc:
3025         .long   0
3026 timestamp:
3027         .long   0
3028 #ifndef DEBUG_ASM_6502
3029 X:
3030 #endif
3031 X_:     .fill   0x20, 1, 0
3032
3033 .pool
3034
3035 @       SECTION_SLOW
3036         SECTION_TEXT
3037         ALIGN
3038
3039
3040 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3041 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3042 @@@
3043 @@@ Undefined Opcodes
3044 @@@
3045 op0B:   @ ANC #$nn
3046 op2B:   @ ANC #$nn
3047 op8B:   @ ANE #$nn
3048 op6B:   @ ARR #$nn
3049 op4B:   @ ASR #$nn
3050 @opC7:  @ DCP $nn
3051 @opD7:  @ DCP $nn, X
3052 @opCF:  @ DCP $nnnn
3053 @opDF:  @ DCP $nnnn, X
3054 @opDB:  @ DCP $nnnn, Y
3055 @opC3:  @ DCP ($nn, X)
3056 @opD3:  @ DCP ($nn), Y
3057
3058
3059
3060 @opE7:  @ ISB $nn
3061 @opF7:  @ ISB $nn, X
3062 @opEF:  @ ISB $nnnn
3063 @opFF:  @ ISB $nnnn, X
3064 @opFB:  @ ISB $nnnn, Y
3065 @opE3:  @ ISB ($nn, X)
3066 @opF3:  @ ISB ($nn), Y
3067
3068
3069 op02:   @ JAM
3070 op12:
3071 op22:
3072 op32:
3073 op42:
3074 op52:
3075 op62:
3076 op72:
3077 op92:
3078 opB2:
3079 opD2:
3080 opF2:
3081
3082
3083 opBB:   @ LAS $nnnn,Y
3084 @opA3:  @ LAX ($nn, X)
3085 @opA7:  @ LAX $nn
3086 @opB7:  @ LAX $nn, Y
3087 @opAF:  @ LAX $nnnn
3088 @opBF:  @ LAX $nnnn, Y
3089
3090 @opB3:  @ LAX ($nn), Y
3091 opAB:   @ LXA #$nn
3092 @op27:  @ RLA $nn
3093 @op37:  @ RLA $nn, X
3094 @op2F:  @ RLA $nnnn
3095 @op3F:  @ RLA $nnnn, X
3096 @op23:  @ RLA ($nn, X)
3097 @op67:  @ RRA $nn
3098 @op77:  @ RRA $nn, X
3099 @op6F:  @ RRA $nnnn
3100 @op7F:  @ RRA $nnnn, X
3101 @op63:  @ RRA ($nn, X)
3102 op87:   @ SAX $nn
3103 op97:   @ SAX $nn, Y
3104 op8F:   @ SAX $nnnn
3105 op83:   @ SAX ($nn, X)
3106 @opCB:  @ SBX #$nn
3107 op9F:   @ SHA $nnnn, Y
3108 op93:   @ SHA ($nn), Y
3109 op9B:   @ SHS $nnnn, Y
3110 op9E:   @ SHX $nnnn, Y
3111 @op03:   @ SLO ($nn, X)
3112 @op07:  @ SLO $nn
3113 @op17:  @ SLO $nn, X
3114 @op0F:  @ SLO $nnnn
3115 @op1F:  @ SLO $nnnn, X
3116 @op47:  @ SRE $nn
3117 @op57:  @ SRE $nn, X
3118 @op4F:  @ SRE $nnnn
3119 @op5F:  @ SRE $nnnn, X
3120 @op5B:  @ SRE $nnnn, Y
3121 @op43:  @ SRE ($nn, X)
3122         CYCLE_NEXT   1
3123 @ emu_panic?
3124
3125
3126
3127 @@@@@@@@@@@@@@@@@@@@@@@@@@
3128 @ fceu stuff...
3129 @@@@@@@@@@@@@@@@@@@@@@@@@@
3130
3131 @ for reference
3132 .extern Page
3133 .extern ARead
3134 .extern BWrite
3135 .extern MapIRQHook
3136
3137
3138         SECTION_DATA
3139         ALIGN
3140         .globl  nes_registers @ TODO: hide?
3141         .globl  pc_base
3142         .globl  MapIRQHook @ (int a)
3143 #ifndef DEBUG_ASM_6502
3144         .globl  X
3145         .globl  RAM
3146         .globl  timestamp
3147 #else
3148         .globl  nes_internal_ram
3149 #endif
3150         .globl  X6502_Reset_a @ (void);
3151         .globl  X6502_Power_a @ (void);
3152         .globl  X6502_Run_a @ (int32 cycles);
3153         .globl  TriggerIRQ_a @ (void);
3154         .globl  TriggerNMI_a @ (void);
3155         .globl  TriggerNMINSF_a @ (void);
3156         .globl  X6502_AddCycles_a @ (int x);
3157         .globl  X6502_IRQBegin_a @ (int w);
3158         .globl  X6502_IRQEnd_a @ (int w);
3159         .globl  X6502_Rebase_a @ (void);
3160
3161         SECTION_TEXT
3162         ALIGN
3163
3164 .equiv X6502_Reset_a, reset_cpu
3165 .equiv X6502_Run_a, cpu_exec
3166
3167
3168 X6502_Power_a:
3169         ldr     r1, =timestamp
3170         mov     r0, #0
3171         str     r0, [r1]
3172         ldr     r1, =nes_registers
3173         mov     r2, #(0x40/4)
3174 X6502_Power_loop1:
3175         subs    r2, r2, #1
3176         str     r0, [r1], #4
3177         bne     X6502_Power_loop1
3178         ldr     r0, =cpu_exec_table
3179         sub     r1, r1, #0x40
3180         str     r0, [r1, #0x20]
3181         b       X6502_Reset_a
3182
3183
3184 TriggerIRQ_a:
3185         mov     r0, #FCEU_IQTEMP
3186
3187 X6502_IRQBegin_a:
3188         ldr     r2, =nes_registers
3189         and     r0, r0, #0xff
3190         ldr     r1, [r2, #0x10] @ REG_P_REST
3191         orr     r1, r1, r0, lsl #8
3192         str     r1, [r2, #0x10]
3193         bx      lr
3194
3195
3196 X6502_IRQEnd_a:
3197         ldr     r2, =nes_registers
3198         and     r0, r0, #0xff
3199         ldr     r1, [r2, #0x10]
3200         bic     r1, r1, r0, lsl #8
3201         str     r1, [r2, #0x10]
3202         bx      lr
3203
3204
3205 TriggerNMI_a:
3206         mov     r0, #FCEU_IQNMI
3207         b       X6502_IRQBegin_a
3208
3209
3210 TriggerNMINSF_a:
3211         @ not implemented
3212         bx      lr
3213
3214
3215 X6502_AddCycles_a:
3216         ldr     r2, =nes_registers
3217         ldr     r1, [r2, #0x1c]
3218         mvn     r3, #47                 @ r3=-48
3219         mla     r0, r3, r0, r1
3220         str     r0, [r2, #0x1c]
3221         bx      lr
3222
3223
3224 @ rebase PC when not executing or in memhandlers
3225 X6502_Rebase_a:
3226         stmfd   sp!,{REG_PC,REG_OP_TABLE}
3227         ldr     REG_OP_TABLE, =cpu_exec_table
3228         ldr     r0, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3229         ldr     r1, [REG_OP_TABLE, #OTOFFS_PC_BASE]
3230         sub     r0, r0, r1
3231         REBASE_PC
3232         str     REG_PC, [REG_OP_TABLE, #(OTOFFS_NES_REGS+0x0c)] @ PC
3233         ldmfd   sp!,{REG_PC,REG_OP_TABLE}
3234         bx      lr
3235 .pool
3236
3237
3238 @ the nasty MapIRQHook thing from FCE..
3239 @ test Gradius 2 (J) if you change this
3240 do_irq_hook:
3241         @ ((cycles >> 4) * 43) >> 7; // aproximating /= 48
3242         ldr     r1,        [REG_OP_TABLE, #OTOFFS_IRQH_CYC]
3243         str     REG_CYCLE, [REG_OP_TABLE, #OTOFFS_IRQH_CYC]
3244         mov     r0, #43
3245         sub     r1, r1, REG_CYCLE
3246         mul     r0, r1, r0
3247         mov     r0, r0, lsr #11
3248
3249 #ifndef DEBUG_ASM_6502
3250         @ I have reviewed all MapIRQHook functions, they only seem to cause IRQs, not messing cycles or something
3251         str     REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)]   @ might set irq
3252         mov     REG_P_REST, lr                  @ r8
3253
3254         @ if somebody modifies MapIRQHook without calling reset, we are doomed
3255         mov     lr, pc
3256         ldr     pc, [REG_OP_TABLE, #OTOFFS_IRQ_HOOK]
3257
3258         ldr     REG_OP_TABLE, =cpu_exec_table   @ got trashed because was in r12
3259         mov     lr, REG_P_REST
3260         ldr     REG_P_REST, [REG_OP_TABLE, #(OTOFFS_NES_REGS + 0x10)]   @ might set irq
3261 #else
3262         ldr     r1, =mapirq_cyc_a
3263         str     r0, [r1]
3264         mov     r1, r0
3265 #endif
3266         bx      lr
3267
3268
3269 @ vim:filetype=armasm
3270