📄 spc700.asm
字号:
jz .setzeroflag
mov byte [spcNZ],1
jc .setcarryflag
and byte [spcP],0FEh
jmp .skipflags
.setsignflag
mov byte [spcNZ],80h
jc .setcarryflag
and byte [spcP],0FEh
jmp .skipflags
.setzeroflag
mov byte [spcNZ],0
jc .setcarryflag
and byte [spcP],0FEh
jmp .skipflags
.setcarryflag
or byte [spcP],1
.skipflags
%endmacro
;spcNF db 0 ; The Negative Flag 128 or 127 80h
;spcOF db 0 ; The Overflow Flag 64 or 191 40h
;spcDPF db 0 ; Direct Page Flag 32 or 223 20h
;spcUF db 0 ; The Unused Flag ? 16 or 239 10h
;spcHCF db 0 ; The Half Carry Flag 8 or 247 08h
;spcIF db 0 ; The interrupt flag 4 or 251 04h
;spcZF db 0 ; The Zero Flag 2 or 253 02h
;spcCF db 0 ; The Carry Flag 1 or 254 01h
; test byte[spcP],08h
; jz .nohcarry
; or ah,00010000b
;.nohcarry
%macro SPCSetFlagnvhzc 0
lahf
js .setsignflag
jz .setzeroflag
mov byte [spcNZ],1
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setsignflag
mov byte [spcNZ],80h
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setzeroflag
mov byte [spcNZ],0
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setoverflowflag
or byte [spcP],40h
.skipflags
and byte [spcP],0F6h
test ah,01h
jz .noCarry
or byte [spcP],1
.noCarry
test ah,10h
jz .nohf
or byte [spcP],8
.nohf
ret
%endmacro
%macro SPCSetFlagnvhzcnoret 0
lahf
js .setsignflag
jz .setzeroflag
mov byte [spcNZ],1
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setsignflag
mov byte [spcNZ],80h
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setzeroflag
mov byte [spcNZ],0
jo .setoverflowflag
and byte [spcP],0BFh
jmp .skipflags
.setoverflowflag
or byte [spcP],40h
.skipflags
and byte [spcP],0F6h
test ah,01h
jz .noCarry
or byte [spcP],1
.noCarry
test ah,10h
jz .nohf
or byte [spcP],8
.nohf
%endmacro
;************************************************
; Misc Opcodes
;************************************************
NEWSYM Op00 ; NOP
ret
NEWSYM OpEF ; SLEEP standby SLEEP mode .........
dec ebp
ret
NEWSYM OpFF ; STOP standby STOP mode .........
inc dword[spc700read]
dec ebp
ret
NEWSYM Op9F ; XCN A A(7-4) <-> A(3-0) N......Z.
ror byte [spcA],4
mov al,byte[spcA]
mov [spcNZ],al
ret
;************************************************
; Branch Stuff
;************************************************
NEWSYM Op10 ; BPL Branch on N=0
test byte [spcNZ],128
jz .branch
spcbrancher
NEWSYM Op30 ; BMI Branch on N=1
test byte [spcNZ],128
jnz .branch
spcbrancher
NEWSYM Op50 ; BVC Branch on V=0
test byte [spcP],64
jz .branch
spcbrancher
NEWSYM Op70 ; BVS Branch on V=1
test byte [spcP],64
jnz .branch
spcbrancher
NEWSYM Op90 ; BCC Branc on c=0
test byte [spcP],1
jz .branch
spcbrancher
NEWSYM OpB0 ; BCS Branch on C=1
test byte [spcP],1
jnz .branch
spcbrancher
NEWSYM OpD0 ; BNE branch on Z=0
test byte [spcNZ],255
jnz .branch
spcbrancher
NEWSYM OpF0 ; BEQ Branch on Z=1
test byte [spcNZ],0FFh
jz .branch
spcbrancher
NEWSYM Op2F ; BRA rel branch always ...
movsx ebx,byte [ebp]
inc ebp
add ebp,ebx
ret
;************************************************
; Clear/Set Flag bits
;************************************************
; CLRP 20 1 2 clear direct page flag ..0.....
NEWSYM Op20 ; CLRP Clear direct page flag
and byte [spcP],11011111b
mov dword [spcRamDP],spcRam
ret
; SETP 40 1 2 set dorect page flag ..1..0..
NEWSYM Op40 ; SETP Set Direct Page Flag (Also clear interupt flag?)
or byte [spcP],00100000b
and byte [spcP],11111011b
mov dword [spcRamDP],spcRam
add dword [spcRamDP],100h
ret
; CLRC 60 1 2 clear carry flag .......0
NEWSYM Op60 ; CLRC Clear carry flag
and byte [spcP],11111110b
ret
; SETC 80 1 2 set carry flag .......1
NEWSYM Op80 ; SETC Set carry flag
or byte [spcP],00000001b
ret
; EI A0 1 3 set interrup enable flag .....1..
NEWSYM OpA0 ; EI set interrupt flag
or byte [spcP],00000100b
ret
; DI C0 1 3 clear interrup enable flag .....0..
NEWSYM OpC0 ; DI clear interrupt flag
and byte [spcP],11111011b
ret
; CLRV E0 1 2 clear V and H .0..0...
NEWSYM OpE0 ; CLRV clear V and H
and byte [spcP],10110111b
ret
; NOTC ED 1 3 complement carry flag .......C
NEWSYM OpED ; NOTC complement carry flag .......C
xor byte [spcP],00000001b
ret
;************************************************
; TCALL instructions (Verified)
;************************************************
NEWSYM Op01 ; TCALL 0
spctcall 30
NEWSYM Op11 ; TCALL 1
spctcall 28
NEWSYM Op21 ; TCALL 2
spctcall 26
NEWSYM Op31 ; TCALL 3
spctcall 24
NEWSYM Op41 ; TCALL 4
spctcall 22
NEWSYM Op51 ; TCALL 5
spctcall 20
NEWSYM Op61 ; TCALL 6
spctcall 18
NEWSYM Op71 ; TCALL 7
spctcall 16
NEWSYM Op81 ; TCALL 8
spctcall 14
NEWSYM Op91 ; TCALL 9
spctcall 12
NEWSYM OpA1 ; TCALL A
spctcall 10
NEWSYM OpB1 ; TCALL B
spctcall 08
NEWSYM OpC1 ; TCALL C
spctcall 06
NEWSYM OpD1 ; TCALL D
spctcall 04
NEWSYM OpE1 ; TCALL E
spctcall 02
NEWSYM OpF1 ; TCALL F
spctcall 00
;************************************************
; SET1 instructions (Verified)
;************************************************
NEWSYM Op02 ; SET1 direct page bit 0
set1 1
NEWSYM Op22 ; SET1 direct page bit 1
set1 2
NEWSYM Op42 ; SET1 direct page bit 2
set1 4
NEWSYM Op62 ; SET1 direct page bit 3
set1 8
NEWSYM Op82 ; SET1 direct page bit 4
set1 16
NEWSYM OpA2 ; SET1 direct page bit 5
set1 32
NEWSYM OpC2 ; SET1 direct page bit 6
set1 64
NEWSYM OpE2 ; SET1 direct page bit 7
set1 128
;************************************************
; CLR1 instructions (Verified)
;************************************************
NEWSYM Op12 ; CLR1 direct page bit 0
clr1 255-1
NEWSYM Op32 ; CLR1 direct page bit 1
clr1 255-2
NEWSYM Op52 ; CLR1 direct page bit 2
clr1 255-4
NEWSYM Op72 ; CLR1 direct page bit 3
clr1 255-8
NEWSYM Op92 ; CLR1 direct page bit 4
clr1 255-16
NEWSYM OpB2 ; CLR1 direct page bit 5
clr1 255-32
NEWSYM OpD2 ; CLR1 direct page bit 6
clr1 255-64
NEWSYM OpF2 ; CLR1 direct page bit 7
clr1 255-128
;************************************************
; BBS instructions (Verified)
;************************************************
NEWSYM Op03 ; BBS direct page bit 0
bbs 1
NEWSYM Op23 ; BBS direct page bit 1
bbs 2
NEWSYM Op43 ; BBS direct page bit 2
bbs 4
NEWSYM Op63 ; BBS direct page bit 3
bbs 8
NEWSYM Op83 ; BBS direct page bit 4
bbs 16
NEWSYM OpA3 ; BBS direct page bit 5
bbs 32
NEWSYM OpC3 ; BBS direct page bit 6
bbs 64
NEWSYM OpE3 ; BBS direct page bit 7
bbs 128
;************************************************
; BBC instructions (Verified)
;************************************************
NEWSYM Op13 ; BBC direct page bit 0
bbc 1
NEWSYM Op33 ; BBC direct page bit 1
bbc 2
NEWSYM Op53 ; BBC direct page bit 2
bbc 4
NEWSYM Op73 ; BBC direct page bit 3
bbc 8
NEWSYM Op93 ; BBC direct page bit 4
bbc 16
NEWSYM OpB3 ; BBC direct page bit 5
bbc 32
NEWSYM OpD3 ; BBC direct page bit 6
bbc 64
NEWSYM OpF3 ; BBC direct page bit 7
bbc 128
;************************************************
; OR A,instructions
;************************************************
NEWSYM Op04 ; OR A,dp A <- A OR (dp) N.....Z.
SPCaddr_DP
SPC_OR_A
NEWSYM Op14 ; OR A,dp+X A <- A OR (dp+X) N.....Z.
SPCaddr_DP_X
SPC_OR_A
NEWSYM Op05 ; OR A,labs A <- A OR (abs) N.....Z.
SPCaddr_LABS
SPC_OR_A
NEWSYM Op15 ; OR A,labs+x A <- A OR (abs+X) N.....Z.
SPCaddr_LABS_X
SPC_OR_A
NEWSYM Op06 ; OR A,(X) A <- A OR (X) N.....Z.
SPCaddr__X_
SPC_OR_A
NEWSYM Op16 ; OR A,labs+Y A <- A OR (abs+Y) N......Z.
SPCaddr_LABS_Y
SPC_OR_A
NEWSYM Op07 ; OR A,(dp+X) A <- A OR ((dp+X+1)(dp+X)) N......Z.
SPCaddr_bDP_Xb
SPC_OR_A
NEWSYM Op17 ; OR A,(dp)+Y A <- A OR ((dp+1)(dp)+Y) N......Z.
SPCaddr_bDPb_Y
SPC_OR_A
NEWSYM Op08 ; OR A,#inm A <- A OR inm N......Z.
mov al,[ebp]
inc ebp
SPC_OR_A
;************************************************
; AND A, instructions
;************************************************
NEWSYM Op24 ; AND A,dp A <- A AND (dp) N.....Z.
SPCaddr_DP
SPC_AND_A
NEWSYM Op34 ; AND A,dp+x A <- A AND (dp+X) N.....Z.
SPCaddr_DP_X
SPC_AND_A
NEWSYM Op25 ; AND A,labs A <- A AND (abs) N.....Z.
SPCaddr_LABS
SPC_AND_A
NEWSYM Op35 ; AND A,labs+X A <- A AND (abs+X) N.....Z.
SPCaddr_LABS_X
SPC_AND_A
NEWSYM Op26 ; AND A,(X) A <- A AND (X) N......Z.
SPCaddr__X_
SPC_AND_A
NEWSYM Op36 ; AND A,labs+Y A <- A AND (abs+Y) N......Z.
SPCaddr_LABS_Y
SPC_AND_A
NEWSYM Op27 ; AND A,(dp+X) A <- A AND ((dp+X+1)(dp+X)) N......Z.
SPCaddr_bDP_Xb
SPC_AND_A
NEWSYM Op37 ; AND A,(dp)+Y A <- A AND ((dp+1)(dp)+Y) N......Z.
SPCaddr_bDPb_Y
SPC_AND_A
NEWSYM Op28 ; AND A,#inm A <- A AND inm N......Z.
mov al,[ebp]
inc ebp
SPC_AND_A
;************************************************
; EOR A, instructions
;************************************************
NEWSYM Op44 ; EOR A,dp A <- A EOR (dp) N.....Z.
SPCaddr_DP
SPC_EOR_A
NEWSYM Op54 ; EOR A,dp+x A <- A EOR (dp+X) N.....Z.
SPCaddr_DP_X
SPC_EOR_A
NEWSYM Op45 ; EOR A,labs A <- A EOR (abs) N.....Z.
SPCaddr_LABS
SPC_EOR_A
NEWSYM Op55 ; EOR A,labs+X A <- A EOR (abs+X) N.....Z.
SPCaddr_LABS_X
SPC_EOR_A
NEWSYM Op46 ; EOR A,(X) A <- A EOR (X) N......Z.
SPCaddr__X_
SPC_EOR_A
NEWSYM Op56 ; EOR A,labs+Y A <- A EOR (abs+Y) N......Z.
SPCaddr_LABS_Y
SPC_EOR_A
NEWSYM Op47 ; EOR A,(dp+X) A <- A EOR ((dp+X+1)(dp+X)) N......Z.
SPCaddr_bDP_Xb
SPC_EOR_A
NEWSYM Op57 ; EOR A,(dp)+Y A <- A EOR ((dp+1)(dp)+Y) N......Z.
SPCaddr_bDPb_Y
SPC_EOR_A
NEWSYM Op48 ; EOR A,#inm A <- A EOR inm N......Z.
mov al,[ebp]
inc ebp
SPC_EOR_A
;************************************************
; CMP A, instructions
;************************************************
NEWSYM Op64 ; CMP A,dp A-(dp) N.....ZC
SPCaddr_DP
SPC_CMP_A
NEWSYM Op74 ; CMP A,dp+x A-(dp+X) N.....ZC
SPCaddr_DP_X
SPC_CMP_A
NEWSYM Op65 ; CMP A,labs A-(abs) N.....ZC
SPCaddr_LABS
SPC_CMP_A
NEWSYM Op75 ; CMP A,labs+X A-(abs+X) N.....ZC
SPCaddr_LABS_X
SPC_CMP_A
NEWSYM Op66 ; CMP A,(X) A-(X) N......ZC
SPCaddr__X_
SPC_CMP_A
NEWSYM Op76 ; CMP A,labs+Y A-(abs+Y) N......ZC
SPCaddr_LABS_Y
SPC_CMP_A
NEWSYM Op67 ; CMP A,(dp+X) A-((dp+X+1)(dp+X)) N......ZC
SPCaddr_bDP_Xb
SPC_CMP_A
NEWSYM Op77 ; CMP A,(dp)+Y A-((dp+1)(dp)+Y) N......ZC
SPCaddr_bDPb_Y
SPC_CMP_A
NEWSYM Op68 ; CMP A,#inm A-inm N......ZC
mov al,[ebp]
inc ebp
SPC_CMP_A
;************************************************
; ADC A, instructions
;************************************************
NEWSYM Op84 ; ADC A,dp A <- A+(dp)+C NV..H.ZC
SPCaddr_DP
SPC_ADC_A
NEWSYM Op94 ; ADC A,dp+x A <- A+(dp+X)+C NV..H.ZC
SPCaddr_DP_X
SPC_ADC_A
NEWSYM Op85 ; ADC A,labs A <- A+(abs)+C NV..H.ZC
SPCaddr_LABS
SPC_ADC_A
NEWSYM Op95 ; ADC A,labs+X A <- A+(abs+X)+C NV..H.ZC
SPCaddr_LABS_X
SPC_ADC_A
NEWSYM Op86 ; ADC A,(X) A <- A+(X)+C NV..H..ZC
SPCaddr__X_
SPC_ADC_A
NEWSYM Op96 ; ADC A,labs+Y A <- A+(abs+Y)+C NV..H..ZC
SPCaddr_LABS_Y
SPC_ADC_A
NEWSYM Op87 ; ADC A,(dp+X) A <- A+((dp+X+1)(dp+X)) NV..H..ZC
SPCaddr_bDP_Xb
SPC_ADC_A
NEWSYM Op97 ; ADC A,(dp)+Y A <- A+((dp+1)(dp)+Y) NV..H..ZC
SPCaddr_bDPb_Y
SPC_ADC_A
NEWSYM Op88 ; ADC A,#inm A <- A+inm+C NV..H..ZC
mov al,[ebp]
inc ebp
SPC_ADC_A
;************************************************
; SBC A, instructions
;************************************************
NEWSYM OpA4 ; SBC A,dp A <- A-(dp)-!C NV..H.ZC
SPCaddr_DP
SPC_SBC_A
NEWSYM OpB4 ; SBC A,dp+x A <- A-(dp+X)-!C NV..H.ZC
SPCaddr_DP_X
SPC_SBC_A
NEWSYM OpA5 ; SBC A,labs A <- A-(abs)-!C NV..H.ZC
SPCaddr_LABS
SPC_SBC_A
NEWSYM OpB5 ; SBC A,labs+x A <- A-(abs+X)-!C NV..H.ZC
SPCaddr_LABS_X
SPC_SBC_A
NEWSYM OpA6 ; SBC A,(X) A <- A-(X)-!C NV..H..ZC
SPCaddr__X_
SPC_SBC_A
NEWSYM OpB6 ; SBC A,labs+Y A <- A-(abs+Y)-!C NV..H..ZC
SPCaddr_LABS_Y
SPC_SBC_A
NEWSYM OpA7 ; SBC A,(dp+X) A <- A-((dp+X+1)(dp+X))-!C NV..H..ZC
SPCaddr_bDP_Xb
SPC_SBC_A
NEWSYM OpB7 ; SBC A,(dp)+Y A <- A-((dp+1)(dp)+Y)-!C NV..H..ZC
SPCaddr_bDPb_Y
SPC_SBC_A
NEWSYM OpA8 ; SBC A,#inm A <- A-inm-!C NV..H..ZC
mov al,[ebp]
inc ebp
SPC_SBC_A
;************************************************
; MOV A, instructions
;************************************************
NEWSYM OpE4 ; MOV A,dp A <- (dp) N......Z
SPCaddr_DP
SPC_MOV_A
NEWSYM OpF4 ; MOV A,dp+x A <- (dp+X) N......Z
SPCaddr_DP_X
SPC_MOV_A
NEWSYM OpE5 ; MOV A,labs A <- (abs) N......Z
SPCaddr_LABS
SPC_MOV_A
NEWSYM OpF5 ; MOV A,labs+X A <- (abs+X) N......Z
SPCaddr_LABS_X
SPC_MOV_A
NEWSYM OpE6 ; MOV A,(X) A <- (X) N......Z
SPCaddr__X_
SPC_MOV_A
NEWSYM OpF6 ; MOV A,labs+Y A <- (abs+Y) N......Z
SPCaddr_LABS_Y
SPC_MOV_A
NEWSYM OpE7 ; MOV A,(dp+X) A <- ((dp+X+1)(dp+X)) N......Z
SPCaddr_bDP_Xb
SPC_MOV_A
NEWSYM OpF7 ; MOV A,(dp)+Y A <- ((dp+1)(dp)+Y) N......Z
SPCaddr_bDPb_Y
SPC_MOV_A
NEWSYM OpE8 ; MOV A,#inm A <- inm N......Z
mov al,[ebp]
inc ebp
SPC_MOV_A
;************************************************
; DP,#imm instructions
;************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -