/*
 * FreeRTOS Kernel V10.3.1
 * 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.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 * 1 tab == 4 spaces!
 */

#include "FreeRTOS.h"
#include "task.h"

/*-----------------------------------------------------------
* Implementation of functions defined in portable.h for the 16FX port.
*----------------------------------------------------------*/

/*
 * Get current value of DPR and ADB registers
 */
StackType_t xGet_DPR_ADB_bank( void );

/*
 * Get current value of DTB and PCB registers
 */
StackType_t xGet_DTB_PCB_bank( void );

/*
 * Sets up the periodic ISR used for the RTOS tick.  This uses RLT0, but
 * can be done using any given RLT.
 */
static void prvSetupRLT0Interrupt( void );

/*-----------------------------------------------------------*/

/*
 * We require the address of the pxCurrentTCB variable, but don't want to know
 * any details of its type.
 */
typedef void TCB_t;
extern volatile TCB_t * volatile pxCurrentTCB;

/*-----------------------------------------------------------*/

/*
 * Macro to save a task context to the task stack. This macro  copies the
 * saved context (AH:AL, DPR:ADB, DTB:PCB , PC and PS) from  the   system
 * stack to task stack pointed by user stack pointer ( USP  for SMALL and
 * MEDIUM memory model amd USB:USP for COMPACT  and LARGE memory model ),
 * then  it pushes the general purpose registers RW0-RW7  on  to the task
 * stack. Finally the  resultant  stack  pointer  value is saved into the
 * task  control  block  so  it  can  be retrieved the next time the task
 * executes.
 */
#if ( ( configMEMMODEL == portSMALL ) || ( configMEMMODEL == portMEDIUM ) )

    #define portSAVE_CONTEXT()                              \
    { __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " PUSHW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) " ); \
      __asm( " MOVW A, _pxCurrentTCB " );                   \
      __asm( " MOVW A, SP " );                              \
      __asm( " SWAPW " );                                   \
      __asm( " MOVW @AL, AH " );                            \
      __asm( " OR   CCR,#H'20 " );                          \
    }

/*
 * Macro to restore a task context from the task stack.  This is effecti-
 * vely the reverse of SAVE_CONTEXT(). First the stack pointer  value
 * (USP for SMALL and MEDIUM memory model amd  USB:USP  for  COMPACT  and
 * LARGE memory model ) is loaded from the task  control block.  Next the
 * value of all the general purpose registers RW0-RW7 is retrieved. Fina-
 * lly it copies of the context ( AH:AL,  DPR:ADB, DTB:PCB, PC and PS) of
 * the task to be executed upon RETI from user stack to system stack.
 */

    #define portRESTORE_CONTEXT()                          \
    { __asm( " MOVW A, _pxCurrentTCB " );                  \
      __asm( " MOVW A, @A " );                             \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " MOVW SP, A " );                             \
      __asm( " POPW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) " ); \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
    }

#elif ( ( configMEMMODEL == portCOMPACT ) || ( configMEMMODEL == portLARGE ) )

    #define portSAVE_CONTEXT()                              \
    { __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                          \
      __asm( " POPW  A " );                                 \
      __asm( " AND  CCR,#H'DF " );                          \
      __asm( " PUSHW  A " );                                \
      __asm( " PUSHW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) " ); \
      __asm( " MOVL A, _pxCurrentTCB " );                   \
      __asm( " MOVL RL2, A " );                             \
      __asm( " MOVW A, SP " );                              \
      __asm( " MOVW @RL2+0, A " );                          \
      __asm( " MOV A, USB " );                              \
      __asm( " MOV @RL2+2, A " );                           \
    }

    #define portRESTORE_CONTEXT()                          \
    { __asm( " MOVL A, _pxCurrentTCB " );                  \
      __asm( " MOVL RL2, A " );                            \
      __asm( " MOVW A, @RL2+0 " );                         \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " MOVW SP, A " );                             \
      __asm( " MOV A, @RL2+2 " );                          \
      __asm( " MOV USB, A " );                             \
      __asm( " POPW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) " ); \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
      __asm( " AND  CCR,#H'DF " );                         \
      __asm( " POPW  A " );                                \
      __asm( " OR   CCR,#H'20 " );                         \
      __asm( " PUSHW  A " );                               \
    }
#endif /* if ( ( configMEMMODEL == portSMALL ) || ( configMEMMODEL == portMEDIUM ) ) */

/*-----------------------------------------------------------*/

/*
 * Functions for obtaining the current value  of  DPR:ADB, DTB:PCB bank registers
 */

#pragma asm

        .GLOBAL    _xGet_DPR_ADB_bank
        .GLOBAL    _xGet_DTB_PCB_bank
        .SECTION   CODE, CODE, ALIGN=1

_xGet_DPR_ADB_bank:

    MOV A, DPR
    SWAP
    MOV A, ADB
    ORW A
	#if configMEMMODEL == portMEDIUM || configMEMMODEL == portLARGE
		RETP
	#elif configMEMMODEL == portSMALL || configMEMMODEL == portCOMPACT   
		RET
	#endif 


_xGet_DTB_PCB_bank:

    MOV A, DTB
    SWAP
    MOV A, PCB
    ORW A
	#if configMEMMODEL == portMEDIUM || configMEMMODEL == portLARGE
		RETP
	#elif configMEMMODEL == portSMALL || configMEMMODEL == portCOMPACT   
		RET
	#endif 

#pragma endasm
/*-----------------------------------------------------------*/

/*
 * Initialise the stack of a task to look exactly as if a call to
 * portSAVE_CONTEXT had been called.
 *
 * See the header file portable.h.
 */
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
                                     TaskFunction_t pxCode,
                                     void * pvParameters )
{
    /* Place a few bytes of known values on the bottom of the stack.
     * This is just useful for debugging. */
    *pxTopOfStack = 0x1111;
    pxTopOfStack--;
    *pxTopOfStack = 0x2222;
    pxTopOfStack--;
    *pxTopOfStack = 0x3333;
    pxTopOfStack--;

    /* Once the task is called the task  would  push  the  pointer to the
     * parameter onto the stack. Hence here the pointer would be copied to the stack
     * first.  When using the COMPACT or LARGE memory model the pointer would be 24
     * bits, and when using the SMALL or MEDIUM memory model the pointer would be 16
     * bits. */
    #if ( ( configMEMMODEL == portCOMPACT ) || ( configMEMMODEL == portLARGE ) )
        {
            *pxTopOfStack = ( StackType_t ) ( ( uint32_t ) ( pvParameters ) >> 16 );
            pxTopOfStack--;
        }
    #endif

    *pxTopOfStack = ( StackType_t ) ( pvParameters );
    pxTopOfStack--;

    /* This is redundant push to the stack. This is required in order to introduce
     * an offset so that the task accesses a parameter correctly that is passed on to
     * the task stack. */
    #if ( ( configMEMMODEL == portMEDIUM ) || ( configMEMMODEL == portLARGE ) )
        {
            *pxTopOfStack = ( xGet_DTB_PCB_bank() & 0xff00 ) | ( ( ( int32_t ) ( pxCode ) >> 16 ) & 0xff );
            pxTopOfStack--;
        }
    #endif

    /* This is redundant push to the stack. This is required in order to introduce
     * an offset so the task correctly accesses the parameter passed on the task stack. */
    *pxTopOfStack = ( StackType_t ) ( pxCode );
    pxTopOfStack--;

    /* PS - User Mode, ILM=7, RB=0, Interrupts enabled,USP */
    *pxTopOfStack = 0xE0C0;
    pxTopOfStack--;

    /* PC */
    *pxTopOfStack = ( StackType_t ) ( pxCode );
    pxTopOfStack--;

    /* DTB | PCB */
    #if configMEMMODEL == portSMALL || configMEMMODEL == portCOMPACT
        {
            *pxTopOfStack = xGet_DTB_PCB_bank();
            pxTopOfStack--;
        }
    #endif

    /* DTB | PCB, in case of MEDIUM and LARGE memory models, PCB would be used
     * along with PC to indicate the start address of the function. */
    #if ( ( configMEMMODEL == portMEDIUM ) || ( configMEMMODEL == portLARGE ) )
        {
            *pxTopOfStack = ( xGet_DTB_PCB_bank() & 0xff00 ) | ( ( ( int32_t ) ( pxCode ) >> 16 ) & 0xff );
            pxTopOfStack--;
        }
    #endif

    /* DPR | ADB  */
    *pxTopOfStack = xGet_DPR_ADB_bank();
    pxTopOfStack--;

    /* AL */
    *pxTopOfStack = ( StackType_t ) 0x9999;
    pxTopOfStack--;

    /* AH */
    *pxTopOfStack = ( StackType_t ) 0xAAAA;
    pxTopOfStack--;

    /* Next the general purpose registers. */
    *pxTopOfStack = ( StackType_t ) 0x7777; /* RW7 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x6666; /* RW6 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x5555; /* RW5 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x4444; /* RW4 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x3333; /* RW3 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x2222; /* RW2 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x1111; /* RW1 */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x8888; /* RW0 */

    return pxTopOfStack;
}
/*-----------------------------------------------------------*/

static void prvSetupRLT0Interrupt( void )
{
/* The peripheral clock divided by 16 is used by the timer. */
    const uint16_t usReloadValue = ( uint16_t ) ( ( ( configCLKP1_CLOCK_HZ / configTICK_RATE_HZ ) / 16UL ) - 1UL );

    /* set reload value = 34999+1, TICK Interrupt after 10 ms @ 56MHz of CLKP1 */
    TMRLR0 = usReloadValue;

    /* prescaler 1:16, reload, interrupt enable, count enable, trigger */
    TMCSR0 = 0x041B;
}
/*-----------------------------------------------------------*/

BaseType_t xPortStartScheduler( void )
{
    /* Setup the hardware to generate the tick. */
    prvSetupRLT0Interrupt();

    /* Restore the context of the first task that is going to run. */
    portRESTORE_CONTEXT();

    /* Simulate a function call end as generated by the compiler.  We will now
     * jump to the start of the task the context of which we have just restored. */
    __asm( " reti " );


    /* Should not get here. */
    return pdTRUE;
}
/*-----------------------------------------------------------*/

void vPortEndScheduler( void )
{
    /* Not implemented - unlikely to ever be required as there is nothing to
     * return to. */
}

/*-----------------------------------------------------------*/

/*
 * The interrupt service routine used depends on whether the pre-emptive
 * scheduler is being used or not.
 */

#if configUSE_PREEMPTION == 1

/*
 * Tick ISR for preemptive scheduler.  We can use a __nosavereg attribute
 * as the context is to be saved by the portSAVE_CONTEXT() macro, not the
 * compiler generated code.  The tick count is incremented after the context
 * is saved.
 */
    __nosavereg __interrupt void prvRLT0_TICKISR( void )
    {
        /* Disable interrupts so that portSAVE_CONTEXT() is not interrupted */
        __DI();

        /* Save the context of the interrupted task. */
        portSAVE_CONTEXT();

        /* Enable interrupts */
        __EI();

        /* Clear RLT0 interrupt flag */
        TMCSR0_UF = 0;

        /* Increment the tick count then switch to the highest priority task
         * that is ready to run. */
        if( xTaskIncrementTick() != pdFALSE )
        {
            vTaskSwitchContext();
        }

        /* Disable interrupts so that portRESTORE_CONTEXT() is not interrupted */
        __DI();

        /* Restore the context of the new task. */
        portRESTORE_CONTEXT();

        /* Enable interrupts */
        __EI();
    }

#else /* if configUSE_PREEMPTION == 1 */

/*
 * Tick ISR for the cooperative scheduler.  All this does is increment the
 * tick count.  We don't need to switch context, this can only be done by
 * manual calls to taskYIELD();
 */
    __interrupt void prvRLT0_TICKISR( void )
    {
        /* Clear RLT0 interrupt flag */
        TMCSR0_UF = 0;

        xTaskIncrementTick();
    }

#endif /* if configUSE_PREEMPTION == 1 */

/*-----------------------------------------------------------*/

/*
 * Manual context switch. We can use a __nosavereg attribute  as the context
 * is to be saved by the portSAVE_CONTEXT() macro, not the compiler generated
 * code.
 */
__nosavereg __interrupt void vPortYield( void )
{
    /* Save the context of the interrupted task. */
    portSAVE_CONTEXT();

    /* Switch to the highest priority task that is ready to run. */
    vTaskSwitchContext();

    /* Restore the context of the new task. */
    portRESTORE_CONTEXT();
}
/*-----------------------------------------------------------*/

__nosavereg __interrupt void vPortYieldDelayed( void )
{
    /* Disable interrupts so that portSAVE_CONTEXT() is not interrupted */
    __DI();

    /* Save the context of the interrupted task. */
    portSAVE_CONTEXT();

    /* Enable interrupts */
    __EI();

    /* Clear delayed interrupt flag */
    __asm( " CLRB  03A4H:0 " );

    /* Switch to the highest priority task that is ready to run. */
    vTaskSwitchContext();

    /* Disable interrupts so that portSAVE_CONTEXT() is not interrupted */
    __DI();

    /* Restore the context of the new task. */
    portRESTORE_CONTEXT();

    /* Enable interrupts */
    __EI();
}
/*-----------------------------------------------------------*/
