File tree Expand file tree Collapse file tree 6 files changed +431
-26
lines changed Expand file tree Collapse file tree 6 files changed +431
-26
lines changed Original file line number Diff line number Diff line change 1+ assume adl=1
2+
3+ section .text
4+
5+ public _atoi
6+
7+ _atoi:
8+ pop de
9+ ex (sp), hl
10+ push de
11+ ; inlined isspace
12+ .whitespace_loop:
13+ ld a, (hl)
14+ inc hl
15+ cp a, 32
16+ jr z, .whitespace_loop
17+ sub a, 9
18+ add a, -5
19+ jr nc, .whitespace_loop
20+
21+ ; A = (HL - 1) - 9 + -5
22+ ; A = (HL - 1) - 14
23+ sub a, '-' - 14
24+ push af
25+ jr z, .minus_sign
26+ ; A = (HL - 1) - 14 - ('-' - 14)
27+ ; A = (HL - 1) - '-'
28+ xor a, '+' - '-'
29+ jr z, .plus_sign
30+ dec hl
31+ .plus_sign:
32+ .minus_sign:
33+ ; carry is clear
34+ ex de, hl
35+ sbc hl, hl
36+ ; DE = start of the digits
37+ ; HL = 0
38+ jr .start
39+ .loop:
40+ ; 21F + 4R + 3W + 1 per digit
41+ push hl
42+ pop bc
43+ add hl, hl ; *= 2
44+ add hl, hl ; *= 4
45+ add hl, bc ; *= 5
46+ add hl, hl ; *= 10
47+ ld bc, 0
48+ ld c, a
49+ add hl, bc
50+ inc de ; next digit
51+ .start:
52+ ld a, (de)
53+ sub a, 48
54+ cp a, 10
55+ jr c, .loop
56+ .finish:
57+ pop af
58+ ret nz ; A != '-' positive
59+ ; A == '-' negative
60+ jp __ineg
61+
62+ extern __ineg
Original file line number Diff line number Diff line change 11 assume adl=1
22
33 section .text
4- public _atoi, _atol
5- _atoi:
4+
5+ public _atol
6+
67_atol:
7- pop bc
8- ex (sp),hl
9- push bc
10- ld bc,10
11- push bc
12- ld c,b
13- push bc
8+ pop de
9+ ex (sp), hl
10+ push de
11+ ; inlined isspace
12+ .whitespace_loop:
13+ ld a, (hl)
14+ inc hl
15+ cp a, 32
16+ jr z, .whitespace_loop
17+ sub a, 9
18+ add a, -5
19+ jr nc, .whitespace_loop
20+
21+ ; A = (HL - 1) - 9 + -5
22+ ; A = (HL - 1) - 14
23+ sub a, '-' - 14
24+ push af
25+ jr z, .minus_sign
26+ ; A = (HL - 1) - 14 - ('-' - 14)
27+ ; A = (HL - 1) - '-'
28+ xor a, '+' - '-'
29+ jr z, .plus_sign
30+ dec hl
31+ .plus_sign:
32+ .minus_sign:
33+ ; carry is clear
1434 push hl
15- call _strtol
16- pop af
17- pop af
35+ pop iy
36+ sbc hl, hl
37+ ld e, l
38+ ; IY = start of the digits
39+ ; E:UHL = 0
40+ jr .start
41+ .loop:
42+ ; 32F + 4R + 3W + 1 per digit
43+ ld d, a
44+ ld a, e
45+ push hl
46+ pop bc
47+ ; *= 2
48+ add hl, hl
49+ rla
50+ ; *= 4
51+ add hl, hl
52+ rla
53+ ; *= 5
54+ add hl, bc
55+ adc a, e
56+ ; *= 10
57+ add hl, hl
58+ rla
59+ ; += digit
60+ ld bc, 0
61+ ld c, d
62+ add hl, bc
63+ adc a, b
64+ ld e, a
65+ ; next digit
66+ inc iy
67+ .start:
68+ ld a, (iy)
69+ sub a, 48
70+ cp a, 10
71+ jr c, .loop
72+ .finish:
1873 pop af
19- ret
74+ ret nz ; A != '-' positive
75+ ; A == '-' negative
76+ jp __lneg
2077
21- extern _strtol
78+ extern __lneg
Original file line number Diff line number Diff line change 11 assume adl=1
22
33 section .text
4+
45 public _atoll
6+
57_atoll:
6- pop bc
7- ex (sp),hl
8- push bc
9- ld bc,10
10- push bc
11- ld c,b
12- push bc
8+ push ix
9+ ld ix, -3
10+ add ix, sp
11+ ld hl, (ix + 9)
12+ ; inlined isspace
13+ .whitespace_loop:
14+ ld a, (hl)
15+ inc hl
16+ cp a, 32
17+ jr z, .whitespace_loop
18+ sub a, 9
19+ add a, -5
20+ jr nc, .whitespace_loop
21+
22+ ; A = (HL - 1) - 9 + -5
23+ ; A = (HL - 1) - 14
24+ sub a, '-' - 14
25+ push af
26+ jr z, .minus_sign
27+ ; A = (HL - 1) - 14 - ('-' - 14)
28+ ; A = (HL - 1) - '-'
29+ xor a, '+' - '-'
30+ jr z, .plus_sign
31+ dec hl
32+ .plus_sign:
33+ .minus_sign:
34+ ; carry is clear
1335 push hl
14- call _strtoll
15- pop af
16- pop af
36+ pop iy
37+ sbc hl, hl
38+ ex de, hl
39+ sbc hl, hl
40+ ld b, l
41+ ld c, l
42+ push hl
43+ push hl
44+ push hl
45+ ; IY = start of the digits
46+ ; BC:UDE:UHL = 0
47+ ; (ix - 9) = [0, 10]
48+ jr .start
49+ .loop:
50+ ; loop : 27F + 1R + 8W + 1
51+ ; lladd : ?
52+ ; llmulu: ?
53+ ; total : a lot per digit
54+ ld (ix - 9), 10
55+ call __llmulu ; BC:UDE:UHL *= 10
56+ ld (ix - 9), a
57+ call __lladd
58+ inc iy ; next digit
59+ .start:
60+ ld a, (iy)
61+ sub a, 48
62+ cp a, 10
63+ jr c, .loop
64+ .finish:
65+ ld sp, ix
1766 pop af
18- ret
67+ pop ix
68+ ret nz ; A != '-' positive
69+ ; A == '-' negative
70+ jp __llneg
1971
20- extern _strtoll
72+ extern __llneg
73+ extern __lladd
74+ extern __llmulu
Original file line number Diff line number Diff line change 1+ {
2+ "transfer_files" : [
3+ " bin/DEMO.8xp"
4+ ],
5+ "target" : {
6+ "name" : " DEMO" ,
7+ "isASM" : true
8+ },
9+ "sequence" : [
10+ " action|launch" ,
11+ " delay|1000" ,
12+ " hashWait|1" ,
13+ " key|enter" ,
14+ " delay|300" ,
15+ " hashWait|2"
16+ ],
17+ "hashes" : {
18+ "1" : {
19+ "description" : " All tests passed" ,
20+ "timeout" : 5000 ,
21+ "start" : " vram_start" ,
22+ "size" : " vram_16_size" ,
23+ "expected_CRCs" : [
24+ " 38E2AD5A"
25+ ]
26+ },
27+ "2" : {
28+ "description" : " Exit" ,
29+ "start" : " vram_start" ,
30+ "size" : " vram_16_size" ,
31+ "expected_CRCs" : [
32+ " FFAF89BA" ,
33+ " 101734A5" ,
34+ " 9DA19F44" ,
35+ " A32840C8" ,
36+ " 349F4775"
37+ ]
38+ }
39+ }
40+ }
Original file line number Diff line number Diff line change 1+ # ----------------------------
2+ # Makefile Options
3+ # ----------------------------
4+
5+ NAME = DEMO
6+ ICON = icon.png
7+ DESCRIPTION = "CE C Toolchain Demo"
8+ COMPRESSED = NO
9+ ARCHIVED = NO
10+
11+ CFLAGS = -ffreestanding -Wall -Wextra -Wshadow -Wconversion -Wformat=2 -Wno-sign-conversion -Oz
12+ CXXFLAGS = -ffreestanding -Wall -Wextra -Wshadow -Wconversion -Wformat=2 -Wno-sign-conversion -Oz
13+
14+ PREFER_OS_LIBC = NO
15+ PREFER_OS_CRT = NO
16+
17+ # ----------------------------
18+
19+ include $(shell cedev-config --makefile)
You can’t perform that action at this time.
0 commit comments