/*
 * startup_1986ve8t.s
 * Startup file for ARM Cortex-M4F (1986VE8T) for GNU assembler (GCC)
 * Compatible with Eclipse IDE (GCC ARM Embedded toolchain)
 * Based on Keil startup file, converted to GNU syntax.
 */

.syntax unified
.cpu cortex-m4
.fpu softvfp
.thumb

/* Stack and heap sizes (same as original) */
.equ Stack_Size, 0x00000400
.equ Heap_Size,  0x00000200

/* Stack and heap sections (placed in RAM by linker script) */
.section .stack, "aw", %nobits
.align 3
_stack_start:
.space Stack_Size
_stack_end:
__initial_sp = _stack_end

.section .heap, "aw", %nobits
.align 3
_heap_start:
.space Heap_Size
_heap_end:
__heap_base = _heap_start
__heap_limit = _heap_end

/* Vector table */
.section .isr_vector, "a", %progbits
.align 2
.global __Vectors
.global __Vectors_End
.global __Vectors_Size

__Vectors:
    .word __initial_sp                       /* Top of Stack */
    .word Reset_Handler                      /* Reset Handler */
    .word NMI_Handler                        /* NMI Handler */
    .word HardFault_Handler                  /* Hard Fault Handler */
    .word MemoryMngFault_Handler             /* MemManage Fault */
    .word BusFault_Handler                   /* Bus Fault */
    .word UsageFault_Handler                 /* Usage Fault */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word SVC_Handler                        /* SVCall Handler */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word PendSV_Handler                     /* PendSV Handler */
    .word SysTick_Handler                    /* SysTick Handler */
    .word 0                                  /* Reserved16 */
    .word 0                                  /* Reserved17 */
    .word 0                                  /* Reserved18 */
    .word 0                                  /* Reserved19 */
    .word 0                                  /* Reserved20 */
    .word 0                                  /* Reserved21 */
    .word 0                                  /* Reserved22 */
    .word 0                                  /* Reserved23 */
    .word 0                                  /* Reserved24 */
    .word 0                                  /* Reserved25 */
    .word 0                                  /* Reserved26 */
    .word 0                                  /* Reserved27 */
    .word 0                                  /* Reserved28 */
    .word 0                                  /* Reserved29 */
    .word 0                                  /* Reserved30 */
    .word 0                                  /* Reserved31 */
    .word 0                                  /* Reserved32 */
    .word 0                                  /* Reserved33 */
    .word 0                                  /* Reserved34 */
    .word 0                                  /* Reserved35 */
    .word 0                                  /* Reserved36 */
    .word 0                                  /* Reserved37 */
    .word 0
    .word 0
    .word 0
    .word 0
    .word 0
    .word 0
    .word 0
    .word 0
    .word 0
    .word 0
    .word FT_IF0_Handler                     /* FT_IF0_Handler */
    .word FT_IF1_Handler                     /* FT_IF1_Handler */
    .word FT_IF2_Handler                     /* FT_IF2_Handler */
    .word FT_IF3_Handler                     /* FT_IF3_Handler */
    .word CLK_IF_Handler                     /* CLK_IF_Handler */
    .word PVD_IF_Handler                     /* PVD_IF_Handler */
    .word RTC_IF_Handler                     /* RTC_IF_Handler */
    .word BKP_IF_Handler                     /* BKP_IF_Handler */
    .word EXT_INTERROR0_Handler              /* EXT_INTERROR0_Handler */
    .word EXT_INTERROR1_Handler              /* EXT_INTERROR1_Handler */
    .word EXT_INTERROR2_Handler              /* EXT_INTERROR2_Handler */
    .word EXT_INTERROR3_Handler              /* EXT_INTERROR3_Handler */
    .word EXT_INTERROR4_Handler              /* EXT_INTERROR4_Handler */
    .word EXT_INTERROR5_Handler              /* EXT_INTERROR5_Handler */
    .word EXT_INTERROR6_Handler              /* EXT_INTERROR6_Handler */
    .word EXT_INTERROR7_Handler              /* EXT_INTERROR7_Handler */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word DMA_ERR_Handler                    /* DMA_ERR_Handler */
    .word DMA_DONE0_Handler                  /* DMA_DONE0_Handler */
    .word DMA_DONE1_Handler                  /* DMA_DONE1_Handler */
    .word DMA_DONE2_Handler                  /* DMA_DONE2_Handler */
    .word DMA_DONE3_Handler                  /* DMA_DONE3_Handler */
    .word DMA_DONE4_Handler                  /* DMA_DONE4_Handler */
    .word DMA_DONE5_Handler                  /* DMA_DONE5_Handler */
    .word DMA_DONE6_Handler                  /* DMA_DONE6_Handler */
    .word DMA_DONE7_Handler                  /* DMA_DONE7_Handler */
    .word DMA_DONE8_Handler                  /* DMA_DONE8_Handler */
    .word DMA_DONE9_Handler                  /* DMA_DONE9_Handler */
    .word DMA_DONE10_Handler                 /* DMA_DONE10_Handler */
    .word DMA_DONE11_Handler                 /* DMA_DONE11_Handler */
    .word DMA_DONE12_Handler                 /* DMA_DONE12_Handler */
    .word DMA_DONE13_Handler                 /* DMA_DONE13_Handler */
    .word DMA_DONE14_Handler                 /* DMA_DONE14_Handler */
    .word DMA_DONE15_Handler                 /* DMA_DONE15_Handler */
    .word DMA_DONE16_Handler                 /* DMA_DONE16_Handler */
    .word DMA_DONE17_Handler                 /* DMA_DONE17_Handler */
    .word DMA_DONE18_Handler                 /* DMA_DONE18_Handler */
    .word DMA_DONE19_Handler                 /* DMA_DONE19_Handler */
    .word DMA_DONE20_Handler                 /* DMA_DONE20_Handler */
    .word DMA_DONE21_Handler                 /* DMA_DONE21_Handler */
    .word DMA_DONE22_Handler                 /* DMA_DONE22_Handler */
    .word DMA_DONE23_Handler                 /* DMA_DONE23_Handler */
    .word DMA_DONE24_Handler                 /* DMA_DONE24_Handler */
    .word DMA_DONE25_Handler                 /* DMA_DONE25_Handler */
    .word DMA_DONE26_Handler                 /* DMA_DONE26_Handler */
    .word DMA_DONE27_Handler                 /* DMA_DONE27_Handler */
    .word DMA_DONE28_Handler                 /* DMA_DONE28_Handler */
    .word DMA_DONE29_Handler                 /* DMA_DONE29_Handler */
    .word DMA_DONE30_Handler                 /* DMA_DONE30_Handler */
    .word DMA_DONE31_Handler                 /* DMA_DONE31_Handler */
    .word IRQ_PORTA_Handler                  /* IRQ_PORTA_Handler */
    .word IRQ_PORTB_Handler                  /* IRQ_PORTB_Handler */
    .word IRQ_PORTC_Handler                  /* IRQ_PORTC_Handler */
    .word IRQ_PORTD_Handler                  /* IRQ_PORTD_Handler */
    .word IRQ_PORTE_Handler                  /* IRQ_PORTE_Handler */
    .word 0                                  /* Reserved */
    .word INT_ETH0_Handler                   /* INT_ETH0_Handler */
    .word 0                                  /* Reserved */
    .word INT_SPW0_Handler                   /* INT_SPW0_Handler */
    .word 0                                  /* Reserved */
    .word INT_TMR0_Handler                   /* INT_TMR0_Handler */
    .word INT_TMR1_Handler                   /* INT_TMR1_Handler */
    .word INT_TMR2_Handler                   /* INT_TMR2_Handler */
    .word INT_TMR3_Handler                   /* INT_TMR3_Handler */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word INT_CAN0_Handler                   /* INT_CAN0_Handler */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word INT_SSP0_Handler                   /* INT_SSP0_Handler */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word INT_UART0_Handler                  /* INT_UART0_Handler */
    .word INT_UART1_Handler                  /* INT_UART1_Handler */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word INT_RX_ARC0_Handler                /* INT_RX_ARC0_Handler */
    .word INT_TX_ARC0_Handler                /* INT_TX_ARC0_Handler */
    .word 0                                  /* Reserved */
    .word 0                                  /* Reserved */
    .word INT_MIL0_Handler                   /* INT_MIL0_Handler */
    .word INT_MIL1_Handler                   /* INT_MIL1_Handler */
    .word INT_ADC0_Handler                   /* INT_ADC0_Handler */
    .word INT_ADC1_Handler                   /* INT_ADC1_Handler */
    .word INT_DAC0_Handler                   /* INT_DAC0_Handler */
    .word INT_DAC1_Handler                   /* INT_DAC1_Handler */
__Vectors_End:

__Vectors_Size = __Vectors_End - __Vectors

/* Code section */
.section .text.Reset_Handler, "ax", %progbits
.thumb_func
.global Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
    /* Call SystemInit if defined (optional) */
    .weak SystemInit
    bl SystemInit
    /* Call C library initialization and main */
    bl __libc_init_array
    bl main
    /* Infinite loop if main returns */
    b .
.size Reset_Handler, .-Reset_Handler

/* Default weak exception handlers (infinite loops) */
.macro def_weak_handler name
    .thumb_func
    .weak \name
    .type \name, %function
\name:
    b .
    .size \name, .-\name
.endm

def_weak_handler NMI_Handler
def_weak_handler HardFault_Handler
def_weak_handler MemoryMngFault_Handler
def_weak_handler BusFault_Handler
def_weak_handler UsageFault_Handler
def_weak_handler SVC_Handler
def_weak_handler PendSV_Handler
def_weak_handler SysTick_Handler
def_weak_handler FT_IF0_Handler
def_weak_handler FT_IF1_Handler
def_weak_handler FT_IF2_Handler
def_weak_handler FT_IF3_Handler
def_weak_handler CLK_IF_Handler
def_weak_handler PVD_IF_Handler
def_weak_handler RTC_IF_Handler
def_weak_handler BKP_IF_Handler
def_weak_handler EXT_INTERROR0_Handler
def_weak_handler EXT_INTERROR1_Handler
def_weak_handler EXT_INTERROR2_Handler
def_weak_handler EXT_INTERROR3_Handler
def_weak_handler EXT_INTERROR4_Handler
def_weak_handler EXT_INTERROR5_Handler
def_weak_handler EXT_INTERROR6_Handler
def_weak_handler EXT_INTERROR7_Handler
def_weak_handler IF_ERR_SCR_Handler
def_weak_handler IF_FIN_SCR_Handler
def_weak_handler DMA_ERR_Handler
def_weak_handler DMA_DONE0_Handler
def_weak_handler DMA_DONE1_Handler
def_weak_handler DMA_DONE2_Handler
def_weak_handler DMA_DONE3_Handler
def_weak_handler DMA_DONE4_Handler
def_weak_handler DMA_DONE5_Handler
def_weak_handler DMA_DONE6_Handler
def_weak_handler DMA_DONE7_Handler
def_weak_handler DMA_DONE8_Handler
def_weak_handler DMA_DONE9_Handler
def_weak_handler DMA_DONE10_Handler
def_weak_handler DMA_DONE11_Handler
def_weak_handler DMA_DONE12_Handler
def_weak_handler DMA_DONE13_Handler
def_weak_handler DMA_DONE14_Handler
def_weak_handler DMA_DONE15_Handler
def_weak_handler DMA_DONE16_Handler
def_weak_handler DMA_DONE17_Handler
def_weak_handler DMA_DONE18_Handler
def_weak_handler DMA_DONE19_Handler
def_weak_handler DMA_DONE20_Handler
def_weak_handler DMA_DONE21_Handler
def_weak_handler DMA_DONE22_Handler
def_weak_handler DMA_DONE23_Handler
def_weak_handler DMA_DONE24_Handler
def_weak_handler DMA_DONE25_Handler
def_weak_handler DMA_DONE26_Handler
def_weak_handler DMA_DONE27_Handler
def_weak_handler DMA_DONE28_Handler
def_weak_handler DMA_DONE29_Handler
def_weak_handler DMA_DONE30_Handler
def_weak_handler DMA_DONE31_Handler
def_weak_handler IRQ_PORTA_Handler
def_weak_handler IRQ_PORTB_Handler
def_weak_handler IRQ_PORTC_Handler
def_weak_handler IRQ_PORTD_Handler
def_weak_handler IRQ_PORTE_Handler
def_weak_handler INT_ETH0_Handler
def_weak_handler INT_SPW0_Handler
def_weak_handler INT_TMR0_Handler
def_weak_handler INT_TMR1_Handler
def_weak_handler INT_TMR2_Handler
def_weak_handler INT_TMR3_Handler
def_weak_handler INT_CAN0_Handler
def_weak_handler INT_SSP0_Handler
def_weak_handler INT_UART0_Handler
def_weak_handler INT_UART1_Handler
def_weak_handler INT_RX_ARC0_Handler
def_weak_handler INT_TX_ARC0_Handler
def_weak_handler INT_MIL0_Handler
def_weak_handler INT_MIL1_Handler
def_weak_handler INT_ADC0_Handler
def_weak_handler INT_ADC1_Handler
def_weak_handler INT_DAC0_Handler
def_weak_handler INT_DAC1_Handler

/* Optional: user initial stack heap (for two-region memory) */
#ifdef __USER_INITIAL_STACKHEAP
    .thumb_func
    .global __user_initial_stackheap
    .type __user_initial_stackheap, %function
__user_initial_stackheap:
    ldr r0, =__heap_base
    ldr r1, =__initial_sp
    ldr r2, =__heap_limit
    ldr r3, =__stack_base   /* may need to define __stack_base = _stack_start */
    bx lr
    .size __user_initial_stackheap, .-__user_initial_stackheap
#endif

.end