ESPKit/sources/DSS/util.asm
2024-08-02 15:58:08 +03:00

303 lines
5.2 KiB
NASM

; ======================================================
; Utility code for Sprinter-WiFi utilities
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; License: BSD 3-Clause
; ======================================================
IFNDEF _UTIL_ASM
DEFINE _UTIL_ASM
MODULE UTIL
; ------------------------------------------------------
; Small delay
; Inp: HL - number of cycles, if HL=0, then 2000
; ------------------------------------------------------
DELAY
PUSH AF,BC,HL
LD A,H
OR L
JR NZ,DELAY_NXT
LD HL,20
DELAY_NXT
CALL DELAY_1MS_INT
DEC HL
LD A,H
OR L
JP NZ,DELAY_NXT
POP HL,BC,AF
RET
DELAY_1MS_INT
LD BC,400
SBD_NXT
DEC BC
LD A, B
OR C
JR NZ, SBD_NXT
RET
; ------------------------------------------------------
; Delay for about 1ms
; ------------------------------------------------------
DELAY_1MS
PUSH BC
CALL DELAY_1MS_INT
POP BC
RET
; ------------------------------------------------------
; Delay for about 100us
; ------------------------------------------------------
DELAY_100uS
PUSH BC
LD BC,40
CALL SBD_NXT
POP BC
RET
; ------------------------------------------------------
; Calc length of zero ended string
; Inp: HL - pointer to string
; Out: BC - length of string
; ------------------------------------------------------
IFUSED STRLEN
STRLEN
PUSH DE,HL,HL
LD BC,MAX_BUFF_SIZE
XOR A
CPIR
POP DE
SUB HL,DE ; llength of zero ended string
LD BC,HL
LD A, B
OR C
JR Z, STRL_NCOR
DEC BC
STRL_NCOR
POP HL,DE
RET
ENDIF
; ------------------------------------------------------
; Compare zero-ended strings
; Inp: HL, DE - pointers to strings to compare
; Out: CF=0 - equal, CF=1 - not equal
; ------------------------------------------------------
IFUSED STRCMP
STRCMP
PUSH DE,HL
STC_NEXT
LD A, (DE)
CP (HL)
JR NZ, STC_NE
AND A
JR Z, STC_EQ
INC DE
INC HL
JR STC_NEXT
STC_NE
SCF
STC_EQ
POP HL,DE
RET
ENDIF
; ------------------------------------------------------
; Compare first BC chars for two zero-ended strings
; Inp: HL, DE - pointers to strings to compare
; BC - Number of chars to compare
; Out: ZF=0 - not equal, ZF=1 - equal
; ------------------------------------------------------
IFUSED STRNCMP
STRNCMP
PUSH HL,DE,BC
.STRN_NXT
LD A,(DE)
SUB (HL)
JR NZ,.STRN_NE
LD A,(DE)
OR A
JR Z,.STRN_NE
INC DE
INC HL
DEC BC
LD A,B
OR C
JP NZ,.STRN_NXT
.STRN_NE
POP BC,DE,HL
RET
ENDIF
; ------------------------------------------------------
; Checks whether a string (HL) starts with the strinf (DE)
; Inp: DE - points to start string
; HL - points to string
; Out: ZF=0 - not equal, ZF=1 - equal
; ------------------------------------------------------
IFUSED STARTSWITH
STARTSWITH
PUSH HL,DE
.STRW_NXT
LD A,(DE)
OR A
JR Z,.STRW_END
LD A,(DE)
CP (HL)
JR NZ,.STRW_END
INC HL
INC DE
JR .STRW_NXT
.STRW_END
POP DE,HL
RET
ENDIF
; ------------------------------------------------------
; Convert string to number
; Inp: DE - ptr to zero ended string
; Out: HL - Result
; ------------------------------------------------------
IFUSED ATOU
ATOU
PUSH BC
LD HL,0x0000
ATOU_L1
LD A,(DE)
AND A
JR Z, ATOU_LE
SUB 0x30
CP 10
JR NC, ATOU_LE
INC DE
LD B,H
LD C,L
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL
ADD A,L
LD L,A
JR NC,ATOU_L1
INC H
JP ATOU_L1
ATOU_LE
POP BC
RET
ENDIF
; ------------------------------------------------------
; Find char in string
; Inp: HL - ptr to zero endeds string
; A - char to find
; Outp: CF=0, HL points to char if found
; CF=1 - Not found
; ------------------------------------------------------
IFUSED STRCHR
STRCHR
PUSH BC
STCH_NEXT
LD C,A
LD A,(HL)
AND A
JR Z, STCH_N_FOUND
CP C
JR Z, STCH_FOUND
INC HL
JR STCH_NEXT
STCH_N_FOUND
SCF
STCH_FOUND
POP BC
RET
ENDIF
; ------------------------------------------------------
; Convert Byte to hex
; Inp: C
; Out: (DE)
; ------------------------------------------------------
IFUSED HEXB
HEXB
LD A,C
RRA
RRA
RRA
RRA
CALL CONV_NIBLE
LD A,C
CONV_NIBLE
AND 0x0f
ADD A,0x90
DAA
ADC A,0x40
DAA
LD (DE), A
INC DE
RET
ENDIF
; ----------------------------------------------------
; Get full current path
; Inp: HP - pointer to buffer for path
; ----------------------------------------------------
GET_CUR_DIR
PUSH HL
LD C, DSS_CURDISK
RST DSS
CALL DSS_ERROR.CHECK
ADD A, 65
LD (HL),A
INC HL
LD (HL),':'
INC HL
LD C, DSS_CURDIR
RST DSS
CALL DSS_ERROR.CHECK
POP HL
CALL ADD_BACK_SLASH
RET
; ----------------------------------------------------
; Add back slash to path string
; Inp: HL - pointer to zero ended string with path
; Out: HL - point to end
; ----------------------------------------------------
ADD_BACK_SLASH
XOR A
; find end of path
.FIND_EOS
CP (HL)
JR Z,.IS_EOS
INC HL
JR .FIND_EOS
; check last symbol is '\'' and add if not
.IS_EOS
DEC HL
LD A,(HL)
CP "\\"
JR Z,.IS_SEP
INC HL
LD (HL),"\\"
.IS_SEP
; mark new end of string
INC HL
LD (HL),0x0
RET
ENDMODULE
ENDIF