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