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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
/* __preserves_regs test
type: unsigned char, unsigned int, unsigned long
*/
#include <testfwk.h>
#if defined(__SDCC_z80) || defined(__SDCC_z180) || defined(__SDCC_r2k) || defined(__SDCC_r3ka) || defined(__SDCC_tlcs90) || defined(__SDCC_ez80_z80)
void write_bc(void) __preserves_regs(a, d, e, h, l, iyl, iyh) __naked
{
__asm
ld bc, #0
ret
__endasm;
}
void write_de(void) __preserves_regs(a, b, c, h, l, iyl, iyh) __naked
{
__asm
ld de, #0
ret
__endasm;
}
void write_hl(void) __preserves_regs(a, b, c, d, e, iyl, iyh) __naked
{
__asm
ld hl, #0
ret
__endasm;
}
{type} add_bc({type} a, {type} b)
{
{type} r = a + b;
write_de();
write_hl();
return(r);
}
{type} add_de({type} a, {type} b)
{
{type} r = a + b;
write_bc();
write_hl();
return(r);
}
{type} add_hl({type} a, {type} b)
{
{type} r = a + b;
write_bc();
write_de();
return(r);
}
{type} add_iy({type} a, {type} b)
{
{type} r = a + b;
write_bc();
write_de();
write_hl();
return(r);
}
#endif
void testRegs(void)
{
#if defined(__SDCC_z80) || defined(__SDCC_z180) || defined(__SDCC_r2k)|| defined(__SDCC_r3ka)
ASSERT(add_bc(0x55, 0xaa) == ({type})(0x55 + 0xaa));
ASSERT(add_de(0x55, 0xaa) == ({type})(0x55 + 0xaa));
ASSERT(add_hl(0x55, 0xaa) == ({type})(0x55 + 0xaa));
ASSERT(add_iy(0x55, 0xaa) == ({type})(0x55 + 0xaa));
#endif
}
|