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:: 2008-09-18#$
14   $Rev: 8573 $
15   $Author: okubata_ryoma $
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     struct tAfterList afters;
100     struct tObjectList objects;
101     struct tObjectList libraries;
102     struct tObjectList searchSymbols;
103     tMemType memtype;
104 
105 }
106 tOverlay;
107 
108 typedef struct tStatic
109 {
110     const char *name;
111     u32     address;
112     struct tObjectList objects;
113     struct tObjectList libraries;
114     struct tObjectList searchSymbols;
115     u32     stacksize;
116     u32     stacksize_irq;
117     tMemType memtype;
118 
119 }
120 tStatic;
121 
122 typedef struct
123 {
124     const char *overlaydefs;
125     const char *overlaytable;
126     const char *ltdoverlaydefs;
127     const char *ltdoverlaytable;
128     const char *suffix;
129     const char *flxsuffix;
130     const char *ltdsuffix;
131 
132 }
133 tProperty;
134 
135 BOOL    AddOverlay(const char *overlayName);
136 BOOL    AddAutoload(const char *overlayName);
137 BOOL    AddLtdoverlay(const char *overlayName);
138 BOOL    AddLtdautoload(const char *overlayName);
139 BOOL    OverlaySetId(u32 id);
140 BOOL    OverlaySetGroup(const char *overlayGroup);
141 BOOL    OverlaySetAddress(u32 address);
142 BOOL    OverlayAddAfter(const char *overlayName);
143 BOOL    OverlayAddObject(const char *objectName, tObjectType objectType);
144 BOOL    OverlaySetObjectSection(const char *sectionName);
145 BOOL    OverlayAddLibrary(const char *objectName, tObjectType objectType);
146 BOOL    OverlaySetLibrarySection(const char *sectionName);
147 BOOL    OverlayAddSearchSymbol(const char *searchName);
148 
149 BOOL    StaticSetName(const char *fileName);
150 BOOL    StaticSetAddress(u32 address);
151 BOOL    StaticAddObject(const char *objectName, tObjectType objectType);
152 BOOL    StaticSetObjectSection(const char *sectionName);
153 BOOL    StaticAddLibrary(const char *objectName, tObjectType objectType);
154 BOOL    StaticSetLibrarySection(const char *sectionName);
155 BOOL    StaticAddSearchSymbol(const char *searchName);
156 BOOL    StaticSetStackSize(u32 stacksize);
157 BOOL    StaticSetStackSizeIrq(u32 stacksize);
158 BOOL    PropertySetOverlayDefs(const char *filename);
159 BOOL    PropertySetOverlayTable(const char *filename);
160 BOOL    PropertySetLtdoverlayDefs(const char *filename);
161 BOOL    PropertySetLtdoverlayTable(const char *filename);
162 BOOL    PropertySetSuffix(const char *suffix);
163 BOOL    PropertySetFlxsuffix(const char *flxsuffix);
164 BOOL    PropertySetLtdsuffix(const char *ltdsuffix);
165 
166 BOOL    CheckSpec(void);
167 void    DumpSpec(void);
168 BOOL    isSame(const char *s1, const char *s2);
169 
170 int     ParseSpecFile(const char *filename);
171 
172 extern tStatic Static;
173 extern tProperty Property;
174 extern tOverlayList OverlayList;
175 extern tOverlayList AutoloadList;
176 extern tOverlayList LtdoverlayList;
177 extern tOverlayList LtdautoloadList;
178 
179 #define	DEFAULT_OVERLAYDEFS	"%_defs"
180 #define	DEFAULT_OVERLAYTABLE	"%_table"
181 #define	DEFAULT_LTDOVERLAYDEFS	"%_defs"
182 #define	DEFAULT_LTDOVERLAYTABLE	"%_table"
183 #define	DEFAULT_SUFFIX		".sbin"
184 #define	DEFAULT_FLXSUFFIX	".TWL.FLX.sbin"
185 #define	DEFAULT_LTDSUFFIX	".TWL.LTD.sbin"
186 /* NITRO-SDK4.0RC: increased 0x400->0x800 */
187 #define	DEFAULT_IRQSTACKSIZE	0x800
188 
189 int     spec_yyparse(void);
190 int     spec_yylex(void);
191 void    spec_yyerror(const char *str);
192 
193 
194 /*============================================================================
195  *  TOKEN BUFFER
196  */
197 typedef struct tTokenBuffer
198 {
199     int     id;
200     const char *string;
201     int     loop_end;
202 }
203 tTokenBuffer;
204 
205 typedef struct tLoopStack
206 {
207     int     id;
208     int     start;
209 }
210 tLoopStack;
211 
212 #define	TOKEN_LEN		65536
213 #define	LOOP_STACK_MAX		32
214 
215 int     ParseTlcfFile(const char *filename);
216 int     CreateLcfFile(const char *filename);
217 
218 extern tTokenBuffer tokenBuffer[TOKEN_LEN];
219 extern int tokenBufferEnd;
220 
221 int     tlcf_yyparse(void);
222 int     tlcf_yylex(void);
223 void    tlcf_yyerror(const char *str);
224 void    lcf_error(const char *fmt, ...);
225 
226 extern BOOL DebugMode;
227 void    debug_printf(const char *str, ...);
228 
229 typedef struct
230 {
231     char   *string;
232     tObjectType type;
233 }
234 tObjectName;
235 
236 // for IF-ELSE-ENDIF
237 #define	COND_STACK_MAX		32
238 
239 typedef enum
240 {
241     COND_BLOCK_NOCOND,                 // non conditional block
242     COND_BLOCK_IF,                     // if(){} block
243     COND_BLOCK_ELSE                    // else{} block
244 }
245 tCondBlock;
246 
247 typedef struct
248 {
249     BOOL    valid;                     // condition is TRUE or FALSE
250     tCondBlock block;                  // regular/if{}/else{}
251 }
252 tCondStack;
253 
254 #endif //MAKELCF_H_
255