1#---------------------------------------------------------------------------
2#  Project:  NitroSDK - tools - makelcf
3#  File:     ARM9-TS-C.lcf.template
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#  $Log: ARM9-TS-C.lcf.template,v $
14#  Revision 1.20  2006/07/20 07:29:12  kitase_hirotake
15#  Added the description explaining the version section
16#
17#  Revision 1.19  2006/07/18 11:11:01  yasu
18#  There is an error in the way check.xTCM gets the OVERLAY region size in the TCM region overflow check. Because it is not currently clear how to accurately calculate this, the addition of the OVERLAY region was cut out.
19#
20#
21#
22#  Revision 1.18  2006/05/10 03:19:47  yasu
23#  Added support for the CodeWarrior 2.x overlay expansion
24#
25#  Revision 1.17  2006/04/07 04:45:03  kitase_hirotake
26#  Added .itcm.bss/.dtcm.bss
27#
28#  Revision 1.16  2006/03/30 00:31:29  yasu
29#  Revised NUMBER_OVERLAYS to NUMBER.OVERLAYS
30#
31#  Revision 1.15  2006/03/29 13:19:14  yasu
32#  NUMBER_OVERLAYS revised to NUMBER.OVERLAYS
33#
34#  Revision 1.14  2005/11/24 01:16:47  yada
35#  Changed start address of mainEX arena from 0x2400000 to 0x23e0000
36#
37#  Revision 1.13  2005/09/02 04:14:22  yasu
38#  Old symbols were redefined so they can be used even under SDK2.2
39#
40#  Revision 1.12  2005/08/31 09:34:57  yasu
41#  Corrected a problem where code would not function normally when using section names such as section_BSS
42#
43#  Revision 1.11  2005/08/26 11:22:16  yasu
44#  Overlay support for ITCM/DTCM
45#
46#  Revision 1.10  2005/06/20 12:29:20  yasu
47#  Changed Surffix to Suffix
48#
49#  Revision 1.9  2005/06/14 09:03:42  yada
50#  Fix specific to negative value of SDK_STACKSIZE
51#
52#  Revision 1.8  2005/04/13 12:52:22  terui
53#  Changed SDK_AUTOLOAD.DTCM.START 0x027c0000 to 0x027e0000
54#
55#  Revision 1.7  2005/03/25 12:54:59  yasu
56#  Added the .version section
57#
58#  Revision 1.6  2005/01/14 03:35:32  yasu
59#  Support sinit
60#
61#  Revision 1.5  2004/11/05 04:23:32  yasu
62#  Added OverlayTable digest
63#
64#  Revision 1.4  2004/10/03 02:00:56  yasu
65#  Output component file list for compstatic tool
66#
67#  Revision 1.3  2004/09/09 11:49:20  yasu
68#  Added support for compstatic in default
69#
70#  Revision 1.2  2004/09/09 03:15:45  yasu
71#  Fixed typo
72#
73#  Revision 1.1  2004/09/01 07:49:39  yasu
74#  Added support for NITRO_COMPRESS
75#
76#  $NoKeywords: $
77#---------------------------------------------------------------------------
78MEMORY
79{
80	<STATIC.NAME>           (RWX) : ORIGIN = <STATIC.ADDRESS>,   LENGTH = 0x0 >  <STATIC.NAME><PROPERTY.SUFFIX>
81	<FOREACH.AUTOLOADS>
82	<AUTOLOAD.NAME>         (RWX) : ORIGIN = <AUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
83	<END.AUTOLOADS>
84	binary.AUTOLOAD_INFO		(RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
85	binary.STATIC_FOOTER		(RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.SUFFIX>
86
87	<PROPERTY.OVERLAYDEFS>	(RW)  : ORIGIN = AFTER(<STATIC.NAME>), LENGTH = 0x0 > <PROPERTY.OVERLAYDEFS><PROPERTY.SUFFIX>
88	<PROPERTY.OVERLAYTABLE>	(RW)  : ORIGIN = AFTER(<STATIC.NAME>), LENGTH = 0x0 > <PROPERTY.OVERLAYTABLE><PROPERTY.SUFFIX>
89	<FOREACH.OVERLAYS>
90	<OVERLAY.NAME>          (RWXO): ORIGIN = <OVERLAY.ADDRESS>, LENGTH = 0x0 > <OVERLAY.NAME><PROPERTY.SUFFIX>
91	<END.OVERLAYS>
92	dummy.MAIN_EX		(RW)  : ORIGIN = 0x023e0000, LENGTH = 0x0
93	arena.MAIN			(RW)  : ORIGIN = AFTER(<STATIC.NAME><FOREACH.OVERLAYS=MAIN>,<OVERLAY.NAME><END.OVERLAYS>), LENGTH = 0x0
94	arena.MAIN_EX		(RW)  : ORIGIN = AFTER(dummy.MAIN_EX<FOREACH.OVERLAYS=MAINEX>,<OVERLAY.NAME><END.OVERLAYS>), LENGTH = 0x0
95	arena.ITCM		(RW)  : ORIGIN = AFTER(ITCM<FOREACH.OVERLAYS=ITCM>,<OVERLAY.NAME><END.OVERLAYS>), LENGTH = 0x0
96	arena.DTCM		(RW)  : ORIGIN = AFTER(DTCM<FOREACH.OVERLAYS=DTCM>,<OVERLAY.NAME><END.OVERLAYS>), LENGTH = 0x0
97	binary.MODULE_FILES		(RW)  : ORIGIN = 0x0, LENGTH = 0x0     > component.files
98	binary.COMP_SPEC_LIST		(RW)  : ORIGIN = 0x0, LENGTH = 0x0     > compspec.list
99	check.ITCM			(RWX) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check
100	check.DTCM			(RW)  : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check
101}
102
103FORCE_ACTIVE
104{
105	SVC_SoftReset
106}
107
108KEEP_SECTION
109{
110	.sinit
111}
112
113SECTIONS
114{
115	############################ STATIC #################################
116	.<STATIC.NAME>:
117	{
118	ALIGNALL(4);			. = ALIGN(32);	# Fit to cache line
119					<IF.NITRO_LCFSPEC.GE.2>
120					<FOREACH.STATIC.SEARCHSYMBOLS>
121					SEARCH_SYMBOL <STATIC.SEARCHSYMBOL>;
122					<END.STATIC.SEARCHSYMBOLS>
123					<ENDIF>
124	#
125	#  TEXT BLOCK: READ ONLY
126	#
127	SDK_STATIC_START		=.;
128	SDK_STATIC_TEXT_START		=.;
129					#:::::::::: text/rodata
130					libsyscall.a (.text)
131					crt0.o (.text)
132					crt0.o (.rodata)
133					#
134					# Added .version section.
135					# The information included in this section will be needed for Lotcheck purposes. Be sure to leave it in this position.
136					#
137					#
138					* (.version)
139					OBJECT(NitroMain,*)
140					<FOREACH.STATIC.FORCES>
141					FORCE_OBJECT<STATIC.FORCE>
142					<END.STATIC.FORCES>
143					<FOREACH.STATIC.OBJECTS=.text>
144					<STATIC.OBJECT=.text:t>
145					<END.STATIC.OBJECTS>
146					<FOREACH.STATIC.LIBRARIES=.text>
147					<STATIC.LIBRARY=.text:t>
148					<END.STATIC.LIBRARIES>
149					. = ALIGN(4);
150					* (.exception)
151					. = ALIGN(4);
152	SDK_STATIC_ETABLE_START		=.;
153					EXCEPTION
154	SDK_STATIC_ETABLE_END		=.;
155					. = ALIGN(4);
156					<FOREACH.STATIC.OBJECTS=.init>
157					<STATIC.OBJECT=.init:t>
158					<END.STATIC.OBJECTS>
159					<FOREACH.STATIC.LIBRARIES=.init>
160					<STATIC.LIBRARY=.init:t>
161					<END.STATIC.LIBRARIES>
162					. = ALIGN(4);
163					<FOREACH.STATIC.OBJECTS=.rodata>
164					<STATIC.OBJECT=.rodata:t>
165					<END.STATIC.OBJECTS>
166					<FOREACH.STATIC.LIBRARIES=.rodata>
167					<STATIC.LIBRARY=.rodata:t>
168					<END.STATIC.LIBRARIES>
169					. = ALIGN(4);
170
171	SDK_STATIC_SINIT_START		=.;
172					#:::::::::: ctor
173					<FOREACH.STATIC.OBJECTS=.ctor>
174					<STATIC.OBJECT=.ctor:t>
175					<END.STATIC.OBJECTS>
176					<FOREACH.STATIC.LIBRARIES=.ctor>
177					<STATIC.LIBRARY=.ctor:t>
178					<END.STATIC.LIBRARIES>
179					<FOREACH.STATIC.OBJECTS=.sinit>
180					<STATIC.OBJECT=.sinit:t>
181					<END.STATIC.OBJECTS>
182					<FOREACH.STATIC.LIBRARIES=.sinit>
183					<STATIC.LIBRARY=.sinit:t>
184					<END.STATIC.LIBRARIES>
185					WRITEW	0;
186					#:::::::::: ctor
187	SDK_STATIC_SINIT_END		=.;
188
189					#:::::::::: text/rodata
190					. = ALIGN(32);
191	SDK_STATIC_TEXT_END		=.;
192
193	#
194	#  DATA BLOCK: READ WRITE
195	#
196	SDK_STATIC_DATA_START		=.;
197					#:::::::::: data
198					<FOREACH.STATIC.OBJECTS=.sdata>
199					<STATIC.OBJECT=.sdata:t>
200					<END.STATIC.OBJECTS>
201					<FOREACH.STATIC.LIBRARIES=.sdata>
202					<STATIC.LIBRARY=.sdata:t>
203					<END.STATIC.LIBRARIES>
204					. = ALIGN(4);
205					<FOREACH.STATIC.OBJECTS=.data>
206					<STATIC.OBJECT=.data:t>
207					<END.STATIC.OBJECTS>
208					<FOREACH.STATIC.LIBRARIES=.data>
209					<STATIC.LIBRARY=.data:t>
210					<END.STATIC.LIBRARIES>
211					. = ALIGN(4);
212
213	SDK_OVERLAYTABLE_DIGEST		=.;
214					. = . + 20;
215	SDK_OVERLAYTABLE_DIGEST_END	=.;
216	SDK_OVERLAY_DIGEST		=.;
217					. = . + <NUMBER.OVERLAYS> * 20;
218	SDK_OVERLAY_DIGEST_END		=.;
219
220					#:::::::::: data
221					. = ALIGN(32);
222	SDK_STATIC_DATA_END		=.;
223	SDK_STATIC_END			=.;
224
225	SDK_STATIC_TEXT_SIZE		= SDK_STATIC_TEXT_END - SDK_STATIC_TEXT_START;
226	SDK_STATIC_DATA_SIZE		= SDK_STATIC_DATA_END - SDK_STATIC_DATA_START;
227	SDK_STATIC_SIZE			= SDK_STATIC_END      - SDK_STATIC_START;
228	__sinit__			= SDK_STATIC_SINIT_START;	# for static initializer
229	__exception_table_start__	= SDK_STATIC_ETABLE_START;	# for exception table
230	__exception_table_end__		= SDK_STATIC_ETABLE_END;	# for exception table
231	} > <STATIC.NAME>
232
233	.<STATIC.NAME>.bss:
234	{
235	ALIGNALL(4);			. = ALIGN(32);
236					<IF.NITRO_LCFSPEC.GE.2>
237					<FOREACH.STATIC.SEARCHSYMBOLS>
238					SEARCH_SYMBOL <STATIC.SEARCHSYMBOL>;
239					<END.STATIC.SEARCHSYMBOLS>
240					<ENDIF>
241	#
242	#  BSS BLOCK
243	#
244	SDK_STATIC_BSS_START		=.;
245					#:::::::::: bss
246					<FOREACH.STATIC.OBJECTS=.sbss>
247					<STATIC.OBJECT=.sbss:t>
248					<END.STATIC.OBJECTS>
249					<FOREACH.STATIC.LIBRARIES=.sbss>
250					<STATIC.LIBRARY=.sbss:t>
251					<END.STATIC.LIBRARIES>
252					. = ALIGN(4);
253					<FOREACH.STATIC.OBJECTS=.bss>
254					<STATIC.OBJECT=.bss:t>
255					<END.STATIC.OBJECTS>
256					<FOREACH.STATIC.LIBRARIES=.bss>
257					<STATIC.LIBRARY=.bss:t>
258					<END.STATIC.LIBRARIES>
259					. = ALIGN(4);
260					#:::::::::: bss
261					. = ALIGN(32);
262	SDK_STATIC_BSS_END		= .;
263	SDK_STATIC_BSS_SIZE		= SDK_STATIC_BSS_END - SDK_STATIC_BSS_START;
264
265	} >> <STATIC.NAME>
266
267
268	############################ AUTOLOADS ##############################
269	SDK_AUTOLOAD.ITCM.START			= 0x01ff8000;
270	SDK_AUTOLOAD.ITCM.END			= SDK_AUTOLOAD.ITCM.START;
271	SDK_AUTOLOAD.ITCM.BSS_END		= SDK_AUTOLOAD.ITCM.START;
272	SDK_AUTOLOAD.ITCM.SIZE			= 0;
273	SDK_AUTOLOAD.ITCM.BSS_SIZE		= 0;
274	SDK_AUTOLOAD.DTCM.START			= 0x027e0000;
275	SDK_AUTOLOAD.DTCM.END			= SDK_AUTOLOAD.DTCM.START;
276	SDK_AUTOLOAD.DTCM.BSS_END		= SDK_AUTOLOAD.DTCM.START;
277	SDK_AUTOLOAD.DTCM.SIZE			= 0;
278	SDK_AUTOLOAD.DTCM.BSS_SIZE		= 0;
279	SDK_AUTOLOAD_START			= SDK_STATIC_END;
280	SDK_AUTOLOAD_SIZE			= 0;
281	SDK_AUTOLOAD_NUMBER			= <NUMBER.AUTOLOADS>;
282
283<FOREACH.AUTOLOADS>
284	.<AUTOLOAD.NAME>:
285	{
286	ALIGNALL(4);				. = ALIGN(32);
287						<IF.NITRO_LCFSPEC.GE.2>
288						<FOREACH.AUTOLOAD.SEARCHSYMBOLS>
289						SEARCH_SYMBOL <AUTOLOAD.SEARCHSYMBOL>;
290						<END.AUTOLOAD.SEARCHSYMBOLS>
291						<ENDIF>
292	#
293	#   TEXT BLOCK: READ ONLY
294	#
295	SDK_AUTOLOAD_<AUTOLOAD.NAME>_ID		=<AUTOLOAD.ID>;
296	SDK_AUTOLOAD.<AUTOLOAD.NAME>.ID		=<AUTOLOAD.ID>;
297	SDK_AUTOLOAD.<AUTOLOAD.NAME>.START	=.;
298	SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_START	=.;
299						#:::::::::: text/rodata
300						<FOREACH.AUTOLOAD.FORCES>
301						FORCE_OBJECT<AUTOLOAD.FORCE>
302						<END.AUTOLOAD.FORCES>
303						<FOREACH.AUTOLOAD.OBJECTS=.text>
304						<AUTOLOAD.OBJECT=.text:t>
305						<END.AUTOLOAD.OBJECTS>
306						<FOREACH.AUTOLOAD.LIBRARIES=.text>
307						<AUTOLOAD.LIBRARY=.text:t>
308						<END.AUTOLOAD.LIBRARIES>
309						. = ALIGN(4);
310						<FOREACH.AUTOLOAD.OBJECTS=.itcm>
311						<AUTOLOAD.OBJECT=.itcm:t>
312						<END.AUTOLOAD.OBJECTS>
313						<FOREACH.AUTOLOAD.LIBRARIES=.itcm>
314						<AUTOLOAD.LIBRARY=.itcm:t>
315						<END.AUTOLOAD.LIBRARIES>
316						. = ALIGN(4);
317						<FOREACH.AUTOLOAD.OBJECTS=.rodata>
318						<AUTOLOAD.OBJECT=.rodata:t>
319						<END.AUTOLOAD.OBJECTS>
320						<FOREACH.AUTOLOAD.LIBRARIES=.rodata>
321						<AUTOLOAD.LIBRARY=.rodata:t>
322						<END.AUTOLOAD.LIBRARIES>
323						. = ALIGN(4);
324						#:::::::::: text/rodata
325	SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_END	=.;
326
327	#
328	#  DATA BLOCK: READ WRITE BLOCK
329	#
330	SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_START	=.;
331						#:::::::::: data
332						<FOREACH.AUTOLOAD.OBJECTS=.sdata>
333						<AUTOLOAD.OBJECT=.sdata:t>
334						<END.AUTOLOAD.OBJECTS>
335						<FOREACH.AUTOLOAD.LIBRARIES=.sdata>
336						<AUTOLOAD.LIBRARY=.sdata:t>
337						<END.AUTOLOAD.LIBRARIES>
338						. = ALIGN(4);
339						<FOREACH.AUTOLOAD.OBJECTS=.data>
340						<AUTOLOAD.OBJECT=.data:t>
341						<END.AUTOLOAD.OBJECTS>
342						<FOREACH.AUTOLOAD.LIBRARIES=.data>
343						<AUTOLOAD.LIBRARY=.data:t>
344						<END.AUTOLOAD.LIBRARIES>
345						. = ALIGN(4);
346						<FOREACH.AUTOLOAD.OBJECTS=.dtcm>
347						<AUTOLOAD.OBJECT=.dtcm:t>
348						<END.AUTOLOAD.OBJECTS>
349						<FOREACH.AUTOLOAD.LIBRARIES=.dtcm>
350						<AUTOLOAD.LIBRARY=.dtcm:t>
351						<END.AUTOLOAD.LIBRARIES>
352						. = ALIGN(4);
353						#:::::::::: data
354						. = ALIGN(32);
355	SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_END	=.;
356	SDK_AUTOLOAD.<AUTOLOAD.NAME>.END	=.;
357
358	SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_SIZE	= SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.TEXT_START;
359	SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_SIZE	= SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.DATA_START;
360	SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE	= SDK_AUTOLOAD.<AUTOLOAD.NAME>.END      - SDK_AUTOLOAD.<AUTOLOAD.NAME>.START;
361	SDK_AUTOLOAD_SIZE			= SDK_AUTOLOAD_SIZE + SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE;
362
363	} > <AUTOLOAD.NAME>
364
365	.<AUTOLOAD.NAME>.bss:
366	{
367	ALIGNALL(4);				. = ALIGN(32);
368						<IF.NITRO_LCFSPEC.GE.2>
369						<FOREACH.AUTOLOAD.SEARCHSYMBOLS>
370						SEARCH_SYMBOL <AUTOLOAD.SEARCHSYMBOL>;
371						<END.AUTOLOAD.SEARCHSYMBOLS>
372						<ENDIF>
373	#
374	#  BSS BLOCK
375	#
376	SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_START	= .;
377						#:::::::::: bss
378						<FOREACH.AUTOLOAD.OBJECTS=.sbss>
379						<AUTOLOAD.OBJECT=.sbss:t>
380						<END.AUTOLOAD.OBJECTS>
381						<FOREACH.AUTOLOAD.LIBRARIES=.sbss>
382						<AUTOLOAD.LIBRARY=.sbss:t>
383						<END.AUTOLOAD.LIBRARIES>
384						. = ALIGN(4);
385						<FOREACH.AUTOLOAD.OBJECTS=.bss>
386						<AUTOLOAD.OBJECT=.bss:t>
387						<END.AUTOLOAD.OBJECTS>
388						<FOREACH.AUTOLOAD.LIBRARIES=.bss>
389						<AUTOLOAD.LIBRARY=.bss:t>
390						<END.AUTOLOAD.LIBRARIES>
391						. = ALIGN(4);
392						<FOREACH.AUTOLOAD.OBJECTS=.dtcm>
393						<AUTOLOAD.OBJECT=.dtcm.bss:t>
394						<END.AUTOLOAD.OBJECTS>
395						<FOREACH.AUTOLOAD.LIBRARIES=.dtcm>
396						<AUTOLOAD.LIBRARY=.dtcm.bss:t>
397						<END.AUTOLOAD.LIBRARIES>
398						. = ALIGN(4);
399						<FOREACH.AUTOLOAD.OBJECTS=.itcm>
400						<AUTOLOAD.OBJECT=.itcm.bss:t>
401						<END.AUTOLOAD.OBJECTS>
402						<FOREACH.AUTOLOAD.LIBRARIES=.itcm>
403						<AUTOLOAD.LIBRARY=.itcm.bss:t>
404						<END.AUTOLOAD.LIBRARIES>
405						. = ALIGN(4);
406						#:::::::::: bss
407						. = ALIGN(32);
408	SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_END	= .;
409
410	SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_SIZE	= SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_END - SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_START;
411
412	} >> <AUTOLOAD.NAME>
413
414<END.AUTOLOADS>
415
416	SDK_AUTOLOAD_ITCM_START			= SDK_AUTOLOAD.ITCM.START;
417	SDK_AUTOLOAD_ITCM_END			= SDK_AUTOLOAD.ITCM.END;
418	SDK_AUTOLOAD_ITCM_BSS_END		= SDK_AUTOLOAD.ITCM.BSS_END;
419	SDK_AUTOLOAD_ITCM_SIZE			= SDK_AUTOLOAD.ITCM.SIZE;
420	SDK_AUTOLOAD_ITCM_BSS_SIZE		= SDK_AUTOLOAD.ITCM.BSS_SIZE;
421	SDK_AUTOLOAD_DTCM_START			= SDK_AUTOLOAD.DTCM.START;
422	SDK_AUTOLOAD_DTCM_END			= SDK_AUTOLOAD.DTCM.END;
423	SDK_AUTOLOAD_DTCM_BSS_END		= SDK_AUTOLOAD.DTCM.BSS_END;
424	SDK_AUTOLOAD_DTCM_SIZE			= SDK_AUTOLOAD.DTCM.SIZE;
425	SDK_AUTOLOAD_DTCM_BSS_SIZE		= SDK_AUTOLOAD.DTCM.BSS_SIZE;
426
427	############################ AUTOLOAD_INFO ##########################
428	.binary.AUTOLOAD_INFO:
429	{
430<FOREACH.AUTOLOADS>
431		WRITEW ADDR(.<AUTOLOAD.NAME>);
432		WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.SIZE;
433		WRITEW SDK_AUTOLOAD.<AUTOLOAD.NAME>.BSS_SIZE;
434<END.AUTOLOADS>
435	} > binary.AUTOLOAD_INFO
436
437	SDK_AUTOLOAD_LIST			= SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE;
438	SDK_AUTOLOAD_LIST_END			= SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO);
439	SDK_AUTOLOAD_SIZE			= SDK_AUTOLOAD_SIZE  + SIZEOF(.binary.AUTOLOAD_INFO);
440
441	############################ STATIC_FOOTER ##########################
442	.binary.STATIC_FOOTER:
443	{
444		WRITEW 0xdec00621;		# LE(0x2106C0DE) = NITRO CODE
445		WRITEW _start_ModuleParams - ADDR(.<STATIC.NAME>);
446		WRITEW SDK_OVERLAY_DIGEST  - ADDR(.<STATIC.NAME>);
447	} > binary.STATIC_FOOTER
448
449	############################ OVERLAYS ###############################
450	SDK_OVERLAY_NUMBER 			= <NUMBER.OVERLAYS>;
451
452<FOREACH.OVERLAYS>
453	.<OVERLAY.NAME>:<IF.NITRO_LCFSPEC.GE.2><OVERLAY.NAME><ENDIF>
454	{
455	ALIGNALL(4);				. = ALIGN(32);
456						<IF.NITRO_LCFSPEC.GE.2>
457						<FOREACH.OVERLAY.SEARCHSYMBOLS>
458						SEARCH_SYMBOL <OVERLAY.SEARCHSYMBOL>;
459						<END.OVERLAY.SEARCHSYMBOLS>
460						<ENDIF>
461	#
462	#   TEXT BLOCK: READ ONLY
463	#
464	SDK_OVERLAY_<OVERLAY.NAME>_ID		=<OVERLAY.ID>;	### SEGMENT <OVERLAY.NAME> OVERLAY ID
465	SDK_OVERLAY.<OVERLAY.NAME>.ID		=<OVERLAY.ID>;
466	SDK_OVERLAY.<OVERLAY.NAME>.START	=.;
467	SDK_OVERLAY.<OVERLAY.NAME>.TEXT_START	=.;
468						#:::::::::: text/rodata
469						<FOREACH.OVERLAY.FORCES>
470						FORCE_OBJECT<OVERLAY.FORCE>
471						<END.OVERLAY.FORCES>
472						<FOREACH.OVERLAY.OBJECTS=.text>
473						<OVERLAY.OBJECT=.text:t>
474						<END.OVERLAY.OBJECTS>
475						<FOREACH.OVERLAY.LIBRARIES=.text>
476						<OVERLAY.LIBRARY=.text:t>
477						<END.OVERLAY.LIBRARIES>
478						. = ALIGN(4);
479						<FOREACH.OVERLAY.OBJECTS=.rodata>
480						<OVERLAY.OBJECT=.rodata:t>
481						<END.OVERLAY.OBJECTS>
482						<FOREACH.OVERLAY.LIBRARIES=.rodata>
483						<OVERLAY.LIBRARY=.rodata:t>
484						<END.OVERLAY.LIBRARIES>
485						. = ALIGN(4);
486						<FOREACH.OVERLAY.OBJECTS=.init>
487						<OVERLAY.OBJECT=.init:t>
488						<END.OVERLAY.OBJECTS>
489						<FOREACH.OVERLAY.LIBRARIES=.init>
490						<OVERLAY.LIBRARY=.init:t>
491						<END.OVERLAY.LIBRARIES>
492						. = ALIGN(4);
493	SDK_OVERLAY.<OVERLAY.NAME>.SINIT_START	=.;
494						#:::::::::: ctor
495						<FOREACH.OVERLAY.OBJECTS=.ctor>
496						<OVERLAY.OBJECT=.ctor:t>
497						<END.OVERLAY.OBJECTS>
498						<FOREACH.OVERLAY.LIBRARIES=.ctor>
499						<OVERLAY.LIBRARY=.ctor:t>
500						<END.OVERLAY.LIBRARIES>
501						<FOREACH.OVERLAY.OBJECTS=.sinit>
502						<OVERLAY.OBJECT=.sinit:t>
503						<END.OVERLAY.OBJECTS>
504						<FOREACH.OVERLAY.LIBRARIES=.sinit>
505						<OVERLAY.LIBRARY=.sinit:t>
506						<END.OVERLAY.LIBRARIES>
507						WRITEW	0;
508						#:::::::::: ctor
509	SDK_OVERLAY.<OVERLAY.NAME>.SINIT_END	=.;
510
511						#:::::::::: text/rodata
512						. = ALIGN(32);
513	SDK_OVERLAY.<OVERLAY.NAME>.TEXT_END	=.;
514
515	#
516	#  DATA BLOCK: READ WRITE
517	#
518	SDK_OVERLAY.<OVERLAY.NAME>.DATA_START	=.;
519						#:::::::::: data
520						<FOREACH.OVERLAY.OBJECTS=.sdata>
521						<OVERLAY.OBJECT=.sdata:t>
522						<END.OVERLAY.OBJECTS>
523						<FOREACH.OVERLAY.LIBRARIES=.sdata>
524						<OVERLAY.LIBRARY=.sdata:t>
525						<END.OVERLAY.LIBRARIES>
526						. = ALIGN(4);
527						<FOREACH.OVERLAY.OBJECTS=.data>
528						<OVERLAY.OBJECT=.data:t>
529						<END.OVERLAY.OBJECTS>
530						<FOREACH.OVERLAY.LIBRARIES=.data>
531						<OVERLAY.LIBRARY=.data:t>
532						<END.OVERLAY.LIBRARIES>
533						. = ALIGN(4);
534						#:::::::::: data
535						. = ALIGN(32);
536	SDK_OVERLAY.<OVERLAY.NAME>.DATA_END	=.;
537	SDK_OVERLAY.<OVERLAY.NAME>.END		=.;
538
539	SDK_OVERLAY.<OVERLAY.NAME>.TEXT_SIZE	= SDK_OVERLAY.<OVERLAY.NAME>.TEXT_END - SDK_OVERLAY.<OVERLAY.NAME>.TEXT_START;
540	SDK_OVERLAY.<OVERLAY.NAME>.DATA_SIZE	= SDK_OVERLAY.<OVERLAY.NAME>.DATA_END - SDK_OVERLAY.<OVERLAY.NAME>.DATA_START;
541	SDK_OVERLAY.<OVERLAY.NAME>.SIZE		= SDK_OVERLAY.<OVERLAY.NAME>.END      - SDK_OVERLAY.<OVERLAY.NAME>.START;
542
543	} > <OVERLAY.NAME>
544
545	.<OVERLAY.NAME>.bss:<IF.NITRO_LCFSPEC.GE.2><OVERLAY.NAME><ENDIF>
546	{
547	ALIGNALL(4);				. = ALIGN(32);
548						<IF.NITRO_LCFSPEC.GE.2>
549						<FOREACH.OVERLAY.SEARCHSYMBOLS>
550						SEARCH_SYMBOL <OVERLAY.SEARCHSYMBOL>;
551						<END.OVERLAY.SEARCHSYMBOLS>
552						<ENDIF>
553	#
554	#  BSS BLOCK
555	#
556	SDK_OVERLAY.<OVERLAY.NAME>.BSS_START	= .;
557						#:::::::::: bss
558						<FOREACH.OVERLAY.OBJECTS=.bss>
559						<OVERLAY.OBJECT=.bss:t>
560						<END.OVERLAY.OBJECTS>
561						<FOREACH.OVERLAY.LIBRARIES=.bss>
562						<OVERLAY.LIBRARY=.bss:t>
563						<END.OVERLAY.LIBRARIES>
564						. = ALIGN(4);
565						<FOREACH.OVERLAY.OBJECTS=.sbss>
566						<OVERLAY.OBJECT=.sbss:t>
567						<END.OVERLAY.OBJECTS>
568						<FOREACH.OVERLAY.LIBRARIES=.sbss>
569						<OVERLAY.LIBRARY=.sbss:t>
570						<END.OVERLAY.LIBRARIES>
571						. = ALIGN(4);
572						#:::::::::: bss
573						. = ALIGN(32);
574	SDK_OVERLAY.<OVERLAY.NAME>.BSS_END	= .;
575
576	SDK_OVERLAY.<OVERLAY.NAME>.BSS_SIZE	= SDK_OVERLAY.<OVERLAY.NAME>.BSS_END - SDK_OVERLAY.<OVERLAY.NAME>.BSS_START;
577
578	} >> <OVERLAY.NAME>
579
580<END.OVERLAYS>
581
582	############################ MAIN EX ##################################
583	# MAIN EX Area
584	.dummy.MAIN_EX:
585	{
586		. = ALIGN(32);
587	} > dummy.MAIN_EX
588
589	############################ ARENA ##################################
590	.arena.MAIN:
591	{
592						. = ALIGN(32);
593		SDK_SECTION_ARENA_START		=.;
594	} > arena.MAIN
595
596	.arena.MAIN_EX:
597	{
598						. = ALIGN(32);
599		SDK_SECTION_ARENA_EX_START	=.;
600	} > arena.MAIN_EX
601
602	.arena.ITCM:
603	{
604						. = ALIGN(32);
605		SDK_SECTION_ARENA_ITCM_START	=.;
606	} > arena.ITCM
607
608	.arena.DTCM:
609	{
610						. = ALIGN(32);
611		SDK_SECTION_ARENA_DTCM_START	=.;
612	} > arena.DTCM
613
614	############################ OVERLAYDEFS ############################
615	.<PROPERTY.OVERLAYDEFS>:
616	{
617		###  <STATIC.NAME> module information
618		WRITEW ADDR(.<STATIC.NAME>);			# load address
619		WRITEW _start;					# entry address
620		WRITEW SDK_STATIC_SIZE + SDK_AUTOLOAD_SIZE;	# size of module
621		WRITEW _start_AutoloadDoneCallback;		# callback autoload done
622
623		###  overlay filename
624		<FOREACH.OVERLAYS>
625		WRITES ("<OVERLAY.NAME><PROPERTY.SUFFIX>");	# Overlay <OVERLAY.ID>
626		<END.OVERLAYS>
627
628	} > <PROPERTY.OVERLAYDEFS>
629
630
631	############################ OVERLAYTABLE ###########################
632	.<PROPERTY.OVERLAYTABLE>:
633	{
634		<FOREACH.OVERLAYS>
635		#	 Overlay <OVERLAY.ID>
636		WRITEW <OVERLAY.ID>;				# overlay ID
637		WRITEW ADDR(.<OVERLAY.NAME>);			# load address
638		WRITEW SDK_OVERLAY.<OVERLAY.NAME>.SIZE;		# size of module
639		WRITEW SDK_OVERLAY.<OVERLAY.NAME>.BSS_SIZE;	# size of bss
640		WRITEW SDK_OVERLAY.<OVERLAY.NAME>.SINIT_START;	# start address of static init
641		WRITEW SDK_OVERLAY.<OVERLAY.NAME>.SINIT_END;	# end address of static init
642		WRITEW <OVERLAY.ID>;				# ROM file ID
643		WRITEW 0;					# Reserved
644
645		<END.OVERLAYS>
646
647	} > <PROPERTY.OVERLAYTABLE>
648
649
650	############################ OTHERS #################################
651	SDK_MAIN_ARENA_LO = SDK_SECTION_ARENA_START;
652	SDK_IRQ_STACKSIZE = <STATIC.IRQSTACKSIZE>;	# allocated in DTCM
653	SDK_SYS_STACKSIZE = <STATIC.STACKSIZE>;		# when 0 means all remains of DTCM
654
655	# Module filelist
656	.binary.MODULE_FILES:
657	{
658		WRITES ("<STATIC.NAME><PROPERTY.SUFFIX>");
659		WRITES ("<PROPERTY.OVERLAYDEFS><PROPERTY.SUFFIX>");
660		WRITES ("<PROPERTY.OVERLAYTABLE><PROPERTY.SUFFIX>");
661	} > binary.MODULE_FILES
662
663	# Compression Spec List
664	.binary.COMP_SPEC_LIST:
665	{
666		<FOREACH.OVERLAYS>
667		WRITES ("<OVERLAY.NAME><PROPERTY.SUFFIX>,<OVERLAY.COMPRESS>");	# Overlay <OVERLAY.ID>
668		<END.OVERLAYS>
669	} > binary.COMP_SPEC_LIST
670
671	# ITCM/DTCM size checker => check AUTOLOAD_ITCM/DTCM
672	.check.ITCM:
673	{
674		. = . + SDK_AUTOLOAD_ITCM_SIZE + SDK_AUTOLOAD_ITCM_BSS_SIZE;
675	} > check.ITCM
676
677	SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1;
678	.check.DTCM:
679	{
680		. = . + SDK_AUTOLOAD_DTCM_SIZE + SDK_AUTOLOAD_DTCM_BSS_SIZE;
681		. = . + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN;
682	} > check.DTCM
683
684}
685