nds_test1

diff src/startup/arm7entry.s @ 0:ab2afb70001a

initial commit test1 without libnds
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 27 Jan 2018 23:38:00 +0200
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/startup/arm7entry.s	Sat Jan 27 23:38:00 2018 +0200
     1.3 @@ -0,0 +1,175 @@
     1.4 +@ vi:set filetype=armasm:
     1.5 +	.section ".crt0","ax"
     1.6 +	.global _start
     1.7 +	.align	4
     1.8 +	.arm
     1.9 +_start:
    1.10 +	mov	r0, #0x04000000		@ IME = 0;
    1.11 +	mov	r1, #0
    1.12 +	str	r1, [r0, #0x208]
    1.13 +
    1.14 +	mov	r0, #0x12		@ Switch to IRQ Mode
    1.15 +	msr	cpsr, r0
    1.16 +	ldr	sp, =__sp_irq		@ Set IRQ stack
    1.17 +
    1.18 +	mov	r0, #0x13		@ Switch to SVC Mode
    1.19 +	msr	cpsr, r0
    1.20 +	ldr	sp, =__sp_svc		@ Set SVC stack
    1.21 +
    1.22 +	mov	r0, #0x1F		@ Switch to System Mode
    1.23 +	msr	cpsr, r0
    1.24 +	ldr	sp, =__sp_usr		@ Set user stack
    1.25 +
    1.26 +#ifndef VRAM
    1.27 +	adr	r1, __sync_start	@ Perform ARM7<->ARM9 sync code
    1.28 +	ldr	r2, =__arm7_start__
    1.29 +	mov	r3, #(__sync_end-__sync_start)
    1.30 +	mov	r8, r2
    1.31 +	bl	CopyMem
    1.32 +	mov	r3, r8
    1.33 +	bl	_blx_r3_stub
    1.34 +
    1.35 +@ Copy arm7 binary from LMA to VMA (EWRAM to IWRAM)
    1.36 +	adr	r0, arm7lma		@ Calculate ARM7 LMA
    1.37 +	ldr	r1, [r0]
    1.38 +	add	r1, r1, r0
    1.39 +	ldr	r2, =__arm7_start__
    1.40 +	ldr	r4, =__arm7_end__
    1.41 +	bl	CopyMemCheck
    1.42 +
    1.43 +#else
    1.44 +	bl	__sync_start
    1.45 +#endif
    1.46 +
    1.47 +	ldr	r0, =__bss_start__	@ Clear BSS section to 0x00
    1.48 +	ldr	r1, =__bss_end__
    1.49 +	sub	r1, r1, r0
    1.50 +	bl	ClearMem
    1.51 +
    1.52 +#ifndef VRAM
    1.53 +	cmp	r10, #1
    1.54 +	bne	NotTWL
    1.55 +	ldr	r1, =__dsimode		@ set DSi mode flag
    1.56 +	strb	r10, [r1]
    1.57 +
    1.58 +	ldr	r1, =0x02ffe1d8		@ Get ARM7i LMA from header
    1.59 +	ldr	r1, [r1]
    1.60 +	ldr	r2, =__arm7i_start__
    1.61 +	ldr	r4, =__arm7i_end__
    1.62 +	bl	CopyMemCheck
    1.63 +
    1.64 +	ldr	r0, =__twl_bss_start__	@ Clear TWL BSS section to 0x00
    1.65 +	ldr	r1, =__twl_bss_end__
    1.66 +	sub	r1, r1, r0
    1.67 +	bl	ClearMem
    1.68 +#endif
    1.69 +
    1.70 +NotTWL:
    1.71 +	mov	r0, #0			@ int argc
    1.72 +	mov	r1, #0			@ char *argv[]
    1.73 +	ldr	r3, =main
    1.74 +	mov	r12, #0x4000000		@ tell arm9 we are ready
    1.75 +	mov	r9, #0
    1.76 +	str	r9, [r12, #0x180]
    1.77 +_blx_r3_stub:
    1.78 +	bx	r3
    1.79 +infloop:
    1.80 +	b infloop
    1.81 +
    1.82 +#ifndef VRAM
    1.83 +arm7lma:
    1.84 +	.word	__arm7_lma__ - .
    1.85 +#endif
    1.86 +	.pool
    1.87 +
    1.88 +@---------------------------------------------------------------------------------
    1.89 +@ ARM7<->ARM9 synchronization code
    1.90 +@---------------------------------------------------------------------------------
    1.91 +
    1.92 +__sync_start:
    1.93 +	push	{lr}
    1.94 +	mov	r12, #0x4000000
    1.95 +	mov	r9, #0x0
    1.96 +	bl	IPCSync
    1.97 +	mov	r9, #(0x9<<8)
    1.98 +	str	r9, [r12, #0x180]
    1.99 +	mov	r9, #0xA
   1.100 +	bl	IPCSync
   1.101 +	mov	r9, #(0xB<<8)
   1.102 +	str	r9, [r12, #0x180]
   1.103 +	mov	r9, #0xC
   1.104 +	bl	IPCSync
   1.105 +	mov	r9, #(0xD<<8)
   1.106 +	str	r9, [r12, #0x180]
   1.107 +IPCRecvFlag:
   1.108 +	ldr	r10, [r12, #0x180]
   1.109 +	and	r10, r10, #0xF
   1.110 +	cmp	r10, #0xC
   1.111 +	beq	IPCRecvFlag
   1.112 +	pop	{pc}
   1.113 +IPCSync:
   1.114 +	ldr	r10, [r12, #0x180]
   1.115 +	and	r10, r10, #0xF
   1.116 +	cmp	r10, r9
   1.117 +	bne	IPCSync
   1.118 +	bx	lr
   1.119 +__sync_end:
   1.120 +
   1.121 +@---------------------------------------------------------------------------------
   1.122 +@ Clear memory to 0x00 if length != 0
   1.123 +@  r0 = Start Address
   1.124 +@  r1 = Length
   1.125 +@---------------------------------------------------------------------------------
   1.126 +ClearMem:
   1.127 +@---------------------------------------------------------------------------------
   1.128 +	mov	r2, #3			@ Round down to nearest word boundary
   1.129 +	add	r1, r1, r2		@ Shouldn't be needed
   1.130 +	bics	r1, r1, r2		@ Clear 2 LSB (and set Z)
   1.131 +	bxeq	lr			@ Quit if copy size is 0
   1.132 +
   1.133 +	mov	r2, #0
   1.134 +ClrLoop:
   1.135 +	stmia	r0!, {r2}
   1.136 +	subs	r1, r1, #4
   1.137 +	bne	ClrLoop
   1.138 +	bx	lr
   1.139 +
   1.140 +@---------------------------------------------------------------------------------
   1.141 +@ Copy memory if length	!= 0
   1.142 +@  r1 = Source Address
   1.143 +@  r2 = Dest Address
   1.144 +@  r4 = Dest Address + Length
   1.145 +@---------------------------------------------------------------------------------
   1.146 +CopyMemCheck:
   1.147 +@---------------------------------------------------------------------------------
   1.148 +	cmp	r1, r2
   1.149 +	bxeq	lr
   1.150 +
   1.151 +	sub	r3, r4, r2		@ Is there any data to copy?
   1.152 +@---------------------------------------------------------------------------------
   1.153 +@ Copy memory
   1.154 +@  r1 = Source Address
   1.155 +@  r2 = Dest Address
   1.156 +@  r3 = Length
   1.157 +@---------------------------------------------------------------------------------
   1.158 +CopyMem:
   1.159 +@---------------------------------------------------------------------------------
   1.160 +	mov	r0, #3			@ These commands are used in cases where
   1.161 +	add	r3, r3, r0		@ the length is not a multiple of 4,
   1.162 +	bics	r3, r3, r0		@ even though it should be.
   1.163 +	bxeq	lr			@ Length is zero, so exit
   1.164 +CIDLoop:
   1.165 +	ldmia	r1!, {r0}
   1.166 +	stmia	r2!, {r0}
   1.167 +	subs	r3, r3, #4
   1.168 +	bne	CIDLoop
   1.169 +	bx	lr
   1.170 +
   1.171 +@---------------------------------------------------------------------------------
   1.172 +	.align
   1.173 +	.pool
   1.174 +
   1.175 +	.global __dsimode
   1.176 +__dsimode: .word
   1.177 +	.end
   1.178 +@---------------------------------------------------------------------------------