/*
Copyright (c) 2015, Nordic Semiconductor ASA
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of Nordic Semiconductor ASA nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*
NOTE: Template files (including this one) are application specific and therefore
expected to be copied into the application project folder prior to its use!
*/

    .syntax unified
    .arch armv6-m

    .section .stack
    .align 3
    .equ    Stack_Size, 432
    .globl    __StackTop
    .globl    __StackLimit
__StackLimit:
    .space    Stack_Size
    .size __StackLimit, . - __StackLimit
__StackTop:
    .size __StackTop, . - __StackTop

    .section .heap
    .align 3
#ifdef __HEAP_SIZE
    .equ    Heap_Size, __HEAP_SIZE
#else
    .equ    Heap_Size, 0
#endif
    .globl    __HeapBase
    .globl    __HeapLimit
__HeapBase:
    .if    Heap_Size
    .space    Heap_Size
    .endif
    .size __HeapBase, . - __HeapBase
__HeapLimit:
    .size __HeapLimit, . - __HeapLimit

    .section .isr_vector
    .align 2
    .globl __isr_vector
__isr_vector:
    .long    __StackTop                 /* Top of Stack */
    .long   Reset_Handler               /* Reset Handler */
    .long   _NMI_Handler                /* NMI Handler */
    .long   _HardFault_Handler          /* Hard Fault Handler */
    .long   0                           /* Reserved */
    .long   0                           /* Reserved */
    .long   0                           /* Reserved */
    .long   0                           /* Reserved */
    .long   0                           /* Reserved */
    .long   0                           /* Reserved */
    .long   0                           /* Reserved */
    .long   _SVC_Handler                /* SVCall Handler */
    .long   0                           /* Reserved */
    .long   0                           /* Reserved */
    .long   _PendSV_Handler             /* PendSV Handler */
    .long   _SysTick_Handler            /* SysTick Handler */

  /* External Interrupts */
    .long   _POWER_CLOCK_IRQHandler
    .long   _RADIO_IRQHandler
    .long   _UART0_IRQHandler
    .long   _SPI0_TWI0_IRQHandler
    .long   _SPI1_TWI1_IRQHandler
    .long   0                         /*Reserved */
    .long   _GPIOTE_IRQHandler
    .long   ADC_IRQHandler
    .long   _TIMER0_IRQHandler
    .long   _TIMER1_IRQHandler
    .long   _TIMER2_IRQHandler
    .long   _RTC0_IRQHandler
    .long   _TEMP_IRQHandler
    .long   _RNG_IRQHandler
    .long   _ECB_IRQHandler
    .long   _CCM_AAR_IRQHandler
    .long   _WDT_IRQHandler
    .long   _RTC1_IRQHandler
    .long   _QDEC_IRQHandler
    .long   _LPCOMP_IRQHandler
    .long   _SWI0_IRQHandler
    .long   _SWI1_IRQHandler
    .long   _SWI2_IRQHandler
    .long   _SWI3_IRQHandler
    .long   _SWI4_IRQHandler
    .long   _SWI5_IRQHandler
    .long   0                         /*Reserved */
    .long   0                         /*Reserved */
    .long   0                         /*Reserved */
    .long   0                         /*Reserved */
    .long   0                         /*Reserved */
    .long   0                         /*Reserved */

    .size    __isr_vector, . - __isr_vector

/* Reset Handler */

    .equ    NRF_POWER_RAMON_ADDRESS,             0x40000524
    .equ    NRF_POWER_RAMONB_ADDRESS,            0x40000554
    .equ    NRF_POWER_RAMONx_RAMxON_ONMODE_Msk,  0x3

    .text
    .thumb
    .thumb_func
    .align 1
    .globl    Reset_Handler
    .type    Reset_Handler, %function
Reset_Handler:
    .fnstart

/* Make sure ALL RAM banks are powered on */
    MOVS    R1, #NRF_POWER_RAMONx_RAMxON_ONMODE_Msk

    LDR     R0, =NRF_POWER_RAMON_ADDRESS
    LDR     R2, [R0]
    ORRS    R2, R1
    STR     R2, [R0]

    LDR     R0, =NRF_POWER_RAMONB_ADDRESS
    LDR     R2, [R0]
    ORRS    R2, R1
    STR     R2, [R0]

    /* Clear BSS */
    subs    r0, r0
    ldr     r2, =__bss_start__
    ldr     r3, =__bss_end__
.bss_zero_loop:
    cmp     r2, r3
    bhs     .data_copy_loop
    stmia   r2!, {r0}
    b    .bss_zero_loop

/*     Loop to copy data from read only memory to RAM. The ranges
 *      of copy from/to are specified by following symbols evaluated in
 *      linker script.
 *      __etext: End of code section, i.e., begin of data sections to copy from.
 *      __data_start__/__data_end__: RAM address range that data should be
 *      copied to. Both must be aligned to 4 bytes boundary.  */
.data_copy_loop:
    ldr    r1, =__etext
    ldr    r2, =__data_start__
    ldr    r3, =__data_end__

    subs    r3, r2
    ble     .LC0

.LC1:
    subs    r3, 4
    ldr    r0, [r1,r3]
    str    r0, [r2,r3]
    bgt    .LC1
.LC0:
    LDR     R0, =__HeapBase
    LDR     R1, =__HeapLimit
    BL      _sbrkInit

    LDR     R0, =SystemInit
    BLX     R0

    BL      hal_system_init

    LDR     R0, =_start
    BX      R0

    .pool
    .cantunwind
    .fnend
    .size   Reset_Handler,.-Reset_Handler

    .section ".text"


/* Dummy Exception Handlers (infinite loops which can be modified) */

    .weak   NMI_Handler
    .type   NMI_Handler, %function
NMI_Handler:
    B       .
    .size   NMI_Handler, . - NMI_Handler

    .weak   SVC_Handler
    .type   SVC_Handler, %function
SVC_Handler:
    B       .
    .size   SVC_Handler, . - SVC_Handler


    .weak   PendSV_Handler
    .type   PendSV_Handler, %function
PendSV_Handler:
    B       .
    .size   PendSV_Handler, . - PendSV_Handler


    .weak   SysTick_Handler
    .type   SysTick_Handler, %function
SysTick_Handler:
    B       .
    .size   SysTick_Handler, . - SysTick_Handler

/* Default handler. This uses the vector in the relocated vector table */
    .globl  Default_Handler
    .type   Default_Handler, %function
Default_Handler:
    LDR     R2, =__vector_tbl_reloc__
    MRS     R0, PSR
    MOVS    R1, #0x3F
    ANDS    R0, R1
    LSLS    R0, R0, #2
    LDR     R0, [R0, R2]
    BX      R0
    .size   Default_Handler, . - Default_Handler

/*
 * All of the following IRQ Handlers will point to the default handler unless
 * they are defined elsewhere.
 */
    .macro  IRQ handler
    .weak   \handler
    .set    \handler, Default_Handler
    .endm

    IRQ  _NMI_Handler
    IRQ  _HardFault_Handler
    IRQ  _SVC_Handler
    IRQ  _PendSV_Handler
    IRQ  _SysTick_Handler
    IRQ  _POWER_CLOCK_IRQHandler
    IRQ  _RADIO_IRQHandler
    IRQ  _UART0_IRQHandler
    IRQ  _SPI0_TWI0_IRQHandler
    IRQ  _SPI1_TWI1_IRQHandler
    IRQ  _GPIOTE_IRQHandler
    IRQ  ADC_IRQHandler
    IRQ  _TIMER0_IRQHandler
    IRQ  _TIMER1_IRQHandler
    IRQ  _TIMER2_IRQHandler
    IRQ  _RTC0_IRQHandler
    IRQ  _TEMP_IRQHandler
    IRQ  _RNG_IRQHandler
    IRQ  _ECB_IRQHandler
    IRQ  _CCM_AAR_IRQHandler
    IRQ  _WDT_IRQHandler
    IRQ  _RTC1_IRQHandler
    IRQ  _QDEC_IRQHandler
    IRQ  _LPCOMP_IRQHandler
    IRQ  _SWI0_IRQHandler
    IRQ  _SWI1_IRQHandler
    IRQ  _SWI2_IRQHandler
    IRQ  _SWI3_IRQHandler
    IRQ  _SWI4_IRQHandler
    IRQ  _SWI5_IRQHandler

  .end
