2 /****************************************************************
3 ****************************************************************/
5 .equiv ASM_SPC700, 1 ;@ 1 = use notaz's ASM_SPC700 core
7 /****************************************************************
9 ****************************************************************/
13 rstatus .req R4 @ format : 0xff800000
14 reg_d_bank .req R4 @ format : 0x000000ll
15 reg_a .req R5 @ format : 0xhhll0000 or 0xll000000
16 reg_d .req R6 @ format : 0xhhll0000
17 reg_p_bank .req R6 @ format : 0x000000ll
18 reg_x .req R7 @ format : 0xhhll0000 or 0xll000000
19 reg_s .req R8 @ format : 0x0000hhll
20 reg_y .req R9 @ format : 0xhhll0000 or 0xll000000
22 rpc .req R10 @ 32bits address
23 reg_cycles .req R11 @ 32bits counter
24 regpcbase .req R12 @ 32bits address
26 rscratch .req R0 @ format : 0xhhll0000 if data and calculation or return of S9XREADBYTE or WORD
27 regopcode .req R0 @ format : 0x000000ll
28 rscratch2 .req R1 @ format : 0xhhll for calculation and value
30 rscratch4 .req R3 @ ??????
33 rscratch9 .req R10 @ ??????
39 @ R13 @ Pointer 32 bit on a struct.
43 .equ STATUS_SHIFTER, 24
44 .equ MASK_EMUL, (1<<(STATUS_SHIFTER-1))
45 .equ MASK_SHIFTER_CARRY, (STATUS_SHIFTER+1)
46 .equ MASK_CARRY, (1<<(STATUS_SHIFTER)) @ 0
47 .equ MASK_ZERO, (2<<(STATUS_SHIFTER)) @ 1
48 .equ MASK_IRQ, (4<<(STATUS_SHIFTER)) @ 2
49 .equ MASK_DECIMAL, (8<<(STATUS_SHIFTER)) @ 3
50 .equ MASK_INDEX, (16<<(STATUS_SHIFTER)) @ 4 @ 1
51 .equ MASK_MEM, (32<<(STATUS_SHIFTER)) @ 5 @ 2
52 .equ MASK_OVERFLOW, (64<<(STATUS_SHIFTER)) @ 6 @ 4
53 .equ MASK_NEG, (128<<(STATUS_SHIFTER))@ 7 @ 8
56 .equ SLOW_ONE_CYCLE, 8
58 .equ NMI_FLAG, (1 << 7)
59 .equ IRQ_PENDING_FLAG, (1 << 11)
60 .equ SCAN_KEYS_FLAG, (1 << 4)
63 .equ MEMMAP_BLOCK_SIZE, (0x1000)
65 .equ MEMMAP_MASK, (0xFFF)
67 /****************************************************************
69 ****************************************************************/
71 @ #include "os9x_65c816_mac_gen.h"
72 /*****************************************************************/
73 /* Offset in SCPUState structure */
74 /*****************************************************************/
76 .equ BranchSkip_ofs, 4
79 .equ WaitingForInterrupt_ofs, 7
96 .equ PCAtOpcodeStart_ofs, 36
97 .equ WaitAddress_ofs, 40
98 .equ WaitCounter_ofs, 44
99 .equ NextEvent_ofs, 48
100 .equ V_Counter_ofs, 52
101 .equ MemSpeed_ofs, 56
102 .equ MemSpeedx2_ofs, 60
103 .equ FastROMSpeed_ofs, 64
104 .equ AutoSaveTimer_ofs, 68
105 .equ NMITriggerPoint_ofs, 72
106 .equ NMICycleCount_ofs, 76
107 .equ IRQCycleCount_ofs, 80
111 .equ SRAMModified_ofs, 86
112 .equ BRKTriggered_ofs, 87
113 .equ asm_OPTABLE_ofs, 88
114 .equ TriedInterleavedMode2_ofs, 92
117 .equ WriteMap_ofs, 100
118 .equ MemorySpeed_ofs, 104
119 .equ BlockIsRAM_ofs, 108
124 .equ APUExecuting_ofs, 122
128 /*****************************************************************/
131 .macro PREPARE_C_CALL
134 .macro PREPARE_C_CALL_R0
135 STMFD R13!,{R0,R12,R14}
137 .macro PREPARE_C_CALL_R0R1
138 STMFD R13!,{R0,R1,R12,R14}
140 .macro PREPARE_C_CALL_LIGHT
143 .macro PREPARE_C_CALL_LIGHTR12
147 .macro RESTORE_C_CALL
150 .macro RESTORE_C_CALL_R0
151 LDMFD R13!,{R0,R12,R14}
153 .macro RESTORE_C_CALL_R1
154 LDMFD R13!,{R1,R12,R14}
156 .macro RESTORE_C_CALL_LIGHT
159 .macro RESTORE_C_CALL_LIGHTR12
167 add r0,reg_cpu_var,#8
168 ldmia r0,{r1,reg_a,reg_x,reg_y,rpc,reg_cycles,regpcbase}
169 @ rstatus (P) & reg_d_bank
170 mov reg_d_bank,r1,lsl #16
171 mov reg_d_bank,reg_d_bank,lsr #24
173 orrs rstatus, rstatus, r0,lsl #STATUS_SHIFTER @ 24
174 @ if Carry set, then EMULATION bit was set
175 orrcs rstatus,rstatus,#MASK_EMUL
177 mov reg_d,reg_a,lsr #16
178 mov reg_d,reg_d,lsl #8
179 orr reg_d,reg_d,r1,lsl #24
180 mov reg_d,reg_d,ror #24 @ 0xdddd00pb
182 mov reg_s,reg_x,lsr #16
183 @ Shift X,Y & A according to the current mode (INDEX, MEMORY bits)
184 tst rstatus,#MASK_INDEX
185 movne reg_x,reg_x,lsl #24
186 movne reg_y,reg_y,lsl #24
187 moveq reg_x,reg_x,lsl #16
188 moveq reg_y,reg_y,lsl #16
189 tst rstatus,#MASK_MEM
190 movne reg_a,reg_a,lsl #24
191 moveq reg_a,reg_a,lsl #16
194 @ reg_d & reg_p_bank share the same register
195 LDRB reg_p_bank,[reg_cpu_var,#RPB_ofs]
196 LDRH rscratch,[reg_cpu_var,#RD_ofs]
197 ORR reg_d,reg_d,rscratch, LSL #16
198 @ rstatus & reg_d_bank share the same register
199 LDRB reg_d_bank,[reg_cpu_var,#RDB_ofs]
200 LDRH rscratch,[reg_cpu_var,#RP_ofs]
201 ORRS rstatus, rstatus, rscratch,LSL #STATUS_SHIFTER @ 24
202 @ if Carry set, then EMULATION bit was set
203 ORRCS rstatus,rstatus,#MASK_EMUL
205 LDRH reg_a,[reg_cpu_var,#RA_ofs]
206 LDRH reg_x,[reg_cpu_var,#RX_ofs]
207 LDRH reg_y,[reg_cpu_var,#RY_ofs]
208 LDRH reg_s,[reg_cpu_var,#RS_ofs]
209 @ Shift X,Y & A according to the current mode (INDEX, MEMORY bits)
210 TST rstatus,#MASK_INDEX
211 MOVNE reg_x,reg_x,LSL #24
212 MOVNE reg_y,reg_y,LSL #24
213 MOVEQ reg_x,reg_x,LSL #16
214 MOVEQ reg_y,reg_y,LSL #16
215 TST rstatus,#MASK_MEM
216 MOVNE reg_a,reg_a,LSL #24
217 MOVEQ reg_a,reg_a,LSL #16
219 LDR regpcbase,[reg_cpu_var,#PCBase_ofs]
220 LDR rpc,[reg_cpu_var,#PC_ofs]
221 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs]
228 @ reg_p_bank, reg_d_bank and rstatus
229 mov r1, rstatus, lsr #16
230 orr r1, r1, reg_p_bank, lsl #24
232 orrcs r1, r1, #0x100 @ EMULATION bit
233 orr r1, r1, reg_d_bank, lsl #24
236 tst rstatus,#MASK_MEM
237 ldrneh r0, [reg_cpu_var,#RA_ofs]
239 orrne reg_a, r0, reg_a,lsr #24
240 moveq reg_a, reg_a, lsr #16
241 mov reg_d, reg_d, lsr #16
242 orr reg_a, reg_a, reg_d, lsl #16
243 @ Shift X&Y according to the current mode (INDEX, MEMORY bits)
244 tst rstatus,#MASK_INDEX
245 movne reg_x,reg_x,LSR #24
246 movne reg_y,reg_y,LSR #24
247 moveq reg_x,reg_x,LSR #16
248 moveq reg_y,reg_y,LSR #16
250 orr reg_x, reg_x, reg_s, lsl #16
252 add r0,reg_cpu_var,#8
253 stmia r0,{r1,reg_a,reg_x,reg_y,rpc,reg_cycles,regpcbase}
256 @ reg_d & reg_p_bank is same register
257 STRB reg_p_bank,[reg_cpu_var,#RPB_ofs]
258 MOV rscratch,reg_d, LSR #16
259 STRH rscratch,[reg_cpu_var,#RD_ofs]
260 @ rstatus & reg_d_bank is same register
261 STRB reg_d_bank,[reg_cpu_var,#RDB_ofs]
262 MOVS rscratch, rstatus, LSR #STATUS_SHIFTER
263 ORRCS rscratch,rscratch,#0x100 @ EMULATION bit
264 STRH rscratch,[reg_cpu_var,#RP_ofs]
266 @ Shift X,Y & A according to the current mode (INDEX, MEMORY bits)
267 TST rstatus,#MASK_INDEX
268 MOVNE rscratch,reg_x,LSR #24
269 MOVNE rscratch2,reg_y,LSR #24
270 MOVEQ rscratch,reg_x,LSR #16
271 MOVEQ rscratch2,reg_y,LSR #16
272 STRH rscratch,[reg_cpu_var,#RX_ofs]
273 STRH rscratch2,[reg_cpu_var,#RY_ofs]
274 TST rstatus,#MASK_MEM
275 LDRNEH rscratch,[reg_cpu_var,#RA_ofs]
276 BICNE rscratch,rscratch,#0xFF
277 ORRNE rscratch,rscratch,reg_a,LSR #24
278 MOVEQ rscratch,reg_a,LSR #16
279 STRH rscratch,[reg_cpu_var,#RA_ofs]
281 STRH reg_s,[reg_cpu_var,#RS_ofs]
282 STR regpcbase,[reg_cpu_var,#PCBase_ofs]
283 STR rpc,[reg_cpu_var,#PC_ofs]
285 STR reg_cycles,[reg_cpu_var,#Cycles_ofs]
289 /*****************************************************************/
291 add reg_cycles,reg_cycles, #ONE_CYCLE
294 addne reg_cycles,reg_cycles, #ONE_CYCLE
297 addeq reg_cycles,reg_cycles, #ONE_CYCLE
301 add reg_cycles,reg_cycles, #(ONE_CYCLE*2)
304 addne reg_cycles,reg_cycles, #(ONE_CYCLE*2)
307 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
308 add reg_cycles,reg_cycles, #(ONE_CYCLE*2)
309 add reg_cycles, reg_cycles, rscratch, LSL #1
312 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
313 add reg_cycles,reg_cycles, #(ONE_CYCLE*2)
314 add reg_cycles, reg_cycles, rscratch
318 add reg_cycles,reg_cycles, #(ONE_CYCLE*3)
322 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
323 add reg_cycles,reg_cycles, #ONE_CYCLE
324 add reg_cycles, reg_cycles, rscratch
328 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
329 add reg_cycles,reg_cycles, #ONE_CYCLE
330 add reg_cycles, reg_cycles, rscratch, lsl #1
334 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
335 add reg_cycles, reg_cycles, rscratch
339 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
340 add reg_cycles, reg_cycles, rscratch, lsl #1
344 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
345 add reg_cycles, rscratch, reg_cycles
346 add reg_cycles, reg_cycles, rscratch, lsl #1
351 BIC rstatus,rstatus,#MASK_DECIMAL
354 ORR rstatus,rstatus,#MASK_DECIMAL
357 ORR rstatus,rstatus,#MASK_IRQ
360 BIC rstatus,rstatus,#MASK_IRQ
364 @ if (Settings.Shutdown && CPU.PC == CPU.WaitAddress)
365 LDR rscratch,[reg_cpu_var,#WaitAddress_ofs]
368 @ if (CPU.WaitCounter == 0 && !(CPU.Flags & (IRQ_PENDING_FLAG | NMI_FLAG)))
369 LDR rscratch,[reg_cpu_var,#Flags_ofs]
370 LDR rscratch2,[reg_cpu_var,#WaitCounter_ofs]
371 TST rscratch,#(IRQ_PENDING_FLAG|NMI_FLAG)
373 MOVS rscratch2,rscratch2
375 @ CPU.WaitAddress = NULL;
377 STR rscratch,[reg_cpu_var,#WaitAddress_ofs]
379 @ S9xSA1ExecuteDuringSleep (); : TODO
381 @ CPU.Cycles = CPU.NextEvent;
382 LDR reg_cycles,[reg_cpu_var,#NextEvent_ofs]
383 LDRB r0,[reg_cpu_var,#APUExecuting_ofs]
386 @ if (IAPU.APUExecuting)
388 ICPU.CPUExecuting = FALSE;
392 } while (APU.Cycles < CPU.NextEvent);
393 ICPU.CPUExecuting = TRUE;
401 if (CPU.WaitCounter >= 2)
408 @ SUBLS rscratch2,rscratch2,#1
410 STR rscratch2,[reg_cpu_var,#WaitCounter_ofs]
415 /*in rsctach : OpAddress
416 /*destroy rscratch2*/
417 LDRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
418 MOVS rscratch2,rscratch2
421 STRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
422 SUB rscratch2,rpc,regpcbase
423 @ if( CPU.PC - CPU.PCBase > OpAddress) return;
424 CMP rscratch2,rscratch
429 /*in rsctach : OpAddress
430 /*destroy rscratch2*/
431 LDRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
432 MOVS rscratch2,rscratch2
435 STRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
436 SUB rscratch2,rpc,regpcbase
437 @ if( CPU.PC - CPU.PCBase > OpAddress) return;
438 CMP rscratch2,rscratch
443 /*in rsctach : OpAddress
444 /*destroy rscratch2*/
445 LDRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
446 MOVS rscratch2,rscratch2
449 STRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
450 SUB rscratch2,rpc,regpcbase
451 @ if( CPU.PC - CPU.PCBase > OpAddress) return;
452 CMP rscratch2,rscratch
458 @ in : rscratch (0x00hhmmll)
462 LDR rpc,[reg_cpu_var,#PC_ofs]
463 LDR regpcbase,[reg_cpu_var,#PCBase_ofs]
467 TST rstatus,#MASK_EMUL
468 LDRNE rscratch, = jumptable1 @ Mode 0 : M=1,X=1
471 TST rstatus,#MASK_MEM
474 TST rstatus,#MASK_INDEX
475 @ INDEX=1 @ Mode 0 : M=1,X=1
476 LDRNE rscratch, = jumptable1
477 @ INDEX=0 @ Mode 1 : M=1,X=0
478 LDREQ rscratch, = jumptable2
481 TST rstatus,#MASK_INDEX
482 @ INDEX=1 @ Mode 3 : M=0,X=1
483 LDRNE rscratch, = jumptable4
484 @ INDEX=0 @ Mode 2 : M=0,X=0
485 LDREQ rscratch, = jumptable3
487 STR rscratch,[reg_cpu_var,#asm_OPTABLE_ofs]
505 .macro S9xDoHBlankProcessing
508 @ BL asm_S9xDoHBlankProcessing
509 BL S9xDoHBlankProcessing
514 /********************************/
516 LDR R1,[reg_cpu_var,#asm_OPTABLE_ofs]
517 STR rpc,[reg_cpu_var,#PCAtOpcodeStart_ofs]
521 LDR PC, [R1,R0, LSL #2]
524 LDR rscratch,[reg_cpu_var,#NextEvent_ofs]
525 CMP reg_cycles,rscratch
527 S9xDoHBlankProcessing
531 .macro asmAPU_EXECUTE
532 LDRB R0,[reg_cpu_var,#APUExecuting_ofs]
533 CMP R0,#1 @ spc700 enabled, hack mode off
535 LDR R0,[reg_cpu_var,#APU_Cycles]
536 SUBS R0,reg_cycles,R0
539 PREPARE_C_CALL_LIGHTR12
541 RESTORE_C_CALL_LIGHTR12
542 SUB R0,reg_cycles,R0 @ sub cycles left
543 STR R0,[reg_cpu_var,#APU_Cycles]
546 STR reg_cycles,[reg_cpu_var,#Cycles_ofs]
547 PREPARE_C_CALL_LIGHTR12
549 RESTORE_C_CALL_LIGHTR12
550 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs]
557 .macro asmAPU_EXECUTE2
559 LDRB R0,[reg_cpu_var,#APUExecuting_ofs]
560 CMP R0,#1 @ spc700 enabled, hack mode off
562 LDR R0,[reg_cpu_var,#APU_Cycles]
563 SUBS R0,reg_cycles,R0 @ reg_cycles == NextEvent
565 PREPARE_C_CALL_LIGHTR12
567 RESTORE_C_CALL_LIGHTR12
568 SUB R0,reg_cycles,R0 @ sub cycles left
569 STR R0,[reg_cpu_var,#APU_Cycles]
573 STR reg_cycles,[reg_cpu_var,#Cycles_ofs]
574 PREPARE_C_CALL_LIGHTR12
576 RESTORE_C_CALL_LIGHTR12
577 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs]
582 @ #include "os9x_65c816_mac_mem.h"
584 @ in : rscratch (0x00hhmmll)
585 @ out : rscratch (0xhhll0000)
586 STMFD R13!,{PC} @ Push return address
592 @ in : rscratch (0x00hhmmll)
593 @ out : rscratch (0x0000hhll)
594 STMFD R13!,{PC} @ Push return address
598 .macro S9xGetWordRegStatus reg
599 @ in : rscratch (0x00hhmmll)
600 @ out : reg (0xhhll0000)
601 @ flags have to be updated with read value
602 STMFD R13!,{PC} @ Push return address
605 MOVS \reg, R0, LSL #16
607 .macro S9xGetWordRegNS reg
608 @ in : rscratch (0x00hhmmll)
609 @ out : reg (0xhhll0000)
610 @ DOES NOT DESTROY rscratch (R0)
612 STMFD R13!,{PC} @ Push return address
615 MOV \reg, R0, LSL #16
618 .macro S9xGetWordLowRegNS reg
619 @ in : rscratch (0x00hhmmll)
620 @ out : reg (0xhhll0000)
621 @ DOES NOT DESTROY rscratch (R0)
623 STMFD R13!,{PC} @ Push return address
631 @ in : rscratch (0x00hhmmll)
632 @ out : rscratch (0xll000000)
633 STMFD R13!,{PC} @ Push return address
639 @ in : rscratch (0x00hhmmll)
640 @ out : rscratch (0x000000ll)
645 .macro S9xGetByteRegStatus reg
646 @ in : rscratch (0x00hhmmll)
647 @ out : reg (0xll000000)
648 @ flags have to be updated with read value
649 STMFD R13!,{PC} @ Push return address
652 MOVS \reg, R0, LSL #24
654 .macro S9xGetByteRegNS reg
655 @ in : rscratch (0x00hhmmll)
656 @ out : reg (0xll000000)
657 @ DOES NOT DESTROY rscratch (R0)
659 STMFD R13!,{PC} @ Push return address
662 MOVS \reg, R0, LSL #24
665 .macro S9xGetByteLowRegNS reg
666 @ in : rscratch (0x00hhmmll)
667 @ out : reg (0x000000ll)
668 @ DOES NOT DESTROY rscratch (R0)
670 STMFD R13!,{PC} @ Push return address
677 .macro S9xSetWord regValue
678 @ in : regValue (0xhhll0000)
679 @ in : rscratch=address (0x00hhmmll)
680 MOV R1,\regValue, LSR #16
681 STMFD R13!,{PC} @ Push return address
685 .macro S9xSetWordZero
686 @ in : rscratch=address (0x00hhmmll)
688 STMFD R13!,{PC} @ Push return address
692 .macro S9xSetWordLow regValue
693 @ in : regValue (0x0000hhll)
694 @ in : rscratch=address (0x00hhmmll)
696 STMFD R13!,{PC} @ Push return address
700 .macro S9xSetByte regValue
701 @ in : regValue (0xll000000)
702 @ in : rscratch=address (0x00hhmmll)
703 MOV R1,\regValue, LSR #24
704 STMFD R13!,{PC} @ Push return address
708 .macro S9xSetByteZero
709 @ in : rscratch=address (0x00hhmmll)
711 STMFD R13!,{PC} @ Push return address
715 .macro S9xSetByteLow regValue
716 @ in : regValue (0x000000ll)
717 @ in : rscratch=address (0x00hhmmll)
719 STMFD R13!,{PC} @ Push return address
725 @ ===========================================
726 @ ===========================================
728 @ ===========================================
729 @ ===========================================
734 LDRB rscratch2 , [rpc, #1]
735 LDRB rscratch , [rpc],#2
736 ORR rscratch , rscratch, rscratch2, LSL #8
737 ORR rscratch , rscratch, reg_d_bank, LSL #16
739 .macro AbsoluteIndexedIndirectX0
741 LDRB rscratch2 , [rpc, #1]
742 LDRB rscratch , [rpc], #2
743 ORR rscratch , rscratch, rscratch2, LSL #8
744 ADD rscratch , reg_x, rscratch, LSL #16
745 MOV rscratch , rscratch, LSR #16
746 ORR rscratch , rscratch, reg_p_bank, LSL #16
750 .macro AbsoluteIndexedIndirectX1
752 LDRB rscratch2 , [rpc, #1]
753 LDRB rscratch , [rpc], #2
754 ORR rscratch , rscratch, rscratch2, LSL #8
755 ADD rscratch , rscratch, reg_x, LSR #24
756 BIC rscratch , rscratch, #0x00FF0000
757 ORR rscratch , rscratch, reg_p_bank, LSL #16
761 .macro AbsoluteIndirectLong
763 LDRB rscratch2 , [rpc, #1]
764 LDRB rscratch , [rpc], #2
765 ORR rscratch , rscratch, rscratch2, LSL #8
766 S9xGetWordLowRegNS rscratch2
767 ADD rscratch , rscratch, #2
768 STMFD r13!,{rscratch2}
770 LDMFD r13!,{rscratch2}
771 ORR rscratch , rscratch2, rscratch, LSL #16
773 .macro AbsoluteIndirect
775 LDRB rscratch2 , [rpc,#1]
776 LDRB rscratch , [rpc], #2
777 ORR rscratch , rscratch, rscratch2, LSL #8
779 ORR rscratch , rscratch, reg_p_bank, LSL #16
781 .macro AbsoluteIndexedX0
783 LDRB rscratch2 , [rpc, #1]
784 LDRB rscratch , [rpc], #2
785 ORR rscratch , rscratch, rscratch2, LSL #8
786 ORR rscratch , rscratch, reg_d_bank, LSL #16
787 ADD rscratch , rscratch, reg_x, LSR #16
789 .macro AbsoluteIndexedX1
791 LDRB rscratch2 , [rpc, #1]
792 LDRB rscratch , [rpc], #2
793 ORR rscratch , rscratch, rscratch2, LSL #8
794 ORR rscratch , rscratch, reg_d_bank, LSL #16
795 ADD rscratch , rscratch, reg_x, LSR #24
799 .macro AbsoluteIndexedY0
801 LDRB rscratch2 , [rpc, #1]
802 LDRB rscratch , [rpc], #2
803 ORR rscratch , rscratch, rscratch2, LSL #8
804 ORR rscratch , rscratch, reg_d_bank, LSL #16
805 ADD rscratch , rscratch, reg_y, LSR #16
807 .macro AbsoluteIndexedY1
809 LDRB rscratch2 , [rpc, #1]
810 LDRB rscratch , [rpc], #2
811 ORR rscratch , rscratch, rscratch2, LSL #8
812 ORR rscratch , rscratch, reg_d_bank, LSL #16
813 ADD rscratch , rscratch, reg_y, LSR #24
817 LDRB rscratch2 , [rpc, #1]
818 LDRB rscratch , [rpc], #2
819 ORR rscratch , rscratch, rscratch2, LSL #8
820 LDRB rscratch2 , [rpc], #1
821 ORR rscratch , rscratch, rscratch2, LSL #16
825 .macro AbsoluteLongIndexedX0
827 LDRB rscratch2 , [rpc, #1]
828 LDRB rscratch , [rpc], #2
829 ORR rscratch , rscratch, rscratch2, LSL #8
830 LDRB rscratch2 , [rpc], #1
831 ORR rscratch , rscratch, rscratch2, LSL #16
832 ADD rscratch , rscratch, reg_x, LSR #16
833 BIC rscratch, rscratch, #0xFF000000
835 .macro AbsoluteLongIndexedX1
837 LDRB rscratch2 , [rpc, #1]
838 LDRB rscratch , [rpc], #2
839 ORR rscratch , rscratch, rscratch2, LSL #8
840 LDRB rscratch2 , [rpc], #1
841 ORR rscratch , rscratch, rscratch2, LSL #16
842 ADD rscratch , rscratch, reg_x, LSR #24
843 BIC rscratch, rscratch, #0xFF000000
847 LDRB rscratch , [rpc], #1
848 ADD rscratch , reg_d, rscratch, LSL #16
849 MOV rscratch, rscratch, LSR #16
851 .macro DirectIndirect
853 LDRB rscratch , [rpc], #1
854 ADD rscratch , reg_d, rscratch, LSL #16
855 MOV rscratch, rscratch, LSR #16
857 ORR rscratch , rscratch, reg_d_bank, LSL #16
859 .macro DirectIndirectLong
861 LDRB rscratch , [rpc], #1
862 ADD rscratch , reg_d, rscratch, LSL #16
863 MOV rscratch, rscratch, LSR #16
864 S9xGetWordLowRegNS rscratch2
865 ADD rscratch , rscratch,#2
866 STMFD r13!,{rscratch2}
868 LDMFD r13!,{rscratch2}
869 ORR rscratch , rscratch2, rscratch, LSL #16
871 .macro DirectIndirectIndexed0
873 LDRB rscratch , [rpc], #1
874 ADD rscratch , reg_d, rscratch, LSL #16
875 MOV rscratch, rscratch, LSR #16
877 ORR rscratch, rscratch,reg_d_bank, LSL #16
878 ADD rscratch, rscratch,reg_y, LSR #16
880 .macro DirectIndirectIndexed1
882 LDRB rscratch , [rpc], #1
883 ADD rscratch , reg_d, rscratch, LSL #16
884 MOV rscratch, rscratch, LSR #16
886 ORR rscratch, rscratch,reg_d_bank, LSL #16
887 ADD rscratch, rscratch,reg_y, LSR #24
889 .macro DirectIndirectIndexedLong0
891 LDRB rscratch , [rpc], #1
892 ADD rscratch , reg_d, rscratch, LSL #16
893 MOV rscratch, rscratch, LSR #16
894 S9xGetWordLowRegNS rscratch2
895 ADD rscratch , rscratch,#2
896 STMFD r13!,{rscratch2}
898 LDMFD r13!,{rscratch2}
899 ORR rscratch , rscratch2, rscratch, LSL #16
900 ADD rscratch, rscratch,reg_y, LSR #16
902 .macro DirectIndirectIndexedLong1
904 LDRB rscratch , [rpc], #1
905 ADD rscratch , reg_d, rscratch, LSL #16
906 MOV rscratch, rscratch, LSR #16
907 S9xGetWordLowRegNS rscratch2
908 ADD rscratch , rscratch,#2
909 STMFD r13!,{rscratch2}
911 LDMFD r13!,{rscratch2}
912 ORR rscratch , rscratch2, rscratch, LSL #16
913 ADD rscratch, rscratch,reg_y, LSR #24
915 .macro DirectIndexedIndirect0
917 LDRB rscratch , [rpc], #1
918 ADD rscratch2 , reg_d , reg_x
919 ADD rscratch , rscratch2 , rscratch, LSL #16
920 MOV rscratch, rscratch, LSR #16
922 ORR rscratch , rscratch , reg_d_bank, LSL #16
924 .macro DirectIndexedIndirect1
926 LDRB rscratch , [rpc], #1
927 ADD rscratch2 , reg_d , reg_x, LSR #8
928 ADD rscratch , rscratch2 , rscratch, LSL #16
929 MOV rscratch, rscratch, LSR #16
931 ORR rscratch , rscratch , reg_d_bank, LSL #16
933 .macro DirectIndexedX0
935 LDRB rscratch , [rpc], #1
936 ADD rscratch2 , reg_d , reg_x
937 ADD rscratch , rscratch2 , rscratch, LSL #16
938 MOV rscratch, rscratch, LSR #16
940 .macro DirectIndexedX1
942 LDRB rscratch , [rpc], #1
943 ADD rscratch2 , reg_d , reg_x, LSR #8
944 ADD rscratch , rscratch2 , rscratch, LSL #16
945 MOV rscratch, rscratch, LSR #16
947 .macro DirectIndexedY0
949 LDRB rscratch , [rpc], #1
950 ADD rscratch2 , reg_d , reg_y
951 ADD rscratch , rscratch2 , rscratch, LSL #16
952 MOV rscratch, rscratch, LSR #16
954 .macro DirectIndexedY1
956 LDRB rscratch , [rpc], #1
957 ADD rscratch2 , reg_d , reg_y, LSR #8
958 ADD rscratch , rscratch2 , rscratch, LSL #16
959 MOV rscratch, rscratch, LSR #16
962 ADD rscratch, rpc, reg_p_bank, LSL #16
963 SUB rscratch, rscratch, regpcbase
967 ADD rscratch, rpc, reg_p_bank, LSL #16
968 SUB rscratch, rscratch, regpcbase
973 LDRSB rscratch , [rpc],#1
974 ADD rscratch , rscratch , rpc
975 SUB rscratch , rscratch, regpcbase
976 UXTH rscratch,rscratch
978 .macro asmRelativeLong
980 LDRB rscratch2 , [rpc, #1]
981 LDRB rscratch , [rpc], #2
982 ORR rscratch , rscratch, rscratch2, LSL #8
983 SUB rscratch2 , rpc, regpcbase
984 ADD rscratch , rscratch2, rscratch
985 BIC rscratch,rscratch,#0x00FF0000
989 .macro StackasmRelative
991 LDRB rscratch , [rpc], #1
992 ADD rscratch , rscratch, reg_s
993 BIC rscratch,rscratch,#0x00FF0000
995 .macro StackasmRelativeIndirectIndexed0
997 LDRB rscratch , [rpc], #1
998 ADD rscratch , rscratch, reg_s
999 BIC rscratch,rscratch,#0x00FF0000
1001 ORR rscratch , rscratch, reg_d_bank, LSL #16
1002 ADD rscratch , rscratch, reg_y, LSR #16
1003 BIC rscratch, rscratch, #0xFF000000
1005 .macro StackasmRelativeIndirectIndexed1
1007 LDRB rscratch , [rpc], #1
1008 ADD rscratch , rscratch, reg_s
1009 BIC rscratch,rscratch,#0x00FF0000
1011 ORR rscratch , rscratch, reg_d_bank, LSL #16
1012 ADD rscratch , rscratch, reg_y, LSR #24
1013 BIC rscratch, rscratch, #0xFF000000
1017 /****************************************/
1029 SUB rscratch,reg_s,#1
1034 MOV rscratch2,rscratch
1035 SUB rscratch,reg_s,#1
1036 S9xSetWordLow rscratch2
1040 SUB rscratch,reg_s,#1
1048 ADD rscratch,reg_s,#1
1051 MOV \reg,rscratch,LSL #24
1054 ADD rscratch,reg_s,#1
1059 ADD rscratch,reg_s,#1
1065 ADD rscratch,reg_s,#1
1070 ADD rscratch,reg_s,#1
1073 MOV \reg,rscratch,LSL #16
1077 ADD rscratch,reg_s,#1
1086 ADD rscratch,reg_s,#1
1089 MOVS \reg,rscratch,LSL #24
1092 ADD rscratch,reg_s,#1
1095 MOVS rscratch,rscratch,LSL #24
1097 .macro PullBLowS reg
1098 ADD rscratch,reg_s,#1
1104 ADD rscratch,reg_s,#1
1107 MOVS rscratch,rscratch
1110 ADD rscratch,reg_s,#1
1113 MOVS \reg,rscratch, LSL #16
1116 ADD rscratch,reg_s,#1
1119 MOVS rscratch,rscratch, LSL #16
1121 .macro PullWLowS reg
1122 ADD rscratch,reg_s,#1
1128 ADD rscratch,reg_s,#1
1131 MOVS rscratch,rscratch
1134 @ START OF PROGRAM CODE
1140 .globl asmS9xGetByte
1141 .globl asmS9xGetWord
1142 .globl asmS9xSetByte
1143 .globl asmS9xSetWord
1145 @ uint8 aaS9xGetByte(uint32 address);
1147 @ in : R0 = 0x00hhmmll
1148 @ out : R0 = 0x000000ll
1149 @ DESTROYED : R1,R2,R3
1150 @ UPDATE : reg_cycles
1152 MOV R1,R0,LSR #MEMMAP_SHIFT
1153 @ MEMMAP_SHIFT is 12, Address is 0xFFFFFFFF at max, so
1154 @ R1 is maxed by 0x000FFFFF, MEMMAP_MASK is 0x1000-1=0xFFF
1155 @ so AND MEMMAP_MASK is BIC 0xFF000
1157 @ R2 <= Map[block] (GetAddress)
1158 LDR R2,[reg_cpu_var,#Map_ofs]
1159 LDR R2,[R2,R1,LSL #2]
1161 BLO GBSpecial @ special
1162 @ Direct ROM/RAM acess
1163 @ R2 <= GetAddress + Address & 0xFFFF
1164 @ R3 <= MemorySpeed[block]
1165 LDR R3,[reg_cpu_var,#MemorySpeed_ofs]
1168 ADD R2,R2,R0,LSR #16
1170 ADD reg_cycles,reg_cycles,R3
1171 @ R3 = BlockIsRAM[block]
1172 LDR R3,[reg_cpu_var,#BlockIsRAM_ofs]
1173 @ Get value to return
1177 @ if BlockIsRAM => update for CPUShutdown
1178 LDRNE R1,[reg_cpu_var,#PCAtOpcodeStart_ofs]
1179 STRNE R1,[reg_cpu_var,#WaitAddress_ofs]
1181 LDMFD R13!,{PC} @ Return
1184 LDR PC,[PC,R2,LSL #2]
1185 MOV R0,R0 @ nop, for align
1203 LDRB R1,[reg_cpu_var,#InDMA_ofs]
1205 ADDEQ reg_cycles,reg_cycles,#ONE_CYCLE @ No -> update Cycles
1206 MOV R0,R0,LSL #16 @ S9xGetPPU(Address&0xFFFF);
1207 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1212 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1213 LDMFD R13!,{PC} @ Return
1215 ADD reg_cycles,reg_cycles,#ONE_CYCLE @ update Cycles
1216 MOV R0,R0,LSL #16 @ S9xGetCPU(Address&0xFFFF);
1217 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1222 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1223 LDMFD R13!,{PC} @ Return
1225 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1226 MOV R0,R0,LSL #16 @ S9xGetCPU(Address&0xFFFF);
1227 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1232 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1233 LDMFD R13!,{PC} @ Return
1235 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1236 LDRH R2,[reg_cpu_var,#SRAMMask]
1237 LDR R1,[reg_cpu_var,#SRAM]
1238 AND R0,R2,R0 @ Address&SRAMMask
1239 LDRB R0,[R1,R0] @ *Memory.SRAM + Address&SRAMMask
1243 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1247 MOV R1,R1,LSR #17 @ Address&0x7FFF
1248 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1250 LDRH R2,[reg_cpu_var,#SRAMMask]
1251 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1252 LDR R1,[reg_cpu_var,#SRAM]
1253 AND R0,R2,R0 @ Address&SRAMMask
1254 LDRB R0,[R1,R0] @ *Memory.SRAM + Address&SRAMMask
1255 LDMFD R13!,{PC} @ return
1260 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1264 /*ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1268 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1269 MOV R0,R0,LSL #16 @ S9xGetC4(Address&0xFFFF);
1270 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1275 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1276 LDMFD R13!,{PC} @ Return
1280 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1281 MOV R0,R0,LSR #17 @ Address&0x7FFF
1282 LDR R1,[reg_cpu_var,#BWRAM]
1283 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
1284 LDRB R0,[R0,R1] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
1288 @ uint16 aaS9xGetWord(uint32 address);
1290 @ in : R0 = 0x00hhmmll
1291 @ out : R0 = 0x000000ll
1292 @ DESTROYED : R1,R2,R3
1293 @ UPDATE : reg_cycles
1318 MOV R1,R0,LSR #MEMMAP_SHIFT
1319 @ MEMMAP_SHIFT is 12, Address is 0xFFFFFFFF at max, so
1320 @ R1 is maxed by 0x000FFFFF, MEMMAP_MASK is 0x1000-1=0xFFF
1321 @ so AND MEMMAP_MASK is BIC 0xFF000
1323 @ R2 <= Map[block] (GetAddress)
1324 LDR R2,[reg_cpu_var,#Map_ofs]
1325 LDR R2,[R2,R1,LSL #2]
1327 BLO GWSpecial @ special
1328 @ Direct ROM/RAM acess
1332 @ R2 <= GetAddress + Address & 0xFFFF
1333 @ R3 <= MemorySpeed[block]
1334 LDR R3,[reg_cpu_var,#MemorySpeed_ofs]
1339 ADD reg_cycles,reg_cycles,R3, LSL #1
1340 @ R3 = BlockIsRAM[block]
1341 LDR R3,[reg_cpu_var,#BlockIsRAM_ofs]
1342 @ Get value to return
1346 @ if BlockIsRAM => update for CPUShutdown
1347 LDRNE R1,[reg_cpu_var,#PCAtOpcodeStart_ofs]
1348 STRNE R1,[reg_cpu_var,#WaitAddress_ofs]
1350 LDMFD R13!,{PC} @ Return
1355 LDRB R3,[R2,R3,LSR #16] @ GetAddress+ (Address+1)&0xFFFF
1356 LDRB R0,[R2,R0,LSR #16] @ GetAddress+ Address&0xFFFF
1359 @ if BlockIsRAM => update for CPUShutdown
1360 LDR R3,[reg_cpu_var,#BlockIsRAM_ofs]
1361 LDR R2,[reg_cpu_var,#MemorySpeed_ofs]
1362 LDRB R3,[R3,R1] @ R3 = BlockIsRAM[block]
1363 LDRB R2,[R2,R1] @ R2 <= MemorySpeed[block]
1364 MOVS R3,R3 @ IsRAM ? CPUShutdown stuff
1365 LDRNE R1,[reg_cpu_var,#PCAtOpcodeStart_ofs]
1366 STRNE R1,[reg_cpu_var,#WaitAddress_ofs]
1367 ADD reg_cycles,reg_cycles,R2, LSL #1 @ Update CPU.Cycles
1368 LDMFD R13!,{PC} @ Return
1370 LDR PC,[PC,R2,LSL #2]
1371 MOV R0,R0 @ nop, for align
1387 /* MAP_PPU, MAP_CPU, MAP_DSP, MAP_LOROM_SRAM, MAP_HIROM_SRAM,
1388 MAP_NONE, MAP_DEBUG, MAP_C4, MAP_BWRAM, MAP_BWRAM_BITMAP,
1389 MAP_BWRAM_BITMAP2, MAP_SA1RAM, MAP_LAST*/
1393 LDRB R1,[reg_cpu_var,#InDMA_ofs]
1395 ADDEQ reg_cycles,reg_cycles,#(ONE_CYCLE*2) @ No -> update Cycles
1396 MOV R0,R0,LSL #16 @ S9xGetPPU(Address&0xFFFF);
1397 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1404 @ BIC R0,R0,#0x10000
1408 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1409 LDMFD R13!,{PC} @ Return
1411 ADD reg_cycles,reg_cycles,#(ONE_CYCLE*2) @ update Cycles
1412 MOV R0,R0,LSL #16 @ S9xGetCPU(Address&0xFFFF);
1413 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1420 @ BIC R0,R0,#0x10000
1424 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1425 LDMFD R13!,{PC} @ Return
1427 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1428 MOV R0,R0,LSL #16 @ S9xGetCPU(Address&0xFFFF);
1429 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1436 @ BIC R0,R0,#0x10000
1440 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1441 LDMFD R13!,{PC} @ Return
1443 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1447 LDRH R2,[reg_cpu_var,#SRAMMask]
1448 LDR R1,[reg_cpu_var,#SRAM]
1449 AND R3,R2,R0 @ Address&SRAMMask
1450 LDRH R0,[R3,R1] @ *Memory.SRAM + Address&SRAMMask
1451 LDMFD R13!,{PC} @ return
1453 LDRH R2,[reg_cpu_var,#SRAMMask]
1454 LDR R1,[reg_cpu_var,#SRAM]
1455 AND R3,R2,R0 @ Address&SRAMMask
1457 AND R2,R0,R2 @ Address&SRAMMask
1458 LDRB R3,[R1,R3] @ *Memory.SRAM + Address&SRAMMask
1459 LDRB R2,[R1,R2] @ *Memory.SRAM + Address&SRAMMask
1461 LDMFD R13!,{PC} @ return
1464 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1471 MOV R1,R1,LSR #17 @ Address&0x7FFF
1472 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1474 LDRH R2,[reg_cpu_var,#SRAMMask]
1475 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1476 LDR R1,[reg_cpu_var,#SRAM]
1477 AND R0,R2,R0 @ Address&SRAMMask
1478 LDRH R0,[R1,R0] @ *Memory.SRAM + Address&SRAMMask
1479 LDMFD R13!,{PC} @ return
1484 MOV R3,R3,LSR #17 @ Address&0x7FFF
1485 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1488 SUB R2,R2,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1491 MOV R3,R3,LSR #17 @ (Address+1)&0x7FFF
1492 MOV R0,R0,LSR #3 @ ((Address+1)&0xF0000 >> 3)
1494 LDRH R3,[reg_cpu_var,#SRAMMask] @ reload mask
1495 SUB R0,R0,#0x6000 @ (((Address+1) & 0x7fff) - 0x6000 + (((Address+1) & 0xf0000) >> 3))
1496 AND R2,R3,R2 @ Address...&SRAMMask
1497 AND R0,R3,R0 @ (Address+1...)&SRAMMask
1499 LDR R3,[reg_cpu_var,#SRAM]
1500 LDRB R0,[R0,R3] @ *Memory.SRAM + (Address...)&SRAMMask
1501 LDRB R2,[R2,R3] @ *Memory.SRAM + (Address+1...)&SRAMMask
1504 LDMFD R13!,{PC} @ return
1509 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1514 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1518 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1519 MOV R0,R0,LSL #16 @ S9xGetC4(Address&0xFFFF);
1520 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1527 @ BIC R0,R0,#0x10000
1531 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1532 LDMFD R13!,{PC} @ Return
1537 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1538 MOV R0,R0,LSR #17 @ Address&0x7FFF
1539 LDR R1,[reg_cpu_var,#BWRAM]
1540 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
1541 LDRH R0,[R1,R0] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
1542 LDMFD R13!,{PC} @ return
1545 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1547 MOV R0,R0,LSR #17 @ Address&0x7FFF
1548 MOV R3,R3,LSR #17 @ (Address+1)&0x7FFF
1549 LDR R1,[reg_cpu_var,#BWRAM]
1550 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
1551 SUB R3,R3,#0x6000 @ (((Address+1) & 0x7fff) - 0x6000)
1552 LDRB R0,[R1,R0] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
1553 LDRB R3,[R1,R3] @ *Memory.BWRAM + (((Address+1) & 0x7fff) - 0x6000)
1555 LDMFD R13!,{PC} @ return
1560 @ void aaS9xSetByte(uint32 address,uint8 val);
1562 @ in : R0=0x00hhmmll R1=0x000000ll
1563 @ DESTROYED : R0,R1,R2,R3
1564 @ UPDATE : reg_cycles
1567 STR R2,[reg_cpu_var,#WaitAddress_ofs]
1571 MOV R3,R0,LSR #MEMMAP_SHIFT
1572 @ MEMMAP_SHIFT is 12, Address is 0xFFFFFFFF at max, so
1573 @ R0 is maxed by 0x000FFFFF, MEMMAP_MASK is 0x1000-1=0xFFF
1574 @ so AND MEMMAP_MASK is BIC 0xFF000
1576 @ R2 <= Map[block] (SetAddress)
1577 LDR R2,[reg_cpu_var,#WriteMap_ofs]
1578 LDR R2,[R2,R3,LSL #2]
1580 BLO SBSpecial @ special
1581 @ Direct ROM/RAM acess
1583 @ R2 <= SetAddress + Address & 0xFFFF
1585 ADD R2,R2,R0,LSR #16
1586 LDR R0,[reg_cpu_var,#MemorySpeed_ofs]
1589 @ R0 <= MemorySpeed[block]
1592 ADD reg_cycles,reg_cycles,R0
1594 @ only SA1 here : TODO
1598 LDR PC,[PC,R2,LSL #2]
1599 MOV R0,R0 @ nop, for align
1617 LDRB R2,[reg_cpu_var,#InDMA_ofs]
1619 ADDEQ reg_cycles,reg_cycles,#ONE_CYCLE @ No -> update Cycles
1621 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1629 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1630 LDMFD R13!,{PC} @ Return
1632 ADD reg_cycles,reg_cycles,#ONE_CYCLE @ update Cycles
1634 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1635 MOV R0,R0,LSR #16 @ Address&0xFFFF
1642 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1643 LDMFD R13!,{PC} @ Return
1645 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1647 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1648 MOV R0,R0,LSR #16 @ Address&0xFFFF
1655 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1656 LDMFD R13!,{PC} @ Return
1658 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1659 LDRH R2,[reg_cpu_var,#SRAMMask]
1661 LDMEQFD R13!,{PC} @ return if SRAMMask=0
1662 LDR R3,[reg_cpu_var,#SRAM]
1663 AND R0,R2,R0 @ Address&SRAMMask
1664 STRB R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1667 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1668 LDMFD R13!,{PC} @ return
1671 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1675 MOV R3,R3,LSR #17 @ Address&0x7FFF
1676 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1679 LDRH R2,[reg_cpu_var,#SRAMMask]
1681 LDMEQFD R13!,{PC} @ return if SRAMMask=0
1683 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1684 LDR R3,[reg_cpu_var,#SRAM]
1685 AND R0,R2,R0 @ Address&SRAMMask
1686 STRB R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1689 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1690 LDMFD R13!,{PC} @ return
1695 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1698 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1700 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1701 MOV R0,R0,LSR #16 @ Address&0xFFFF
1708 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1709 LDMFD R13!,{PC} @ Return
1712 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1713 MOV R0,R0,LSR #17 @ Address&0x7FFF
1714 LDR R2,[reg_cpu_var,#BWRAM]
1715 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
1716 STRB R1,[R0,R2] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
1719 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1725 @ void aaS9xSetWord(uint32 address,uint16 val);
1727 @ in : R0 = 0x00hhmmll R1=0x0000hhll
1728 @ DESTROYED : R0,R1,R2,R3
1729 @ UPDATE : reg_cycles
1753 STR R2,[reg_cpu_var,#WaitAddress_ofs]
1756 MOV R3,R0,LSR #MEMMAP_SHIFT
1757 @ MEMMAP_SHIFT is 12, Address is 0xFFFFFFFF at max, so
1758 @ R1 is maxed by 0x000FFFFF, MEMMAP_MASK is 0x1000-1=0xFFF
1759 @ so AND MEMMAP_MASK is BIC 0xFF000
1761 @ R2 <= Map[block] (SetAddress)
1762 LDR R2,[reg_cpu_var,#WriteMap_ofs]
1763 LDR R2,[R2,R3,LSL #2]
1765 BLO SWSpecial @ special
1766 @ Direct ROM/RAM acess
1769 @ check if address is 16bits aligned or not
1774 ADD R2,R2,R0,LSR #16 @ address & 0xFFFF + SetAddress
1775 LDR R0,[reg_cpu_var,#MemorySpeed_ofs]
1778 @ R1 <= MemorySpeed[block]
1781 ADD reg_cycles,reg_cycles,R0, LSL #1
1783 @ only SA1 here : TODO
1788 @ R1 = (Address&0xFFFF)<<16
1790 @ First write @address
1791 STRB R1,[R2,R0,LSR #16]
1794 @ Second write @address+1
1795 STRB R1,[R2,R0,LSR #16]
1796 @ R1 <= MemorySpeed[block]
1797 LDR R0,[reg_cpu_var,#MemorySpeed_ofs]
1800 ADD reg_cycles,reg_cycles,R0,LSL #1
1802 @ only SA1 here : TODO
1806 LDR PC,[PC,R2,LSL #2]
1807 MOV R0,R0 @ nop, for align
1825 LDRB R2,[reg_cpu_var,#InDMA_ofs]
1827 ADDEQ reg_cycles,reg_cycles,#(ONE_CYCLE*2) @ No -> update Cycles
1829 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1843 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1844 LDMFD R13!,{PC} @ Return
1846 ADD reg_cycles,reg_cycles,#(ONE_CYCLE*2) @ update Cycles
1848 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1849 MOV R0,R0,LSR #16 @ Address&0xFFFF
1858 UXTB R0,R0,ROR #8 @ ((R0 >> 8) & 0xFF)
1862 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1863 LDMFD R13!,{PC} @ Return
1865 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1867 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1868 MOV R0,R0,LSR #16 @ Address&0xFFFF
1881 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1882 LDMFD R13!,{PC} @ Return
1884 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1885 LDRH R2,[reg_cpu_var,#SRAMMask]
1887 LDMEQFD R13!,{PC} @ return if SRAMMask=0
1889 AND R3,R2,R0 @ Address&SRAMMask
1893 LDR R0,[reg_cpu_var,#SRAM]
1894 STRH R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1896 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1897 LDMFD R13!,{PC} @ return
1901 AND R2,R2,R0 @ (Address+1)&SRAMMask
1902 LDR R0,[reg_cpu_var,#SRAM]
1903 STRB R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1905 STRB R1,[R0,R2] @ *Memory.SRAM + (Address+1)&SRAMMask
1907 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1908 LDMFD R13!,{PC} @ return
1911 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1913 LDRH R2,[reg_cpu_var,#SRAMMask]
1915 LDMEQFD R13!,{PC} @ return if SRAMMask=0
1922 MOV R3,R3,LSR #17 @ Address&0x7FFF
1923 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1925 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1926 LDRH R2,[reg_cpu_var,#SRAMMask]
1927 LDR R3,[reg_cpu_var,#SRAM]
1928 AND R0,R2,R0 @ Address&SRAMMask
1929 STRH R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1931 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1932 LDMFD R13!,{PC} @ return
1936 MOV R3,R3,LSR #17 @ Address&0x7FFF
1937 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1939 SUB R2,R2,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1944 MOV R3,R3,LSR #17 @ (Address+1)&0x7FFF
1945 MOV R0,R0,LSR #3 @ ((Address+1)&0xF0000 >> 3)
1947 LDRH R3,[reg_cpu_var,#SRAMMask] @ reload mask
1948 SUB R0,R0,#0x6000 @ (((Address+1) & 0x7fff) - 0x6000 + (((Address+1) & 0xf0000) >> 3))
1949 AND R2,R3,R2 @ Address...&SRAMMask
1950 AND R0,R3,R0 @ (Address+1...)&SRAMMask
1952 LDR R3,[reg_cpu_var,#SRAM]
1953 STRB R1,[R2,R3] @ *Memory.SRAM + (Address...)&SRAMMask
1955 STRB R1,[R0,R3] @ *Memory.SRAM + (Address+1...)&SRAMMask
1958 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1959 LDMFD R13!,{PC} @ return
1964 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1965 LDMFD R13!,{PC} @ return
1967 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1969 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1970 MOV R0,R0,LSR #16 @ Address&0xFFFF
1983 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1984 LDMFD R13!,{PC} @ Return
1986 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1991 LDR R2,[reg_cpu_var,#BWRAM]
1992 MOV R0,R0,LSR #17 @ Address&0x7FFF
1993 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
1995 STRH R1,[R0,R2] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
1996 STRB R3,[reg_cpu_var,#SRAMModified_ofs]
1997 LDMFD R13!,{PC} @ return
2001 MOV R0,R0,LSR #17 @ Address&0x7FFF
2002 MOV R3,R3,LSR #17 @ (Address+1)&0x7FFF
2003 LDR R2,[reg_cpu_var,#BWRAM]
2004 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
2005 SUB R3,R3,#0x6000 @ (((Address+1) & 0x7fff) - 0x6000)
2006 STRB R1,[R2,R0] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
2008 STRB R1,[R2,R3] @ *Memory.BWRAM + (((Address+1) & 0x7fff) - 0x6000)
2010 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
2011 LDMFD R13!,{PC} @ return
2017 /*****************************************************************
2019 *****************************************************************/
2022 @ CC : ARM Carry Clear
2023 BICCC rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2024 @ CS : ARM Carry Set
2025 ORRCS rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2028 @ NE : ARM Zero Clear
2029 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2031 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2034 @ NE : ARM Zero Clear
2035 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2037 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2038 @ PL : ARM Neg Clear
2039 BICPL rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2041 ORRMI rstatus, rstatus, #MASK_NEG @ 1 : OR mask 00000100000 : set N to one
2044 /*****************************************************************
2046 *****************************************************************/
2052 TST rstatus, #MASK_DECIMAL
2057 STMFD R13!,{rscratch}
2058 MOV rscratch4,#0x0F000000
2059 @ rscratch2=xxW1xxxxxxxxxxxx
2060 AND rscratch2, rscratch, rscratch4
2061 @ rscratch=xxW2xxxxxxxxxxxx
2062 AND rscratch, rscratch4, rscratch, LSR #4
2063 @ rscratch3=xxA2xxxxxxxxxxxx
2064 AND rscratch3, rscratch4, reg_a, LSR #4
2065 @ rscratch4=xxA1xxxxxxxxxxxx
2066 AND rscratch4,reg_a,rscratch4
2068 TST rstatus, #MASK_CARRY
2069 ADDNE rscratch2, rscratch2, #0x01000000
2070 ADD rscratch2,rscratch2,rscratch4
2072 CMP rscratch2, #0x09000000
2074 SUBGT rscratch2, rscratch2, #0x0A000000
2076 ADDGT rscratch3, rscratch3, #0x01000000
2078 ADD rscratch3, rscratch3, rscratch
2080 CMP rscratch3, #0x09000000
2082 SUBGT rscratch3, rscratch3, #0x0A000000
2084 ORRGT rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2086 BICLE rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2087 @ gather rscratch3 and rscratch2 into ans8
2088 @ rscratch3 : 0R2000000
2089 @ rscratch2 : 0R1000000
2091 ORR rscratch2, rscratch2, rscratch3, LSL #4
2092 LDMFD R13!,{rscratch}
2094 AND rscratch,rscratch,#0x80000000
2095 @ (register.AL ^ Work8)
2096 EORS rscratch3, reg_a, rscratch
2097 BICNE rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2100 EORS rscratch3, rscratch2, rscratch
2102 TSTNE rscratch3,#0x80000000
2103 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2104 ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2106 MOVS reg_a, rscratch2
2111 MOVS rscratch2, rstatus, LSR #MASK_SHIFTER_CARRY
2112 SUBCS rscratch, rscratch, #0x100
2113 ADCS reg_a, reg_a, rscratch, ROR #8
2115 ORRVS rstatus, rstatus, #MASK_OVERFLOW
2116 BICVC rstatus, rstatus, #MASK_OVERFLOW
2120 ANDS reg_a, reg_a, #0xFF000000
2127 TST rstatus, #MASK_DECIMAL
2131 @ rscratch = W3W2W1W0........
2132 LDR rscratch4, = 0x0F0F0000
2133 @ rscratch2 = xxW2xxW0xxxxxx
2134 @ rscratch3 = xxW3xxW1xxxxxx
2135 AND rscratch2, rscratch4, rscratch
2136 AND rscratch3, rscratch4, rscratch, LSR #4
2137 @ rscratch2 = xxW3xxW1xxW2xxW0
2138 ORR rscratch2, rscratch3, rscratch2, LSR #16
2139 @ rscratch3 = xxA2xxA0xxxxxx
2140 @ rscratch4 = xxA3xxA1xxxxxx
2141 @ rscratch2 = xxA3xxA1xxA2xxA0
2142 AND rscratch3, rscratch4, reg_a
2143 AND rscratch4, rscratch4, reg_a, LSR #4
2144 ORR rscratch3, rscratch4, rscratch3, LSR #16
2145 ADD rscratch2, rscratch3, rscratch2
2146 LDR rscratch4, = 0x0F0F0000
2148 TST rstatus, #MASK_CARRY
2149 ADDNE rscratch2, rscratch2, #0x1
2150 @ rscratch2 = A + W + C
2152 AND rscratch3, rscratch2, #0x0000001F
2153 CMP rscratch3, #0x00000009
2154 ADDHI rscratch2, rscratch2, #0x00010000
2155 SUBHI rscratch2, rscratch2, #0x0000000A
2157 AND rscratch3, rscratch2, #0x001F0000
2158 CMP rscratch3, #0x00090000
2159 ADDHI rscratch2, rscratch2, #0x00000100
2160 SUBHI rscratch2, rscratch2, #0x000A0000
2162 AND rscratch3, rscratch2, #0x00001F00
2163 CMP rscratch3, #0x00000900
2164 SUBHI rscratch2, rscratch2, #0x00000A00
2165 ADDHI rscratch2, rscratch2, #0x01000000
2167 AND rscratch3, rscratch2, #0x1F000000
2168 CMP rscratch3, #0x09000000
2169 SUBHI rscratch2, rscratch2, #0x0A000000
2171 ORRHI rstatus, rstatus, #MASK_CARRY
2173 BICLS rstatus, rstatus, #MASK_CARRY
2174 @ rscratch2 = xxR3xxR1xxR2xxR0
2176 @ rscratch3 = xxR3xxR1xxxxxxxx
2177 AND rscratch3, rscratch4, rscratch2
2178 @ rscratch2 = xxR2xxR0xxxxxxxx
2179 AND rscratch2, rscratch4, rscratch2,LSL #16
2180 @ rscratch2 = R3R2R1R0xxxxxxxx
2181 ORR rscratch2, rscratch2,rscratch3,LSL #4
2183 AND rscratch,rscratch,#0x80000000
2184 @ (register.AL ^ Work8)
2185 EORS rscratch3, reg_a, rscratch
2186 BICNE rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2189 EORS rscratch3, rscratch2, rscratch
2190 TSTNE rscratch3,#0x80000000
2191 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2192 ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2194 MOVS reg_a, rscratch2
2199 MOVS rscratch2, rstatus, LSR #MASK_SHIFTER_CARRY
2200 SUBCS rscratch, rscratch, #0x10000
2201 ADCS reg_a, reg_a,rscratch, ROR #16
2203 ORRVS rstatus, rstatus, #MASK_OVERFLOW
2204 BICVC rstatus, rstatus, #MASK_OVERFLOW
2205 MOV reg_a, reg_a, LSR #16
2209 MOVS reg_a, reg_a, LSL #16
2218 ANDS reg_a, reg_a, rscratch
2223 ANDS reg_a, reg_a, rscratch
2228 MOVS reg_a, reg_a, LSL #1
2235 MOVS reg_a, reg_a, LSL #1
2241 S9xGetWordRegNS rscratch2 @ do not destroy Opadress in rscratch
2242 MOVS rscratch2, rscratch2, LSL #1
2245 S9xSetWord rscratch2
2249 S9xGetByteRegNS rscratch2 @ do not destroy Opadress in rscratch
2250 MOVS rscratch2, rscratch2, LSL #1
2253 S9xSetByte rscratch2
2258 MOVS rscratch2, rscratch, LSL #1
2259 @ Trick in ASM : shift one more bit : ARM C = Snes N
2261 @ If Carry Set, then Set Neg in SNES
2262 BICCC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set C to zero
2263 ORRCS rstatus, rstatus, #MASK_NEG @ 1 : OR mask 00000100000 : set C to one
2264 @ If Neg Set, then Set Overflow in SNES
2265 BICPL rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set N to zero
2266 ORRMI rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set N to one
2268 @ Now do a real AND with A register
2269 @ Set Zero Flag, bit test
2270 ANDS rscratch2, reg_a, rscratch
2271 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2272 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2277 MOVS rscratch2, rscratch, LSL #1
2278 @ Trick in ASM : shift one more bit : ARM C = Snes N
2280 @ If Carry Set, then Set Neg in SNES
2281 BICCC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2282 ORRCS rstatus, rstatus, #MASK_NEG @ 1 : OR mask 00000100000 : set N to one
2283 @ If Neg Set, then Set Overflow in SNES
2284 BICPL rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2285 ORRMI rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2286 @ Now do a real AND with A register
2287 @ Set Zero Flag, bit test
2288 ANDS rscratch2, reg_a, rscratch
2289 @ Bit set ->Z=0->xxxNE Clear flag
2290 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2291 @ Bit clear->Z=1->xxxEQ Set flag
2292 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2296 SUBS rscratch2,reg_a,rscratch
2297 BICCC rstatus, rstatus, #MASK_CARRY
2298 ORRCS rstatus, rstatus, #MASK_CARRY
2304 SUBS rscratch2,reg_a,rscratch
2305 BICCC rstatus, rstatus, #MASK_CARRY
2306 ORRCS rstatus, rstatus, #MASK_CARRY
2312 SUBS rscratch2,reg_x,rscratch
2313 BICCC rstatus, rstatus, #MASK_CARRY
2314 ORRCS rstatus, rstatus, #MASK_CARRY
2319 SUBS rscratch2,reg_x,rscratch
2320 BICCC rstatus, rstatus, #MASK_CARRY
2321 ORRCS rstatus, rstatus, #MASK_CARRY
2326 SUBS rscratch2,reg_y,rscratch
2327 BICCC rstatus, rstatus, #MASK_CARRY
2328 ORRCS rstatus, rstatus, #MASK_CARRY
2333 SUBS rscratch2,reg_y,rscratch
2334 BICCC rstatus, rstatus, #MASK_CARRY
2335 ORRCS rstatus, rstatus, #MASK_CARRY
2340 SUBS reg_a, reg_a, #0x01000000
2341 STR rscratch,[reg_cpu_var,#WaitAddress_ofs]
2347 SUBS reg_a, reg_a, #0x00010000
2348 STR rscratch,[reg_cpu_var,#WaitAddress_ofs]
2353 S9xGetWordRegNS rscratch2 @ do not destroy Opadress in rscratch
2355 SUBS rscratch2, rscratch2, #0x00010000
2356 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2358 S9xSetWord rscratch2
2362 S9xGetByteRegNS rscratch2 @ do not destroy Opadress in rscratch
2364 SUBS rscratch2, rscratch2, #0x01000000
2365 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2367 S9xSetByte rscratch2
2372 EORS reg_a, reg_a, rscratch
2377 EORS reg_a, reg_a, rscratch
2382 ADDS reg_a, reg_a, #0x01000000
2383 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2389 ADDS reg_a, reg_a, #0x00010000
2390 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2395 S9xGetWordRegNS rscratch2
2397 ADDS rscratch2, rscratch2, #0x00010000
2398 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2400 S9xSetWord rscratch2
2404 S9xGetByteRegNS rscratch2
2406 ADDS rscratch2, rscratch2, #0x01000000
2407 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2409 S9xSetByte rscratch2
2413 S9xGetWordRegStatus reg_a
2417 S9xGetByteRegStatus reg_a
2421 S9xGetWordRegStatus reg_x
2425 S9xGetByteRegStatus reg_x
2429 S9xGetWordRegStatus reg_y
2433 S9xGetByteRegStatus reg_y
2437 BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2438 MOVS reg_a, reg_a, LSR #17 @ hhhhhhhh llllllll 00000000 00000000 -> 00000000 00000000 0hhhhhhh hlllllll
2440 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2441 MOV reg_a, reg_a, LSL #16 @ -> 0lllllll 00000000 00000000 00000000
2442 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2443 @ Note : the two MOV are included between instruction, to optimize
2449 BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2450 MOVS reg_a, reg_a, LSR #25 @ llllllll 00000000 00000000 00000000 -> 00000000 00000000 00000000 0lllllll
2452 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2453 MOV reg_a, reg_a, LSL #24 @ -> 00000000 00000000 00000000 0lllllll
2454 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2455 @ Note : the two MOV are included between instruction, to optimize
2461 S9xGetWordRegNS rscratch2
2462 @ N set to zero by >> 1 LSR
2463 BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2464 MOVS rscratch2, rscratch2, LSR #17 @ llllllll 00000000 00000000 00000000 -> 00000000 00000000 00000000 0lllllll
2466 BICCC rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2467 ORRCS rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2469 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2470 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2471 S9xSetWordLow rscratch2
2475 S9xGetByteRegNS rscratch2
2476 @ N set to zero by >> 1 LSR
2477 BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2478 MOVS rscratch2, rscratch2, LSR #25 @ llllllll 00000000 00000000 00000000 -> 00000000 00000000 00000000 0lllllll
2480 BICCC rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2481 ORRCS rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2483 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2484 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2485 S9xSetByteLow rscratch2
2490 ORRS reg_a, reg_a, rscratch
2495 ORRS reg_a, reg_a, rscratch
2499 TST rstatus, #MASK_CARRY
2500 ORRNE reg_a, reg_a, #0x00008000
2501 MOVS reg_a, reg_a, LSL #1
2507 TST rstatus, #MASK_CARRY
2508 ORRNE reg_a, reg_a, #0x00800000
2509 MOVS reg_a, reg_a, LSL #1
2515 S9xGetWordRegNS rscratch2
2516 TST rstatus, #MASK_CARRY
2517 ORRNE rscratch2, rscratch2, #0x00008000
2518 MOVS rscratch2, rscratch2, LSL #1
2521 S9xSetWord rscratch2
2525 S9xGetByteRegNS rscratch2
2526 TST rstatus, #MASK_CARRY
2527 ORRNE rscratch2, rscratch2, #0x00800000
2528 MOVS rscratch2, rscratch2, LSL #1
2531 S9xSetByte rscratch2
2535 MOV reg_a,reg_a, LSR #16
2536 TST rstatus, #MASK_CARRY
2537 ORRNE reg_a, reg_a, #0x00010000
2538 ORRNE rstatus,rstatus,#MASK_NEG
2539 BICEQ rstatus,rstatus,#MASK_NEG
2540 MOVS reg_a,reg_a,LSR #1
2543 MOV reg_a,reg_a, LSL #16
2547 MOV reg_a,reg_a, LSR #24
2548 TST rstatus, #MASK_CARRY
2549 ORRNE reg_a, reg_a, #0x00000100
2550 ORRNE rstatus,rstatus,#MASK_NEG
2551 BICEQ rstatus,rstatus,#MASK_NEG
2552 MOVS reg_a,reg_a,LSR #1
2555 MOV reg_a,reg_a, LSL #24
2559 S9xGetWordLowRegNS rscratch2
2560 TST rstatus, #MASK_CARRY
2561 ORRNE rscratch2, rscratch2, #0x00010000
2562 ORRNE rstatus,rstatus,#MASK_NEG
2563 BICEQ rstatus,rstatus,#MASK_NEG
2564 MOVS rscratch2,rscratch2,LSR #1
2567 S9xSetWordLow rscratch2
2572 S9xGetByteLowRegNS rscratch2
2573 TST rstatus, #MASK_CARRY
2574 ORRNE rscratch2, rscratch2, #0x00000100
2575 ORRNE rstatus,rstatus,#MASK_NEG
2576 BICEQ rstatus,rstatus,#MASK_NEG
2577 MOVS rscratch2,rscratch2,LSR #1
2580 S9xSetByteLow rscratch2
2585 TST rstatus, #MASK_DECIMAL
2590 STMFD R13!,{rscratch9}
2591 MOV rscratch9,#0x000F0000
2592 @ rscratch2 - result
2593 @ rscratch3 - scratch
2594 @ rscratch4 - scratch
2595 @ rscratch9 - pattern
2597 AND rscratch2, rscratch, #0x000F0000
2598 TST rstatus, #MASK_CARRY
2599 ADDEQ rscratch2, rscratch2, #0x00010000 @ W1=W1+!Carry
2600 AND rscratch4, reg_a, #0x000F0000
2601 SUB rscratch2, rscratch4,rscratch2 @ R1=A1-W1-!Carry
2602 CMP rscratch2, #0x00090000 @ if R1 > 9
2603 ADDHI rscratch2, rscratch2, #0x000A0000 @ then R1 += 10
2604 AND rscratch2, rscratch2, #0x000F0000
2606 AND rscratch3, rscratch9, rscratch, LSR #4
2607 ADDHI rscratch3, rscratch3, #0x00010000 @ then (W2++)
2609 AND rscratch4, rscratch9, reg_a, LSR #4
2610 SUB rscratch3, rscratch4, rscratch3 @ R2=A2-W2
2611 CMP rscratch3, #0x00090000 @ if R2 > 9
2612 ADDHI rscratch3, rscratch3, #0x000A0000 @ then R2 += 10
2613 AND rscratch3, rscratch3, #0x000F0000
2614 ORR rscratch2, rscratch2, rscratch3,LSL #4
2616 AND rscratch3, rscratch9, rscratch, LSR #8
2617 ADDHI rscratch3, rscratch3, #0x00010000 @ then (W3++)
2619 AND rscratch4, rscratch9, reg_a, LSR #8
2620 SUB rscratch3, rscratch4, rscratch3 @ R3=A3-W3
2621 CMP rscratch3, #0x00090000 @ if R3 > 9
2622 ADDHI rscratch3, rscratch3, #0x000A0000 @ then R3 += 10
2623 AND rscratch3, rscratch3, #0x000F0000
2624 ORR rscratch2, rscratch2, rscratch3,LSL #8
2626 AND rscratch3, rscratch9, rscratch, LSR #12
2627 ADDHI rscratch3, rscratch3, #0x00010000 @ then (W3++)
2629 AND rscratch4, rscratch9, reg_a, LSR #12
2630 SUB rscratch3, rscratch4, rscratch3 @ R4=A4-W4
2631 CMP rscratch3, #0x00090000 @ if R4 > 9
2632 ADDHI rscratch3, rscratch3, #0x000A0000 @ then R4 += 10
2633 BICHI rstatus, rstatus, #MASK_CARRY @ then ClearCarry
2634 ORRLS rstatus, rstatus, #MASK_CARRY @ else SetCarry
2636 AND rscratch3,rscratch3,#0x000F0000
2637 ORR rscratch2,rscratch2,rscratch3,LSL #12
2639 LDMFD R13!,{rscratch9}
2641 AND reg_a,reg_a,#0x80000000
2642 @ (register.A.W ^ Work8)
2643 EORS rscratch3, reg_a, rscratch
2644 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2646 @ (register.A.W ^ Ans8)
2647 EORS rscratch3, reg_a, rscratch2
2649 TSTNE rscratch3,#0x80000000
2650 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2651 ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2653 MOVS reg_a, rscratch2
2658 MOVS rscratch2,rstatus,LSR #MASK_SHIFTER_CARRY
2659 SBCS reg_a, reg_a, rscratch, LSL #16
2661 ORRVS rstatus, rstatus, #MASK_OVERFLOW
2662 BICVC rstatus, rstatus, #MASK_OVERFLOW
2663 MOV reg_a, reg_a, LSR #16
2666 MOVS reg_a, reg_a, LSL #16
2673 TST rstatus, #MASK_DECIMAL
2676 STMFD R13!,{rscratch}
2677 MOV rscratch4,#0x0F000000
2678 @ rscratch2=xxW1xxxxxxxxxxxx
2679 AND rscratch2, rscratch, rscratch4
2680 @ rscratch=xxW2xxxxxxxxxxxx
2681 AND rscratch, rscratch4, rscratch, LSR #4
2682 @ rscratch3=xxA2xxxxxxxxxxxx
2683 AND rscratch3, rscratch4, reg_a, LSR #4
2684 @ rscratch4=xxA1xxxxxxxxxxxx
2685 AND rscratch4,reg_a,rscratch4
2687 TST rstatus, #MASK_CARRY
2688 ADDEQ rscratch2, rscratch2, #0x01000000
2689 SUB rscratch2,rscratch4,rscratch2
2691 CMP rscratch2, #0x09000000
2693 ADDHI rscratch2, rscratch2, #0x0A000000
2695 ADDHI rscratch, rscratch, #0x01000000
2697 SUB rscratch3, rscratch3, rscratch
2699 CMP rscratch3, #0x09000000
2701 ADDHI rscratch3, rscratch3, #0x0A000000
2703 BICHI rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2705 ORRLS rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2706 @ gather rscratch3 and rscratch2 into ans8
2707 AND rscratch3,rscratch3,#0x0F000000
2708 AND rscratch2,rscratch2,#0x0F000000
2709 @ rscratch3 : 0R2000000
2710 @ rscratch2 : 0R1000000
2712 ORR rscratch2, rscratch2, rscratch3, LSL #4
2713 LDMFD R13!,{rscratch}
2715 AND reg_a,reg_a,#0x80000000
2716 @ (register.AL ^ Work8)
2717 EORS rscratch3, reg_a, rscratch
2718 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2720 @ (register.AL ^ Ans8)
2721 EORS rscratch3, reg_a, rscratch2
2723 TSTNE rscratch3,#0x80000000
2724 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2725 ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2727 MOVS reg_a, rscratch2
2732 MOVS rscratch2,rstatus,LSR #MASK_SHIFTER_CARRY
2733 SBCS reg_a, reg_a, rscratch, LSL #24
2735 ORRVS rstatus, rstatus, #MASK_OVERFLOW
2736 BICVC rstatus, rstatus, #MASK_OVERFLOW
2740 ANDS reg_a, reg_a, #0xFF000000
2770 S9xGetWordRegNS rscratch2
2771 TST reg_a, rscratch2
2772 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2773 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2774 ORR rscratch2, reg_a, rscratch2
2775 S9xSetWord rscratch2
2779 S9xGetByteRegNS rscratch2
2780 TST reg_a, rscratch2
2781 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2782 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2783 ORR rscratch2, reg_a, rscratch2
2784 S9xSetByte rscratch2
2788 S9xGetWordRegNS rscratch2
2789 TST reg_a, rscratch2
2790 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2791 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2792 MVN rscratch3, reg_a
2793 AND rscratch2, rscratch3, rscratch2
2794 S9xSetWord rscratch2
2798 S9xGetByteRegNS rscratch2
2799 TST reg_a, rscratch2
2800 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2801 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2802 MVN rscratch3, reg_a
2803 AND rscratch2, rscratch3, rscratch2
2804 S9xSetByte rscratch2
2807 /**************************************************************************/
2810 /**************************************************************************/
2812 .macro Op09M0 /*ORA*/
2813 LDRB rscratch2, [rpc,#1]
2814 LDRB rscratch, [rpc], #2
2815 ORR rscratch2,rscratch,rscratch2,LSL #8
2816 ORRS reg_a,reg_a,rscratch2,LSL #16
2820 .macro Op09M1 /*ORA*/
2821 LDRB rscratch, [rpc], #1
2822 ORRS reg_a,reg_a,rscratch,LSL #24
2826 /***********************************************************************/
2830 TST rstatus, #MASK_CARRY
2832 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2840 TST rstatus, #MASK_CARRY
2842 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2850 TST rstatus, #MASK_ZERO
2852 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2860 TST rstatus, #MASK_ZERO
2862 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2870 TST rstatus, #MASK_NEG
2872 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2880 TST rstatus, #MASK_NEG @ neg, z!=0, NE
2882 ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
2890 TST rstatus, #MASK_OVERFLOW @ neg, z!=0, NE
2892 ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
2900 TST rstatus, #MASK_OVERFLOW @ neg, z!=0, NE
2902 ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
2909 ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
2914 /*******************************************************************************************/
2915 /************************************************************/
2916 /* SetFlag Instructions ********************************************************************** */
2918 ORR rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2931 /****************************************************************************************/
2932 /* ClearFlag Instructions ******************************************************************** */
2934 BIC rstatus, rstatus, #MASK_CARRY
2947 BIC rstatus, rstatus, #MASK_OVERFLOW
2951 /******************************************************************************************/
2952 /* DEX/DEY *********************************************************************************** */
2954 .macro OpCAX1 /*DEX*/
2956 SUBS reg_x, reg_x, #0x01000000
2957 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2961 .macro OpCAX0 /*DEX*/
2963 SUBS reg_x, reg_x, #0x00010000
2964 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2968 .macro Op88X1 /*DEY*/
2970 SUBS reg_y, reg_y, #0x01000000
2971 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2975 .macro Op88X0 /*DEY*/
2977 SUBS reg_y, reg_y, #0x00010000
2978 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2983 /******************************************************************************************/
2984 /* INX/INY *********************************************************************************** */
2987 ADDS reg_x, reg_x, #0x01000000
2988 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2994 ADDS reg_x, reg_x, #0x00010000
2995 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
3001 ADDS reg_y, reg_y, #0x01000000
3002 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
3008 ADDS reg_y, reg_y, #0x00010000
3009 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
3014 /**********************************************************************************************/
3016 /* NOP *************************************************************************************** */
3021 /**************************************************************************/
3022 /* PUSH Instructions **************************************************** */
3044 AND rscratch2, reg_d_bank, #0xFF
3076 /**************************************************************************/
3077 /* PULL Instructions **************************************************** */
3089 BIC reg_d_bank,reg_d_bank, #0xFF
3091 ORR reg_d_bank,reg_d_bank,rscratch, LSR #24
3096 BIC reg_d,reg_d, #0xFF000000
3097 BIC reg_d,reg_d, #0x00FF0000
3099 ORR reg_d,rscratch,reg_d
3103 .macro Op28X1M1 /*PLP*/
3104 @ INDEX set, MEMORY set
3105 BIC rstatus,rstatus,#0xFF000000
3107 ORR rstatus,rscratch,rstatus
3108 TST rstatus, #MASK_INDEX
3109 @ INDEX clear & was set : 8->16
3110 MOVEQ reg_x,reg_x,LSR #8
3111 MOVEQ reg_y,reg_y,LSR #8
3112 TST rstatus, #MASK_MEM
3113 @ MEMORY cleared & was set : 8->16
3114 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
3115 MOVEQ reg_a,reg_a,LSR #8
3116 ORREQ reg_a,reg_a,rscratch, LSL #24
3120 .macro Op28X0M1 /*PLP*/
3121 @ INDEX cleared, MEMORY set
3122 BIC rstatus,rstatus,#0xFF000000
3124 ORR rstatus,rscratch,rstatus
3125 TST rstatus, #MASK_INDEX
3126 @ INDEX set & was cleared : 16->8
3127 MOVNE reg_x,reg_x,LSL #8
3128 MOVNE reg_y,reg_y,LSL #8
3129 TST rstatus, #MASK_MEM
3130 @ MEMORY cleared & was set : 8->16
3131 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
3132 MOVEQ reg_a,reg_a,LSR #8
3133 ORREQ reg_a,reg_a,rscratch, LSL #24
3137 .macro Op28X1M0 /*PLP*/
3138 @ INDEX set, MEMORY set
3139 BIC rstatus,rstatus,#0xFF000000
3141 ORR rstatus,rscratch,rstatus
3142 TST rstatus, #MASK_INDEX
3143 @ INDEX clear & was set : 8->16
3144 MOVEQ reg_x,reg_x,LSR #8
3145 MOVEQ reg_y,reg_y,LSR #8
3146 TST rstatus, #MASK_MEM
3147 @ MEMORY set & was cleared : 16->8
3148 MOVNE rscratch,reg_a,LSR #24
3149 MOVNE reg_a,reg_a,LSL #8
3150 STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
3154 .macro Op28X0M0 /*PLP*/
3155 @ INDEX set, MEMORY set
3156 BIC rstatus,rstatus,#0xFF000000
3158 ORR rstatus,rscratch,rstatus
3159 TST rstatus, #MASK_INDEX
3160 @ INDEX set & was cleared : 16->8
3161 MOVNE reg_x,reg_x,LSL #8
3162 MOVNE reg_y,reg_y,LSL #8
3163 TST rstatus, #MASK_MEM
3164 @ MEMORY set & was cleared : 16->8
3165 MOVNE rscratch,reg_a,LSR #24
3166 MOVNE reg_a,reg_a,LSL #8
3167 STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
3192 /**********************************************************************************************/
3193 /* Transfer Instructions ********************************************************************* */
3194 .macro OpAAX1M1 /*TAX8*/
3199 .macro OpAAX0M1 /*TAX16*/
3200 LDRB reg_x, [reg_cpu_var,#RAH_ofs]
3201 MOV reg_x, reg_x,LSL #24
3202 ORRS reg_x, reg_x,reg_a, LSR #8
3206 .macro OpAAX1M0 /*TAX8*/
3207 MOVS reg_x, reg_a, LSL #8
3211 .macro OpAAX0M0 /*TAX16*/
3216 .macro OpA8X1M1 /*TAY8*/
3221 .macro OpA8X0M1 /*TAY16*/
3222 LDRB reg_y, [reg_cpu_var,#RAH_ofs]
3223 MOV reg_y, reg_y,LSL #24
3224 ORRS reg_y, reg_y,reg_a, LSR #8
3228 .macro OpA8X1M0 /*TAY8*/
3229 MOVS reg_y, reg_a, LSL #8
3233 .macro OpA8X0M0 /*TAY16*/
3239 LDRB rscratch, [reg_cpu_var,#RAH_ofs]
3240 MOV reg_d,reg_d,LSL #16
3241 MOV rscratch,rscratch,LSL #24
3242 ORRS rscratch,rscratch,reg_a, LSR #8
3244 ORR reg_d,rscratch,reg_d,LSR #16
3248 MOV reg_d,reg_d,LSL #16
3251 ORR reg_d,reg_a,reg_d,LSR #16
3255 TST rstatus, #MASK_EMUL
3256 MOVNE reg_s, reg_a, LSR #24
3257 ORRNE reg_s, reg_s, #0x100
3258 LDREQB reg_s, [reg_cpu_var,#RAH_ofs]
3259 ORREQ reg_s, reg_s, reg_a
3260 MOVEQ reg_s, reg_s, ROR #24
3264 MOV reg_s, reg_a, LSR #16
3268 MOVS reg_a, reg_d, ASR #16
3270 MOV rscratch,reg_a,LSR #8
3271 MOV reg_a,reg_a, LSL #24
3272 STRB rscratch, [reg_cpu_var,#RAH_ofs]
3276 MOVS reg_a, reg_d, ASR #16
3278 MOV reg_a,reg_a, LSL #16
3282 MOV rscratch,reg_s, LSR #8
3283 MOVS reg_a, reg_s, LSL #16
3284 STRB rscratch, [reg_cpu_var,#RAH_ofs]
3286 MOV reg_a,reg_a, LSL #8
3290 MOVS reg_a, reg_s, LSL #16
3295 MOVS reg_x, reg_s, LSL #24
3300 MOVS reg_x, reg_s, LSL #16
3310 MOVS reg_a, reg_x, LSL #8
3315 MOVS reg_a, reg_x, LSR #8
3325 MOV reg_s, reg_x, LSR #24
3326 TST rstatus, #MASK_EMUL
3327 ORRNE reg_s, reg_s, #0x100
3331 MOV reg_s, reg_x, LSR #16
3350 MOVS reg_a, reg_y, LSL #8
3355 MOVS reg_a, reg_y, LSR #8
3375 /**********************************************************************************************/
3376 /* XCE *************************************************************************************** */
3379 TST rstatus,#MASK_CARRY
3382 TST rstatus,#MASK_EMUL
3385 BIC rstatus,rstatus,#(MASK_CARRY)
3386 TST rstatus,#MASK_INDEX
3387 @ X & Y were 16bits before
3388 MOVEQ reg_x,reg_x,LSL #8
3389 MOVEQ reg_y,reg_y,LSL #8
3390 TST rstatus,#MASK_MEM
3391 @ A was 16bits before
3393 MOVEQ rscratch,reg_a,LSR #24
3394 STREQB rscratch,[reg_cpu_var,#RAH_ofs]
3395 MOVEQ reg_a,reg_a,LSL #8
3396 ORR rstatus,rstatus,#(MASK_EMUL|MASK_MEM|MASK_INDEX)
3397 AND reg_s,reg_s,#0xFF
3398 ORR reg_s,reg_s,#0x100
3402 TST rstatus,#MASK_INDEX
3403 @ X & Y were 16bits before
3404 MOVEQ reg_x,reg_x,LSL #8
3405 MOVEQ reg_y,reg_y,LSL #8
3406 TST rstatus,#MASK_MEM
3407 @ A was 16bits before
3409 MOVEQ rscratch,reg_a,LSR #24
3410 STREQB rscratch,[reg_cpu_var,#RAH_ofs]
3411 MOVEQ reg_a,reg_a,LSL #8
3412 ORR rstatus,rstatus,#(MASK_CARRY|MASK_MEM|MASK_INDEX)
3413 AND reg_s,reg_s,#0xFF
3414 ORR reg_s,reg_s,#0x100
3418 TST rstatus,#MASK_EMUL
3420 @ EMUL was set : X,Y & A were 8bits
3421 @ Now have to check MEMORY & INDEX for potential conversions to 16bits
3422 TST rstatus,#MASK_INDEX
3423 @ X & Y are now 16bits
3424 MOVEQ reg_x,reg_x,LSR #8
3425 MOVEQ reg_y,reg_y,LSR #8
3426 TST rstatus,#MASK_MEM
3428 MOVEQ reg_a,reg_a,LSR #8
3430 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
3431 ORREQ reg_a,reg_a,rscratch,LSL #24
3433 BIC rstatus,rstatus,#(MASK_EMUL)
3434 ORR rstatus,rstatus,#(MASK_CARRY)
3440 /*******************************************************************************/
3441 /* BRK *************************************************************************/
3444 STRB rscratch,[reg_cpu_var,#BRKTriggered_ofs]
3446 TST rstatus, #MASK_EMUL
3447 @ EQ is flag to zero (!CheckEmu)
3450 SUB rscratch, rpc, regpcbase
3451 ADD rscratch2, rscratch, #1
3457 BIC reg_p_bank, reg_p_bank, #0xFF
3459 ORR rscratch, rscratch, #0xFF00
3465 SUB rscratch2, rpc, regpcbase
3471 BIC reg_p_bank,reg_p_bank, #0xFF
3473 ORR rscratch, rscratch, #0xFF00
3481 /**********************************************************************************************/
3482 /* BRL ************************************************************************************** */
3485 ORR rscratch, rscratch, reg_p_bank, LSL #16
3488 /**********************************************************************************************/
3489 /* IRQ *************************************************************************************** */
3490 @ void S9xOpcode_IRQ (void)
3491 .macro S9xOpcode_IRQ @ IRQ
3492 TST rstatus, #MASK_EMUL
3493 @ EQ is flag to zero (!CheckEmu)
3496 SUB rscratch2, rpc, regpcbase
3502 BIC reg_p_bank, reg_p_bank,#0xFF
3504 ORR rscratch, rscratch, #0xFF00
3510 SUB rscratch2, rpc, regpcbase
3516 BIC reg_p_bank,reg_p_bank, #0xFF
3518 ORR rscratch, rscratch, #0xFF00
3526 void asm_S9xOpcode_IRQ(void)
3528 if (!CheckEmulation())
3530 PushB (Registers.PB);
3531 PushW (CPU.PC - CPU.PCBase);
3532 PushB (Registers.PL);
3537 S9xSetPCBase (S9xGetWord (0xFFEE));
3538 CPU.Cycles += TWO_CYCLES;
3542 PushW (CPU.PC - CPU.PCBase);
3543 PushB (Registers.PL);
3548 S9xSetPCBase (S9xGetWord (0xFFFE));
3549 CPU.Cycles += ONE_CYCLE;
3554 /**********************************************************************************************/
3555 /* NMI *************************************************************************************** */
3556 @ void S9xOpcode_NMI (void)
3557 .macro S9xOpcode_NMI @ NMI
3558 TST rstatus, #MASK_EMUL
3559 @ EQ is flag to zero (!CheckEmu)
3562 SUB rscratch2, rpc, regpcbase
3568 BIC reg_p_bank, reg_p_bank,#0xFF
3570 ORR rscratch, rscratch, #0xFF00
3576 SUB rscratch2, rpc, regpcbase
3582 BIC reg_p_bank,reg_p_bank, #0xFF
3584 ORR rscratch, rscratch, #0xFF00
3591 void asm_S9xOpcode_NMI(void)
3593 if (!CheckEmulation())
3595 PushB (Registers.PB);
3596 PushW (CPU.PC - CPU.PCBase);
3597 PushB (Registers.PL);
3602 S9xSetPCBase (S9xGetWord (0xFFEA));
3603 CPU.Cycles += TWO_CYCLES;
3607 PushW (CPU.PC - CPU.PCBase);
3608 PushB (Registers.PL);
3613 S9xSetPCBase (S9xGetWord (0xFFFA));
3614 CPU.Cycles += ONE_CYCLE;
3619 /**********************************************************************************************/
3620 /* COP *************************************************************************************** */
3622 TST rstatus, #MASK_EMUL
3623 @ EQ is flag to zero (!CheckEmu)
3626 SUB rscratch, rpc, regpcbase
3627 ADD rscratch2, rscratch, #1
3633 BIC reg_p_bank, reg_p_bank,#0xFF
3635 ORR rscratch, rscratch, #0xFF00
3641 SUB rscratch2, rpc, regpcbase
3647 BIC reg_p_bank,reg_p_bank, #0xFF
3649 ORR rscratch, rscratch, #0xFF00
3656 /**********************************************************************************************/
3657 /* JML *************************************************************************************** */
3659 AbsoluteIndirectLong
3660 BIC reg_p_bank,reg_p_bank,#0xFF
3661 ORR reg_p_bank,reg_p_bank, rscratch, LSR #16
3667 BIC reg_p_bank,reg_p_bank,#0xFF
3668 ORR reg_p_bank,reg_p_bank, rscratch, LSR #16
3672 /**********************************************************************************************/
3673 /* JMP *************************************************************************************** */
3676 BIC rscratch, rscratch, #0xFF0000
3677 ORR rscratch, rscratch, reg_p_bank, LSL #16
3683 BIC rscratch, rscratch, #0xFF0000
3684 ORR rscratch, rscratch, reg_p_bank, LSL #16
3688 ADD rscratch, rscratch, reg_p_bank, LSL #16
3693 /**********************************************************************************************/
3694 /* JSL/RTL *********************************************************************************** */
3697 SUB rscratch, rpc, regpcbase
3698 @ SUB rscratch2, rscratch2, #1
3699 ADD rscratch2, rscratch, #2
3702 BIC reg_p_bank,reg_p_bank,#0xFF
3703 ORR reg_p_bank, reg_p_bank, rscratch, LSR #16
3708 BIC reg_p_bank,reg_p_bank,#0xFF
3710 ORR reg_p_bank, reg_p_bank, rscratch
3711 ADD rscratch, rpc, #1
3712 BIC rscratch, rscratch,#0xFF0000
3713 ORR rscratch, rscratch, reg_p_bank, LSL #16
3717 /**********************************************************************************************/
3718 /* JSR/RTS *********************************************************************************** */
3720 SUB rscratch, rpc, regpcbase
3721 @ SUB rscratch2, rscratch2, #1
3722 ADD rscratch2, rscratch, #1
3725 BIC rscratch, rscratch, #0xFF0000
3726 ORR rscratch, rscratch, reg_p_bank, LSL #16
3731 SUB rscratch, rpc, regpcbase
3732 @ SUB rscratch2, rscratch2, #1
3733 ADD rscratch2, rscratch, #1
3735 AbsoluteIndexedIndirectX0
3736 ORR rscratch, rscratch, reg_p_bank, LSL #16
3741 SUB rscratch, rpc, regpcbase
3742 @ SUB rscratch2, rscratch2, #1
3743 ADD rscratch2, rscratch, #1
3745 AbsoluteIndexedIndirectX1
3746 ORR rscratch, rscratch, reg_p_bank, LSL #16
3752 ADD rscratch, rpc, #1
3753 BIC rscratch, rscratch,#0x10000
3754 ORR rscratch, rscratch, reg_p_bank, LSL #16
3759 /**********************************************************************************************/
3760 /* MVN/MVP *********************************************************************************** */
3762 @ Save RegStatus = reg_d_bank >> 24
3763 MOV rscratch, reg_d_bank, LSR #16
3764 LDRB reg_d_bank , [rpc], #1
3765 LDRB rscratch2 , [rpc], #1
3766 @ Restore RegStatus = reg_d_bank >> 24
3767 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3768 MOV rscratch , reg_x, LSR #24
3769 ORR rscratch , rscratch, rscratch2, LSL #16
3771 MOV rscratch2, rscratch
3772 MOV rscratch , reg_y, LSR #24
3773 ORR rscratch , rscratch, reg_d_bank, LSL #16
3774 S9xSetByteLow rscratch2
3776 LDRB rscratch,[reg_cpu_var,#RAH_ofs]
3777 MOV reg_a,reg_a,LSR #8
3778 ORR reg_a,reg_a,rscratch, LSL #24
3779 ADD reg_x, reg_x, #0x01000000
3780 SUB reg_a, reg_a, #0x00010000
3781 ADD reg_y, reg_y, #0x01000000
3782 CMP reg_a, #0xFFFF0000
3785 MOV rscratch, reg_a, LSR #24
3786 MOV reg_a,reg_a,LSL #8
3787 STRB rscratch,[reg_cpu_var,#RAH_ofs]
3791 @ Save RegStatus = reg_d_bank >> 24
3792 MOV rscratch, reg_d_bank, LSR #16
3793 LDRB reg_d_bank , [rpc], #1
3794 LDRB rscratch2 , [rpc], #1
3795 @ Restore RegStatus = reg_d_bank >> 24
3796 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3797 MOV rscratch , reg_x, LSR #24
3798 ORR rscratch , rscratch, rscratch2, LSL #16
3800 MOV rscratch2, rscratch
3801 MOV rscratch , reg_y, LSR #24
3802 ORR rscratch , rscratch, reg_d_bank, LSL #16
3803 S9xSetByteLow rscratch2
3804 ADD reg_x, reg_x, #0x01000000
3805 SUB reg_a, reg_a, #0x00010000
3806 ADD reg_y, reg_y, #0x01000000
3807 CMP reg_a, #0xFFFF0000
3812 @ Save RegStatus = reg_d_bank >> 24
3813 MOV rscratch, reg_d_bank, LSR #16
3814 LDRB reg_d_bank , [rpc], #1
3815 LDRB rscratch2 , [rpc], #1
3816 @ Restore RegStatus = reg_d_bank >> 24
3817 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3818 MOV rscratch , reg_x, LSR #16
3819 ORR rscratch , rscratch, rscratch2, LSL #16
3821 MOV rscratch2, rscratch
3822 MOV rscratch , reg_y, LSR #16
3823 ORR rscratch , rscratch, reg_d_bank, LSL #16
3824 S9xSetByteLow rscratch2
3826 LDRB rscratch,[reg_cpu_var,#RAH_ofs]
3827 MOV reg_a,reg_a,LSR #8
3828 ORR reg_a,reg_a,rscratch, LSL #24
3829 ADD reg_x, reg_x, #0x00010000
3830 SUB reg_a, reg_a, #0x00010000
3831 ADD reg_y, reg_y, #0x00010000
3832 CMP reg_a, #0xFFFF0000
3835 MOV rscratch, reg_a, LSR #24
3836 MOV reg_a,reg_a,LSL #8
3837 STRB rscratch,[reg_cpu_var,#RAH_ofs]
3841 @ Save RegStatus = reg_d_bank >> 24
3842 MOV rscratch, reg_d_bank, LSR #16
3843 LDRB reg_d_bank , [rpc], #1
3844 LDRB rscratch2 , [rpc], #1
3845 @ Restore RegStatus = reg_d_bank >> 24
3846 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3847 MOV rscratch , reg_x, LSR #16
3848 ORR rscratch , rscratch, rscratch2, LSL #16
3850 MOV rscratch2, rscratch
3851 MOV rscratch , reg_y, LSR #16
3852 ORR rscratch , rscratch, reg_d_bank, LSL #16
3853 S9xSetByteLow rscratch2
3854 ADD reg_x, reg_x, #0x00010000
3855 SUB reg_a, reg_a, #0x00010000
3856 ADD reg_y, reg_y, #0x00010000
3857 CMP reg_a, #0xFFFF0000
3863 @ Save RegStatus = reg_d_bank >> 24
3864 MOV rscratch, reg_d_bank, LSR #16
3865 LDRB reg_d_bank , [rpc], #1
3866 LDRB rscratch2 , [rpc], #1
3867 @ Restore RegStatus = reg_d_bank >> 24
3868 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3869 MOV rscratch , reg_x, LSR #24
3870 ORR rscratch , rscratch, rscratch2, LSL #16
3872 MOV rscratch2, rscratch
3873 MOV rscratch , reg_y, LSR #24
3874 ORR rscratch , rscratch, reg_d_bank, LSL #16
3875 S9xSetByteLow rscratch2
3877 LDRB rscratch,[reg_cpu_var,#RAH_ofs]
3878 MOV reg_a,reg_a,LSR #8
3879 ORR reg_a,reg_a,rscratch, LSL #24
3880 SUB reg_x, reg_x, #0x01000000
3881 SUB reg_a, reg_a, #0x00010000
3882 SUB reg_y, reg_y, #0x01000000
3883 CMP reg_a, #0xFFFF0000
3886 MOV rscratch, reg_a, LSR #24
3887 MOV reg_a,reg_a,LSL #8
3888 STRB rscratch,[reg_cpu_var,#RAH_ofs]
3892 @ Save RegStatus = reg_d_bank >> 24
3893 MOV rscratch, reg_d_bank, LSR #16
3894 LDRB reg_d_bank , [rpc], #1
3895 LDRB rscratch2 , [rpc], #1
3896 @ Restore RegStatus = reg_d_bank >> 24
3897 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3898 MOV rscratch , reg_x, LSR #24
3899 ORR rscratch , rscratch, rscratch2, LSL #16
3901 MOV rscratch2, rscratch
3902 MOV rscratch , reg_y, LSR #24
3903 ORR rscratch , rscratch, reg_d_bank, LSL #16
3904 S9xSetByteLow rscratch2
3905 SUB reg_x, reg_x, #0x01000000
3906 SUB reg_a, reg_a, #0x00010000
3907 SUB reg_y, reg_y, #0x01000000
3908 CMP reg_a, #0xFFFF0000
3913 @ Save RegStatus = reg_d_bank >> 24
3914 MOV rscratch, reg_d_bank, LSR #16
3915 LDRB reg_d_bank , [rpc], #1
3916 LDRB rscratch2 , [rpc], #1
3917 @ Restore RegStatus = reg_d_bank >> 24
3918 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3919 MOV rscratch , reg_x, LSR #16
3920 ORR rscratch , rscratch, rscratch2, LSL #16
3922 MOV rscratch2, rscratch
3923 MOV rscratch , reg_y, LSR #16
3924 ORR rscratch , rscratch, reg_d_bank, LSL #16
3925 S9xSetByteLow rscratch2
3927 LDRB rscratch,[reg_cpu_var,#RAH_ofs]
3928 MOV reg_a,reg_a,LSR #8
3929 ORR reg_a,reg_a,rscratch, LSL #24
3930 SUB reg_x, reg_x, #0x00010000
3931 SUB reg_a, reg_a, #0x00010000
3932 SUB reg_y, reg_y, #0x00010000
3933 CMP reg_a, #0xFFFF0000
3936 MOV rscratch, reg_a, LSR #24
3937 MOV reg_a,reg_a,LSL #8
3938 STRB rscratch,[reg_cpu_var,#RAH_ofs]
3942 @ Save RegStatus = reg_d_bank >> 24
3943 MOV rscratch, reg_d_bank, LSR #16
3944 LDRB reg_d_bank , [rpc], #1
3945 LDRB rscratch2 , [rpc], #1
3946 @ Restore RegStatus = reg_d_bank >> 24
3947 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3948 MOV rscratch , reg_x, LSR #16
3949 ORR rscratch , rscratch, rscratch2, LSL #16
3951 MOV rscratch2, rscratch
3952 MOV rscratch , reg_y, LSR #16
3953 ORR rscratch , rscratch, reg_d_bank, LSL #16
3954 S9xSetByteLow rscratch2
3955 SUB reg_x, reg_x, #0x00010000
3956 SUB reg_a, reg_a, #0x00010000
3957 SUB reg_y, reg_y, #0x00010000
3958 CMP reg_a, #0xFFFF0000
3963 /**********************************************************************************************/
3964 /* REP/SEP *********************************************************************************** */
3966 @ status&=~(*rpc++);
3967 @ so possible changes are :
3968 @ INDEX = 1 -> 0 : X,Y 8bits -> 16bits
3969 @ MEM = 1 -> 0 : A 8bits -> 16bits
3970 @ SAVE OLD status for MASK_INDEX & MASK_MEM comparison
3971 MOV rscratch3, rstatus
3972 LDRB rscratch, [rpc], #1
3973 MVN rscratch, rscratch
3974 AND rstatus,rstatus,rscratch, ROR #(32-STATUS_SHIFTER)
3975 TST rstatus,#MASK_EMUL
3977 @ emulation mode on : no changes since it was on before opcode
3978 @ just be sure to reset MEM & INDEX accordingly
3979 ORR rstatus,rstatus,#(MASK_MEM|MASK_INDEX)
3982 @ NOT in Emulation mode, check INDEX & MEMORY bits
3984 TST rscratch3,#MASK_INDEX
3986 @ X & Y were 8bit before
3987 TST rstatus,#MASK_INDEX
3989 @ X & Y are now 16bits
3990 MOV reg_x,reg_x,LSR #8
3991 MOV reg_y,reg_y,LSR #8
3992 1113: @ X & Y still in 16bits
3994 TST rscratch3,#MASK_MEM
3997 TST rstatus,#MASK_MEM
4000 MOV reg_a,reg_a,LSR #8
4002 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
4003 ORREQ reg_a,reg_a,rscratch,LSL #24
4010 @ so possible changes are :
4011 @ INDEX = 0 -> 1 : X,Y 16bits -> 8bits
4012 @ MEM = 0 -> 1 : A 16bits -> 8bits
4013 @ SAVE OLD status for MASK_INDEX & MASK_MEM comparison
4014 MOV rscratch3, rstatus
4015 LDRB rscratch, [rpc], #1
4016 ORR rstatus,rstatus,rscratch, LSL #STATUS_SHIFTER
4017 TST rstatus,#MASK_EMUL
4019 @ emulation mode on : no changes sinc eit was on before opcode
4020 @ just be sure to have mem & index set accordingly
4021 ORR rstatus,rstatus,#(MASK_MEM|MASK_INDEX)
4024 @ NOT in Emulation mode, check INDEX & MEMORY bits
4026 TST rscratch3,#MASK_INDEX
4028 @ X & Y were 16bit before
4029 TST rstatus,#MASK_INDEX
4031 @ X & Y are now 8bits
4032 MOV reg_x,reg_x,LSL #8
4033 MOV reg_y,reg_y,LSL #8
4034 10113: @ X & Y still in 16bits
4036 TST rscratch3,#MASK_MEM
4038 @ A was 16bit before
4039 TST rstatus,#MASK_MEM
4043 MOV rscratch,reg_a,LSR #24
4044 MOV reg_a,reg_a,LSL #8
4045 STRB rscratch,[reg_cpu_var,#RAH_ofs]
4051 /**********************************************************************************************/
4052 /* XBA *************************************************************************************** */
4055 ADD rscratch,reg_cpu_var,#RAH_ofs
4056 MOV reg_a,reg_a, LSR #24
4057 SWPB reg_a,reg_a,[rscratch]
4058 MOVS reg_a,reg_a, LSL #24
4064 MOV rscratch, reg_a, ROR #24 @ ll0000hh
4065 ORR rscratch, rscratch, reg_a, LSR #8@ ll0000hh + 00hhll00 -> llhhllhh
4066 MOV reg_a, rscratch, LSL #16@ llhhllhh -> llhh0000
4067 MOVS rscratch,rscratch,LSL #24 @ to set Z & N flags with AL
4073 /**********************************************************************************************/
4074 /* RTI *************************************************************************************** */
4076 @ INDEX set, MEMORY set
4077 BIC rstatus,rstatus,#0xFF000000
4079 ORR rstatus,rscratch,rstatus
4081 TST rstatus, #MASK_EMUL
4082 ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
4085 BIC reg_p_bank,reg_p_bank,#0xFF
4086 ORR reg_p_bank,reg_p_bank,rscratch
4088 ADD rscratch, rpc, reg_p_bank, LSL #16
4090 TST rstatus, #MASK_INDEX
4091 @ INDEX cleared & was set : 8->16
4092 MOVEQ reg_x,reg_x,LSR #8
4093 MOVEQ reg_y,reg_y,LSR #8
4094 TST rstatus, #MASK_MEM
4095 @ MEMORY cleared & was set : 8->16
4096 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
4097 MOVEQ reg_a,reg_a,LSR #8
4098 ORREQ reg_a,reg_a,rscratch, LSL #24
4103 @ INDEX cleared, MEMORY set
4104 BIC rstatus,rstatus,#0xFF000000
4106 ORR rstatus,rscratch,rstatus
4108 TST rstatus, #MASK_EMUL
4109 ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
4112 BIC reg_p_bank,reg_p_bank,#0xFF
4113 ORR reg_p_bank,reg_p_bank,rscratch
4115 ADD rscratch, rpc, reg_p_bank, LSL #16
4117 TST rstatus, #MASK_INDEX
4118 @ INDEX set & was cleared : 16->8
4119 MOVNE reg_x,reg_x,LSL #8
4120 MOVNE reg_y,reg_y,LSL #8
4121 TST rstatus, #MASK_MEM
4122 @ MEMORY cleared & was set : 8->16
4123 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
4124 MOVEQ reg_a,reg_a,LSR #8
4125 ORREQ reg_a,reg_a,rscratch, LSL #24
4130 @ INDEX set, MEMORY cleared
4131 BIC rstatus,rstatus,#0xFF000000
4133 ORR rstatus,rscratch,rstatus
4135 TST rstatus, #MASK_EMUL
4136 ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
4139 BIC reg_p_bank,reg_p_bank,#0xFF
4140 ORR reg_p_bank,reg_p_bank,rscratch
4142 ADD rscratch, rpc, reg_p_bank, LSL #16
4144 TST rstatus, #MASK_INDEX
4145 @ INDEX cleared & was set : 8->16
4146 MOVEQ reg_x,reg_x,LSR #8
4147 MOVEQ reg_y,reg_y,LSR #8
4148 TST rstatus, #MASK_MEM
4149 @ MEMORY set & was cleared : 16->8
4150 MOVNE rscratch,reg_a,LSR #24
4151 MOVNE reg_a,reg_a,LSL #8
4152 STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
4157 @ INDEX cleared, MEMORY cleared
4158 BIC rstatus,rstatus,#0xFF000000
4160 ORR rstatus,rscratch,rstatus
4162 TST rstatus, #MASK_EMUL
4163 ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
4166 BIC reg_p_bank,reg_p_bank,#0xFF
4167 ORR reg_p_bank,reg_p_bank,rscratch
4169 ADD rscratch, rpc, reg_p_bank, LSL #16
4171 TST rstatus, #MASK_INDEX
4172 @ INDEX set & was cleared : 16->8
4173 MOVNE reg_x,reg_x,LSL #8
4174 MOVNE reg_y,reg_y,LSL #8
4175 TST rstatus, #MASK_MEM
4176 @ MEMORY set & was cleared : 16->8
4177 @ MEMORY set & was cleared : 16->8
4178 MOVNE rscratch,reg_a,LSR #24
4179 MOVNE reg_a,reg_a,LSL #8
4180 STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
4186 /**********************************************************************************************/
4187 /* STP/WAI/DB ******************************************************************************** */
4190 LDRB rscratch,[reg_cpu_var,#IRQActive_ofs]
4191 MOVS rscratch,rscratch
4196 CPU.WaitingForInterrupt = TRUE;
4202 CPU.Cycles = CPU.NextEvent;
4204 STRB rscratch,[reg_cpu_var,#WaitingForInterrupt_ofs]
4205 LDR reg_cycles,[reg_cpu_var,#NextEvent_ofs]
4207 if (IAPU.APUExecuting)
4209 ICPU.CPUExecuting = FALSE;
4213 } while (APU.Cycles < CPU.NextEvent);
4214 ICPU.CPUExecuting = TRUE;
4217 LDRB rscratch,[reg_cpu_var,#APUExecuting_ofs]
4218 MOVS rscratch,rscratch
4226 @ CPU.Flags |= DEBUG_MODE_FLAG;
4228 .macro Op42 /*Reserved Snes9X: SNESAdvance SpeedHack */
4229 @ Explanation: this is a reserved opcode turned into special "idle"/hlt opcode.
4230 @ This means we should do an hblank now.
4232 CPU.Cycles = CPU.NextEvent;
4233 */ ldr reg_cycles, [reg_cpu_var,#NextEvent_ofs]
4234 @ Now execute the shadowed branch
4235 @ Equivalent to "asmRelative":
4237 ldrb rscratch, [rpc], #1
4238 and rscratch2, rscratch, #0xf0 @branch type
4239 orr rscratch, rscratch, #0xf0 @branch dest (always negative, so sign ext)
4240 sxtb rscratch, rscratch
4241 add rscratch, rscratch, rpc
4242 sub rscratch, rscratch, regpcbase
4243 uxth rscratch, rscratch
4244 @ TODO: Do something with rscratch2 before BranchCheck clobbers it.
4245 @ Currently hardcoded to BEQ
4247 TST rstatus, #MASK_ZERO
4249 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
4254 /**********************************************************************************************/
4255 /* AND ******************************************************************************** */
4257 LDRB rscratch , [rpc], #1
4258 ANDS reg_a , reg_a, rscratch, LSL #24
4263 LDRB rscratch2 , [rpc,#1]
4264 LDRB rscratch , [rpc], #2
4265 ORR rscratch, rscratch, rscratch2, LSL #8
4266 ANDS reg_a , reg_a, rscratch, LSL #16
4285 /**********************************************************************************************/
4286 /* EOR ******************************************************************************** */
4288 LDRB rscratch2 , [rpc, #1]
4289 LDRB rscratch , [rpc], #2
4290 ORR rscratch, rscratch, rscratch2,LSL #8
4291 EORS reg_a, reg_a, rscratch,LSL #16
4298 LDRB rscratch , [rpc], #1
4299 EORS reg_a, reg_a, rscratch,LSL #24
4305 /**********************************************************************************************/
4306 /* STA *************************************************************************************** */
4309 @ TST rstatus, #MASK_INDEX
4314 @ TST rstatus, #MASK_INDEX
4319 /**********************************************************************************************/
4320 /* BIT *************************************************************************************** */
4322 LDRB rscratch , [rpc], #1
4323 TST reg_a, rscratch, LSL #24
4328 LDRB rscratch2 , [rpc, #1]
4329 LDRB rscratch , [rpc], #2
4330 ORR rscratch, rscratch, rscratch2, LSL #8
4331 TST reg_a, rscratch, LSL #16
4341 /**********************************************************************************************/
4342 /* LDY *************************************************************************************** */
4344 LDRB rscratch , [rpc], #1
4345 MOVS reg_y, rscratch, LSL #24
4350 LDRB rscratch2 , [rpc, #1]
4351 LDRB rscratch , [rpc], #2
4352 ORR rscratch, rscratch, rscratch2, LSL #8
4353 MOVS reg_y, rscratch, LSL #16
4358 /**********************************************************************************************/
4359 /* LDX *************************************************************************************** */
4361 LDRB rscratch , [rpc], #1
4362 MOVS reg_x, rscratch, LSL #24
4367 LDRB rscratch2 , [rpc, #1]
4368 LDRB rscratch , [rpc], #2
4369 ORR rscratch, rscratch, rscratch2, LSL #8
4370 MOVS reg_x, rscratch, LSL #16
4375 /**********************************************************************************************/
4376 /* LDA *************************************************************************************** */
4378 LDRB rscratch , [rpc], #1
4379 MOVS reg_a, rscratch, LSL #24
4384 LDRB rscratch2 , [rpc, #1]
4385 LDRB rscratch , [rpc], #2
4386 ORR rscratch, rscratch, rscratch2, LSL #8
4387 MOVS reg_a, rscratch, LSL #16
4392 /**********************************************************************************************/
4393 /* CMY *************************************************************************************** */
4395 LDRB rscratch , [rpc], #1
4396 SUBS rscratch2 , reg_y , rscratch, LSL #24
4397 BICCC rstatus, rstatus, #MASK_CARRY
4398 ORRCS rstatus, rstatus, #MASK_CARRY
4403 LDRB rscratch2 , [rpc, #1]
4404 LDRB rscratch , [rpc], #2
4405 ORR rscratch, rscratch, rscratch2, LSL #8
4406 SUBS rscratch2 , reg_y, rscratch, LSL #16
4407 BICCC rstatus, rstatus, #MASK_CARRY
4408 ORRCS rstatus, rstatus, #MASK_CARRY
4417 /**********************************************************************************************/
4418 /* CMP *************************************************************************************** */
4420 LDRB rscratch , [rpc], #1
4421 SUBS rscratch2 , reg_a , rscratch, LSL #24
4422 BICCC rstatus, rstatus, #MASK_CARRY
4423 ORRCS rstatus, rstatus, #MASK_CARRY
4428 LDRB rscratch2 , [rpc,#1]
4429 LDRB rscratch , [rpc], #2
4430 ORR rscratch, rscratch, rscratch2, LSL #8
4431 SUBS rscratch2 , reg_a, rscratch, LSL #16
4432 BICCC rstatus, rstatus, #MASK_CARRY
4433 ORRCS rstatus, rstatus, #MASK_CARRY
4438 /**********************************************************************************************/
4439 /* CMX *************************************************************************************** */
4441 LDRB rscratch , [rpc], #1
4442 SUBS rscratch2 , reg_x , rscratch, LSL #24
4443 BICCC rstatus, rstatus, #MASK_CARRY
4444 ORRCS rstatus, rstatus, #MASK_CARRY
4449 LDRB rscratch2 , [rpc,#1]
4450 LDRB rscratch , [rpc], #2
4451 ORR rscratch, rscratch, rscratch2, LSL #8
4452 SUBS rscratch2 , reg_x, rscratch, LSL #16
4453 BICCC rstatus, rstatus, #MASK_CARRY
4454 ORRCS rstatus, rstatus, #MASK_CARRY
4460 /****************************************************************
4462 ****************************************************************/
4464 .type asmMainLoop, function
4466 @ void asmMainLoop(asm_cpu_var_t *asmcpuPtr);
4469 STMFD R13!,{R4-R11, LR}
4470 @ init pointer to CPUvar structure
4474 @ get cpu mode from flag and init jump table
4482 LDR rscratch,[reg_cpu_var,#Flags_ofs]
4483 MOVS rscratch,rscratch
4484 BNE CPUFlags_set @ If flags => check for irq/nmi/scan_keys...
4486 EXEC_OP @ Execute next opcode
4488 CPUFlags_set: @ Check flags (!=0)
4489 TST rscratch,#NMI_FLAG @ Check NMI
4490 BEQ CPUFlagsNMI_FLAG_cleared
4491 LDR rscratch2,[reg_cpu_var,#NMICycleCount_ofs]
4492 SUBS rscratch2,rscratch2,#1
4493 STR rscratch2,[reg_cpu_var,#NMICycleCount_ofs]
4494 BNE CPUFlagsNMI_FLAG_cleared
4495 BIC rscratch,rscratch,#NMI_FLAG
4496 STR rscratch,[reg_cpu_var,#Flags_ofs]
4497 LDRB rscratch2,[reg_cpu_var,#WaitingForInterrupt_ofs]
4498 MOVS rscratch2,rscratch2
4499 BEQ NotCPUaitingForInterruptNMI
4502 STRB rscratch2,[reg_cpu_var,#WaitingForInterrupt_ofs]
4503 NotCPUaitingForInterruptNMI:
4505 LDR rscratch,[reg_cpu_var,#Flags_ofs]
4506 CPUFlagsNMI_FLAG_cleared:
4507 TST rscratch,#IRQ_PENDING_FLAG @ Check IRQ_PENDING_FLAG
4508 BEQ CPUFlagsIRQ_PENDING_FLAG_cleared
4509 LDR rscratch2,[reg_cpu_var,#IRQCycleCount_ofs]
4510 MOVS rscratch2,rscratch2
4511 BNE CPUIRQCycleCount_NotZero
4512 LDRB rscratch2,[reg_cpu_var,#WaitingForInterrupt_ofs]
4513 MOVS rscratch2,rscratch2
4514 BEQ NotCPUaitingForInterruptIRQ
4517 STRB rscratch2,[reg_cpu_var,#WaitingForInterrupt_ofs]
4518 NotCPUaitingForInterruptIRQ:
4519 LDRB rscratch2,[reg_cpu_var,#IRQActive_ofs]
4520 MOVS rscratch2,rscratch2
4521 BEQ CPUIRQActive_cleared
4522 TST rstatus,#MASK_IRQ
4523 BNE CPUFlagsIRQ_PENDING_FLAG_cleared
4525 LDR rscratch,[reg_cpu_var,#Flags_ofs]
4526 B CPUFlagsIRQ_PENDING_FLAG_cleared
4527 CPUIRQActive_cleared:
4528 BIC rscratch,rscratch,#IRQ_PENDING_FLAG
4529 STR rscratch,[reg_cpu_var,#Flags_ofs]
4530 B CPUFlagsIRQ_PENDING_FLAG_cleared
4531 CPUIRQCycleCount_NotZero:
4532 SUB rscratch2,rscratch2,#1
4533 STR rscratch2,[reg_cpu_var,#IRQCycleCount_ofs]
4534 CPUFlagsIRQ_PENDING_FLAG_cleared:
4536 TST rscratch,#SCAN_KEYS_FLAG @ Check SCAN_KEYS_FLAG
4539 EXEC_OP @ Execute next opcode
4542 /*Registers.PC = CPU.PC - CPU.PCBase;
4544 APURegisters.PC = IAPU.PC - IAPU.RAM;
4545 S9xAPUPackStatus ();
4547 if (CPU.Flags & SCAN_KEYS_FLAG)
4550 CPU.Flags &= ~SCAN_KEYS_FLAG;
4554 LDMFD R13!,{R4-R11, LR}
4557 .size asmMainLoop, asmMainLoop-.
4559 @ void test_opcode(struct asm_cpu_var *asm_var);
4562 STMFD R13!,{R4-R11,LR}
4563 @ init pointer to CPUvar structure
4567 @ get cpu mode from flag and init jump table
4573 /*****************************************************************
4575 *****************************************************************/
4578 jumptable1: .long Op00mod1
4839 lbl01mod1a: DirectIndexedIndirect1
4846 lbl03mod1a: StackasmRelative
4862 lbl07mod1a: DirectIndirectLong
4878 lbl0Cmod1a: Absolute
4882 lbl0Dmod1a: Absolute
4886 lbl0Emod1a: Absolute
4890 lbl0Fmod1a: AbsoluteLong
4897 lbl11mod1a: DirectIndirectIndexed1
4901 lbl12mod1a: DirectIndirect
4905 lbl13mod1a: StackasmRelativeIndirectIndexed1
4913 lbl15mod1a: DirectIndexedX1
4917 lbl16mod1a: DirectIndexedX1
4921 lbl17mod1a: DirectIndirectIndexedLong1
4928 lbl19mod1a: AbsoluteIndexedY1
4938 lbl1Cmod1a: Absolute
4942 lbl1Dmod1a: AbsoluteIndexedX1
4946 lbl1Emod1a: AbsoluteIndexedX1
4950 lbl1Fmod1a: AbsoluteLongIndexedX1
4957 lbl21mod1a: DirectIndexedIndirect1
4964 lbl23mod1a: StackasmRelative
4980 lbl27mod1a: DirectIndirectLong
4997 lbl2Cmod1a: Absolute
5001 lbl2Dmod1a: Absolute
5005 lbl2Emod1a: Absolute
5009 lbl2Fmod1a: AbsoluteLong
5016 lbl31mod1a: DirectIndirectIndexed1
5020 lbl32mod1a: DirectIndirect
5024 lbl33mod1a: StackasmRelativeIndirectIndexed1
5028 lbl34mod1a: DirectIndexedX1
5032 lbl35mod1a: DirectIndexedX1
5036 lbl36mod1a: DirectIndexedX1
5040 lbl37mod1a: DirectIndirectIndexedLong1
5047 lbl39mod1a: AbsoluteIndexedY1
5057 lbl3Cmod1a: AbsoluteIndexedX1
5061 lbl3Dmod1a: AbsoluteIndexedX1
5065 lbl3Emod1a: AbsoluteIndexedX1
5069 lbl3Fmod1a: AbsoluteLongIndexedX1
5077 lbl41mod1a: DirectIndexedIndirect1
5084 lbl43mod1a: StackasmRelative
5099 lbl47mod1a: DirectIndirectLong
5118 lbl4Dmod1a: Absolute
5122 lbl4Emod1a: Absolute
5126 lbl4Fmod1a: AbsoluteLong
5133 lbl51mod1a: DirectIndirectIndexed1
5137 lbl52mod1a: DirectIndirect
5141 lbl53mod1a: StackasmRelativeIndirectIndexed1
5148 lbl55mod1a: DirectIndexedX1
5152 lbl56mod1a: DirectIndexedX1
5156 lbl57mod1a: DirectIndirectIndexedLong1
5163 lbl59mod1a: AbsoluteIndexedY1
5176 lbl5Dmod1a: AbsoluteIndexedX1
5180 lbl5Emod1a: AbsoluteIndexedX1
5184 lbl5Fmod1a: AbsoluteLongIndexedX1
5191 lbl61mod1a: DirectIndexedIndirect1
5198 lbl63mod1a: StackasmRelative
5214 lbl67mod1a: DirectIndirectLong
5221 lbl69mod1a: Immediate8
5234 lbl6Dmod1a: Absolute
5238 lbl6Emod1a: Absolute
5242 lbl6Fmod1a: AbsoluteLong
5249 lbl71mod1a: DirectIndirectIndexed1
5253 lbl72mod1a: DirectIndirect
5257 lbl73mod1a: StackasmRelativeIndirectIndexed1
5262 lbl74mod1a: DirectIndexedX1
5266 lbl75mod1a: DirectIndexedX1
5270 lbl76mod1a: DirectIndexedX1
5274 lbl77mod1a: DirectIndirectIndexedLong1
5281 lbl79mod1a: AbsoluteIndexedY1
5291 lbl7Cmod1: AbsoluteIndexedIndirectX1
5295 lbl7Dmod1a: AbsoluteIndexedX1
5299 lbl7Emod1a: AbsoluteIndexedX1
5303 lbl7Fmod1a: AbsoluteLongIndexedX1
5312 lbl81mod1a: DirectIndexedIndirect1
5319 lbl83mod1a: StackasmRelative
5335 lbl87mod1a: DirectIndirectLong
5351 lbl8Cmod1a: Absolute
5355 lbl8Dmod1a: Absolute
5359 lbl8Emod1a: Absolute
5363 lbl8Fmod1a: AbsoluteLong
5370 lbl91mod1a: DirectIndirectIndexed1
5374 lbl92mod1a: DirectIndirect
5378 lbl93mod1a: StackasmRelativeIndirectIndexed1
5382 lbl94mod1a: DirectIndexedX1
5386 lbl95mod1a: DirectIndexedX1
5390 lbl96mod1a: DirectIndexedY1
5394 lbl97mod1a: DirectIndirectIndexedLong1
5401 lbl99mod1a: AbsoluteIndexedY1
5411 lbl9Cmod1a: Absolute
5415 lbl9Dmod1a: AbsoluteIndexedX1
5419 lbl9Emod1: AbsoluteIndexedX1
5423 lbl9Fmod1a: AbsoluteLongIndexedX1
5430 lblA1mod1a: DirectIndexedIndirect1
5437 lblA3mod1a: StackasmRelative
5453 lblA7mod1a: DirectIndirectLong
5469 lblACmod1a: Absolute
5473 lblADmod1a: Absolute
5477 lblAEmod1a: Absolute
5481 lblAFmod1a: AbsoluteLong
5488 lblB1mod1a: DirectIndirectIndexed1
5492 lblB2mod1a: DirectIndirect
5496 lblB3mod1a: StackasmRelativeIndirectIndexed1
5500 lblB4mod1a: DirectIndexedX1
5504 lblB5mod1a: DirectIndexedX1
5508 lblB6mod1a: DirectIndexedY1
5512 lblB7mod1a: DirectIndirectIndexedLong1
5519 lblB9mod1a: AbsoluteIndexedY1
5529 lblBCmod1a: AbsoluteIndexedX1
5533 lblBDmod1a: AbsoluteIndexedX1
5537 lblBEmod1a: AbsoluteIndexedY1
5541 lblBFmod1a: AbsoluteLongIndexedX1
5548 lblC1mod1a: DirectIndexedIndirect1
5556 lblC3mod1a: StackasmRelative
5572 lblC7mod1a: DirectIndirectLong
5588 lblCCmod1a: Absolute
5592 lblCDmod1a: Absolute
5596 lblCEmod1a: Absolute
5600 lblCFmod1a: AbsoluteLong
5607 lblD1mod1a: DirectIndirectIndexed1
5611 lblD2mod1a: DirectIndirect
5615 lblD3mod1a: StackasmRelativeIndirectIndexed1
5622 lblD5mod1a: DirectIndexedX1
5626 lblD6mod1a: DirectIndexedX1
5630 lblD7mod1a: DirectIndirectIndexedLong1
5637 lblD9mod1a: AbsoluteIndexedY1
5650 lblDDmod1a: AbsoluteIndexedX1
5654 lblDEmod1a: AbsoluteIndexedX1
5658 lblDFmod1a: AbsoluteLongIndexedX1
5665 lblE1mod1a: DirectIndexedIndirect1
5673 lblE3mod1a: StackasmRelative
5689 lblE7mod1a: DirectIndirectLong
5696 lblE9mod1a: Immediate8
5706 lblECmod1a: Absolute
5710 lblEDmod1a: Absolute
5714 lblEEmod1a: Absolute
5718 lblEFmod1a: AbsoluteLong
5725 lblF1mod1a: DirectIndirectIndexed1
5729 lblF2mod1a: DirectIndirect
5733 lblF3mod1a: StackasmRelativeIndirectIndexed1
5740 lblF5mod1a: DirectIndexedX1
5744 lblF6mod1a: DirectIndexedX1
5748 lblF7mod1a: DirectIndirectIndexedLong1
5755 lblF9mod1a: AbsoluteIndexedY1
5768 lblFDmod1a: AbsoluteIndexedX1
5772 lblFEmod1a: AbsoluteIndexedX1
5776 lblFFmod1a: AbsoluteLongIndexedX1
5782 jumptable2: .long Op00mod2
6042 lbl01mod2a: DirectIndexedIndirect0
6049 lbl03mod2a: StackasmRelative
6065 lbl07mod2a: DirectIndirectLong
6081 lbl0Cmod2a: Absolute
6085 lbl0Dmod2a: Absolute
6089 lbl0Emod2a: Absolute
6093 lbl0Fmod2a: AbsoluteLong
6100 lbl11mod2a: DirectIndirectIndexed0
6104 lbl12mod2a: DirectIndirect
6108 lbl13mod2a: StackasmRelativeIndirectIndexed0
6116 lbl15mod2a: DirectIndexedX0
6120 lbl16mod2a: DirectIndexedX0
6124 lbl17mod2a: DirectIndirectIndexedLong0
6131 lbl19mod2a: AbsoluteIndexedY0
6141 lbl1Cmod2a: Absolute
6145 lbl1Dmod2a: AbsoluteIndexedX0
6149 lbl1Emod2a: AbsoluteIndexedX0
6153 lbl1Fmod2a: AbsoluteLongIndexedX0
6160 lbl21mod2a: DirectIndexedIndirect0
6167 lbl23mod2a: StackasmRelative
6183 lbl27mod2a: DirectIndirectLong
6200 lbl2Cmod2a: Absolute
6204 lbl2Dmod2a: Absolute
6208 lbl2Emod2a: Absolute
6212 lbl2Fmod2a: AbsoluteLong
6219 lbl31mod2a: DirectIndirectIndexed0
6223 lbl32mod2a: DirectIndirect
6227 lbl33mod2a: StackasmRelativeIndirectIndexed0
6231 lbl34mod2a: DirectIndexedX0
6235 lbl35mod2a: DirectIndexedX0
6239 lbl36mod2a: DirectIndexedX0
6243 lbl37mod2a: DirectIndirectIndexedLong0
6250 lbl39mod2a: AbsoluteIndexedY0
6260 lbl3Cmod2a: AbsoluteIndexedX0
6264 lbl3Dmod2a: AbsoluteIndexedX0
6268 lbl3Emod2a: AbsoluteIndexedX0
6272 lbl3Fmod2a: AbsoluteLongIndexedX0
6280 lbl41mod2a: DirectIndexedIndirect0
6287 lbl43mod2a: StackasmRelative
6302 lbl47mod2a: DirectIndirectLong
6321 lbl4Dmod2a: Absolute
6325 lbl4Emod2a: Absolute
6329 lbl4Fmod2a: AbsoluteLong
6336 lbl51mod2a: DirectIndirectIndexed0
6340 lbl52mod2a: DirectIndirect
6344 lbl53mod2a: StackasmRelativeIndirectIndexed0
6351 lbl55mod2a: DirectIndexedX0
6355 lbl56mod2a: DirectIndexedX0
6359 lbl57mod2a: DirectIndirectIndexedLong0
6366 lbl59mod2a: AbsoluteIndexedY0
6379 lbl5Dmod2a: AbsoluteIndexedX0
6383 lbl5Emod2a: AbsoluteIndexedX0
6387 lbl5Fmod2a: AbsoluteLongIndexedX0
6394 lbl61mod2a: DirectIndexedIndirect0
6401 lbl63mod2a: StackasmRelative
6417 lbl67mod2a: DirectIndirectLong
6424 lbl69mod2a: Immediate8
6437 lbl6Dmod2a: Absolute
6441 lbl6Emod2a: Absolute
6445 lbl6Fmod2a: AbsoluteLong
6452 lbl71mod2a: DirectIndirectIndexed0
6456 lbl72mod2a: DirectIndirect
6460 lbl73mod2a: StackasmRelativeIndirectIndexed0
6464 lbl74mod2a: DirectIndexedX0
6468 lbl75mod2a: DirectIndexedX0
6472 lbl76mod2a: DirectIndexedX0
6476 lbl77mod2a: DirectIndirectIndexedLong0
6483 lbl79mod2a: AbsoluteIndexedY0
6493 lbl7Cmod2: AbsoluteIndexedIndirectX0
6497 lbl7Dmod2a: AbsoluteIndexedX0
6501 lbl7Emod2a: AbsoluteIndexedX0
6505 lbl7Fmod2a: AbsoluteLongIndexedX0
6514 lbl81mod2a: DirectIndexedIndirect0
6521 lbl83mod2a: StackasmRelative
6537 lbl87mod2a: DirectIndirectLong
6553 lbl8Cmod2a: Absolute
6557 lbl8Dmod2a: Absolute
6561 lbl8Emod2a: Absolute
6565 lbl8Fmod2a: AbsoluteLong
6572 lbl91mod2a: DirectIndirectIndexed0
6576 lbl92mod2a: DirectIndirect
6580 lbl93mod2a: StackasmRelativeIndirectIndexed0
6584 lbl94mod2a: DirectIndexedX0
6588 lbl95mod2a: DirectIndexedX0
6592 lbl96mod2a: DirectIndexedY0
6596 lbl97mod2a: DirectIndirectIndexedLong0
6603 lbl99mod2a: AbsoluteIndexedY0
6613 lbl9Cmod2a: Absolute
6617 lbl9Dmod2a: AbsoluteIndexedX0
6621 lbl9Emod2: AbsoluteIndexedX0
6625 lbl9Fmod2a: AbsoluteLongIndexedX0
6632 lblA1mod2a: DirectIndexedIndirect0
6639 lblA3mod2a: StackasmRelative
6655 lblA7mod2a: DirectIndirectLong
6671 lblACmod2a: Absolute
6675 lblADmod2a: Absolute
6679 lblAEmod2a: Absolute
6683 lblAFmod2a: AbsoluteLong
6690 lblB1mod2a: DirectIndirectIndexed0
6694 lblB2mod2a: DirectIndirect
6698 lblB3mod2a: StackasmRelativeIndirectIndexed0
6702 lblB4mod2a: DirectIndexedX0
6706 lblB5mod2a: DirectIndexedX0
6710 lblB6mod2a: DirectIndexedY0
6714 lblB7mod2a: DirectIndirectIndexedLong0
6721 lblB9mod2a: AbsoluteIndexedY0
6731 lblBCmod2a: AbsoluteIndexedX0
6735 lblBDmod2a: AbsoluteIndexedX0
6739 lblBEmod2a: AbsoluteIndexedY0
6743 lblBFmod2a: AbsoluteLongIndexedX0
6750 lblC1mod2a: DirectIndexedIndirect0
6758 lblC3mod2a: StackasmRelative
6774 lblC7mod2a: DirectIndirectLong
6790 lblCCmod2a: Absolute
6794 lblCDmod2a: Absolute
6798 lblCEmod2a: Absolute
6802 lblCFmod2a: AbsoluteLong
6809 lblD1mod2a: DirectIndirectIndexed0
6813 lblD2mod2a: DirectIndirect
6817 lblD3mod2a: StackasmRelativeIndirectIndexed0
6824 lblD5mod2a: DirectIndexedX0
6828 lblD6mod2a: DirectIndexedX0
6832 lblD7mod2a: DirectIndirectIndexedLong0
6839 lblD9mod2a: AbsoluteIndexedY0
6852 lblDDmod2a: AbsoluteIndexedX0
6856 lblDEmod2a: AbsoluteIndexedX0
6860 lblDFmod2a: AbsoluteLongIndexedX0
6867 lblE1mod2a: DirectIndexedIndirect0
6875 lblE3mod2a: StackasmRelative
6891 lblE7mod2a: DirectIndirectLong
6898 lblE9mod2a: Immediate8
6908 lblECmod2a: Absolute
6912 lblEDmod2a: Absolute
6916 lblEEmod2a: Absolute
6920 lblEFmod2a: AbsoluteLong
6927 lblF1mod2a: DirectIndirectIndexed0
6931 lblF2mod2a: DirectIndirect
6935 lblF3mod2a: StackasmRelativeIndirectIndexed0
6942 lblF5mod2a: DirectIndexedX0
6946 lblF6mod2a: DirectIndexedX0
6950 lblF7mod2a: DirectIndirectIndexedLong0
6957 lblF9mod2a: AbsoluteIndexedY0
6970 lblFDmod2a: AbsoluteIndexedX0
6974 lblFEmod2a: AbsoluteIndexedX0
6978 lblFFmod2a: AbsoluteLongIndexedX0
6985 jumptable3: .long Op00mod3
7245 lbl01mod3a: DirectIndexedIndirect0
7252 lbl03mod3a: StackasmRelative
7268 lbl07mod3a: DirectIndirectLong
7284 lbl0Cmod3a: Absolute
7288 lbl0Dmod3a: Absolute
7292 lbl0Emod3a: Absolute
7296 lbl0Fmod3a: AbsoluteLong
7303 lbl11mod3a: DirectIndirectIndexed0
7307 lbl12mod3a: DirectIndirect
7311 lbl13mod3a: StackasmRelativeIndirectIndexed0
7319 lbl15mod3a: DirectIndexedX0
7323 lbl16mod3a: DirectIndexedX0
7327 lbl17mod3a: DirectIndirectIndexedLong0
7334 lbl19mod3a: AbsoluteIndexedY0
7344 lbl1Cmod3a: Absolute
7348 lbl1Dmod3a: AbsoluteIndexedX0
7352 lbl1Emod3a: AbsoluteIndexedX0
7356 lbl1Fmod3a: AbsoluteLongIndexedX0
7363 lbl21mod3a: DirectIndexedIndirect0
7370 lbl23mod3a: StackasmRelative
7386 lbl27mod3a: DirectIndirectLong
7403 lbl2Cmod3a: Absolute
7407 lbl2Dmod3a: Absolute
7411 lbl2Emod3a: Absolute
7415 lbl2Fmod3a: AbsoluteLong
7422 lbl31mod3a: DirectIndirectIndexed0
7426 lbl32mod3a: DirectIndirect
7430 lbl33mod3a: StackasmRelativeIndirectIndexed0
7434 lbl34mod3a: DirectIndexedX0
7438 lbl35mod3a: DirectIndexedX0
7442 lbl36mod3a: DirectIndexedX0
7446 lbl37mod3a: DirectIndirectIndexedLong0
7453 lbl39mod3a: AbsoluteIndexedY0
7463 lbl3Cmod3a: AbsoluteIndexedX0
7467 lbl3Dmod3a: AbsoluteIndexedX0
7471 lbl3Emod3a: AbsoluteIndexedX0
7475 lbl3Fmod3a: AbsoluteLongIndexedX0
7483 lbl41mod3a: DirectIndexedIndirect0
7490 lbl43mod3a: StackasmRelative
7505 lbl47mod3a: DirectIndirectLong
7524 lbl4Dmod3a: Absolute
7528 lbl4Emod3a: Absolute
7532 lbl4Fmod3a: AbsoluteLong
7539 lbl51mod3a: DirectIndirectIndexed0
7543 lbl52mod3a: DirectIndirect
7547 lbl53mod3a: StackasmRelativeIndirectIndexed0
7554 lbl55mod3a: DirectIndexedX0
7558 lbl56mod3a: DirectIndexedX0
7562 lbl57mod3a: DirectIndirectIndexedLong0
7569 lbl59mod3a: AbsoluteIndexedY0
7582 lbl5Dmod3a: AbsoluteIndexedX0
7586 lbl5Emod3a: AbsoluteIndexedX0
7590 lbl5Fmod3a: AbsoluteLongIndexedX0
7597 lbl61mod3a: DirectIndexedIndirect0
7604 lbl63mod3a: StackasmRelative
7622 lbl67mod3a: DirectIndirectLong
7630 lbl69mod3a: Immediate16
7644 lbl6Dmod3a: Absolute
7648 lbl6Emod3a: Absolute
7652 lbl6Fmod3a: AbsoluteLong
7659 lbl71mod3a: DirectIndirectIndexed0
7663 lbl72mod3a: DirectIndirect
7667 lbl73mod3a: StackasmRelativeIndirectIndexed0
7672 lbl74mod3a: DirectIndexedX0
7676 lbl75mod3a: DirectIndexedX0
7681 lbl76mod3a: DirectIndexedX0
7685 lbl77mod3a: DirectIndirectIndexedLong0
7692 lbl79mod3a: AbsoluteIndexedY0
7702 lbl7Cmod3: AbsoluteIndexedIndirectX0
7706 lbl7Dmod3a: AbsoluteIndexedX0
7710 lbl7Emod3a: AbsoluteIndexedX0
7714 lbl7Fmod3a: AbsoluteLongIndexedX0
7722 lbl81mod3a: DirectIndexedIndirect0
7729 lbl83mod3a: StackasmRelative
7745 lbl87mod3a: DirectIndirectLong
7761 lbl8Cmod3a: Absolute
7765 lbl8Dmod3a: Absolute
7769 lbl8Emod3a: Absolute
7773 lbl8Fmod3a: AbsoluteLong
7780 lbl91mod3a: DirectIndirectIndexed0
7784 lbl92mod3a: DirectIndirect
7788 lbl93mod3a: StackasmRelativeIndirectIndexed0
7792 lbl94mod3a: DirectIndexedX0
7796 lbl95mod3a: DirectIndexedX0
7800 lbl96mod3a: DirectIndexedY0
7804 lbl97mod3a: DirectIndirectIndexedLong0
7811 lbl99mod3a: AbsoluteIndexedY0
7821 lbl9Cmod3a: Absolute
7825 lbl9Dmod3a: AbsoluteIndexedX0
7829 lbl9Emod3: AbsoluteIndexedX0
7833 lbl9Fmod3a: AbsoluteLongIndexedX0
7840 lblA1mod3a: DirectIndexedIndirect0
7847 lblA3mod3a: StackasmRelative
7863 lblA7mod3a: DirectIndirectLong
7879 lblACmod3a: Absolute
7883 lblADmod3a: Absolute
7887 lblAEmod3a: Absolute
7891 lblAFmod3a: AbsoluteLong
7898 lblB1mod3a: DirectIndirectIndexed0
7902 lblB2mod3a: DirectIndirect
7906 lblB3mod3a: StackasmRelativeIndirectIndexed0
7910 lblB4mod3a: DirectIndexedX0
7914 lblB5mod3a: DirectIndexedX0
7918 lblB6mod3a: DirectIndexedY0
7922 lblB7mod3a: DirectIndirectIndexedLong0
7929 lblB9mod3a: AbsoluteIndexedY0
7939 lblBCmod3a: AbsoluteIndexedX0
7943 lblBDmod3a: AbsoluteIndexedX0
7947 lblBEmod3a: AbsoluteIndexedY0
7951 lblBFmod3a: AbsoluteLongIndexedX0
7958 lblC1mod3a: DirectIndexedIndirect0
7966 lblC3mod3a: StackasmRelative
7982 lblC7mod3a: DirectIndirectLong
7998 lblCCmod3a: Absolute
8002 lblCDmod3a: Absolute
8006 lblCEmod3a: Absolute
8010 lblCFmod3a: AbsoluteLong
8017 lblD1mod3a: DirectIndirectIndexed0
8021 lblD2mod3a: DirectIndirect
8025 lblD3mod3a: StackasmRelativeIndirectIndexed0
8032 lblD5mod3a: DirectIndexedX0
8036 lblD6mod3a: DirectIndexedX0
8040 lblD7mod3a: DirectIndirectIndexedLong0
8047 lblD9mod3a: AbsoluteIndexedY0
8060 lblDDmod3a: AbsoluteIndexedX0
8064 lblDEmod3a: AbsoluteIndexedX0
8068 lblDFmod3a: AbsoluteLongIndexedX0
8075 lblE1mod3a: DirectIndexedIndirect0
8083 lblE3mod3a: StackasmRelative
8099 lblE7mod3a: DirectIndirectLong
8106 lblE9mod3a: Immediate16
8116 lblECmod3a: Absolute
8120 lblEDmod3a: Absolute
8124 lblEEmod3a: Absolute
8128 lblEFmod3a: AbsoluteLong
8135 lblF1mod3a: DirectIndirectIndexed0
8139 lblF2mod3a: DirectIndirect
8143 lblF3mod3a: StackasmRelativeIndirectIndexed0
8150 lblF5mod3a: DirectIndexedX0
8154 lblF6mod3a: DirectIndexedX0
8158 lblF7mod3a: DirectIndirectIndexedLong0
8165 lblF9mod3a: AbsoluteIndexedY0
8178 lblFDmod3a: AbsoluteIndexedX0
8182 lblFEmod3a: AbsoluteIndexedX0
8186 lblFFmod3a: AbsoluteLongIndexedX0
8191 jumptable4: .long Op00mod4
8451 lbl01mod4a: DirectIndexedIndirect1
8458 lbl03mod4a: StackasmRelative
8474 lbl07mod4a: DirectIndirectLong
8490 lbl0Cmod4a: Absolute
8494 lbl0Dmod4a: Absolute
8498 lbl0Emod4a: Absolute
8502 lbl0Fmod4a: AbsoluteLong
8509 lbl11mod4a: DirectIndirectIndexed1
8513 lbl12mod4a: DirectIndirect
8517 lbl13mod4a: StackasmRelativeIndirectIndexed1
8525 lbl15mod4a: DirectIndexedX1
8529 lbl16mod4a: DirectIndexedX1
8533 lbl17mod4a: DirectIndirectIndexedLong1
8540 lbl19mod4a: AbsoluteIndexedY1
8550 lbl1Cmod4a: Absolute
8554 lbl1Dmod4a: AbsoluteIndexedX1
8558 lbl1Emod4a: AbsoluteIndexedX1
8562 lbl1Fmod4a: AbsoluteLongIndexedX1
8569 lbl21mod4a: DirectIndexedIndirect1
8576 lbl23mod4a: StackasmRelative
8592 lbl27mod4a: DirectIndirectLong
8609 lbl2Cmod4a: Absolute
8613 lbl2Dmod4a: Absolute
8617 lbl2Emod4a: Absolute
8621 lbl2Fmod4a: AbsoluteLong
8628 lbl31mod4a: DirectIndirectIndexed1
8632 lbl32mod4a: DirectIndirect
8636 lbl33mod4a: StackasmRelativeIndirectIndexed1
8640 lbl34mod4a: DirectIndexedX1
8644 lbl35mod4a: DirectIndexedX1
8648 lbl36mod4a: DirectIndexedX1
8652 lbl37mod4a: DirectIndirectIndexedLong1
8659 lbl39mod4a: AbsoluteIndexedY1
8669 lbl3Cmod4a: AbsoluteIndexedX1
8673 lbl3Dmod4a: AbsoluteIndexedX1
8677 lbl3Emod4a: AbsoluteIndexedX1
8681 lbl3Fmod4a: AbsoluteLongIndexedX1
8689 lbl41mod4a: DirectIndexedIndirect1
8696 lbl43mod4a: StackasmRelative
8711 lbl47mod4a: DirectIndirectLong
8730 lbl4Dmod4a: Absolute
8734 lbl4Emod4a: Absolute
8738 lbl4Fmod4a: AbsoluteLong
8745 lbl51mod4a: DirectIndirectIndexed1
8749 lbl52mod4a: DirectIndirect
8753 lbl53mod4a: StackasmRelativeIndirectIndexed1
8760 lbl55mod4a: DirectIndexedX1
8764 lbl56mod4a: DirectIndexedX1
8768 lbl57mod4a: DirectIndirectIndexedLong1
8775 lbl59mod4a: AbsoluteIndexedY1
8788 lbl5Dmod4a: AbsoluteIndexedX1
8792 lbl5Emod4a: AbsoluteIndexedX1
8796 lbl5Fmod4a: AbsoluteLongIndexedX1
8803 lbl61mod4a: DirectIndexedIndirect1
8810 lbl63mod4a: StackasmRelative
8828 lbl67mod4a: DirectIndirectLong
8836 lbl69mod4a: Immediate16
8850 lbl6Dmod4a: Absolute
8854 lbl6Emod4a: Absolute
8858 lbl6Fmod4a: AbsoluteLong
8865 lbl71mod4a: DirectIndirectIndexed1
8869 lbl72mod4a: DirectIndirect
8873 lbl73mod4a: StackasmRelativeIndirectIndexed1
8878 lbl74mod4a: DirectIndexedX1
8882 lbl75mod4a: DirectIndexedX1
8887 lbl76mod4a: DirectIndexedX1
8891 lbl77mod4a: DirectIndirectIndexedLong1
8898 lbl79mod4a: AbsoluteIndexedY1
8908 lbl7Cmod4: AbsoluteIndexedIndirectX1
8912 lbl7Dmod4a: AbsoluteIndexedX1
8916 lbl7Emod4a: AbsoluteIndexedX1
8920 lbl7Fmod4a: AbsoluteLongIndexedX1
8928 lbl81mod4a: DirectIndexedIndirect1
8935 lbl83mod4a: StackasmRelative
8951 lbl87mod4a: DirectIndirectLong
8967 lbl8Cmod4a: Absolute
8971 lbl8Dmod4a: Absolute
8975 lbl8Emod4a: Absolute
8979 lbl8Fmod4a: AbsoluteLong
8986 lbl91mod4a: DirectIndirectIndexed1
8990 lbl92mod4a: DirectIndirect
8994 lbl93mod4a: StackasmRelativeIndirectIndexed1
8998 lbl94mod4a: DirectIndexedX1
9002 lbl95mod4a: DirectIndexedX1
9006 lbl96mod4a: DirectIndexedY1
9010 lbl97mod4a: DirectIndirectIndexedLong1
9017 lbl99mod4a: AbsoluteIndexedY1
9027 lbl9Cmod4a: Absolute
9031 lbl9Dmod4a: AbsoluteIndexedX1
9035 lbl9Emod4: AbsoluteIndexedX1
9039 lbl9Fmod4a: AbsoluteLongIndexedX1
9046 lblA1mod4a: DirectIndexedIndirect1
9053 lblA3mod4a: StackasmRelative
9069 lblA7mod4a: DirectIndirectLong
9085 lblACmod4a: Absolute
9089 lblADmod4a: Absolute
9093 lblAEmod4a: Absolute
9097 lblAFmod4a: AbsoluteLong
9104 lblB1mod4a: DirectIndirectIndexed1
9108 lblB2mod4a: DirectIndirect
9112 lblB3mod4a: StackasmRelativeIndirectIndexed1
9116 lblB4mod4a: DirectIndexedX1
9120 lblB5mod4a: DirectIndexedX1
9124 lblB6mod4a: DirectIndexedY1
9128 lblB7mod4a: DirectIndirectIndexedLong1
9135 lblB9mod4a: AbsoluteIndexedY1
9145 lblBCmod4a: AbsoluteIndexedX1
9149 lblBDmod4a: AbsoluteIndexedX1
9153 lblBEmod4a: AbsoluteIndexedY1
9157 lblBFmod4a: AbsoluteLongIndexedX1
9164 lblC1mod4a: DirectIndexedIndirect1
9172 lblC3mod4a: StackasmRelative
9188 lblC7mod4a: DirectIndirectLong
9204 lblCCmod4a: Absolute
9208 lblCDmod4a: Absolute
9212 lblCEmod4a: Absolute
9216 lblCFmod4a: AbsoluteLong
9223 lblD1mod4a: DirectIndirectIndexed1
9227 lblD2mod4a: DirectIndirect
9231 lblD3mod4a: StackasmRelativeIndirectIndexed1
9238 lblD5mod4a: DirectIndexedX1
9242 lblD6mod4a: DirectIndexedX1
9246 lblD7mod4a: DirectIndirectIndexedLong1
9253 lblD9mod4a: AbsoluteIndexedY1
9266 lblDDmod4a: AbsoluteIndexedX1
9270 lblDEmod4a: AbsoluteIndexedX1
9274 lblDFmod4a: AbsoluteLongIndexedX1
9281 lblE1mod4a: DirectIndexedIndirect1
9289 lblE3mod4a: StackasmRelative
9305 lblE7mod4a: DirectIndirectLong
9312 lblE9mod4a: Immediate16
9322 lblECmod4a: Absolute
9326 lblEDmod4a: Absolute
9330 lblEEmod4a: Absolute
9334 lblEFmod4a: AbsoluteLong
9341 lblF1mod4a: DirectIndirectIndexed1
9345 lblF2mod4a: DirectIndirect
9349 lblF3mod4a: StackasmRelativeIndirectIndexed1
9356 lblF5mod4a: DirectIndexedX1
9360 lblF6mod4a: DirectIndexedX1
9364 lblF7mod4a: DirectIndirectIndexedLong1
9371 lblF9mod4a: AbsoluteIndexedY1
9384 lblFDmod4a: AbsoluteIndexedX1
9388 lblFEmod4a: AbsoluteIndexedX1
9392 lblFFmod4a: AbsoluteLongIndexedX1