/*
 * FreeRTOS Kernel <DEVELOPMENT BRANCH>
 * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */
#include "msp430.h"
#include "FreeRTOSConfig.h"
#include "data_model.h"

    IMPORT xTaskIncrementTick
    IMPORT vTaskSwitchContext
    IMPORT vPortSetupTimerInterrupt
    IMPORT pxCurrentTCB
    IMPORT usCriticalNesting

    EXPORT vPortTickISR
    EXPORT vPortYield
    EXPORT xPortStartScheduler

portSAVE_CONTEXT macro

    /* Save the remaining registers. */
    pushm_x #12, r15
    mov.w   &usCriticalNesting, r14
    push_x r14
    mov_x   &pxCurrentTCB, r12
    mov_x   sp, 0( r12 )
    endm
/*-----------------------------------------------------------*/

portRESTORE_CONTEXT macro

    mov_x   &pxCurrentTCB, r12
    mov_x   @r12, sp
    pop_x   r15
    mov.w   r15, &usCriticalNesting
    popm_x  #12, r15
    nop
    pop.w   sr
    nop
    reta
    endm
/*-----------------------------------------------------------*/


/*
 * The RTOS tick ISR.
 *
 * If the cooperative scheduler is in use this simply increments the tick
 * count.
 *
 * If the preemptive scheduler is in use a context switch can also occur.
 */

    RSEG CODE
    EVEN

vPortTickISR:

    /* The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs
    to save it manually before it gets modified (interrupts get disabled).
    Entering through this interrupt means the SR is already on the stack, but
    this keeps the stack frames identical. */
    push.w sr
    portSAVE_CONTEXT

    calla   #xTaskIncrementTick
    cmp.w   #0x0, R12
    jeq     SkipContextSwitch
    calla   #vTaskSwitchContext
SkipContextSwitch:
    portRESTORE_CONTEXT
/*-----------------------------------------------------------*/

/*
 * Manual context switch called by the portYIELD() macro.
 */
    EVEN

vPortYield:

    /* The sr needs saving before it is modified. */
    push.w  sr

    /* Now the SR is stacked interrupts can be disabled. */
    dint
    nop

    /* Save the context of the current task. */
    portSAVE_CONTEXT

    /* Select the next task to run. */
    calla   #vTaskSwitchContext

    /* Restore the context of the new task. */
    portRESTORE_CONTEXT
/*-----------------------------------------------------------*/


/*
 * Start off the scheduler by initialising the RTOS tick timer, then restoring
 * the context of the first task.
 */
    EVEN

xPortStartScheduler:

    /* Setup the hardware to generate the tick.  Interrupts are disabled
    when this function is called. */
    calla   #vPortSetupTimerInterrupt

    /* Restore the context of the first task that is going to run. */
    portRESTORE_CONTEXT
/*-----------------------------------------------------------*/

    END
