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