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