mirror of
https://github.com/autc04/Retro68.git
synced 2024-09-10 03:54:48 +00:00
187 lines
4.2 KiB
ArmAsm
187 lines
4.2 KiB
ArmAsm
/*
|
|
|
|
Copyright (c) 2005,2008 Red Hat Incorporated.
|
|
All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions are met:
|
|
|
|
Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
The name of Red Hat Incorporated may not be used to endorse
|
|
or promote products derived from this software without specific
|
|
prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY
|
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
#if defined(__r8c_cpu__) || defined(__m16c_cpu__)
|
|
#define A16
|
|
#define A(n,w) n
|
|
#define W w
|
|
#define ALIGN 1
|
|
#else
|
|
#define A24
|
|
#define A(n,w) w
|
|
#define W l
|
|
#define ALIGN 2
|
|
#endif
|
|
|
|
.section ".resetvec","ax",@progbits
|
|
.long _start
|
|
|
|
.text
|
|
|
|
.global _start
|
|
_start:
|
|
.LFB2:
|
|
fclr U /* One stack for user and interrupts */
|
|
ldc #__stack,sp
|
|
|
|
#ifdef A16
|
|
mov.b #%hi8(__romdatastart),r1h
|
|
mov.w #%lo16(__romdatastart),a0
|
|
mov.w #__datastart,a1
|
|
#else
|
|
mov.l #__romdatastart,a0
|
|
mov.l #__datastart,a1
|
|
#endif
|
|
mov.w #__romdatacopysize,r3
|
|
shl.w #-1,r3
|
|
smovf.w
|
|
|
|
#ifdef A16
|
|
mov.w #__bssstart,a1
|
|
#else
|
|
mov.l #__bssstart,a1
|
|
#endif
|
|
mov.w #__bsssize,r3
|
|
shl.w #-1,r3
|
|
mov.w #0,r0
|
|
sstr.w
|
|
|
|
#ifdef A16
|
|
ldc #%lo16(__var_vects),intbl
|
|
ldc #%hi16(__var_vects),intbh
|
|
#else
|
|
ldc #__var_vects,intb
|
|
#endif
|
|
|
|
fset I
|
|
jsr.a __m32c_init
|
|
|
|
jsr.a _main
|
|
.LFE2:
|
|
|
|
#ifdef A24
|
|
/* rv in r0, ok for arg0 */
|
|
#else
|
|
mov.w r0,r1
|
|
#endif
|
|
|
|
jsr.a _exit
|
|
|
|
.text
|
|
|
|
.global _m32c_run_preinit_array
|
|
.type _m32c_run_preinit_array,@function
|
|
_m32c_run_preinit_array:
|
|
mov.W #__preinit_array_start,a0
|
|
mov.W #__preinit_array_end,a1
|
|
jmp.w _m32c_run_inilist
|
|
|
|
.global _m32c_run_init_array
|
|
.type _m32c_run_init_array,@function
|
|
_m32c_run_init_array:
|
|
mov.W #__init_array_start,a0
|
|
mov.W #__init_array_end,a1
|
|
jmp.w _m32c_run_inilist
|
|
|
|
.global _m32c_run_fini_array
|
|
.type _m32c_run_fini_array,@function
|
|
_m32c_run_fini_array:
|
|
mov.W #__fini_array_start,a0
|
|
mov.W #__fini_array_end,a1
|
|
/* fall through */
|
|
|
|
_m32c_run_inilist:
|
|
next_inilist:
|
|
cmp.W a0,a1
|
|
jeq done_inilist
|
|
pushm a0,a1
|
|
mov.W [a0],a0
|
|
#ifdef A16
|
|
mov.b:s #0,a1 /* zero extends */
|
|
jsri.a a1a0
|
|
#else
|
|
jsri.a a0
|
|
#endif
|
|
popm a0,a1
|
|
add.W A(#2,#4),a0
|
|
jmp.b next_inilist
|
|
done_inilist:
|
|
rts
|
|
|
|
.section .init,"ax",@progbits
|
|
|
|
.global __m32c_init
|
|
__m32c_init:
|
|
enter #0
|
|
|
|
.section .fini,"ax",@progbits
|
|
|
|
.global __m32c_fini
|
|
__m32c_fini:
|
|
enter #0
|
|
jsr.a _m32c_run_fini_array
|
|
|
|
|
|
;;; Provide Dwarf unwinding information that will help GDB stop
|
|
;;; backtraces at the right place. This is stolen from assembly
|
|
;;; code generated by GCC with -dA.
|
|
.section .debug_frame,"",@progbits
|
|
.Lframe0:
|
|
.4byte .LECIE0-.LSCIE0 ; Length of Common Information Entry
|
|
.LSCIE0:
|
|
.4byte 0xffffffff ; CIE Identifier Tag
|
|
.byte 0x1 ; CIE Version
|
|
.ascii "\0" ; CIE Augmentation
|
|
.uleb128 0x1 ; CIE Code Alignment Factor
|
|
.sleb128 -1 ; CIE Data Alignment Factor
|
|
.byte 0xd ; CIE RA Column
|
|
.byte 0xc ; DW_CFA_def_cfa
|
|
.uleb128 0xc
|
|
.uleb128 0x3
|
|
.byte 0x8d ; DW_CFA_offset, column 0xd
|
|
.uleb128 0x3
|
|
.p2align ALIGN
|
|
.LECIE0:
|
|
.LSFDE0:
|
|
.4byte .LEFDE0-.LASFDE0 ; FDE Length
|
|
.LASFDE0:
|
|
.4byte .Lframe0 ; FDE CIE offset
|
|
.4byte .LFB2 ; FDE initial location
|
|
.4byte .LFE2-.LFB2 ; FDE address range
|
|
.byte 0xf ; DW_CFA_def_cfa_expression
|
|
.uleb128 1 ; length of expression
|
|
.byte 0x30 ; DW_OP_lit0
|
|
.p2align ALIGN
|
|
.LEFDE0:
|
|
|
|
.text
|