mirror of
https://github.com/romychs/Sprinter-FT.git
synced 2025-04-18 01:52:40 +03:00
425 lines
6.9 KiB
NASM
425 lines
6.9 KiB
NASM
; ======================================================
|
|
; Utility code for Sprinter-WiFi utilities
|
|
; By Roman Boykov. Copyright (c) 2024
|
|
; https://github.com/romychs
|
|
; License: BSD 3-Clause
|
|
; ======================================================
|
|
|
|
IFNDEF _UTIL
|
|
DEFINE _UTIL
|
|
|
|
MODULE UTIL
|
|
|
|
MAX_BUFF_SIZE EQU 2048
|
|
|
|
; ------------------------------------------------------
|
|
; 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.DELAY_1MS_INT
|
|
POP BC
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Delay for about 100us
|
|
; ------------------------------------------------------
|
|
DELAY_100uS
|
|
PUSH BC
|
|
LD BC,40
|
|
CALL DELAY.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
|
|
SBC HL, DE ; length 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 strings
|
|
; Inp: HL, DE - pointers to asciiz 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
|
|
|
|
|
|
; ------------------------------------------------------
|
|
; Skip spaces at start of zero ended string
|
|
; Inp: HL - pointer to string;
|
|
; Out: HL - points to first non space symbol
|
|
; ------------------------------------------------------
|
|
;;IFUSED LTRIM
|
|
LTRIM
|
|
LD A, (HL)
|
|
OR A
|
|
RET Z
|
|
CP 0x21
|
|
RET P
|
|
INC HL
|
|
JR LTRIM
|
|
;;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
|
|
|
|
; ------------------------------------------------------
|
|
; Convert 16 bit unsigned number to string
|
|
; Inp: HL - number;
|
|
; DE - ptr to buffer;
|
|
; Out: DE -> asciiz string representing a number
|
|
; ------------------------------------------------------
|
|
;;IFUSED UTOA
|
|
UTOA:
|
|
PUSH BC, HL
|
|
XOR A
|
|
PUSH AF ; END MARKER A=0, Z
|
|
.UTOA_L1
|
|
CALL DIV_10
|
|
ADD '0'
|
|
PUSH AF ; DIGIT: A>0, NZ
|
|
LD A,H
|
|
OR L
|
|
JR NZ,.UTOA_L1
|
|
.UTOA_L2
|
|
POP AF
|
|
LD (DE),A
|
|
INC DE
|
|
JR NZ,.UTOA_L2
|
|
POP HL, BC
|
|
RET
|
|
|
|
; ------------------------------------------------------
|
|
; Division by 10
|
|
; Inp: HL - number;
|
|
; Out: HL - quotient;
|
|
; A - remainder;
|
|
; ------------------------------------------------------
|
|
DIV_10:
|
|
PUSH BC
|
|
LD BC,0x0D0A
|
|
XOR A
|
|
ADD HL,HL
|
|
RLA
|
|
ADD HL,HL
|
|
RLA
|
|
ADD HL,HL
|
|
RLA
|
|
.DDL1
|
|
ADD HL,HL
|
|
RLA
|
|
CP C
|
|
JR C,.DDL2
|
|
SUB C
|
|
INC L
|
|
.DDL2
|
|
DJNZ .DDL1
|
|
POP BC
|
|
RET
|
|
;;ENDIF
|
|
|
|
; ------------------------------------------------------
|
|
; Multiplication by 10
|
|
; Inp: HL - number;
|
|
; Out: BC - result;
|
|
; ------------------------------------------------------
|
|
MUL_10
|
|
ADD HL, HL
|
|
ADD HL, HL
|
|
LD B, H
|
|
LD C, L ; BC = HL*4
|
|
ADD HL, HL
|
|
ADD HL, HL ; HL*16
|
|
ADD HL, BC
|
|
LD B, H
|
|
LD C, L
|
|
RET
|
|
|
|
|
|
; ------------------------------------------------------
|
|
; FAST_UTOA
|
|
; Inp: HL - number;
|
|
; DE - Buffer;
|
|
; CF is set to write leading zeroes;
|
|
; Out: DE - address of destination string
|
|
; ------------------------------------------------------
|
|
;;IFUSED FAST_UTOA
|
|
FAST_UTOA
|
|
LD BC,0+256
|
|
PUSH BC
|
|
LD BC,-10+256
|
|
PUSH BC
|
|
INC H
|
|
DEC H
|
|
JR Z, .EIGHT_BIT
|
|
|
|
LD C,0xFF & (-100+256)
|
|
PUSH BC
|
|
|
|
LD BC,-1000+256
|
|
PUSH BC
|
|
|
|
LD BC,-10000
|
|
|
|
JR C,.LEADING_ZEROES
|
|
|
|
.NO_LEADING_ZEROES
|
|
|
|
CALL .DIVIDE
|
|
CP '0'
|
|
JR NZ,.WRITE
|
|
|
|
POP BC
|
|
DJNZ .NO_LEADING_ZEROES
|
|
|
|
JR .WRITE1S
|
|
|
|
.LEADING_ZEROES
|
|
CALL .DIVIDE
|
|
|
|
.WRITE
|
|
LD (DE),A
|
|
INC DE
|
|
|
|
POP BC
|
|
DJNZ .LEADING_ZEROES
|
|
|
|
.WRITE1S
|
|
LD A,L
|
|
ADD A,'0'
|
|
|
|
LD (DE),A
|
|
INC DE
|
|
RET
|
|
|
|
.DIVIDE
|
|
LD A,'0'-1
|
|
|
|
.DIVLOOP
|
|
INC A
|
|
ADD HL,BC
|
|
JR C, .DIVLOOP
|
|
|
|
SBC HL,BC
|
|
RET
|
|
|
|
.EIGHT_BIT
|
|
LD BC,-100
|
|
JR NC, .NO_LEADING_ZEROES
|
|
|
|
; write two leading zeroes to output string
|
|
LD A,'0'
|
|
LD (DE),A
|
|
INC DE
|
|
LD (DE),A
|
|
INC DE
|
|
|
|
JR .LEADING_ZEROES
|
|
;;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 - byte to convert;
|
|
; DE -> buffer for string;
|
|
; Out: DE -> points after last char
|
|
; ------------------------------------------------------
|
|
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
|
|
|
|
LINE_END
|
|
DB "\r\n",0
|
|
|
|
ENDMODULE
|
|
|
|
ENDIF |