📄 basic_op.asm
字号:
xc 2,aov
st #1,*(_Overflow)
xc 2,nc
st #0,*(_Carry)
ldm t,a
sub a,b
nop
nop
xc 2,bov
st #1,*(_Overflow)
xc 2,nc
st #0,*(_Carry)
ld b,a
POPM ST1
POPM ST0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word32 L_negate(Word32 L_var1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_L_negate:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
ssbx sxm
ssbx ovm
neg a
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word16 mult_r(Word16 var1, Word16 var2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_mult_r:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
SSBX FRCT
ssbx sxm
ld #0,ASM
stm #0,bk
ssbx ovm ; to allow -1* -1 (1)
STLM A,T
LD #0,A
MPYR *SP(3),A
ld a,b
st #0,*(_Overflow)
xc 2,aov
st #1,*(_Overflow)
LD b,-16,b
ld b,a
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word32 L_shl(Word32 L_var1, Word16 var2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_L_shl:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
ssbx sxm
ssbx ovm
st #0,*(_Overflow)
ld *sp(3),b
and #8000h,b
bc L_shl_R,bneq
ld *sp(3),b
and #0fff0h,b
bc L_shl_DO,beq
ld a,8,a
bc L_shl_O,aov
ld a,8,a
bc L_shl_O,aov
ld *sp(3),b
sub #10h,b
stl b,*sp(3)
and #0fff0h,b
bc L_shl_DO,beq
ld a,8,a
ld a,7,a
b L_shl_O
L_shl_DO:
ld *sp(3),b
and #0fff8h,b
bc L_shl_FDO,beq
ld a,8,a
bc L_shl_O,aov
ld *sp(3),b
sub #8h,b
stl b,*sp(3)
L_shl_FDO:
ld *sp(3),asm
ld a,asm,a
bc L_shl_O,aov
b L_shl_E
L_shl_R:
ld *sp(3),b
and #0fff0h,b
xor #0fff0h,b
bc L_shl_RDO,beq
ld a,-16,a
addm #10h,*sp(3)
ld *sp(3),b
and #0fff0h,b
xor #0fff0h,b
bc L_shl_RDO,beq
ld a,-16,a
b L_shl_E
L_shl_RDO:
ld *sp(3),asm
ld a,asm,a
b L_shl_E
L_shl_O:
st #1,*(_Overflow)
L_shl_E:
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word32 L_shr(Word32 L_var1, Word16 var2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_L_shr:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
ssbx sxm
ssbx ovm
st #0,*(_Overflow)
ld *sp(3),16,b
neg b
ld b,-16,b
stl b,*sp(3)
;ld *sp(3),b
and #8000h,b
bc L_shr_R,bneq
ld *sp(3),b
and #0fff0h,b
bc L_shr_DO,beq
ld a,8,a
bc L_shr_O,aov
ld a,8,a
bc L_shr_O,aov
ld *sp(3),b
sub #10h,b
stl b,*sp(3)
and #0fff0h,b
bc L_shr_DO,beq
ld a,8,a
ld a,7,a
b L_shr_O
L_shr_DO:
ld *sp(3),b
and #0fff8h,b
bc L_shr_FDO,beq
ld a,8,a
bc L_shr_O,aov
ld *sp(3),b
sub #8h,b
stl b,*sp(3)
L_shr_FDO:
ld *sp(3),asm
ld a,asm,a
bc L_shr_O,aov
b L_shr_E
L_shr_R:
ld *sp(3),b
and #0fff0h,b
xor #0fff0h,b
bc L_shr_RDO,beq
ld a,-16,a
addm #10h,*sp(3)
ld *sp(3),b
and #0fff0h,b
xor #0fff0h,b
bc L_shr_RDO,beq
ld a,-16,a
b L_shr_E
L_shr_RDO:
ld *sp(3),asm
ld a,asm,a
b L_shr_E
L_shr_O:
st #1,*(_Overflow)
L_shr_E:
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word16 shr_r(Word16 var1, Word16 var2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_shr_r:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
ssbx sxm
ssbx ovm
ssbx c16
st #0,*(_Overflow)
ld *sp(3),16,b
neg b
ld b,-16,b
stl b,*sp(3) ;取负数
ld a,15,a
ld a,1,a
and #8000h,b
bc shr_r_R,bneq ;检验左移还是右移
ld *sp(3),b
and #0fff0h,b ;检验是否大于15
bc shr_r_DO,beq
ld a,8,a
ld a,8,a
b shr_r_O
shr_r_DO:
ld *sp(3),b
and #0fff8h,b
bc shr_r_FDO,beq
ld a,8,a
bc shr_r_O,aov
ld *sp(3),b
sub #8h,b
stl b,*sp(3)
shr_r_FDO:
ld *sp(3),asm
ld a,asm,a
bc shr_r_O,aov
b shr_r_E
shr_r_R:
ld *sp(3),b
and #0fff0h,b
xor #0fff0h,b
bc shr_r_RDO,beq
ld #0,a
b shr_r_E
shr_r_RDO:
ld *sp(3),asm
ld a,asm,a
add #4000h,1,a
b shr_r_E
shr_r_O:
st #1,*(_Overflow)
shr_r_E:
ld a,-16,a
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word16 mac_r(Word32 L_var3, Word16 var1, Word16 var2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_mac_r:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
SSBX FRCT
ssbx sxm
ssbx ovm
st #0,*(_Overflow)
ld *sp(3),t
mac *sp(4),a
ld a,b
nop
xc 2,aov
st #1,*(_Overflow)
add #4000h,1,b
nop
nop
xc 2,bov
st #1,*(_Overflow)
ld b,-16,a
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word16 msu_r(Word32 L_var3, Word16 var1, Word16 var2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_msu_r:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
SSBX FRCT
ssbx sxm
ssbx ovm
st #0,*(_Overflow)
ld *sp(3),t
mas *sp(4),a
ld a,b
nop
xc 2,aov
st #1,*(_Overflow)
add #4000h,1,b
nop
nop
xc 2,bov
st #1,*(_Overflow)
ld b,-16,a
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word32 L_deposit_l(Word16 var1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_L_deposit_l:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word32 L_shr_r(Word32 L_var1,Word16 var2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_L_shr_r:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
ssbx sxm
ssbx ovm
st #0,*(_Overflow)
ld *sp(3),16,b
neg b
ld b,-16,b
stl b,*sp(3)
and #8000h,b
bc L_shr_r_R,bneq
ld *sp(3),b
and #0fff0h,b
bc L_shr_r_DO,beq
ld a,8,a
bc L_shr_r_O,aov
ld a,8,a
bc L_shr_r_O,aov
ld *sp(3),b
sub #10h,b
stl b,*sp(3)
and #0fff0h,b
bc L_shr_r_DO,beq
ld a,8,a
ld a,7,a
b L_shr_r_O
L_shr_r_DO:
ld *sp(3),b
and #0fff8h,b
bc L_shr_r_FDO,beq
ld a,8,a
bc L_shr_r_O,aov
ld *sp(3),b
sub #8h,b
stl b,*sp(3)
L_shr_r_FDO:
ld *sp(3),asm
ld a,asm,a
bc L_shr_r_O,aov
b L_shr_r_E
L_shr_r_R:
ld *sp(3),b
and #0fff0h,b
xor #0fff0h,b
bc L_shr_r_RDO,beq
and #4000h,1,a,b
ld b,-15,b
stlm b,t
ld a,-16,a
addm #10h,*sp(3)
ld *sp(3),b
and #0fff0h,b
xor #0fff0h,b
bc L_shr_r_RDO,beq
ld #0,a
b L_shr_r_E
L_shr_r_RDO:
ld *sp(3),b
neg b
sub #1,b
frame -1
nop
nop
stl b,*sp(0)
ld *sp(0),asm
ld #1,b
frame 1
ld b,asm,b
and a,b
stm #0,t
bc L_shr_r_Z,beq
stm #1,t
L_shr_r_Z:
ld *sp(3),asm
ld a,asm,a
ldm t,b
add b,a
b L_shr_r_E
L_shr_r_O:
st #1,*(_Overflow)
L_shr_r_E:
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word32 L_abs(Word32 L_var1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_L_abs:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
ssbx sxm
ssbx ovm
abs a
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word32 L_sat (Word32 L_var1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_L_sat:
PSHM ST0
PSHM ST1
ssbx sxm
ld *(_Overflow),b
bc L_sat_E,beq
ld #7fffh,15,a
ld a,1,a
or #0ffffh,a
ld *(_Carry),b
bc L_sat_NC,beq
ld #8000h,15,a
ld a,1,a
L_sat_NC:
st #0h,*(_Overflow)
st #0h,*(_Carry)
L_sat_E:
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word16 norm_s(Word16 var1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_norm_s:
PSHM ST0
PSHM ST1
ssbx c16
ssbx sxm
ssbx ovm
exp a
nop
ldm t,a
sub #10h,a
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word16 div_s(Word16 var1, Word16 var2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_div_s:
PSHM ST0
PSHM ST1
RSBX OVA
RSBX OVB
ssbx sxm
st #0,*(_Error)
;and #4000h,1,a,b
bc div_s_Er1,alt
ld *sp(3),b
;and #4000h,1,b
bc div_s_Er1,bleq
ld a,b
sub *sp(3),b
bc div_s_P,bleq
div_s_Er1:
st #1,*(_Error)
b div_s_E
div_s_P:
ld a,15,a
ld a,1,a
rpt #14
subc *sp(3),a
div_s_E:
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word16 norm_l(Word32 L_var1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_norm_l:
PSHM ST0
PSHM ST1
ssbx sxm
ssbx ovm
exp a
nop
ldm t,a
POPM ST1
POPM ST0
RET
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -