1 /* bug-2854.c
2    A bug in handling of 8-bit parameters to z88dk_fastcall. Also bug #2852.
3  */
4 
5 #include <testfwk.h>
6 
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <stdint.h>
11 
12 #pragma disable_warning 85
13 #pragma disable_warning 88
14 #pragma disable_warning 127
15 
16 #if !defined( __SDCC_pdk14) && !defined( __SDCC_pdk15) // Lack of memory
17 
lock_give_fastcall(uint8_t * mutex)18 void lock_give_fastcall(uint8_t * mutex)
19 #ifdef __SDCC_z80
20 __preserves_regs(b,c,d,e,iyh,iyl) __z88dk_fastcall
21 #endif
22 {
23 }
24 #define lock_give(a) lock_give_fastcall(a)
25 
bank_get_abs_fastcall(int8_t bankRel)26 uint8_t bank_get_abs_fastcall(int8_t bankRel)
27 #ifdef __SDCC_z80
28 __preserves_regs(b,c,d,e,h,iyh,iyl) __z88dk_fastcall
29 #endif
30 {
31   ASSERT (bankRel = 23);
32   return 0;
33 }
34 #define bank_get_abs(a) bank_get_abs_fastcall(a)
35 
memcpy_far(void * str1,int8_t bank1,const void * str2,const int8_t bank2,size_t n)36 static void *memcpy_far(void *str1,int8_t bank1,const void *str2,const int8_t bank2,size_t n)
37 #ifdef __SDCC_z80
38 __preserves_regs(iyh,iyl)
39 #endif
40 {
41 }
42 
43 uint8_t bankLockBase[16];
44 
45 static void *buffer;
46 
ya_mvb(char ** args)47 int8_t ya_mvb(char **args)
48 {
49     if ( (args[2] != NULL) && (bank_get_abs((int8_t)atoi(args[1])) != 0) && (bank_get_abs((int8_t)atoi(args[2])) != 0) )
50     {
51         memcpy_far((void *)0x0000, (int8_t)atoi(args[2]), (void *)0x0000, (int8_t)atoi(args[1]), (0xF000));
52         bankLockBase[ bank_get_abs((int8_t)atoi(args[2])) ] = bankLockBase[ bank_get_abs((int8_t)atoi(args[1])) ];
53     }
54     return 1;
55 }
56 
ya_loadb(char ** args)57 int8_t ya_loadb(char **args)
58 {
59     uint8_t * dest;
60     uint32_t p1;
61     uint16_t s1 = 0;
62 
63     if (args[1] == NULL || args[2] == NULL) {
64     } else {
65         if (args[3] == NULL) {
66             dest = (uint8_t *)0x0100;
67         } else {
68             dest = (uint8_t *)strtoul(args[3], NULL, 16);
69         }
70         p1 = 0;
71         while ((uint16_t)dest < (0xF000)) {
72             if (s1 == 0) break;
73 
74             if (s1 > (0xF000) - (uint16_t)dest) {
75                 s1 = (0xF000) - (uint16_t)dest;
76             }
77             memcpy_far((void *)dest, (int8_t)atoi(args[2]), buffer, 0, s1);
78             dest += s1;
79             p1 += s1;
80         }
81 
82         lock_give( &bankLockBase[ bank_get_abs((int8_t)atoi(args[2])) ] );
83     }
84     return 1;
85 }
86 #endif
87 
88 void
testBug(void)89 testBug(void)
90 {
91 #if !defined( __SDCC_pdk14) && !defined( __SDCC_pdk15) // Lack of memory
92   const char *args[] = {"", "", "23", 0};
93   char b;
94   buffer = &b;
95 
96   ya_mvb(args);
97 
98   ya_loadb(args);
99 #endif
100 }
101 
102