summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug3475630.c
blob: 6afca6e2ed2c66dfc0ff8119250c3480287e054d (plain) (blame)
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
}