OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [cpukit/] [score/] [cpu/] [h8300/] [cpu_asm.S] - Rev 1765

Compare with Previous | Blame | View Log

/*
 * Hitachi H8 Score CPU functions
 *   Copyright Comnet Technologies Ltd 1999
 *
 *  Based on example code and other ports with this copyright:
 *  
 *  COPYRIGHT (c) 1989-1999.
 *  On-Line Applications Research Corporation (OAR).
 *  
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.OARcorp.com/rtems/license.html.
 *  
 *  cpu_asm.S,v 1.4 2001/01/03 16:29:36 joel Exp
 */


;.equ   RUNCONTEXT_ARG,  er0
;.equ   HEIRCONTEXT_ARG, er1
        
/*      
 *  Make sure we tell the assembler what type of CPU model we are
 *  being compiled for.
 */ 

#if defined(__H8300H__)
        .h8300h
#endif
#if defined(__H8300S__) 
        .h8300s
#endif
        .text

        .text
/*
        GCC Compiled with optimisations and Wimplicit decs to ensure
    that stack from doesn't change
        
        Supposedly R2 and R3 do not need to be saved but who knows
        
        Arg1 = er0      (not on stack)
        Arg2 = er1      (not on stack)
*/

        .align 2

        .global __CPU_Context_switch

__CPU_Context_switch:
        /* Save Context */
#if defined(__H8300H__) || defined(__H8300S__)
        stc.w   ccr,@(0:16,er0)
        mov.l   er7,@(2:16,er0)
        mov.l   er6,@(6:16,er0)
        mov.l   er5,@(10:16,er0)
        mov.l   er4,@(14:16,er0)
        mov.l   er3,@(18:16,er0)
        mov.l   er2,@(22:16,er0)

        /* Install New context */

restore:
        mov.l   @(22:16,er1),er2
        mov.l   @(18:16,er1),er3
        mov.l   @(14:16,er1),er4
        mov.l   @(10:16,er1),er5
        mov.l   @(6:16,er1),er6
        mov.l   @(2:16,er1),er7
        ldc.w   @(0:16,er1),ccr
#endif

        rts

        .align 2

        .global __CPU_Context_restore

__CPU_Context_restore:
        
#if defined(__H8300H__) || defined(__H8300S__)
        mov.l   er0,er1
        jmp             @restore:24
#endif



/*
        VHandler for Vectored Interrupts
        
        All IRQ's are vectored to routine _ISR_#vector_number
        This routine stacks er0 and loads er0 with vector number
        before transferring to here
        
*/
        .align 2
        .global __ISR_Handler
        .extern __ISR_Nest_level
        .extern __Vector_table
        .extern __Context_switch_necessary

        
__ISR_Handler:
#if defined(__H8300H__) || defined(__H8300S__)
        mov.l   er1,@-er7
        mov.l   er2,@-er7
        mov.l   er3,@-er7
        mov.l   er4,@-er7
        mov.l   er5,@-er7
        mov.l   er6,@-er7
        
/*  Set IRQ Stack */
        orc             #0xc0,ccr
        mov.l   er7,er6         ; save stack pointer
        mov.l   @__ISR_Nest_level,er1
        bne             nested
        mov.l   @__CPU_Interrupt_stack_high,er7
        
nested:
        mov.l   er6,@-er7       ; save sp so pop regardless of nest level
        
;; Inc  system counters 
        mov.l   @__ISR_Nest_level,er1
        inc.l   #1,er1
        mov.l   er1,@__ISR_Nest_level
        mov.l   @__Thread_Dispatch_disable_level,er1
        inc.l   #1,er1
        mov.l   er1,@__Thread_Dispatch_disable_level
        
/* Vector to ISR */

        mov.l   @__ISR_Vector_table,er1
        mov             er0,er2 ; copy vector
        shll.l  er2
        shll.l  er2             ; vector = vector * 4 (sizeof(int))
        add.l   er2,er1
    mov.l       @er1,er1
        jsr             @er1    ; er0 = arg1 =vector
        
        orc             #0xc0,ccr
        mov.l   @__ISR_Nest_level,er1
        dec.l   #1,er1
        mov.l   er1,@__ISR_Nest_level
        mov.l   @__Thread_Dispatch_disable_level,er1
        dec.l   #1,er1
        mov.l   er1,@__Thread_Dispatch_disable_level
        bne             exit
        
        mov.l   @__Context_Switch_necessary,er1
        bne             bframe          ; If yes then dispatch next task
        
        mov.l   @__ISR_Signals_to_thread_executing,er1
        beq             exit            ; If no signals waiting

        /* Context switch here through ISR_Dispatch */
        
bframe:
        orc             #0xc0,ccr
/*      Pop Stack       */
        mov             @er7+,er6
        mov             er6,er7
        mov.l   #0,er2
        mov.l   er2,@__ISR_Signals_to_thread_executing

        /* Set up IRQ stack frame and dispatch to _ISR_Dispatch */
        
        mov.l   #0xc0000000,er2         /* Disable IRQ */
        or.l    #_ISR_Dispatch,er2
        mov.l   er2,@-er7
        rte

/*      Inner IRQ Return, pop flags and return */
exit:
/*      Pop Stack       */
        orc             #0x80,ccr
        mov             @er7+,er6
        mov             er6,er7
        mov             @er7+,er6
        mov             @er7+,er5
        mov             @er7+,er4
        mov             @er7+,er3
        mov             @er7+,er2
        mov             @er7+,er1
        mov             @er7+,er0
#endif
        rte
        
/*
        Called from ISR_Handler as a way of ending IRQ
        but allowing dispatch to another task.
        Must use RTE as CCR is still on stack but IRQ has been serviced.        
        CCR and PC occupy same word so rte can be used.
        now using task stack
*/

        .align 2
        .global _ISR_Dispatch

_ISR_Dispatch:
        
#if defined(__H8300H__) || defined(__H8300S__)
        jsr             @__Thread_Dispatch
        mov             @er7+,er6
        mov             @er7+,er5
        mov             @er7+,er4
        mov             @er7+,er3
        mov             @er7+,er2
        mov             @er7+,er1
        mov             @er7+,er0
#endif
        rte
        

        .align 2
        .global __CPU_Context_save_fp

__CPU_Context_save_fp:
        rts


        .align 2
        .global __CPU_Context_restore_fp

__CPU_Context_restore_fp:
        rts

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.