Browse Source

* some small changes in the stack
* cleaned redundant code in prt0.as
+ added cprt0.as for libc and libgcc linking

git-svn-id: trunk@5543 -

Legolas 18 years ago
parent
commit
f766a739f1
5 changed files with 265 additions and 14 deletions
  1. 1 0
      .gitattributes
  2. 4 2
      rtl/gba/Makefile.fpc
  3. 254 0
      rtl/gba/cprt0.as
  4. 0 9
      rtl/gba/prt0.as
  5. 6 3
      rtl/gba/system.pp

+ 1 - 0
.gitattributes

@@ -4477,6 +4477,7 @@ rtl/freebsd/x86_64/prt0.as -text
 rtl/gba/Makefile svneol=native#text/plain
 rtl/gba/Makefile.fpc svneol=native#text/plain
 rtl/gba/classes.pp svneol=native#text/plain
+rtl/gba/cprt0.as -text
 rtl/gba/dos.pp svneol=native#text/plain
 rtl/gba/gbabios.inc svneol=native#text/plain
 rtl/gba/gbabiosh.inc svneol=native#text/plain

+ 4 - 2
rtl/gba/Makefile.fpc

@@ -6,7 +6,7 @@
 main=rtl
 
 [target]
-loaders=prt0
+loaders=prt0 cprt0
 units=$(SYSTEMUNIT) objpas macpas strings \
 #      dos \
       sysutils \
@@ -16,7 +16,7 @@ units=$(SYSTEMUNIT) objpas macpas strings \
 #      exec timer doslib utility hardware inputevent graphics layers \
 # these can be moved to packages later
 #      clipboard datatypes asl ahi tinygl get9 muihelper \
-rsts=math rtlconsts varutils typinfo variants classes sysconst dateutil
+#rsts=math rtlconsts varutils typinfo variants classes sysconst dateutil
 
 [require]
 nortl=y
@@ -77,6 +77,8 @@ SYSDEPS=$(SYSINCDEPS) $(SYSCPUDEPS)
 prt0$(OEXT) : prt0.as
         $(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)prt0$(OEXT) prt0.as
 
+cprt0$(OEXT) : cprt0.as
+        $(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)cprt0$(OEXT) cprt0.as
 
 #
 # Base Units (System, strings, os-dependent-base-unit)

+ 254 - 0
rtl/gba/cprt0.as

@@ -0,0 +1,254 @@
+@ (c) 2006 by devkitPro (http://www.devkitpro.org)
+
+
+	.section	".init"
+	.global     _start
+	.align
+	.arm
+@---------------------------------------------------------------------------------
+_start:
+@---------------------------------------------------------------------------------
+	b	rom_header_end
+
+	.fill   156,1,0			@ Nintendo Logo Character Data (8000004h)
+	.fill	16,1,0			  @ Game Title
+	.byte   0x30,0x31		@ Maker Code (80000B0h)
+	.byte   0x96			  @ Fixed Value (80000B2h)
+	.byte   0x00			  @ Main Unit Code (80000B3h)
+	.byte   0x00			  @ Device Type (80000B4h)
+	.fill	7,1,0			    @ unused
+	.byte	0x00			    @ Software Version No (80000BCh)
+	.byte	0xf0			    @ Complement Check (80000BDh)
+	.byte	0x00,0x00    	@ Checksum (80000BEh)
+
+@---------------------------------------------------------------------------------
+rom_header_end:
+@---------------------------------------------------------------------------------
+	b	start_vector			@ This branch must be here for proper
+						@ positioning of the following header.
+
+	.GLOBAL	__boot_method, __slave_number
+@---------------------------------------------------------------------------------
+__boot_method:
+@---------------------------------------------------------------------------------
+	.byte   0				@ boot method (0=ROM boot, 3=Multiplay boot)
+@---------------------------------------------------------------------------------
+__slave_number:
+@---------------------------------------------------------------------------------
+	.byte   0				@ slave # (1=slave#1, 2=slave#2, 3=slave#3)
+
+	.byte   0 				@ reserved
+	.byte   0 				@ reserved
+	.word   0    				@ reserved
+	.word   0				@ reserved
+	.word   0    				@ reserved
+	.word   0    				@ reserved
+	.word   0    				@ reserved
+	.word   0    				@ reserved
+
+    .global     start_vector
+    .align
+@---------------------------------------------------------------------------------
+start_vector:
+@---------------------------------------------------------------------------------
+	mov	r0, #0x4000000			@ REG_BASE
+	str	r0, [r0, #0x208]
+
+	mov	r0, #0x12			@ Switch to IRQ Mode
+	msr	cpsr, r0
+	ldr	sp, =__sp_irq			@ Set IRQ stack
+	mov	r0, #0x1f			@ Switch to System Mode
+	msr	cpsr, r0
+	ldr	sp, =__sp_usr			@ Set user stack
+
+@---------------------------------------------------------------------------------
+@ Enter Thumb mode
+@---------------------------------------------------------------------------------
+	add	r0, pc, #1
+	bx	r0
+
+	.thumb
+
+	ldr	r0, =__text_start
+	lsl	r0, #5				@ Was code compiled at 0x08000000 or higher?
+	bcs     DoEWRAMClear			@ yes, you can not run it in external WRAM
+
+	mov     r0, pc
+	lsl     r0, #5				@ Are we running from ROM (0x8000000 or higher) ?
+	bcc     SkipEWRAMClear			@ No, so no need to do a copy.
+
+@---------------------------------------------------------------------------------
+@ We were started in ROM, silly emulators. :P
+@ So we need to copy to ExWRAM.
+@---------------------------------------------------------------------------------
+	mov	r2, #2
+	lsl	r2, r2, #24			@ r2= 0x02000000
+	ldr	r3, =__end__			@ last ewram address
+	sub	r3, r2				@ r3= actual binary size
+	mov	r6, r2				@ r6= 0x02000000
+	lsl	r1, r2, #2			@ r1= 0x08000000 
+
+	bl	CopyMem
+
+	bx	r6				@ Jump to the code to execute
+
+@---------------------------------------------------------------------------------
+DoEWRAMClear:					@ Clear External WRAM to 0x00
+@---------------------------------------------------------------------------------
+	mov	r1, #0x40
+	lsl	r1, #12				@ r1 = 0x40000
+	lsl	r0, r1, #7			@ r0 = 0x2000000
+	bl	ClearMem
+
+@---------------------------------------------------------------------------------
+SkipEWRAMClear:					@ Clear Internal WRAM to 0x00
+@---------------------------------------------------------------------------------
+
+@---------------------------------------------------------------------------------
+@ Clear BSS section to 0x00
+@---------------------------------------------------------------------------------
+	ldr	r0, =__bss_start
+	ldr	r1, =__bss_end
+	sub	r1, r0
+	bl	ClearMem
+
+@---------------------------------------------------------------------------------
+@ Clear SBSS section to 0x00
+@---------------------------------------------------------------------------------
+	ldr	r0, =__sbss_start
+	ldr	r1, =__sbss_end
+	sub	r1, r0
+	bl	ClearMem
+
+@---------------------------------------------------------------------------------
+@ Copy initialized data (data section) from LMA to VMA (ROM to RAM)
+@---------------------------------------------------------------------------------
+	ldr	r1, =__data_lma
+	ldr	r2, =__data_start
+	ldr	r4, =__data_end
+	bl	CopyMemChk
+
+@---------------------------------------------------------------------------------
+@ Copy internal work ram (iwram section) from LMA to VMA (ROM to RAM)
+@---------------------------------------------------------------------------------
+	ldr	r1,= __iwram_lma
+	ldr	r2,= __iwram_start
+	ldr	r4,= __iwram_end
+	bl	CopyMemChk
+
+@---------------------------------------------------------------------------------
+@ Copy internal work ram overlay 0 (iwram0 section) from LMA to VMA (ROM to RAM)
+@---------------------------------------------------------------------------------
+	ldr	r2,= __load_stop_iwram0
+	ldr	r1,= __load_start_iwram0
+	sub	r3, r2, r1			@ Is there any data to copy?
+	beq	CIW0Skip			@ no
+
+	ldr	r2,= __iwram_overlay_start
+	bl	CopyMem
+@---------------------------------------------------------------------------------
+CIW0Skip:
+@---------------------------------------------------------------------------------
+@ Copy external work ram (ewram section) from LMA to VMA (ROM to RAM)
+@---------------------------------------------------------------------------------
+	ldr	r1, =__ewram_lma
+	ldr	r2, =__ewram_start
+	ldr	r4, =__ewram_end
+	bl	CopyMemChk
+
+@---------------------------------------------------------------------------------
+@ Copy external work ram overlay 0 (ewram0 section) from LMA to VMA (ROM to RAM)
+@---------------------------------------------------------------------------------
+	ldr	r2, =__load_stop_ewram0
+	ldr	r1, =__load_start_ewram0
+	sub	r3, r2, r1			@ Is there any data to copy?
+	beq	CEW0Skip			@ no
+
+	ldr	r2, =__ewram_overlay_start
+	bl	CopyMem
+@---------------------------------------------------------------------------------
+CEW0Skip:
+@---------------------------------------------------------------------------------
+@ set heap end
+@---------------------------------------------------------------------------------
+	ldr	r1, =fake_heap_end
+	ldr	r0, =__eheap_end
+	str	r0, [r1]
+@---------------------------------------------------------------------------------
+@ global constructors
+@---------------------------------------------------------------------------------
+	ldr	r3, =_init
+	bl	_call_via_r3
+@---------------------------------------------------------------------------------
+@ Jump to user code
+@---------------------------------------------------------------------------------
+	mov	r0, #0				@ int argc
+	mov	r1, #0				@ char	*argv[]
+	ldr	r3, =main
+	bl	_call_via_r3
+@---------------------------------------------------------------------------------
+@ Clear memory to 0x00 if length != 0
+@---------------------------------------------------------------------------------
+@ r0 = Start Address
+@ r1 = Length
+@---------------------------------------------------------------------------------
+ClearMem:
+@---------------------------------------------------------------------------------
+	mov	r2,#3				@ These	commands are used in cases where
+	add	r1,r2				@ the length is	not a multiple of 4,
+	bic	r1,r2				@ even though it should be.
+
+	beq	ClearMX				@ Length is zero so exit
+
+	mov	r2,#0
+@---------------------------------------------------------------------------------
+ClrLoop:
+@---------------------------------------------------------------------------------
+	stmia	r0!, {r2}
+	sub	r1,#4
+	bne	ClrLoop
+@---------------------------------------------------------------------------------
+ClearMX:
+@---------------------------------------------------------------------------------
+	bx	lr
+
+@---------------------------------------------------------------------------------
+@ Copy memory if length	!= 0
+@---------------------------------------------------------------------------------
+@ r1 = Source Address
+@ r2 = Dest Address
+@ r4 = Dest Address + Length
+@---------------------------------------------------------------------------------
+CopyMemChk:
+@---------------------------------------------------------------------------------
+	sub	r3, r4, r2			@ Is there any data to copy?
+@---------------------------------------------------------------------------------
+@ Copy memory
+@---------------------------------------------------------------------------------
+@ r1 = Source Address
+@ r2 = Dest Address
+@ r3 = Length
+@---------------------------------------------------------------------------------
+CopyMem:
+@---------------------------------------------------------------------------------
+	mov	r0, #3				@ These commands are used in cases where
+	add	r3, r0				@ the length is not a multiple	of 4,
+	bic	r3, r0				@ even	though it should be.
+	beq	CIDExit				@ Length is zero so exit
+
+@---------------------------------------------------------------------------------
+CIDLoop:
+@---------------------------------------------------------------------------------
+	ldmia	r1!, {r0}
+	stmia	r2!, {r0}
+	sub	r3, #4
+	bne	CIDLoop
+@---------------------------------------------------------------------------------
+CIDExit:
+@---------------------------------------------------------------------------------
+	bx	lr
+
+	.align
+	.pool
+	.end
+

+ 0 - 9
rtl/gba/prt0.as

@@ -177,17 +177,8 @@ CEW0Skip:
 	mov     r0,#0            @ int argc
 	mov     r1,#0            @ char *argv[]
 
-	ldr     r3,=start_vector
-	mov     lr,r3            @ Set start_vector as return address
 	ldr     r3,=main
 	bx      r3
-	.GLOBAL     __FarFunction,__FarProcedure
-	.THUMB_FUNC
-__FarFunction:
-	.THUMB_FUNC
-__FarProcedure:
-	bx      r0
-	nop
 	nop								@ This nop is here to allow unmapped memory to be used as
                     @ as a delay of almost 1 sec with a 1 cycle resolution.
                     @ Read this for technical info:

+ 6 - 3
rtl/gba/system.pp

@@ -56,7 +56,8 @@ var
   argv: PPChar;
   envp: PPChar;
   errno: integer;
-
+  fake_heap_start: pchar; cvar;
+  fake_heap_end: pchar; cvar;
 
 implementation
 
@@ -152,9 +153,11 @@ end;
 
 begin
   StackLength := CheckInitialStkLen(InitialStkLen);
-  StackBottom := Sptr - StackLength;
+  ///StackBottom := Sptr - StackLength;
+  StackBottom := StackTop - StackLength;
 { OS specific startup }
-
+  fake_heap_start := pchar(0);
+  fake_heap_end := pchar(0);
 { Set up signals handlers }
 
 { Setup heap }