mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-11 19:49:32 +00:00
120 lines
2.2 KiB
ArmAsm
120 lines
2.2 KiB
ArmAsm
|
|
||
|
#ifdef __SH5__
|
||
|
.section .data,"aw"
|
||
|
.global ___data
|
||
|
___data:
|
||
|
|
||
|
.section .rodata,"a"
|
||
|
.global ___rodata
|
||
|
___rodata:
|
||
|
|
||
|
#if __SH5__ == 64
|
||
|
.section .text,"ax"
|
||
|
#define LOAD_ADDR(sym, reg) \
|
||
|
movi (sym >> 48) & 65535, reg; \
|
||
|
shori (sym >> 32) & 65535, reg; \
|
||
|
shori (sym >> 16) & 65535, reg; \
|
||
|
shori sym & 65535, reg
|
||
|
#else
|
||
|
.mode SHmedia
|
||
|
.section .text..SHmedia32,"ax"
|
||
|
#define LOAD_ADDR(sym, reg) \
|
||
|
movi (sym >> 16) & 65535, reg; \
|
||
|
shori sym & 65535, reg
|
||
|
#endif
|
||
|
.global start
|
||
|
start:
|
||
|
LOAD_ADDR (_stack, r15)
|
||
|
|
||
|
pt/l zero_bss_loop, tr0
|
||
|
pt/l _atexit, tr1
|
||
|
pt/l _init, tr5
|
||
|
pt/l _main, tr6
|
||
|
pt/l _exit, tr7
|
||
|
|
||
|
! zero out bss
|
||
|
LOAD_ADDR (_edata, r0)
|
||
|
LOAD_ADDR (_end, r1)
|
||
|
zero_bss_loop:
|
||
|
stx.q r0, r63, r63
|
||
|
addi r0, 8, r0
|
||
|
bgt/l r1, r0, tr0
|
||
|
|
||
|
LOAD_ADDR (___data, r26)
|
||
|
LOAD_ADDR (___rodata, r27)
|
||
|
|
||
|
#if ! __SH4_NOFPU__
|
||
|
getcon cr0, r0
|
||
|
movi 1, r1
|
||
|
shlli r1, 15, r1
|
||
|
or r1, r0, r0
|
||
|
putcon r0, cr0
|
||
|
#endif
|
||
|
|
||
|
! arrange for exit to call fini
|
||
|
LOAD_ADDR (_fini, r2)
|
||
|
blink tr1, r18
|
||
|
|
||
|
! call init
|
||
|
blink tr5, r18
|
||
|
|
||
|
! call the mainline
|
||
|
blink tr6, r18
|
||
|
|
||
|
! call exit
|
||
|
blink tr7, r18
|
||
|
#else
|
||
|
.section .text
|
||
|
.global start
|
||
|
start:
|
||
|
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
|
||
|
|
||
|
#ifndef __SH2A_NOFPU__
|
||
|
#if defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY) || defined(__SH2A__)
|
||
|
mov.l set_fpscr_k, r1
|
||
|
jsr @r1
|
||
|
mov #0,r4
|
||
|
lds r3,fpscr
|
||
|
#endif /* defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH2A__) */
|
||
|
#endif /* !__SH2A_NOFPU__ */
|
||
|
|
||
|
! call the mainline
|
||
|
mov.l main_k,r0
|
||
|
jsr @r0
|
||
|
or r0,r0
|
||
|
|
||
|
! call exit
|
||
|
mov r0,r4
|
||
|
mov.l exit_k,r0
|
||
|
jsr @r0
|
||
|
or r0,r0
|
||
|
|
||
|
.align 2
|
||
|
#ifndef __SH2A_NOFPU__
|
||
|
#if defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH2A__)
|
||
|
set_fpscr_k:
|
||
|
.long ___set_fpscr
|
||
|
#endif /* defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(SH4_SINGLE_ONLY) || defined(__SH2A__) */
|
||
|
#endif /* !__SH2A_NOFPU__ */
|
||
|
stack_k:
|
||
|
.long _stack
|
||
|
edata_k:
|
||
|
.long _edata
|
||
|
end_k:
|
||
|
.long _end
|
||
|
main_k:
|
||
|
.long _main
|
||
|
exit_k:
|
||
|
.long _exit
|
||
|
#endif
|