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