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 1
1
assume adl=1
2
2
3
3
section .text
4
- public _atoi, _atol
5
- _atoi:
4
+
5
+ public _atol
6
+
6
7
_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
14
34
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:
18
73
pop af
19
- ret
74
+ ret nz ; A != '-' positive
75
+ ; A == '-' negative
76
+ jp __lneg
20
77
21
- extern _strtol
78
+ extern __lneg
Original file line number Diff line number Diff line change 1
1
assume adl=1
2
2
3
3
section .text
4
+
4
5
public _atoll
6
+
5
7
_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
13
35
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
17
66
pop af
18
- ret
67
+ pop ix
68
+ ret nz ; A != '-' positive
69
+ ; A == '-' negative
70
+ jp __llneg
19
71
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