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