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