/*
 * FreeRTOS Kernel V202110.00
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * 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
 *
 * 1 tab == 4 spaces!
 */
#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

