File tree Expand file tree Collapse file tree 12 files changed +594
-1
lines changed
test/standalone/wide_char Expand file tree Collapse file tree 12 files changed +594
-1
lines changed Original file line number Diff line number Diff line change @@ -75,7 +75,7 @@ size_t wcslen(const wchar_t *s)
75
75
__attribute__((nonnull (1 )));
76
76
77
77
size_t wcsnlen (const wchar_t * s , size_t maxlen )
78
- __attribute__((nonnull (1 )));
78
+ __NOEXCEPT __attribute__((nonnull (1 ))) __attribute__(( __pure__ ));
79
79
80
80
int wcscmp (const wchar_t * s1 , const wchar_t * s2 )
81
81
__attribute__((nonnull (1 , 2 )));
Original file line number Diff line number Diff line change
1
+ assume adl=1
2
+
3
+ section .text
4
+
5
+ public _wcslen
6
+
7
+ ; size_t wcslen(const wchar_t *str)
8
+ _wcslen:
9
+ pop bc
10
+ ex (sp), hl
11
+ push bc
12
+ ld bc, 1
13
+ xor a, a
14
+ dec hl
15
+ .loop:
16
+ inc hl
17
+ cpi
18
+ jr nz, .loop
19
+ cp a, (hl)
20
+ jr nz, .loop
21
+ sbc hl, hl
22
+ sbc hl, bc
23
+ ret
Original file line number Diff line number Diff line change
1
+ assume adl=1
2
+
3
+ section .text
4
+
5
+ public _wcsnlen
6
+
7
+ ; size_t wcsnlen(const wchar_t *str, size_t maxlen)
8
+ _wcsnlen:
9
+ ld hl, 6
10
+ add hl, sp
11
+ ld bc, (hl)
12
+ dec hl
13
+ dec hl
14
+ dec hl
15
+ ld de, (hl)
16
+ xor a, a
17
+ sbc hl, hl
18
+ adc hl, bc
19
+ ret z
20
+ ex de, hl
21
+ call .loop_start
22
+ ex de, hl
23
+ ; return maxlen unless str[maxlen - 1] == L'\0'
24
+ ret nz ; low byte was non-zero
25
+ ld a, (de)
26
+ cp a, c ; cp a, 0
27
+ ret nz ; high byte was non-zero
28
+ dec hl
29
+ ; ret ; We can use the RET PO below since overflow won't be set
30
+ .loop_lo:
31
+ ret po
32
+ .loop_hi:
33
+ inc hl
34
+ .loop_start:
35
+ cpi
36
+ jr nz, .loop_lo
37
+ ret po
38
+ cp a, (hl)
39
+ jr nz, .loop_hi
40
+ ex de, hl
41
+ pop de ; reset SP
42
+ scf
43
+ sbc hl, bc
44
+ ret
Original file line number Diff line number Diff line change
1
+ assume adl=1
2
+
3
+ section .text
4
+
5
+ public _wmemchr
6
+
7
+ ; wchar_t *wmemchr(const wchar_t *ptr, int ch, size_t count)
8
+ _wmemchr:
9
+ ld iy, 0
10
+ add iy, sp
11
+ ld hl, (iy + 9)
12
+ adc hl, hl ; count *= 2
13
+ ret z ; return NULL
14
+ push hl
15
+ pop bc ; BC = count * 2
16
+ ld hl, (iy + 3)
17
+ ld de, (iy + 6) ; E = lower byte, D = upper byte
18
+ call .loop_start
19
+ .ret_null:
20
+ or a, a
21
+ sbc hl, hl
22
+ ret
23
+
24
+ .loop_start:
25
+ .no_match:
26
+ ld a, e
27
+ .loop:
28
+ cpir
29
+ ret po ; return NULL
30
+ ; repeat until BC is odd
31
+ bit 0, c
32
+ jr z, .loop
33
+ ; lower byte matches, now check the upper byte
34
+ ld a, d
35
+ xor a, (hl)
36
+ jr nz, .no_match
37
+ pop bc ; reset SP
38
+ dec hl
39
+ ret
Original file line number Diff line number Diff line change
1
+ assume adl=1
2
+
3
+ section .text
4
+
5
+ public _wmemcmp
6
+
7
+ ; int wmemcmp(const wchar_t *s1, const wchar_t *s2, size_t n)
8
+ _wmemcmp:
9
+ ld iy, 0
10
+ add iy, sp
11
+ ld bc, (iy + 9)
12
+ sbc hl, hl
13
+ adc hl, bc ; count *= 2
14
+ ret z ; return 0
15
+ ld de, (iy + 3)
16
+ ld hl, (iy + 6)
17
+ .loop:
18
+ ld a, (de)
19
+ xor a, (hl)
20
+ inc hl
21
+ inc de
22
+ ld a, (de)
23
+ jr nz, .low_diff
24
+ cpi
25
+ jr nz, .high_diff
26
+ inc de
27
+ jp pe, .loop
28
+ sbc hl, hl
29
+ ret
30
+
31
+ .high_diff:
32
+ dec hl
33
+ .low_diff:
34
+ ; compare high bytes
35
+ sub a, (hl) ; s1 - s2
36
+ jr nz, .skip_low_check
37
+ ; compare low bytes
38
+ dec de
39
+ ld a, (de)
40
+ dec hl
41
+ sub a, (hl) ; s1 - s2
42
+ .skip_low_check:
43
+ sbc hl, hl
44
+ ; A is non-zero here
45
+ ld l, a
46
+ ret
Original file line number Diff line number Diff line change
1
+ assume adl=1
2
+
3
+ section .text
4
+
5
+ public _wmemcpy
6
+
7
+ ; CC: !count ? 19*r(PC) + 9*r(SPL) + 3*w(SPL) + 1
8
+ ; : 25*r(PC) + 18*r(SPL) + 12*w(SPL) + count*(r(src) + w(dest) + 1)
9
+ ; C: wchar_t *wmemcpy(wchar_t *dest, const wchar_t *src, size_t count) {
10
+ _wmemcpy:
11
+ ; C: size_t count2 = count * sizeof(wchar_t);
12
+ ld hl, 9
13
+ add hl, sp
14
+ ld hl, (hl) ; hl = count
15
+ adc hl, hl ; hl = count * 2
16
+ ; = count2
17
+ ; C: if (count2) {
18
+ pop iy ; iy = ret
19
+ jr z, .zero
20
+ ; C: __ldir(src, dest, count2);
21
+ pop de ; de = dest
22
+ ex (sp), hl ; hl = src
23
+ pop bc ; bc = count2
24
+ push bc
25
+ push de
26
+ ldir
27
+ ; C: }
28
+ .zero:
29
+ ; C: return dest;
30
+ ex (sp), hl
31
+ jp (iy)
32
+ ; C: }
Original file line number Diff line number Diff line change
1
+ assume adl=1
2
+
3
+ section .text
4
+
5
+ public _wmemmove
6
+
7
+ ; wchar_t *wmemmove(wchar_t *dest, const wchar_t *src, size_t count)
8
+ _wmemmove:
9
+ ld hl, 9
10
+ add hl, sp
11
+ ld iy, (hl)
12
+ add iy, iy ; count *= 2
13
+ ld (hl), iy
14
+ jp _memmove
15
+
16
+ extern _memmove
Original file line number Diff line number Diff line change
1
+ assume adl=1
2
+
3
+ section .text
4
+
5
+ public _wmemset
6
+
7
+ ; wchar_t *wmemset(wchar_t *dst, wchar_t ch, size_t count)
8
+ _wmemset:
9
+ pop iy, hl, de, bc
10
+ push bc, de, hl, iy
11
+ ; BC = count
12
+ ; DE = ch
13
+ ; HL = dst
14
+
15
+ ; count *= sizeof(wchar_t)
16
+ cpi ; hl++ bc--
17
+ add hl, bc ; HL = (dst + 1) + (count - 1) = dst + count
18
+ ret c ; bc is zero
19
+ add hl, bc ; HL = dst + count + (count - 1) = dst + 2 * count - 1
20
+
21
+ ; hl += (count - 1) * 2 + 1
22
+ ; count -= 2
23
+ ld (hl), d ; upper 8 bits
24
+ dec hl
25
+ ld (hl), e ; lower 8 bits
26
+ ret po ; only one element needs to be written
27
+
28
+ ; write multiple elements
29
+ push hl
30
+ pop de
31
+ inc hl
32
+ dec de
33
+
34
+ push bc
35
+ ; use lddr twice
36
+ lddr
37
+ pop bc
38
+ lddr
39
+ dec hl
40
+ ret
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|2000" ,
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 = -Wall -Wextra -ffreestanding -Wformat=2 -Wshadow -Oz
12
+ CXXFLAGS = -Wall -Wextra -ffreestanding -Wformat=2 -Wshadow -Oz
13
+
14
+ PREFER_OS_LIBC = NO
15
+
16
+ HAS_PRINTF = YES
17
+
18
+ # ----------------------------
19
+
20
+ include $(shell cedev-config --makefile)
You can’t perform that action at this time.
0 commit comments