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