1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - tools - makelcf
3   File:     makelcf.h
4 
5   Copyright 2003-2008 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2009-11-11#$
14   $Rev: 11140 $
15   $Author: kitase_hirotake $
16  *---------------------------------------------------------------------------*/
17 #ifndef	MAKELCF_H_
18 #define	MAKELCF_H_
19 
20 #include "misc.h"
21 
22 /*============================================================================
23  *  CONTAINER
24  */
25 typedef struct tAfterList
26 {
27     struct tAfter *head;
28     struct tAfter *tail;
29 }
30 tAfterList;
31 
32 typedef struct tAfter
33 {
34     struct tAfter *next;
35     const char *name;
36 }
37 tAfter;
38 
39 typedef struct tObjectList
40 {
41     struct tObject *head;
42     struct tObject *tail;
43 }
44 tObjectList;
45 
46 typedef enum
47 {
48     OBJTYPE_NONE,
49     OBJTYPE_FILE,                      // Regular file
50     OBJTYPE_STAR,                      // "*"
51     OBJTYPE_GROUP,                     // GROUP(xxxx)
52     OBJTYPE_OBJECT                     // OBJECT(yyy,zzz)
53 }
54 tObjectType;
55 
56 #define isNeedSection(obj)      ((obj)->objectType != OBJTYPE_OBJECT)
57 
58 typedef struct tObject
59 {
60     struct tObject *next;
61     const char *objectName;
62     const char *sectionName;
63     tObjectType objectType;
64 }
65 tObject;
66 
67 typedef struct tOverlayList
68 {
69     struct tOverlay *head;
70     struct tOverlay *tail;
71     u32     num;
72 }
73 tOverlayList;
74 
75 typedef enum
76 {
77     MEMTYPE_NONE = 0,
78     MEMTYPE_MAIN,
79     MEMTYPE_MAINEX,
80     MEMTYPE_ITCM,
81     MEMTYPE_DTCM,
82     MEMTYPE_ITCM_BSS,
83     MEMTYPE_DTCM_BSS,
84     MEMTYPE_SHARED,
85     MEMTYPE_WRAM,
86     MEMTYPE_WRAM_BSS,
87     MEMTYPE_VRAM,
88     MEMTYPE_DUMMY,
89 }
90 tMemType;
91 
92 typedef struct tOverlay
93 {
94     struct tOverlay *next;
95     u32     id;
96     const char *name;
97     const char *group;
98     u32     address;
99     char    compressSpec;
100     struct tAfterList afters;
101     struct tObjectList objects;
102     struct tObjectList libraries;
103     struct tObjectList searchSymbols;
104     struct tObjectList forces;
105     tMemType memtype;
106 
107 }
108 tOverlay;
109 
110 typedef struct tStatic
111 {
112     const char *name;
113     u32     address;
114     struct tObjectList objects;
115     struct tObjectList libraries;
116     struct tObjectList searchSymbols;
117     struct tObjectList forces;
118     u32     stacksize;
119     u32     stacksize_irq;
120     tMemType memtype;
121 
122 }
123 tStatic;
124 
125 typedef struct
126 {
127     const char *overlaydefs;
128     const char *overlaytable;
129     const char *ltdoverlaydefs;
130     const char *ltdoverlaytable;
131     const char *suffix;
132     const char *flxsuffix;
133     const char *ltdsuffix;
134 
135 }
136 tProperty;
137 
138 BOOL    AddOverlay(const char *overlayName);
139 BOOL    AddAutoload(const char *overlayName);
140 BOOL    AddLtdoverlay(const char *overlayName);
141 BOOL    AddLtdautoload(const char *overlayName);
142 BOOL    OverlaySetId(u32 id);
143 BOOL    OverlaySetGroup(const char *overlayGroup);
144 BOOL    OverlaySetAddress(u32 address);
145 BOOL    OverlayAddAfter(const char *overlayName);
146 BOOL    OverlayAddObject(const char *objectName, tObjectType objectType);
147 BOOL    OverlaySetObjectSection(const char *sectionName);
148 BOOL    OverlayAddLibrary(const char *objectName, tObjectType objectType);
149 BOOL    OverlaySetLibrarySection(const char *sectionName);
150 BOOL    OverlayAddSearchSymbol(const char *searchName);
151 BOOL    OverlayAddForce(const char *forcename);
152 BOOL    OverlaySetCompress(const char *compressSpec);
153 
154 BOOL    StaticSetName(const char *fileName);
155 BOOL    StaticSetAddress(u32 address);
156 BOOL    StaticAddObject(const char *objectName, tObjectType objectType);
157 BOOL    StaticSetObjectSection(const char *sectionName);
158 BOOL    StaticAddLibrary(const char *objectName, tObjectType objectType);
159 BOOL    StaticSetLibrarySection(const char *sectionName);
160 BOOL    StaticAddSearchSymbol(const char *searchName);
161 BOOL    StaticAddForce(const char *forceName);
162 BOOL    StaticSetStackSize(u32 stacksize);
163 BOOL    StaticSetStackSizeIrq(u32 stacksize);
164 BOOL    PropertySetOverlayDefs(const char *filename);
165 BOOL    PropertySetOverlayTable(const char *filename);
166 BOOL    PropertySetLtdoverlayDefs(const char *filename);
167 BOOL    PropertySetLtdoverlayTable(const char *filename);
168 BOOL    PropertySetSuffix(const char *suffix);
169 BOOL    PropertySetFlxsuffix(const char *flxsuffix);
170 BOOL    PropertySetLtdsuffix(const char *ltdsuffix);
171 
172 BOOL    CheckSpec(void);
173 void    DumpSpec(void);
174 BOOL    isSame(const char *s1, const char *s2);
175 
176 int     ParseSpecFile(const char *filename);
177 
178 extern tStatic Static;
179 extern tProperty Property;
180 extern tOverlayList OverlayList;
181 extern tOverlayList AutoloadList;
182 extern tOverlayList LtdoverlayList;
183 extern tOverlayList LtdautoloadList;
184 
185 #define	DEFAULT_OVERLAYDEFS	"%_defs"
186 #define	DEFAULT_OVERLAYTABLE	"%_table"
187 #define	DEFAULT_LTDOVERLAYDEFS	"%_defs"
188 #define	DEFAULT_LTDOVERLAYTABLE	"%_table"
189 #define	DEFAULT_SUFFIX		".sbin"
190 #define	DEFAULT_FLXSUFFIX	".TWL.FLX.sbin"
191 #define	DEFAULT_LTDSUFFIX	".TWL.LTD.sbin"
192 /* NITRO-SDK4.0RC: increased 0x400->0x800 */
193 #define	DEFAULT_IRQSTACKSIZE	0x800
194 
195 int     spec_yyparse(void);
196 int     spec_yylex(void);
197 void    spec_yyerror(const char *str);
198 
199 
200 /*============================================================================
201  *  TOKEN BUFFER
202  */
203 typedef struct tTokenBuffer
204 {
205     int     id;
206     const char *string;
207     int     loop_end;
208 }
209 tTokenBuffer;
210 
211 typedef struct tLoopStack
212 {
213     int     id;
214     int     start;
215 }
216 tLoopStack;
217 
218 #define	TOKEN_LEN		65536
219 #define	LOOP_STACK_MAX		32
220 
221 int     ParseTlcfFile(const char *filename);
222 int     CreateLcfFile(const char *filename);
223 
224 extern tTokenBuffer tokenBuffer[TOKEN_LEN];
225 extern int tokenBufferEnd;
226 
227 int     tlcf_yyparse(void);
228 int     tlcf_yylex(void);
229 void    tlcf_yyerror(const char *str);
230 void    lcf_error(const char *fmt, ...);
231 
232 extern BOOL DebugMode;
233 void    debug_printf(const char *str, ...);
234 
235 typedef struct
236 {
237     char   *string;
238     tObjectType type;
239 }
240 tObjectName;
241 
242 // for IF-ELSE-ENDIF
243 #define	COND_STACK_MAX		32
244 
245 typedef enum
246 {
247     COND_BLOCK_NOCOND,                 // non conditional block
248     COND_BLOCK_IF,                     // if(){} block
249     COND_BLOCK_ELSE                    // else{} block
250 }
251 tCondBlock;
252 
253 typedef struct
254 {
255     BOOL    valid;                     // condition is TRUE or FALSE
256     tCondBlock block;                  // regular/if{}/else{}
257 }
258 tCondStack;
259 
260 #endif //MAKELCF_H_
261