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