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
 |