First commit

This commit is contained in:
2020-09-19 22:16:34 +02:00
commit 2d7bfa6436
13 changed files with 717 additions and 0 deletions

36
lib/___itoa.s Normal file
View File

@@ -0,0 +1,36 @@
#code _CODE
#include "___uitoa.s"
;
;void __itoa(int value, char *string, unsigned char radix);
;
___itoa::
push ix
ld ix, #0
add ix, sp
;
; 4(ix) - value
; 6(ix) - string
; 8(ix) - radix
;
ld e, 4 (ix)
ld d, 5 (ix)
bit 7, d
jp Z, ___uitoa_de
;positive/negative numbers are supported only for radix=10
ld a, 8 (ix)
cp a, #10
jp NZ, ___uitoa_de
;add minus sign to result and inverse value
ld hl, #0
or a, a
sbc hl, de
ex de, hl
ld l, 6 (ix)
ld h, 7 (ix)
ld (hl), #0x2D ;minus symbol
inc hl
ld 6 (ix), l
ld 7 (ix), h
jp ___uitoa_dehl

37
lib/___sdcc_call_hl.s Normal file
View File

@@ -0,0 +1,37 @@
;--------------------------------------------------------------------------
; crtcall.s
;
; Copyright (C) 2011, Maarten Brock
;
; This library is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 2, or (at your option) any
; later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this library; see the file COPYING. If not, write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
;
; As a special exception, if you link this library with other files,
; some of which are compiled with SDCC, to produce an executable,
; this library does not by itself cause the resulting executable to
; be covered by the GNU General Public License. This exception does
; not however invalidate any other reasons why the executable file
; might be covered by the GNU General Public License.
;--------------------------------------------------------------------------
.area _CODE
.globl ___sdcc_call_hl
; The Z80 has the jp (hl) instruction, which is perfect for implementing function pointers.
___sdcc_call_hl:
jp (hl)

30
lib/___strreverse.s Normal file
View File

@@ -0,0 +1,30 @@
#code _CODE
;
;void __reverse(char *beg, char *end);
;
___strreverse::
pop bc
pop de
pop hl
push hl
push de
push bc
;
;in: HL - pointer to end of string (null symbol), DE - pointer to start of string
;
___strreverse_reg::
jr 110$
100$:
add hl, de
ld a, (de)
ld c, (hl)
ld (hl), a
ld a, c
ld (de), a
inc de
110$:
dec hl
or a, a
sbc hl, de
jr NC, 100$
ret

172
lib/___uitoa.s Normal file
View File

@@ -0,0 +1,172 @@
#code _CODE
#include "___uitobcd.s"
#include "___strreverse.s"
;
;void __uitoa(unsigned int value, char *string, unsigned char radix);
;
___uitoa::
push ix
ld ix, #0
add ix, sp
;
; 4(ix) - value
; 6(ix) - string
; 8(ix) - radix
;
ld e, 4 (ix)
ld d, 5 (ix)
;
___uitoa_de:
ld l, 6 (ix)
ld h, 7 (ix)
;
___uitoa_dehl:
ld a, e
or a, d
jr NZ, 100$
;
ld (hl), #0x30
inc hl
jp 190$
100$:
ld a, 8 (ix)
cp a, #10 ;most popular radix
jr NZ, 110$
;
;-------- decimal convertion
; this algorithm up to 2 times faster than generic
;
ld c, l
ld b, h
ld hl, #-4
add hl, sp
ld sp, hl
push bc
push hl
push de
call ___uitobcd
ld hl, #4
add hl, sp
ld sp, hl
pop de ;DE - pointer to string
inc hl
inc hl ;HL - pointer to BCD value
ld b, #3 ;number of bytes in BCD value
ld a, #0x30 ;ASCII code of '0'
103$:
rrd
ld (de), a
inc de
rrd
ld (de), a
inc de
inc hl
djnz 103$
;
; pop af
; pop af
;skip trailing zeroes
ld b, #5 ;real BCD number is at most 5 digits
dec de ;so always skip last zero
105$:
dec de
ld a, (de)
cp a, #0x30
jr NZ, 107$ ;break loop if non-zero found
djnz 105$
107$:
inc de ;always point to symbol next to last significant
ex de, hl
jr 190$
;
;---------------------------
;
110$:
cp a, #2
jr C, 190$ ;radix is less than 2
;
ld c, a
dec c
and a, c
jr NZ, 150$
;
;-------- radix is power of 2
;
; DE - value, HL - pointer to string, C - mask
120$:
ld a, e
ld b, c
125$:
srl d
rr e
srl b
jr NZ, 125$
;
and a, c
add a, #0x30
cp a, #0x3A ;convert to 0...9A...Z
jr C, 130$
add a, #7
130$:
ld (hl), a
inc hl
ld a, e
or a, d
jr NZ, 120$
jr 190$
;
;---------------------------
;
;-------- custom radix (generic algorithm)
;
150$:
ex de, hl
160$:
ld c, 8 (ix)
call ___divu16_8
add a, #0x30
cp a, #0x3A
jr C, 165$
add a, #7
165$:
ld (de), a
inc de
ld a, l
or h
jr NZ, 160$
ex de, hl
; jr 190$
;
;---------------------------
;
;-------- finish string and reverse order
190$:
ld (hl), #0
ld e, 6 (ix)
ld d, 7 (ix)
call ___strreverse_reg
ld sp, ix
pop ix
ret
;
;
;in: HL - divident, C - divisor
;out: HL - quotient, A - remainder
___divu16_8:
xor a, a
ld b, #16
100$:
add hl, hl
rla
jr c, 110$
cp a, c
jr c, 120$
110$:
sub a, c
inc l
120$:
djnz 100$
ret

57
lib/___uitobcd.s Normal file
View File

@@ -0,0 +1,57 @@
#code _CODE
; void __uitobcd (unsigned int v, unsigned char bcd[3])
; __uitobcd converts v to BCD representation to the bcd.
; bcd[] will contain BCD value.
;
___uitobcd:
push ix
ld ix, #0
add ix, sp
;
ld bc, #0x1000
ld d, c
ld e, c
ld l, 4 (ix)
ld h, 5 (ix)
;
;--- begin speed optimization
;
ld a, h
or a, a
jr NZ, 100$
;
ld h, l
srl b
;
;--- end speed optimization
;
; HL - binary value
; CDE - future BCD value
; B - bits count (16)
100$:
add hl, hl
ld a, e
adc a, a
daa
ld e, a
ld a, d
adc a, a
daa
ld d, a
ld a, c
adc a, a
daa
ld c, a
djnz 100$
;
ld l, 6 (ix)
ld h, 7 (ix)
ld (hl), e
inc hl
ld (hl), d
inc hl
ld (hl), c
;
pop ix
ret