;/**************************************************************************//**
; * @file     startup_psoc6_01_cm0plus.s
; * @brief    CMSIS Core Device Startup File for
; *           ARMCM0plus Device Series
; * @version  V5.00
; * @date     08. March 2016
; ******************************************************************************/
;/*
; * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
; *
; * SPDX-License-Identifier: Apache-2.0
; *
; * Licensed under the Apache License, Version 2.0 (the License); you may
; * not use this file except in compliance with the License.
; * You may obtain a copy of the License at
; *
; * www.apache.org/licenses/LICENSE-2.0
; *
; * Unless required by applicable law or agreed to in writing, software
; * distributed under the License is distributed on an AS IS BASIS, WITHOUT
; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; * See the License for the specific language governing permissions and
; * limitations under the License.
; */

;
; The modules in this file are included in the libraries, and may be replaced
; by any user-defined modules that define the PUBLIC symbol _program_start or
; a user defined start symbol.
; To override the cstartup defined in the library, simply add your modified
; version to the workbench project.
;
; The vector table is normally located at address 0.
; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
; The name "__vector_table" has special meaning for C-SPY:
; it is where the SP start value is found, and the NVIC vector
; table register (VTOR) is initialized to this address if != 0.
;
; Cortex-M version
;

        MODULE  ?cstartup

        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)
        SECTION .intvec_ram:DATA:NOROOT(2)
        SECTION .intvec:CODE:NOROOT(2)

        EXTERN  __iar_program_start
        EXTERN  SystemInit
        EXTERN __iar_data_init3
        PUBLIC  __vector_table
        PUBLIC  __vector_table_0x1c
        PUBLIC  __Vectors
        PUBLIC  __Vectors_End
        PUBLIC  __Vectors_Size
        PUBLIC  __ramVectors

        DATA

__vector_table
        DCD     sfe(CSTACK)
        DCD     Reset_Handler

        DCD     0x0000000D      ; NMI_Handler is defined in ROM code
        DCD     HardFault_Handler
        DCD     0
        DCD     0
        DCD     0
__vector_table_0x1c
        DCD     0
        DCD     0
        DCD     0
        DCD     0
        DCD     SVC_Handler
        DCD     0
        DCD     0
        DCD     PendSV_Handler
        DCD     SysTick_Handler

        ; External interrupts                         Power Mode  Description
        DCD     NvicMux0_IRQHandler                   ; CM0+ NVIC Mux input 0
        DCD     NvicMux1_IRQHandler                   ; CM0+ NVIC Mux input 1
        DCD     NvicMux2_IRQHandler                   ; CM0+ NVIC Mux input 2
        DCD     NvicMux3_IRQHandler                   ; CM0+ NVIC Mux input 3
        DCD     NvicMux4_IRQHandler                   ; CM0+ NVIC Mux input 4
        DCD     NvicMux5_IRQHandler                   ; CM0+ NVIC Mux input 5
        DCD     NvicMux6_IRQHandler                   ; CM0+ NVIC Mux input 6
        DCD     NvicMux7_IRQHandler                   ; CM0+ NVIC Mux input 7
        DCD     NvicMux8_IRQHandler                   ; CM0+ NVIC Mux input 8
        DCD     NvicMux9_IRQHandler                   ; CM0+ NVIC Mux input 9
        DCD     NvicMux10_IRQHandler                  ; CM0+ NVIC Mux input 10
        DCD     NvicMux11_IRQHandler                  ; CM0+ NVIC Mux input 11
        DCD     NvicMux12_IRQHandler                  ; CM0+ NVIC Mux input 12
        DCD     NvicMux13_IRQHandler                  ; CM0+ NVIC Mux input 13
        DCD     NvicMux14_IRQHandler                  ; CM0+ NVIC Mux input 14
        DCD     NvicMux15_IRQHandler                  ; CM0+ NVIC Mux input 15
        DCD     NvicMux16_IRQHandler                  ; CM0+ NVIC Mux input 16
        DCD     NvicMux17_IRQHandler                  ; CM0+ NVIC Mux input 17
        DCD     NvicMux18_IRQHandler                  ; CM0+ NVIC Mux input 18
        DCD     NvicMux19_IRQHandler                  ; CM0+ NVIC Mux input 19
        DCD     NvicMux20_IRQHandler                  ; CM0+ NVIC Mux input 20
        DCD     NvicMux21_IRQHandler                  ; CM0+ NVIC Mux input 21
        DCD     NvicMux22_IRQHandler                  ; CM0+ NVIC Mux input 22
        DCD     NvicMux23_IRQHandler                  ; CM0+ NVIC Mux input 23
        DCD     NvicMux24_IRQHandler                  ; CM0+ NVIC Mux input 24
        DCD     NvicMux25_IRQHandler                  ; CM0+ NVIC Mux input 25
        DCD     NvicMux26_IRQHandler                  ; CM0+ NVIC Mux input 26
        DCD     NvicMux27_IRQHandler                  ; CM0+ NVIC Mux input 27
        DCD     NvicMux28_IRQHandler                  ; CM0+ NVIC Mux input 28
        DCD     NvicMux29_IRQHandler                  ; CM0+ NVIC Mux input 29
        DCD     NvicMux30_IRQHandler                  ; CM0+ NVIC Mux input 30
        DCD     NvicMux31_IRQHandler                  ; CM0+ NVIC Mux input 31

__Vectors_End

__Vectors       EQU   __vector_table
__Vectors_Size  EQU   __Vectors_End - __Vectors

        SECTION .intvec_ram:DATA:REORDER:NOROOT(2)
__ramVectors
        DS32     __Vectors_Size


        THUMB

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default handlers
;;
        PUBWEAK Default_Handler
        SECTION .text:CODE:REORDER:NOROOT(2)
Default_Handler
        B Default_Handler


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Weak function for startup customization
;;
;; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) 
;; because this function is executed as the first instruction in the ResetHandler.
;; The PDL is also not initialized to use the proper register offsets.
;; The user of this function is responsible for initializing the PDL and resources before using them.
;;
        PUBWEAK Cy_OnResetUser
        SECTION .text:CODE:REORDER:NOROOT(2)
Cy_OnResetUser
        BX LR

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Define strong version to return zero for
;; __iar_program_start to skip data sections
;; initialization.
;;
        PUBLIC __low_level_init
        SECTION .text:CODE:REORDER:NOROOT(2)
__low_level_init
        MOVS R0, #0
        BX LR

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
        THUMB
        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler

        ; Define strong function for startup customization
        LDR     R0, =Cy_OnResetUser
        BLX     R0

        ; Disable global interrupts
        CPSID I

        ; Copy vectors from ROM to RAM
        LDR r1, =__vector_table
        LDR r0, =__ramVectors
        LDR r2, =__Vectors_Size
intvec_copy
        LDR r3, [r1]
        STR r3, [r0]
        ADDS r0, r0, #4
        ADDS r1, r1, #4
        SUBS r2, r2, #1
        CMP r2, #0
        BNE intvec_copy

        ; Update Vector Table Offset Register
        LDR r0, =__ramVectors
        LDR r1, =0xE000ED08
        STR r0, [r1]
        dsb

        ; Initialize data sections
        LDR     R0, =__iar_data_init3
        BLX     R0

        LDR     R0, =SystemInit
        BLX     R0

        LDR     R0, =__iar_program_start
        BLX     R0

; Should never get here
Cy_Main_Exited
        B Cy_Main_Exited


        PUBWEAK NMI_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
NMI_Handler
        B NMI_Handler


        PUBWEAK Cy_SysLib_FaultHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
Cy_SysLib_FaultHandler
        B Cy_SysLib_FaultHandler

        PUBWEAK HardFault_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
HardFault_Handler
        IMPORT Cy_SysLib_FaultHandler
        movs r0, #4
        mov r1, LR
        tst r0, r1
        beq L_MSP
        mrs r0, PSP
        b L_API_call
L_MSP
        mrs r0, MSP
L_API_call
        ; Storing LR content for Creator call stack trace
        push {LR}
        bl Cy_SysLib_FaultHandler


        PUBWEAK SVC_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
SVC_Handler
        B SVC_Handler

        PUBWEAK PendSV_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
PendSV_Handler
        B PendSV_Handler

        PUBWEAK SysTick_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
SysTick_Handler
        B SysTick_Handler


        ; External interrupts
        PUBWEAK NvicMux0_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux0_IRQHandler
        B       NvicMux0_IRQHandler

        PUBWEAK NvicMux1_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux1_IRQHandler
        B       NvicMux1_IRQHandler

        PUBWEAK NvicMux2_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux2_IRQHandler
        B       NvicMux2_IRQHandler

        PUBWEAK NvicMux3_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux3_IRQHandler
        B       NvicMux3_IRQHandler

        PUBWEAK NvicMux4_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux4_IRQHandler
        B       NvicMux4_IRQHandler

        PUBWEAK NvicMux5_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux5_IRQHandler
        B       NvicMux5_IRQHandler

        PUBWEAK NvicMux6_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux6_IRQHandler
        B       NvicMux6_IRQHandler

        PUBWEAK NvicMux7_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux7_IRQHandler
        B       NvicMux7_IRQHandler

        PUBWEAK NvicMux8_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux8_IRQHandler
        B       NvicMux8_IRQHandler

        PUBWEAK NvicMux9_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux9_IRQHandler
        B       NvicMux9_IRQHandler

        PUBWEAK NvicMux10_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux10_IRQHandler
        B       NvicMux10_IRQHandler

        PUBWEAK NvicMux11_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux11_IRQHandler
        B       NvicMux11_IRQHandler

        PUBWEAK NvicMux12_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux12_IRQHandler
        B       NvicMux12_IRQHandler

        PUBWEAK NvicMux13_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux13_IRQHandler
        B       NvicMux13_IRQHandler

        PUBWEAK NvicMux14_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux14_IRQHandler
        B       NvicMux14_IRQHandler

        PUBWEAK NvicMux15_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux15_IRQHandler
        B       NvicMux15_IRQHandler

        PUBWEAK NvicMux16_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux16_IRQHandler
        B       NvicMux16_IRQHandler

        PUBWEAK NvicMux17_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux17_IRQHandler
        B       NvicMux17_IRQHandler

        PUBWEAK NvicMux18_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux18_IRQHandler
        B       NvicMux18_IRQHandler

        PUBWEAK NvicMux19_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux19_IRQHandler
        B       NvicMux19_IRQHandler

        PUBWEAK NvicMux20_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux20_IRQHandler
        B       NvicMux20_IRQHandler

        PUBWEAK NvicMux21_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux21_IRQHandler
        B       NvicMux21_IRQHandler

        PUBWEAK NvicMux22_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux22_IRQHandler
        B       NvicMux22_IRQHandler

        PUBWEAK NvicMux23_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux23_IRQHandler
        B       NvicMux23_IRQHandler

        PUBWEAK NvicMux24_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux24_IRQHandler
        B       NvicMux24_IRQHandler

        PUBWEAK NvicMux25_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux25_IRQHandler
        B       NvicMux25_IRQHandler

        PUBWEAK NvicMux26_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux26_IRQHandler
        B       NvicMux26_IRQHandler

        PUBWEAK NvicMux27_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux27_IRQHandler
        B       NvicMux27_IRQHandler

        PUBWEAK NvicMux28_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux28_IRQHandler
        B       NvicMux28_IRQHandler

        PUBWEAK NvicMux29_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux29_IRQHandler
        B       NvicMux29_IRQHandler

        PUBWEAK NvicMux30_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux30_IRQHandler
        B       NvicMux30_IRQHandler

        PUBWEAK NvicMux31_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
NvicMux31_IRQHandler
        B       NvicMux31_IRQHandler


        END


; [] END OF FILE
