summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-04-24 21:46:01 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-04-24 21:46:01 +0000
commitd6779f8ca4430566141c30b9459015805ef0b349 (patch)
treec4294035a8ba218fbd5909dbd4eaf4e88e7bdc77
parent466d29a890f2a2a6e20e854b69d57bb48cdbd6c6 (diff)
downloadrockbox-d6779f8ca4430566141c30b9459015805ef0b349.zip
rockbox-d6779f8ca4430566141c30b9459015805ef0b349.tar.gz
rockbox-d6779f8ca4430566141c30b9459015805ef0b349.tar.bz2
rockbox-d6779f8ca4430566141c30b9459015805ef0b349.tar.xz
First version
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@214 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/crt0.S98
1 files changed, 98 insertions, 0 deletions
diff --git a/firmware/crt0.S b/firmware/crt0.S
new file mode 100644
index 0000000..785f405
--- /dev/null
+++ b/firmware/crt0.S
@@ -0,0 +1,98 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+ .section .text
+ .global start
+start:
+ /* We begin with some tricks. If we have built our code to be loaded
+ * via the standalone GDB stub, we will have out VBR at some other
+ * location than 0x9000000. We must copy the trap vectors for the
+ * GDB stub to our vector table.
+ * If, on the other hand, we are running standalone we will have
+ * the VBR at 0x9000000, and the copy will not do any harm.
+ */
+ mov.l vbr_k,r1
+ mov.l orig_vbr_k,r2
+
+ /* Move the serial Rx interrupt vector */
+ mov #0x69,r0
+ shll2 r0
+ mov.l @(r0,r2),r3
+ mov.l r3,@(r0,r1)
+
+ /* Move the breakpoint trap vector as well (32) */
+ mov #0x20,r0
+ shll2 r0
+ mov.l @(r0,r2),r3
+ mov.l r3,@(r0,r1)
+
+ /* Move the single step trap vector as well (127) */
+ mov #0x7f,r0
+ shll2 r0
+ mov.l @(r0,r2),r3
+ mov.l r3,@(r0,r1)
+
+ ldc r1,vbr
+
+ /* Now let's get on with the normal business */
+ mov.l stack_k,r15
+
+ /* zero out bss */
+ mov.l edata_k,r0
+ mov.l end_k,r1
+ mov #0,r2
+start_l:
+ mov.l r2,@r0
+ add #4,r0
+ cmp/ge r0,r1
+ bt start_l
+ nop
+
+ ! call the mainline
+ mov.l main_k,r0
+ jsr @r0
+ nop
+.hoo:
+ bra .hoo
+
+ .align 2
+stack_k:
+ .long _stack
+edata_k:
+ .long _edata
+end_k:
+ .long _end
+main_k:
+ .long _main
+vbr_k:
+ .long vectors
+orig_vbr_k:
+ .long 0x9000000
+
+#ifdef __ELF__
+ .section .stack,"aw"
+#else
+ .section .stack
+#endif
+
+ .section .vectors
+vectors:
+ .long start
+ .long _stack
+ .long start
+ .long _stack