📄 util.asm
字号:
; 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 + -