123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /****************************************************************
- KPIT Cummins Infosystems Ltd, Pune, India.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *****************************************************************/
- /* Start-up code for M16C targets only */
- .text
- .global _start
- .type _start, @function
-
- _start:
- ldc #_istack, isp /* set interrupt stack pointer */
- #ifndef EXT_RAM
-
- mov.b #0x02,0x0a /* write enable in protect register */
- mov.b #0x00,0x04 /* set processer mode :single chip mode */
- /* 0x04 is the address of processor mode register 0 */
- mov.b #0x00,0x0a /* write disable in protect register */
- #endif
- #if EXT_RAM
- mov.w #0x000a,a0 /* Write enable in protect register */
- mov.b #0xff,[a0]
-
- mov.w #0x04,a0 /* Memory expansion mode, WRH/WRL/RD signals */
- mov.b #0x05,[a0]
- mov.w #0x05,a0 /* Insert wait, no limit in on-chip memory */
- mov.b #0x88,[a0]
- mov.w #0x08,a0 /* Enable all the CS signals with wait */
- mov.b #0x0F,[a0]
- mov.w #0x0a,a0 /* write disable in protect register */
- mov.b #0x00,[a0]
- #endif
- ; ldc #0x0080,flg /* select USER STACK POINTER (BIT7=1,USP) (BIT7=0,ISP) */
- ; ldc #_ustack,sp /* set user stack pointer */
-
- /* INTERRUPT VECTOR ADDRESS definition */
- ldc #0xF, intbh /* load upper 4 bits of variable vector address in intbh */
- ldc #0xA000, intbl /* load lower 16 bits of variable vector address in intbl */
- fset I /* ADD THIS TO ENABLE INTERRUPTS */
-
- /* call the hardware initialiser */
- ; jsr.a _hw_initialise
-
- /* load data section from ROM to RAM */
-
- mov.b #%hi8(_mdata),r1h /* move upper 4 bits of the 20 bit address (_mdata) to, r1h */
- mov.w #%lo16(_mdata),a0 /* move lower 16 bits of the 20 bit address (_mdata) to,a0 */
- mov.w #_data,a1 /* store the start address of data section in, A1 */
- mov.w #_edata,r3 /* store the end address of data section in R3 */
- sub.w a1,r3 /* R3=R3-A1. Store size of data section in R3 */
- mov.w r3,r2 /* Store size of data section in R2 */
- smovf.b
- /* bss initialisation : zero out bss */
- mov.b #0x00,R0L /* load R0L reg with 0x0 (value at which bss section will be initialised) */
- mov.w #_bss, a1 /* store the start address of bss in A1 */
- mov.w #_ebss, a0 /* store the end address of bss in A0 */
- sub.w a1,a0 /* (A0 = A0-A1) */
- mov.w a0,r3 /* Store size of bss section in reg R3 */
- sstr.b
- #if EXT_RAM
- /* load fdata section from ROM to External RAM only if EXT_RAM is defined */
- pushc sp /*store stack pointer in stack */
- popc fb /*copy the stack pointer in frame base register */
- push.w #%hi16(_mdata) /* offset of -2 from fb: store higher 16 bits of _mdata */
- push.w #%lo16(_mdata) /* offset of -4 from fb: store lower 16 bits of _mdata */
-
- mov.w #_edata,r0 /* end address of data section */
- mov.w #_data,r1 /* start address of data section */
- sub.w r1,r0 /* size of data section in r0 */
- add.w r0,-4[fb] /* store the lower 16 bits of source address on stack */
- adc.w #0,-2[fb] /* store the higher 4 bits of source address on stack */
- push.w #%hi16(_fdata) /* offset -6 from fp: store the higher 4 bits of destination address on stack */
- push.w #%lo16(_fdata) /* offset -8 from fp: store the lower 16 bits of destination address on stack */
-
-
- push.w #%hi16(_efdata) /* offset -10 from fp: higher 16 bits of _efdata */
- push.w #%lo16(_efdata) /* offset -12 from fp: lower 16 bits of _efdata */
-
- label1:
- cmp.w -6[fb],-10[fb] /* Compare higher 16 bits of _fdata and _efdata */
- jnz label2
- cmp.w -8[fb],-12[fb] /* Compare lower 16 bits of _fdata and _efdata */
- jeq init_fdata_end
-
-
- label2:
- mov.w -2[fb],a1 /* Copy higher 16 bits of source in A1 */
- mov.w -4[fb],a0 /* Copy lower 16 bits of source in A1 */
- lde.b [a1a0],r0l /* Copy contents of a1a0 in r0l */
- mov.w -6[fb],a1 /* Copy higher 16 bits of destination in A1 */
- mov.w -8[fb],a0 /* Copy lower 16 bits of destination in A0 */
- ste.b r0l,[a1a0] /* store r0l contents at [a1a0] */
-
- add.w #0x01,-4[fb] /* increment lower 16 bits of source */
- adcf.w -2[fb] /* add carry to higher 16 bits of source */
- add.w #0x01,-8[fb] /* increment lower 16 bits of destination */
- adcf.w -6[fb] /* add carry to higher 16 bits of destination */
-
- jmp.b label1
-
- init_fdata_end:
- pop.w r0 /* clean stack */
- pop.w r0
- pop.w r0
- pop.w r0
- pop.w r0
- pop.w r0
- /* Zero out fbss section */
-
- push.w #%hi16(_fbss) /* offset of -2 from fb: higher 16 bits of _fbss */
- push.w #%lo16(_fbss) /* offset of -4 from fb: lower 16 bits of _fbss */
- push.w #%hi16(_efbss) /* offset of -6 from fb: higer 16 bits of _efbss */
- push.w #%lo16(_efbss) /* offset of -8 from fb: lower 16 bits of _efbss */
- mov.b #0x00,r0l
- label3:
- cmp.w -2[fb],-6[fb] /* Compare higher 16 bits of _fdata and _efdata */
- jnz label4
- cmp.w -4[fb],-8[fb] /* Compare lower 16 bits of _fdata and _efdata */
- jeq init_fbss_end
- label4:
- mov.w -2[fb],a1 /* Copy higher 16 bits of source in A1 */
- mov.w -4[fb],a0 /* Copy lower 16 bits of source in A1 */
- ste.b r0l,[a1a0] /* store r0l contents at [a1a0] */
- add.w #0x01,-4[fb] /* increment lower 16 bits of _fbss */
- adcf.w -2[fb] /* add carry to higher 16 bits of _fbss */
- jmp.b label3
- init_fbss_end:
- pop.w r0 /* clean stack */
- pop.w r0
- pop.w r0
- pop.w r0
- #endif
- /* start user program */
- jsr.a _main
-
- .end
|