#define STACK_SIZE 0x3000 .extern __tp .extern __gp .extern __sbss .extern __ebss .global _start .global _hw_init .global _gcc_init .global _end_gcc_init .global _endless_loop .section .intptr /* This is the ROM vector table. All vectors in this table exception the reset vector just jump directly to the equivalent interrupt service routine */ _start: /* 0x0000: Reset */ .org 0x000 movhi hi(_hw_init), r0, r2 ori lo(_hw_init), r2, r2 jmp [r2] /* 0x0010: NMI */ .org 0x010 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0020: INTWDT */ .org 0x020 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0040: TRAP0n */ .org 0x040 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0050: Trap1n */ .org 0x050 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0060: ILGOP */ .org 0x060 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0080: INTWDTM */ .org 0x080 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0090: INTP0 */ .org 0x090 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x00A0: INTP1 */ .org 0x0A0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x00B0: INTP2 */ .org 0x0B0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x00C0: INTP3 */ .org 0x0C0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x00D0: INTP4 */ .org 0x0D0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x00E0: INTP5 */ .org 0x0E0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x00F0: INTP6 */ .org 0x0F0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0100: INTCSI4 */ .org 0x100 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0110: INTAD */ .org 0x110 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0120: INTDMA0 */ .org 0x120 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0130: INTDMA1 */ .org 0x130 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0140: INTDMA2 */ .org 0x140 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0150: INTTM00 */ .org 0x150 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0160: INTTM01 */ .org 0x160 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0170: INTTM10 */ .org 0x170 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0180: INTTM11 */ .org 0x180 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0190: INTTM2 */ .org 0x190 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x01A0: INTTM3 */ .org 0x1A0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x01B0: INTTM4 */ .org 0x1B0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x01C0: INTTM5 */ .org 0x1C0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x01D0: INTWTN */ .org 0x1D0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x01E0: INTWTNI */ .org 0x1E0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x01F0: INTCSI0 */ .org 0x1F0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0200: INTSER0 */ .org 0x200 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0210: INTCSI1 */ .org 0x210 movhi hi(_ISR_UART0_RX), r0, r2 ori lo(_ISR_UART0_RX), r2, r2 jmp [r2] /* 0x0220: INTST0 */ .org 0x220 movhi hi(_ISR_UART0_TX), r0, r2 ori lo(_ISR_UART0_TX), r2, r2 jmp [r2] /* 0x0230: INTKR */ .org 0x230 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0240: INTCE1 */ .org 0x240 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0250: INTCR1 */ .org 0x250 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0260: INTCT1 */ .org 0x260 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0270: INTCME */ .org 0x270 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0280: INTTM6 */ .org 0x280 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0290: INTTM70 */ .org 0x290 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x02A0: INTTM71 */ .org 0x2A0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x02B0: INTSER1 */ .org 0x2B0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x02C0: INTCSI3 */ .org 0x2C0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x02D0: INTST1 */ .org 0x2D0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x02E0: INTDMA3 */ .org 0x2E0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x02F0: INTDMA4 */ .org 0x2F0 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0300: INTDMA5 */ .org 0x300 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0310: INTCE2 */ .org 0x310 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0320: INTCR2 */ .org 0x320 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] /* 0x0330: INTCT2 */ .org 0x330 movhi hi(_InterruptHandler), r0, r2 ori lo(_InterruptHandler), r2, r2 jmp [r2] .text _hw_init: ei jr _gcc_init /******************************** * Settup for gcc * pointers: tp - text pointer * gp - global pointer * sp - stack pointer * mask reg: r20 - 0xff * r21 - 0xffff * exit status is set to r10 *****************************************************************************/ _gcc_init: movea 255, r0, r20 mov r0, r21, ori 65535, r0, r21 movhi hi(_stack), r0, sp movea lo(_stack), sp, sp movhi hi(__ep), r0, ep movea lo(__ep), ep, ep movhi hi(__tp), r0, tp ori lo(__tp), tp, tp movhi hi(__gp), r0, gp ori lo(__gp), gp, gp movea 0xff, r0, r20 mov r0, r21 ori 0xFFFF, r0, r21 ldsr r0, PSW /* clear bss */ movhi hi(__sbss), r0, r13 ori lo(__sbss), r13, r13 movhi hi(__ebss), r0, r12 ori lo(__ebss), r12, r12 cmp r12, r13 jnl _end_gcc_init .L1: st.w r0, 0[r13] add 4, r13 cmp r12, r13 jl .L1 _end_gcc_init: jarl _main, r31 _endless_loop: jr _endless_loop /****************************************************************************** * dummy data declaration for creating sbss section *****************************************************************************/ .sbss /****************************************************************************** * create stack section *****************************************************************************/ .section .stack /* .fill STACK_SIZE,1 */ .end