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