Search
lxdream.org :: lxdream/src/sh4/sh4.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/sh4/sh4.h
changeset 936:f394309c399a
prev930:07e5b11419db
next1067:d3c00ffccfcd
author nkeynes
date Sat Dec 27 02:59:35 2008 +0000 (13 years ago)
branchlxdream-mem
permissions -rw-r--r--
last change Replace fpscr_mask/fpscr flags in xlat_cache_block with a single xlat_sh4_mode,
which tracks the field of the same name in sh4r - actually a little faster this way.
Now depends on SR.MD, FPSCR.PR and FPSCR.SZ (although it doesn't benefit from the SR
flag yet).

Also fixed the failure to check the flags in the common case (code address returned
by previous block) which took away the performance benefits, but oh well.
view annotate diff log raw
     1 /**
     2  * $Id: sh4.h 577 2008-01-01 05:08:38Z nkeynes $
     3  * 
     4  * This file defines the public functions and definitions exported by the SH4
     5  * modules.
     6  *
     7  * Copyright (c) 2005 Nathan Keynes.
     8  *
     9  * This program is free software; you can redistribute it and/or modify
    10  * it under the terms of the GNU General Public License as published by
    11  * the Free Software Foundation; either version 2 of the License, or
    12  * (at your option) any later version.
    13  *
    14  * This program is distributed in the hope that it will be useful,
    15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    17  * GNU General Public License for more details.
    18  */
    20 #ifndef lxdream_sh4_H
    21 #define lxdream_sh4_H 1
    23 #include "lxdream.h"
    24 #include "mem.h"
    26 #ifdef __cplusplus
    27 extern "C" {
    28 #endif
    31 /**
    32  * SH4 is running normally 
    33  */
    34 #define SH4_STATE_RUNNING 1
    35 /**
    36  * SH4 is not executing instructions but all peripheral modules are still
    37  * running
    38  */
    39 #define SH4_STATE_SLEEP 2
    40 /**
    41  * SH4 is not executing instructions, DMAC is halted, but all other peripheral
    42  * modules are still running
    43  */
    44 #define SH4_STATE_DEEP_SLEEP 3
    45 /**
    46  * SH4 is not executing instructions and all peripheral modules are also
    47  * stopped. As close as you can get to powered-off without actually being
    48  * off.
    49  */
    50 #define SH4_STATE_STANDBY 4
    52 /**
    53  * sh4r.event_types flag indicating a pending IRQ
    54  */
    55 #define PENDING_IRQ 1
    57 /**
    58  * sh4r.event_types flag indicating a pending event (from the event queue)
    59  */
    60 #define PENDING_EVENT 2
    62 /**
    63  * SH4 register structure
    64  */
    65 struct sh4_registers {
    66     uint32_t r[16];
    67     uint32_t sr, pr, pc;
    68     union {
    69         int32_t i;
    70         float f;
    71     } fpul;
    72     uint32_t t, m, q, s; /* really boolean - 0 or 1 */
    73     float fr[2][16]; /* Must be aligned on 16-byte boundary */
    74     uint32_t fpscr;
    75     uint32_t pad; /* Pad up to 64-bit boundaries */
    76     uint64_t mac;
    77     uint32_t gbr, ssr, spc, sgr, dbr, vbr;
    79     uint32_t r_bank[8]; /* hidden banked registers */
    80     int32_t store_queue[16]; /* technically 2 banks of 32 bytes */
    82     uint32_t new_pc; /* Not a real register, but used to handle delay slots */
    83     uint32_t event_pending; /* slice cycle time of the next pending event, or FFFFFFFF
    84                              when no events are pending */
    85     uint32_t event_types; /* bit 0 = IRQ pending, bit 1 = general event pending */
    86     int in_delay_slot; /* flag to indicate the current instruction is in
    87      * a delay slot (certain rules apply) */
    88     uint32_t slice_cycle; /* Current nanosecond within the timeslice */
    89     int sh4_state; /* Current power-on state (one of the SH4_STATE_* values ) */
    91     /* Not saved */
    92     int xlat_sh4_mode; /* Collection of execution mode flags (derived) from fpscr, sr, etc */
    93 };
    95 extern struct sh4_registers sh4r;
    97 /**
    98  * Switch between translation and emulation execution modes. Note that this
    99  * should only be used while the system is stopped. If the system was built
   100  * without translation support, this method has no effect.
   101  *
   102  * @param use TRUE for translation mode, FALSE for emulation mode.
   103  */
   104 void sh4_translate_set_enabled( gboolean use );
   106 /**
   107  * Test if system is currently using the translation engine.
   108  */
   109 gboolean sh4_translate_is_enabled();
   111 /**
   112  * Explicitly set the SH4 PC to the supplied value - this will be the next
   113  * instruction executed. This should only be called while the system is stopped.
   114  */
   115 void sh4_set_pc( int pc );
   117 /**
   118  * Execute (using the emulator) a single instruction (in other words, perform a
   119  * single-step operation). 
   120  */
   121 gboolean sh4_execute_instruction( void );
   123 /* SH4 breakpoints */
   124 void sh4_set_breakpoint( uint32_t pc, breakpoint_type_t type );
   125 gboolean sh4_clear_breakpoint( uint32_t pc, breakpoint_type_t type );
   126 int sh4_get_breakpoint( uint32_t pc );
   128 #ifdef __cplusplus
   129 }
   130 #endif
   131 #endif /* !lxdream_sh4_H */
.