Prechádzať zdrojové kódy

* Resized stack value for NDS
* Changes to prt0:
+ Added argv support
* New function calls

git-svn-id: trunk@9424 -

Legolas 17 rokov pred
rodič
commit
27eb735d24
3 zmenil súbory, kde vykonal 161 pridanie a 17 odobranie
  1. 1 1
      compiler/systems/i_nds.pas
  2. 78 6
      rtl/nds/cprt09.as
  3. 82 10
      rtl/nds/prt09.as

+ 1 - 1
compiler/systems/i_nds.pas

@@ -83,7 +83,7 @@ unit i_nds;
                 maxCrecordalign : 4
               );
             first_parm_offset : 8;
-            stacksize    : 262144;
+            stacksize    : 16384;
             abi : abi_default
           );
 

+ 78 - 6
rtl/nds/cprt09.as

@@ -1,3 +1,12 @@
+@---------------------------------------------------------------------------------
+@ DS processor selection
+@---------------------------------------------------------------------------------
+	.arch	armv5te
+	.cpu	arm946e-s
+@---------------------------------------------------------------------------------
+
+	.equ	_libnds_argv,	0x027FFF70
+
 @---------------------------------------------------------------------------------
 	.section ".init"
 	.global _start
@@ -95,7 +104,7 @@ _start:
 	@-------------------------------------------------------------------------
 	@ Write buffer enable
 	@-------------------------------------------------------------------------
-	ldr	r0,=0b00000110
+	ldr	r0,=0b00000010
 	mcr	p15, 0, r0, c3, c0, 0
 
 	@-------------------------------------------------------------------------
@@ -148,6 +157,8 @@ _start:
 	ldr	r4, =__dtcm_end
 	bl	CopyMemCheck
 
+	bl	checkARGV					@	check and process argv trickery
+
 	ldr	r0, =__bss_start	@ Clear BSS section
 	ldr	r1, =__bss_end
 	sub	r1, r1, r0
@@ -163,14 +174,25 @@ _start:
 	str	r0, [r1]
 	
 	ldr	r3, =__libc_init_array	@ global constructors
-	bl	_call_via_r3
+	blx	r3
+
+	ldr	r3,	=initSystem
+	blx	r3	@	jump to user code
+
+	ldr	r0,	=_libnds_argv
+
+	@ reset heap base
+	ldr	r2, [r0,#20]            @ newheap base
+	ldr	r1,=fake_heap_start
+	str	r2,[r1]
+
+	ldr	r1, [r0,#16]            @ argv
+	ldr	r0, [r0,#12]            @ argc
 
-	mov	r0, #0			@ int argc
-	mov	r1, #0			@ char *argv[]
 	ldr	r3, =main
-	bl	_call_via_r3		@ jump to user code
+	blx	r3		@ jump to user code
 		
-	@ If the user ever returns, go to an infinte loop
+	@ If the user ever returns, go back to passme loop
 	ldr	r0, =ILoop
 	ldr	r0, [r0]
 	ldr	r1, =0x027FFE78
@@ -179,6 +201,56 @@ _start:
 ILoop:
 	b	ILoop
 
+@---------------------------------------------------------------------------------
+@ check for a commandline
+@---------------------------------------------------------------------------------
+checkARGV:
+@---------------------------------------------------------------------------------
+	ldr	r0, =_libnds_argv       @ argv structure
+	mov	r1, #0
+	str	r1, [r0,#12]            @ clear argc
+	str	r1, [r0,#16]            @ clear argv
+ 	  	 
+	ldr	r1, [r0]                @ argv magic number
+	ldr	r2, =0x5f617267         @ '_arg'
+	cmp	r1, r2
+	bxne	lr                      @ bail out if no magic
+
+	ldr	r1, [r0, #4]            @ command line address
+	ldr	r2, [r0, #8]            @ length of command line
+
+	@ copy to heap
+	ldr	r3, =__end__            @ initial heap base
+	str	r3, [r0, #4]            @ set command line address
+ 	  	 
+	cmp	r2, #0
+	subnes	r4, r3, r1              @ dst-src
+	bxeq	lr                      @ dst == src || len==0 : nothing to do.
+
+	cmphi	r2, r4                  @ len > (dst-src)
+	bhi	.copybackward
+
+.copyforward:
+	ldrb	r4, [r1], #1
+	strb	r4, [r3], #1
+	subs	r2, r2, #1
+	bne	.copyforward
+	b	.copydone
+
+.copybackward:
+	subs	r2, r2, #1
+	ldrb	r4, [r1, r2]
+	strb	r4, [r3, r2]
+	bne	.copybackward
+
+.copydone:
+	push	{lr}
+	ldr	r3, =build_argv
+	blx	r3
+	pop	{lr}
+	bx	lr
+
+
 @---------------------------------------------------------------------------------
 @ Clear memory to 0x00 if length != 0
 @  r0 = Start Address

+ 82 - 10
rtl/nds/prt09.as

@@ -1,3 +1,12 @@
+@---------------------------------------------------------------------------------
+@ DS processor selection
+@---------------------------------------------------------------------------------
+	.arch	armv5te
+	.cpu	arm946e-s
+@---------------------------------------------------------------------------------
+
+	.equ	_libnds_argv,	0x027FFF70
+
 @---------------------------------------------------------------------------------
 	.section ".init"
 	.global _start
@@ -95,14 +104,14 @@ _start:
 	@-------------------------------------------------------------------------
 	@ Write buffer enable
 	@-------------------------------------------------------------------------
-	ldr	r0,=0b00000110
+	ldr	r0,=0b00000010
 	mcr	p15, 0, r0, c3, c0, 0
 
 	@-------------------------------------------------------------------------
 	@ DCache & ICache enable
 	@-------------------------------------------------------------------------
-	ldr	r0,=0b01000010
-
+	ldr	r0,=0b01000110
+	ldr	r0,=0x42
 	mcr	p15, 0, r0, c2, c0, 0
 	mcr	p15, 0, r0, c2, c0, 1
 
@@ -148,6 +157,8 @@ _start:
 	ldr	r4, =__dtcm_end
 	bl	CopyMemCheck
 
+	bl	checkARGV					@	check and process argv trickery
+
 	ldr	r0, =__bss_start	@ Clear BSS section
 	ldr	r1, =__bss_end
 	sub	r1, r1, r0
@@ -162,13 +173,26 @@ _start:
 	ldr	r0, =__eheap_end
 	str	r0, [r1]
 
-	mov	r0, #0			@ int argc
-	mov	r1, #0			@ char *argv[]
-	ldr	r3, =main
-  bx	r3
-  nop
+@	ldr	r3, =__libc_init_array	@ global constructors
+@	blx	r3
+
+	ldr	r3,	=initSystem
+	blx	r3	@	jump to user code
+
+	ldr	r0,	=_libnds_argv
 
-	@ If the user ever returns, go to an infinte loop
+	@ reset heap base
+	ldr	r2, [r0,#20]            @ newheap base
+	ldr	r1,=fake_heap_start
+	str	r2,[r1]
+
+	ldr	r1, [r0,#16]            @ argv
+	ldr	r0, [r0,#12]            @ argc
+
+	ldr	r3, =main
+	blx	r3		@ jump to user code
+		
+	@ If the user ever returns, go back to passme loop
 	ldr	r0, =ILoop
 	ldr	r0, [r0]
 	ldr	r1, =0x027FFE78
@@ -177,8 +201,56 @@ _start:
 ILoop:
 	b	ILoop
 
-
 @---------------------------------------------------------------------------------
+@ check for a commandline
+@---------------------------------------------------------------------------------
+checkARGV:
+@---------------------------------------------------------------------------------
+	ldr	r0, =_libnds_argv       @ argv structure
+	mov	r1, #0
+	str	r1, [r0,#12]            @ clear argc
+	str	r1, [r0,#16]            @ clear argv
+ 	  	 
+	ldr	r1, [r0]                @ argv magic number
+	ldr	r2, =0x5f617267         @ '_arg'
+	cmp	r1, r2
+	bxne	lr                      @ bail out if no magic
+
+	ldr	r1, [r0, #4]            @ command line address
+	ldr	r2, [r0, #8]            @ length of command line
+
+	@ copy to heap
+	ldr	r3, =__end__            @ initial heap base
+	str	r3, [r0, #4]            @ set command line address
+ 	  	 
+	cmp	r2, #0
+	subnes	r4, r3, r1              @ dst-src
+	bxeq	lr                      @ dst == src || len==0 : nothing to do.
+
+	cmphi	r2, r4                  @ len > (dst-src)
+	bhi	.copybackward
+
+.copyforward:
+	ldrb	r4, [r1], #1
+	strb	r4, [r3], #1
+	subs	r2, r2, #1
+	bne	.copyforward
+	b	.copydone
+
+.copybackward:
+	subs	r2, r2, #1
+	ldrb	r4, [r1, r2]
+	strb	r4, [r3, r2]
+	bne	.copybackward
+
+.copydone:
+	push	{lr}
+	ldr	r3, =build_argv
+	blx	r3
+	pop	{lr}
+	bx	lr
+
+
 @---------------------------------------------------------------------------------
 @ Clear memory to 0x00 if length != 0
 @  r0 = Start Address