blob: 57565e58fd87787d5e6cf0bf397ddf9a14612be4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
/*
bug-3322.c
A bug in __naked __sdcccall(N) functions (as opposed to __sdcccall(0) __naked, which worked)
*/
#include <testfwk.h>
#pragma disable_warning 85
#if defined(__SDCC_stm8) || defined(__SDCC_z80) || defined(__SDCC_z180) || defined(__SDCC_z80n) || defined(__SDCC_sm83)
#define NAKED __naked
#define SDCCCALL0 __sdcccall(0)
#else
#define NAKED
#define SDCCCALL0
#endif
static unsigned char test_2(const unsigned char foo) NAKED SDCCCALL0 {
#if defined(__SDCC_stm8) && defined(__SDCC_MODEL_MEDIUM)
__asm
ld a, (0x03, sp)
inc a
ret
__endasm;
#elif defined(__SDCC_stm8) && defined(__SDCC_MODEL_LARGE)
__asm
ld a, (0x04, sp)
inc a
retf
__endasm;
#elif defined(__SDCC_z80) || defined(__SDCC_z180) || defined(__SDCC_z80n)
__asm
ld iy, #2
add iy, sp
ld l, 0 (iy)
inc l
ret
__endasm;
#elif defined(__SDCC_sm83)
__asm
ldhl sp, #2
ld e, (hl)
inc e
ret
__endasm;
#else
return foo + 1;
#endif
}
void testBug(void) {
volatile unsigned char bar = test_2(23);
ASSERT(bar == 24);
}
|