⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 math.txt

📁 SONIX单片机常用子程序
💻 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 + -