Sprinter-FT/Tester/util.asm
2025-02-19 21:35:46 +03:00

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