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