Browse Source

* Modified heap management
* Cleaned some code and resolved some warnings

git-svn-id: trunk@4528 -

Legolas 19 years ago
parent
commit
ae43d8658a
7 changed files with 376 additions and 294 deletions
  1. 21 0
      rtl/gba/dos.pp
  2. 294 284
      rtl/gba/lnkscript
  3. 6 0
      rtl/gba/sysfile.inc
  4. 2 1
      rtl/gba/sysheap.inc
  5. 18 0
      rtl/gba/system.pp
  6. 33 7
      rtl/gba/sysutils.pp
  7. 2 2
      rtl/gba/tthread.inc

+ 21 - 0
rtl/gba/dos.pp

@@ -25,6 +25,8 @@ unit Dos;
 
 interface
 
+{$MODE objfpc}
+
 type
   SearchRec = Packed Record
 	AnchorPtr : Pointer;    { Pointer to the Anchorpath structure }
@@ -48,18 +50,22 @@ implementation
 
 function dosLock(const name: String; accessmode: Longint) : LongInt;
 begin
+  result := -1;
 end;
 
 function IsLeapYear(Source : Word) : Boolean;
 begin
+  result := false;
 end;
 
 function dosSetProtection(const name: string; mask:longint): Boolean;
 begin
+  result := false;
 end;
 
 function dosSetFileDate(name: string): Boolean;
 begin
+  result := false;
 end;
 
 
@@ -69,6 +75,7 @@ end;
 
 function DosVersion: Word;
 begin
+  result := 0;
 end;
 
 procedure NewList ();
@@ -77,6 +84,7 @@ end;
 
 function CreateExtIO (size: Longint): integer;
 begin
+  result := -1;
 end;
 
 procedure DeleteExtIO ();
@@ -85,6 +93,7 @@ end;
 
 function Createport(name : PChar; pri : longint): integer;
 begin
+  result := -1;
 end;
 
 procedure DeletePort ();
@@ -94,6 +103,7 @@ end;
 
 function Create_Timer(theUnit : longint) : integer;
 begin
+  result := -1;
 end;
 
 Procedure Delete_Timer();
@@ -102,10 +112,12 @@ end;
 
 function set_new_time(secs, micro : longint): longint;
 begin
+  result := -1;
 end;
 
 function get_sys_time(): longint;
 begin
+  result := -1;
 end;
 
 procedure GetDate(Var Year, Month, MDay, WDay: Word);
@@ -141,12 +153,14 @@ end;
 
 Function DiskFree(Drive: Byte): int64;
 Begin
+  result := -1;
 end;
 
 
 
 Function DiskSize(Drive: Byte): int64;
 Begin
+  result := -1;
 end;
 
 
@@ -171,6 +185,7 @@ end;
 
 function FSearch(path: PathStr; dirlist: String) : PathStr;
 begin
+  result := '';
 end;
 
 
@@ -199,22 +214,26 @@ end;
 
 function getpathstring: string;
 begin
+  result := '';
 end;
 
 
 function EnvCount: Longint;
 begin
+  result := -1;
 end;
 
 
 function EnvStr(Index: LongInt): String;
 begin
+  result := '';
 end;
 
 
 
 function GetEnv(envvar : String): String;
 begin
+  result := '';
 end;
 
 
@@ -224,10 +243,12 @@ end;
 
 function MakeDeviceName(str : pchar): string;
 begin
+  result := '';
 end;
 
 function IsInDeviceList(str : string): boolean;
 begin
+  result := false;
 end;
 
 procedure ReadInDevices;

+ 294 - 284
rtl/gba/lnkscript

@@ -1,300 +1,310 @@
-/* (c) 2006 by devkitPro (http://www.devkitpro.org) */
+/* Linker Script Original v1.3 by Jeff Frohwein     */
+/*  v1.0 - Original release                         */
+/*  v1.1 - Added proper .data section support       */
+/*  v1.2 - Added support for c++ & iwram overlays   */
+/*       - Major contributions by Jason Wilkins.    */
+/*  v1.3 - .ewram section now can be used when      */
+/*         compiling for MULTIBOOT mode. This fixes */
+/*         malloc() in DevKitAdvance which depends  */
+/*         on __eheap_start instead of end to define*/
+/*         the starting location of heap space.     */
+/*         External global variable __gba_iwram_heap*/
+/*         support added to allow labels end, _end, */
+/*         & __end__ to point to end of iwram or    */
+/*         the end of ewram.                        */
+/*	Additions by WinterMute				*/
+/* v1.4 -	.sbss section added for unitialised	*/
+/*		    data in ewram 			*/
+/* v1.5 -	padding section added to stop EZF 	*/
+/*		    stripping important data		*/
+
+/* This file is released into the public domain		*/
+/* for commercial or non-commercial use with no		*/
+/* restrictions placed upon it.				*/
+
+/* NOTE!!!: This linker script defines the RAM &  */
+/*   ROM start addresses. In order for it to work */
+/*   properly, remove -Ttext and -Tbss linker     */
+/*   options from your makefile if they are       */
+/*   present.                                     */
+
+/* You can use the following to view section      */
+/* addresses in your .elf file:                   */
+/*   objdump -h file.elf                          */
+/* Please note that empty sections may incorrectly*/
+/* list the lma address as the vma address for    */
+/* some versions of objdump.                      */
 
 OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
 OUTPUT_ARCH(arm)
 ENTRY(_start)
+/* SEARCH_DIR(/bin/arm); */
 
-
-
+/* The linker script function "var1 += var2;" sometimes    */
+/* reports incorrect values in the *.map file but the      */
+/* actual value it calculates is usually, if not always,   */
+/* correct. If you leave out the ". = ALIGN(4);" at the    */
+/* end of each section then the return value of SIZEOF()   */
+/* is sometimes incorrect and "var1 += var2;" appears to   */
+/* not work as well. "var1 += var2" style functions are    */
+/* avoided below as a result.                              */
 
 MEMORY {
-   rom     : ORIGIN = 0x08000000, LENGTH = 32M
-   iwram   : ORIGIN = 0x03000000, LENGTH = 32K
-   ewram   : ORIGIN = 0x02000000, LENGTH = 256K
-}
-
-__text_start     =   0x8000000;
-__eheap_end      =   0x2040000;
-__iwram_start    =   0x3000000;
-__iwram_end      =   0x3008000;
 
-__sp_irq         =   __iwram_end - 0x100;
-__sp_usr         =   __sp_irq - 0x100;
+	rom		: ORIGIN = 0x08000000, LENGTH = 32M
+	iwram	: ORIGIN = 0x03000000, LENGTH = 32K
+	ewram	: ORIGIN = 0x02000000, LENGTH = 256K
+}
 
+/*
+__text_start 		=	0x8000000;
+__eheap_end			=	0x2040000;
+__iwram_start		=	0x3000000;
+__iwram_end			=	0x3008000;
+
+__sp_irq			=	__iwram_end - 0x100;
+__sp_usr			=	__sp_irq - 0x100;
+*/
+__text_start  = ORIGIN(rom);
+/* __eheap_end   = ORIGIN(ewram) + 0x40000; */
+__eheap_end   = ORIGIN(ewram) + LENGTH(ewram);
+__iwram_start	= ORIGIN(iwram);
+/* __iwram_end   = ORIGIN(iwram) + 0x8000; */
+__iwram_end   = ORIGIN(iwram) + LENGTH(iwram); 
+__sp_irq      = __iwram_end - 0x100;
+__sp_usr      = __sp_irq - 0x100;
 
 
 SECTIONS
 {
-
-   . = __text_start;
-   .init :
-   {
-      KEEP (*(.init))
-      . = ALIGN(4);
-   } >rom =0xff
-
-   .plt :
-   {
-      *(.plt)
-      . = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
-   } >rom
-
-   .text :   /* ALIGN (4): */
-   {
-      *(EXCLUDE_FILE (*.iwram*) .text)
-      *(.text.*)
-      *(.stub)
-      /* .gnu.warning sections are handled specially by elf32.em.  */
-      *(.gnu.warning)
-      *(.gnu.linkonce.t*)
-      *(.glue_7)
-      *(.glue_7t)
-      . = ALIGN(4);  /* REQUIRED. LD is flaky without it. */
-   } >rom = 0xff
-
-   __text_end = .;
-   .fini           :
-   {
-      KEEP (*(.fini))
-      . = ALIGN(4);  /* REQUIRED. LD is flaky without it. */
-   } >rom =0
-
-
-
-
-   .rodata :
-   {
-      *(.rodata)
-      *all.rodata*(*)
-      *(.roda)
-      *(.rodata.*)
-/************************************************************ FL: Attempt n.2 */      
-/*       *(.data.*)  				Moved here from EWRAM because size matters */    
-      *(.gnu.linkonce.r*)
-      SORT(CONSTRUCTORS)
-      . = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
-   } >rom = 0xff
-
-   .ctors :
-   {
-      /*   gcc uses crtbegin.o to find the start of the constructors, so
-         we make sure it is first.  Because this is a wildcard, it
-         doesn't matter if the user does not actually link against
-         crtbegin.o; the linker won't look for a file to match a
-         wildcard.  The wildcard also means that it doesn't matter which
-         directory crtbegin.o is in.  */
-      KEEP (*crtbegin.o(.ctors))
-      KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
-      KEEP (*(SORT(.ctors.*)))
-      KEEP (*(.ctors))
-      . = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
+	. = __text_start;
+	.init :
+	{
+		KEEP (*(.init))
+		. = ALIGN(4);
+	} >rom =0xff
+
+	.plt :
+	{
+		*(.plt)
+		. = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
+	} >rom
+
+	.text  :   /* ALIGN (4): */
+	{
+		*(EXCLUDE_FILE (*.iwram*) .text)
+		*(.text.*)
+		*(.stub)
+		/* .gnu.warning sections are handled specially by elf32.em.  */
+		*(.gnu.warning)
+		*(.gnu.linkonce.t*)
+		*(.glue_7)
+		*(.glue_7t)
+		. = ALIGN(4);  /* REQUIRED. LD is flaky without it. */
+	} >rom = 0xff
+
+	__text_end = .;
+	.fini           :
+	{
+		KEEP (*(.fini))
+		. = ALIGN(4);  /* REQUIRED. LD is flaky without it. */
+	} >rom =0
+
+	.rodata :
+	{
+		*(.rodata)
+		*all.rodata*(*)
+		*(.roda)
+		*(.rodata.*)
+		*(.gnu.linkonce.r*)
+		SORT(CONSTRUCTORS)
+		. = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
+	} >rom = 0xff
+
+	.ctors :
+	{
+		/*	gcc uses crtbegin.o to find the start of the constructors, so
+			we make sure it is first.  Because this is a wildcard, it
+			doesn't matter if the user does not actually link against
+			crtbegin.o; the linker won't look for a file to match a
+			wildcard.  The wildcard also means that it doesn't matter which
+			directory crtbegin.o is in.  */
+		KEEP (*crtbegin.o(.ctors))
+		KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+		KEEP (*(SORT(.ctors.*)))
+		KEEP (*(.ctors))
+		. = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
   } >rom = 0
 
-   .dtors :
-   {
-      KEEP (*crtbegin.o(.dtors))
-      KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
-      KEEP (*(SORT(.dtors.*)))
-      KEEP (*(.dtors))
-      . = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
-   } >rom = 0
-
-   .jcr            : { KEEP (*(.jcr)) } >rom
-
-   .eh_frame :
-   {
-      KEEP (*(.eh_frame))
-      . = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
-   } >rom = 0
-
-   .gcc_except_table :
-   {
-      *(.gcc_except_table)
-      . = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
-   } >rom = 0
-
-
-
-/************************************************************* FL: Attempt n.2
-	__data_lma = . + SIZEOF(.gcc_except_table) ; 
-
-	.data ALIGN(4) : AT (__data_lma) 
-	{ 
-		__data_start = ABSOLUTE(.); 
-		*(.data) 
-		*(.data.*) 
-		*(.gnu.linkonce.d*) 
-		CONSTRUCTORS 
-		. = ALIGN(4); 
-	} >rom = 0xff 
+	.dtors :
+	{
+		KEEP (*crtbegin.o(.dtors))
+		KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+		KEEP (*(SORT(.dtors.*)))
+		KEEP (*(.dtors))
+		. = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
+	} >rom = 0
+
+	.jcr            : { KEEP (*(.jcr)) } >rom 
+
+	.eh_frame :
+	{
+		KEEP (*(.eh_frame))
+		. = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
+	} >rom = 0
+
+	.gcc_except_table :
+	{
+		*(.gcc_except_table)
+		. = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
+	} >rom = 0
+
+	__iwram_lma = .;
+
+	.iwram __iwram_start : AT (__iwram_lma)
+	{
+		__iwram_start = ABSOLUTE(.) ;
+		*(.iwram)
+		*iwram.*(.text)
+		. = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
+	} >iwram = 0xff
+
+	__data_lma = __iwram_lma + SIZEOF(.iwram) ;
+	__iwram_end = . ;
+
+	.bss ALIGN(4) :
+	{
+		__bss_start = ABSOLUTE(.);
+		__bss_start__ = ABSOLUTE(.);
+		*(.dynbss)
+		*(.gnu.linkonce.b*)
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);    /* REQUIRED. LD is flaky without it. */
+	} >iwram
+
+	__bss_end = . ;
+	__bss_end__ = . ;
+
+	.data ALIGN(4) : AT (__data_lma)
+	{
+		__data_start = ABSOLUTE(.);
+		*(.data)
+		*(.data.*)
+		*(.gnu.linkonce.d*)
+		CONSTRUCTORS
+		. = ALIGN(4);
+	} >iwram = 0xff
+
+	__iwram_overlay_lma = __data_lma + SIZEOF(.data);
+
+	__data_end  =  .;
+	__iwram_overlay_start = . ;
+
+	OVERLAY ALIGN(4) : NOCROSSREFS AT (__iwram_overlay_lma)
+	{
+		.iwram0 { *(.iwram0) . = ALIGN(4);}
+		.iwram1 { *(.iwram1) . = ALIGN(4);}
+		.iwram2 { *(.iwram2) . = ALIGN(4);}
+		.iwram3 { *(.iwram3) . = ALIGN(4);}
+		.iwram4 { *(.iwram4) . = ALIGN(4);}
+		.iwram5 { *(.iwram5) . = ALIGN(4);}
+		.iwram6 { *(.iwram6) . = ALIGN(4);}
+		.iwram7 { *(.iwram7) . = ALIGN(4);}
+		.iwram8 { *(.iwram8) . = ALIGN(4);}
+		.iwram9 { *(.iwram9) . = ALIGN(4);}
+	}>iwram = 0xff
+
+	__ewram_lma = LOADADDR(.iwram0) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9);
+
+	__iwram_overlay_end = . ;
+	__iheap_start = . ;
+
+	__ewram_start = 0x2000000;
+	.ewram __ewram_start : AT (__ewram_lma)
+	{
+		*(.ewram)
+		. = ALIGN(4);  /* REQUIRED. LD is flaky without it. */
+	}>ewram = 0xff
+
+	__ewram_overlay_lma = __ewram_lma + SIZEOF(.ewram);
+
+	.sbss ALIGN(4):
+ 	{
+		__sbss_start = ABSOLUTE(.);
+ 		*(.sbss)
+ 		. = ALIGN(4);
+ 	} >ewram
 	
-	__data_end  =  .; 
-*********************************************/
-
-
-
-
-
-
-   __iwram_lma = .;
-
-   .iwram __iwram_start : AT (__iwram_lma)
-   {
-      __iwram_start = ABSOLUTE(.) ;
-      *(.iwram)
-      *iwram.*(.text)
-      . = ALIGN(4);   /* REQUIRED. LD is flaky without it. */
-   } >iwram = 0xff
-
-   __iwram_end = . ;
-
-   .bss ALIGN(4) :
-   {
-      __bss_start = ABSOLUTE(.);
-      __bss_start__ = ABSOLUTE(.);
-      *(.dynbss)
-      *(.gnu.linkonce.b*)
-      *(.bss*)
-      *(COMMON)
-      . = ALIGN(4);    /* REQUIRED. LD is flaky without it. */
-   } >iwram
-
-   __bss_end = . ;
-   __bss_end__ = . ;
-
-
-   __iwram_overlay_lma = __iwram_lma + SIZEOF(.iwram);
-
-   __iwram_overlay_start = . ;
-
-   OVERLAY ALIGN(4) : NOCROSSREFS AT (__iwram_overlay_lma)
-   {
-      .iwram0 { *(.iwram0) . = ALIGN(4);}
-      .iwram1 { *(.iwram1) . = ALIGN(4);}
-      .iwram2 { *(.iwram2) . = ALIGN(4);}
-      .iwram3 { *(.iwram3) . = ALIGN(4);}
-      .iwram4 { *(.iwram4) . = ALIGN(4);}
-      .iwram5 { *(.iwram5) . = ALIGN(4);}
-      .iwram6 { *(.iwram6) . = ALIGN(4);}
-      .iwram7 { *(.iwram7) . = ALIGN(4);}
-      .iwram8 { *(.iwram8) . = ALIGN(4);}
-      .iwram9 { *(.iwram9) . = ALIGN(4);}
-   }>iwram = 0xff
-
-
-
-
-   __ewram_lma = LOADADDR(.iwram0) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9);
-
-   __iwram_overlay_end = . ;
-   __iheap_start = . ;
-
-   __ewram_start = 0x2000000;
-   .ewram __ewram_start : AT (__ewram_lma)
-   {
-      *(.ewram)
-      . = ALIGN(4);  /* REQUIRED. LD is flaky without it. */
-   }>ewram = 0xff
-
-
-
-   __data_lma = __ewram_lma + SIZEOF(.ewram) ;
-
-   .data ALIGN(4) : AT (__data_lma)
-   {
-      __data_start = ABSOLUTE(.);
-      *(.data)    /****************************************** FL: Attempt n.2 */
-      *(.data.*)  /* Moved to RODATA for size matters */
-      *(.gnu.linkonce.d*)
-      CONSTRUCTORS
-      . = ALIGN(4);
-   } >ewram = 0xff
-
-   __data_end  =  .;
-
-   __ewram_overlay_lma = __data_lma + SIZEOF(.data);
-
-
-
-   .sbss ALIGN(4):
-    {
-      __sbss_start = ABSOLUTE(.);
-       *(.sbss)
-       . = ALIGN(4);
-    } >ewram
-   
-   __sbss_end  = .;
-
-   __ewram_end = . ;
-   __ewram_overlay_start = . ;
-
-   OVERLAY ALIGN(4): NOCROSSREFS AT (__ewram_overlay_lma)
-   {
-      .ewram0 { *(.ewram0) . = ALIGN(4);}
-      .ewram1 { *(.ewram1) . = ALIGN(4);}
-      .ewram2 { *(.ewram2) . = ALIGN(4);}
-      .ewram3 { *(.ewram3) . = ALIGN(4);}
-      .ewram4 { *(.ewram4) . = ALIGN(4);}
-      .ewram5 { *(.ewram5) . = ALIGN(4);}
-      .ewram6 { *(.ewram6) . = ALIGN(4);}
-      .ewram7 { *(.ewram7) . = ALIGN(4);}
-      .ewram8 { *(.ewram8) . = ALIGN(4);}
-      .ewram9 { *(.ewram9) . = ALIGN(4);}
-   }>ewram = 0xff
-
-   __pad_lma = LOADADDR(.ewram0) + SIZEOF(.ewram0)+SIZEOF(.ewram1)+SIZEOF(.ewram2)+SIZEOF(.ewram3)+SIZEOF(.ewram4)+SIZEOF(.ewram5)+SIZEOF(.ewram6)+SIZEOF(.ewram7)+SIZEOF(.ewram8)+SIZEOF(.ewram9);
-
-   /* EZF Advance strips trailing 0xff bytes, add a pad section so nothing important is removed */
-   .pad ALIGN(4) : AT (__pad_lma)
-   {
-      LONG(0x52416b64)
-      LONG(0x4d)
-      . = ALIGN(4);  /* REQUIRED. LD is flaky without it. */
-   } = 0xff
-
-   __ewram_overlay_end = . ;
-   __eheap_start = . ;
-
-   _end = .;
-   __end__ = _end ; /* v1.3 */
-   PROVIDE (end = _end); /* v1.3 */
-
-
-
-
-   /* Stabs debugging sections.  */
-   .stab 0 : { *(.stab) }
-   .stabstr 0 : { *(.stabstr) }
-   .stab.excl 0 : { *(.stab.excl) }
-   .stab.exclstr 0 : { *(.stab.exclstr) }
-   .stab.index 0 : { *(.stab.index) }
-   .stab.indexstr 0 : { *(.stab.indexstr) }
-   .comment 0 : { *(.comment) }
-   /*   DWARF debug sections.
-      Symbols in the DWARF debugging sections are relative to the beginning
-      of the section so we begin them at 0.  */
-   /* DWARF 1 */
-   .debug          0 : { *(.debug) }
-   .line           0 : { *(.line) }
-   /* GNU DWARF 1 extensions */
-   .debug_srcinfo  0 : { *(.debug_srcinfo) }
-   .debug_sfnames  0 : { *(.debug_sfnames) }
-   /* DWARF 1.1 and DWARF 2 */
-   .debug_aranges  0 : { *(.debug_aranges) }
-   .debug_pubnames 0 : { *(.debug_pubnames) }
-   /* DWARF 2 */
-   .debug_info     0 : { *(.debug_info) }
-   .debug_abbrev   0 : { *(.debug_abbrev) }
-   .debug_line     0 : { *(.debug_line) }
-   .debug_frame    0 : { *(.debug_frame) }
-   .debug_str      0 : { *(.debug_str) }
-   .debug_loc      0 : { *(.debug_loc) }
-   .debug_macinfo  0 : { *(.debug_macinfo) }
-   /* SGI/MIPS DWARF 2 extensions */
-   .debug_weaknames 0 : { *(.debug_weaknames) }
-   .debug_funcnames 0 : { *(.debug_funcnames) }
-   .debug_typenames 0 : { *(.debug_typenames) }
-   .debug_varnames  0 : { *(.debug_varnames) }
-   .stack 0x80000 : { _stack = .; *(.stack) }
-   /* These must appear regardless of  .  */
-} 
+	__sbss_end  = .;
+
+	__ewram_end = . ;
+	__ewram_overlay_start = . ;
+
+	OVERLAY ALIGN(4): NOCROSSREFS AT (__ewram_overlay_lma)
+	{
+		.ewram0 { *(.ewram0) . = ALIGN(4);}
+		.ewram1 { *(.ewram1) . = ALIGN(4);}
+		.ewram2 { *(.ewram2) . = ALIGN(4);}
+		.ewram3 { *(.ewram3) . = ALIGN(4);}
+		.ewram4 { *(.ewram4) . = ALIGN(4);}
+		.ewram5 { *(.ewram5) . = ALIGN(4);}
+		.ewram6 { *(.ewram6) . = ALIGN(4);}
+		.ewram7 { *(.ewram7) . = ALIGN(4);}
+		.ewram8 { *(.ewram8) . = ALIGN(4);}
+		.ewram9 { *(.ewram9) . = ALIGN(4);}
+	}>ewram = 0xff
+
+	__pad_lma = LOADADDR(.ewram0) + SIZEOF(.ewram0)+SIZEOF(.ewram1)+SIZEOF(.ewram2)+SIZEOF(.ewram3)+SIZEOF(.ewram4)+SIZEOF(.ewram5)+SIZEOF(.ewram6)+SIZEOF(.ewram7)+SIZEOF(.ewram8)+SIZEOF(.ewram9);
+
+	/* EZF Advance strips trailing 0xff bytes, add a pad section so nothing important is removed */
+	.pad ALIGN(4) : AT (__pad_lma)
+	{
+		LONG(0x52416b64)
+		LONG(0x4d)
+		. = ALIGN(4);  /* REQUIRED. LD is flaky without it. */
+	} = 0xff
+
+	__ewram_overlay_end = . ;
+	__eheap_start = . ;
+
+	_end = .;
+	__end__ = _end ; /* v1.3 */
+	PROVIDE (end = _end); /* v1.3 */
+
+	/* Stabs debugging sections.  */
+	.stab 0 : { *(.stab) }
+	.stabstr 0 : { *(.stabstr) }
+	.stab.excl 0 : { *(.stab.excl) }
+	.stab.exclstr 0 : { *(.stab.exclstr) }
+	.stab.index 0 : { *(.stab.index) }
+	.stab.indexstr 0 : { *(.stab.indexstr) }
+	.comment 0 : { *(.comment) }
+	/*	DWARF debug sections.
+		Symbols in the DWARF debugging sections are relative to the beginning
+		of the section so we begin them at 0.  */
+	/* DWARF 1 */
+	.debug          0 : { *(.debug) }
+	.line           0 : { *(.line) }
+	/* GNU DWARF 1 extensions */
+	.debug_srcinfo  0 : { *(.debug_srcinfo) }
+	.debug_sfnames  0 : { *(.debug_sfnames) }
+	/* DWARF 1.1 and DWARF 2 */
+	.debug_aranges  0 : { *(.debug_aranges) }
+	.debug_pubnames 0 : { *(.debug_pubnames) }
+	/* DWARF 2 */
+	.debug_info     0 : { *(.debug_info) }
+	.debug_abbrev   0 : { *(.debug_abbrev) }
+	.debug_line     0 : { *(.debug_line) }
+	.debug_frame    0 : { *(.debug_frame) }
+	.debug_str      0 : { *(.debug_str) }
+	.debug_loc      0 : { *(.debug_loc) }
+	.debug_macinfo  0 : { *(.debug_macinfo) }
+	/* SGI/MIPS DWARF 2 extensions */
+	.debug_weaknames 0 : { *(.debug_weaknames) }
+	.debug_funcnames 0 : { *(.debug_funcnames) }
+	.debug_typenames 0 : { *(.debug_typenames) }
+	.debug_varnames  0 : { *(.debug_varnames) }
+	.stack 0x80000 : { _stack = .; *(.stack) }
+	/* These must appear regardless of  .  */
+}

+ 6 - 0
rtl/gba/sysfile.inc

@@ -37,14 +37,17 @@ end;
 
 function do_write(h: longint; addr: pointer; len: longint) : longint;
 begin
+  result := -1;
 end;
 
 function do_read(h: longint; addr: pointer; len: longint) : longint;
 begin
+  result := -1;
 end;
 
 function do_filepos(handle: longint) : longint;
 begin
+  result := -1;
 end;
 
 procedure do_seek(handle, pos: longint);
@@ -53,10 +56,12 @@ end;
 
 function do_seekend(handle: longint):longint;
 begin
+  result := -1;
 end;
 
 function do_filesize(handle : longint) : longint;
 begin
+  result := -1;
 end;
 
 { truncate at a given position }
@@ -70,5 +75,6 @@ end;
 
 function do_isdevice(handle: longint): boolean;
 begin
+  result := false;
 end;
 

+ 2 - 1
rtl/gba/sysheap.inc

@@ -17,9 +17,10 @@
       OS Memory allocation / deallocation
  ****************************************************************************}
 
+
 function SysOSAlloc(size: ptrint): pointer;
 begin
-
+  result := pointer($02000000);
 end;
 
 { $define HAS_SYSOSFREE}

+ 18 - 0
rtl/gba/system.pp

@@ -110,6 +110,24 @@ begin
 end;
 
 
+procedure InitHeap;
+begin
+  FillChar(freelists_fixed,sizeof(tfreelists),0);
+  FillChar(freelists_free_chunk,sizeof(freelists_free_chunk),0);
+
+  freelist_var:=nil;
+  {The GBA has no operating system from which we ask memory, so we
+   initialize the heap with a single block of memory.}
+  freeoslistcount:=1;
+  freeoslist:=pointer($2040000);
+  fillchar(freeoslist^,sizeof(freeoslist^),0);
+  freeoslist^.size:=$40000; {GBA heap is $40000 bytes.}
+  fillchar(internal_status,sizeof(internal_status),0);
+end;
+
+
+
+
 begin
   StackLength := CheckInitialStkLen(InitialStkLen);
   StackBottom := Sptr - StackLength;

+ 33 - 7
rtl/gba/sysutils.pp

@@ -34,7 +34,8 @@ interface
 
 implementation
 
-uses dos, sysconst;
+uses 
+  dos, sysconst;
 
 { Include platform independent implementation part }
 {$i sysutils.inc}
@@ -45,45 +46,54 @@ uses dos, sysconst;
 ****************************************************************************}
 function FileOpen(const FileName: string; Mode: Integer): LongInt;
 begin
+  result := -1;
 end;
 
 
 function FileGetDate(Handle: LongInt) : LongInt;
 begin
+  result := -1;
 end;
 
 
 function FileSetDate(Handle, Age: LongInt) : LongInt;
 begin
+  result := -1;
 end;
 
 
 function FileCreate(const FileName: string) : LongInt;
 begin
+  result := -1;
 end;
 
 
 function FileCreate(const FileName: string; Mode: integer): LongInt;
 begin
+  result := -1;
 end;
 
 
 function FileRead(Handle: LongInt; var Buffer; Count: LongInt): LongInt;
 begin
+  result := -1;
 end;
 
 
 function FileWrite(Handle: LongInt; const Buffer; Count: LongInt): LongInt;
 begin
+  result := -1;
 end;
 
 
 function FileSeek(Handle, FOffset, Origin: LongInt) : LongInt;
 begin
+  result := -1;
 end;
 
 function FileSeek(Handle: LongInt; FOffset, Origin: Int64): Int64;
 begin
+  result := -1;
 end;
 
 
@@ -94,16 +104,19 @@ end;
 
 function FileTruncate(Handle, Size: LongInt): Boolean;
 begin
+  result := false;
 end;
 
 
 function DeleteFile(const FileName: string) : Boolean;
 begin
+  result := false;
 end;
 
 
 function RenameFile(const OldName, NewName: string): Boolean;
 begin
+  result := false;
 end;
 
 
@@ -112,22 +125,26 @@ end;
 
 Function FileAge (Const FileName : String): Longint;
 begin
+  result := -1;
 end;
 
 
 Function FileExists (Const FileName : String) : Boolean;
 Begin
+  result := false;
 end;
 
 
 
 Function FindFirst (Const Path : String; Attr : Longint; Out Rslt : TSearchRec) : Longint;
 begin
+  result := -1;
 end;
 
 
 Function FindNext (Var Rslt : TSearchRec) : Longint;
 begin
+  result := -1;
 end;
 
 Procedure FindClose (Var F : TSearchrec);
@@ -136,13 +153,13 @@ end;
 
 Function FileGetAttr (Const FileName : String) : Longint;
 begin
-
+  result := -1;
 end;
 
 
 Function FileSetAttr (Const Filename : String; Attr: longint) : Longint;
 begin
-
+  result := -1;
 end;
 
 
@@ -160,39 +177,43 @@ end;
 
 Function DiskFree(Drive: Byte): int64;
 Begin
-
+  result := -1;
 End;
 
 
 Function DiskSize(Drive: Byte): int64;
 Begin
-
+  result := -1;
 End;
 
 
 Function GetCurrentDir : String;
 begin
-
+  result := '';
 end;
 
 
 Function SetCurrentDir (Const NewDir : String) : Boolean;
 begin
+  result := false;
 end;
 
 
 Function CreateDir (Const NewDir : String) : Boolean;
 begin
+  result := false;
 end;
 
 
 Function RemoveDir (Const Dir : String) : Boolean;
 begin
+  result := false;
 end;
 
 
 function DirectoryExists(const Directory: string): Boolean;
 begin
+  result := false;
 end;
 
 
@@ -216,9 +237,9 @@ end ;
 
 
 function SysErrorMessage(ErrorCode: Integer): String;
-
 begin
 {  Result:=StrError(ErrorCode);}
+  result := '';
 end;
 
 {****************************************************************************
@@ -227,23 +248,28 @@ end;
 
 Function GetEnvironmentVariable(Const EnvVar : String) : String;
 begin
+  result := '';
 end;
 
 Function GetEnvironmentVariableCount : Integer;
 begin
+  result := -1;
 end;
 
 Function GetEnvironmentString(Index : Integer) : String;
 begin
+  result := '';
 end;
 
 function ExecuteProcess (const Path: AnsiString; const ComLine: AnsiString): integer;
 begin
+  result := -1;
 end;
 
 function ExecuteProcess (const Path: AnsiString;
                                   const ComLine: array of AnsiString): integer;
 begin
+  result := -1;
 end;
 
 

+ 2 - 2
rtl/gba/tthread.inc

@@ -42,7 +42,7 @@ end;
 
 function TThread.GetPriority: TThreadPriority;
 begin
-
+  result := tpNormal;
 end;
 
 
@@ -106,7 +106,7 @@ end;
 
 function TThread.WaitFor: Integer;
 begin
-
+  result := -1;
 end;