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

📄 util.asm

📁 8051 VARIOUS UTILITY FUNCTIONSUTIL_ADCAD - Add Acc to DPTR, sets CYUTIL_ADCBAD - Add B/A to DPTR, se
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;  Entry Requirements:
;	DPTR Has Value To Decrement
;
;  On Exit:
;	DPTR = DPTR - 1, CY Set Accordingly
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_DPTRDEC	proc
		push	acc			; Save Acc
		clr	c			; Clear For SUBB
		mov	a,dpl			; Move Low Of DPTR To A
		subb	a,#1			; Subtract 1
		mov	dpl,a			; Store Back
		mov	a,dph			; Get High Of DPTR
		subb	a,#0			; Subtract CY If Set
		mov	dph,a			; Move Back
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Arithmetic Shift DPTR 1 Bit To Right
;
;  Entry Requirements:
;	DPTR Has Value To Shift Right
;
;  On Exit:
;
;  Affected:
;
;  Stack:
;	X Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;
UTIL_DPTRASR1	proc
		push	acc			; Save Acc
		mov	a,dph			; Get High Of DPTR
		mov	c,acc.7			; Preserve Sign
		rrc	a			; Shift Left
		mov	dph,a			; Store Back To DPH
		mov	a,dpl			; Get Low Of DPTR
		rrc	a			; Shift Left
		mov	dpl,a			; Store Back To DPL
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Shift DPTR 1 Bit To Right
;
;  Entry Requirements:
;	DPTR Has Value To Shift Right
;
;  On Exit:
;	DPTR = DPTR >> 1
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	1 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_DPTRSHR1	proc
		push	acc			; Save Acc
		clr	c			; Clear For Shift
		mov	a,dph			; Get High Of DPTR
		rrc	a			; Shift Left
		mov	dph,a			; Store Back To DPH
		mov	a,dpl			; Get Low Of DPTR
		rrc	a			; Shift Left
		mov	dpl,a			; Store Back To DPL
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;*******************************************************************************
;
;  Description:
;	Rotate DPTR 4 Bits To Left, Bit 15 Moves To Bit 0
;
;  Entry Requirements:
;	DPTR Has Value To Rotate Left
;
;  On Exit:
;	DPTR = ((DPTR & 0xf000) >> 12) | (DPTR << 4)
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_DPTRROL4	proc
		push	acc			; Save Acc
		push	0			; Save R0
		mov	r0,#4			; Number Times To Shift
l?p1		mov	a,dph			; Get High Byte
		mov	c,acc.7			; Get High Order Bit
		mov	a,dpl			; Get Low Of DPTR
		rlc	a			; Shift Left
		mov	dpl,a			; Store Back To DPL
		mov	a,dph			; Get High Of DPTR
		rlc	a			; Shift Left
		mov	dph,a			; Store Back To DPH
		djnz	r0,l?p1			; Repeat For R0 Bytes
		pop	0			; Recover R0
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Shift DPTR 4 Bits To Left, Shift 0 Into Low Bits
;
;  Entry Requirements:
;	DPTR Has Value To Shift Left
;
;  On Exit:
;	DPTR = DPTR << 4
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_DPTRSHL4	proc
		push	acc			; Save Acc
		push	0			; Save R0
		mov	r0,#4			; Number Times To Shift
l?p1		clr	c			; Clear For Shift
		mov	a,dpl			; Get Low Of DPTR
		rlc	a			; Shift Left
		mov	dpl,a			; Store Back To DPL
		mov	a,dph			; Get High Of DPTR
		rlc	a			; Shift Left
		mov	dph,a			; Store Back To DPH
		djnz	r0,l?p1 		; Repeat For R0 Bytes
		pop	0			; Recover R0
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Shifts The 5 Byte Bank 0 Registers Group R3..R7 4 Bits Left.  It Is 
;	Not Affected By The Register Bank In Use.
;
;  Entry Requirements:
;	R3/4/5/6/7 Contains The 40 Bits Value To Shift Left 4 Bits
;
;  On Exit:
;	R4/5/6/7 = R3/4/5/6/7 << 4
;
;  Affected:
;	PSW.CY, R3, R4, R5, R6, R7
;
;  Stack:
;	4 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_R3R7RL4	proc
		push	acc			; Save Acc
		push	0			; Save R0
		push	1			; Save R1
		mov	r0,#4			; Number Times To Shift
l?p1		mov	a,#7			; Starting Register
		mov	c,rs0			; Low Of Register Select
		mov	acc.3,c			; Low Of Pointer
		mov	c,rs1			; High Of Register Select
		mov	acc.4,c			; High Of Pointer
		mov	r1,a			; Move To R1
		push	0			; Save R0
		mov	r0,#5			; Number Bytes To Shift
		clr	c			; Clear For Shift
l?p2		mov	a,@r1			; Get Low Of DPTR
		rlc	a			; Shift Left
		mov	@r1,a			; Store Back To DPL
		dec	r1			; Back One Register
		djnz	r0,l?p2 		; Repeat For R0 Bytes
		pop	0			; Recover Total Shift Count
		djnz	r0,l?p1 		; Repeat R0 Times
		pop	1			; Recover R1
		pop	0			; Recover R0
		pop	acc			; Recover Acc
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Multiply DPTR By 10.  Return CY == 1 If Overflow
;
;  Entry Requirements:
;	DPTR Has Value To Multiply By 10
;
;  On Exit:
;	DPTR = DPTR * 10
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	3 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_DPTRX10	proc
		push	b			; Save B
		push	acc			; Save Acc
		mov	a,dpl			; Get Low Of Value
		mov	b,#10			; Multiplier
		mul	ab			; BA = DPL * 10
		mov	dpl,a			; Move Low Back To DPL
		push	b			; Save High Side
		mov	a,dph			; Get High Of Value
		mov	b,#10			; Multiplier
		mul	ab			; BA = DPH * 10
		pop	b			; Recover B
		add	a,b			; Add To Low
		mov	dph,a			; Move Back To DPH
		pop	acc			; Recover Acc
		pop	b			; Recover B
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Multiple DPTR By 100.  Return CY == 1 If Overflow
;
;  Entry Requirements:
;	DPTR Has Value To Multiply By 100
;
;  On Exit:
;	DPTR = DPTR * 100
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	If DPTR Overflows On The First Multiply, The Second Call Will Not
;	Reflect The Overflow.  DPTR Should Be Checked Before Entry.
;
UTIL_DPTRX100	proc
		call	UTIL_DPTRX10		; Multiply By 10
		call	UTIL_DPTRX10		; Multiply By 100
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Multiple DPTR By 1000.  Return CY == 1 If Overflow
;
;  Entry Requirements:
;	DPTR Has Value To Multiply By 1000
;
;  On Exit:
;	DPTR = DPTR * 1000
;
;  Affected:
;	PSW.CY, DPTR
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	If DPTR Overflows On The First Or Second Multiply, The Third Call 
;	Will Not Reflect The Overflow.  DPTR Should Be Checked Before Entry.
;
UTIL_DPTRX1000	proc
		call	UTIL_DPTRX10		; Multiply By 10
		call	UTIL_DPTRX10		; Multiply By 100
		call	UTIL_DPTRX10		; Multiply By 1000
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Call Function Pointed To By DPTR.  Called Function Returns To 
;	Calling Function.
;
;  Entry Requirements:
;	DPTR Contains Address Of Function To Call
;
;  On Exit:
;	None
;
;  Affected:
;	None
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	This Is Useful For Making The Routines Look Clean, Instead Of Having
;	To Setup The Return Address In Calling Function.  Handy For When
;	Tables Of Address For Functions Are Used (Indexed Operations, Etc)
;
UTIL_CALLFUNC	proc
		push	dpl			; Push Low Of Address
		push	dph			; Push High Of Address
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Convert Character In Acc To Lower Case
;
;  Entry Requirements:
;	Acc Has Character To Convert To Lower Case
;
;  On Exit:
;	Acc Has Lower Case Character, Or Original If Not A..Z Range
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	0 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_TOLOWER	proc
		cjlt	a,#'A',l?p1		; If < 'A', Don't Change
		cjgt	a,#'Z',l?p1		; If > 'Z', Don't Change
		add	a,#'a'-'A'              ; Make Lower Case
l?p1		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Convert Character In Acc To Upper Case
;
;  Entry Requirements:
;	Acc Has Character To Convert To Upper Case
;
;  On Exit:
;	Acc Has Upper Case Character, Or Original If Not A..Z Range
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	X Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_TOUPPER	proc
		cjlt	a,#'a',l?p1		; If < 'a', Don't Change
		cjgt	a,#'z',l?p1		; If > 'z', Don't Change
		clr	c			; Clear For Subtract
		subb	a,#'a'-'A'              ; Make Upper Case
l?p1		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Convert ASCII Value In Acc To Binary.  Checks Value To See That It's
;	Legal Hex.  If Not, Return CY == 1, Else Return Converted Value In 
;	Acc, And CY == 0.
;
;  Entry Requirements:
;	Acc Has Character To Convert From ASCII Hex To Binary
;
;  On Exit:
;	Acc Has Binary Value, Or Original Character If Not Legal ASCII Hex
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_HEXTOBIN	proc
		call	UTIL_VALHXDG		; See If Good Digit
		jc	l?p3			; If Not, Return CY == 1
		subb	a,#'0'                  ; Make 0..16 Range
		cjne	a,#9+1,l?p1		; See If <= 9
l?p1		jc	l?p2			; Return Value, It's In Range
		subb	a,#7			; Make 00ah..00fh Range
l?p2		clr	c			; CY == 0 Means No Error
l?p3		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Convert ASCII Value In Acc To Binary.  Checks Value To See That It's 
;	Legal Decimal.  If Not, Return CY == 1, Else Return Converted Value 
;	In Acc, And CY == 0.
;
;  Entry Requirements:
;	Acc Has Character To Convert From ASCII Decimal To Binary
;
;  On Exit:
;	Acc Has Binary Value, Or Original Character If Not Legal ASCII Decimal
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_DECTOBIN	proc
		call	UTIL_VALDCDG		; See If Good Digit
		jc	l?p1			; If Not, Return CY == 1
		subb	a,#'0'                  ; Make 0..9 Range
		clr	c			; CY == 0 Means No Error
l?p1		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Convert BCD Value In Acc To Hex (i.e. 15h -> 00fh)
;
;  Entry Requirements:
;	Acc Has Value In BCD To Convert
;
;  On Exit:
;	Acc Has Entry Value Converted To Hex
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_BCDTOBIN	proc
		push	b			; Save B
		push	acc			; Save Value
		anl	a,#0f0h			; Keep High Bits
		swap	a			; Get To Low
		mov	b,#10			; 10 Decimal
		mul	ab			; Multiply
		mov	b,a			; Store In B
		pop	acc			; Recover BCD Value
		anl	a,#00fh			; Keep Low Nybble
		add	a,b			; Add In High
		pop	b			; Recover B
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Convert Base 36 Value In Acc To Hex (i.e. 'H' -> 011h)
;
;  Entry Requirements:
;	Acc Has Value In Base 36 (0..9, 'A'..'Z' (Case Significant)).  Values
;	None In Range Will Produce Inpredictable Results.
;
;  On Exit:
;	Acc Contains 0..35
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	2 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	None
;
UTIL_ASC36TOBIN	proc
		cjge	a,#'G',l?p1		; If >= 'G', Special
		call	UTIL_HEXTOBIN		; Convert To Binary
		ret				; Return To Caller
;
l?p1		clr	c			; Clear For SUBB
		subb	a,#'G'-10h		; Make Binary
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Convert Value In Low 4 Bits Of Acc To A Hex Digit
;
;  Entry Requirements:
;	Low 4 Bits Of Acc Have Value To Convert To '0'..'9', 'A'..'Z'
;
;  On Exit:
;	Value Of Low 4 Bits In ASCII
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	0 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	Near Trick From A Z80 Book Circa 1982.  Don't Know Who The Original
;	Author Is.
;
UTIL_BINTOASC	proc
		anl	a,#00fh 		; Keep Only Low Bits
		add	a,#090h 		; Add 144
		da	a			; Decimal Adjust
		addc	a,#040h 		; Add 64
		da	a			; Decimal Adjust
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Convert Value In Acc To Base 36 ASCII Character
;
;  Entry Requirements:
;	Acc Has Value To Convert.  Must Be 0..35 (0..23h)
;
;  On Exit:
;	Base 36 Value In ASCII
;
;  Affected:
;	PSW.CY, PSW.Z, PSW.P, Acc
;
;  Stack:
;	0 Bytes, Not Including Space Used By Called Routines
;
;  Comments:
;	Opposite Of UTIL_ASC36TOBIN
;
UTIL_BINTOASC36	proc
		cjge	a,#10h,l?p1		; If >= 0x10, Special
		add	a,#090h 		; Add 144
		da	a			; Decimal Adjust
		addc	a,#040h 		; Add 64
		da	a			; Decimal Adjust
		ret				; Return To Caller
;
l?p1		add	a,#'G'-10h		; Make 'G'..'Z'
		ret				; Return To Caller
		endproc
;
;****************************************************************************
;
;  Description:
;	Convert Value In Acc From Hex To BCD.  
;
;  Entry Requirements:
;	Acc Has Value In Binary To Convert To BCD
;

⌨️ 快捷键说明

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