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