1 /*
2 bug3475630.c
3
4 Register allocator allocated variable to iy, which is needed for stack access when accessing local variables unreachable by the frame pointer.
5 */
6
7 #include <testfwk.h>
8
9 #include <stdio.h>
10
11 /*
12 * Raw directory item (32 bytes).
13 *
14 */
15 typedef struct {
16 unsigned char ftype;
17 unsigned char fname[16];
18 unsigned char str_terminator; // 0x0d
19 unsigned char unused1[2];
20 unsigned int fsize;
21 unsigned int fstrt;
22 unsigned int fexec;
23 unsigned char unused2[4];
24 unsigned int block;
25 } FS_MZ_DITEM;
26
27
28 /*
29 * Raw directory sektor.
30 *
31 * Has 8 directory items (256 bytes).
32 */
33 typedef struct {
34 FS_MZ_DITEM ditem[8];
35 } FS_MZ_BLDIR;
36
37
38 /*
39 * Elementary file descriptor
40 *
41 */
42 typedef struct {
43 unsigned char ftype;
44 unsigned char fname[17];
45 unsigned int fsize;
46 unsigned int fstrt;
47 unsigned int fexec;
48 unsigned int block;
49 } FS_MZ_FHEADER;
50
51
52 /*
53 * Directory handler with cache for 8 file descriptors.
54 *
55 */
56 typedef struct {
57 unsigned char position;
58 FS_MZ_FHEADER fheader[8];
59 } FS_MZDIR;
60
61
62 #pragma disable_warning 85 // Unreferenced function arguments in fd_read_sector(), my_strncpy().
fd_read_sector(unsigned int block,void * dma)63 extern char fd_read_sector ( unsigned int block, void* dma )
64 {
65 unsigned char i;
66 FS_MZ_BLDIR *bl_dir = dma;
67
68 for(i = 0; i < 8; i++)
69 {
70 bl_dir->ditem[i].ftype = i + 0;
71 bl_dir->ditem[i].fsize = i + 1;
72 bl_dir->ditem[i].fstrt = i + 2;
73 bl_dir->ditem[i].fexec = i + 3;
74 bl_dir->ditem[i].block = i + 4;
75 }
76
77 return(0);
78 }
79
my_strncpy(char * dst,const char * src,size_t n,char terminator)80 char* my_strncpy ( char *dst, const char *src, size_t n, char terminator )
81 {
82 return(0);
83 }
84
85 #if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory
86
87 /*
88 * Read raw directory data and transform into FS_MZDIR *dir.
89 *
90 */
fs_read_directory_block(FS_MZDIR * dir,unsigned int block)91 char fs_read_directory_block ( FS_MZDIR *dir, unsigned int block )
92 {
93 char res;
94 #if defined(__SDCC_mcs51)
95 static __xdata FS_MZ_BLDIR bl_dir;
96 #else
97 FS_MZ_BLDIR bl_dir;
98 #endif
99 FS_MZ_DITEM *dir_item;
100 FS_MZ_FHEADER *fil_header;
101 unsigned char i;
102
103 res = fd_read_sector ( block, &bl_dir );
104 if ( res ) return ( res );
105
106 for ( i = 0; i < 8; i++ ) {
107
108 dir_item = &bl_dir.ditem[i];
109 fil_header = &dir->fheader[i];
110
111 fil_header->ftype = dir_item->ftype;
112 fil_header->fsize = dir_item->fsize;
113 fil_header->fstrt = dir_item->fstrt;
114 fil_header->fexec = dir_item->fexec;
115 fil_header->block = dir_item->block;
116
117 my_strncpy ( fil_header->fname, dir_item->fname, sizeof ( fil_header->fname ), 0x0d );
118 };
119
120 return ( 0 );
121 }
122
123 __xdata FS_MZDIR dir;
124 #endif
125
testBug(void)126 void testBug(void)
127 {
128 #if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory
129 unsigned char i;
130
131 fs_read_directory_block(&dir, 0);
132
133 for(i = 0; i < 8; i++)
134 {
135 ASSERT(dir.fheader[i].ftype == i + 0);
136 ASSERT(dir.fheader[i].fsize == i + 1);
137 ASSERT(dir.fheader[i].fstrt == i + 2);
138 ASSERT(dir.fheader[i].fexec == i + 3);
139 ASSERT(dir.fheader[i].block == i + 4);
140 }
141 #endif
142 }
143