2 /****************************************************************
3 ****************************************************************/
7 .equiv ASM_SPC700, 1 ;@ 1 = use notaz's ASM_SPC700 core
9 /****************************************************************
11 ****************************************************************/
15 rstatus .req R4 @ format : 0xff800000
16 reg_d_bank .req R4 @ format : 0x000000ll
17 reg_a .req R5 @ format : 0xhhll0000 or 0xll000000
18 reg_d .req R6 @ format : 0xhhll0000
19 reg_p_bank .req R6 @ format : 0x000000ll
20 reg_x .req R7 @ format : 0xhhll0000 or 0xll000000
21 reg_s .req R8 @ format : 0x0000hhll
22 reg_y .req R9 @ format : 0xhhll0000 or 0xll000000
24 rpc .req R10 @ 32bits address
25 reg_cycles .req R11 @ 32bits counter
26 regpcbase .req R12 @ 32bits address
28 rscratch .req R0 @ format : 0xhhll0000 if data and calculation or return of S9XREADBYTE or WORD
29 regopcode .req R0 @ format : 0x000000ll
30 rscratch2 .req R1 @ format : 0xhhll for calculation and value
32 rscratch4 .req R3 @ ??????
35 rscratch9 .req R10 @ ??????
42 @ R13 @ Pointer 32 bit on a struct.
58 .equ STATUS_SHIFTER, 24
59 .equ MASK_EMUL, (1<<(STATUS_SHIFTER-1))
60 .equ MASK_SHIFTER_CARRY, (STATUS_SHIFTER+1)
61 .equ MASK_CARRY, (1<<(STATUS_SHIFTER)) @ 0
62 .equ MASK_ZERO, (2<<(STATUS_SHIFTER)) @ 1
63 .equ MASK_IRQ, (4<<(STATUS_SHIFTER)) @ 2
64 .equ MASK_DECIMAL, (8<<(STATUS_SHIFTER)) @ 3
65 .equ MASK_INDEX, (16<<(STATUS_SHIFTER)) @ 4 @ 1
66 .equ MASK_MEM, (32<<(STATUS_SHIFTER)) @ 5 @ 2
67 .equ MASK_OVERFLOW, (64<<(STATUS_SHIFTER)) @ 6 @ 4
68 .equ MASK_NEG, (128<<(STATUS_SHIFTER))@ 7 @ 8
71 .equ SLOW_ONE_CYCLE, 8
73 .equ NMI_FLAG, (1 << 7)
74 .equ IRQ_PENDING_FLAG, (1 << 11)
75 .equ SCAN_KEYS_FLAG, (1 << 4)
78 .equ MEMMAP_BLOCK_SIZE, (0x1000)
80 .equ MEMMAP_MASK, (0xFFF)
82 /****************************************************************
84 ****************************************************************/
86 @ #include "os9x_65c816_mac_gen.h"
87 /*****************************************************************/
88 /* Offset in SCPUState structure */
89 /*****************************************************************/
91 .equ BranchSkip_ofs, 4
94 .equ WaitingForInterrupt_ofs, 7
111 .equ PCAtOpcodeStart_ofs, 36
112 .equ WaitAddress_ofs, 40
113 .equ WaitCounter_ofs, 44
114 .equ NextEvent_ofs, 48
115 .equ V_Counter_ofs, 52
116 .equ MemSpeed_ofs, 56
117 .equ MemSpeedx2_ofs, 60
118 .equ FastROMSpeed_ofs, 64
119 .equ AutoSaveTimer_ofs, 68
120 .equ NMITriggerPoint_ofs, 72
121 .equ NMICycleCount_ofs, 76
122 .equ IRQCycleCount_ofs, 80
126 .equ SRAMModified_ofs, 86
127 .equ BRKTriggered_ofs, 87
128 .equ asm_OPTABLE_ofs, 88
129 .equ TriedInterleavedMode2_ofs, 92
132 .equ WriteMap_ofs, 100
133 .equ MemorySpeed_ofs, 104
134 .equ BlockIsRAM_ofs, 108
139 .equ APUExecuting_ofs, 122
141 .equ PALMOS_R9_ofs, 124
142 .equ PALMOS_R10_ofs, 128
147 /*****************************************************************/
150 .macro PREPARE_C_CALL
153 .macro PREPARE_C_CALL_R0
154 STMFD R13!,{R0,R12,R14}
156 .macro PREPARE_C_CALL_R0R1
157 STMFD R13!,{R0,R1,R12,R14}
159 .macro PREPARE_C_CALL_LIGHT
162 .macro PREPARE_C_CALL_LIGHTR12
166 .macro RESTORE_C_CALL
169 .macro RESTORE_C_CALL_R0
170 LDMFD R13!,{R0,R12,R14}
172 .macro RESTORE_C_CALL_R1
173 LDMFD R13!,{R1,R12,R14}
175 .macro RESTORE_C_CALL_LIGHT
178 .macro RESTORE_C_CALL_LIGHTR12
186 add r0,reg_cpu_var,#8
187 ldmia r0,{r1,reg_a,reg_x,reg_y,rpc,reg_cycles,regpcbase}
188 @ rstatus (P) & reg_d_bank
189 mov reg_d_bank,r1,lsl #16
190 mov reg_d_bank,reg_d_bank,lsr #24
192 orrs rstatus, rstatus, r0,lsl #STATUS_SHIFTER @ 24
193 @ if Carry set, then EMULATION bit was set
194 orrcs rstatus,rstatus,#MASK_EMUL
196 mov reg_d,reg_a,lsr #16
197 mov reg_d,reg_d,lsl #8
198 orr reg_d,reg_d,r1,lsl #24
199 mov reg_d,reg_d,ror #24 @ 0xdddd00pb
201 mov reg_s,reg_x,lsr #16
202 @ Shift X,Y & A according to the current mode (INDEX, MEMORY bits)
203 tst rstatus,#MASK_INDEX
204 movne reg_x,reg_x,lsl #24
205 movne reg_y,reg_y,lsl #24
206 moveq reg_x,reg_x,lsl #16
207 moveq reg_y,reg_y,lsl #16
208 tst rstatus,#MASK_MEM
209 movne reg_a,reg_a,lsl #24
210 moveq reg_a,reg_a,lsl #16
213 @ reg_d & reg_p_bank share the same register
214 LDRB reg_p_bank,[reg_cpu_var,#RPB_ofs]
215 LDRH rscratch,[reg_cpu_var,#RD_ofs]
216 ORR reg_d,reg_d,rscratch, LSL #16
217 @ rstatus & reg_d_bank share the same register
218 LDRB reg_d_bank,[reg_cpu_var,#RDB_ofs]
219 LDRH rscratch,[reg_cpu_var,#RP_ofs]
220 ORRS rstatus, rstatus, rscratch,LSL #STATUS_SHIFTER @ 24
221 @ if Carry set, then EMULATION bit was set
222 ORRCS rstatus,rstatus,#MASK_EMUL
224 LDRH reg_a,[reg_cpu_var,#RA_ofs]
225 LDRH reg_x,[reg_cpu_var,#RX_ofs]
226 LDRH reg_y,[reg_cpu_var,#RY_ofs]
227 LDRH reg_s,[reg_cpu_var,#RS_ofs]
228 @ Shift X,Y & A according to the current mode (INDEX, MEMORY bits)
229 TST rstatus,#MASK_INDEX
230 MOVNE reg_x,reg_x,LSL #24
231 MOVNE reg_y,reg_y,LSL #24
232 MOVEQ reg_x,reg_x,LSL #16
233 MOVEQ reg_y,reg_y,LSL #16
234 TST rstatus,#MASK_MEM
235 MOVNE reg_a,reg_a,LSL #24
236 MOVEQ reg_a,reg_a,LSL #16
238 LDR regpcbase,[reg_cpu_var,#PCBase_ofs]
239 LDR rpc,[reg_cpu_var,#PC_ofs]
240 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs]
247 @ reg_p_bank, reg_d_bank and rstatus
248 mov r1, rstatus, lsr #16
249 orr r1, r1, reg_p_bank, lsl #24
251 orrcs r1, r1, #0x100 @ EMULATION bit
252 orr r1, r1, reg_d_bank, lsl #24
255 tst rstatus,#MASK_MEM
256 ldrneh r0, [reg_cpu_var,#RA_ofs]
258 orrne reg_a, r0, reg_a,lsr #24
259 moveq reg_a, reg_a, lsr #16
260 mov reg_d, reg_d, lsr #16
261 orr reg_a, reg_a, reg_d, lsl #16
262 @ Shift X&Y according to the current mode (INDEX, MEMORY bits)
263 tst rstatus,#MASK_INDEX
264 movne reg_x,reg_x,LSR #24
265 movne reg_y,reg_y,LSR #24
266 moveq reg_x,reg_x,LSR #16
267 moveq reg_y,reg_y,LSR #16
269 orr reg_x, reg_x, reg_s, lsl #16
271 add r0,reg_cpu_var,#8
272 stmia r0,{r1,reg_a,reg_x,reg_y,rpc,reg_cycles,regpcbase}
275 @ reg_d & reg_p_bank is same register
276 STRB reg_p_bank,[reg_cpu_var,#RPB_ofs]
277 MOV rscratch,reg_d, LSR #16
278 STRH rscratch,[reg_cpu_var,#RD_ofs]
279 @ rstatus & reg_d_bank is same register
280 STRB reg_d_bank,[reg_cpu_var,#RDB_ofs]
281 MOVS rscratch, rstatus, LSR #STATUS_SHIFTER
282 ORRCS rscratch,rscratch,#0x100 @ EMULATION bit
283 STRH rscratch,[reg_cpu_var,#RP_ofs]
285 @ Shift X,Y & A according to the current mode (INDEX, MEMORY bits)
286 TST rstatus,#MASK_INDEX
287 MOVNE rscratch,reg_x,LSR #24
288 MOVNE rscratch2,reg_y,LSR #24
289 MOVEQ rscratch,reg_x,LSR #16
290 MOVEQ rscratch2,reg_y,LSR #16
291 STRH rscratch,[reg_cpu_var,#RX_ofs]
292 STRH rscratch2,[reg_cpu_var,#RY_ofs]
293 TST rstatus,#MASK_MEM
294 LDRNEH rscratch,[reg_cpu_var,#RA_ofs]
295 BICNE rscratch,rscratch,#0xFF
296 ORRNE rscratch,rscratch,reg_a,LSR #24
297 MOVEQ rscratch,reg_a,LSR #16
298 STRH rscratch,[reg_cpu_var,#RA_ofs]
300 STRH reg_s,[reg_cpu_var,#RS_ofs]
301 STR regpcbase,[reg_cpu_var,#PCBase_ofs]
302 STR rpc,[reg_cpu_var,#PC_ofs]
304 STR reg_cycles,[reg_cpu_var,#Cycles_ofs]
308 /*****************************************************************/
310 add reg_cycles,reg_cycles, #ONE_CYCLE
313 addne reg_cycles,reg_cycles, #ONE_CYCLE
316 addeq reg_cycles,reg_cycles, #ONE_CYCLE
320 add reg_cycles,reg_cycles, #(ONE_CYCLE*2)
323 addne reg_cycles,reg_cycles, #(ONE_CYCLE*2)
326 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
327 add reg_cycles,reg_cycles, #(ONE_CYCLE*2)
328 add reg_cycles, reg_cycles, rscratch, LSL #1
331 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
332 add reg_cycles,reg_cycles, #(ONE_CYCLE*2)
333 add reg_cycles, reg_cycles, rscratch
337 add reg_cycles,reg_cycles, #(ONE_CYCLE*3)
341 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
342 add reg_cycles,reg_cycles, #ONE_CYCLE
343 add reg_cycles, reg_cycles, rscratch
347 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
348 add reg_cycles,reg_cycles, #ONE_CYCLE
349 add reg_cycles, reg_cycles, rscratch, lsl #1
353 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
354 add reg_cycles, reg_cycles, rscratch
358 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
359 add reg_cycles, reg_cycles, rscratch, lsl #1
363 ldr rscratch,[reg_cpu_var,#MemSpeed_ofs]
364 add reg_cycles, rscratch, reg_cycles
365 add reg_cycles, reg_cycles, rscratch, lsl #1
370 BIC rstatus,rstatus,#MASK_DECIMAL
373 ORR rstatus,rstatus,#MASK_DECIMAL
376 ORR rstatus,rstatus,#MASK_IRQ
379 BIC rstatus,rstatus,#MASK_IRQ
383 @ if (Settings.Shutdown && CPU.PC == CPU.WaitAddress)
384 LDR rscratch,[reg_cpu_var,#WaitAddress_ofs]
387 @ if (CPU.WaitCounter == 0 && !(CPU.Flags & (IRQ_PENDING_FLAG | NMI_FLAG)))
388 LDR rscratch,[reg_cpu_var,#Flags_ofs]
389 LDR rscratch2,[reg_cpu_var,#WaitCounter_ofs]
390 TST rscratch,#(IRQ_PENDING_FLAG|NMI_FLAG)
392 MOVS rscratch2,rscratch2
394 @ CPU.WaitAddress = NULL;
396 STR rscratch,[reg_cpu_var,#WaitAddress_ofs]
398 @ S9xSA1ExecuteDuringSleep (); : TODO
400 @ CPU.Cycles = CPU.NextEvent;
401 LDR reg_cycles,[reg_cpu_var,#NextEvent_ofs]
402 LDRB r0,[reg_cpu_var,#APUExecuting_ofs]
405 @ if (IAPU.APUExecuting)
407 ICPU.CPUExecuting = FALSE;
411 } while (APU.Cycles < CPU.NextEvent);
412 ICPU.CPUExecuting = TRUE;
420 if (CPU.WaitCounter >= 2)
427 @ SUBLS rscratch2,rscratch2,#1
429 STR rscratch2,[reg_cpu_var,#WaitCounter_ofs]
434 /*in rsctach : OpAddress
435 /*destroy rscratch2*/
436 LDRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
437 MOVS rscratch2,rscratch2
440 STRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
441 SUB rscratch2,rpc,regpcbase
442 @ if( CPU.PC - CPU.PCBase > OpAddress) return;
443 CMP rscratch2,rscratch
448 /*in rsctach : OpAddress
449 /*destroy rscratch2*/
450 LDRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
451 MOVS rscratch2,rscratch2
454 STRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
455 SUB rscratch2,rpc,regpcbase
456 @ if( CPU.PC - CPU.PCBase > OpAddress) return;
457 CMP rscratch2,rscratch
462 /*in rsctach : OpAddress
463 /*destroy rscratch2*/
464 LDRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
465 MOVS rscratch2,rscratch2
468 STRB rscratch2,[reg_cpu_var,#BranchSkip_ofs]
469 SUB rscratch2,rpc,regpcbase
470 @ if( CPU.PC - CPU.PCBase > OpAddress) return;
471 CMP rscratch2,rscratch
477 @ in : rscratch (0x00hhmmll)
481 LDR rpc,[reg_cpu_var,#PC_ofs]
482 LDR regpcbase,[reg_cpu_var,#PCBase_ofs]
486 TST rstatus,#MASK_EMUL
487 LDRNE rscratch, = jumptable1 @ Mode 0 : M=1,X=1
490 TST rstatus,#MASK_MEM
493 TST rstatus,#MASK_INDEX
494 @ INDEX=1 @ Mode 0 : M=1,X=1
495 LDRNE rscratch, = jumptable1
496 @ INDEX=0 @ Mode 1 : M=1,X=0
497 LDREQ rscratch, = jumptable2
500 TST rstatus,#MASK_INDEX
501 @ INDEX=1 @ Mode 3 : M=0,X=1
502 LDRNE rscratch, = jumptable4
503 @ INDEX=0 @ Mode 2 : M=0,X=0
504 LDREQ rscratch, = jumptable3
506 STR rscratch,[reg_cpu_var,#asm_OPTABLE_ofs]
524 .macro S9xDoHBlankProcessing
527 @ BL asm_S9xDoHBlankProcessing
528 BL S9xDoHBlankProcessing @ let's go straight to number one
533 /********************************/
535 LDR R1,[reg_cpu_var,#asm_OPTABLE_ofs]
536 STR rpc,[reg_cpu_var,#PCAtOpcodeStart_ofs]
540 LDR PC, [R1,R0, LSL #2]
543 LDR rscratch,[reg_cpu_var,#NextEvent_ofs]
544 CMP reg_cycles,rscratch
546 S9xDoHBlankProcessing
550 .macro asmAPU_EXECUTE
551 LDRB R0,[reg_cpu_var,#APUExecuting_ofs]
552 CMP R0,#1 @ spc700 enabled, hack mode off
554 LDR R0,[reg_cpu_var,#APU_Cycles]
555 SUBS R0,reg_cycles,R0
558 PREPARE_C_CALL_LIGHTR12
560 RESTORE_C_CALL_LIGHTR12
561 SUB R0,reg_cycles,R0 @ sub cycles left
562 STR R0,[reg_cpu_var,#APU_Cycles]
565 STR reg_cycles,[reg_cpu_var,#Cycles_ofs]
566 PREPARE_C_CALL_LIGHTR12
568 RESTORE_C_CALL_LIGHTR12
569 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs]
576 .macro asmAPU_EXECUTE2
578 LDRB R0,[reg_cpu_var,#APUExecuting_ofs]
579 CMP R0,#1 @ spc700 enabled, hack mode off
581 LDR R0,[reg_cpu_var,#APU_Cycles]
582 SUBS R0,reg_cycles,R0 @ reg_cycles == NextEvent
584 PREPARE_C_CALL_LIGHTR12
586 RESTORE_C_CALL_LIGHTR12
587 SUB R0,reg_cycles,R0 @ sub cycles left
588 STR R0,[reg_cpu_var,#APU_Cycles]
592 STR reg_cycles,[reg_cpu_var,#Cycles_ofs]
593 PREPARE_C_CALL_LIGHTR12
595 RESTORE_C_CALL_LIGHTR12
596 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs]
601 @ #include "os9x_65c816_mac_mem.h"
603 @ in : rscratch (0x00hhmmll)
604 @ out : rscratch (0xhhll0000)
605 STMFD R13!,{PC} @ Push return address
611 @ in : rscratch (0x00hhmmll)
612 @ out : rscratch (0x0000hhll)
613 STMFD R13!,{PC} @ Push return address
617 .macro S9xGetWordRegStatus reg
618 @ in : rscratch (0x00hhmmll)
619 @ out : reg (0xhhll0000)
620 @ flags have to be updated with read value
621 STMFD R13!,{PC} @ Push return address
624 MOVS \reg, R0, LSL #16
626 .macro S9xGetWordRegNS reg
627 @ in : rscratch (0x00hhmmll)
628 @ out : reg (0xhhll0000)
629 @ DOES NOT DESTROY rscratch (R0)
631 STMFD R13!,{PC} @ Push return address
634 MOV \reg, R0, LSL #16
637 .macro S9xGetWordLowRegNS reg
638 @ in : rscratch (0x00hhmmll)
639 @ out : reg (0xhhll0000)
640 @ DOES NOT DESTROY rscratch (R0)
642 STMFD R13!,{PC} @ Push return address
650 @ in : rscratch (0x00hhmmll)
651 @ out : rscratch (0xll000000)
652 STMFD R13!,{PC} @ Push return address
658 @ in : rscratch (0x00hhmmll)
659 @ out : rscratch (0x000000ll)
664 .macro S9xGetByteRegStatus reg
665 @ in : rscratch (0x00hhmmll)
666 @ out : reg (0xll000000)
667 @ flags have to be updated with read value
668 STMFD R13!,{PC} @ Push return address
671 MOVS \reg, R0, LSL #24
673 .macro S9xGetByteRegNS reg
674 @ in : rscratch (0x00hhmmll)
675 @ out : reg (0xll000000)
676 @ DOES NOT DESTROY rscratch (R0)
678 STMFD R13!,{PC} @ Push return address
681 MOVS \reg, R0, LSL #24
684 .macro S9xGetByteLowRegNS reg
685 @ in : rscratch (0x00hhmmll)
686 @ out : reg (0x000000ll)
687 @ DOES NOT DESTROY rscratch (R0)
689 STMFD R13!,{PC} @ Push return address
696 .macro S9xSetWord regValue
697 @ in : regValue (0xhhll0000)
698 @ in : rscratch=address (0x00hhmmll)
699 STMFD R13!,{PC} @ Push return address
700 MOV R1,\regValue, LSR #16
704 .macro S9xSetWordZero
705 @ in : rscratch=address (0x00hhmmll)
706 STMFD R13!,{PC} @ Push return address
711 .macro S9xSetWordLow regValue
712 @ in : regValue (0x0000hhll)
713 @ in : rscratch=address (0x00hhmmll)
714 STMFD R13!,{PC} @ Push return address
719 .macro S9xSetByte regValue
720 @ in : regValue (0xll000000)
721 @ in : rscratch=address (0x00hhmmll)
722 STMFD R13!,{PC} @ Push return address
723 MOV R1,\regValue, LSR #24
727 .macro S9xSetByteZero
728 @ in : rscratch=address (0x00hhmmll)
729 STMFD R13!,{PC} @ Push return address
734 .macro S9xSetByteLow regValue
735 @ in : regValue (0x000000ll)
736 @ in : rscratch=address (0x00hhmmll)
737 STMFD R13!,{PC} @ Push return address
744 @ ===========================================
745 @ ===========================================
747 @ ===========================================
748 @ ===========================================
753 LDRB rscratch2 , [rpc, #1]
754 LDRB rscratch , [rpc],#2
755 ORR rscratch , rscratch, rscratch2, LSL #8
756 ORR rscratch , rscratch, reg_d_bank, LSL #16
758 .macro AbsoluteIndexedIndirectX0
760 LDRB rscratch2 , [rpc, #1]
761 LDRB rscratch , [rpc], #2
762 ORR rscratch , rscratch, rscratch2, LSL #8
763 ADD rscratch , reg_x, rscratch, LSL #16
764 MOV rscratch , rscratch, LSR #16
765 ORR rscratch , rscratch, reg_p_bank, LSL #16
769 .macro AbsoluteIndexedIndirectX1
771 LDRB rscratch2 , [rpc, #1]
772 LDRB rscratch , [rpc], #2
773 ORR rscratch , rscratch, rscratch2, LSL #8
774 ADD rscratch , rscratch, reg_x, LSR #24
775 BIC rscratch , rscratch, #0x00FF0000
776 ORR rscratch , rscratch, reg_p_bank, LSL #16
780 .macro AbsoluteIndirectLong
782 LDRB rscratch2 , [rpc, #1]
783 LDRB rscratch , [rpc], #2
784 ORR rscratch , rscratch, rscratch2, LSL #8
785 S9xGetWordLowRegNS rscratch2
786 ADD rscratch , rscratch, #2
787 STMFD r13!,{rscratch2}
789 LDMFD r13!,{rscratch2}
790 ORR rscratch , rscratch2, rscratch, LSL #16
792 .macro AbsoluteIndirect
794 LDRB rscratch2 , [rpc,#1]
795 LDRB rscratch , [rpc], #2
796 ORR rscratch , rscratch, rscratch2, LSL #8
798 ORR rscratch , rscratch, reg_p_bank, LSL #16
800 .macro AbsoluteIndexedX0
802 LDRB rscratch2 , [rpc, #1]
803 LDRB rscratch , [rpc], #2
804 ORR rscratch , rscratch, rscratch2, LSL #8
805 ORR rscratch , rscratch, reg_d_bank, LSL #16
806 ADD rscratch , rscratch, reg_x, LSR #16
808 .macro AbsoluteIndexedX1
810 LDRB rscratch2 , [rpc, #1]
811 LDRB rscratch , [rpc], #2
812 ORR rscratch , rscratch, rscratch2, LSL #8
813 ORR rscratch , rscratch, reg_d_bank, LSL #16
814 ADD rscratch , rscratch, reg_x, LSR #24
818 .macro AbsoluteIndexedY0
820 LDRB rscratch2 , [rpc, #1]
821 LDRB rscratch , [rpc], #2
822 ORR rscratch , rscratch, rscratch2, LSL #8
823 ORR rscratch , rscratch, reg_d_bank, LSL #16
824 ADD rscratch , rscratch, reg_y, LSR #16
826 .macro AbsoluteIndexedY1
828 LDRB rscratch2 , [rpc, #1]
829 LDRB rscratch , [rpc], #2
830 ORR rscratch , rscratch, rscratch2, LSL #8
831 ORR rscratch , rscratch, reg_d_bank, LSL #16
832 ADD rscratch , rscratch, reg_y, LSR #24
836 LDRB rscratch2 , [rpc, #1]
837 LDRB rscratch , [rpc], #2
838 ORR rscratch , rscratch, rscratch2, LSL #8
839 LDRB rscratch2 , [rpc], #1
840 ORR rscratch , rscratch, rscratch2, LSL #16
844 .macro AbsoluteLongIndexedX0
846 LDRB rscratch2 , [rpc, #1]
847 LDRB rscratch , [rpc], #2
848 ORR rscratch , rscratch, rscratch2, LSL #8
849 LDRB rscratch2 , [rpc], #1
850 ORR rscratch , rscratch, rscratch2, LSL #16
851 ADD rscratch , rscratch, reg_x, LSR #16
852 BIC rscratch, rscratch, #0xFF000000
854 .macro AbsoluteLongIndexedX1
856 LDRB rscratch2 , [rpc, #1]
857 LDRB rscratch , [rpc], #2
858 ORR rscratch , rscratch, rscratch2, LSL #8
859 LDRB rscratch2 , [rpc], #1
860 ORR rscratch , rscratch, rscratch2, LSL #16
861 ADD rscratch , rscratch, reg_x, LSR #24
862 BIC rscratch, rscratch, #0xFF000000
866 LDRB rscratch , [rpc], #1
867 ADD rscratch , reg_d, rscratch, LSL #16
868 MOV rscratch, rscratch, LSR #16
870 .macro DirectIndirect
872 LDRB rscratch , [rpc], #1
873 ADD rscratch , reg_d, rscratch, LSL #16
874 MOV rscratch, rscratch, LSR #16
876 ORR rscratch , rscratch, reg_d_bank, LSL #16
878 .macro DirectIndirectLong
880 LDRB rscratch , [rpc], #1
881 ADD rscratch , reg_d, rscratch, LSL #16
882 MOV rscratch, rscratch, LSR #16
883 S9xGetWordLowRegNS rscratch2
884 ADD rscratch , rscratch,#2
885 STMFD r13!,{rscratch2}
887 LDMFD r13!,{rscratch2}
888 ORR rscratch , rscratch2, rscratch, LSL #16
890 .macro DirectIndirectIndexed0
892 LDRB rscratch , [rpc], #1
893 ADD rscratch , reg_d, rscratch, LSL #16
894 MOV rscratch, rscratch, LSR #16
896 ORR rscratch, rscratch,reg_d_bank, LSL #16
897 ADD rscratch, rscratch,reg_y, LSR #16
899 .macro DirectIndirectIndexed1
901 LDRB rscratch , [rpc], #1
902 ADD rscratch , reg_d, rscratch, LSL #16
903 MOV rscratch, rscratch, LSR #16
905 ORR rscratch, rscratch,reg_d_bank, LSL #16
906 ADD rscratch, rscratch,reg_y, LSR #24
908 .macro DirectIndirectIndexedLong0
910 LDRB rscratch , [rpc], #1
911 ADD rscratch , reg_d, rscratch, LSL #16
912 MOV rscratch, rscratch, LSR #16
913 S9xGetWordLowRegNS rscratch2
914 ADD rscratch , rscratch,#2
915 STMFD r13!,{rscratch2}
917 LDMFD r13!,{rscratch2}
918 ORR rscratch , rscratch2, rscratch, LSL #16
919 ADD rscratch, rscratch,reg_y, LSR #16
921 .macro DirectIndirectIndexedLong1
923 LDRB rscratch , [rpc], #1
924 ADD rscratch , reg_d, rscratch, LSL #16
925 MOV rscratch, rscratch, LSR #16
926 S9xGetWordLowRegNS rscratch2
927 ADD rscratch , rscratch,#2
928 STMFD r13!,{rscratch2}
930 LDMFD r13!,{rscratch2}
931 ORR rscratch , rscratch2, rscratch, LSL #16
932 ADD rscratch, rscratch,reg_y, LSR #24
934 .macro DirectIndexedIndirect0
936 LDRB rscratch , [rpc], #1
937 ADD rscratch2 , reg_d , reg_x
938 ADD rscratch , rscratch2 , rscratch, LSL #16
939 MOV rscratch, rscratch, LSR #16
941 ORR rscratch , rscratch , reg_d_bank, LSL #16
943 .macro DirectIndexedIndirect1
945 LDRB rscratch , [rpc], #1
946 ADD rscratch2 , reg_d , reg_x, LSR #8
947 ADD rscratch , rscratch2 , rscratch, LSL #16
948 MOV rscratch, rscratch, LSR #16
950 ORR rscratch , rscratch , reg_d_bank, LSL #16
952 .macro DirectIndexedX0
954 LDRB rscratch , [rpc], #1
955 ADD rscratch2 , reg_d , reg_x
956 ADD rscratch , rscratch2 , rscratch, LSL #16
957 MOV rscratch, rscratch, LSR #16
959 .macro DirectIndexedX1
961 LDRB rscratch , [rpc], #1
962 ADD rscratch2 , reg_d , reg_x, LSR #8
963 ADD rscratch , rscratch2 , rscratch, LSL #16
964 MOV rscratch, rscratch, LSR #16
966 .macro DirectIndexedY0
968 LDRB rscratch , [rpc], #1
969 ADD rscratch2 , reg_d , reg_y
970 ADD rscratch , rscratch2 , rscratch, LSL #16
971 MOV rscratch, rscratch, LSR #16
973 .macro DirectIndexedY1
975 LDRB rscratch , [rpc], #1
976 ADD rscratch2 , reg_d , reg_y, LSR #8
977 ADD rscratch , rscratch2 , rscratch, LSL #16
978 MOV rscratch, rscratch, LSR #16
981 ADD rscratch, rpc, reg_p_bank, LSL #16
982 SUB rscratch, rscratch, regpcbase
986 ADD rscratch, rpc, reg_p_bank, LSL #16
987 SUB rscratch, rscratch, regpcbase
992 LDRSB rscratch , [rpc],#1
993 ADD rscratch , rscratch , rpc
994 SUB rscratch , rscratch, regpcbase
995 BIC rscratch,rscratch,#0x00FF0000
996 BIC rscratch,rscratch,#0xFF000000
998 .macro asmRelativeLong
1000 LDRB rscratch2 , [rpc, #1]
1001 LDRB rscratch , [rpc], #2
1002 ORR rscratch , rscratch, rscratch2, LSL #8
1003 SUB rscratch2 , rpc, regpcbase
1004 ADD rscratch , rscratch2, rscratch
1005 BIC rscratch,rscratch,#0x00FF0000
1009 .macro StackasmRelative
1011 LDRB rscratch , [rpc], #1
1012 ADD rscratch , rscratch, reg_s
1013 BIC rscratch,rscratch,#0x00FF0000
1015 .macro StackasmRelativeIndirectIndexed0
1017 LDRB rscratch , [rpc], #1
1018 ADD rscratch , rscratch, reg_s
1019 BIC rscratch,rscratch,#0x00FF0000
1021 ORR rscratch , rscratch, reg_d_bank, LSL #16
1022 ADD rscratch , rscratch, reg_y, LSR #16
1023 BIC rscratch, rscratch, #0xFF000000
1025 .macro StackasmRelativeIndirectIndexed1
1027 LDRB rscratch , [rpc], #1
1028 ADD rscratch , rscratch, reg_s
1029 BIC rscratch,rscratch,#0x00FF0000
1031 ORR rscratch , rscratch, reg_d_bank, LSL #16
1032 ADD rscratch , rscratch, reg_y, LSR #24
1033 BIC rscratch, rscratch, #0xFF000000
1037 /****************************************/
1049 SUB rscratch,reg_s,#1
1054 MOV rscratch2,rscratch
1055 SUB rscratch,reg_s,#1
1056 S9xSetWordLow rscratch2
1060 SUB rscratch,reg_s,#1
1068 ADD rscratch,reg_s,#1
1071 MOV \reg,rscratch,LSL #24
1074 ADD rscratch,reg_s,#1
1079 ADD rscratch,reg_s,#1
1085 ADD rscratch,reg_s,#1
1090 ADD rscratch,reg_s,#1
1093 MOV \reg,rscratch,LSL #16
1097 ADD rscratch,reg_s,#1
1106 ADD rscratch,reg_s,#1
1109 MOVS \reg,rscratch,LSL #24
1112 ADD rscratch,reg_s,#1
1115 MOVS rscratch,rscratch,LSL #24
1117 .macro PullBLowS reg
1118 ADD rscratch,reg_s,#1
1124 ADD rscratch,reg_s,#1
1127 MOVS rscratch,rscratch
1130 ADD rscratch,reg_s,#1
1133 MOVS \reg,rscratch, LSL #16
1136 ADD rscratch,reg_s,#1
1139 MOVS rscratch,rscratch, LSL #16
1141 .macro PullWLowS reg
1142 ADD rscratch,reg_s,#1
1148 ADD rscratch,reg_s,#1
1151 MOVS rscratch,rscratch
1155 .globl asmS9xGetByte
1156 .globl asmS9xGetWord
1157 .globl asmS9xSetByte
1158 .globl asmS9xSetWord
1160 @ uint8 aaS9xGetByte(uint32 address);
1162 @ in : R0 = 0x00hhmmll
1163 @ out : R0 = 0x000000ll
1164 @ DESTROYED : R1,R2,R3
1165 @ UPDATE : reg_cycles
1167 MOV R1,R0,LSR #MEMMAP_SHIFT
1168 @ MEMMAP_SHIFT is 12, Address is 0xFFFFFFFF at max, so
1169 @ R1 is maxed by 0x000FFFFF, MEMMAP_MASK is 0x1000-1=0xFFF
1170 @ so AND MEMMAP_MASK is BIC 0xFF000
1172 @ R2 <= Map[block] (GetAddress)
1173 LDR R2,[reg_cpu_var,#Map_ofs]
1174 LDR R2,[R2,R1,LSL #2]
1176 BLO GBSpecial @ special
1177 @ Direct ROM/RAM acess
1178 @ R2 <= GetAddress + Address & 0xFFFF
1179 @ R3 <= MemorySpeed[block]
1180 LDR R3,[reg_cpu_var,#MemorySpeed_ofs]
1183 ADD R2,R2,R0,LSR #16
1185 ADD reg_cycles,reg_cycles,R3
1186 @ R3 = BlockIsRAM[block]
1187 LDR R3,[reg_cpu_var,#BlockIsRAM_ofs]
1188 @ Get value to return
1192 @ if BlockIsRAM => update for CPUShutdown
1193 LDRNE R1,[reg_cpu_var,#PCAtOpcodeStart_ofs]
1194 STRNE R1,[reg_cpu_var,#WaitAddress_ofs]
1196 LDMFD R13!,{PC} @ Return
1199 LDR PC,[PC,R2,LSL #2]
1200 MOV R0,R0 @ nop, for align
1218 LDRB R1,[reg_cpu_var,#InDMA_ofs]
1220 ADDEQ reg_cycles,reg_cycles,#ONE_CYCLE @ No -> update Cycles
1221 MOV R0,R0,LSL #16 @ S9xGetPPU(Address&0xFFFF);
1222 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1227 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1228 LDMFD R13!,{PC} @ Return
1230 ADD reg_cycles,reg_cycles,#ONE_CYCLE @ update Cycles
1231 MOV R0,R0,LSL #16 @ S9xGetCPU(Address&0xFFFF);
1232 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1237 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1238 LDMFD R13!,{PC} @ Return
1240 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1241 MOV R0,R0,LSL #16 @ S9xGetCPU(Address&0xFFFF);
1242 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1247 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1248 LDMFD R13!,{PC} @ Return
1250 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1251 LDRH R2,[reg_cpu_var,#SRAMMask]
1252 LDR R1,[reg_cpu_var,#SRAM]
1253 AND R0,R2,R0 @ Address&SRAMMask
1254 LDRB R0,[R1,R0] @ *Memory.SRAM + Address&SRAMMask
1258 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1262 MOV R1,R1,LSR #17 @ Address&0x7FFF
1263 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1265 LDRH R2,[reg_cpu_var,#SRAMMask]
1266 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1267 LDR R1,[reg_cpu_var,#SRAM]
1268 AND R0,R2,R0 @ Address&SRAMMask
1269 LDRB R0,[R1,R0] @ *Memory.SRAM + Address&SRAMMask
1270 LDMFD R13!,{PC} @ return
1275 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1279 /*ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1283 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1284 MOV R0,R0,LSL #16 @ S9xGetC4(Address&0xFFFF);
1285 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1290 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1291 LDMFD R13!,{PC} @ Return
1295 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1296 MOV R0,R0,LSR #17 @ Address&0x7FFF
1297 LDR R1,[reg_cpu_var,#BWRAM]
1298 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
1299 LDRB R0,[R0,R1] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
1303 @ uint16 aaS9xGetWord(uint32 address);
1305 @ in : R0 = 0x00hhmmll
1306 @ out : R0 = 0x000000ll
1307 @ DESTROYED : R1,R2,R3
1308 @ UPDATE : reg_cycles
1333 MOV R1,R0,LSR #MEMMAP_SHIFT
1334 @ MEMMAP_SHIFT is 12, Address is 0xFFFFFFFF at max, so
1335 @ R1 is maxed by 0x000FFFFF, MEMMAP_MASK is 0x1000-1=0xFFF
1336 @ so AND MEMMAP_MASK is BIC 0xFF000
1338 @ R2 <= Map[block] (GetAddress)
1339 LDR R2,[reg_cpu_var,#Map_ofs]
1340 LDR R2,[R2,R1,LSL #2]
1342 BLO GWSpecial @ special
1343 @ Direct ROM/RAM acess
1347 @ R2 <= GetAddress + Address & 0xFFFF
1348 @ R3 <= MemorySpeed[block]
1349 LDR R3,[reg_cpu_var,#MemorySpeed_ofs]
1354 ADD reg_cycles,reg_cycles,R3, LSL #1
1355 @ R3 = BlockIsRAM[block]
1356 LDR R3,[reg_cpu_var,#BlockIsRAM_ofs]
1357 @ Get value to return
1361 @ if BlockIsRAM => update for CPUShutdown
1362 LDRNE R1,[reg_cpu_var,#PCAtOpcodeStart_ofs]
1363 STRNE R1,[reg_cpu_var,#WaitAddress_ofs]
1365 LDMFD R13!,{PC} @ Return
1370 LDRB R3,[R2,R3,LSR #16] @ GetAddress+ (Address+1)&0xFFFF
1371 LDRB R0,[R2,R0,LSR #16] @ GetAddress+ Address&0xFFFF
1374 @ if BlockIsRAM => update for CPUShutdown
1375 LDR R3,[reg_cpu_var,#BlockIsRAM_ofs]
1376 LDR R2,[reg_cpu_var,#MemorySpeed_ofs]
1377 LDRB R3,[R3,R1] @ R3 = BlockIsRAM[block]
1378 LDRB R2,[R2,R1] @ R2 <= MemorySpeed[block]
1379 MOVS R3,R3 @ IsRAM ? CPUShutdown stuff
1380 LDRNE R1,[reg_cpu_var,#PCAtOpcodeStart_ofs]
1381 STRNE R1,[reg_cpu_var,#WaitAddress_ofs]
1382 ADD reg_cycles,reg_cycles,R2, LSL #1 @ Update CPU.Cycles
1383 LDMFD R13!,{PC} @ Return
1385 LDR PC,[PC,R2,LSL #2]
1386 MOV R0,R0 @ nop, for align
1402 /* MAP_PPU, MAP_CPU, MAP_DSP, MAP_LOROM_SRAM, MAP_HIROM_SRAM,
1403 MAP_NONE, MAP_DEBUG, MAP_C4, MAP_BWRAM, MAP_BWRAM_BITMAP,
1404 MAP_BWRAM_BITMAP2, MAP_SA1RAM, MAP_LAST*/
1408 LDRB R1,[reg_cpu_var,#InDMA_ofs]
1410 ADDEQ reg_cycles,reg_cycles,#(ONE_CYCLE*2) @ No -> update Cycles
1411 MOV R0,R0,LSL #16 @ S9xGetPPU(Address&0xFFFF);
1412 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1419 @ BIC R0,R0,#0x10000
1423 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1424 LDMFD R13!,{PC} @ Return
1426 ADD reg_cycles,reg_cycles,#(ONE_CYCLE*2) @ update Cycles
1427 MOV R0,R0,LSL #16 @ S9xGetCPU(Address&0xFFFF);
1428 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1435 @ BIC R0,R0,#0x10000
1439 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1440 LDMFD R13!,{PC} @ Return
1442 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1443 MOV R0,R0,LSL #16 @ S9xGetCPU(Address&0xFFFF);
1444 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1451 @ BIC R0,R0,#0x10000
1455 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1456 LDMFD R13!,{PC} @ Return
1458 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1462 LDRH R2,[reg_cpu_var,#SRAMMask]
1463 LDR R1,[reg_cpu_var,#SRAM]
1464 AND R3,R2,R0 @ Address&SRAMMask
1465 LDRH R0,[R3,R1] @ *Memory.SRAM + Address&SRAMMask
1466 LDMFD R13!,{PC} @ return
1468 LDRH R2,[reg_cpu_var,#SRAMMask]
1469 LDR R1,[reg_cpu_var,#SRAM]
1470 AND R3,R2,R0 @ Address&SRAMMask
1472 AND R2,R0,R2 @ Address&SRAMMask
1473 LDRB R3,[R1,R3] @ *Memory.SRAM + Address&SRAMMask
1474 LDRB R2,[R1,R2] @ *Memory.SRAM + Address&SRAMMask
1476 LDMFD R13!,{PC} @ return
1479 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1486 MOV R1,R1,LSR #17 @ Address&0x7FFF
1487 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1489 LDRH R2,[reg_cpu_var,#SRAMMask]
1490 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1491 LDR R1,[reg_cpu_var,#SRAM]
1492 AND R0,R2,R0 @ Address&SRAMMask
1493 LDRH R0,[R1,R0] @ *Memory.SRAM + Address&SRAMMask
1494 LDMFD R13!,{PC} @ return
1499 MOV R3,R3,LSR #17 @ Address&0x7FFF
1500 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1503 SUB R2,R2,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1506 MOV R3,R3,LSR #17 @ (Address+1)&0x7FFF
1507 MOV R0,R0,LSR #3 @ ((Address+1)&0xF0000 >> 3)
1509 LDRH R3,[reg_cpu_var,#SRAMMask] @ reload mask
1510 SUB R0,R0,#0x6000 @ (((Address+1) & 0x7fff) - 0x6000 + (((Address+1) & 0xf0000) >> 3))
1511 AND R2,R3,R2 @ Address...&SRAMMask
1512 AND R0,R3,R0 @ (Address+1...)&SRAMMask
1514 LDR R3,[reg_cpu_var,#SRAM]
1515 LDRB R0,[R0,R3] @ *Memory.SRAM + (Address...)&SRAMMask
1516 LDRB R2,[R2,R3] @ *Memory.SRAM + (Address+1...)&SRAMMask
1519 LDMFD R13!,{PC} @ return
1524 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1529 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1533 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1534 MOV R0,R0,LSL #16 @ S9xGetC4(Address&0xFFFF);
1535 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1542 @ BIC R0,R0,#0x10000
1546 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1547 LDMFD R13!,{PC} @ Return
1552 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1553 MOV R0,R0,LSR #17 @ Address&0x7FFF
1554 LDR R1,[reg_cpu_var,#BWRAM]
1555 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
1556 LDRH R0,[R1,R0] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
1557 LDMFD R13!,{PC} @ return
1560 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1562 MOV R0,R0,LSR #17 @ Address&0x7FFF
1563 MOV R3,R3,LSR #17 @ (Address+1)&0x7FFF
1564 LDR R1,[reg_cpu_var,#BWRAM]
1565 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
1566 SUB R3,R3,#0x6000 @ (((Address+1) & 0x7fff) - 0x6000)
1567 LDRB R0,[R1,R0] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
1568 LDRB R3,[R1,R3] @ *Memory.BWRAM + (((Address+1) & 0x7fff) - 0x6000)
1570 LDMFD R13!,{PC} @ return
1575 @ void aaS9xSetByte(uint32 address,uint8 val);
1577 @ in : R0=0x00hhmmll R1=0x000000ll
1578 @ DESTROYED : R0,R1,R2,R3
1579 @ UPDATE : reg_cycles
1582 STR R2,[reg_cpu_var,#WaitAddress_ofs]
1586 MOV R3,R0,LSR #MEMMAP_SHIFT
1587 @ MEMMAP_SHIFT is 12, Address is 0xFFFFFFFF at max, so
1588 @ R0 is maxed by 0x000FFFFF, MEMMAP_MASK is 0x1000-1=0xFFF
1589 @ so AND MEMMAP_MASK is BIC 0xFF000
1591 @ R2 <= Map[block] (SetAddress)
1592 LDR R2,[reg_cpu_var,#WriteMap_ofs]
1593 LDR R2,[R2,R3,LSL #2]
1595 BLO SBSpecial @ special
1596 @ Direct ROM/RAM acess
1598 @ R2 <= SetAddress + Address & 0xFFFF
1600 ADD R2,R2,R0,LSR #16
1601 LDR R0,[reg_cpu_var,#MemorySpeed_ofs]
1604 @ R0 <= MemorySpeed[block]
1607 ADD reg_cycles,reg_cycles,R0
1609 @ only SA1 here : TODO
1613 LDR PC,[PC,R2,LSL #2]
1614 MOV R0,R0 @ nop, for align
1632 LDRB R2,[reg_cpu_var,#InDMA_ofs]
1634 ADDEQ reg_cycles,reg_cycles,#ONE_CYCLE @ No -> update Cycles
1636 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1644 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1645 LDMFD R13!,{PC} @ Return
1647 ADD reg_cycles,reg_cycles,#ONE_CYCLE @ update Cycles
1649 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1650 MOV R0,R0,LSR #16 @ Address&0xFFFF
1657 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1658 LDMFD R13!,{PC} @ Return
1660 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1662 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1663 MOV R0,R0,LSR #16 @ Address&0xFFFF
1670 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1671 LDMFD R13!,{PC} @ Return
1673 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1674 LDRH R2,[reg_cpu_var,#SRAMMask]
1676 LDMEQFD R13!,{PC} @ return if SRAMMask=0
1677 LDR R3,[reg_cpu_var,#SRAM]
1678 AND R0,R2,R0 @ Address&SRAMMask
1679 STRB R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1682 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1683 LDMFD R13!,{PC} @ return
1686 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1690 MOV R3,R3,LSR #17 @ Address&0x7FFF
1691 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1694 LDRH R2,[reg_cpu_var,#SRAMMask]
1696 LDMEQFD R13!,{PC} @ return if SRAMMask=0
1698 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1699 LDR R3,[reg_cpu_var,#SRAM]
1700 AND R0,R2,R0 @ Address&SRAMMask
1701 STRB R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1704 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1705 LDMFD R13!,{PC} @ return
1710 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1713 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1715 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1716 MOV R0,R0,LSR #16 @ Address&0xFFFF
1723 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1724 LDMFD R13!,{PC} @ Return
1727 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1728 MOV R0,R0,LSR #17 @ Address&0x7FFF
1729 LDR R2,[reg_cpu_var,#BWRAM]
1730 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
1731 STRB R1,[R0,R2] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
1734 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1740 @ void aaS9xSetWord(uint32 address,uint16 val);
1742 @ in : R0 = 0x00hhmmll R1=0x0000hhll
1743 @ DESTROYED : R0,R1,R2,R3
1744 @ UPDATE : reg_cycles
1768 STR R2,[reg_cpu_var,#WaitAddress_ofs]
1771 MOV R3,R0,LSR #MEMMAP_SHIFT
1772 @ MEMMAP_SHIFT is 12, Address is 0xFFFFFFFF at max, so
1773 @ R1 is maxed by 0x000FFFFF, MEMMAP_MASK is 0x1000-1=0xFFF
1774 @ so AND MEMMAP_MASK is BIC 0xFF000
1776 @ R2 <= Map[block] (SetAddress)
1777 LDR R2,[reg_cpu_var,#WriteMap_ofs]
1778 LDR R2,[R2,R3,LSL #2]
1780 BLO SWSpecial @ special
1781 @ Direct ROM/RAM acess
1784 @ check if address is 16bits aligned or not
1789 ADD R2,R2,R0,LSR #16 @ address & 0xFFFF + SetAddress
1790 LDR R0,[reg_cpu_var,#MemorySpeed_ofs]
1793 @ R1 <= MemorySpeed[block]
1796 ADD reg_cycles,reg_cycles,R0, LSL #1
1798 @ only SA1 here : TODO
1803 @ R1 = (Address&0xFFFF)<<16
1805 @ First write @address
1806 STRB R1,[R2,R0,LSR #16]
1809 @ Second write @address+1
1810 STRB R1,[R2,R0,LSR #16]
1811 @ R1 <= MemorySpeed[block]
1812 LDR R0,[reg_cpu_var,#MemorySpeed_ofs]
1815 ADD reg_cycles,reg_cycles,R0,LSL #1
1817 @ only SA1 here : TODO
1821 LDR PC,[PC,R2,LSL #2]
1822 MOV R0,R0 @ nop, for align
1840 LDRB R2,[reg_cpu_var,#InDMA_ofs]
1842 ADDEQ reg_cycles,reg_cycles,#(ONE_CYCLE*2) @ No -> update Cycles
1844 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1857 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1858 LDMFD R13!,{PC} @ Return
1860 ADD reg_cycles,reg_cycles,#(ONE_CYCLE*2) @ update Cycles
1862 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1863 MOV R0,R0,LSR #16 @ Address&0xFFFF
1875 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1876 LDMFD R13!,{PC} @ Return
1878 ADD reg_cycles,reg_cycles,#SLOW_ONE_CYCLE @ update Cycles
1880 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1881 MOV R0,R0,LSR #16 @ Address&0xFFFF
1893 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1894 LDMFD R13!,{PC} @ Return
1896 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1897 LDRH R2,[reg_cpu_var,#SRAMMask]
1899 LDMEQFD R13!,{PC} @ return if SRAMMask=0
1901 AND R3,R2,R0 @ Address&SRAMMask
1905 LDR R0,[reg_cpu_var,#SRAM]
1906 STRH R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1908 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1909 LDMFD R13!,{PC} @ return
1913 AND R2,R2,R0 @ (Address+1)&SRAMMask
1914 LDR R0,[reg_cpu_var,#SRAM]
1915 STRB R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1917 STRB R1,[R0,R2] @ *Memory.SRAM + (Address+1)&SRAMMask
1919 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1920 LDMFD R13!,{PC} @ return
1923 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1925 LDRH R2,[reg_cpu_var,#SRAMMask]
1927 LDMEQFD R13!,{PC} @ return if SRAMMask=0
1934 MOV R3,R3,LSR #17 @ Address&0x7FFF
1935 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1937 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1938 LDRH R2,[reg_cpu_var,#SRAMMask]
1939 LDR R3,[reg_cpu_var,#SRAM]
1940 AND R0,R2,R0 @ Address&SRAMMask
1941 STRH R1,[R0,R3] @ *Memory.SRAM + Address&SRAMMask
1943 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1944 LDMFD R13!,{PC} @ return
1948 MOV R3,R3,LSR #17 @ Address&0x7FFF
1949 MOV R2,R2,LSR #3 @ (Address&0xF0000 >> 3)
1951 SUB R2,R2,#0x6000 @ ((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3))
1956 MOV R3,R3,LSR #17 @ (Address+1)&0x7FFF
1957 MOV R0,R0,LSR #3 @ ((Address+1)&0xF0000 >> 3)
1959 LDRH R3,[reg_cpu_var,#SRAMMask] @ reload mask
1960 SUB R0,R0,#0x6000 @ (((Address+1) & 0x7fff) - 0x6000 + (((Address+1) & 0xf0000) >> 3))
1961 AND R2,R3,R2 @ Address...&SRAMMask
1962 AND R0,R3,R0 @ (Address+1...)&SRAMMask
1964 LDR R3,[reg_cpu_var,#SRAM]
1965 STRB R1,[R2,R3] @ *Memory.SRAM + (Address...)&SRAMMask
1967 STRB R1,[R0,R3] @ *Memory.SRAM + (Address+1...)&SRAMMask
1970 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
1971 LDMFD R13!,{PC} @ return
1976 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1977 LDMFD R13!,{PC} @ return
1979 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
1981 STR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Save Cycles
1982 MOV R0,R0,LSR #16 @ Address&0xFFFF
1994 LDR reg_cycles,[reg_cpu_var,#Cycles_ofs] @ Load Cycles
1995 LDMFD R13!,{PC} @ Return
1997 ADD reg_cycles,reg_cycles,#(SLOW_ONE_CYCLE*2) @ update Cycles
2002 LDR R2,[reg_cpu_var,#BWRAM]
2003 MOV R0,R0,LSR #17 @ Address&0x7FFF
2004 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
2006 STRH R1,[R0,R2] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
2007 STRB R3,[reg_cpu_var,#SRAMModified_ofs]
2008 LDMFD R13!,{PC} @ return
2012 MOV R0,R0,LSR #17 @ Address&0x7FFF
2013 MOV R3,R3,LSR #17 @ (Address+1)&0x7FFF
2014 LDR R2,[reg_cpu_var,#BWRAM]
2015 SUB R0,R0,#0x6000 @ ((Address & 0x7fff) - 0x6000)
2016 SUB R3,R3,#0x6000 @ (((Address+1) & 0x7fff) - 0x6000)
2017 STRB R1,[R2,R0] @ *Memory.BWRAM + ((Address & 0x7fff) - 0x6000)
2019 STRB R1,[R2,R3] @ *Memory.BWRAM + (((Address+1) & 0x7fff) - 0x6000)
2021 STRB R0,[reg_cpu_var,#SRAMModified_ofs]
2022 LDMFD R13!,{PC} @ return
2028 /*****************************************************************
2030 *****************************************************************/
2033 @ CC : ARM Carry Clear
2034 BICCC rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2035 @ CS : ARM Carry Set
2036 ORRCS rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2039 @ NE : ARM Zero Clear
2040 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2042 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2045 @ NE : ARM Zero Clear
2046 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2048 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2049 @ PL : ARM Neg Clear
2050 BICPL rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2052 ORRMI rstatus, rstatus, #MASK_NEG @ 1 : OR mask 00000100000 : set N to one
2055 /*****************************************************************
2057 *****************************************************************/
2063 TST rstatus, #MASK_DECIMAL
2068 STMFD R13!,{rscratch}
2069 MOV rscratch4,#0x0F000000
2070 @ rscratch2=xxW1xxxxxxxxxxxx
2071 AND rscratch2, rscratch, rscratch4
2072 @ rscratch=xxW2xxxxxxxxxxxx
2073 AND rscratch, rscratch4, rscratch, LSR #4
2074 @ rscratch3=xxA2xxxxxxxxxxxx
2075 AND rscratch3, rscratch4, reg_a, LSR #4
2076 @ rscratch4=xxA1xxxxxxxxxxxx
2077 AND rscratch4,reg_a,rscratch4
2079 TST rstatus, #MASK_CARRY
2080 ADDNE rscratch2, rscratch2, #0x01000000
2081 ADD rscratch2,rscratch2,rscratch4
2083 CMP rscratch2, #0x09000000
2085 SUBGT rscratch2, rscratch2, #0x0A000000
2087 ADDGT rscratch3, rscratch3, #0x01000000
2089 ADD rscratch3, rscratch3, rscratch
2091 CMP rscratch3, #0x09000000
2093 SUBGT rscratch3, rscratch3, #0x0A000000
2095 ORRGT rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2097 BICLE rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2098 @ gather rscratch3 and rscratch2 into ans8
2099 @ rscratch3 : 0R2000000
2100 @ rscratch2 : 0R1000000
2102 ORR rscratch2, rscratch2, rscratch3, LSL #4
2103 LDMFD R13!,{rscratch}
2105 AND rscratch,rscratch,#0x80000000
2106 @ (register.AL ^ Work8)
2107 EORS rscratch3, reg_a, rscratch
2108 BICNE rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2111 EORS rscratch3, rscratch2, rscratch
2113 TSTNE rscratch3,#0x80000000
2114 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2115 ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2117 MOVS reg_a, rscratch2
2122 MOVS rscratch2, rstatus, LSR #MASK_SHIFTER_CARRY
2123 SUBCS rscratch, rscratch, #0x100
2124 ADCS reg_a, reg_a, rscratch, ROR #8
2126 ORRVS rstatus, rstatus, #MASK_OVERFLOW
2127 BICVC rstatus, rstatus, #MASK_OVERFLOW
2131 ANDS reg_a, reg_a, #0xFF000000
2138 TST rstatus, #MASK_DECIMAL
2142 @ rscratch = W3W2W1W0........
2143 LDR rscratch4, = 0x0F0F0000
2144 @ rscratch2 = xxW2xxW0xxxxxx
2145 @ rscratch3 = xxW3xxW1xxxxxx
2146 AND rscratch2, rscratch4, rscratch
2147 AND rscratch3, rscratch4, rscratch, LSR #4
2148 @ rscratch2 = xxW3xxW1xxW2xxW0
2149 ORR rscratch2, rscratch3, rscratch2, LSR #16
2150 @ rscratch3 = xxA2xxA0xxxxxx
2151 @ rscratch4 = xxA3xxA1xxxxxx
2152 @ rscratch2 = xxA3xxA1xxA2xxA0
2153 AND rscratch3, rscratch4, reg_a
2154 AND rscratch4, rscratch4, reg_a, LSR #4
2155 ORR rscratch3, rscratch4, rscratch3, LSR #16
2156 ADD rscratch2, rscratch3, rscratch2
2157 LDR rscratch4, = 0x0F0F0000
2159 TST rstatus, #MASK_CARRY
2160 ADDNE rscratch2, rscratch2, #0x1
2161 @ rscratch2 = A + W + C
2163 AND rscratch3, rscratch2, #0x0000001F
2164 CMP rscratch3, #0x00000009
2165 ADDHI rscratch2, rscratch2, #0x00010000
2166 SUBHI rscratch2, rscratch2, #0x0000000A
2168 AND rscratch3, rscratch2, #0x001F0000
2169 CMP rscratch3, #0x00090000
2170 ADDHI rscratch2, rscratch2, #0x00000100
2171 SUBHI rscratch2, rscratch2, #0x000A0000
2173 AND rscratch3, rscratch2, #0x00001F00
2174 CMP rscratch3, #0x00000900
2175 SUBHI rscratch2, rscratch2, #0x00000A00
2176 ADDHI rscratch2, rscratch2, #0x01000000
2178 AND rscratch3, rscratch2, #0x1F000000
2179 CMP rscratch3, #0x09000000
2180 SUBHI rscratch2, rscratch2, #0x0A000000
2182 ORRHI rstatus, rstatus, #MASK_CARRY
2184 BICLS rstatus, rstatus, #MASK_CARRY
2185 @ rscratch2 = xxR3xxR1xxR2xxR0
2187 @ rscratch3 = xxR3xxR1xxxxxxxx
2188 AND rscratch3, rscratch4, rscratch2
2189 @ rscratch2 = xxR2xxR0xxxxxxxx
2190 AND rscratch2, rscratch4, rscratch2,LSL #16
2191 @ rscratch2 = R3R2R1R0xxxxxxxx
2192 ORR rscratch2, rscratch2,rscratch3,LSL #4
2194 AND rscratch,rscratch,#0x80000000
2195 @ (register.AL ^ Work8)
2196 EORS rscratch3, reg_a, rscratch
2197 BICNE rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2200 EORS rscratch3, rscratch2, rscratch
2201 TSTNE rscratch3,#0x80000000
2202 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2203 ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2205 MOVS reg_a, rscratch2
2210 MOVS rscratch2, rstatus, LSR #MASK_SHIFTER_CARRY
2211 SUBCS rscratch, rscratch, #0x10000
2212 ADCS reg_a, reg_a,rscratch, ROR #16
2214 ORRVS rstatus, rstatus, #MASK_OVERFLOW
2215 BICVC rstatus, rstatus, #MASK_OVERFLOW
2216 MOV reg_a, reg_a, LSR #16
2220 MOVS reg_a, reg_a, LSL #16
2229 ANDS reg_a, reg_a, rscratch
2234 ANDS reg_a, reg_a, rscratch
2239 MOVS reg_a, reg_a, LSL #1
2246 MOVS reg_a, reg_a, LSL #1
2252 S9xGetWordRegNS rscratch2 @ do not destroy Opadress in rscratch
2253 MOVS rscratch2, rscratch2, LSL #1
2256 S9xSetWord rscratch2
2260 S9xGetByteRegNS rscratch2 @ do not destroy Opadress in rscratch
2261 MOVS rscratch2, rscratch2, LSL #1
2264 S9xSetByte rscratch2
2269 MOVS rscratch2, rscratch, LSL #1
2270 @ Trick in ASM : shift one more bit : ARM C = Snes N
2272 @ If Carry Set, then Set Neg in SNES
2273 BICCC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set C to zero
2274 ORRCS rstatus, rstatus, #MASK_NEG @ 1 : OR mask 00000100000 : set C to one
2275 @ If Neg Set, then Set Overflow in SNES
2276 BICPL rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set N to zero
2277 ORRMI rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set N to one
2279 @ Now do a real AND with A register
2280 @ Set Zero Flag, bit test
2281 ANDS rscratch2, reg_a, rscratch
2282 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2283 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2288 MOVS rscratch2, rscratch, LSL #1
2289 @ Trick in ASM : shift one more bit : ARM C = Snes N
2291 @ If Carry Set, then Set Neg in SNES
2292 BICCC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2293 ORRCS rstatus, rstatus, #MASK_NEG @ 1 : OR mask 00000100000 : set N to one
2294 @ If Neg Set, then Set Overflow in SNES
2295 BICPL rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2296 ORRMI rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2297 @ Now do a real AND with A register
2298 @ Set Zero Flag, bit test
2299 ANDS rscratch2, reg_a, rscratch
2300 @ Bit set ->Z=0->xxxNE Clear flag
2301 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2302 @ Bit clear->Z=1->xxxEQ Set flag
2303 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2307 SUBS rscratch2,reg_a,rscratch
2308 BICCC rstatus, rstatus, #MASK_CARRY
2309 ORRCS rstatus, rstatus, #MASK_CARRY
2315 SUBS rscratch2,reg_a,rscratch
2316 BICCC rstatus, rstatus, #MASK_CARRY
2317 ORRCS rstatus, rstatus, #MASK_CARRY
2323 SUBS rscratch2,reg_x,rscratch
2324 BICCC rstatus, rstatus, #MASK_CARRY
2325 ORRCS rstatus, rstatus, #MASK_CARRY
2330 SUBS rscratch2,reg_x,rscratch
2331 BICCC rstatus, rstatus, #MASK_CARRY
2332 ORRCS rstatus, rstatus, #MASK_CARRY
2337 SUBS rscratch2,reg_y,rscratch
2338 BICCC rstatus, rstatus, #MASK_CARRY
2339 ORRCS rstatus, rstatus, #MASK_CARRY
2344 SUBS rscratch2,reg_y,rscratch
2345 BICCC rstatus, rstatus, #MASK_CARRY
2346 ORRCS rstatus, rstatus, #MASK_CARRY
2351 SUBS reg_a, reg_a, #0x01000000
2352 STR rscratch,[reg_cpu_var,#WaitAddress_ofs]
2358 SUBS reg_a, reg_a, #0x00010000
2359 STR rscratch,[reg_cpu_var,#WaitAddress_ofs]
2364 S9xGetWordRegNS rscratch2 @ do not destroy Opadress in rscratch
2366 SUBS rscratch2, rscratch2, #0x00010000
2367 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2369 S9xSetWord rscratch2
2373 S9xGetByteRegNS rscratch2 @ do not destroy Opadress in rscratch
2375 SUBS rscratch2, rscratch2, #0x01000000
2376 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2378 S9xSetByte rscratch2
2383 EORS reg_a, reg_a, rscratch
2388 EORS reg_a, reg_a, rscratch
2393 ADDS reg_a, reg_a, #0x01000000
2394 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2400 ADDS reg_a, reg_a, #0x00010000
2401 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2406 S9xGetWordRegNS rscratch2
2408 ADDS rscratch2, rscratch2, #0x00010000
2409 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2411 S9xSetWord rscratch2
2415 S9xGetByteRegNS rscratch2
2417 ADDS rscratch2, rscratch2, #0x01000000
2418 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2420 S9xSetByte rscratch2
2424 S9xGetWordRegStatus reg_a
2428 S9xGetByteRegStatus reg_a
2432 S9xGetWordRegStatus reg_x
2436 S9xGetByteRegStatus reg_x
2440 S9xGetWordRegStatus reg_y
2444 S9xGetByteRegStatus reg_y
2448 BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2449 MOVS reg_a, reg_a, LSR #17 @ hhhhhhhh llllllll 00000000 00000000 -> 00000000 00000000 0hhhhhhh hlllllll
2451 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2452 MOV reg_a, reg_a, LSL #16 @ -> 0lllllll 00000000 00000000 00000000
2453 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2454 @ Note : the two MOV are included between instruction, to optimize
2460 BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2461 MOVS reg_a, reg_a, LSR #25 @ llllllll 00000000 00000000 00000000 -> 00000000 00000000 00000000 0lllllll
2463 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2464 MOV reg_a, reg_a, LSL #24 @ -> 00000000 00000000 00000000 0lllllll
2465 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2466 @ Note : the two MOV are included between instruction, to optimize
2472 S9xGetWordRegNS rscratch2
2473 @ N set to zero by >> 1 LSR
2474 BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2475 MOVS rscratch2, rscratch2, LSR #17 @ llllllll 00000000 00000000 00000000 -> 00000000 00000000 00000000 0lllllll
2477 BICCC rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2478 ORRCS rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2480 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2481 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2482 S9xSetWordLow rscratch2
2486 S9xGetByteRegNS rscratch2
2487 @ N set to zero by >> 1 LSR
2488 BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
2489 MOVS rscratch2, rscratch2, LSR #25 @ llllllll 00000000 00000000 00000000 -> 00000000 00000000 00000000 0lllllll
2491 BICCC rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2492 ORRCS rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2494 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2495 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2496 S9xSetByteLow rscratch2
2501 ORRS reg_a, reg_a, rscratch
2506 ORRS reg_a, reg_a, rscratch
2510 TST rstatus, #MASK_CARRY
2511 ORRNE reg_a, reg_a, #0x00008000
2512 MOVS reg_a, reg_a, LSL #1
2518 TST rstatus, #MASK_CARRY
2519 ORRNE reg_a, reg_a, #0x00800000
2520 MOVS reg_a, reg_a, LSL #1
2526 S9xGetWordRegNS rscratch2
2527 TST rstatus, #MASK_CARRY
2528 ORRNE rscratch2, rscratch2, #0x00008000
2529 MOVS rscratch2, rscratch2, LSL #1
2532 S9xSetWord rscratch2
2536 S9xGetByteRegNS rscratch2
2537 TST rstatus, #MASK_CARRY
2538 ORRNE rscratch2, rscratch2, #0x00800000
2539 MOVS rscratch2, rscratch2, LSL #1
2542 S9xSetByte rscratch2
2546 MOV reg_a,reg_a, LSR #16
2547 TST rstatus, #MASK_CARRY
2548 ORRNE reg_a, reg_a, #0x00010000
2549 ORRNE rstatus,rstatus,#MASK_NEG
2550 BICEQ rstatus,rstatus,#MASK_NEG
2551 MOVS reg_a,reg_a,LSR #1
2554 MOV reg_a,reg_a, LSL #16
2558 MOV reg_a,reg_a, LSR #24
2559 TST rstatus, #MASK_CARRY
2560 ORRNE reg_a, reg_a, #0x00000100
2561 ORRNE rstatus,rstatus,#MASK_NEG
2562 BICEQ rstatus,rstatus,#MASK_NEG
2563 MOVS reg_a,reg_a,LSR #1
2566 MOV reg_a,reg_a, LSL #24
2570 S9xGetWordLowRegNS rscratch2
2571 TST rstatus, #MASK_CARRY
2572 ORRNE rscratch2, rscratch2, #0x00010000
2573 ORRNE rstatus,rstatus,#MASK_NEG
2574 BICEQ rstatus,rstatus,#MASK_NEG
2575 MOVS rscratch2,rscratch2,LSR #1
2578 S9xSetWordLow rscratch2
2583 S9xGetByteLowRegNS rscratch2
2584 TST rstatus, #MASK_CARRY
2585 ORRNE rscratch2, rscratch2, #0x00000100
2586 ORRNE rstatus,rstatus,#MASK_NEG
2587 BICEQ rstatus,rstatus,#MASK_NEG
2588 MOVS rscratch2,rscratch2,LSR #1
2591 S9xSetByteLow rscratch2
2596 TST rstatus, #MASK_DECIMAL
2601 STMFD R13!,{rscratch9}
2602 MOV rscratch9,#0x000F0000
2603 @ rscratch2 - result
2604 @ rscratch3 - scratch
2605 @ rscratch4 - scratch
2606 @ rscratch9 - pattern
2608 AND rscratch2, rscratch, #0x000F0000
2609 TST rstatus, #MASK_CARRY
2610 ADDEQ rscratch2, rscratch2, #0x00010000 @ W1=W1+!Carry
2611 AND rscratch4, reg_a, #0x000F0000
2612 SUB rscratch2, rscratch4,rscratch2 @ R1=A1-W1-!Carry
2613 CMP rscratch2, #0x00090000 @ if R1 > 9
2614 ADDHI rscratch2, rscratch2, #0x000A0000 @ then R1 += 10
2615 AND rscratch2, rscratch2, #0x000F0000
2617 AND rscratch3, rscratch9, rscratch, LSR #4
2618 ADDHI rscratch3, rscratch3, #0x00010000 @ then (W2++)
2620 AND rscratch4, rscratch9, reg_a, LSR #4
2621 SUB rscratch3, rscratch4, rscratch3 @ R2=A2-W2
2622 CMP rscratch3, #0x00090000 @ if R2 > 9
2623 ADDHI rscratch3, rscratch3, #0x000A0000 @ then R2 += 10
2624 AND rscratch3, rscratch3, #0x000F0000
2625 ORR rscratch2, rscratch2, rscratch3,LSL #4
2627 AND rscratch3, rscratch9, rscratch, LSR #8
2628 ADDHI rscratch3, rscratch3, #0x00010000 @ then (W3++)
2630 AND rscratch4, rscratch9, reg_a, LSR #8
2631 SUB rscratch3, rscratch4, rscratch3 @ R3=A3-W3
2632 CMP rscratch3, #0x00090000 @ if R3 > 9
2633 ADDHI rscratch3, rscratch3, #0x000A0000 @ then R3 += 10
2634 AND rscratch3, rscratch3, #0x000F0000
2635 ORR rscratch2, rscratch2, rscratch3,LSL #8
2637 AND rscratch3, rscratch9, rscratch, LSR #12
2638 ADDHI rscratch3, rscratch3, #0x00010000 @ then (W3++)
2640 AND rscratch4, rscratch9, reg_a, LSR #12
2641 SUB rscratch3, rscratch4, rscratch3 @ R4=A4-W4
2642 CMP rscratch3, #0x00090000 @ if R4 > 9
2643 ADDHI rscratch3, rscratch3, #0x000A0000 @ then R4 += 10
2644 BICHI rstatus, rstatus, #MASK_CARRY @ then ClearCarry
2645 ORRLS rstatus, rstatus, #MASK_CARRY @ else SetCarry
2647 AND rscratch3,rscratch3,#0x000F0000
2648 ORR rscratch2,rscratch2,rscratch3,LSL #12
2650 LDMFD R13!,{rscratch9}
2652 AND reg_a,reg_a,#0x80000000
2653 @ (register.A.W ^ Work8)
2654 EORS rscratch3, reg_a, rscratch
2655 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2657 @ (register.A.W ^ Ans8)
2658 EORS rscratch3, reg_a, rscratch2
2660 TSTNE rscratch3,#0x80000000
2661 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2662 ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2664 MOVS reg_a, rscratch2
2669 MOVS rscratch2,rstatus,LSR #MASK_SHIFTER_CARRY
2670 SBCS reg_a, reg_a, rscratch, LSL #16
2672 ORRVS rstatus, rstatus, #MASK_OVERFLOW
2673 BICVC rstatus, rstatus, #MASK_OVERFLOW
2674 MOV reg_a, reg_a, LSR #16
2677 MOVS reg_a, reg_a, LSL #16
2684 TST rstatus, #MASK_DECIMAL
2687 STMFD R13!,{rscratch}
2688 MOV rscratch4,#0x0F000000
2689 @ rscratch2=xxW1xxxxxxxxxxxx
2690 AND rscratch2, rscratch, rscratch4
2691 @ rscratch=xxW2xxxxxxxxxxxx
2692 AND rscratch, rscratch4, rscratch, LSR #4
2693 @ rscratch3=xxA2xxxxxxxxxxxx
2694 AND rscratch3, rscratch4, reg_a, LSR #4
2695 @ rscratch4=xxA1xxxxxxxxxxxx
2696 AND rscratch4,reg_a,rscratch4
2698 TST rstatus, #MASK_CARRY
2699 ADDEQ rscratch2, rscratch2, #0x01000000
2700 SUB rscratch2,rscratch4,rscratch2
2702 CMP rscratch2, #0x09000000
2704 ADDHI rscratch2, rscratch2, #0x0A000000
2706 ADDHI rscratch, rscratch, #0x01000000
2708 SUB rscratch3, rscratch3, rscratch
2710 CMP rscratch3, #0x09000000
2712 ADDHI rscratch3, rscratch3, #0x0A000000
2714 BICHI rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2716 ORRLS rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
2717 @ gather rscratch3 and rscratch2 into ans8
2718 AND rscratch3,rscratch3,#0x0F000000
2719 AND rscratch2,rscratch2,#0x0F000000
2720 @ rscratch3 : 0R2000000
2721 @ rscratch2 : 0R1000000
2723 ORR rscratch2, rscratch2, rscratch3, LSL #4
2724 LDMFD R13!,{rscratch}
2726 AND reg_a,reg_a,#0x80000000
2727 @ (register.AL ^ Work8)
2728 EORS rscratch3, reg_a, rscratch
2729 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2731 @ (register.AL ^ Ans8)
2732 EORS rscratch3, reg_a, rscratch2
2734 TSTNE rscratch3,#0x80000000
2735 BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
2736 ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
2738 MOVS reg_a, rscratch2
2743 MOVS rscratch2,rstatus,LSR #MASK_SHIFTER_CARRY
2744 SBCS reg_a, reg_a, rscratch, LSL #24
2746 ORRVS rstatus, rstatus, #MASK_OVERFLOW
2747 BICVC rstatus, rstatus, #MASK_OVERFLOW
2751 ANDS reg_a, reg_a, #0xFF000000
2781 S9xGetWordRegNS rscratch2
2782 TST reg_a, rscratch2
2783 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2784 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2785 ORR rscratch2, reg_a, rscratch2
2786 S9xSetWord rscratch2
2790 S9xGetByteRegNS rscratch2
2791 TST reg_a, rscratch2
2792 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2793 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2794 ORR rscratch2, reg_a, rscratch2
2795 S9xSetByte rscratch2
2799 S9xGetWordRegNS rscratch2
2800 TST reg_a, rscratch2
2801 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2802 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2803 MVN rscratch3, reg_a
2804 AND rscratch2, rscratch3, rscratch2
2805 S9xSetWord rscratch2
2809 S9xGetByteRegNS rscratch2
2810 TST reg_a, rscratch2
2811 BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
2812 ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
2813 MVN rscratch3, reg_a
2814 AND rscratch2, rscratch3, rscratch2
2815 S9xSetByte rscratch2
2818 /**************************************************************************/
2821 /**************************************************************************/
2823 .macro Op09M0 /*ORA*/
2824 LDRB rscratch2, [rpc,#1]
2825 LDRB rscratch, [rpc], #2
2826 ORR rscratch2,rscratch,rscratch2,LSL #8
2827 ORRS reg_a,reg_a,rscratch2,LSL #16
2831 .macro Op09M1 /*ORA*/
2832 LDRB rscratch, [rpc], #1
2833 ORRS reg_a,reg_a,rscratch,LSL #24
2837 /***********************************************************************/
2841 TST rstatus, #MASK_CARRY
2843 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2851 TST rstatus, #MASK_CARRY
2853 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2861 TST rstatus, #MASK_ZERO
2863 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2871 TST rstatus, #MASK_ZERO
2873 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2881 TST rstatus, #MASK_NEG
2883 ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
2891 TST rstatus, #MASK_NEG @ neg, z!=0, NE
2893 ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
2901 TST rstatus, #MASK_OVERFLOW @ neg, z!=0, NE
2903 ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
2911 TST rstatus, #MASK_OVERFLOW @ neg, z!=0, NE
2913 ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
2920 ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
2925 /*******************************************************************************************/
2926 /************************************************************/
2927 /* SetFlag Instructions ********************************************************************** */
2929 ORR rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
2942 /****************************************************************************************/
2943 /* ClearFlag Instructions ******************************************************************** */
2945 BIC rstatus, rstatus, #MASK_CARRY
2958 BIC rstatus, rstatus, #MASK_OVERFLOW
2962 /******************************************************************************************/
2963 /* DEX/DEY *********************************************************************************** */
2965 .macro OpCAX1 /*DEX*/
2967 SUBS reg_x, reg_x, #0x01000000
2968 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2972 .macro OpCAX0 /*DEX*/
2974 SUBS reg_x, reg_x, #0x00010000
2975 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2979 .macro Op88X1 /*DEY*/
2981 SUBS reg_y, reg_y, #0x01000000
2982 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2986 .macro Op88X0 /*DEY*/
2988 SUBS reg_y, reg_y, #0x00010000
2989 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
2994 /******************************************************************************************/
2995 /* INX/INY *********************************************************************************** */
2998 ADDS reg_x, reg_x, #0x01000000
2999 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
3005 ADDS reg_x, reg_x, #0x00010000
3006 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
3012 ADDS reg_y, reg_y, #0x01000000
3013 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
3019 ADDS reg_y, reg_y, #0x00010000
3020 STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
3025 /**********************************************************************************************/
3027 /* NOP *************************************************************************************** */
3032 /**************************************************************************/
3033 /* PUSH Instructions **************************************************** */
3055 AND rscratch2, reg_d_bank, #0xFF
3087 /**************************************************************************/
3088 /* PULL Instructions **************************************************** */
3100 BIC reg_d_bank,reg_d_bank, #0xFF
3102 ORR reg_d_bank,reg_d_bank,rscratch, LSR #24
3107 BIC reg_d,reg_d, #0xFF000000
3108 BIC reg_d,reg_d, #0x00FF0000
3110 ORR reg_d,rscratch,reg_d
3114 .macro Op28X1M1 /*PLP*/
3115 @ INDEX set, MEMORY set
3116 BIC rstatus,rstatus,#0xFF000000
3118 ORR rstatus,rscratch,rstatus
3119 TST rstatus, #MASK_INDEX
3120 @ INDEX clear & was set : 8->16
3121 MOVEQ reg_x,reg_x,LSR #8
3122 MOVEQ reg_y,reg_y,LSR #8
3123 TST rstatus, #MASK_MEM
3124 @ MEMORY cleared & was set : 8->16
3125 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
3126 MOVEQ reg_a,reg_a,LSR #8
3127 ORREQ reg_a,reg_a,rscratch, LSL #24
3131 .macro Op28X0M1 /*PLP*/
3132 @ INDEX cleared, MEMORY set
3133 BIC rstatus,rstatus,#0xFF000000
3135 ORR rstatus,rscratch,rstatus
3136 TST rstatus, #MASK_INDEX
3137 @ INDEX set & was cleared : 16->8
3138 MOVNE reg_x,reg_x,LSL #8
3139 MOVNE reg_y,reg_y,LSL #8
3140 TST rstatus, #MASK_MEM
3141 @ MEMORY cleared & was set : 8->16
3142 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
3143 MOVEQ reg_a,reg_a,LSR #8
3144 ORREQ reg_a,reg_a,rscratch, LSL #24
3148 .macro Op28X1M0 /*PLP*/
3149 @ INDEX set, MEMORY set
3150 BIC rstatus,rstatus,#0xFF000000
3152 ORR rstatus,rscratch,rstatus
3153 TST rstatus, #MASK_INDEX
3154 @ INDEX clear & was set : 8->16
3155 MOVEQ reg_x,reg_x,LSR #8
3156 MOVEQ reg_y,reg_y,LSR #8
3157 TST rstatus, #MASK_MEM
3158 @ MEMORY set & was cleared : 16->8
3159 MOVNE rscratch,reg_a,LSR #24
3160 MOVNE reg_a,reg_a,LSL #8
3161 STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
3165 .macro Op28X0M0 /*PLP*/
3166 @ INDEX set, MEMORY set
3167 BIC rstatus,rstatus,#0xFF000000
3169 ORR rstatus,rscratch,rstatus
3170 TST rstatus, #MASK_INDEX
3171 @ INDEX set & was cleared : 16->8
3172 MOVNE reg_x,reg_x,LSL #8
3173 MOVNE reg_y,reg_y,LSL #8
3174 TST rstatus, #MASK_MEM
3175 @ MEMORY set & was cleared : 16->8
3176 MOVNE rscratch,reg_a,LSR #24
3177 MOVNE reg_a,reg_a,LSL #8
3178 STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
3203 /**********************************************************************************************/
3204 /* Transfer Instructions ********************************************************************* */
3205 .macro OpAAX1M1 /*TAX8*/
3210 .macro OpAAX0M1 /*TAX16*/
3211 LDRB reg_x, [reg_cpu_var,#RAH_ofs]
3212 MOV reg_x, reg_x,LSL #24
3213 ORRS reg_x, reg_x,reg_a, LSR #8
3217 .macro OpAAX1M0 /*TAX8*/
3218 MOVS reg_x, reg_a, LSL #8
3222 .macro OpAAX0M0 /*TAX16*/
3227 .macro OpA8X1M1 /*TAY8*/
3232 .macro OpA8X0M1 /*TAY16*/
3233 LDRB reg_y, [reg_cpu_var,#RAH_ofs]
3234 MOV reg_y, reg_y,LSL #24
3235 ORRS reg_y, reg_y,reg_a, LSR #8
3239 .macro OpA8X1M0 /*TAY8*/
3240 MOVS reg_y, reg_a, LSL #8
3244 .macro OpA8X0M0 /*TAY16*/
3250 LDRB rscratch, [reg_cpu_var,#RAH_ofs]
3251 MOV reg_d,reg_d,LSL #16
3252 MOV rscratch,rscratch,LSL #24
3253 ORRS rscratch,rscratch,reg_a, LSR #8
3255 ORR reg_d,rscratch,reg_d,LSR #16
3259 MOV reg_d,reg_d,LSL #16
3262 ORR reg_d,reg_a,reg_d,LSR #16
3266 TST rstatus, #MASK_EMUL
3267 MOVNE reg_s, reg_a, LSR #24
3268 ORRNE reg_s, reg_s, #0x100
3269 LDREQB reg_s, [reg_cpu_var,#RAH_ofs]
3270 ORREQ reg_s, reg_s, reg_a
3271 MOVEQ reg_s, reg_s, ROR #24
3275 MOV reg_s, reg_a, LSR #16
3279 MOVS reg_a, reg_d, ASR #16
3281 MOV rscratch,reg_a,LSR #8
3282 MOV reg_a,reg_a, LSL #24
3283 STRB rscratch, [reg_cpu_var,#RAH_ofs]
3287 MOVS reg_a, reg_d, ASR #16
3289 MOV reg_a,reg_a, LSL #16
3293 MOV rscratch,reg_s, LSR #8
3294 MOVS reg_a, reg_s, LSL #16
3295 STRB rscratch, [reg_cpu_var,#RAH_ofs]
3297 MOV reg_a,reg_a, LSL #8
3301 MOVS reg_a, reg_s, LSL #16
3306 MOVS reg_x, reg_s, LSL #24
3311 MOVS reg_x, reg_s, LSL #16
3321 MOVS reg_a, reg_x, LSL #8
3326 MOVS reg_a, reg_x, LSR #8
3336 MOV reg_s, reg_x, LSR #24
3337 TST rstatus, #MASK_EMUL
3338 ORRNE reg_s, reg_s, #0x100
3342 MOV reg_s, reg_x, LSR #16
3361 MOVS reg_a, reg_y, LSL #8
3366 MOVS reg_a, reg_y, LSR #8
3386 /**********************************************************************************************/
3387 /* XCE *************************************************************************************** */
3390 TST rstatus,#MASK_CARRY
3393 TST rstatus,#MASK_EMUL
3396 BIC rstatus,rstatus,#(MASK_CARRY)
3397 TST rstatus,#MASK_INDEX
3398 @ X & Y were 16bits before
3399 MOVEQ reg_x,reg_x,LSL #8
3400 MOVEQ reg_y,reg_y,LSL #8
3401 TST rstatus,#MASK_MEM
3402 @ A was 16bits before
3404 MOVEQ rscratch,reg_a,LSR #24
3405 STREQB rscratch,[reg_cpu_var,#RAH_ofs]
3406 MOVEQ reg_a,reg_a,LSL #8
3407 ORR rstatus,rstatus,#(MASK_EMUL|MASK_MEM|MASK_INDEX)
3408 AND reg_s,reg_s,#0xFF
3409 ORR reg_s,reg_s,#0x100
3413 TST rstatus,#MASK_INDEX
3414 @ X & Y were 16bits before
3415 MOVEQ reg_x,reg_x,LSL #8
3416 MOVEQ reg_y,reg_y,LSL #8
3417 TST rstatus,#MASK_MEM
3418 @ A was 16bits before
3420 MOVEQ rscratch,reg_a,LSR #24
3421 STREQB rscratch,[reg_cpu_var,#RAH_ofs]
3422 MOVEQ reg_a,reg_a,LSL #8
3423 ORR rstatus,rstatus,#(MASK_CARRY|MASK_MEM|MASK_INDEX)
3424 AND reg_s,reg_s,#0xFF
3425 ORR reg_s,reg_s,#0x100
3429 TST rstatus,#MASK_EMUL
3431 @ EMUL was set : X,Y & A were 8bits
3432 @ Now have to check MEMORY & INDEX for potential conversions to 16bits
3433 TST rstatus,#MASK_INDEX
3434 @ X & Y are now 16bits
3435 MOVEQ reg_x,reg_x,LSR #8
3436 MOVEQ reg_y,reg_y,LSR #8
3437 TST rstatus,#MASK_MEM
3439 MOVEQ reg_a,reg_a,LSR #8
3441 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
3442 ORREQ reg_a,reg_a,rscratch,LSL #24
3444 BIC rstatus,rstatus,#(MASK_EMUL)
3445 ORR rstatus,rstatus,#(MASK_CARRY)
3451 /*******************************************************************************/
3452 /* BRK *************************************************************************/
3455 STRB rscratch,[reg_cpu_var,#BRKTriggered_ofs]
3457 TST rstatus, #MASK_EMUL
3458 @ EQ is flag to zero (!CheckEmu)
3461 SUB rscratch, rpc, regpcbase
3462 ADD rscratch2, rscratch, #1
3468 BIC reg_p_bank, reg_p_bank, #0xFF
3470 ORR rscratch, rscratch, #0xFF00
3476 SUB rscratch2, rpc, regpcbase
3482 BIC reg_p_bank,reg_p_bank, #0xFF
3484 ORR rscratch, rscratch, #0xFF00
3492 /**********************************************************************************************/
3493 /* BRL ************************************************************************************** */
3496 ORR rscratch, rscratch, reg_p_bank, LSL #16
3499 /**********************************************************************************************/
3500 /* IRQ *************************************************************************************** */
3501 @ void S9xOpcode_IRQ (void)
3502 .macro S9xOpcode_IRQ @ IRQ
3503 TST rstatus, #MASK_EMUL
3504 @ EQ is flag to zero (!CheckEmu)
3507 SUB rscratch2, rpc, regpcbase
3513 BIC reg_p_bank, reg_p_bank,#0xFF
3515 ORR rscratch, rscratch, #0xFF00
3521 SUB rscratch2, rpc, regpcbase
3527 BIC reg_p_bank,reg_p_bank, #0xFF
3529 ORR rscratch, rscratch, #0xFF00
3537 void asm_S9xOpcode_IRQ(void)
3539 if (!CheckEmulation())
3541 PushB (Registers.PB);
3542 PushW (CPU.PC - CPU.PCBase);
3543 PushB (Registers.PL);
3548 S9xSetPCBase (S9xGetWord (0xFFEE));
3549 CPU.Cycles += TWO_CYCLES;
3553 PushW (CPU.PC - CPU.PCBase);
3554 PushB (Registers.PL);
3559 S9xSetPCBase (S9xGetWord (0xFFFE));
3560 CPU.Cycles += ONE_CYCLE;
3565 /**********************************************************************************************/
3566 /* NMI *************************************************************************************** */
3567 @ void S9xOpcode_NMI (void)
3568 .macro S9xOpcode_NMI @ NMI
3569 TST rstatus, #MASK_EMUL
3570 @ EQ is flag to zero (!CheckEmu)
3573 SUB rscratch2, rpc, regpcbase
3579 BIC reg_p_bank, reg_p_bank,#0xFF
3581 ORR rscratch, rscratch, #0xFF00
3587 SUB rscratch2, rpc, regpcbase
3593 BIC reg_p_bank,reg_p_bank, #0xFF
3595 ORR rscratch, rscratch, #0xFF00
3602 void asm_S9xOpcode_NMI(void)
3604 if (!CheckEmulation())
3606 PushB (Registers.PB);
3607 PushW (CPU.PC - CPU.PCBase);
3608 PushB (Registers.PL);
3613 S9xSetPCBase (S9xGetWord (0xFFEA));
3614 CPU.Cycles += TWO_CYCLES;
3618 PushW (CPU.PC - CPU.PCBase);
3619 PushB (Registers.PL);
3624 S9xSetPCBase (S9xGetWord (0xFFFA));
3625 CPU.Cycles += ONE_CYCLE;
3630 /**********************************************************************************************/
3631 /* COP *************************************************************************************** */
3633 TST rstatus, #MASK_EMUL
3634 @ EQ is flag to zero (!CheckEmu)
3637 SUB rscratch, rpc, regpcbase
3638 ADD rscratch2, rscratch, #1
3644 BIC reg_p_bank, reg_p_bank,#0xFF
3646 ORR rscratch, rscratch, #0xFF00
3652 SUB rscratch2, rpc, regpcbase
3658 BIC reg_p_bank,reg_p_bank, #0xFF
3660 ORR rscratch, rscratch, #0xFF00
3667 /**********************************************************************************************/
3668 /* JML *************************************************************************************** */
3670 AbsoluteIndirectLong
3671 BIC reg_p_bank,reg_p_bank,#0xFF
3672 ORR reg_p_bank,reg_p_bank, rscratch, LSR #16
3678 BIC reg_p_bank,reg_p_bank,#0xFF
3679 ORR reg_p_bank,reg_p_bank, rscratch, LSR #16
3683 /**********************************************************************************************/
3684 /* JMP *************************************************************************************** */
3687 BIC rscratch, rscratch, #0xFF0000
3688 ORR rscratch, rscratch, reg_p_bank, LSL #16
3694 BIC rscratch, rscratch, #0xFF0000
3695 ORR rscratch, rscratch, reg_p_bank, LSL #16
3699 ADD rscratch, rscratch, reg_p_bank, LSL #16
3704 /**********************************************************************************************/
3705 /* JSL/RTL *********************************************************************************** */
3708 SUB rscratch, rpc, regpcbase
3709 @ SUB rscratch2, rscratch2, #1
3710 ADD rscratch2, rscratch, #2
3713 BIC reg_p_bank,reg_p_bank,#0xFF
3714 ORR reg_p_bank, reg_p_bank, rscratch, LSR #16
3719 BIC reg_p_bank,reg_p_bank,#0xFF
3721 ORR reg_p_bank, reg_p_bank, rscratch
3722 ADD rscratch, rpc, #1
3723 BIC rscratch, rscratch,#0xFF0000
3724 ORR rscratch, rscratch, reg_p_bank, LSL #16
3728 /**********************************************************************************************/
3729 /* JSR/RTS *********************************************************************************** */
3731 SUB rscratch, rpc, regpcbase
3732 @ SUB rscratch2, rscratch2, #1
3733 ADD rscratch2, rscratch, #1
3736 BIC rscratch, rscratch, #0xFF0000
3737 ORR rscratch, rscratch, reg_p_bank, LSL #16
3742 SUB rscratch, rpc, regpcbase
3743 @ SUB rscratch2, rscratch2, #1
3744 ADD rscratch2, rscratch, #1
3746 AbsoluteIndexedIndirectX0
3747 ORR rscratch, rscratch, reg_p_bank, LSL #16
3752 SUB rscratch, rpc, regpcbase
3753 @ SUB rscratch2, rscratch2, #1
3754 ADD rscratch2, rscratch, #1
3756 AbsoluteIndexedIndirectX1
3757 ORR rscratch, rscratch, reg_p_bank, LSL #16
3763 ADD rscratch, rpc, #1
3764 BIC rscratch, rscratch,#0x10000
3765 ORR rscratch, rscratch, reg_p_bank, LSL #16
3770 /**********************************************************************************************/
3771 /* MVN/MVP *********************************************************************************** */
3773 @ Save RegStatus = reg_d_bank >> 24
3774 MOV rscratch, reg_d_bank, LSR #16
3775 LDRB reg_d_bank , [rpc], #1
3776 LDRB rscratch2 , [rpc], #1
3777 @ Restore RegStatus = reg_d_bank >> 24
3778 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3779 MOV rscratch , reg_x, LSR #24
3780 ORR rscratch , rscratch, rscratch2, LSL #16
3782 MOV rscratch2, rscratch
3783 MOV rscratch , reg_y, LSR #24
3784 ORR rscratch , rscratch, reg_d_bank, LSL #16
3785 S9xSetByteLow rscratch2
3787 LDRB rscratch,[reg_cpu_var,#RAH_ofs]
3788 MOV reg_a,reg_a,LSR #8
3789 ORR reg_a,reg_a,rscratch, LSL #24
3790 ADD reg_x, reg_x, #0x01000000
3791 SUB reg_a, reg_a, #0x00010000
3792 ADD reg_y, reg_y, #0x01000000
3793 CMP reg_a, #0xFFFF0000
3796 MOV rscratch, reg_a, LSR #24
3797 MOV reg_a,reg_a,LSL #8
3798 STRB rscratch,[reg_cpu_var,#RAH_ofs]
3802 @ Save RegStatus = reg_d_bank >> 24
3803 MOV rscratch, reg_d_bank, LSR #16
3804 LDRB reg_d_bank , [rpc], #1
3805 LDRB rscratch2 , [rpc], #1
3806 @ Restore RegStatus = reg_d_bank >> 24
3807 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3808 MOV rscratch , reg_x, LSR #24
3809 ORR rscratch , rscratch, rscratch2, LSL #16
3811 MOV rscratch2, rscratch
3812 MOV rscratch , reg_y, LSR #24
3813 ORR rscratch , rscratch, reg_d_bank, LSL #16
3814 S9xSetByteLow rscratch2
3815 ADD reg_x, reg_x, #0x01000000
3816 SUB reg_a, reg_a, #0x00010000
3817 ADD reg_y, reg_y, #0x01000000
3818 CMP reg_a, #0xFFFF0000
3823 @ Save RegStatus = reg_d_bank >> 24
3824 MOV rscratch, reg_d_bank, LSR #16
3825 LDRB reg_d_bank , [rpc], #1
3826 LDRB rscratch2 , [rpc], #1
3827 @ Restore RegStatus = reg_d_bank >> 24
3828 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3829 MOV rscratch , reg_x, LSR #16
3830 ORR rscratch , rscratch, rscratch2, LSL #16
3832 MOV rscratch2, rscratch
3833 MOV rscratch , reg_y, LSR #16
3834 ORR rscratch , rscratch, reg_d_bank, LSL #16
3835 S9xSetByteLow rscratch2
3837 LDRB rscratch,[reg_cpu_var,#RAH_ofs]
3838 MOV reg_a,reg_a,LSR #8
3839 ORR reg_a,reg_a,rscratch, LSL #24
3840 ADD reg_x, reg_x, #0x00010000
3841 SUB reg_a, reg_a, #0x00010000
3842 ADD reg_y, reg_y, #0x00010000
3843 CMP reg_a, #0xFFFF0000
3846 MOV rscratch, reg_a, LSR #24
3847 MOV reg_a,reg_a,LSL #8
3848 STRB rscratch,[reg_cpu_var,#RAH_ofs]
3852 @ Save RegStatus = reg_d_bank >> 24
3853 MOV rscratch, reg_d_bank, LSR #16
3854 LDRB reg_d_bank , [rpc], #1
3855 LDRB rscratch2 , [rpc], #1
3856 @ Restore RegStatus = reg_d_bank >> 24
3857 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3858 MOV rscratch , reg_x, LSR #16
3859 ORR rscratch , rscratch, rscratch2, LSL #16
3861 MOV rscratch2, rscratch
3862 MOV rscratch , reg_y, LSR #16
3863 ORR rscratch , rscratch, reg_d_bank, LSL #16
3864 S9xSetByteLow rscratch2
3865 ADD reg_x, reg_x, #0x00010000
3866 SUB reg_a, reg_a, #0x00010000
3867 ADD reg_y, reg_y, #0x00010000
3868 CMP reg_a, #0xFFFF0000
3874 @ Save RegStatus = reg_d_bank >> 24
3875 MOV rscratch, reg_d_bank, LSR #16
3876 LDRB reg_d_bank , [rpc], #1
3877 LDRB rscratch2 , [rpc], #1
3878 @ Restore RegStatus = reg_d_bank >> 24
3879 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3880 MOV rscratch , reg_x, LSR #24
3881 ORR rscratch , rscratch, rscratch2, LSL #16
3883 MOV rscratch2, rscratch
3884 MOV rscratch , reg_y, LSR #24
3885 ORR rscratch , rscratch, reg_d_bank, LSL #16
3886 S9xSetByteLow rscratch2
3888 LDRB rscratch,[reg_cpu_var,#RAH_ofs]
3889 MOV reg_a,reg_a,LSR #8
3890 ORR reg_a,reg_a,rscratch, LSL #24
3891 SUB reg_x, reg_x, #0x01000000
3892 SUB reg_a, reg_a, #0x00010000
3893 SUB reg_y, reg_y, #0x01000000
3894 CMP reg_a, #0xFFFF0000
3897 MOV rscratch, reg_a, LSR #24
3898 MOV reg_a,reg_a,LSL #8
3899 STRB rscratch,[reg_cpu_var,#RAH_ofs]
3903 @ Save RegStatus = reg_d_bank >> 24
3904 MOV rscratch, reg_d_bank, LSR #16
3905 LDRB reg_d_bank , [rpc], #1
3906 LDRB rscratch2 , [rpc], #1
3907 @ Restore RegStatus = reg_d_bank >> 24
3908 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3909 MOV rscratch , reg_x, LSR #24
3910 ORR rscratch , rscratch, rscratch2, LSL #16
3912 MOV rscratch2, rscratch
3913 MOV rscratch , reg_y, LSR #24
3914 ORR rscratch , rscratch, reg_d_bank, LSL #16
3915 S9xSetByteLow rscratch2
3916 SUB reg_x, reg_x, #0x01000000
3917 SUB reg_a, reg_a, #0x00010000
3918 SUB reg_y, reg_y, #0x01000000
3919 CMP reg_a, #0xFFFF0000
3924 @ Save RegStatus = reg_d_bank >> 24
3925 MOV rscratch, reg_d_bank, LSR #16
3926 LDRB reg_d_bank , [rpc], #1
3927 LDRB rscratch2 , [rpc], #1
3928 @ Restore RegStatus = reg_d_bank >> 24
3929 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3930 MOV rscratch , reg_x, LSR #16
3931 ORR rscratch , rscratch, rscratch2, LSL #16
3933 MOV rscratch2, rscratch
3934 MOV rscratch , reg_y, LSR #16
3935 ORR rscratch , rscratch, reg_d_bank, LSL #16
3936 S9xSetByteLow rscratch2
3938 LDRB rscratch,[reg_cpu_var,#RAH_ofs]
3939 MOV reg_a,reg_a,LSR #8
3940 ORR reg_a,reg_a,rscratch, LSL #24
3941 SUB reg_x, reg_x, #0x00010000
3942 SUB reg_a, reg_a, #0x00010000
3943 SUB reg_y, reg_y, #0x00010000
3944 CMP reg_a, #0xFFFF0000
3947 MOV rscratch, reg_a, LSR #24
3948 MOV reg_a,reg_a,LSL #8
3949 STRB rscratch,[reg_cpu_var,#RAH_ofs]
3953 @ Save RegStatus = reg_d_bank >> 24
3954 MOV rscratch, reg_d_bank, LSR #16
3955 LDRB reg_d_bank , [rpc], #1
3956 LDRB rscratch2 , [rpc], #1
3957 @ Restore RegStatus = reg_d_bank >> 24
3958 ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
3959 MOV rscratch , reg_x, LSR #16
3960 ORR rscratch , rscratch, rscratch2, LSL #16
3962 MOV rscratch2, rscratch
3963 MOV rscratch , reg_y, LSR #16
3964 ORR rscratch , rscratch, reg_d_bank, LSL #16
3965 S9xSetByteLow rscratch2
3966 SUB reg_x, reg_x, #0x00010000
3967 SUB reg_a, reg_a, #0x00010000
3968 SUB reg_y, reg_y, #0x00010000
3969 CMP reg_a, #0xFFFF0000
3974 /**********************************************************************************************/
3975 /* REP/SEP *********************************************************************************** */
3977 @ status&=~(*rpc++);
3978 @ so possible changes are :
3979 @ INDEX = 1 -> 0 : X,Y 8bits -> 16bits
3980 @ MEM = 1 -> 0 : A 8bits -> 16bits
3981 @ SAVE OLD status for MASK_INDEX & MASK_MEM comparison
3982 MOV rscratch3, rstatus
3983 LDRB rscratch, [rpc], #1
3984 MVN rscratch, rscratch
3985 AND rstatus,rstatus,rscratch, ROR #(32-STATUS_SHIFTER)
3986 TST rstatus,#MASK_EMUL
3988 @ emulation mode on : no changes since it was on before opcode
3989 @ just be sure to reset MEM & INDEX accordingly
3990 ORR rstatus,rstatus,#(MASK_MEM|MASK_INDEX)
3993 @ NOT in Emulation mode, check INDEX & MEMORY bits
3995 TST rscratch3,#MASK_INDEX
3997 @ X & Y were 8bit before
3998 TST rstatus,#MASK_INDEX
4000 @ X & Y are now 16bits
4001 MOV reg_x,reg_x,LSR #8
4002 MOV reg_y,reg_y,LSR #8
4003 1113: @ X & Y still in 16bits
4005 TST rscratch3,#MASK_MEM
4008 TST rstatus,#MASK_MEM
4011 MOV reg_a,reg_a,LSR #8
4013 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
4014 ORREQ reg_a,reg_a,rscratch,LSL #24
4021 @ so possible changes are :
4022 @ INDEX = 0 -> 1 : X,Y 16bits -> 8bits
4023 @ MEM = 0 -> 1 : A 16bits -> 8bits
4024 @ SAVE OLD status for MASK_INDEX & MASK_MEM comparison
4025 MOV rscratch3, rstatus
4026 LDRB rscratch, [rpc], #1
4027 ORR rstatus,rstatus,rscratch, LSL #STATUS_SHIFTER
4028 TST rstatus,#MASK_EMUL
4030 @ emulation mode on : no changes sinc eit was on before opcode
4031 @ just be sure to have mem & index set accordingly
4032 ORR rstatus,rstatus,#(MASK_MEM|MASK_INDEX)
4035 @ NOT in Emulation mode, check INDEX & MEMORY bits
4037 TST rscratch3,#MASK_INDEX
4039 @ X & Y were 16bit before
4040 TST rstatus,#MASK_INDEX
4042 @ X & Y are now 8bits
4043 MOV reg_x,reg_x,LSL #8
4044 MOV reg_y,reg_y,LSL #8
4045 10113: @ X & Y still in 16bits
4047 TST rscratch3,#MASK_MEM
4049 @ A was 16bit before
4050 TST rstatus,#MASK_MEM
4054 MOV rscratch,reg_a,LSR #24
4055 MOV reg_a,reg_a,LSL #8
4056 STRB rscratch,[reg_cpu_var,#RAH_ofs]
4062 /**********************************************************************************************/
4063 /* XBA *************************************************************************************** */
4066 ADD rscratch,reg_cpu_var,#RAH_ofs
4067 MOV reg_a,reg_a, LSR #24
4068 SWPB reg_a,reg_a,[rscratch]
4069 MOVS reg_a,reg_a, LSL #24
4075 MOV rscratch, reg_a, ROR #24 @ ll0000hh
4076 ORR rscratch, rscratch, reg_a, LSR #8@ ll0000hh + 00hhll00 -> llhhllhh
4077 MOV reg_a, rscratch, LSL #16@ llhhllhh -> llhh0000
4078 MOVS rscratch,rscratch,LSL #24 @ to set Z & N flags with AL
4084 /**********************************************************************************************/
4085 /* RTI *************************************************************************************** */
4087 @ INDEX set, MEMORY set
4088 BIC rstatus,rstatus,#0xFF000000
4090 ORR rstatus,rscratch,rstatus
4092 TST rstatus, #MASK_EMUL
4093 ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
4096 BIC reg_p_bank,reg_p_bank,#0xFF
4097 ORR reg_p_bank,reg_p_bank,rscratch
4099 ADD rscratch, rpc, reg_p_bank, LSL #16
4101 TST rstatus, #MASK_INDEX
4102 @ INDEX cleared & was set : 8->16
4103 MOVEQ reg_x,reg_x,LSR #8
4104 MOVEQ reg_y,reg_y,LSR #8
4105 TST rstatus, #MASK_MEM
4106 @ MEMORY cleared & was set : 8->16
4107 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
4108 MOVEQ reg_a,reg_a,LSR #8
4109 ORREQ reg_a,reg_a,rscratch, LSL #24
4114 @ INDEX cleared, MEMORY set
4115 BIC rstatus,rstatus,#0xFF000000
4117 ORR rstatus,rscratch,rstatus
4119 TST rstatus, #MASK_EMUL
4120 ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
4123 BIC reg_p_bank,reg_p_bank,#0xFF
4124 ORR reg_p_bank,reg_p_bank,rscratch
4126 ADD rscratch, rpc, reg_p_bank, LSL #16
4128 TST rstatus, #MASK_INDEX
4129 @ INDEX set & was cleared : 16->8
4130 MOVNE reg_x,reg_x,LSL #8
4131 MOVNE reg_y,reg_y,LSL #8
4132 TST rstatus, #MASK_MEM
4133 @ MEMORY cleared & was set : 8->16
4134 LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
4135 MOVEQ reg_a,reg_a,LSR #8
4136 ORREQ reg_a,reg_a,rscratch, LSL #24
4141 @ INDEX set, MEMORY cleared
4142 BIC rstatus,rstatus,#0xFF000000
4144 ORR rstatus,rscratch,rstatus
4146 TST rstatus, #MASK_EMUL
4147 ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
4150 BIC reg_p_bank,reg_p_bank,#0xFF
4151 ORR reg_p_bank,reg_p_bank,rscratch
4153 ADD rscratch, rpc, reg_p_bank, LSL #16
4155 TST rstatus, #MASK_INDEX
4156 @ INDEX cleared & was set : 8->16
4157 MOVEQ reg_x,reg_x,LSR #8
4158 MOVEQ reg_y,reg_y,LSR #8
4159 TST rstatus, #MASK_MEM
4160 @ MEMORY set & was cleared : 16->8
4161 MOVNE rscratch,reg_a,LSR #24
4162 MOVNE reg_a,reg_a,LSL #8
4163 STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
4168 @ INDEX cleared, MEMORY cleared
4169 BIC rstatus,rstatus,#0xFF000000
4171 ORR rstatus,rscratch,rstatus
4173 TST rstatus, #MASK_EMUL
4174 ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
4177 BIC reg_p_bank,reg_p_bank,#0xFF
4178 ORR reg_p_bank,reg_p_bank,rscratch
4180 ADD rscratch, rpc, reg_p_bank, LSL #16
4182 TST rstatus, #MASK_INDEX
4183 @ INDEX set & was cleared : 16->8
4184 MOVNE reg_x,reg_x,LSL #8
4185 MOVNE reg_y,reg_y,LSL #8
4186 TST rstatus, #MASK_MEM
4187 @ MEMORY set & was cleared : 16->8
4188 @ MEMORY set & was cleared : 16->8
4189 MOVNE rscratch,reg_a,LSR #24
4190 MOVNE reg_a,reg_a,LSL #8
4191 STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
4197 /**********************************************************************************************/
4198 /* STP/WAI/DB ******************************************************************************** */
4201 LDRB rscratch,[reg_cpu_var,#IRQActive_ofs]
4202 MOVS rscratch,rscratch
4207 CPU.WaitingForInterrupt = TRUE;
4212 CPU.Cycles = CPU.NextEvent;
4214 STRB rscratch,[reg_cpu_var,#WaitingForInterrupt_ofs]
4215 LDR reg_cycles,[reg_cpu_var,#NextEvent_ofs]
4217 if (IAPU.APUExecuting)
4219 ICPU.CPUExecuting = FALSE;
4223 } while (APU.Cycles < CPU.NextEvent);
4224 ICPU.CPUExecuting = TRUE;
4227 LDRB rscratch,[reg_cpu_var,#APUExecuting_ofs]
4228 MOVS rscratch,rscratch
4236 @ CPU.Flags |= DEBUG_MODE_FLAG;
4238 .macro Op42 /*Reserved Snes9X*/
4241 /**********************************************************************************************/
4242 /* AND ******************************************************************************** */
4244 LDRB rscratch , [rpc], #1
4245 ANDS reg_a , reg_a, rscratch, LSL #24
4250 LDRB rscratch2 , [rpc,#1]
4251 LDRB rscratch , [rpc], #2
4252 ORR rscratch, rscratch, rscratch2, LSL #8
4253 ANDS reg_a , reg_a, rscratch, LSL #16
4272 /**********************************************************************************************/
4273 /* EOR ******************************************************************************** */
4275 LDRB rscratch2 , [rpc, #1]
4276 LDRB rscratch , [rpc], #2
4277 ORR rscratch, rscratch, rscratch2,LSL #8
4278 EORS reg_a, reg_a, rscratch,LSL #16
4285 LDRB rscratch , [rpc], #1
4286 EORS reg_a, reg_a, rscratch,LSL #24
4292 /**********************************************************************************************/
4293 /* STA *************************************************************************************** */
4296 @ TST rstatus, #MASK_INDEX
4301 @ TST rstatus, #MASK_INDEX
4306 /**********************************************************************************************/
4307 /* BIT *************************************************************************************** */
4309 LDRB rscratch , [rpc], #1
4310 TST reg_a, rscratch, LSL #24
4315 LDRB rscratch2 , [rpc, #1]
4316 LDRB rscratch , [rpc], #2
4317 ORR rscratch, rscratch, rscratch2, LSL #8
4318 TST reg_a, rscratch, LSL #16
4328 /**********************************************************************************************/
4329 /* LDY *************************************************************************************** */
4331 LDRB rscratch , [rpc], #1
4332 MOVS reg_y, rscratch, LSL #24
4337 LDRB rscratch2 , [rpc, #1]
4338 LDRB rscratch , [rpc], #2
4339 ORR rscratch, rscratch, rscratch2, LSL #8
4340 MOVS reg_y, rscratch, LSL #16
4345 /**********************************************************************************************/
4346 /* LDX *************************************************************************************** */
4348 LDRB rscratch , [rpc], #1
4349 MOVS reg_x, rscratch, LSL #24
4354 LDRB rscratch2 , [rpc, #1]
4355 LDRB rscratch , [rpc], #2
4356 ORR rscratch, rscratch, rscratch2, LSL #8
4357 MOVS reg_x, rscratch, LSL #16
4362 /**********************************************************************************************/
4363 /* LDA *************************************************************************************** */
4365 LDRB rscratch , [rpc], #1
4366 MOVS reg_a, rscratch, LSL #24
4371 LDRB rscratch2 , [rpc, #1]
4372 LDRB rscratch , [rpc], #2
4373 ORR rscratch, rscratch, rscratch2, LSL #8
4374 MOVS reg_a, rscratch, LSL #16
4379 /**********************************************************************************************/
4380 /* CMY *************************************************************************************** */
4382 LDRB rscratch , [rpc], #1
4383 SUBS rscratch2 , reg_y , rscratch, LSL #24
4384 BICCC rstatus, rstatus, #MASK_CARRY
4385 ORRCS rstatus, rstatus, #MASK_CARRY
4390 LDRB rscratch2 , [rpc, #1]
4391 LDRB rscratch , [rpc], #2
4392 ORR rscratch, rscratch, rscratch2, LSL #8
4393 SUBS rscratch2 , reg_y, rscratch, LSL #16
4394 BICCC rstatus, rstatus, #MASK_CARRY
4395 ORRCS rstatus, rstatus, #MASK_CARRY
4404 /**********************************************************************************************/
4405 /* CMP *************************************************************************************** */
4407 LDRB rscratch , [rpc], #1
4408 SUBS rscratch2 , reg_a , rscratch, LSL #24
4409 BICCC rstatus, rstatus, #MASK_CARRY
4410 ORRCS rstatus, rstatus, #MASK_CARRY
4415 LDRB rscratch2 , [rpc,#1]
4416 LDRB rscratch , [rpc], #2
4417 ORR rscratch, rscratch, rscratch2, LSL #8
4418 SUBS rscratch2 , reg_a, rscratch, LSL #16
4419 BICCC rstatus, rstatus, #MASK_CARRY
4420 ORRCS rstatus, rstatus, #MASK_CARRY
4425 /**********************************************************************************************/
4426 /* CMX *************************************************************************************** */
4428 LDRB rscratch , [rpc], #1
4429 SUBS rscratch2 , reg_x , rscratch, LSL #24
4430 BICCC rstatus, rstatus, #MASK_CARRY
4431 ORRCS rstatus, rstatus, #MASK_CARRY
4436 LDRB rscratch2 , [rpc,#1]
4437 LDRB rscratch , [rpc], #2
4438 ORR rscratch, rscratch, rscratch2, LSL #8
4439 SUBS rscratch2 , reg_x, rscratch, LSL #16
4440 BICCC rstatus, rstatus, #MASK_CARRY
4441 ORRCS rstatus, rstatus, #MASK_CARRY
4449 CLI_OPE_REC_Nos_Layer0
4450 nos.nos_ope_treasury_date = convert(DATETIME, @treasuryDate, 103)
4451 nos.nos_ope_accounting_date = convert(DATETIME, @accountingDate, 103)
4453 CLI_OPE_Nos_Ope_Layer0
4454 n.nos_ope_treasury_date = convert(DATETIME, @LARD, 103)
4455 n.nos_ope_accounting_date = convert(DATETIME, @LARD, 103)
4458 nos.nos_ope_treasury_date = convert(DATETIME, @LARD, 103)
4459 nos.nos_ope_accounting_date = convert(DATETIME, @LARD, 103)
4465 [GNV] : utilisation de la lard (laccdate) pour afficher les openings.
4466 +nécessité d'avoir des valeurs dans l'opening pour date tréso=date compta=laccdate
4468 [Accounting rec] : si laccdate pas bonne (pas = BD-1) -> message warning et pas de donnée
4470 +données nécessaires : opening date tréso=date compta=laccdate=BD-1
4471 +données nécessaires : opening date tréso=date compta=laccdate-1
4472 +données nécessaires : opening date tréso=laccdate-1 et date compta=laccdate
4477 /****************************************************************
4479 ****************************************************************/
4484 @ void asmMainLoop(asm_cpu_var_t *asmcpuPtr);
4487 STMFD R13!,{R4-R11,LR}
4488 @ init pointer to CPUvar structure
4492 @ get cpu mode from flag and init jump table
4500 LDR rscratch,[reg_cpu_var,#Flags_ofs]
4501 MOVS rscratch,rscratch
4502 BNE CPUFlags_set @ If flags => check for irq/nmi/scan_keys...
4504 EXEC_OP @ Execute next opcode
4506 CPUFlags_set: @ Check flags (!=0)
4507 TST rscratch,#NMI_FLAG @ Check NMI
4508 BEQ CPUFlagsNMI_FLAG_cleared
4509 LDR rscratch2,[reg_cpu_var,#NMICycleCount_ofs]
4510 SUBS rscratch2,rscratch2,#1
4511 STR rscratch2,[reg_cpu_var,#NMICycleCount_ofs]
4512 BNE CPUFlagsNMI_FLAG_cleared
4513 BIC rscratch,rscratch,#NMI_FLAG
4514 STR rscratch,[reg_cpu_var,#Flags_ofs]
4515 LDRB rscratch2,[reg_cpu_var,#WaitingForInterrupt_ofs]
4516 MOVS rscratch2,rscratch2
4517 BEQ NotCPUaitingForInterruptNMI
4520 STRB rscratch2,[reg_cpu_var,#WaitingForInterrupt_ofs]
4521 NotCPUaitingForInterruptNMI:
4523 LDR rscratch,[reg_cpu_var,#Flags_ofs]
4524 CPUFlagsNMI_FLAG_cleared:
4525 TST rscratch,#IRQ_PENDING_FLAG @ Check IRQ_PENDING_FLAG
4526 BEQ CPUFlagsIRQ_PENDING_FLAG_cleared
4527 LDR rscratch2,[reg_cpu_var,#IRQCycleCount_ofs]
4528 MOVS rscratch2,rscratch2
4529 BNE CPUIRQCycleCount_NotZero
4530 LDRB rscratch2,[reg_cpu_var,#WaitingForInterrupt_ofs]
4531 MOVS rscratch2,rscratch2
4532 BEQ NotCPUaitingForInterruptIRQ
4535 STRB rscratch2,[reg_cpu_var,#WaitingForInterrupt_ofs]
4536 NotCPUaitingForInterruptIRQ:
4537 LDRB rscratch2,[reg_cpu_var,#IRQActive_ofs]
4538 MOVS rscratch2,rscratch2
4539 BEQ CPUIRQActive_cleared
4540 TST rstatus,#MASK_IRQ
4541 BNE CPUFlagsIRQ_PENDING_FLAG_cleared
4543 LDR rscratch,[reg_cpu_var,#Flags_ofs]
4544 B CPUFlagsIRQ_PENDING_FLAG_cleared
4545 CPUIRQActive_cleared:
4546 BIC rscratch,rscratch,#IRQ_PENDING_FLAG
4547 STR rscratch,[reg_cpu_var,#Flags_ofs]
4548 B CPUFlagsIRQ_PENDING_FLAG_cleared
4549 CPUIRQCycleCount_NotZero:
4550 SUB rscratch2,rscratch2,#1
4551 STR rscratch2,[reg_cpu_var,#IRQCycleCount_ofs]
4552 CPUFlagsIRQ_PENDING_FLAG_cleared:
4554 TST rscratch,#SCAN_KEYS_FLAG @ Check SCAN_KEYS_FLAG
4557 EXEC_OP @ Execute next opcode
4561 /*Registers.PC = CPU.PC - CPU.PCBase;
4563 APURegisters.PC = IAPU.PC - IAPU.RAM;
4564 S9xAPUPackStatus ();
4566 if (CPU.Flags & SCAN_KEYS_FLAG)
4569 CPU.Flags &= ~SCAN_KEYS_FLAG;
4573 LDMFD R13!,{R4-R11,LR}
4577 @ void test_opcode(struct asm_cpu_var *asm_var);
4580 STMFD R13!,{R4-R11,LR}
4581 @ init pointer to CPUvar structure
4585 @ get cpu mode from flag and init jump table
4591 /*****************************************************************
4593 *****************************************************************/
4596 jumptable1: .long Op00mod1
4857 lbl01mod1a: DirectIndexedIndirect1
4864 lbl03mod1a: StackasmRelative
4880 lbl07mod1a: DirectIndirectLong
4896 lbl0Cmod1a: Absolute
4900 lbl0Dmod1a: Absolute
4904 lbl0Emod1a: Absolute
4908 lbl0Fmod1a: AbsoluteLong
4915 lbl11mod1a: DirectIndirectIndexed1
4919 lbl12mod1a: DirectIndirect
4923 lbl13mod1a: StackasmRelativeIndirectIndexed1
4931 lbl15mod1a: DirectIndexedX1
4935 lbl16mod1a: DirectIndexedX1
4939 lbl17mod1a: DirectIndirectIndexedLong1
4946 lbl19mod1a: AbsoluteIndexedY1
4956 lbl1Cmod1a: Absolute
4960 lbl1Dmod1a: AbsoluteIndexedX1
4964 lbl1Emod1a: AbsoluteIndexedX1
4968 lbl1Fmod1a: AbsoluteLongIndexedX1
4975 lbl21mod1a: DirectIndexedIndirect1
4982 lbl23mod1a: StackasmRelative
4998 lbl27mod1a: DirectIndirectLong
5015 lbl2Cmod1a: Absolute
5019 lbl2Dmod1a: Absolute
5023 lbl2Emod1a: Absolute
5027 lbl2Fmod1a: AbsoluteLong
5034 lbl31mod1a: DirectIndirectIndexed1
5038 lbl32mod1a: DirectIndirect
5042 lbl33mod1a: StackasmRelativeIndirectIndexed1
5046 lbl34mod1a: DirectIndexedX1
5050 lbl35mod1a: DirectIndexedX1
5054 lbl36mod1a: DirectIndexedX1
5058 lbl37mod1a: DirectIndirectIndexedLong1
5065 lbl39mod1a: AbsoluteIndexedY1
5075 lbl3Cmod1a: AbsoluteIndexedX1
5079 lbl3Dmod1a: AbsoluteIndexedX1
5083 lbl3Emod1a: AbsoluteIndexedX1
5087 lbl3Fmod1a: AbsoluteLongIndexedX1
5095 lbl41mod1a: DirectIndexedIndirect1
5102 lbl43mod1a: StackasmRelative
5117 lbl47mod1a: DirectIndirectLong
5136 lbl4Dmod1a: Absolute
5140 lbl4Emod1a: Absolute
5144 lbl4Fmod1a: AbsoluteLong
5151 lbl51mod1a: DirectIndirectIndexed1
5155 lbl52mod1a: DirectIndirect
5159 lbl53mod1a: StackasmRelativeIndirectIndexed1
5166 lbl55mod1a: DirectIndexedX1
5170 lbl56mod1a: DirectIndexedX1
5174 lbl57mod1a: DirectIndirectIndexedLong1
5181 lbl59mod1a: AbsoluteIndexedY1
5194 lbl5Dmod1a: AbsoluteIndexedX1
5198 lbl5Emod1a: AbsoluteIndexedX1
5202 lbl5Fmod1a: AbsoluteLongIndexedX1
5209 lbl61mod1a: DirectIndexedIndirect1
5216 lbl63mod1a: StackasmRelative
5232 lbl67mod1a: DirectIndirectLong
5239 lbl69mod1a: Immediate8
5252 lbl6Dmod1a: Absolute
5256 lbl6Emod1a: Absolute
5260 lbl6Fmod1a: AbsoluteLong
5267 lbl71mod1a: DirectIndirectIndexed1
5271 lbl72mod1a: DirectIndirect
5275 lbl73mod1a: StackasmRelativeIndirectIndexed1
5280 lbl74mod1a: DirectIndexedX1
5284 lbl75mod1a: DirectIndexedX1
5288 lbl76mod1a: DirectIndexedX1
5292 lbl77mod1a: DirectIndirectIndexedLong1
5299 lbl79mod1a: AbsoluteIndexedY1
5309 lbl7Cmod1: AbsoluteIndexedIndirectX1
5313 lbl7Dmod1a: AbsoluteIndexedX1
5317 lbl7Emod1a: AbsoluteIndexedX1
5321 lbl7Fmod1a: AbsoluteLongIndexedX1
5330 lbl81mod1a: DirectIndexedIndirect1
5337 lbl83mod1a: StackasmRelative
5353 lbl87mod1a: DirectIndirectLong
5369 lbl8Cmod1a: Absolute
5373 lbl8Dmod1a: Absolute
5377 lbl8Emod1a: Absolute
5381 lbl8Fmod1a: AbsoluteLong
5388 lbl91mod1a: DirectIndirectIndexed1
5392 lbl92mod1a: DirectIndirect
5396 lbl93mod1a: StackasmRelativeIndirectIndexed1
5400 lbl94mod1a: DirectIndexedX1
5404 lbl95mod1a: DirectIndexedX1
5408 lbl96mod1a: DirectIndexedY1
5412 lbl97mod1a: DirectIndirectIndexedLong1
5419 lbl99mod1a: AbsoluteIndexedY1
5429 lbl9Cmod1a: Absolute
5433 lbl9Dmod1a: AbsoluteIndexedX1
5437 lbl9Emod1: AbsoluteIndexedX1
5441 lbl9Fmod1a: AbsoluteLongIndexedX1
5448 lblA1mod1a: DirectIndexedIndirect1
5455 lblA3mod1a: StackasmRelative
5471 lblA7mod1a: DirectIndirectLong
5487 lblACmod1a: Absolute
5491 lblADmod1a: Absolute
5495 lblAEmod1a: Absolute
5499 lblAFmod1a: AbsoluteLong
5506 lblB1mod1a: DirectIndirectIndexed1
5510 lblB2mod1a: DirectIndirect
5514 lblB3mod1a: StackasmRelativeIndirectIndexed1
5518 lblB4mod1a: DirectIndexedX1
5522 lblB5mod1a: DirectIndexedX1
5526 lblB6mod1a: DirectIndexedY1
5530 lblB7mod1a: DirectIndirectIndexedLong1
5537 lblB9mod1a: AbsoluteIndexedY1
5547 lblBCmod1a: AbsoluteIndexedX1
5551 lblBDmod1a: AbsoluteIndexedX1
5555 lblBEmod1a: AbsoluteIndexedY1
5559 lblBFmod1a: AbsoluteLongIndexedX1
5566 lblC1mod1a: DirectIndexedIndirect1
5574 lblC3mod1a: StackasmRelative
5590 lblC7mod1a: DirectIndirectLong
5606 lblCCmod1a: Absolute
5610 lblCDmod1a: Absolute
5614 lblCEmod1a: Absolute
5618 lblCFmod1a: AbsoluteLong
5625 lblD1mod1a: DirectIndirectIndexed1
5629 lblD2mod1a: DirectIndirect
5633 lblD3mod1a: StackasmRelativeIndirectIndexed1
5640 lblD5mod1a: DirectIndexedX1
5644 lblD6mod1a: DirectIndexedX1
5648 lblD7mod1a: DirectIndirectIndexedLong1
5655 lblD9mod1a: AbsoluteIndexedY1
5668 lblDDmod1a: AbsoluteIndexedX1
5672 lblDEmod1a: AbsoluteIndexedX1
5676 lblDFmod1a: AbsoluteLongIndexedX1
5683 lblE1mod1a: DirectIndexedIndirect1
5691 lblE3mod1a: StackasmRelative
5707 lblE7mod1a: DirectIndirectLong
5714 lblE9mod1a: Immediate8
5724 lblECmod1a: Absolute
5728 lblEDmod1a: Absolute
5732 lblEEmod1a: Absolute
5736 lblEFmod1a: AbsoluteLong
5743 lblF1mod1a: DirectIndirectIndexed1
5747 lblF2mod1a: DirectIndirect
5751 lblF3mod1a: StackasmRelativeIndirectIndexed1
5758 lblF5mod1a: DirectIndexedX1
5762 lblF6mod1a: DirectIndexedX1
5766 lblF7mod1a: DirectIndirectIndexedLong1
5773 lblF9mod1a: AbsoluteIndexedY1
5786 lblFDmod1a: AbsoluteIndexedX1
5790 lblFEmod1a: AbsoluteIndexedX1
5794 lblFFmod1a: AbsoluteLongIndexedX1
5800 jumptable2: .long Op00mod2
6060 lbl01mod2a: DirectIndexedIndirect0
6067 lbl03mod2a: StackasmRelative
6083 lbl07mod2a: DirectIndirectLong
6099 lbl0Cmod2a: Absolute
6103 lbl0Dmod2a: Absolute
6107 lbl0Emod2a: Absolute
6111 lbl0Fmod2a: AbsoluteLong
6118 lbl11mod2a: DirectIndirectIndexed0
6122 lbl12mod2a: DirectIndirect
6126 lbl13mod2a: StackasmRelativeIndirectIndexed0
6134 lbl15mod2a: DirectIndexedX0
6138 lbl16mod2a: DirectIndexedX0
6142 lbl17mod2a: DirectIndirectIndexedLong0
6149 lbl19mod2a: AbsoluteIndexedY0
6159 lbl1Cmod2a: Absolute
6163 lbl1Dmod2a: AbsoluteIndexedX0
6167 lbl1Emod2a: AbsoluteIndexedX0
6171 lbl1Fmod2a: AbsoluteLongIndexedX0
6178 lbl21mod2a: DirectIndexedIndirect0
6185 lbl23mod2a: StackasmRelative
6201 lbl27mod2a: DirectIndirectLong
6218 lbl2Cmod2a: Absolute
6222 lbl2Dmod2a: Absolute
6226 lbl2Emod2a: Absolute
6230 lbl2Fmod2a: AbsoluteLong
6237 lbl31mod2a: DirectIndirectIndexed0
6241 lbl32mod2a: DirectIndirect
6245 lbl33mod2a: StackasmRelativeIndirectIndexed0
6249 lbl34mod2a: DirectIndexedX0
6253 lbl35mod2a: DirectIndexedX0
6257 lbl36mod2a: DirectIndexedX0
6261 lbl37mod2a: DirectIndirectIndexedLong0
6268 lbl39mod2a: AbsoluteIndexedY0
6278 lbl3Cmod2a: AbsoluteIndexedX0
6282 lbl3Dmod2a: AbsoluteIndexedX0
6286 lbl3Emod2a: AbsoluteIndexedX0
6290 lbl3Fmod2a: AbsoluteLongIndexedX0
6298 lbl41mod2a: DirectIndexedIndirect0
6305 lbl43mod2a: StackasmRelative
6320 lbl47mod2a: DirectIndirectLong
6339 lbl4Dmod2a: Absolute
6343 lbl4Emod2a: Absolute
6347 lbl4Fmod2a: AbsoluteLong
6354 lbl51mod2a: DirectIndirectIndexed0
6358 lbl52mod2a: DirectIndirect
6362 lbl53mod2a: StackasmRelativeIndirectIndexed0
6369 lbl55mod2a: DirectIndexedX0
6373 lbl56mod2a: DirectIndexedX0
6377 lbl57mod2a: DirectIndirectIndexedLong0
6384 lbl59mod2a: AbsoluteIndexedY0
6397 lbl5Dmod2a: AbsoluteIndexedX0
6401 lbl5Emod2a: AbsoluteIndexedX0
6405 lbl5Fmod2a: AbsoluteLongIndexedX0
6412 lbl61mod2a: DirectIndexedIndirect0
6419 lbl63mod2a: StackasmRelative
6435 lbl67mod2a: DirectIndirectLong
6442 lbl69mod2a: Immediate8
6455 lbl6Dmod2a: Absolute
6459 lbl6Emod2a: Absolute
6463 lbl6Fmod2a: AbsoluteLong
6470 lbl71mod2a: DirectIndirectIndexed0
6474 lbl72mod2a: DirectIndirect
6478 lbl73mod2a: StackasmRelativeIndirectIndexed0
6482 lbl74mod2a: DirectIndexedX0
6486 lbl75mod2a: DirectIndexedX0
6490 lbl76mod2a: DirectIndexedX0
6494 lbl77mod2a: DirectIndirectIndexedLong0
6501 lbl79mod2a: AbsoluteIndexedY0
6511 lbl7Cmod2: AbsoluteIndexedIndirectX0
6515 lbl7Dmod2a: AbsoluteIndexedX0
6519 lbl7Emod2a: AbsoluteIndexedX0
6523 lbl7Fmod2a: AbsoluteLongIndexedX0
6532 lbl81mod2a: DirectIndexedIndirect0
6539 lbl83mod2a: StackasmRelative
6555 lbl87mod2a: DirectIndirectLong
6571 lbl8Cmod2a: Absolute
6575 lbl8Dmod2a: Absolute
6579 lbl8Emod2a: Absolute
6583 lbl8Fmod2a: AbsoluteLong
6590 lbl91mod2a: DirectIndirectIndexed0
6594 lbl92mod2a: DirectIndirect
6598 lbl93mod2a: StackasmRelativeIndirectIndexed0
6602 lbl94mod2a: DirectIndexedX0
6606 lbl95mod2a: DirectIndexedX0
6610 lbl96mod2a: DirectIndexedY0
6614 lbl97mod2a: DirectIndirectIndexedLong0
6621 lbl99mod2a: AbsoluteIndexedY0
6631 lbl9Cmod2a: Absolute
6635 lbl9Dmod2a: AbsoluteIndexedX0
6639 lbl9Emod2: AbsoluteIndexedX0
6643 lbl9Fmod2a: AbsoluteLongIndexedX0
6650 lblA1mod2a: DirectIndexedIndirect0
6657 lblA3mod2a: StackasmRelative
6673 lblA7mod2a: DirectIndirectLong
6689 lblACmod2a: Absolute
6693 lblADmod2a: Absolute
6697 lblAEmod2a: Absolute
6701 lblAFmod2a: AbsoluteLong
6708 lblB1mod2a: DirectIndirectIndexed0
6712 lblB2mod2a: DirectIndirect
6716 lblB3mod2a: StackasmRelativeIndirectIndexed0
6720 lblB4mod2a: DirectIndexedX0
6724 lblB5mod2a: DirectIndexedX0
6728 lblB6mod2a: DirectIndexedY0
6732 lblB7mod2a: DirectIndirectIndexedLong0
6739 lblB9mod2a: AbsoluteIndexedY0
6749 lblBCmod2a: AbsoluteIndexedX0
6753 lblBDmod2a: AbsoluteIndexedX0
6757 lblBEmod2a: AbsoluteIndexedY0
6761 lblBFmod2a: AbsoluteLongIndexedX0
6768 lblC1mod2a: DirectIndexedIndirect0
6776 lblC3mod2a: StackasmRelative
6792 lblC7mod2a: DirectIndirectLong
6808 lblCCmod2a: Absolute
6812 lblCDmod2a: Absolute
6816 lblCEmod2a: Absolute
6820 lblCFmod2a: AbsoluteLong
6827 lblD1mod2a: DirectIndirectIndexed0
6831 lblD2mod2a: DirectIndirect
6835 lblD3mod2a: StackasmRelativeIndirectIndexed0
6842 lblD5mod2a: DirectIndexedX0
6846 lblD6mod2a: DirectIndexedX0
6850 lblD7mod2a: DirectIndirectIndexedLong0
6857 lblD9mod2a: AbsoluteIndexedY0
6870 lblDDmod2a: AbsoluteIndexedX0
6874 lblDEmod2a: AbsoluteIndexedX0
6878 lblDFmod2a: AbsoluteLongIndexedX0
6885 lblE1mod2a: DirectIndexedIndirect0
6893 lblE3mod2a: StackasmRelative
6909 lblE7mod2a: DirectIndirectLong
6916 lblE9mod2a: Immediate8
6926 lblECmod2a: Absolute
6930 lblEDmod2a: Absolute
6934 lblEEmod2a: Absolute
6938 lblEFmod2a: AbsoluteLong
6945 lblF1mod2a: DirectIndirectIndexed0
6949 lblF2mod2a: DirectIndirect
6953 lblF3mod2a: StackasmRelativeIndirectIndexed0
6960 lblF5mod2a: DirectIndexedX0
6964 lblF6mod2a: DirectIndexedX0
6968 lblF7mod2a: DirectIndirectIndexedLong0
6975 lblF9mod2a: AbsoluteIndexedY0
6988 lblFDmod2a: AbsoluteIndexedX0
6992 lblFEmod2a: AbsoluteIndexedX0
6996 lblFFmod2a: AbsoluteLongIndexedX0
7003 jumptable3: .long Op00mod3
7263 lbl01mod3a: DirectIndexedIndirect0
7270 lbl03mod3a: StackasmRelative
7286 lbl07mod3a: DirectIndirectLong
7302 lbl0Cmod3a: Absolute
7306 lbl0Dmod3a: Absolute
7310 lbl0Emod3a: Absolute
7314 lbl0Fmod3a: AbsoluteLong
7321 lbl11mod3a: DirectIndirectIndexed0
7325 lbl12mod3a: DirectIndirect
7329 lbl13mod3a: StackasmRelativeIndirectIndexed0
7337 lbl15mod3a: DirectIndexedX0
7341 lbl16mod3a: DirectIndexedX0
7345 lbl17mod3a: DirectIndirectIndexedLong0
7352 lbl19mod3a: AbsoluteIndexedY0
7362 lbl1Cmod3a: Absolute
7366 lbl1Dmod3a: AbsoluteIndexedX0
7370 lbl1Emod3a: AbsoluteIndexedX0
7374 lbl1Fmod3a: AbsoluteLongIndexedX0
7381 lbl21mod3a: DirectIndexedIndirect0
7388 lbl23mod3a: StackasmRelative
7404 lbl27mod3a: DirectIndirectLong
7421 lbl2Cmod3a: Absolute
7425 lbl2Dmod3a: Absolute
7429 lbl2Emod3a: Absolute
7433 lbl2Fmod3a: AbsoluteLong
7440 lbl31mod3a: DirectIndirectIndexed0
7444 lbl32mod3a: DirectIndirect
7448 lbl33mod3a: StackasmRelativeIndirectIndexed0
7452 lbl34mod3a: DirectIndexedX0
7456 lbl35mod3a: DirectIndexedX0
7460 lbl36mod3a: DirectIndexedX0
7464 lbl37mod3a: DirectIndirectIndexedLong0
7471 lbl39mod3a: AbsoluteIndexedY0
7481 lbl3Cmod3a: AbsoluteIndexedX0
7485 lbl3Dmod3a: AbsoluteIndexedX0
7489 lbl3Emod3a: AbsoluteIndexedX0
7493 lbl3Fmod3a: AbsoluteLongIndexedX0
7501 lbl41mod3a: DirectIndexedIndirect0
7508 lbl43mod3a: StackasmRelative
7523 lbl47mod3a: DirectIndirectLong
7542 lbl4Dmod3a: Absolute
7546 lbl4Emod3a: Absolute
7550 lbl4Fmod3a: AbsoluteLong
7557 lbl51mod3a: DirectIndirectIndexed0
7561 lbl52mod3a: DirectIndirect
7565 lbl53mod3a: StackasmRelativeIndirectIndexed0
7572 lbl55mod3a: DirectIndexedX0
7576 lbl56mod3a: DirectIndexedX0
7580 lbl57mod3a: DirectIndirectIndexedLong0
7587 lbl59mod3a: AbsoluteIndexedY0
7600 lbl5Dmod3a: AbsoluteIndexedX0
7604 lbl5Emod3a: AbsoluteIndexedX0
7608 lbl5Fmod3a: AbsoluteLongIndexedX0
7615 lbl61mod3a: DirectIndexedIndirect0
7622 lbl63mod3a: StackasmRelative
7640 lbl67mod3a: DirectIndirectLong
7648 lbl69mod3a: Immediate16
7662 lbl6Dmod3a: Absolute
7666 lbl6Emod3a: Absolute
7670 lbl6Fmod3a: AbsoluteLong
7677 lbl71mod3a: DirectIndirectIndexed0
7681 lbl72mod3a: DirectIndirect
7685 lbl73mod3a: StackasmRelativeIndirectIndexed0
7690 lbl74mod3a: DirectIndexedX0
7694 lbl75mod3a: DirectIndexedX0
7699 lbl76mod3a: DirectIndexedX0
7703 lbl77mod3a: DirectIndirectIndexedLong0
7710 lbl79mod3a: AbsoluteIndexedY0
7720 lbl7Cmod3: AbsoluteIndexedIndirectX0
7724 lbl7Dmod3a: AbsoluteIndexedX0
7728 lbl7Emod3a: AbsoluteIndexedX0
7732 lbl7Fmod3a: AbsoluteLongIndexedX0
7740 lbl81mod3a: DirectIndexedIndirect0
7747 lbl83mod3a: StackasmRelative
7763 lbl87mod3a: DirectIndirectLong
7779 lbl8Cmod3a: Absolute
7783 lbl8Dmod3a: Absolute
7787 lbl8Emod3a: Absolute
7791 lbl8Fmod3a: AbsoluteLong
7798 lbl91mod3a: DirectIndirectIndexed0
7802 lbl92mod3a: DirectIndirect
7806 lbl93mod3a: StackasmRelativeIndirectIndexed0
7810 lbl94mod3a: DirectIndexedX0
7814 lbl95mod3a: DirectIndexedX0
7818 lbl96mod3a: DirectIndexedY0
7822 lbl97mod3a: DirectIndirectIndexedLong0
7829 lbl99mod3a: AbsoluteIndexedY0
7839 lbl9Cmod3a: Absolute
7843 lbl9Dmod3a: AbsoluteIndexedX0
7847 lbl9Emod3: AbsoluteIndexedX0
7851 lbl9Fmod3a: AbsoluteLongIndexedX0
7858 lblA1mod3a: DirectIndexedIndirect0
7865 lblA3mod3a: StackasmRelative
7881 lblA7mod3a: DirectIndirectLong
7897 lblACmod3a: Absolute
7901 lblADmod3a: Absolute
7905 lblAEmod3a: Absolute
7909 lblAFmod3a: AbsoluteLong
7916 lblB1mod3a: DirectIndirectIndexed0
7920 lblB2mod3a: DirectIndirect
7924 lblB3mod3a: StackasmRelativeIndirectIndexed0
7928 lblB4mod3a: DirectIndexedX0
7932 lblB5mod3a: DirectIndexedX0
7936 lblB6mod3a: DirectIndexedY0
7940 lblB7mod3a: DirectIndirectIndexedLong0
7947 lblB9mod3a: AbsoluteIndexedY0
7957 lblBCmod3a: AbsoluteIndexedX0
7961 lblBDmod3a: AbsoluteIndexedX0
7965 lblBEmod3a: AbsoluteIndexedY0
7969 lblBFmod3a: AbsoluteLongIndexedX0
7976 lblC1mod3a: DirectIndexedIndirect0
7984 lblC3mod3a: StackasmRelative
8000 lblC7mod3a: DirectIndirectLong
8016 lblCCmod3a: Absolute
8020 lblCDmod3a: Absolute
8024 lblCEmod3a: Absolute
8028 lblCFmod3a: AbsoluteLong
8035 lblD1mod3a: DirectIndirectIndexed0
8039 lblD2mod3a: DirectIndirect
8043 lblD3mod3a: StackasmRelativeIndirectIndexed0
8050 lblD5mod3a: DirectIndexedX0
8054 lblD6mod3a: DirectIndexedX0
8058 lblD7mod3a: DirectIndirectIndexedLong0
8065 lblD9mod3a: AbsoluteIndexedY0
8078 lblDDmod3a: AbsoluteIndexedX0
8082 lblDEmod3a: AbsoluteIndexedX0
8086 lblDFmod3a: AbsoluteLongIndexedX0
8093 lblE1mod3a: DirectIndexedIndirect0
8101 lblE3mod3a: StackasmRelative
8117 lblE7mod3a: DirectIndirectLong
8124 lblE9mod3a: Immediate16
8134 lblECmod3a: Absolute
8138 lblEDmod3a: Absolute
8142 lblEEmod3a: Absolute
8146 lblEFmod3a: AbsoluteLong
8153 lblF1mod3a: DirectIndirectIndexed0
8157 lblF2mod3a: DirectIndirect
8161 lblF3mod3a: StackasmRelativeIndirectIndexed0
8168 lblF5mod3a: DirectIndexedX0
8172 lblF6mod3a: DirectIndexedX0
8176 lblF7mod3a: DirectIndirectIndexedLong0
8183 lblF9mod3a: AbsoluteIndexedY0
8196 lblFDmod3a: AbsoluteIndexedX0
8200 lblFEmod3a: AbsoluteIndexedX0
8204 lblFFmod3a: AbsoluteLongIndexedX0
8209 jumptable4: .long Op00mod4
8469 lbl01mod4a: DirectIndexedIndirect1
8476 lbl03mod4a: StackasmRelative
8492 lbl07mod4a: DirectIndirectLong
8508 lbl0Cmod4a: Absolute
8512 lbl0Dmod4a: Absolute
8516 lbl0Emod4a: Absolute
8520 lbl0Fmod4a: AbsoluteLong
8527 lbl11mod4a: DirectIndirectIndexed1
8531 lbl12mod4a: DirectIndirect
8535 lbl13mod4a: StackasmRelativeIndirectIndexed1
8543 lbl15mod4a: DirectIndexedX1
8547 lbl16mod4a: DirectIndexedX1
8551 lbl17mod4a: DirectIndirectIndexedLong1
8558 lbl19mod4a: AbsoluteIndexedY1
8568 lbl1Cmod4a: Absolute
8572 lbl1Dmod4a: AbsoluteIndexedX1
8576 lbl1Emod4a: AbsoluteIndexedX1
8580 lbl1Fmod4a: AbsoluteLongIndexedX1
8587 lbl21mod4a: DirectIndexedIndirect1
8594 lbl23mod4a: StackasmRelative
8610 lbl27mod4a: DirectIndirectLong
8627 lbl2Cmod4a: Absolute
8631 lbl2Dmod4a: Absolute
8635 lbl2Emod4a: Absolute
8639 lbl2Fmod4a: AbsoluteLong
8646 lbl31mod4a: DirectIndirectIndexed1
8650 lbl32mod4a: DirectIndirect
8654 lbl33mod4a: StackasmRelativeIndirectIndexed1
8658 lbl34mod4a: DirectIndexedX1
8662 lbl35mod4a: DirectIndexedX1
8666 lbl36mod4a: DirectIndexedX1
8670 lbl37mod4a: DirectIndirectIndexedLong1
8677 lbl39mod4a: AbsoluteIndexedY1
8687 lbl3Cmod4a: AbsoluteIndexedX1
8691 lbl3Dmod4a: AbsoluteIndexedX1
8695 lbl3Emod4a: AbsoluteIndexedX1
8699 lbl3Fmod4a: AbsoluteLongIndexedX1
8707 lbl41mod4a: DirectIndexedIndirect1
8714 lbl43mod4a: StackasmRelative
8729 lbl47mod4a: DirectIndirectLong
8748 lbl4Dmod4a: Absolute
8752 lbl4Emod4a: Absolute
8756 lbl4Fmod4a: AbsoluteLong
8763 lbl51mod4a: DirectIndirectIndexed1
8767 lbl52mod4a: DirectIndirect
8771 lbl53mod4a: StackasmRelativeIndirectIndexed1
8778 lbl55mod4a: DirectIndexedX1
8782 lbl56mod4a: DirectIndexedX1
8786 lbl57mod4a: DirectIndirectIndexedLong1
8793 lbl59mod4a: AbsoluteIndexedY1
8806 lbl5Dmod4a: AbsoluteIndexedX1
8810 lbl5Emod4a: AbsoluteIndexedX1
8814 lbl5Fmod4a: AbsoluteLongIndexedX1
8821 lbl61mod4a: DirectIndexedIndirect1
8828 lbl63mod4a: StackasmRelative
8846 lbl67mod4a: DirectIndirectLong
8854 lbl69mod4a: Immediate16
8868 lbl6Dmod4a: Absolute
8872 lbl6Emod4a: Absolute
8876 lbl6Fmod4a: AbsoluteLong
8883 lbl71mod4a: DirectIndirectIndexed1
8887 lbl72mod4a: DirectIndirect
8891 lbl73mod4a: StackasmRelativeIndirectIndexed1
8896 lbl74mod4a: DirectIndexedX1
8900 lbl75mod4a: DirectIndexedX1
8905 lbl76mod4a: DirectIndexedX1
8909 lbl77mod4a: DirectIndirectIndexedLong1
8916 lbl79mod4a: AbsoluteIndexedY1
8926 lbl7Cmod4: AbsoluteIndexedIndirectX1
8930 lbl7Dmod4a: AbsoluteIndexedX1
8934 lbl7Emod4a: AbsoluteIndexedX1
8938 lbl7Fmod4a: AbsoluteLongIndexedX1
8946 lbl81mod4a: DirectIndexedIndirect1
8953 lbl83mod4a: StackasmRelative
8969 lbl87mod4a: DirectIndirectLong
8985 lbl8Cmod4a: Absolute
8989 lbl8Dmod4a: Absolute
8993 lbl8Emod4a: Absolute
8997 lbl8Fmod4a: AbsoluteLong
9004 lbl91mod4a: DirectIndirectIndexed1
9008 lbl92mod4a: DirectIndirect
9012 lbl93mod4a: StackasmRelativeIndirectIndexed1
9016 lbl94mod4a: DirectIndexedX1
9020 lbl95mod4a: DirectIndexedX1
9024 lbl96mod4a: DirectIndexedY1
9028 lbl97mod4a: DirectIndirectIndexedLong1
9035 lbl99mod4a: AbsoluteIndexedY1
9045 lbl9Cmod4a: Absolute
9049 lbl9Dmod4a: AbsoluteIndexedX1
9053 lbl9Emod4: AbsoluteIndexedX1
9057 lbl9Fmod4a: AbsoluteLongIndexedX1
9064 lblA1mod4a: DirectIndexedIndirect1
9071 lblA3mod4a: StackasmRelative
9087 lblA7mod4a: DirectIndirectLong
9103 lblACmod4a: Absolute
9107 lblADmod4a: Absolute
9111 lblAEmod4a: Absolute
9115 lblAFmod4a: AbsoluteLong
9122 lblB1mod4a: DirectIndirectIndexed1
9126 lblB2mod4a: DirectIndirect
9130 lblB3mod4a: StackasmRelativeIndirectIndexed1
9134 lblB4mod4a: DirectIndexedX1
9138 lblB5mod4a: DirectIndexedX1
9142 lblB6mod4a: DirectIndexedY1
9146 lblB7mod4a: DirectIndirectIndexedLong1
9153 lblB9mod4a: AbsoluteIndexedY1
9163 lblBCmod4a: AbsoluteIndexedX1
9167 lblBDmod4a: AbsoluteIndexedX1
9171 lblBEmod4a: AbsoluteIndexedY1
9175 lblBFmod4a: AbsoluteLongIndexedX1
9182 lblC1mod4a: DirectIndexedIndirect1
9190 lblC3mod4a: StackasmRelative
9206 lblC7mod4a: DirectIndirectLong
9222 lblCCmod4a: Absolute
9226 lblCDmod4a: Absolute
9230 lblCEmod4a: Absolute
9234 lblCFmod4a: AbsoluteLong
9241 lblD1mod4a: DirectIndirectIndexed1
9245 lblD2mod4a: DirectIndirect
9249 lblD3mod4a: StackasmRelativeIndirectIndexed1
9256 lblD5mod4a: DirectIndexedX1
9260 lblD6mod4a: DirectIndexedX1
9264 lblD7mod4a: DirectIndirectIndexedLong1
9271 lblD9mod4a: AbsoluteIndexedY1
9284 lblDDmod4a: AbsoluteIndexedX1
9288 lblDEmod4a: AbsoluteIndexedX1
9292 lblDFmod4a: AbsoluteLongIndexedX1
9299 lblE1mod4a: DirectIndexedIndirect1
9307 lblE3mod4a: StackasmRelative
9323 lblE7mod4a: DirectIndirectLong
9330 lblE9mod4a: Immediate16
9340 lblECmod4a: Absolute
9344 lblEDmod4a: Absolute
9348 lblEEmod4a: Absolute
9352 lblEFmod4a: AbsoluteLong
9359 lblF1mod4a: DirectIndirectIndexed1
9363 lblF2mod4a: DirectIndirect
9367 lblF3mod4a: StackasmRelativeIndirectIndexed1
9374 lblF5mod4a: DirectIndexedX1
9378 lblF6mod4a: DirectIndexedX1
9382 lblF7mod4a: DirectIndirectIndexedLong1
9389 lblF9mod4a: AbsoluteIndexedY1
9402 lblFDmod4a: AbsoluteIndexedX1
9406 lblFEmod4a: AbsoluteIndexedX1
9410 lblFFmod4a: AbsoluteLongIndexedX1