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