summaryrefslogtreecommitdiff
path: root/firmware/decompressor/startup.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/decompressor/startup.S')
-rwxr-xr-xfirmware/decompressor/startup.S57
1 files changed, 57 insertions, 0 deletions
diff --git a/firmware/decompressor/startup.S b/firmware/decompressor/startup.S
new file mode 100755
index 0000000000..62efef9cc3
--- /dev/null
+++ b/firmware/decompressor/startup.S
@@ -0,0 +1,57 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2005 by Jens Arnold
+ * based on crt0.S 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 .start,"ax",@progbits
+ .global _start
+_start:
+ /* copy the .iram section */
+ mov.l .iramcopy_k,r0
+ mov.l .iram_k,r1
+ mov.l .iramend_k,r2
+ /* Note: We cannot put a PC relative load into the delay slot of a 'bra'
+ instruction (the offset would be wrong), but there is nothing else to
+ do before the loop, so the delay slot would be 'nop'. The cmp / bf
+ sequence is the same length, but more efficient. */
+ cmp/hi r1,r2
+ bf .noiramcopy
+.iramloop:
+ mov.l @r0+,r3
+ mov.l r3,@r1
+ add #4,r1
+ cmp/hi r1,r2
+ bt .iramloop
+.noiramcopy:
+
+ /* call the mainline */
+ mov.l .main_k,r0
+ mov.l .stackend_k,r15
+ jmp @r0
+ nop
+
+ .align 2
+.iramcopy_k:
+ .long _iramcopy
+.iram_k:
+ .long _iramstart
+.iramend_k:
+ .long _iramend
+.stackend_k:
+ .long _stackend
+.main_k:
+ .long _main