;/*
; * 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 "ISR_Support.h"

#define CS                    0xFFFFC
#define ES                    0xFFFFD

	PUBLIC    vPortYield
	PUBLIC    vPortStartFirstTask
	PUBLIC    vPortTickISR

	EXTERN    vTaskSwitchContext
	EXTERN    xTaskIncrementTick

; FreeRTOS yield handler.  This is installed as the BRK software interrupt
; handler.
    RSEG CODE:CODE
vPortYield:
	portSAVE_CONTEXT		        ; Save the context of the current task.
	call      vTaskSwitchContext    ; Call the scheduler to select the next task.
	portRESTORE_CONTEXT		        ; Restore the context of the next task to run.
	retb


; Starts the scheduler by restoring the context of the task that will execute
; first.
    RSEG CODE:CODE
vPortStartFirstTask:
	portRESTORE_CONTEXT	            ; Restore the context of whichever task the ...
	reti					        ; An interrupt stack frame is used so the task
                                    ; is started using a RETI instruction.

; FreeRTOS tick handler.  This is installed as the interval timer interrupt
; handler.
	 RSEG CODE:CODE
vPortTickISR:

	portSAVE_CONTEXT		       ; Save the context of the current task.
	call	xTaskIncrementTick     ; Call the timer tick function.
	cmpw	ax, #0x00
	skz
	call	vTaskSwitchContext     ; Call the scheduler to select the next task.
	portRESTORE_CONTEXT		       ; Restore the context of the next task to run.
	reti


; Install the interrupt handlers

	COMMON INTVEC:CODE:ROOT(1)
	ORG configTICK_VECTOR
	DW vPortTickISR

	COMMON INTVEC:CODE:ROOT(1)
	ORG 126
	DW vPortYield


      END
