summaryrefslogtreecommitdiff
path: root/src/os9x_65c816_opcodes.S
diff options
context:
space:
mode:
authorTwinaphex2018-04-20 19:19:52 +0200
committerGitHub2018-04-20 19:19:52 +0200
commit05632d536deb10fef7b8f95d73d3b998f1e91250 (patch)
treea69a19c172a88b38cd4ec3d06685ee52c578a545 /src/os9x_65c816_opcodes.S
parentc0e301f66f15571876e391b5e5ccf401cfbd692c (diff)
downloadsnes9x2002-05632d536deb10fef7b8f95d73d3b998f1e91250.tar.gz
snes9x2002-05632d536deb10fef7b8f95d73d3b998f1e91250.tar.bz2
snes9x2002-05632d536deb10fef7b8f95d73d3b998f1e91250.zip
Rename os9x_65c816_opcodes.s to os9x_65c816_opcodes.S
Diffstat (limited to 'src/os9x_65c816_opcodes.S')
-rw-r--r--src/os9x_65c816_opcodes.S2976
1 files changed, 2976 insertions, 0 deletions
diff --git a/src/os9x_65c816_opcodes.S b/src/os9x_65c816_opcodes.S
new file mode 100644
index 0000000..6c3cc96
--- /dev/null
+++ b/src/os9x_65c816_opcodes.S
@@ -0,0 +1,2976 @@
+@ ===========================================
+@ ===========================================
+@ Adressing mode
+@ ===========================================
+@ ===========================================
+
+
+.macro Absolute
+ ADD2MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc],#2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+.endm
+.macro AbsoluteIndexedIndirectX0
+ ADD2MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ ADD rscratch , reg_x, rscratch, LSL #16
+ MOV rscratch , rscratch, LSR #16
+ ORR rscratch , rscratch, reg_p_bank, LSL #16
+ S9xGetWordLow
+
+.endm
+.macro AbsoluteIndexedIndirectX1
+ ADD2MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ ADD rscratch , rscratch, reg_x, LSR #24
+ BIC rscratch , rscratch, #0x00FF0000
+ ORR rscratch , rscratch, reg_p_bank, LSL #16
+ S9xGetWordLow
+
+.endm
+.macro AbsoluteIndirectLong
+ ADD2MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ S9xGetWordLowRegNS rscratch2
+ ADD rscratch , rscratch, #2
+ STMFD r13!,{rscratch2}
+ S9xGetByteLow
+ LDMFD r13!,{rscratch2}
+ ORR rscratch , rscratch2, rscratch, LSL #16
+.endm
+.macro AbsoluteIndirect
+ ADD2MEM
+ LDRB rscratch2 , [rpc,#1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ S9xGetWordLow
+ ORR rscratch , rscratch, reg_p_bank, LSL #16
+.endm
+.macro AbsoluteIndexedX0
+ ADD2MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ ADD rscratch , rscratch, reg_x, LSR #16
+.endm
+.macro AbsoluteIndexedX1
+ ADD2MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ ADD rscratch , rscratch, reg_x, LSR #24
+.endm
+
+
+.macro AbsoluteIndexedY0
+ ADD2MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ ADD rscratch , rscratch, reg_y, LSR #16
+.endm
+.macro AbsoluteIndexedY1
+ ADD2MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ ADD rscratch , rscratch, reg_y, LSR #24
+.endm
+.macro AbsoluteLong
+ ADD3MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ LDRB rscratch2 , [rpc], #1
+ ORR rscratch , rscratch, rscratch2, LSL #16
+.endm
+
+
+.macro AbsoluteLongIndexedX0
+ ADD3MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ LDRB rscratch2 , [rpc], #1
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ ADD rscratch , rscratch, reg_x, LSR #16
+ BIC rscratch, rscratch, #0xFF000000
+.endm
+.macro AbsoluteLongIndexedX1
+ ADD3MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ LDRB rscratch2 , [rpc], #1
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ ADD rscratch , rscratch, reg_x, LSR #24
+ BIC rscratch, rscratch, #0xFF000000
+.endm
+.macro Direct
+ ADD1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , reg_d, rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+.endm
+.macro DirectIndirect
+ ADD1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , reg_d, rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+ S9xGetWordLow
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+.endm
+.macro DirectIndirectLong
+ ADD1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , reg_d, rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+ S9xGetWordLowRegNS rscratch2
+ ADD rscratch , rscratch,#2
+ STMFD r13!,{rscratch2}
+ S9xGetByteLow
+ LDMFD r13!,{rscratch2}
+ ORR rscratch , rscratch2, rscratch, LSL #16
+.endm
+.macro DirectIndirectIndexed0
+ ADD1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , reg_d, rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+ S9xGetWordLow
+ ORR rscratch, rscratch,reg_d_bank, LSL #16
+ ADD rscratch, rscratch,reg_y, LSR #16
+.endm
+.macro DirectIndirectIndexed1
+ ADD1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , reg_d, rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+ S9xGetWordLow
+ ORR rscratch, rscratch,reg_d_bank, LSL #16
+ ADD rscratch, rscratch,reg_y, LSR #24
+.endm
+.macro DirectIndirectIndexedLong0
+ ADD1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , reg_d, rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+ S9xGetWordLowRegNS rscratch2
+ ADD rscratch , rscratch,#2
+ STMFD r13!,{rscratch2}
+ S9xGetByteLow
+ LDMFD r13!,{rscratch2}
+ ORR rscratch , rscratch2, rscratch, LSL #16
+
+ ADD rscratch, rscratch,reg_y, LSR #16
+.endm
+.macro DirectIndirectIndexedLong1
+ ADD1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , reg_d, rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+ S9xGetWordLowRegNS rscratch2
+ ADD rscratch , rscratch,#2
+ STMFD r13!,{rscratch2}
+ S9xGetByteLow
+ LDMFD r13!,{rscratch2}
+ ORR rscratch , rscratch2, rscratch, LSL #16
+ ADD rscratch, rscratch,reg_y, LSR #24
+.endm
+.macro DirectIndexedIndirect0
+ ADD1CYCLE1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch2 , reg_d , reg_x
+ ADD rscratch , rscratch2 , rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+ S9xGetWordLow
+ ORR rscratch , rscratch , reg_d_bank, LSL #16
+.endm
+.macro DirectIndexedIndirect1
+ ADD1CYCLE1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch2 , reg_d , reg_x, LSR #8
+ ADD rscratch , rscratch2 , rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+ S9xGetWordLow
+ ORR rscratch , rscratch , reg_d_bank, LSL #16
+.endm
+.macro DirectIndexedX0
+ ADD1CYCLE1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch2 , reg_d , reg_x
+ ADD rscratch , rscratch2 , rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+.endm
+.macro DirectIndexedX1
+ ADD1CYCLE1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch2 , reg_d , reg_x, LSR #8
+ ADD rscratch , rscratch2 , rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+.endm
+.macro DirectIndexedY0
+ ADD1CYCLE1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch2 , reg_d , reg_y
+ ADD rscratch , rscratch2 , rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+.endm
+.macro DirectIndexedY1
+ ADD1CYCLE1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch2 , reg_d , reg_y, LSR #8
+ ADD rscratch , rscratch2 , rscratch, LSL #16
+ MOV rscratch, rscratch, LSR #16
+.endm
+.macro Immediate8
+ ADD rscratch, rpc, reg_p_bank, LSL #16
+ SUB rscratch, rscratch, regpcbase
+ ADD rpc, rpc, #1
+.endm
+.macro Immediate16
+ ADD rscratch, rpc, reg_p_bank, LSL #16
+ SUB rscratch, rscratch, regpcbase
+ ADD rpc, rpc, #2
+.endm
+.macro asmRelative
+ ADD1MEM
+ LDRSB rscratch , [rpc],#1
+ ADD rscratch , rscratch , rpc
+ SUB rscratch , rscratch, regpcbase
+ BIC rscratch,rscratch,#0x00FF0000
+ BIC rscratch,rscratch,#0xFF000000
+.endm
+.macro asmRelativeLong
+ ADD1CYCLE2MEM
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch , rscratch, rscratch2, LSL #8
+ SUB rscratch2 , rpc, regpcbase
+ ADD rscratch , rscratch2, rscratch
+ BIC rscratch,rscratch,#0x00FF0000
+.endm
+
+
+.macro StackasmRelative
+ ADD1CYCLE1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , rscratch, reg_s
+ BIC rscratch,rscratch,#0x00FF0000
+.endm
+.macro StackasmRelativeIndirectIndexed0
+ ADD2CYCLE1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , rscratch, reg_s
+ BIC rscratch,rscratch,#0x00FF0000
+ S9xGetWordLow
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ ADD rscratch , rscratch, reg_y, LSR #16
+ BIC rscratch, rscratch, #0xFF000000
+.endm
+.macro StackasmRelativeIndirectIndexed1
+ ADD2CYCLE1MEM
+ LDRB rscratch , [rpc], #1
+ ADD rscratch , rscratch, reg_s
+ BIC rscratch,rscratch,#0x00FF0000
+ S9xGetWordLow
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ ADD rscratch , rscratch, reg_y, LSR #24
+ BIC rscratch, rscratch, #0xFF000000
+.endm
+
+
+/****************************************/
+.macro PushB reg
+ MOV rscratch,reg_s
+ S9xSetByte \reg
+ SUB reg_s,reg_s,#1
+.endm
+.macro PushBLow reg
+ MOV rscratch,reg_s
+ S9xSetByteLow \reg
+ SUB reg_s,reg_s,#1
+.endm
+.macro PushWLow reg
+ SUB rscratch,reg_s,#1
+ S9xSetWordLow \reg
+ SUB reg_s,reg_s,#2
+.endm
+.macro PushWrLow
+ MOV rscratch2,rscratch
+ SUB rscratch,reg_s,#1
+ S9xSetWordLow rscratch2
+ SUB reg_s,reg_s,#2
+.endm
+.macro PushW reg
+ SUB rscratch,reg_s,#1
+ S9xSetWord \reg
+ SUB reg_s,reg_s,#2
+.endm
+
+/********/
+
+.macro PullB reg
+ ADD rscratch,reg_s,#1
+ S9xGetByteLow
+ ADD reg_s,reg_s,#1
+ MOV \reg,rscratch,LSL #24
+.endm
+.macro PullBr
+ ADD rscratch,reg_s,#1
+ S9xGetByte
+ ADD reg_s,reg_s,#1
+.endm
+.macro PullBLow reg
+ ADD rscratch,reg_s,#1
+ S9xGetByteLow
+ ADD reg_s,reg_s,#1
+ MOV \reg,rscratch
+.endm
+.macro PullBrLow
+ ADD rscratch,reg_s,#1
+ S9xGetByteLow
+ ADD reg_s,reg_s,#1
+.endm
+.macro PullW reg
+ ADD rscratch,reg_s,#1
+ S9xGetWordLow
+ ADD reg_s,reg_s,#2
+ MOV \reg,rscratch,LSL #16
+.endm
+
+.macro PullWLow reg
+ ADD rscratch,reg_s,#1
+ S9xGetWordLow
+ ADD reg_s,reg_s,#2
+ MOV \reg,rscratch
+.endm
+
+
+/*****************/
+.macro PullBS reg
+ ADD rscratch,reg_s,#1
+ S9xGetByteLow
+ ADD reg_s,reg_s,#1
+ MOVS \reg,rscratch,LSL #24
+.endm
+.macro PullBrS
+ ADD rscratch,reg_s,#1
+ S9xGetByteLow
+ ADD reg_s,reg_s,#1
+ MOVS rscratch,rscratch,LSL #24
+.endm
+.macro PullBLowS reg
+ ADD rscratch,reg_s,#1
+ S9xGetByteLow
+ ADD reg_s,reg_s,#1
+ MOVS \reg,rscratch
+.endm
+.macro PullBrLowS
+ ADD rscratch,reg_s,#1
+ S9xGetByteLow
+ ADD reg_s,reg_s,#1
+ MOVS rscratch,rscratch
+.endm
+.macro PullWS reg
+ ADD rscratch,reg_s,#1
+ S9xGetWordLow
+ ADD reg_s,reg_s,#2
+ MOVS \reg,rscratch, LSL #16
+.endm
+.macro PullWrS
+ ADD rscratch,reg_s,#1
+ S9xGetWordLow
+ ADD reg_s,reg_s,#2
+ MOVS rscratch,rscratch, LSL #16
+.endm
+.macro PullWLowS reg
+ ADD rscratch,reg_s,#1
+ S9xGetWordLow
+ ADD reg_s,reg_s,#2
+ MOVS \reg,rscratch
+.endm
+.macro PullWrLowS
+ ADD rscratch,reg_s,#1
+ S9xGetWordLow
+ ADD reg_s,reg_s,#2
+ MOVS rscratch,rscratch
+.endm
+
+
+/*****************************************************************
+ FLAGS
+*****************************************************************/
+
+.macro UPDATE_C
+ @ CC : ARM Carry Clear
+ BICCC rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
+ @ CS : ARM Carry Set
+ ORRCS rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
+.endm
+.macro UPDATE_Z
+ @ NE : ARM Zero Clear
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ @ EQ : ARM Zero Set
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+.endm
+.macro UPDATE_ZN
+ @ NE : ARM Zero Clear
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ @ EQ : ARM Zero Set
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+ @ PL : ARM Neg Clear
+ BICPL rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
+ @ MI : ARM Neg Set
+ ORRMI rstatus, rstatus, #MASK_NEG @ 1 : OR mask 00000100000 : set N to one
+.endm
+
+/*****************************************************************
+ OPCODES_MAC
+*****************************************************************/
+
+
+
+
+.macro ADC8
+ TST rstatus, #MASK_DECIMAL
+ BEQ 1111f
+ S9xGetByte
+
+
+ STMFD R13!,{rscratch}
+ MOV rscratch4,#0x0F000000
+ @ rscratch2=xxW1xxxxxxxxxxxx
+ AND rscratch2, rscratch, rscratch4
+ @ rscratch=xxW2xxxxxxxxxxxx
+ AND rscratch, rscratch4, rscratch, LSR #4
+ @ rscratch3=xxA2xxxxxxxxxxxx
+ AND rscratch3, rscratch4, reg_a, LSR #4
+ @ rscratch4=xxA1xxxxxxxxxxxx
+ AND rscratch4,reg_a,rscratch4
+ @ R1=A1+W1+CARRY
+ TST rstatus, #MASK_CARRY
+ ADDNE rscratch2, rscratch2, #0x01000000
+ ADD rscratch2,rscratch2,rscratch4
+ @ if R1 > 9
+ CMP rscratch2, #0x09000000
+ @ then R1 -= 10
+ SUBGT rscratch2, rscratch2, #0x0A000000
+ @ then A2++
+ ADDGT rscratch3, rscratch3, #0x01000000
+ @ R2 = A2+W2
+ ADD rscratch3, rscratch3, rscratch
+ @ if R2 > 9
+ CMP rscratch3, #0x09000000
+ @ then R2 -= 10@
+ SUBGT rscratch3, rscratch3, #0x0A000000
+ @ then SetCarry()
+ ORRGT rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
+ @ else ClearCarry()
+ BICLE rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
+ @ gather rscratch3 and rscratch2 into ans8
+ @ rscratch3 : 0R2000000
+ @ rscratch2 : 0R1000000
+ @ -> 0xR2R1000000
+ ORR rscratch2, rscratch2, rscratch3, LSL #4
+ LDMFD R13!,{rscratch}
+ @ only last bit
+ AND rscratch,rscratch,#0x80000000
+ @ (register.AL ^ Work8)
+ EORS rscratch3, reg_a, rscratch
+ BICNE rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
+ BNE 1112f
+ @ (Work8 ^ Ans8)
+ EORS rscratch3, rscratch2, rscratch
+ @ & 0x80
+ TSTNE rscratch3,#0x80000000
+ BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
+ ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
+1112:
+ MOVS reg_a, rscratch2
+ UPDATE_ZN
+ B 1113f
+1111:
+ S9xGetByteLow
+ MOVS rscratch2, rstatus, LSR #MASK_SHIFTER_CARRY
+ SUBCS rscratch, rscratch, #0x100
+ ADCS reg_a, reg_a, rscratch, ROR #8
+ @ OverFlow
+ ORRVS rstatus, rstatus, #MASK_OVERFLOW
+ BICVC rstatus, rstatus, #MASK_OVERFLOW
+ @ Carry
+ UPDATE_C
+ @ clear lower part
+ ANDS reg_a, reg_a, #0xFF000000
+ @ Update flag
+ UPDATE_ZN
+1113:
+.endm
+/* TO TEST */
+.macro ADC16
+ TST rstatus, #MASK_DECIMAL
+ BEQ 1111f
+ S9xGetWord
+
+ @ rscratch = W3W2W1W0........
+ LDR rscratch4, = 0x0F0F0000
+ @ rscratch2 = xxW2xxW0xxxxxx
+ @ rscratch3 = xxW3xxW1xxxxxx
+ AND rscratch2, rscratch4, rscratch
+ AND rscratch3, rscratch4, rscratch, LSR #4
+ @ rscratch2 = xxW3xxW1xxW2xxW0
+ ORR rscratch2, rscratch3, rscratch2, LSR #16
+ @ rscratch3 = xxA2xxA0xxxxxx
+ @ rscratch4 = xxA3xxA1xxxxxx
+ @ rscratch2 = xxA3xxA1xxA2xxA0
+ AND rscratch3, rscratch4, reg_a
+ AND rscratch4, rscratch4, reg_a, LSR #4
+ ORR rscratch3, rscratch4, rscratch3, LSR #16
+ ADD rscratch2, rscratch3, rscratch2
+ LDR rscratch4, = 0x0F0F0000
+ @ rscratch2 = A + W
+ TST rstatus, #MASK_CARRY
+ ADDNE rscratch2, rscratch2, #0x1
+ @ rscratch2 = A + W + C
+ @ A0
+ AND rscratch3, rscratch2, #0x0000001F
+ CMP rscratch3, #0x00000009
+ ADDHI rscratch2, rscratch2, #0x00010000
+ SUBHI rscratch2, rscratch2, #0x0000000A
+ @ A1
+ AND rscratch3, rscratch2, #0x001F0000
+ CMP rscratch3, #0x00090000
+ ADDHI rscratch2, rscratch2, #0x00000100
+ SUBHI rscratch2, rscratch2, #0x000A0000
+ @ A2
+ AND rscratch3, rscratch2, #0x00001F00
+ CMP rscratch3, #0x00000900
+ SUBHI rscratch2, rscratch2, #0x00000A00
+ ADDHI rscratch2, rscratch2, #0x01000000
+ @ A3
+ AND rscratch3, rscratch2, #0x1F000000
+ CMP rscratch3, #0x09000000
+ SUBHI rscratch2, rscratch2, #0x0A000000
+ @ SetCarry
+ ORRHI rstatus, rstatus, #MASK_CARRY
+ @ ClearCarry
+ BICLS rstatus, rstatus, #MASK_CARRY
+ @ rscratch2 = xxR3xxR1xxR2xxR0
+ @ Pack result
+ @ rscratch3 = xxR3xxR1xxxxxxxx
+ AND rscratch3, rscratch4, rscratch2
+ @ rscratch2 = xxR2xxR0xxxxxxxx
+ AND rscratch2, rscratch4, rscratch2,LSL #16
+ @ rscratch2 = R3R2R1R0xxxxxxxx
+ ORR rscratch2, rscratch2,rscratch3,LSL #4
+@ only last bit
+ AND rscratch,rscratch,#0x80000000
+ @ (register.AL ^ Work8)
+ EORS rscratch3, reg_a, rscratch
+ BICNE rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
+ BNE 1112f
+ @ (Work8 ^ Ans8)
+ EORS rscratch3, rscratch2, rscratch
+ TSTNE rscratch3,#0x80000000
+ BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
+ ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
+1112:
+ MOVS reg_a, rscratch2
+ UPDATE_ZN
+ B 1113f
+1111:
+ S9xGetWordLow
+ MOVS rscratch2, rstatus, LSR #MASK_SHIFTER_CARRY
+ SUBCS rscratch, rscratch, #0x10000
+ ADCS reg_a, reg_a,rscratch, ROR #16
+ @ OverFlow
+ ORRVS rstatus, rstatus, #MASK_OVERFLOW
+ BICVC rstatus, rstatus, #MASK_OVERFLOW
+ MOV reg_a, reg_a, LSR #16
+ @ Carry
+ UPDATE_C
+ @ clear lower parts
+ MOVS reg_a, reg_a, LSL #16
+ @ Update flag
+ UPDATE_ZN
+1113:
+.endm
+
+
+.macro AND16
+ S9xGetWord
+ ANDS reg_a, reg_a, rscratch
+ UPDATE_ZN
+.endm
+.macro AND8
+ S9xGetByte
+ ANDS reg_a, reg_a, rscratch
+ UPDATE_ZN
+.endm
+.macro A_ASL8
+ @ 7 instr
+ MOVS reg_a, reg_a, LSL #1
+ UPDATE_C
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro A_ASL16
+ @ 7 instr
+ MOVS reg_a, reg_a, LSL #1
+ UPDATE_C
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro ASL16
+ S9xGetWordRegNS rscratch2 @ do not destroy Opadress in rscratch
+ MOVS rscratch2, rscratch2, LSL #1
+ UPDATE_C
+ UPDATE_ZN
+ S9xSetWord rscratch2
+ ADD1CYCLE
+.endm
+.macro ASL8
+ S9xGetByteRegNS rscratch2 @ do not destroy Opadress in rscratch
+ MOVS rscratch2, rscratch2, LSL #1
+ UPDATE_C
+ UPDATE_ZN
+ S9xSetByte rscratch2
+ ADD1CYCLE
+.endm
+.macro BIT8
+ S9xGetByte
+ MOVS rscratch2, rscratch, LSL #1
+ @ Trick in ASM : shift one more bit : ARM C = Snes N
+ @ ARM N = Snes V
+ @ If Carry Set, then Set Neg in SNES
+ BICCC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set C to zero
+ ORRCS rstatus, rstatus, #MASK_NEG @ 1 : OR mask 00000100000 : set C to one
+ @ If Neg Set, then Set Overflow in SNES
+ BICPL rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set N to zero
+ ORRMI rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set N to one
+
+ @ Now do a real AND with A register
+ @ Set Zero Flag, bit test
+ ANDS rscratch2, reg_a, rscratch
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+.endm
+
+.macro BIT16
+ S9xGetWord
+ MOVS rscratch2, rscratch, LSL #1
+ @ Trick in ASM : shift one more bit : ARM C = Snes N
+ @ ARM N = Snes V
+ @ If Carry Set, then Set Neg in SNES
+ BICCC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
+ ORRCS rstatus, rstatus, #MASK_NEG @ 1 : OR mask 00000100000 : set N to one
+ @ If Neg Set, then Set Overflow in SNES
+ BICPL rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
+ ORRMI rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
+ @ Now do a real AND with A register
+ @ Set Zero Flag, bit test
+ ANDS rscratch2, reg_a, rscratch
+ @ Bit set ->Z=0->xxxNE Clear flag
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ @ Bit clear->Z=1->xxxEQ Set flag
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+.endm
+.macro CMP8
+ S9xGetByte
+ SUBS rscratch2,reg_a,rscratch
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+
+.endm
+.macro CMP16
+ S9xGetWord
+ SUBS rscratch2,reg_a,rscratch
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+
+.endm
+.macro CMX16
+ S9xGetWord
+ SUBS rscratch2,reg_x,rscratch
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+.endm
+.macro CMX8
+ S9xGetByte
+ SUBS rscratch2,reg_x,rscratch
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+.endm
+.macro CMY16
+ S9xGetWord
+ SUBS rscratch2,reg_y,rscratch
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+.endm
+.macro CMY8
+ S9xGetByte
+ SUBS rscratch2,reg_y,rscratch
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+.endm
+.macro A_DEC8
+ @MOV rscratch,#0
+ SUBS reg_a, reg_a, #0x01000000
+ @STR rscratch,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro A_DEC16
+ @MOV rscratch,#0
+ SUBS reg_a, reg_a, #0x00010000
+ @STR rscratch,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro DEC16
+ S9xGetWordRegNS rscratch2 @ do not destroy Opadress in rscratch
+ @MOV rscratch3,#0
+ SUBS rscratch2, rscratch2, #0x00010000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ S9xSetWord rscratch2
+ ADD1CYCLE
+.endm
+.macro DEC8
+ S9xGetByteRegNS rscratch2 @ do not destroy Opadress in rscratch
+ @MOV rscratch3,#0
+ SUBS rscratch2, rscratch2, #0x01000000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ S9xSetByte rscratch2
+ ADD1CYCLE
+.endm
+.macro EOR16
+ S9xGetWord
+ EORS reg_a, reg_a, rscratch
+ UPDATE_ZN
+.endm
+.macro EOR8
+ S9xGetByte
+ EORS reg_a, reg_a, rscratch
+ UPDATE_ZN
+.endm
+.macro A_INC8
+ @MOV rscratch3,#0
+ ADDS reg_a, reg_a, #0x01000000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro A_INC16
+ @MOV rscratch3,#0
+ ADDS reg_a, reg_a, #0x00010000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro INC16
+ S9xGetWordRegNS rscratch2
+ @MOV rscratch3,#0
+ ADDS rscratch2, rscratch2, #0x00010000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ S9xSetWord rscratch2
+ ADD1CYCLE
+.endm
+.macro INC8
+ S9xGetByteRegNS rscratch2
+ @MOV rscratch3,#0
+ ADDS rscratch2, rscratch2, #0x01000000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ S9xSetByte rscratch2
+ ADD1CYCLE
+.endm
+.macro LDA16
+ S9xGetWordRegStatus reg_a
+ UPDATE_ZN
+.endm
+.macro LDA8
+ S9xGetByteRegStatus reg_a
+ UPDATE_ZN
+.endm
+.macro LDX16
+ S9xGetWordRegStatus reg_x
+ UPDATE_ZN
+.endm
+.macro LDX8
+ S9xGetByteRegStatus reg_x
+ UPDATE_ZN
+.endm
+.macro LDY16
+ S9xGetWordRegStatus reg_y
+ UPDATE_ZN
+.endm
+.macro LDY8
+ S9xGetByteRegStatus reg_y
+ UPDATE_ZN
+.endm
+.macro A_LSR16
+ BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
+ MOVS reg_a, reg_a, LSR #17 @ hhhhhhhh llllllll 00000000 00000000 -> 00000000 00000000 0hhhhhhh hlllllll
+ @ Update Zero
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ MOV reg_a, reg_a, LSL #16 @ -> 0lllllll 00000000 00000000 00000000
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+ @ Note : the two MOV are included between instruction, to optimize
+ @ the pipeline.
+ UPDATE_C
+ ADD1CYCLE
+.endm
+.macro A_LSR8
+ BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
+ MOVS reg_a, reg_a, LSR #25 @ llllllll 00000000 00000000 00000000 -> 00000000 00000000 00000000 0lllllll
+ @ Update Zero
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ MOV reg_a, reg_a, LSL #24 @ -> 00000000 00000000 00000000 0lllllll
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+ @ Note : the two MOV are included between instruction, to optimize
+ @ the pipeline.
+ UPDATE_C
+ ADD1CYCLE
+.endm
+.macro LSR16
+ S9xGetWordRegNS rscratch2
+ @ N set to zero by >> 1 LSR
+ BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
+ MOVS rscratch2, rscratch2, LSR #17 @ llllllll 00000000 00000000 00000000 -> 00000000 00000000 00000000 0lllllll
+ @ Update Carry
+ BICCC rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
+ ORRCS rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
+ @ Update Zero
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+ S9xSetWordLow rscratch2
+ ADD1CYCLE
+.endm
+.macro LSR8
+ S9xGetByteRegNS rscratch2
+ @ N set to zero by >> 1 LSR
+ BIC rstatus, rstatus, #MASK_NEG @ 0 : AND mask 11111011111 : set N to zero
+ MOVS rscratch2, rscratch2, LSR #25 @ llllllll 00000000 00000000 00000000 -> 00000000 00000000 00000000 0lllllll
+ @ Update Carry
+ BICCC rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
+ ORRCS rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
+ @ Update Zero
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+ S9xSetByteLow rscratch2
+ ADD1CYCLE
+.endm
+.macro ORA8
+ S9xGetByte
+ ORRS reg_a, reg_a, rscratch
+ UPDATE_ZN
+.endm
+.macro ORA16
+ S9xGetWord
+ ORRS reg_a, reg_a, rscratch
+ UPDATE_ZN
+.endm
+.macro A_ROL16
+ TST rstatus, #MASK_CARRY
+ ORRNE reg_a, reg_a, #0x00008000
+ MOVS reg_a, reg_a, LSL #1
+ UPDATE_ZN
+ UPDATE_C
+ ADD1CYCLE
+.endm
+.macro A_ROL8
+ TST rstatus, #MASK_CARRY
+ ORRNE reg_a, reg_a, #0x00800000
+ MOVS reg_a, reg_a, LSL #1
+ UPDATE_ZN
+ UPDATE_C
+ ADD1CYCLE
+.endm
+.macro ROL16
+ S9xGetWordRegNS rscratch2
+ TST rstatus, #MASK_CARRY
+ ORRNE rscratch2, rscratch2, #0x00008000
+ MOVS rscratch2, rscratch2, LSL #1
+ UPDATE_ZN
+ UPDATE_C
+ S9xSetWord rscratch2
+ ADD1CYCLE
+.endm
+.macro ROL8
+ S9xGetByteRegNS rscratch2
+ TST rstatus, #MASK_CARRY
+ ORRNE rscratch2, rscratch2, #0x00800000
+ MOVS rscratch2, rscratch2, LSL #1
+ UPDATE_ZN
+ UPDATE_C
+ S9xSetByte rscratch2
+ ADD1CYCLE
+.endm
+.macro A_ROR16
+ MOV reg_a,reg_a, LSR #16
+ TST rstatus, #MASK_CARRY
+ ORRNE reg_a, reg_a, #0x00010000
+ ORRNE rstatus,rstatus,#MASK_NEG
+ BICEQ rstatus,rstatus,#MASK_NEG
+ MOVS reg_a,reg_a,LSR #1
+ UPDATE_C
+ UPDATE_Z
+ MOV reg_a,reg_a, LSL #16
+ ADD1CYCLE
+.endm
+.macro A_ROR8
+ MOV reg_a,reg_a, LSR #24
+ TST rstatus, #MASK_CARRY
+ ORRNE reg_a, reg_a, #0x00000100
+ ORRNE rstatus,rstatus,#MASK_NEG
+ BICEQ rstatus,rstatus,#MASK_NEG
+ MOVS reg_a,reg_a,LSR #1
+ UPDATE_C
+ UPDATE_Z
+ MOV reg_a,reg_a, LSL #24
+ ADD1CYCLE
+.endm
+.macro ROR16
+ S9xGetWordLowRegNS rscratch2
+ TST rstatus, #MASK_CARRY
+ ORRNE rscratch2, rscratch2, #0x00010000
+ ORRNE rstatus,rstatus,#MASK_NEG
+ BICEQ rstatus,rstatus,#MASK_NEG
+ MOVS rscratch2,rscratch2,LSR #1
+ UPDATE_C
+ UPDATE_Z
+ S9xSetWordLow rscratch2
+ ADD1CYCLE
+
+.endm
+.macro ROR8
+ S9xGetByteLowRegNS rscratch2
+ TST rstatus, #MASK_CARRY
+ ORRNE rscratch2, rscratch2, #0x00000100
+ ORRNE rstatus,rstatus,#MASK_NEG
+ BICEQ rstatus,rstatus,#MASK_NEG
+ MOVS rscratch2,rscratch2,LSR #1
+ UPDATE_C
+ UPDATE_Z
+ S9xSetByteLow rscratch2
+ ADD1CYCLE
+.endm
+
+.macro SBC16
+ TST rstatus, #MASK_DECIMAL
+ BEQ 1111f
+ @ TODO
+ S9xGetWord
+
+ STMFD R13!,{rscratch9}
+ MOV rscratch9,#0x000F0000
+ @ rscratch2 - result
+ @ rscratch3 - scratch
+ @ rscratch4 - scratch
+ @ rscratch9 - pattern
+
+ AND rscratch2, rscratch, #0x000F0000
+ TST rstatus, #MASK_CARRY
+ ADDEQ rscratch2, rscratch2, #0x00010000 @ W1=W1+!Carry
+ AND rscratch4, reg_a, #0x000F0000
+ SUB rscratch2, rscratch4,rscratch2 @ R1=A1-W1-!Carry
+ CMP rscratch2, #0x00090000 @ if R1 > 9
+ ADDHI rscratch2, rscratch2, #0x000A0000 @ then R1 += 10
+ AND rscratch2, rscratch2, #0x000F0000
+
+ AND rscratch3, rscratch9, rscratch, LSR #4
+ ADDHI rscratch3, rscratch3, #0x00010000 @ then (W2++)
+
+ AND rscratch4, rscratch9, reg_a, LSR #4
+ SUB rscratch3, rscratch4, rscratch3 @ R2=A2-W2
+ CMP rscratch3, #0x00090000 @ if R2 > 9
+ ADDHI rscratch3, rscratch3, #0x000A0000 @ then R2 += 10
+ AND rscratch3, rscratch3, #0x000F0000
+ ORR rscratch2, rscratch2, rscratch3,LSL #4
+
+ AND rscratch3, rscratch9, rscratch, LSR #8
+ ADDHI rscratch3, rscratch3, #0x00010000 @ then (W3++)
+
+ AND rscratch4, rscratch9, reg_a, LSR #8
+ SUB rscratch3, rscratch4, rscratch3 @ R3=A3-W3
+ CMP rscratch3, #0x00090000 @ if R3 > 9
+ ADDHI rscratch3, rscratch3, #0x000A0000 @ then R3 += 10
+ AND rscratch3, rscratch3, #0x000F0000
+ ORR rscratch2, rscratch2, rscratch3,LSL #8
+
+ AND rscratch3, rscratch9, rscratch, LSR #12
+ ADDHI rscratch3, rscratch3, #0x00010000 @ then (W3++)
+
+ AND rscratch4, rscratch9, reg_a, LSR #12
+ SUB rscratch3, rscratch4, rscratch3 @ R4=A4-W4
+ CMP rscratch3, #0x00090000 @ if R4 > 9
+ ADDHI rscratch3, rscratch3, #0x000A0000 @ then R4 += 10
+ BICHI rstatus, rstatus, #MASK_CARRY @ then ClearCarry
+ ORRLS rstatus, rstatus, #MASK_CARRY @ else SetCarry
+
+ AND rscratch3,rscratch3,#0x000F0000
+ ORR rscratch2,rscratch2,rscratch3,LSL #12
+
+ LDMFD R13!,{rscratch9}
+ @ only last bit
+ AND reg_a,reg_a,#0x80000000
+ @ (register.A.W ^ Work8)
+ EORS rscratch3, reg_a, rscratch
+ BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
+ BEQ 1112f
+ @ (register.A.W ^ Ans8)
+ EORS rscratch3, reg_a, rscratch2
+ @ & 0x80
+ TSTNE rscratch3,#0x80000000
+ BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
+ ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
+1112:
+ MOVS reg_a, rscratch2
+ UPDATE_ZN
+ B 1113f
+1111:
+ S9xGetWordLow
+ MOVS rscratch2,rstatus,LSR #MASK_SHIFTER_CARRY
+ SBCS reg_a, reg_a, rscratch, LSL #16
+ @ OverFlow
+ ORRVS rstatus, rstatus, #MASK_OVERFLOW
+ BICVC rstatus, rstatus, #MASK_OVERFLOW
+ MOV reg_a, reg_a, LSR #16
+ @ Carry
+ UPDATE_C
+ MOVS reg_a, reg_a, LSL #16
+ @ Update flag
+ UPDATE_ZN
+1113:
+.endm
+
+.macro SBC8
+ TST rstatus, #MASK_DECIMAL
+ BEQ 1111f
+ S9xGetByte
+ STMFD R13!,{rscratch}
+ MOV rscratch4,#0x0F000000
+ @ rscratch2=xxW1xxxxxxxxxxxx
+ AND rscratch2, rscratch, rscratch4
+ @ rscratch=xxW2xxxxxxxxxxxx
+ AND rscratch, rscratch4, rscratch, LSR #4
+ @ rscratch3=xxA2xxxxxxxxxxxx
+ AND rscratch3, rscratch4, reg_a, LSR #4
+ @ rscratch4=xxA1xxxxxxxxxxxx
+ AND rscratch4,reg_a,rscratch4
+ @ R1=A1-W1-!CARRY
+ TST rstatus, #MASK_CARRY
+ ADDEQ rscratch2, rscratch2, #0x01000000
+ SUB rscratch2,rscratch4,rscratch2
+ @ if R1 > 9
+ CMP rscratch2, #0x09000000
+ @ then R1 += 10
+ ADDHI rscratch2, rscratch2, #0x0A000000
+ @ then A2-- (W2++)
+ ADDHI rscratch, rscratch, #0x01000000
+ @ R2=A2-W2
+ SUB rscratch3, rscratch3, rscratch
+ @ if R2 > 9
+ CMP rscratch3, #0x09000000
+ @ then R2 -= 10@
+ ADDHI rscratch3, rscratch3, #0x0A000000
+ @ then SetCarry()
+ BICHI rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
+ @ else ClearCarry()
+ ORRLS rstatus, rstatus, #MASK_CARRY @ 0 : AND mask 11111011111 : set C to zero
+ @ gather rscratch3 and rscratch2 into ans8
+ AND rscratch3,rscratch3,#0x0F000000
+ AND rscratch2,rscratch2,#0x0F000000
+ @ rscratch3 : 0R2000000
+ @ rscratch2 : 0R1000000
+ @ -> 0xR2R1000000
+ ORR rscratch2, rscratch2, rscratch3, LSL #4
+ LDMFD R13!,{rscratch}
+ @ only last bit
+ AND reg_a,reg_a,#0x80000000
+ @ (register.AL ^ Work8)
+ EORS rscratch3, reg_a, rscratch
+ BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
+ BEQ 1112f
+ @ (register.AL ^ Ans8)
+ EORS rscratch3, reg_a, rscratch2
+ @ & 0x80
+ TSTNE rscratch3,#0x80000000
+ BICEQ rstatus, rstatus, #MASK_OVERFLOW @ 0 : AND mask 11111011111 : set V to zero
+ ORRNE rstatus, rstatus, #MASK_OVERFLOW @ 1 : OR mask 00000100000 : set V to one
+1112:
+ MOVS reg_a, rscratch2
+ UPDATE_ZN
+ B 1113f
+1111:
+ S9xGetByteLow
+ MOVS rscratch2,rstatus,LSR #MASK_SHIFTER_CARRY
+ SBCS reg_a, reg_a, rscratch, LSL #24
+ @ OverFlow
+ ORRVS rstatus, rstatus, #MASK_OVERFLOW
+ BICVC rstatus, rstatus, #MASK_OVERFLOW
+ @ Carry
+ UPDATE_C
+ @ Update flag
+ ANDS reg_a, reg_a, #0xFF000000
+ UPDATE_ZN
+1113:
+.endm
+
+.macro STA16
+ S9xSetWord reg_a
+.endm
+.macro STA8
+ S9xSetByte reg_a
+.endm
+.macro STX16
+ S9xSetWord reg_x
+.endm
+.macro STX8
+ S9xSetByte reg_x
+.endm
+.macro STY16
+ S9xSetWord reg_y
+.endm
+.macro STY8
+ S9xSetByte reg_y
+.endm
+.macro STZ16
+ S9xSetWordZero
+.endm
+.macro STZ8
+ S9xSetByteZero
+.endm
+.macro TSB16
+ S9xGetWordRegNS rscratch2
+ TST reg_a, rscratch2
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+ ORR rscratch2, reg_a, rscratch2
+ S9xSetWord rscratch2
+ ADD1CYCLE
+.endm
+.macro TSB8
+ S9xGetByteRegNS rscratch2
+ TST reg_a, rscratch2
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+ ORR rscratch2, reg_a, rscratch2
+ S9xSetByte rscratch2
+ ADD1CYCLE
+.endm
+.macro TRB16
+ S9xGetWordRegNS rscratch2
+ TST reg_a, rscratch2
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+ MVN rscratch3, reg_a
+ AND rscratch2, rscratch3, rscratch2
+ S9xSetWord rscratch2
+ ADD1CYCLE
+.endm
+.macro TRB8
+ S9xGetByteRegNS rscratch2
+ TST reg_a, rscratch2
+ BICNE rstatus, rstatus, #MASK_ZERO @ 0 : AND mask 11111011111 : set Z to zero
+ ORREQ rstatus, rstatus, #MASK_ZERO @ 1 : OR mask 00000100000 : set Z to one
+ MVN rscratch3, reg_a
+ AND rscratch2, rscratch3, rscratch2
+ S9xSetByte rscratch2
+ ADD1CYCLE
+.endm
+/**************************************************************************/
+
+
+/**************************************************************************/
+
+.macro Op09M0 /*ORA*/
+ LDRB rscratch2, [rpc,#1]
+ LDRB rscratch, [rpc], #2
+ ORR rscratch2,rscratch,rscratch2,LSL #8
+ ORRS reg_a,reg_a,rscratch2,LSL #16
+ UPDATE_ZN
+ ADD2MEM
+.endm
+.macro Op09M1 /*ORA*/
+ LDRB rscratch, [rpc], #1
+ ORRS reg_a,reg_a,rscratch,LSL #24
+ UPDATE_ZN
+ ADD1MEM
+.endm
+/***********************************************************************/
+.macro Op90 /*BCC*/
+ asmRelative
+ BranchCheck0
+ TST rstatus, #MASK_CARRY
+ BNE 1111f
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+1111:
+.endm
+.macro OpB0 /*BCS*/
+ asmRelative
+ BranchCheck0
+ TST rstatus, #MASK_CARRY
+ BEQ 1111f
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+1111:
+.endm
+.macro OpF0 /*BEQ*/
+ asmRelative
+ BranchCheck2
+ TST rstatus, #MASK_ZERO
+ BEQ 1111f
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+1111:
+.endm
+.macro OpD0 /*BNE*/
+ asmRelative
+ BranchCheck1
+ TST rstatus, #MASK_ZERO
+ BNE 1111f
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+1111:
+.endm
+.macro Op30 /*BMI*/
+ asmRelative
+ BranchCheck0
+ TST rstatus, #MASK_NEG
+ BEQ 1111f
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+1111:
+.endm
+.macro Op10 /*BPL*/
+ asmRelative
+ BranchCheck1
+ TST rstatus, #MASK_NEG @ neg, z!=0, NE
+ BNE 1111f
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+1111:
+.endm
+.macro Op50 /*BVC*/
+ asmRelative
+ BranchCheck0
+ TST rstatus, #MASK_OVERFLOW @ neg, z!=0, NE
+ BNE 1111f
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+1111:
+.endm
+.macro Op70 /*BVS*/
+ asmRelative
+ BranchCheck0
+ TST rstatus, #MASK_OVERFLOW @ neg, z!=0, NE
+ BEQ 1111f
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+1111:
+.endm
+.macro Op80 /*BRA*/
+ asmRelative
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+1111:
+.endm
+/*******************************************************************************************/
+/************************************************************/
+/* SetFlag Instructions ********************************************************************** */
+.macro Op38 /*SEC*/
+ ORR rstatus, rstatus, #MASK_CARRY @ 1 : OR mask 00000100000 : set C to one
+ ADD1CYCLE
+.endm
+.macro OpF8 /*SED*/
+ SetDecimal
+ ADD1CYCLE
+.endm
+.macro Op78 /*SEI*/
+ SetIRQ
+ ADD1CYCLE
+.endm
+
+
+/****************************************************************************************/
+/* ClearFlag Instructions ******************************************************************** */
+.macro Op18 /*CLC*/
+ BIC rstatus, rstatus, #MASK_CARRY
+ ADD1CYCLE
+.endm
+.macro OpD8 /*CLD*/
+ ClearDecimal
+ ADD1CYCLE
+.endm
+.macro Op58 /*CLI*/
+ ClearIRQ
+ ADD1CYCLE
+ @ CHECK_FOR_IRQ
+.endm
+.macro OpB8 /*CLV*/
+ BIC rstatus, rstatus, #MASK_OVERFLOW
+ ADD1CYCLE
+.endm
+
+/******************************************************************************************/
+/* DEX/DEY *********************************************************************************** */
+
+.macro OpCAX1 /*DEX*/
+ @MOV rscratch3,#0
+ SUBS reg_x, reg_x, #0x01000000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpCAX0 /*DEX*/
+ @MOV rscratch3,#0
+ SUBS reg_x, reg_x, #0x00010000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op88X1 /*DEY*/
+ @MOV rscratch3,#0
+ SUBS reg_y, reg_y, #0x01000000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op88X0 /*DEY*/
+ @MOV rscratch3,#0
+ SUBS reg_y, reg_y, #0x00010000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+
+/******************************************************************************************/
+/* INX/INY *********************************************************************************** */
+.macro OpE8X1
+ @MOV rscratch3,#0
+ ADDS reg_x, reg_x, #0x01000000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpE8X0
+ @MOV rscratch3,#0
+ ADDS reg_x, reg_x, #0x00010000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpC8X1
+ @MOV rscratch3,#0
+ ADDS reg_y, reg_y, #0x01000000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpC8X0
+ @MOV rscratch3,#0
+ ADDS reg_y, reg_y, #0x00010000
+ @STR rscratch3,[reg_cpu_var,#WaitAddress_ofs]
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+
+/**********************************************************************************************/
+
+/* NOP *************************************************************************************** */
+.macro OpEA
+ ADD1CYCLE
+.endm
+
+/**************************************************************************/
+/* PUSH Instructions **************************************************** */
+.macro OpF4
+ Absolute
+ PushWrLow
+.endm
+.macro OpD4
+ DirectIndirect
+ PushWrLow
+.endm
+.macro Op62
+ asmRelativeLong
+ PushWrLow
+.endm
+.macro Op48M0
+ PushW reg_a
+ ADD1CYCLE
+.endm
+.macro Op48M1
+ PushB reg_a
+ ADD1CYCLE
+.endm
+.macro Op8B
+ AND rscratch2, reg_d_bank, #0xFF
+ PushBLow rscratch2
+ ADD1CYCLE
+.endm
+.macro Op0B
+ PushW reg_d
+ ADD1CYCLE
+.endm
+.macro Op4B
+ PushBlow reg_p_bank
+ ADD1CYCLE
+.endm
+.macro Op08
+ PushB rstatus
+ ADD1CYCLE
+.endm
+.macro OpDAX1
+ PushB reg_x
+ ADD1CYCLE
+.endm
+.macro OpDAX0
+ PushW reg_x
+ ADD1CYCLE
+.endm
+.macro Op5AX1
+ PushB reg_y
+ ADD1CYCLE
+.endm
+.macro Op5AX0
+ PushW reg_y
+ ADD1CYCLE
+.endm
+/**************************************************************************/
+/* PULL Instructions **************************************************** */
+.macro Op68M1
+ PullBS reg_a
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+.macro Op68M0
+ PullWS reg_a
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+.macro OpAB
+ BIC reg_d_bank,reg_d_bank, #0xFF
+ PullBrS
+ ORR reg_d_bank,reg_d_bank,rscratch, LSR #24
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+.macro Op2B
+ BIC reg_d,reg_d, #0xFF000000
+ BIC reg_d,reg_d, #0x00FF0000
+ PullWrS
+ ORR reg_d,rscratch,reg_d
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+.macro Op28X1M1 /*PLP*/
+ @ INDEX set, MEMORY set
+ BIC rstatus,rstatus,#0xFF000000
+ PullBr
+ ORR rstatus,rscratch,rstatus
+ TST rstatus, #MASK_INDEX
+ @ INDEX clear & was set : 8->16
+ MOVEQ reg_x,reg_x,LSR #8
+ MOVEQ reg_y,reg_y,LSR #8
+ TST rstatus, #MASK_MEM
+ @ MEMORY cleared & was set : 8->16
+ LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOVEQ reg_a,reg_a,LSR #8
+ ORREQ reg_a,reg_a,rscratch, LSL #24
+ S9xFixCycles
+ ADD2CYCLE
+.endm
+.macro Op28X0M1 /*PLP*/
+ @ INDEX cleared, MEMORY set
+ BIC rstatus,rstatus,#0xFF000000
+ PullBr
+ ORR rstatus,rscratch,rstatus
+ TST rstatus, #MASK_INDEX
+ @ INDEX set & was cleared : 16->8
+ MOVNE reg_x,reg_x,LSL #8
+ MOVNE reg_y,reg_y,LSL #8
+ TST rstatus, #MASK_MEM
+ @ MEMORY cleared & was set : 8->16
+ LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOVEQ reg_a,reg_a,LSR #8
+ ORREQ reg_a,reg_a,rscratch, LSL #24
+ S9xFixCycles
+ ADD2CYCLE
+.endm
+.macro Op28X1M0 /*PLP*/
+ @ INDEX set, MEMORY set
+ BIC rstatus,rstatus,#0xFF000000
+ PullBr
+ ORR rstatus,rscratch,rstatus
+ TST rstatus, #MASK_INDEX
+ @ INDEX clear & was set : 8->16
+ MOVEQ reg_x,reg_x,LSR #8
+ MOVEQ reg_y,reg_y,LSR #8
+ TST rstatus, #MASK_MEM
+ @ MEMORY set & was cleared : 16->8
+ MOVNE rscratch,reg_a,LSR #24
+ MOVNE reg_a,reg_a,LSL #8
+ STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
+ S9xFixCycles
+ ADD2CYCLE
+.endm
+.macro Op28X0M0 /*PLP*/
+ @ INDEX set, MEMORY set
+ BIC rstatus,rstatus,#0xFF000000
+ PullBr
+ ORR rstatus,rscratch,rstatus
+ TST rstatus, #MASK_INDEX
+ @ INDEX set & was cleared : 16->8
+ MOVNE reg_x,reg_x,LSL #8
+ MOVNE reg_y,reg_y,LSL #8
+ TST rstatus, #MASK_MEM
+ @ MEMORY set & was cleared : 16->8
+ MOVNE rscratch,reg_a,LSR #24
+ MOVNE reg_a,reg_a,LSL #8
+ STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
+ S9xFixCycles
+ ADD2CYCLE
+.endm
+.macro OpFAX1
+ PullBS reg_x
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+.macro OpFAX0
+ PullWS reg_x
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+.macro Op7AX1
+ PullBS reg_y
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+.macro Op7AX0
+ PullWS reg_y
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+
+/**********************************************************************************************/
+/* Transfer Instructions ********************************************************************* */
+.macro OpAAX1M1 /*TAX8*/
+ MOVS reg_x, reg_a
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpAAX0M1 /*TAX16*/
+ LDRB reg_x, [reg_cpu_var,#RAH_ofs]
+ MOV reg_x, reg_x,LSL #24
+ ORRS reg_x, reg_x,reg_a, LSR #8
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpAAX1M0 /*TAX8*/
+ MOVS reg_x, reg_a, LSL #8
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpAAX0M0 /*TAX16*/
+ MOVS reg_x, reg_a
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpA8X1M1 /*TAY8*/
+ MOVS reg_y, reg_a
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpA8X0M1 /*TAY16*/
+ LDRB reg_y, [reg_cpu_var,#RAH_ofs]
+ MOV reg_y, reg_y,LSL #24
+ ORRS reg_y, reg_y,reg_a, LSR #8
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpA8X1M0 /*TAY8*/
+ MOVS reg_y, reg_a, LSL #8
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpA8X0M0 /*TAY16*/
+ MOVS reg_y, reg_a
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op5BM1
+ LDRB rscratch, [reg_cpu_var,#RAH_ofs]
+ MOV reg_d,reg_d,LSL #16
+ MOV rscratch,rscratch,LSL #24
+ ORRS rscratch,rscratch,reg_a, LSR #8
+ UPDATE_ZN
+ ORR reg_d,rscratch,reg_d,LSR #16
+ ADD1CYCLE
+.endm
+.macro Op5BM0
+ MOV reg_d,reg_d,LSL #16
+ MOVS reg_a,reg_a
+ UPDATE_ZN
+ ORR reg_d,reg_a,reg_d,LSR #16
+ ADD1CYCLE
+.endm
+.macro Op1BM1
+ TST rstatus, #MASK_EMUL
+ MOVNE reg_s, reg_a, LSR #24
+ ORRNE reg_s, reg_s, #0x100
+ LDREQB reg_s, [reg_cpu_var,#RAH_ofs]
+ ORREQ reg_s, reg_s, reg_a
+ MOVEQ reg_s, reg_s, ROR #24
+ ADD1CYCLE
+.endm
+.macro Op1BM0
+ MOV reg_s, reg_a, LSR #16
+ ADD1CYCLE
+.endm
+.macro Op7BM1
+ MOVS reg_a, reg_d, ASR #16
+ UPDATE_ZN
+ MOV rscratch,reg_a,LSR #8
+ MOV reg_a,reg_a, LSL #24
+ STRB rscratch, [reg_cpu_var,#RAH_ofs]
+ ADD1CYCLE
+.endm
+.macro Op7BM0
+ MOVS reg_a, reg_d, ASR #16
+ UPDATE_ZN
+ MOV reg_a,reg_a, LSL #16
+ ADD1CYCLE
+.endm
+.macro Op3BM1
+ MOV rscratch,reg_s, LSR #8
+ MOVS reg_a, reg_s, LSL #16
+ STRB rscratch, [reg_cpu_var,#RAH_ofs]
+ UPDATE_ZN
+ MOV reg_a,reg_a, LSL #8
+ ADD1CYCLE
+.endm
+.macro Op3BM0
+ MOVS reg_a, reg_s, LSL #16
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpBAX1
+ MOVS reg_x, reg_s, LSL #24
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpBAX0
+ MOVS reg_x, reg_s, LSL #16
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op8AM1X1
+ MOVS reg_a, reg_x
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op8AM1X0
+ MOVS reg_a, reg_x, LSL #8
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op8AM0X1
+ MOVS reg_a, reg_x, LSR #8
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op8AM0X0
+ MOVS reg_a, reg_x
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op9AX1
+ MOV reg_s, reg_x, LSR #24
+
+ TST rstatus, #MASK_EMUL
+ ORRNE reg_s, reg_s, #0x100
+ ADD1CYCLE
+.endm
+.macro Op9AX0
+ MOV reg_s, reg_x, LSR #16
+ ADD1CYCLE
+.endm
+.macro Op9BX1
+ MOVS reg_y, reg_x
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op9BX0
+ MOVS reg_y, reg_x
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op98M1X1
+ MOVS reg_a, reg_y
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op98M1X0
+ MOVS reg_a, reg_y, LSL #8
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op98M0X1
+ MOVS reg_a, reg_y, LSR #8
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro Op98M0X0
+ MOVS reg_a, reg_y
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpBBX1
+ MOVS reg_x, reg_y
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+.macro OpBBX0
+ MOVS reg_x, reg_y
+ UPDATE_ZN
+ ADD1CYCLE
+.endm
+
+/**********************************************************************************************/
+/* XCE *************************************************************************************** */
+
+.macro OpFB
+ TST rstatus,#MASK_CARRY
+ BEQ 1111f
+ @ CARRY is set
+ TST rstatus,#MASK_EMUL
+ BNE 1112f
+ @ EMUL is cleared
+ BIC rstatus,rstatus,#(MASK_CARRY)
+ TST rstatus,#MASK_INDEX
+ @ X & Y were 16bits before
+ MOVEQ reg_x,reg_x,LSL #8
+ MOVEQ reg_y,reg_y,LSL #8
+ TST rstatus,#MASK_MEM
+ @ A was 16bits before
+ @ save AH
+ MOVEQ rscratch,reg_a,LSR #24
+ STREQB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOVEQ reg_a,reg_a,LSL #8
+ ORR rstatus,rstatus,#(MASK_EMUL|MASK_MEM|MASK_INDEX)
+ AND reg_s,reg_s,#0xFF
+ ORR reg_s,reg_s,#0x100
+ B 1113f
+1112:
+ @ EMUL is set
+ TST rstatus,#MASK_INDEX
+ @ X & Y were 16bits before
+ MOVEQ reg_x,reg_x,LSL #8
+ MOVEQ reg_y,reg_y,LSL #8
+ TST rstatus,#MASK_MEM
+ @ A was 16bits before
+ @ save AH
+ MOVEQ rscratch,reg_a,LSR #24
+ STREQB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOVEQ reg_a,reg_a,LSL #8
+ ORR rstatus,rstatus,#(MASK_CARRY|MASK_MEM|MASK_INDEX)
+ AND reg_s,reg_s,#0xFF
+ ORR reg_s,reg_s,#0x100
+ B 1113f
+1111:
+ @ CARRY is cleared
+ TST rstatus,#MASK_EMUL
+ BEQ 1115f
+ @ EMUL was set : X,Y & A were 8bits
+ @ Now have to check MEMORY & INDEX for potential conversions to 16bits
+ TST rstatus,#MASK_INDEX
+ @ X & Y are now 16bits
+ MOVEQ reg_x,reg_x,LSR #8
+ MOVEQ reg_y,reg_y,LSR #8
+ TST rstatus,#MASK_MEM
+ @ A is now 16bits
+ MOVEQ reg_a,reg_a,LSR #8
+ @ restore AH
+ LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
+ ORREQ reg_a,reg_a,rscratch,LSL #24
+1115:
+ BIC rstatus,rstatus,#(MASK_EMUL)
+ ORR rstatus,rstatus,#(MASK_CARRY)
+1113:
+ ADD1CYCLE
+ S9xFixCycles
+.endm
+
+/*******************************************************************************/
+/* BRK *************************************************************************/
+.macro Op00 /*BRK*/
+ MOV rscratch,#1
+ STRB rscratch,[reg_cpu_var,#BRKTriggered_ofs]
+
+ TST rstatus, #MASK_EMUL
+ @ EQ is flag to zero (!CheckEmu)
+ BNE 2001f@ elseOp00
+ PushBLow reg_p_bank
+ SUB rscratch, rpc, regpcbase
+ ADD rscratch2, rscratch, #1
+ PushWLow rscratch2
+ @ PackStatus
+ PushB rstatus
+ ClearDecimal
+ SetIRQ
+ BIC reg_p_bank, reg_p_bank, #0xFF
+ MOV rscratch, #0xE6
+ ORR rscratch, rscratch, #0xFF00
+ S9xGetWordLow
+ S9xSetPCBase
+ ADD2CYCLEX 8
+ B 2002f@ endOp00
+2001:@ elseOp00
+ SUB rscratch2, rpc, regpcbase
+ PushWLow rscratch2
+ @ PackStatus
+ PushB rstatus
+ ClearDecimal
+ SetIRQ
+ BIC reg_p_bank,reg_p_bank, #0xFF
+ MOV rscratch, #0xFE
+ ORR rscratch, rscratch, #0xFF00
+ S9xGetWordLow
+ S9xSetPCBase
+ ADD1CYCLEX 6
+2002:@ endOp00
+.endm
+
+
+/**********************************************************************************************/
+/* BRL ************************************************************************************** */
+.macro Op82 /*BRL*/
+ asmRelativeLong
+ ORR rscratch, rscratch, reg_p_bank, LSL #16
+ S9xSetPCBase
+.endm
+/**********************************************************************************************/
+/* IRQ *************************************************************************************** */
+@ void S9xOpcode_IRQ (void)
+.macro S9xOpcode_IRQ @ IRQ
+ TST rstatus, #MASK_EMUL
+ @ EQ is flag to zero (!CheckEmu)
+ BNE 2121f@ elseOp02
+ PushBLow reg_p_bank
+ SUB rscratch2, rpc, regpcbase
+ PushWLow rscratch2
+ @ PackStatus
+ PushB rstatus
+ ClearDecimal
+ SetIRQ
+ BIC reg_p_bank, reg_p_bank,#0xFF
+ MOV rscratch, #0xEE
+ ORR rscratch, rscratch, #0xFF00
+ S9xGetWordLow
+ S9xSetPCBase
+ @ADD2CYCLE
+ ADD2CYCLEX 8
+ B 2122f
+2121:@ else
+ SUB rscratch2, rpc, regpcbase
+ PushWLow rscratch2
+ @ PackStatus
+ PushB rstatus
+ ClearDecimal
+ SetIRQ
+ BIC reg_p_bank,reg_p_bank, #0xFF
+ MOV rscratch, #0xFE
+ ORR rscratch, rscratch, #0xFF00
+ S9xGetWordLow
+ S9xSetPCBase
+ @ADD1CYCLE
+ ADD1CYCLEX 6
+2122:
+.endm
+
+/*
+void asm_S9xOpcode_IRQ(void)
+{
+ if (!CheckEmulation())
+ {
+ PushB (Registers.PB);
+ PushW (CPU.PC - CPU.PCBase);
+ PushB (Registers.PL);
+ ClearDecimal ();
+ SetIRQ ();
+
+ Registers.PB = 0;
+ S9xSetPCBase (S9xGetWord (0xFFEE));
+ CPU.Cycles += TWO_CYCLES;
+ }
+ else
+ {
+ PushW (CPU.PC - CPU.PCBase);
+ PushB (Registers.PL);
+ ClearDecimal ();
+ SetIRQ ();
+
+ Registers.PB = 0;
+ S9xSetPCBase (S9xGetWord (0xFFFE));
+ CPU.Cycles += ONE_CYCLE;
+ }
+}
+*/
+
+/**********************************************************************************************/
+/* NMI *************************************************************************************** */
+@ void S9xOpcode_NMI (void)
+.macro S9xOpcode_NMI @ NMI
+ TST rstatus, #MASK_EMUL
+ @ EQ is flag to zero (!CheckEmu)
+ BNE 2123f@ elseOp02
+ PushBLow reg_p_bank
+ SUB rscratch2, rpc, regpcbase
+ PushWLow rscratch2
+ @ PackStatus
+ PushB rstatus
+ ClearDecimal
+ SetIRQ
+ BIC reg_p_bank, reg_p_bank,#0xFF
+ MOV rscratch, #0xEA
+ ORR rscratch, rscratch, #0xFF00
+ S9xGetWordLow
+ S9xSetPCBase
+ @ADD2CYCLE
+ ADD2CYCLEX 8
+ B 2124f
+2123:@ else
+ SUB rscratch2, rpc, regpcbase
+ PushWLow rscratch2
+ @ PackStatus
+ PushB rstatus
+ ClearDecimal
+ SetIRQ
+ BIC reg_p_bank,reg_p_bank, #0xFF
+ MOV rscratch, #0xFA
+ ORR rscratch, rscratch, #0xFF00
+ S9xGetWordLow
+ S9xSetPCBase
+ @ADD1CYCLE
+ ADD1CYCLEX 6
+2124:
+.endm
+/*
+void asm_S9xOpcode_NMI(void)
+{
+ if (!CheckEmulation())
+ {
+ PushB (Registers.PB);
+ PushW (CPU.PC - CPU.PCBase);
+ PushB (Registers.PL);
+ ClearDecimal ();
+ SetIRQ ();
+
+ Registers.PB = 0;
+ S9xSetPCBase (S9xGetWord (0xFFEA));
+ CPU.Cycles += TWO_CYCLES;
+ }
+ else
+ {
+ PushW (CPU.PC - CPU.PCBase);
+ PushB (Registers.PL);
+ ClearDecimal ();
+ SetIRQ ();
+
+ Registers.PB = 0;
+ S9xSetPCBase (S9xGetWord (0xFFFA));
+ CPU.Cycles += ONE_CYCLE;
+ }
+}
+*/
+
+/**********************************************************************************************/
+/* COP *************************************************************************************** */
+.macro Op02 /*COP*/
+ TST rstatus, #MASK_EMUL
+ @ EQ is flag to zero (!CheckEmu)
+ BNE 2021f@ elseOp02
+ PushBLow reg_p_bank
+ SUB rscratch, rpc, regpcbase
+ ADD rscratch2, rscratch, #1
+ PushWLow rscratch2
+ @ PackStatus
+ PushB rstatus
+ ClearDecimal
+ SetIRQ
+ BIC reg_p_bank, reg_p_bank,#0xFF
+ MOV rscratch, #0xE4
+ ORR rscratch, rscratch, #0xFF00
+ S9xGetWordLow
+ S9xSetPCBase
+ ADD2CYCLEX 8
+ B 2022f@ endOp02
+2021:@ elseOp02
+ SUB rscratch2, rpc, regpcbase
+ PushWLow rscratch2
+ @ PackStatus
+ PushB rstatus
+ ClearDecimal
+ SetIRQ
+ BIC reg_p_bank,reg_p_bank, #0xFF
+ MOV rscratch, #0xF4
+ ORR rscratch, rscratch, #0xFF00
+ S9xGetWordLow
+ S9xSetPCBase
+ ADD1CYCLEX 6
+2022:@ endOp02
+.endm
+
+/**********************************************************************************************/
+/* JML *************************************************************************************** */
+.macro OpDC
+ AbsoluteIndirectLong
+ BIC reg_p_bank,reg_p_bank,#0xFF
+ ORR reg_p_bank,reg_p_bank, rscratch, LSR #16
+ S9xSetPCBase
+ ADD2CYCLE
+.endm
+.macro Op5C
+ AbsoluteLong
+ BIC reg_p_bank,reg_p_bank,#0xFF
+ ORR reg_p_bank,reg_p_bank, rscratch, LSR #16
+ S9xSetPCBase
+.endm
+
+/**********************************************************************************************/
+/* JMP *************************************************************************************** */
+.macro Op4C
+ Absolute
+ BIC rscratch, rscratch, #0xFF0000
+ ORR rscratch, rscratch, reg_p_bank, LSL #16
+ S9xSetPCBase
+ CPUShutdown
+.endm
+.macro Op6C
+ AbsoluteIndirect
+ BIC rscratch, rscratch, #0xFF0000
+ ORR rscratch, rscratch, reg_p_bank, LSL #16
+ S9xSetPCBase
+.endm
+.macro Op7C
+ ADD rscratch, rscratch, reg_p_bank, LSL #16
+ S9xSetPCBase
+ ADD1CYCLE
+.endm
+
+/**********************************************************************************************/
+/* JSL/RTL *********************************************************************************** */
+.macro Op22
+ PushBlow reg_p_bank
+ SUB rscratch, rpc, regpcbase
+ @ SUB rscratch2, rscratch2, #1
+ ADD rscratch2, rscratch, #2
+ PushWlow rscratch2
+ AbsoluteLong
+ BIC reg_p_bank,reg_p_bank,#0xFF
+ ORR reg_p_bank, reg_p_bank, rscratch, LSR #16
+ S9xSetPCBase
+.endm
+.macro Op6B
+ PullWLow rpc
+ BIC reg_p_bank,reg_p_bank,#0xFF
+ PullBrLow
+ ORR reg_p_bank, reg_p_bank, rscratch
+ ADD rscratch, rpc, #1
+ BIC rscratch, rscratch,#0xFF0000
+ ORR rscratch, rscratch, reg_p_bank, LSL #16
+ S9xSetPCBase
+ ADD2CYCLE
+.endm
+/**********************************************************************************************/
+/* JSR/RTS *********************************************************************************** */
+.macro Op20
+ SUB rscratch, rpc, regpcbase
+ @ SUB rscratch2, rscratch2, #1
+ ADD rscratch2, rscratch, #1
+ PushWlow rscratch2
+ Absolute
+ BIC rscratch, rscratch, #0xFF0000
+ ORR rscratch, rscratch, reg_p_bank, LSL #16
+ S9xSetPCBase
+ ADD1CYCLE
+.endm
+.macro OpFCX0
+ SUB rscratch, rpc, regpcbase
+ @ SUB rscratch2, rscratch2, #1
+ ADD rscratch2, rscratch, #1
+ PushWlow rscratch2
+ AbsoluteIndexedIndirectX0
+ ORR rscratch, rscratch, reg_p_bank, LSL #16
+ S9xSetPCBase
+ ADD1CYCLE
+.endm
+.macro OpFCX1
+ SUB rscratch, rpc, regpcbase
+ @ SUB rscratch2, rscratch2, #1
+ ADD rscratch2, rscratch, #1
+ PushWlow rscratch2
+ AbsoluteIndexedIndirectX1
+ ORR rscratch, rscratch, reg_p_bank, LSL #16
+ S9xSetPCBase
+ ADD1CYCLE
+.endm
+.macro Op60
+ PullWLow rpc
+ ADD rscratch, rpc, #1
+ BIC rscratch, rscratch,#0x10000
+ ORR rscratch, rscratch, reg_p_bank, LSL #16
+ S9xSetPCBase
+ ADD3CYCLE
+.endm
+
+/**********************************************************************************************/
+/* MVN/MVP *********************************************************************************** */
+.macro Op54X1M1
+ @ Save RegStatus = reg_d_bank >> 24
+ MOV rscratch, reg_d_bank, LSR #16
+ LDRB reg_d_bank , [rpc], #1
+ LDRB rscratch2 , [rpc], #1
+ @ Restore RegStatus = reg_d_bank >> 24
+ ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
+ MOV rscratch , reg_x, LSR #24
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ S9xGetByteLow
+ MOV rscratch2, rscratch
+ MOV rscratch , reg_y, LSR #24
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ S9xSetByteLow rscratch2
+ @ load 16bits A
+ LDRB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOV reg_a,reg_a,LSR #8
+ ORR reg_a,reg_a,rscratch, LSL #24
+ ADD reg_x, reg_x, #0x01000000
+ SUB reg_a, reg_a, #0x00010000
+ ADD reg_y, reg_y, #0x01000000
+ CMP reg_a, #0xFFFF0000
+ SUBNE rpc, rpc, #3
+ @ update AH
+ MOV rscratch, reg_a, LSR #24
+ MOV reg_a,reg_a,LSL #8
+ STRB rscratch,[reg_cpu_var,#RAH_ofs]
+ ADD2CYCLE2MEM
+.endm
+.macro Op54X1M0
+ @ Save RegStatus = reg_d_bank >> 24
+ MOV rscratch, reg_d_bank, LSR #16
+ LDRB reg_d_bank , [rpc], #1
+ LDRB rscratch2 , [rpc], #1
+ @ Restore RegStatus = reg_d_bank >> 24
+ ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
+ MOV rscratch , reg_x, LSR #24
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ S9xGetByteLow
+ MOV rscratch2, rscratch
+ MOV rscratch , reg_y, LSR #24
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ S9xSetByteLow rscratch2
+ ADD reg_x, reg_x, #0x01000000
+ SUB reg_a, reg_a, #0x00010000
+ ADD reg_y, reg_y, #0x01000000
+ CMP reg_a, #0xFFFF0000
+ SUBNE rpc, rpc, #3
+ ADD2CYCLE2MEM
+.endm
+.macro Op54X0M1
+ @ Save RegStatus = reg_d_bank >> 24
+ MOV rscratch, reg_d_bank, LSR #16
+ LDRB reg_d_bank , [rpc], #1
+ LDRB rscratch2 , [rpc], #1
+ @ Restore RegStatus = reg_d_bank >> 24
+ ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
+ MOV rscratch , reg_x, LSR #16
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ S9xGetByteLow
+ MOV rscratch2, rscratch
+ MOV rscratch , reg_y, LSR #16
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ S9xSetByteLow rscratch2
+ @ load 16bits A
+ LDRB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOV reg_a,reg_a,LSR #8
+ ORR reg_a,reg_a,rscratch, LSL #24
+ ADD reg_x, reg_x, #0x00010000
+ SUB reg_a, reg_a, #0x00010000
+ ADD reg_y, reg_y, #0x00010000
+ CMP reg_a, #0xFFFF0000
+ SUBNE rpc, rpc, #3
+ @ update AH
+ MOV rscratch, reg_a, LSR #24
+ MOV reg_a,reg_a,LSL #8
+ STRB rscratch,[reg_cpu_var,#RAH_ofs]
+ ADD2CYCLE2MEM
+.endm
+.macro Op54X0M0
+ @ Save RegStatus = reg_d_bank >> 24
+ MOV rscratch, reg_d_bank, LSR #16
+ LDRB reg_d_bank , [rpc], #1
+ LDRB rscratch2 , [rpc], #1
+ @ Restore RegStatus = reg_d_bank >> 24
+ ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
+ MOV rscratch , reg_x, LSR #16
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ S9xGetByteLow
+ MOV rscratch2, rscratch
+ MOV rscratch , reg_y, LSR #16
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ S9xSetByteLow rscratch2
+ ADD reg_x, reg_x, #0x00010000
+ SUB reg_a, reg_a, #0x00010000
+ ADD reg_y, reg_y, #0x00010000
+ CMP reg_a, #0xFFFF0000
+ SUBNE rpc, rpc, #3
+ ADD2CYCLE2MEM
+.endm
+
+.macro Op44X1M1
+ @ Save RegStatus = reg_d_bank >> 24
+ MOV rscratch, reg_d_bank, LSR #16
+ LDRB reg_d_bank , [rpc], #1
+ LDRB rscratch2 , [rpc], #1
+ @ Restore RegStatus = reg_d_bank >> 24
+ ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
+ MOV rscratch , reg_x, LSR #24
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ S9xGetByteLow
+ MOV rscratch2, rscratch
+ MOV rscratch , reg_y, LSR #24
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ S9xSetByteLow rscratch2
+ @ load 16bits A
+ LDRB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOV reg_a,reg_a,LSR #8
+ ORR reg_a,reg_a,rscratch, LSL #24
+ SUB reg_x, reg_x, #0x01000000
+ SUB reg_a, reg_a, #0x00010000
+ SUB reg_y, reg_y, #0x01000000
+ CMP reg_a, #0xFFFF0000
+ SUBNE rpc, rpc, #3
+ @ update AH
+ MOV rscratch, reg_a, LSR #24
+ MOV reg_a,reg_a,LSL #8
+ STRB rscratch,[reg_cpu_var,#RAH_ofs]
+ ADD2CYCLE2MEM
+.endm
+.macro Op44X1M0
+ @ Save RegStatus = reg_d_bank >> 24
+ MOV rscratch, reg_d_bank, LSR #16
+ LDRB reg_d_bank , [rpc], #1
+ LDRB rscratch2 , [rpc], #1
+ @ Restore RegStatus = reg_d_bank >> 24
+ ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
+ MOV rscratch , reg_x, LSR #24
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ S9xGetByteLow
+ MOV rscratch2, rscratch
+ MOV rscratch , reg_y, LSR #24
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ S9xSetByteLow rscratch2
+ SUB reg_x, reg_x, #0x01000000
+ SUB reg_a, reg_a, #0x00010000
+ SUB reg_y, reg_y, #0x01000000
+ CMP reg_a, #0xFFFF0000
+ SUBNE rpc, rpc, #3
+ ADD2CYCLE2MEM
+.endm
+.macro Op44X0M1
+ @ Save RegStatus = reg_d_bank >> 24
+ MOV rscratch, reg_d_bank, LSR #16
+ LDRB reg_d_bank , [rpc], #1
+ LDRB rscratch2 , [rpc], #1
+ @ Restore RegStatus = reg_d_bank >> 24
+ ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
+ MOV rscratch , reg_x, LSR #16
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ S9xGetByteLow
+ MOV rscratch2, rscratch
+ MOV rscratch , reg_y, LSR #16
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ S9xSetByteLow rscratch2
+ @ load 16bits A
+ LDRB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOV reg_a,reg_a,LSR #8
+ ORR reg_a,reg_a,rscratch, LSL #24
+ SUB reg_x, reg_x, #0x00010000
+ SUB reg_a, reg_a, #0x00010000
+ SUB reg_y, reg_y, #0x00010000
+ CMP reg_a, #0xFFFF0000
+ SUBNE rpc, rpc, #3
+ @ update AH
+ MOV rscratch, reg_a, LSR #24
+ MOV reg_a,reg_a,LSL #8
+ STRB rscratch,[reg_cpu_var,#RAH_ofs]
+ ADD2CYCLE2MEM
+.endm
+.macro Op44X0M0
+ @ Save RegStatus = reg_d_bank >> 24
+ MOV rscratch, reg_d_bank, LSR #16
+ LDRB reg_d_bank , [rpc], #1
+ LDRB rscratch2 , [rpc], #1
+ @ Restore RegStatus = reg_d_bank >> 24
+ ORR reg_d_bank, reg_d_bank, rscratch, LSL #16
+ MOV rscratch , reg_x, LSR #16
+ ORR rscratch , rscratch, rscratch2, LSL #16
+ S9xGetByteLow
+ MOV rscratch2, rscratch
+ MOV rscratch , reg_y, LSR #16
+ ORR rscratch , rscratch, reg_d_bank, LSL #16
+ S9xSetByteLow rscratch2
+ SUB reg_x, reg_x, #0x00010000
+ SUB reg_a, reg_a, #0x00010000
+ SUB reg_y, reg_y, #0x00010000
+ CMP reg_a, #0xFFFF0000
+ SUBNE rpc, rpc, #3
+ ADD2CYCLE2MEM
+.endm
+
+/**********************************************************************************************/
+/* REP/SEP *********************************************************************************** */
+.macro OpC2
+ @ status&=~(*rpc++);
+ @ so possible changes are :
+ @ INDEX = 1 -> 0 : X,Y 8bits -> 16bits
+ @ MEM = 1 -> 0 : A 8bits -> 16bits
+ @ SAVE OLD status for MASK_INDEX & MASK_MEM comparison
+ MOV rscratch3, rstatus
+ LDRB rscratch, [rpc], #1
+ MVN rscratch, rscratch
+ AND rstatus,rstatus,rscratch, ROR #(32-STATUS_SHIFTER)
+ TST rstatus,#MASK_EMUL
+ BEQ 1111f
+ @ emulation mode on : no changes since it was on before opcode
+ @ just be sure to reset MEM & INDEX accordingly
+ ORR rstatus,rstatus,#(MASK_MEM|MASK_INDEX)
+ B 1112f
+1111:
+ @ NOT in Emulation mode, check INDEX & MEMORY bits
+ @ Now check INDEX
+ TST rscratch3,#MASK_INDEX
+ BEQ 1113f
+ @ X & Y were 8bit before
+ TST rstatus,#MASK_INDEX
+ BNE 1113f
+ @ X & Y are now 16bits
+ MOV reg_x,reg_x,LSR #8
+ MOV reg_y,reg_y,LSR #8
+1113: @ X & Y still in 16bits
+ @ Now check MEMORY
+ TST rscratch3,#MASK_MEM
+ BEQ 1112f
+ @ A was 8bit before
+ TST rstatus,#MASK_MEM
+ BNE 1112f
+ @ A is now 16bits
+ MOV reg_a,reg_a,LSR #8
+ @ restore AH
+ LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
+ ORREQ reg_a,reg_a,rscratch,LSL #24
+1112:
+ S9xFixCycles
+ ADD1CYCLE1MEM
+.endm
+.macro OpE2
+ @ status|=*rpc++;
+ @ so possible changes are :
+ @ INDEX = 0 -> 1 : X,Y 16bits -> 8bits
+ @ MEM = 0 -> 1 : A 16bits -> 8bits
+ @ SAVE OLD status for MASK_INDEX & MASK_MEM comparison
+ MOV rscratch3, rstatus
+ LDRB rscratch, [rpc], #1
+ ORR rstatus,rstatus,rscratch, LSL #STATUS_SHIFTER
+ TST rstatus,#MASK_EMUL
+ BEQ 10111f
+ @ emulation mode on : no changes sinc eit was on before opcode
+ @ just be sure to have mem & index set accordingly
+ ORR rstatus,rstatus,#(MASK_MEM|MASK_INDEX)
+ B 10112f
+10111:
+ @ NOT in Emulation mode, check INDEX & MEMORY bits
+ @ Now check INDEX
+ TST rscratch3,#MASK_INDEX
+ BNE 10113f
+ @ X & Y were 16bit before
+ TST rstatus,#MASK_INDEX
+ BEQ 10113f
+ @ X & Y are now 8bits
+ MOV reg_x,reg_x,LSL #8
+ MOV reg_y,reg_y,LSL #8
+10113: @ X & Y still in 16bits
+ @ Now check MEMORY
+ TST rscratch3,#MASK_MEM
+ BNE 10112f
+ @ A was 16bit before
+ TST rstatus,#MASK_MEM
+ BEQ 10112f
+ @ A is now 8bits
+ @ save AH
+ MOV rscratch,reg_a,LSR #24
+ MOV reg_a,reg_a,LSL #8
+ STRB rscratch,[reg_cpu_var,#RAH_ofs]
+10112:
+ S9xFixCycles
+ ADD1CYCLE1MEM
+.endm
+
+/**********************************************************************************************/
+/* XBA *************************************************************************************** */
+.macro OpEBM1
+ @ A is 8bits
+ ADD rscratch,reg_cpu_var,#RAH_ofs
+ MOV reg_a,reg_a, LSR #24
+ SWPB reg_a,reg_a,[rscratch]
+ MOVS reg_a,reg_a, LSL #24
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+.macro OpEBM0
+ @ A is 16bits
+ MOV rscratch, reg_a, ROR #24 @ ll0000hh
+ ORR rscratch, rscratch, reg_a, LSR #8@ ll0000hh + 00hhll00 -> llhhllhh
+ MOV reg_a, rscratch, LSL #16@ llhhllhh -> llhh0000
+ MOVS rscratch,rscratch,LSL #24 @ to set Z & N flags with AL
+ UPDATE_ZN
+ ADD2CYCLE
+.endm
+
+
+/**********************************************************************************************/
+/* RTI *************************************************************************************** */
+.macro Op40X1M1
+ @ INDEX set, MEMORY set
+ BIC rstatus,rstatus,#0xFF000000
+ PullBr
+ ORR rstatus,rscratch,rstatus
+ PullWlow rpc
+ TST rstatus, #MASK_EMUL
+ ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
+ BNE 2401f
+ PullBrLow
+ BIC reg_p_bank,reg_p_bank,#0xFF
+ ORR reg_p_bank,reg_p_bank,rscratch
+2401:
+ ADD rscratch, rpc, reg_p_bank, LSL #16
+ S9xSetPCBase
+ TST rstatus, #MASK_INDEX
+ @ INDEX cleared & was set : 8->16
+ MOVEQ reg_x,reg_x,LSR #8
+ MOVEQ reg_y,reg_y,LSR #8
+ TST rstatus, #MASK_MEM
+ @ MEMORY cleared & was set : 8->16
+ LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOVEQ reg_a,reg_a,LSR #8
+ ORREQ reg_a,reg_a,rscratch, LSL #24
+ ADD2CYCLE
+ S9xFixCycles
+.endm
+.macro Op40X0M1
+ @ INDEX cleared, MEMORY set
+ BIC rstatus,rstatus,#0xFF000000
+ PullBr
+ ORR rstatus,rscratch,rstatus
+ PullWlow rpc
+ TST rstatus, #MASK_EMUL
+ ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
+ BNE 2401f
+ PullBrLow
+ BIC reg_p_bank,reg_p_bank,#0xFF
+ ORR reg_p_bank,reg_p_bank,rscratch
+2401:
+ ADD rscratch, rpc, reg_p_bank, LSL #16
+ S9xSetPCBase
+ TST rstatus, #MASK_INDEX
+ @ INDEX set & was cleared : 16->8
+ MOVNE reg_x,reg_x,LSL #8
+ MOVNE reg_y,reg_y,LSL #8
+ TST rstatus, #MASK_MEM
+ @ MEMORY cleared & was set : 8->16
+ LDREQB rscratch,[reg_cpu_var,#RAH_ofs]
+ MOVEQ reg_a,reg_a,LSR #8
+ ORREQ reg_a,reg_a,rscratch, LSL #24
+ ADD2CYCLE
+ S9xFixCycles
+.endm
+.macro Op40X1M0
+ @ INDEX set, MEMORY cleared
+ BIC rstatus,rstatus,#0xFF000000
+ PullBr
+ ORR rstatus,rscratch,rstatus
+ PullWlow rpc
+ TST rstatus, #MASK_EMUL
+ ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
+ BNE 2401f
+ PullBrLow
+ BIC reg_p_bank,reg_p_bank,#0xFF
+ ORR reg_p_bank,reg_p_bank,rscratch
+2401:
+ ADD rscratch, rpc, reg_p_bank, LSL #16
+ S9xSetPCBase
+ TST rstatus, #MASK_INDEX
+ @ INDEX cleared & was set : 8->16
+ MOVEQ reg_x,reg_x,LSR #8
+ MOVEQ reg_y,reg_y,LSR #8
+ TST rstatus, #MASK_MEM
+ @ MEMORY set & was cleared : 16->8
+ MOVNE rscratch,reg_a,LSR #24
+ MOVNE reg_a,reg_a,LSL #8
+ STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
+ ADD2CYCLE
+ S9xFixCycles
+.endm
+.macro Op40X0M0
+ @ INDEX cleared, MEMORY cleared
+ BIC rstatus,rstatus,#0xFF000000
+ PullBr
+ ORR rstatus,rscratch,rstatus
+ PullWlow rpc
+ TST rstatus, #MASK_EMUL
+ ORRNE rstatus, rstatus, #(MASK_MEM|MASK_INDEX)
+ BNE 2401f
+ PullBrLow
+ BIC reg_p_bank,reg_p_bank,#0xFF
+ ORR reg_p_bank,reg_p_bank,rscratch
+2401:
+ ADD rscratch, rpc, reg_p_bank, LSL #16
+ S9xSetPCBase
+ TST rstatus, #MASK_INDEX
+ @ INDEX set & was cleared : 16->8
+ MOVNE reg_x,reg_x,LSL #8
+ MOVNE reg_y,reg_y,LSL #8
+ TST rstatus, #MASK_MEM
+ @ MEMORY set & was cleared : 16->8
+ @ MEMORY set & was cleared : 16->8
+ MOVNE rscratch,reg_a,LSR #24
+ MOVNE reg_a,reg_a,LSL #8
+ STRNEB rscratch,[reg_cpu_var,#RAH_ofs]
+ ADD2CYCLE
+ S9xFixCycles
+.endm
+
+
+/**********************************************************************************************/
+/* STP/WAI/DB ******************************************************************************** */
+@ WAI
+.macro OpCB /*WAI*/
+ LDRB rscratch,[reg_cpu_var,#IRQActive_ofs]
+ MOVS rscratch,rscratch
+ @ (CPU.IRQActive)
+ ADD2CYCLENEX 2
+ BNE 1234f
+/*
+ CPU.WaitingForInterrupt = TRUE;
+ CPU.PC--;*/
+ MOV rscratch,#1
+ SUB rpc,rpc,#1
+/*
+ CPU.Cycles = CPU.NextEvent;
+*/
+ STRB rscratch,[reg_cpu_var,#WaitingForInterrupt_ofs]
+ LDR reg_cycles,[reg_cpu_var,#NextEvent_ofs]
+/*
+ if (IAPU.APUExecuting)
+ {
+ ICPU.CPUExecuting = FALSE;
+ do
+ {
+ APU_EXECUTE1 ();
+ } while (APU.Cycles < CPU.NextEvent);
+ ICPU.CPUExecuting = TRUE;
+ }
+*/
+ @LDR rscratch,[reg_cpu_var,#APUExecuting_ofs]
+ @MOVS rscratch,rscratch
+ @BEQ 1234f
+ asmAPU_EXECUTE2
+
+1234:
+.endm
+.macro OpDB /*STP*/
+ SUB rpc,rpc,#1
+ @ CPU.Flags |= DEBUG_MODE_FLAG;
+.endm
+.macro Op42 /*Reserved Snes9X*/
+/* Used for speedhacks in snesadvance.dat */
+
+ @mov rscratch, #0
+ @str rscratch, [reg_cpu_var, #WaitAddress_ofs] @ CPU.WaitAddress = NULL
+ bic rstatus, rstatus, #MASK_SHUTDOWN
+
+ ldr reg_cycles, [reg_cpu_var,#NextEvent_ofs] @ CPU.Cycles = CPU.NextEvent
+
+ asmAPU_EXECUTE2
+
+ ldrb rscratch2, [rpc], #1 @ rscratch2 <= *CPU.PC++;
+ ADD1MEM
+ @ signed char s9xInt8=0xF0|(b&0xF);
+ orr rscratch, rscratch2, #0xf0
+ mov rscratch, rscratch, asl #25
+ mov rscratch, rscratch, asr #25
+
+ @ OpAddress = ((int) (CPU.PC - CPU.PCBase) + s9xInt8) & 0xffff;
+ sub rscratch3, rpc, regpcbase
+ add rscratch, rscratch3, rscratch
+ bic rscratch, rscratch, #0x00ff0000
+ bic rscratch, rscratch, #0xff000000
+
+ mov rscratch2, rscratch2, lsr #4
+
+ ldr pc, [pc, rscratch2, lsl #2]
+ mov r0, r0 @ nop
+ .word Op42_none
+ .word Op42_10
+ .word Op42_none
+ .word Op42_30
+ .word Op42_none
+ .word Op42_50
+ .word Op42_none
+ .word Op42_70
+ .word Op42_80
+ .word Op42_90
+ .word Op42_none
+ .word Op42_B0
+ .word Op42_none
+ .word Op42_D0
+ .word Op42_none
+ .word Op42_F0
+.endm
+
+Op42_none:
+ NEXTOPCODE
+Op42_10: @ BPL
+ BranchCheck1
+ TST rstatus, #MASK_NEG @ neg, z!=0, NE
+ BNE nob_10
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+nob_10:
+ NEXTOPCODE
+Op42_30: @ BMI
+ BranchCheck0
+ TST rstatus, #MASK_NEG
+ BEQ nob_30
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+nob_30:
+ NEXTOPCODE
+Op42_50: @ BVC
+ BranchCheck0
+ TST rstatus, #MASK_OVERFLOW @ neg, z!=0, NE
+ BNE nob_50
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+nob_50:
+ NEXTOPCODE
+Op42_70: @ BVS
+ BranchCheck0
+ TST rstatus, #MASK_OVERFLOW @ neg, z!=0, NE
+ BEQ nob_70
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+nob_70:
+ NEXTOPCODE
+Op42_80: @ BRA
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress + PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+ NEXTOPCODE
+Op42_90: @ BCC
+ BranchCheck0
+ TST rstatus, #MASK_CARRY
+ BNE nob_90
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+nob_90:
+ NEXTOPCODE
+Op42_B0: @ BCS
+ BranchCheck0
+ TST rstatus, #MASK_CARRY
+ BEQ nob_B0
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+nob_B0:
+ NEXTOPCODE
+Op42_D0: @ BNE
+ BranchCheck1
+ TST rstatus, #MASK_ZERO
+ BNE nob_D0
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+nob_D0:
+ NEXTOPCODE
+Op42_F0: @ BEQ
+ BranchCheck2
+ TST rstatus, #MASK_ZERO
+ BEQ nob_F0
+ ADD rpc, rscratch, regpcbase @ rpc = OpAddress +PCBase
+ ADD1CYCLEX 1
+ CPUShutdown
+nob_F0:
+ NEXTOPCODE
+
+
+/**********************************************************************************************/
+/* AND ******************************************************************************** */
+.macro Op29M1
+ LDRB rscratch , [rpc], #1
+ ANDS reg_a , reg_a, rscratch, LSL #24
+ UPDATE_ZN
+ ADD1MEM
+.endm
+.macro Op29M0
+ LDRB rscratch2 , [rpc,#1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch, rscratch, rscratch2, LSL #8
+ ANDS reg_a , reg_a, rscratch, LSL #16
+ UPDATE_ZN
+ ADD2MEM
+.endm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/**********************************************************************************************/
+/* EOR ******************************************************************************** */
+.macro Op49M0
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch, rscratch, rscratch2,LSL #8
+ EORS reg_a, reg_a, rscratch,LSL #16
+ UPDATE_ZN
+ ADD2MEM
+.endm
+
+
+.macro Op49M1
+ LDRB rscratch , [rpc], #1
+ EORS reg_a, reg_a, rscratch,LSL #24
+ UPDATE_ZN
+ ADD1MEM
+.endm
+
+
+/**********************************************************************************************/
+/* STA *************************************************************************************** */
+.macro Op81M1
+ STA8
+ @ TST rstatus, #MASK_INDEX
+ @ ADD1CYCLENE
+.endm
+.macro Op81M0
+ STA16
+ @ TST rstatus, #MASK_INDEX
+ @ ADD1CYCLENE
+.endm
+
+
+/**********************************************************************************************/
+/* BIT *************************************************************************************** */
+.macro Op89M1
+ LDRB rscratch , [rpc], #1
+ TST reg_a, rscratch, LSL #24
+ UPDATE_Z
+ ADD1MEM
+.endm
+.macro Op89M0
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch, rscratch, rscratch2, LSL #8
+ TST reg_a, rscratch, LSL #16
+ UPDATE_Z
+ ADD2MEM
+.endm
+
+
+
+
+
+
+/**********************************************************************************************/
+/* LDY *************************************************************************************** */
+.macro OpA0X1
+ LDRB rscratch , [rpc], #1
+ MOVS reg_y, rscratch, LSL #24
+ UPDATE_ZN
+ ADD1MEM
+.endm
+.macro OpA0X0
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch, rscratch, rscratch2, LSL #8
+ MOVS reg_y, rscratch, LSL #16
+ UPDATE_ZN
+ ADD2MEM
+.endm
+
+/**********************************************************************************************/
+/* LDX *************************************************************************************** */
+.macro OpA2X1
+ LDRB rscratch , [rpc], #1
+ MOVS reg_x, rscratch, LSL #24
+ UPDATE_ZN
+ ADD1MEM
+.endm
+.macro OpA2X0
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch, rscratch, rscratch2, LSL #8
+ MOVS reg_x, rscratch, LSL #16
+ UPDATE_ZN
+ ADD2MEM
+.endm
+
+/**********************************************************************************************/
+/* LDA *************************************************************************************** */
+.macro OpA9M1
+ LDRB rscratch , [rpc], #1
+ MOVS reg_a, rscratch, LSL #24
+ UPDATE_ZN
+ ADD1MEM
+.endm
+.macro OpA9M0
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch, rscratch, rscratch2, LSL #8
+ MOVS reg_a, rscratch, LSL #16
+ UPDATE_ZN
+ ADD2MEM
+.endm
+
+/**********************************************************************************************/
+/* CMY *************************************************************************************** */
+.macro OpC0X1
+ LDRB rscratch , [rpc], #1
+ SUBS rscratch2 , reg_y , rscratch, LSL #24
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+ ADD1MEM
+.endm
+.macro OpC0X0
+ LDRB rscratch2 , [rpc, #1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch, rscratch, rscratch2, LSL #8
+ SUBS rscratch2 , reg_y, rscratch, LSL #16
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+ ADD2MEM
+.endm
+
+
+
+
+
+/**********************************************************************************************/
+/* CMP *************************************************************************************** */
+.macro OpC9M1
+ LDRB rscratch , [rpc], #1
+ SUBS rscratch2 , reg_a , rscratch, LSL #24
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+ ADD1MEM
+.endm
+.macro OpC9M0
+ LDRB rscratch2 , [rpc,#1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch, rscratch, rscratch2, LSL #8
+ SUBS rscratch2 , reg_a, rscratch, LSL #16
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+ ADD2MEM
+.endm
+
+/**********************************************************************************************/
+/* CMX *************************************************************************************** */
+.macro OpE0X1
+ LDRB rscratch , [rpc], #1
+ SUBS rscratch2 , reg_x , rscratch, LSL #24
+ BICCC rstatus, rstatus, #MASK_CARRY
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+ ADD1MEM
+.endm
+.macro OpE0X0
+ LDRB rscratch2 , [rpc,#1]
+ LDRB rscratch , [rpc], #2
+ ORR rscratch, rscratch, rscratch2, LSL #8
+ SUBS rscratch2 , reg_x, rscratch, LSL #16
+ BICCC rstatus, rstatus, #MASK_CARRY
+
+ ORRCS rstatus, rstatus, #MASK_CARRY
+ UPDATE_ZN
+ ADD2MEM
+.endm
+