/*------------------------------------------------------------------------
                                                                       |
   FILE        : start.asm                                             |
   DATE        :  Wed, Aug 25, 2010                                    |
   DESCRIPTION :   Reset Program                                       |
   CPU TYPE    :    Other                                              |
                                                                       |
   This file is generated by KPIT GNU Project Generator (Ver.4.5).     |
                                                                       |
------------------------------------------------------------------------*/
                        


	/*Start.asm*/

	.list
	.section .text
	.global _start   /*global Start routine */
	
#ifdef CPPAPP	
___dso_handle:
	.global ___dso_handle
#endif	

	.extern _hw_initialise  /*external Sub-routine to initialise Hardware*/
	.extern _data
	.extern _mdata
	.extern _ebss
	.extern _bss
	.extern _edata
	.extern _main 
	.extern _ustack
	.extern _istack
	.extern _rvectors
#if DEBUG
	.extern _exit
#endif

	
_start:
/* initialise user stack pointer */
	mvtc	#_ustack,USP

/* initialise interrupt stack pointer */
	mvtc	#_istack,ISP

/* setup intb */
	mvtc	#_rvectors_start, intb	/* INTERRUPT VECTOR ADDRESS  definition	*/

/* setup FPSW */
	mvtc    #100h, fpsw	

/* load data section from ROM to RAM */

	mov     #_mdata,r2      /* src ROM address of data section in R2 */
	mov     #_data,r1       /* dest start RAM address of data section in R1 */
	mov     #_edata,r3      /* end RAM address of data section in R3 */
	sub    r1,r3            /* size of data section in R3 (R3=R3-R1) */
	smovf                   /* block copy R3 bytes from R2 to R1 */

/* bss initialisation : zero out bss */

	mov	#00h,r2  	/* load R2 reg with zero */
	mov	#_ebss, r3  /* store the end address of bss in R3 */
	mov	#_bss, r1 	/* store the start address of bss in R1 */
	sub   r1,r3	   	/* size of bss section in R3 (R3=R3-R1) */
	sstr.b

/* call the hardware initialiser */
	bsr.a	_hw_initialise	
	nop

/* setup PSW */
//	mvtc	#10000h, psw			/* Set Ubit & Ibit for PSW */

/* change PSW PM to user-mode */
//	MVFC   PSW,R1
//	OR     #00100000h,R1
//	PUSH.L R1
//	MVFC   PC,R1
//	ADD    #10,R1
//	PUSH.L R1
//	RTE
//	NOP
//	NOP

/* start user program */
	bsr.a	_main		
	
/* call to exit*/
_exit:
	bsr.a 	_exit
	
	.end
