📄 math.txt
字号:
;*******************************************************************************
;
; MODULE: Math.lib
;
; DATE: 07/22/2003
;
; AUTHOR: Sam Lin
;
; NOTE: 1. add16 ar0, ar1
; ar0 = ar0 + ar1
; 2. add16m mem0, mem1, mem2, mem3
; <arg0H, arg0L> = <mem0, mem1> + <mem2, mem3>
; 3. sub16 ar0, ar1
; ar0 = ar0 - ar1
; 4. sub16m mem0, mem1, mem2, mem3
; <arg0H, arg0L> = <mem0, mem1> - <mem2, mem3>
; 5. mul16m mem0, mem1, mem2, mem3
; <arg0H, arg0L, arg1H, arg1L> = <mem0, mem1> * <mem2, mem3>
; Fixed 28 instruction cycle
; 24 word R.O.M. space for this macro
; 6. div16m mem0, mem1, mem2, mem3, mem4, mem5
; <arg2msb, arg2H, arg2M, arg2L>= <mem0, mem1, mem2, mem3> / <mem4, mem5>
; <arg0H, arg0L> = <mem0, mem1, mem2, mem3> % <mem4, mem5>
; about 1100 instruction cycle
;
; include this file will use 7-word R.O.M space;
; REVISION:
; Version: 1.1
; Date: 12/30/2003
; This file came from math16.lib.
; NOTE: 7. div24m mem0, mem1, mem2, mem3, mem4, mem5, mem6
; <arg2msb, arg2H, arg2M, arg2L> = <mem0, mem1, mem2, mem3> / < mem4, mem5, mem6>
; <arg0msb, arg0H, arg0L> = <mem0, mem1, mem2, mem3> % < mem4, mem5, mem6>
; Version: 1.2
; Date 01/06/2004
; This file integrated BCD.lib
; NOTE: 8. atoh_m16 ar0, ar1 ; ASCII to Hex
; (ACC)hex = (<ar0, ar1>)ascii
; 9. htoa_m08 ar0, ar1 ; Hex to ASCII
; (<ar0, ar1>)ascii = (ACC)hex
; 10. dtoh_m24 macro ar0, ar1, ar2, ar3 ; decimal value convert to hex value
; (<arg0H, arg0L, arg1H>)hex = (<ar0, ar1, ar2, ar3>)decimal
; 11. call mpy10
; <arg0H, arg0L, arg1H> = (<arg0H, arg0L, arg1H> + a) * 10
; 12. htod_m24 macro ar0, ar1, ar2 ; hex value convert to decimal value
; (<arg0H, arg0L, arg1H, arg1L>)decimal = (<ar0, ar1, ar2>)hex
; Version 1.3
; 13. add24m mem0, mem1, mem2, mem3, mem4, mem5
; <mem0, mem1, mem2> = <mem0, mem1, mem2> + <mem3, mem4, mem5>
; 14. mark "mpy10" because lack of "MUL" instruction
; 15. GorL24 mem0, mem1, mem2, ar0, ar1, ar2
; if <mem0, mem1, mem2> >= <ar0, ar1, ar2> then FC = 1
; else FC = 0
; 16. incmem24 mem0, mem1, mem2
; <mem0, mem1, mem2> = < mem0, mem1, mem2> + 1
; Version 1.4
; 03/09/2004
; 17. sadd15m mem0, mem1, mem2, mem3
; <arg0H, arg0L> = <mem0, mem1> + <mem2, mem3>
; if the result < 0 the sign_byte.0 = 1
; 18. ssub16m mem0, mem1, mem2, mem3
; <arg0H, arg0L> = <mem0, mem1> - <mem2, mem3>
; if the result < 0 the sign_byte.0 = 1
; 19. smul16m mem0, mem1, mem2, mem3
; <arg0H, arg0L, arg1H, arg1L> = <mem0, mem1> * <mem2, mem3>
; if the result < 0 the sign_byte.0 = 1
; 20. sdiv16m mem0, mem1, mem2, mem3, mem4, mem5
; <arg2msb, arg2H, arg2M, arg2L>= <mem0, mem1, mem2, mem3> / <mem4, mem5>
; <arg0H, arg0L> = <mem0, mem1, mem2, mem3> % <mem4, mem5>
; if the result < 0 the sign_byte.0 = 1
; Version 1.5
; 21. GorL8 mem0, ar0
; if mem0 >= ar0 then FC = 1
; else FC = 0
; 22. GorL16 mem0, mem1, ar0, ar1
; if <mem0, mem1> >= <ar0, ar1> then FC = 1
; else FC = 0
; 23. GorL16m mem0, mem1, mem2, mem3
; if <mem0, mem1> >= <mem2, mem3> then FC = 1
; else FC = 0
; Version 1.6
; 24. mul16msw mem0, mem1, mem2, mem3
; <arg0H, arg0L, arg1H, arg1L> = <mem0, mem1> * <mem2, mem3>
; Version 1.7 05/31/2004
; 25. sqrt16m mem0, mem1
; <arg2L> = <mem0, mem1>^0.5
;
;*******************************************************************************
;*
;* (c) Copyright 2002, Sonix Technology Co., Inc.
;*
;*******************************************************************************
IFNDEF __math_LIB
__math_LIB EQU 1
ENDIF
.data
arg0msb ds 1
arg0H ds 1
arg0M ds 1
arg0L ds 1
arg1H ds 1
arg1M ds 1
arg1L ds 1
arg2msb ds 1
arg2H ds 1
arg2M ds 1
arg2L ds 1
m_loop ds 1
tmp ds 1
sign_byte equ arg0msb
.code
add16 macro ar0, ar1
mov a, #(ar0 >> 8)
b0mov arg0H, a
mov a, #(ar0 !& 0x00FF)
b0mov arg0L, a
mov a, #(ar1 !& 0x00FF)
add arg0L,a
mov a, #(ar1 >> 8)
adc arg0H, a
endm
sub16 macro ar0, ar1
mov a, #(ar1 >> 8)
b0mov arg1H, a
mov a, #(ar1 !& 0x00FF)
b0mov arg1L, a
mov a, #(ar0 !& 0x00FF)
sub a, arg1L
b0mov arg0L, a
mov a, #(ar0 >> 8)
sbc a, arg1H
b0mov arg0H, a
endm
add16m macro mem0, mem1, mem2, mem3
b0mov a, mem0
b0mov arg0H, a
b0mov a, mem1
b0mov arg0L, a
b0mov a, mem3
add arg0L,a
b0mov a, mem2
adc arg0H, a
endm
add24m macro mem0, mem1, mem2, mem3, mem4, mem5
b0mov a, mem0
b0mov arg0H, a
b0mov a, mem1
b0mov arg0M, a
b0mov a, mem2
b0mov arg0L, a
b0mov a, mem5
add arg0L, a
b0mov a, mem4
adc arg0M, a
b0mov a, mem3
adc arg0H, a
b0mov a, arg0H
b0mov mem0, a
b0mov a, arg0M
b0mov mem1, a
b0mov a, arg0L
b0mov mem2, a
endm
sub16m macro mem0, mem1, mem2,mem3
b0mov a, mem2
b0mov arg1H, a
b0mov a, mem3
b0mov arg1L, a
b0mov a, mem1
sub a, arg1L
b0mov arg0L, a
b0mov a, mem0
sbc a, arg1H
b0mov arg0H, a
endm
mul16m macro mem0, mem1, mem2, mem3
clr arg0L
clr arg0H
b0mov a, mem1
mul a, mem3
b0mov arg1L , a
mov a, r
b0mov arg1H, a
b0mov a, mem0
mul a, mem3
add arg1H, a
b0mov a, r
adc arg0L, a
b0mov a, mem1
mul a, mem2
add arg1H, a
b0mov a, r
adc arg0L, a
mov a, #0x00
adc arg1H, a
b0mov a, mem0
mul a, mem2
add arg0L, a
b0mov a, r
adc arg0H, a
endm
div16m macro mem0, mem1, mem2, mem3, mem4, mem5
LOCAL div16m_10
LOCAL div16m_20
LOCAL div16m_30
LOCAL div16m_90
clr arg2H
clr arg2M
clr arg2L
clr arg0H
clr arg0L
mov a, #0x21
b0mov m_loop, a
b0mov a, mem4
b0mov arg1H , a
b0mov a, mem5
b0mov arg1L , a
div16m_10:
decms m_loop
jmp div16m_20
jmp div16m_90
div16m_20:
b0bclr FC
rlcm arg2L
rlcm arg2M
rlcm arg2H
rlcm arg2msb
rlcm mem3
rlcm mem2
rlcm mem1
rlcm mem0
rlcm arg0L
rlcm arg0H
b0mov a, arg0L
sub a, arg1L
b0mov arg0L,a
b0mov a, arg0H
sbc a, arg1H
b0mov arg0H, a
b0bts0 FC
jmp div16m_30 ; no borrow
mov a, arg1L
add arg0L, a
mov a, arg1H
adc arg0H, a
jmp div16m_10
div16m_30:
b0bset arg2L.0 ; borrow occur
jmp div16m_10
div16m_90:
endm
div24m macro mem0, mem1, mem2, mem3, mem4, mem5, mem6
LOCAL div24m_10
LOCAL div24m_20
LOCAL div24m_30
LOCAL div24m_90
clr arg2msb
clr arg2H
clr arg2M
clr arg2L
clr arg0msb
clr arg0H
clr arg0M
clr arg0L
clr tmp
mov a, #0x21
b0mov m_loop, a
b0mov a, mem4
b0mov arg1H , a
b0mov a, mem5
b0mov arg1M , a
b0mov a, mem6
b0mov arg1L , a
div24m_10:
decms m_loop
jmp div24m_20
jmp div24m_90
div24m_20:
b0bclr FC
rlcm arg2L
rlcm arg2M
rlcm arg2H
rlcm arg2msb
rlcm mem3
rlcm mem2
rlcm mem1
rlcm mem0
rlcm arg0L
rlcm arg0M
rlcm arg0H
rlcm arg0msb
b0mov a, arg0L
sub a, arg1L
b0mov arg0L,a
b0mov a, arg0M
sbc a, arg1M
b0mov arg0M, a
b0mov a, arg0H
sbc a, arg1H
b0mov arg0H, a
b0mov a, arg0msb
sbc a, tmp
b0mov arg0msb, a
b0bts0 FC
jmp div24m_30 ; no borrow
mov a, arg1L
add arg0L, a
mov a, arg1M
adc arg0M, a
mov a, arg1H
adc arg0H, a
mov a, #0x00
adc arg0msb, a
jmp div24m_10
div24m_30:
b0bset arg2L.0 ; borrow occur
jmp div24m_10
div24m_90:
endm
atoh_m16 macro ar0, ar1
mov a, #0x09
b0bts0 ar0.6
add ar0, a
b0bts0 ar1.6
add ar1, a
mov a, #0x0f
and ar0, a
and ar1, a
swap ar0
or a, ar1
endm
_htoa_ macro v1, v2
LOCAL HTOA_1, HTOA_2
b0mov X, #ASCII_NUM$H
b0mov Y, #ASCII_NUM$M
b0mov Z, #ASCII_NUM$L
rrc v1
and a, #0x07
add Z, a
bts0 v1.0
jmp HTOA_1
movc
b0mov v2, a
jmp HTOA_2
HTOA_1:
movc
b0mov a, R
b0mov v2, a
HTOA_2:
endm
htoa_m08 macro ar0, ar1
b0mov ar0, a
_htoa_ ar0, ar1
swapm ar0
_htoa_ ar0, ar0
endm
dtoh_m24 macro ar0, ar1, ar2, ar3
clr arg0H
clr arg0L
clr arg1H
swap ar0
and a, #0x0F
call mpy10
mov a, ar0
and a, #0x0F
call mpy10
swap ar1
and a, #0x0F
call mpy10
mov a, ar1
and a, #0x0F
call mpy10
swap ar2
and a, #0x0F
call mpy10
mov a, ar2
and a, #0x0F
call mpy10
swap ar3
and a, #0x0F
call mpy10
mov a, ar3
and a, #0x0F
call Add_Carry
endm
htod_m24 macro ar0, ar1, ar2
clr arg0H
clr arg0L
clr arg1H
clr arg1L
htod_10KK:
mov a, #0x98 ; 10KK
b0mov arg2H, a
mov a, #0x96
b0mov arg2M, a
mov a, #0x80
b0mov arg2L, a
htod_10KK_10:
mov a, ar2
sub a, arg2L
b0mov ar2, a
mov a, ar1
sbc a, arg2M
b0mov ar1, a
mov a, ar0
sbc a, arg2H
b0mov ar0, a
b0bts1 FC
jmp htod_10KK_90
mov a, #0x10
add arg0H, a
jmp htod_10KK_10
htod_10KK_90:
b0mov a, arg2L
add ar2, a
b0mov a, arg2M
adc ar1, a
b0mov a, arg2H
adc ar0, a
htod_1KK:
mov a, #0x0f ; 1KK
b0mov arg2H, a
mov a, #0x42
b0mov arg2M, a
mov a, #0x40
b0mov arg2L, a
htod_1KK_10:
mov a, ar2
sub a, arg2L
b0mov ar2, a
mov a, ar1
sbc a, arg2M
b0mov ar1, a
mov a, ar0
sbc a, arg2H
b0mov ar0, a
b0bts1 FC
jmp htod_1KK_90
mov a, #0x01
add arg0H, a
jmp htod_1KK_10
htod_1KK_90:
b0mov a, arg2L
add ar2, a
b0mov a, arg2M
adc ar1, a
b0mov a, arg2H
adc ar0, a
htod_100K:
mov a, #0x01 ; 100K
b0mov arg2H, a
mov a, #0x86
b0mov arg2M, a
mov a, #0xa0
b0mov arg2L, a
htod_100K_10:
mov a, ar2
sub a, arg2L
b0mov ar2, a
mov a, ar1
sbc a, arg2M
b0mov ar1, a
mov a, ar0
sbc a, arg2H
b0mov ar0, a
b0bts1 FC
jmp htod_100K_90
mov a, #0x10
add arg0L, a
jmp htod_100K_10
htod_100K_90:
b0mov a, arg2L
add ar2, a
b0mov a, arg2M
adc ar1, a
b0mov a, arg2H
adc ar0, a
htod_10K:
mov a, #0x00 ; 10K
b0mov arg2H, a
mov a, #0x27
b0mov arg2M, a
mov a, #0x10
b0mov arg2L, a
htod_10K_10:
mov a, ar2
sub a, arg2L
b0mov ar2, a
mov a, ar1
sbc a, arg2M
b0mov ar1, a
mov a, ar0
sbc a, arg2H
b0mov ar0, a
b0bts1 FC
jmp htod_10K_90
mov a, #0x01
add arg0L, a
jmp htod_10K_10
htod_10K_90:
b0mov a, arg2L
add ar2, a
b0mov a, arg2M
adc ar1, a
b0mov a, arg2H
adc ar0, a
htod_1K:
mov a, #0x03
b0mov arg2M, a
mov a, #0xe8
b0mov arg2L, a
htod_1K_10:
mov a, ar2
sub a, arg2L
b0mov ar2, a
mov a, ar1
sbc a, arg2M
b0mov ar1, a
b0bts1 FC
jmp htod_1K_90
mov a, #0x10
add arg1H, a
jmp htod_1K_10
htod_1K_90:
b0mov a, arg2L
add ar2, a
b0mov a, arg2M
adc ar1, a
htod_100:
mov a, #0x00
b0mov arg2M, a
mov a, #0x64
b0mov arg2L, a
htod_100_10:
mov a, ar2
sub a, arg2L
b0mov ar2, a
mov a, ar1
sbc a, arg2M
b0mov ar1, a
b0bts1 FC
jmp htod_100_90
mov a, #0x01
add arg1H, a
jmp htod_100_10
htod_100_90:
b0mov a, arg2L
add ar2, a
b0mov a, arg2M
adc ar1, a
htod_10:
mov a, #0x0a
b0mov arg2L, a
htod_10_10:
mov a, ar2
sub a, arg2L
b0mov ar2, a
b0bts1 FC
jmp htod_10_90
mov a, #0x10
add arg1L, a
jmp htod_10_10
htod_10_90:
b0mov a, arg2L
add ar2, a
mov a, ar2
add arg1L, a
endm
Add_Carry:
add arg1H, a
mov a, #0x00
adc arg0L, a
adc arg0H, a
ret
GorL24 macro mem0, mem1, mem2, ar0, ar1, ar2
mov a, #ar0
b0mov arg1H, a
mov a, #ar1
b0mov arg1M, a
mov a, #ar2
b0mov arg1L, a
b0mov a, mem2
sub a, arg1L
b0mov a, mem1
sbc a, arg1M
b0mov a, mem0
sbc a, arg1H
endm
incmem24 macro mem0, mem1, mem2
mov a, #0x01
add mem2, a
mov a, #0x00
adc mem1, a
adc mem0, a
endm
/*
mpy10:
call Add_Carry
mov a, #0x0a
mul a, arg0H
b0mov arg0H, a
mov a, #0x0a
mul a, arg0L
b0mov arg0L, a
mov a, r
add arg0H, a
mov a, #0x0a
mul a, arg1H
b0mov arg1H, a
mov a, r
add arg0L, a
b0bts0 FC
incms arg0H
nop
ret
*/
UnsignToSign16 macro mem0, mem1
Local UnsignToSign16_90
b0bts1 mem0.7
jmp UnsignToSign16_90
mov a, #0x01
add sign_byte, a
mov a, #0xFF
sub mem1, a
sbc mem0, a
mov a, #0x01
add mem1, a
mov a, #0x00
adc mem0, a
UnsignToSign16_90:
endm
UnsignToSign32 macro mem0, mem1, mem2, mem3
Local UnsignToSign32_90
b0bts1 mem0.7
jmp UnsignToSign32_90
mov a, #0x01
add sign_byte, a
mov a, #0xFF
sub mem3, a
sbc mem2, a
sbc mem1, a
sbc mem0, a
mov a, #0x01
add mem3, a
mov a, #0x00
adc mem2, a
adc mem1, a
adc mem0, a
UnsignToSign32_90:
endm
sadd16m macro mem0, mem1, mem2, mem3
add16m mem0, mem1, mem2, mem3
clr sign_byte
UnsignToSign16 arg0H, arg0L
endm
ssub16m macro mem0, mem1, mem2,mem3
sub16m mem0, mem1, mem2,mem3
clr sign_byte
UnsignToSign16 arg0H, arg0L
endm
smul16m macro mem0, mem1, mem2, mem3
clr sign_byte
UnsignToSign16 mem0, mem1
UnsignToSign16 mem2, mem3
mul16m mem0, mem1, mem2, mem3
endm
sdiv16m macro mem0, mem1, mem2, mem3, mem4, mem5
clr sign_byte
UnsignToSign32 mem0, mem1, mem2, mem3
UnsignToSign16 mem4, mem5
div16m mem0, mem1, mem2, mem3, mem4, mem5
endm
GorL8 macro mem0, ar0
mov a, #ar0
b0mov arg1H, a
b0mov a, mem0
sub a, arg1H
endm
GorL16 macro mem0, mem1, ar0, ar1
mov a, #ar0
b0mov arg1H, a
mov a, #ar1
b0mov arg1M, a
b0mov a, mem1
sub a, arg1M
b0mov a, mem0
sbc a, arg1H
endm
GorL16m macro mem0, mem1, mem2, mem3
b0mov a, mem2
b0mov arg1H, a
b0mov a, mem3
b0mov arg1M, a
b0mov a, mem1
sub a, arg1M
b0mov a, mem0
sbc a, arg1H
endm
mul16msw expand mem0, mem1, mem2, mem3
LOCAL mul16msw_10
LOCAL mul16msw_20
clr arg0H
clr arg0L
clr arg1H
clr arg1L
mov a, #0x10
b0mov m_loop, a
mul16msw_10:
b0bclr FC
rlcm arg1L
rlcm arg1H
rlcm arg0L
rlcm arg0H
b0bts1 mem2.7
jmp mul16msw_20
b0mov a, mem1
add arg1L, a
b0mov a, mem0
adc arg1H, a
mov a, #0x00
adc arg0L, a
adc arg0H, a
mul16msw_20:
b0bclr FC
rlcm mem3
rlcm mem2
decms m_loop
jmp mul16msw_10
endm
sqrt16m macro mem0, mem1
LOCAL sqrt16m_10
LOCAL sqrt16m_20
clr arg2H
clr arg2L
mov a, #0x08
b0mov m_loop, a
mov a, #0x80
b0mov tmp, a
sqrt16m_10:
b0mov a, tmp
or arg2L, a
mul16m arg2H, arg2L, arg2H, arg2L
GorL16m mem0, mem1, arg1H, arg1L
b0bts0 FC
jmp sqrt16m_20
b0mov a, tmp
xor arg2L, a
sqrt16m_20:
b0bclr FC
rrcm tmp
decms m_loop
jmp sqrt16m_10
endm
ASCII_NUM:
DB "0123456789abcdef"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -