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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
/*
bug3475630.c
Register allocator allocated variable to iy, which is needed for stack access when accessing local variables unreachable by the frame pointer.
*/
#include <testfwk.h>
#include <stdio.h>
/*
* Raw directory item (32 bytes).
*
*/
typedef struct {
unsigned char ftype;
unsigned char fname[16];
unsigned char str_terminator; // 0x0d
unsigned char unused1[2];
unsigned int fsize;
unsigned int fstrt;
unsigned int fexec;
unsigned char unused2[4];
unsigned int block;
} FS_MZ_DITEM;
/*
* Raw directory sektor.
*
* Has 8 directory items (256 bytes).
*/
typedef struct {
FS_MZ_DITEM ditem[8];
} FS_MZ_BLDIR;
/*
* Elementary file descriptor
*
*/
typedef struct {
unsigned char ftype;
unsigned char fname[17];
unsigned int fsize;
unsigned int fstrt;
unsigned int fexec;
unsigned int block;
} FS_MZ_FHEADER;
/*
* Directory handler with cache for 8 file descriptors.
*
*/
typedef struct {
unsigned char position;
FS_MZ_FHEADER fheader[8];
} FS_MZDIR;
#pragma disable_warning 85 // Unreferenced function arguments in fd_read_sector(), my_strncpy().
extern char fd_read_sector ( unsigned int block, void* dma )
{
unsigned char i;
FS_MZ_BLDIR *bl_dir = dma;
for(i = 0; i < 8; i++)
{
bl_dir->ditem[i].ftype = i + 0;
bl_dir->ditem[i].fsize = i + 1;
bl_dir->ditem[i].fstrt = i + 2;
bl_dir->ditem[i].fexec = i + 3;
bl_dir->ditem[i].block = i + 4;
}
return(0);
}
char* my_strncpy ( char *dst, const char *src, size_t n, char terminator )
{
return(0);
}
#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory
/*
* Read raw directory data and transform into FS_MZDIR *dir.
*
*/
char fs_read_directory_block ( FS_MZDIR *dir, unsigned int block )
{
char res;
#if defined(__SDCC_mcs51)
static __xdata FS_MZ_BLDIR bl_dir;
#else
FS_MZ_BLDIR bl_dir;
#endif
FS_MZ_DITEM *dir_item;
FS_MZ_FHEADER *fil_header;
unsigned char i;
res = fd_read_sector ( block, &bl_dir );
if ( res ) return ( res );
for ( i = 0; i < 8; i++ ) {
dir_item = &bl_dir.ditem[i];
fil_header = &dir->fheader[i];
fil_header->ftype = dir_item->ftype;
fil_header->fsize = dir_item->fsize;
fil_header->fstrt = dir_item->fstrt;
fil_header->fexec = dir_item->fexec;
fil_header->block = dir_item->block;
my_strncpy ( fil_header->fname, dir_item->fname, sizeof ( fil_header->fname ), 0x0d );
};
return ( 0 );
}
__xdata FS_MZDIR dir;
#endif
void testBug(void)
{
#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory
unsigned char i;
fs_read_directory_block(&dir, 0);
for(i = 0; i < 8; i++)
{
ASSERT(dir.fheader[i].ftype == i + 0);
ASSERT(dir.fheader[i].fsize == i + 1);
ASSERT(dir.fheader[i].fstrt == i + 2);
ASSERT(dir.fheader[i].fexec == i + 3);
ASSERT(dir.fheader[i].block == i + 4);
}
#endif
}
|