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

📄 util.asm

📁 8051 VARIOUS UTILITY FUNCTIONSUTIL_ADCAD - Add Acc to DPTR, sets CYUTIL_ADCBAD - Add B/A to DPTR, se
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;
;****************************************************************************
;
;  Purpose:
;	Assorted Utilities
;
;  Date:
;	11/23/96
;
;  Author:
;	John C. Wren
;
;  Modications:
;	02/04/97 - Added Description Fields For Archive
;
;  Processor:
;	Generic 8031
;
;  Assembler:
;	Avocet AVA51
;
;  Dependencies:
;	None
;
;  Files:
;	MACROS.INC
;
;  Comments:
;	I Use ETX To Terminate Strings, Which Is Usually 0x03.  Most People
;	Prefer To Use 0x00 As A String Terminator.  To Do This, Just Change
;	The Value Of ETX, And Re-assemble.
;
;  Philosophic:
;	Just A Bunch Of Utilties.  Some Are Of Little Value To Most People,
;	Some Are A Major Statement Of The Obvious, Some Look Too Short To
;	Be Worth Posting Alone But Are In The File Anyway.
; 
;****************************************************************************
;
;  Includes
;
;		%include "equates.inc"
		%include "macros.inc"
		seg	code
;
;****************************************************************************
;
;  Publics
;
		public	UTIL_ADCAD
		public	UTIL_ADCBAD
		public	UTIL_SUBBAD
		public	UTIL_SUBBBAD
		public	UTIL_INC16
		public	UTIL_UCOMPARE16
		public	UTIL_UCMPDPTRBA
		public	UTIL_SHIFT4L
		public	UTIL_LDDPTRC
		public	UTIL_LDDPTRD
		public	UTIL_STDPTRD
		public	UTIL_DPTRR01
		public	UTIL_DPTRR67
		public	UTIL_DPTR2C
		public	UTIL_DPTRDEC
		public	UTIL_DPTRASR1
		public	UTIL_DPTRSHR1
		public	UTIL_DPTRROL4
		public	UTIL_DPTRSHL4
		public	UTIL_R3R7RL4
		public	UTIL_DPTRX10
		public	UTIL_DPTRX100
		public	UTIL_DPTRX1000
		public	UTIL_CALLFUNC
		public	UTIL_TOLOWER
		public	UTIL_TOUPPER
		public	UTIL_HEXTOBIN
		public	UTIL_DECTOBIN
		public	UTIL_BCDTOBIN
		public	UTIL_ASC36TOBIN
		public	UTIL_BINTOASC
		public	UTIL_BINTOASC36
		public	UTIL_BINTOBCD
		public	UTIL_BINTOBCD12
		public	UTIL_BINTODEC
		public	UTIL_BINTOUDEC
		public	UTIL_VALDCDG
		public	UTIL_VALHXDG
		public	UTIL_VALALPHA
		public	UTIL_VALALPHAZ
		public	UTIL_CNTDG
		public	UTIL_UDIV
		public	UTIL_UMOD
		public	UTIL_DIV
		public	UTIL_MOD
		public	UTIL_COPYXTOI
		public	UTIL_COPYITOX
		public	UTIL_COPYCTODL
		public	UTIL_COPYCTODZ
		public	UTIL_COPYDTODL
		public	UTIL_COPYDTODZ
		public	UTIL_PUT_ETX
		public	UTIL_FIND_ETX
		public	UTIL_TRIM
		public	UTIL_STRLEN
;
;****************************************************************************
;
;  Equates
;
ETX		equ	3			; ASCII ETX Character
SPACE		equ	32			; ASCII Space Character
;
;****************************************************************************
;
;  Description:
;  	Add Acc To DPTR, Setting Carry If DPTR Overflows
;
;  Entry Requirements:
;	DPTR Has Value
;	Acc Has Value To Add
;
;  On Exit:
;	DPTR = DPTR + Acc, CY Set Accordingly
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	Value Of CY On Entry Does Not Affect Result
;
UTIL_ADCAD	proc
		push	acc			; Make Sure Acc Gets Saved
		add	a,dpl			; Add 'A' To DPL
		mov	dpl,a			; Move Result To DPL
		mov	a,dph			; Get DPH
		addc	a,#000h 		; If Carry Set, This Will Increment
		mov	dph,a			; Move Bck To DPH
		pop	acc			; Recover Original 'A'
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Add B/Acc To DPTR, Setting Carry If DPTR Overflows
;
;  Entry Requirements:
;	DPTR Has Value
;	'B' Has High Of Value To Add, Acc Has Low Of Value To Add
;
;  On Exit:
;	DPTR = DPTR + B/Acc, CY Set Accordingly
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	Value Of CY On Entry Does Not Affect Result
;
UTIL_ADCBAD	proc
		push	acc			; Make Sure Acc Gets Saved
		add	a,dpl			; Add 'A' To DPL
		mov	dpl,a			; Move Result To DPL
		mov	a,dph			; Get DPH
		addc	a,b 			; Add 'B' To DPH + CY
		mov	dph,a			; Move Bck To DPH
		pop	acc			; Recover Original 'A'
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Subtract Acc From DPTR, Setting Carry If DPTR Underflows
;
;  Entry Requirements:
;	DPTR Has Value
;	Acc Has Value To Subtract
;
;  On Exit:
;	DPTR = DPTR - Acc, CY Set Accordingly
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	Value Of CY On Entry Does Not Affect Result
;
UTIL_SUBBAD	proc
		push	acc			; Make Sure Acc Gets Saved
		clr	c			; Clear For SUBB
		xch	a,dpl			; Swap
		subb	a,dpl			; Subtract
		mov	dpl,a			; Move Back To DPL
		mov	a,dph			; Get DPH
		subb	a,#000h 		; If Carry Set, This Will Decrement
		mov	dph,a			; Move Back To DPH
		pop	acc			; Recover Original 'A'
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Subtract B/Acc From DPTR, Setting Carry If DPTR Underflows
;
;  Entry Requirements:
;	DPTR Has Value
;	'B' Has High Of Value To Subtract, Acc Has Low Of Value To Subtract
;
;  On Exit:
;	DPTR = DPTR - B/Acc, CY Set Accordingly
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	Value Of CY On Entry Does Not Affect Result
;
UTIL_SUBBBAD	proc
		push	acc			; Make Sure Acc Gets Saved
		clr	c			; Clear For SUBB
		xch	a,dpl			; Swap
		subb	a,dpl			; Subtract
		mov	dpl,a			; Move Back To DPL
		mov	a,dph			; Get DPH
		subb	a,b	 		; Subtract + CY
		mov	dph,a			; Move Back To DPH
		pop	acc			; Recover Original 'A'
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	R0 Points To A 16 Bit Location To Increment.  CY == 1 If Overflow.
;
;  Entry Requirements:
;	R0 Pointing To A 16 Bit Location In Internal RAM
;
;  On Exit:
;	CY Set Accordingly
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	0 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	Might Be A Good Idea To Save The Accumulator
;
UTIL_INC16	proc
		inc	r0			; Point To Low Byte
		mov	a,@r0			; Get Low Byte
		add	a,#1			; Add 1
		mov	@r0,a			; Store Back
		dec	r0			; Point To High Byte
		mov	a,@r0			; Get High Byte
		addc	a,#0			; Add CY, If Set
		mov	@r0,a			; Store Back
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	R0 Points To A 16 Bit Location To Compare To DPTR.  Return CY == 1
;	If DPTR > @R0, Else CY == 0 If DPTR  <= @R0.  The Operation Is 
;	@R0 - DPTR.
;
;  Entry Requirements:
;	DPTR With Value To Be Compared Against
;	R0 Pointing To 16 Bit Location In Internal RAM To Compare
;
;  On Exit:
;	CY Set Accordingly
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	0 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	Might Be A Good Idea To Save The Accumulator
;
UTIL_UCOMPARE16	proc
		clr	c			; Clear For Subtract
		inc	r0			; Point To Low Byte
		mov	a,@r0			; Get Low Byte
		subb	a,dpl			; Subtract DPL
		dec	r0			; Point To High Byte
		mov	a,@r0			; Get High Byte
		subb	a,dph			; Subtract DPH
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Compare DPTR To AB.  Return CY == 1 If DPTR > BA, Else CY == 0 If 
;	DPTR <= BA.  The Operation Is BA - DPTR.
;
;  Entry Requirements:
;	B/Acc With Value To Be Compared Against
;	DPTR Containing Value To Compare
;
;  On Exit:
;	CY Set Accordingly
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	0 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	Might Be A Good Idea To Save The Accumulator
;
UTIL_UCMPDPTRBA	proc
		clr	c			; Clear For Subtract
		subb	a,dpl			; Subtract DPL
		mov	a,b			; Get High Byte
		subb	a,dph			; Subtract DPH
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	R0 Points To A 16 Bit Location To Shift 4 Bits Left.  Acc Contains 
;	The Value To OR In The Low 4 Bits.
;
;
;  Entry Requirements:
;	R0 Pointing To A 16 Bit Location In Internal RAM
;	Acc With Low 4 Bits To OR In (Top 4 Bits Don't Matter)
;
;  On Exit:
;	Acc Contains Value Of Low 8 Bits Of 16 Bit Value
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_SHIFT4L	proc
		push	acc			; Save Acc
		mov	a,@r0			; Get High Byte
		anl	a,#00fh 		; Keep Only Bits 8..11
		swap	a			; Move Bits 8..11 To 12..15
		mov	@r0,a			; Store Back
		inc	r0			; Point To Low Byte
		mov	a,@r0			; Get Low Byte
		swap	a			; Swap Bits 0..3 And 4..7
		mov	@r0,a			; Store Back
		anl	a,#00fh 		; Keep Only Bits 4..7
		dec	r0			; Points To High Byte
		orl	a,@r0			; OR In Bits 4..7 With 8.11
		mov	@r0,a			; Store Back
		inc	r0			; Point To Low Byte
		mov	a,@r0			; Get Low Byte
		anl	a,#0f0h 		; Clear Bits 4..7
		mov	@r0,a			; Store Back
		pop	acc			; Recover Value To OR In
		orl	a,@r0			; Update Bits 0..3
		mov	@r0,a			; Store Back
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Load DPTR From DPTR In Code Space
;
;  Entry Requirements:
;	DPTR Points To 16 Bit Value In Code Space To Load
;
;  On Exit:
;	DPTR = (DPTR)
;
;  Affected:
;	DPTR
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_LDDPTRC	proc
		push	acc			; Save Acc
		clr	a			; Clear For MOVC
		movc	a,@a+dptr		; Get High Byte
		push	acc			; Save It
		mov	a,#1			; Set For MOVC
		movc	a,@a+dptr		; Get Low Byte
		mov	dpl,a			; Move To DPL
		pop	dph			; Recover High To DPH
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Load DPTR From DPTR In External Memory Space
;
;  Entry Requirements:
;	DPTR Points To 16 Bit Value In External Memory Space To Load
;
;  On Exit:
;	DPTR = (DPTR)
;
;  Affected:
;	DPTR
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
; 	None
;
UTIL_LDDPTRD	proc
		push	acc			; Save Acc
		movx	a,@dptr			; Get High Byte
		push	acc			; Save It
		inc	dptr			; Point To Low Byte
		movx	a,@dptr			; Get Low Byte
		mov	dpl,a			; Move To DPL
		pop	dph			; Recover High To DPH
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Store R6/7 To DPTR In External Memory Space.  Return DPTR Pointing To
;	Next Location.
;
;  Entry Requirements:
;	DPTR Contains Location To Store R6/7
;	R6/7 Contains Value To Be Stored
;
;  On Exit:
;	(DPTR) = R6, (DPTR + 1) = R7
;
;  Affected:
;	None
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	I Often Use R6/7 As A Register Pair That Serves As A Second DPTR,
;	So This Is Used To Store R6/7 When Building Lists, Etc.
;
UTIL_STDPTRD	proc
		push	acc			; Save Acc
		mov	a,r6			; Get R6
		movx	@dptr,a			; Store High Byte
		inc	dptr			; Point To Low Byte
		mov	a,r7			; Get R7
		movx	@dptr,a			; Store Low Byte
		inc	dptr			; Point To Next Location
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Exchange R0/1 And DPTR
;
;  Entry Requirements:
;	DPTR Has 1st Value
;	R0/1 Has 2nd Value
;
;  On Exit:
;	DPTR <-> R0/1
;
;  Affected:
;	DPTR, R0, R1
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_DPTRR01	proc
		push	acc			; Save Acc
		mov	a,dpl			; Get DPL
		mov	dpl,r1			; Move R1 To DPL
		mov	r1,a			; Move DPL To R1
		mov	a,dph			; Get DPL
		mov	dph,r0			; Move R0 To DPH
		mov	r0,a			; Move DPH To R0
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Exchange R6/7 And DPTR
;
;  Entry Requirements:
;	DPTR Has 1st Value
;	R6/7 Has 2nd Value
;
;  On Exit:
;	DPTR <-> R6/7
;
;  Affected:
;	DPTR, R6, R7
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_DPTRR67	proc
		push	acc			; Save Acc
		mov	a,dpl			; Get DPL
		mov	dpl,r7			; Move R7 To DPL
		mov	r7,a			; Move DPL To R7
		mov	a,dph			; Get DPL
		mov	dph,r6			; Move R6 To DPH
		mov	r6,a			; Move DPH To R6
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Subtract 'DPTR' From 0, Setting Carry If DPTR Underflows
;
;  Entry Requirements:
;	DPTR Has Value To Perform 2's Complement On
;
;  On Exit:
;	DPTR = 0 - DPTR
;
;  Affected:
;	PSW.CY
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_DPTR2C	proc
		push	acc			; Make Sure Acc Gets Saved
		clr	c			; Clear For SUBB
		clr	a			; Clear For Subtract
		subb	a,dpl			; Subtract
		mov	dpl,a			; Move Back To DPL
		clr	a			; Clear For Subtract
		subb	a,dph	 		; If Carry Set, This Will Decrement
		mov	dph,a			; Move Back To DPH
		pop	acc			; Recover Original 'A'
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Decrement DPTR.  CY == 1 If Underflow
;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -