From ae43d8658aedd796d20400a878af4fda8e7841aa Mon Sep 17 00:00:00 2001 From: Legolas Date: Fri, 1 Sep 2006 17:53:02 +0000 Subject: [PATCH] * Modified heap management * Cleaned some code and resolved some warnings git-svn-id: trunk@4528 - --- rtl/gba/dos.pp | 21 ++ rtl/gba/lnkscript | 538 ++++++++++++++++++++++---------------------- rtl/gba/sysfile.inc | 6 + rtl/gba/sysheap.inc | 3 +- rtl/gba/system.pp | 18 ++ rtl/gba/sysutils.pp | 40 +++- rtl/gba/tthread.inc | 4 +- 7 files changed, 356 insertions(+), 274 deletions(-) diff --git a/rtl/gba/dos.pp b/rtl/gba/dos.pp index 7a36114690..7e7213b6b9 100644 --- a/rtl/gba/dos.pp +++ b/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; diff --git a/rtl/gba/lnkscript b/rtl/gba/lnkscript index d74ef60ebe..6cfc733459 100644 --- a/rtl/gba/lnkscript +++ b/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 + + 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 = 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 - . = __text_start; - .init : - { - KEEP (*(.init)) - . = ALIGN(4); - } >rom =0xff + .plt : + { + *(.plt) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >rom - .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 : /* 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 - __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 - - - - .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. */ + .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 + .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 + .jcr : { KEEP (*(.jcr)) } >rom - .eh_frame : - { - KEEP (*(.eh_frame)) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } >rom = 0 + .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 + .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 -/************************************************************* FL: Attempt n.2 - __data_lma = . + SIZEOF(.gcc_except_table) ; + __data_lma = __iwram_lma + SIZEOF(.iwram) ; + __iwram_end = . ; - .data ALIGN(4) : AT (__data_lma) - { - __data_start = ABSOLUTE(.); - *(.data) - *(.data.*) - *(.gnu.linkonce.d*) - CONSTRUCTORS - . = ALIGN(4); - } >rom = 0xff + .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 = .; -*********************************************/ + __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 = . ; - __iwram_lma = .; + _end = .; + __end__ = _end ; /* v1.3 */ + PROVIDE (end = _end); /* v1.3 */ - .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 . */ -} + /* 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 . */ +} diff --git a/rtl/gba/sysfile.inc b/rtl/gba/sysfile.inc index 7b0026dd91..9e6f9bd225 100644 --- a/rtl/gba/sysfile.inc +++ b/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; diff --git a/rtl/gba/sysheap.inc b/rtl/gba/sysheap.inc index 84f480c04f..46ab8829c2 100644 --- a/rtl/gba/sysheap.inc +++ b/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} diff --git a/rtl/gba/system.pp b/rtl/gba/system.pp index a187a204c8..96549d9104 100644 --- a/rtl/gba/system.pp +++ b/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; diff --git a/rtl/gba/sysutils.pp b/rtl/gba/sysutils.pp index ecf07a46de..79feeffa22 100644 --- a/rtl/gba/sysutils.pp +++ b/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; diff --git a/rtl/gba/tthread.inc b/rtl/gba/tthread.inc index 5c1da8c72d..e2756946bf 100644 --- a/rtl/gba/tthread.inc +++ b/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;