Home | History | Annotate | Line # | Download | only in cr16
cr16-sim.h revision 1.1.1.1.4.2
      1  1.1.1.1.4.2  perseant /* Simulation code for the CR16 processor.
      2  1.1.1.1.4.2  perseant    Copyright (C) 2008-2024 Free Software Foundation, Inc.
      3  1.1.1.1.4.2  perseant    Contributed by M Ranga Swami Reddy <MR.Swami.Reddy (at) nsc.com>
      4  1.1.1.1.4.2  perseant 
      5  1.1.1.1.4.2  perseant    This file is part of GDB, the GNU debugger.
      6  1.1.1.1.4.2  perseant 
      7  1.1.1.1.4.2  perseant    This program is free software; you can redistribute it and/or modify
      8  1.1.1.1.4.2  perseant    it under the terms of the GNU General Public License as published by
      9  1.1.1.1.4.2  perseant    the Free Software Foundation; either version 3, or (at your option)
     10  1.1.1.1.4.2  perseant    any later version.
     11  1.1.1.1.4.2  perseant 
     12  1.1.1.1.4.2  perseant    This program is distributed in the hope that it will be useful,
     13  1.1.1.1.4.2  perseant    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1.1.1.4.2  perseant    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1.1.1.4.2  perseant    GNU General Public License for more details.
     16  1.1.1.1.4.2  perseant 
     17  1.1.1.1.4.2  perseant    You should have received a copy of the GNU General Public License
     18  1.1.1.1.4.2  perseant    along with this program. If not, see <http://www.gnu.org/licenses/>.  */
     19  1.1.1.1.4.2  perseant 
     20  1.1.1.1.4.2  perseant 
     21  1.1.1.1.4.2  perseant #include <stdio.h>
     22  1.1.1.1.4.2  perseant #include <ctype.h>
     23  1.1.1.1.4.2  perseant #include <limits.h>
     24  1.1.1.1.4.2  perseant #include "ansidecl.h"
     25  1.1.1.1.4.2  perseant #include "sim/callback.h"
     26  1.1.1.1.4.2  perseant #include "opcode/cr16.h"
     27  1.1.1.1.4.2  perseant #include "bfd.h"
     28  1.1.1.1.4.2  perseant #include "sim-main.h"
     29  1.1.1.1.4.2  perseant 
     30  1.1.1.1.4.2  perseant #define DEBUG_TRACE		0x00000001
     31  1.1.1.1.4.2  perseant #define DEBUG_VALUES		0x00000002
     32  1.1.1.1.4.2  perseant #define DEBUG_LINE_NUMBER	0x00000004
     33  1.1.1.1.4.2  perseant #define DEBUG_MEMSIZE		0x00000008
     34  1.1.1.1.4.2  perseant #define DEBUG_INSTRUCTION	0x00000010
     35  1.1.1.1.4.2  perseant #define DEBUG_TRAP		0x00000020
     36  1.1.1.1.4.2  perseant #define DEBUG_MEMORY		0x00000040
     37  1.1.1.1.4.2  perseant 
     38  1.1.1.1.4.2  perseant #ifndef	DEBUG
     39  1.1.1.1.4.2  perseant #define	DEBUG (DEBUG_TRACE | DEBUG_VALUES | DEBUG_LINE_NUMBER)
     40  1.1.1.1.4.2  perseant #endif
     41  1.1.1.1.4.2  perseant 
     42  1.1.1.1.4.2  perseant extern int cr16_debug;
     43  1.1.1.1.4.2  perseant 
     44  1.1.1.1.4.2  perseant #include "sim/sim.h"
     45  1.1.1.1.4.2  perseant #include "sim-config.h"
     46  1.1.1.1.4.2  perseant #include "sim-types.h"
     47  1.1.1.1.4.2  perseant 
     48  1.1.1.1.4.2  perseant /* FIXME: CR16 defines */
     49  1.1.1.1.4.2  perseant typedef uint16_t reg_t;
     50  1.1.1.1.4.2  perseant typedef uint32_t creg_t;
     51  1.1.1.1.4.2  perseant 
     52  1.1.1.1.4.2  perseant struct simops
     53  1.1.1.1.4.2  perseant {
     54  1.1.1.1.4.2  perseant   char mnemonic[12];
     55  1.1.1.1.4.2  perseant   uint32_t size;
     56  1.1.1.1.4.2  perseant   uint32_t mask;
     57  1.1.1.1.4.2  perseant   uint32_t opcode;
     58  1.1.1.1.4.2  perseant   int format;
     59  1.1.1.1.4.2  perseant   char fname[12];
     60  1.1.1.1.4.2  perseant   void (*func)(SIM_DESC, SIM_CPU *);
     61  1.1.1.1.4.2  perseant   int numops;
     62  1.1.1.1.4.2  perseant   operand_desc operands[4];
     63  1.1.1.1.4.2  perseant };
     64  1.1.1.1.4.2  perseant 
     65  1.1.1.1.4.2  perseant enum _ins_type
     66  1.1.1.1.4.2  perseant {
     67  1.1.1.1.4.2  perseant    INS_UNKNOWN,			/* unknown instruction */
     68  1.1.1.1.4.2  perseant    INS_NO_TYPE_INS,
     69  1.1.1.1.4.2  perseant    INS_ARITH_INS,
     70  1.1.1.1.4.2  perseant    INS_LD_STOR_INS,
     71  1.1.1.1.4.2  perseant    INS_BRANCH_INS,
     72  1.1.1.1.4.2  perseant    INS_ARITH_BYTE_INS,
     73  1.1.1.1.4.2  perseant    INS_SHIFT_INS,
     74  1.1.1.1.4.2  perseant    INS_BRANCH_NEQ_INS,
     75  1.1.1.1.4.2  perseant    INS_STOR_IMM_INS,
     76  1.1.1.1.4.2  perseant    INS_CSTBIT_INS,
     77  1.1.1.1.4.2  perseant    INS_MAX
     78  1.1.1.1.4.2  perseant };
     79  1.1.1.1.4.2  perseant 
     80  1.1.1.1.4.2  perseant extern unsigned long ins_type_counters[ (int)INS_MAX ];
     81  1.1.1.1.4.2  perseant 
     82  1.1.1.1.4.2  perseant enum {
     83  1.1.1.1.4.2  perseant   SP_IDX = 15,
     84  1.1.1.1.4.2  perseant };
     85  1.1.1.1.4.2  perseant 
     86  1.1.1.1.4.2  perseant /* Write-back slots */
     87  1.1.1.1.4.2  perseant union slot_data {
     88  1.1.1.1.4.2  perseant   unsigned_1 _1;
     89  1.1.1.1.4.2  perseant   unsigned_2 _2;
     90  1.1.1.1.4.2  perseant   unsigned_4 _4;
     91  1.1.1.1.4.2  perseant };
     92  1.1.1.1.4.2  perseant struct slot {
     93  1.1.1.1.4.2  perseant   void *dest;
     94  1.1.1.1.4.2  perseant   int size;
     95  1.1.1.1.4.2  perseant   union slot_data data;
     96  1.1.1.1.4.2  perseant   union slot_data mask;
     97  1.1.1.1.4.2  perseant };
     98  1.1.1.1.4.2  perseant enum {
     99  1.1.1.1.4.2  perseant  NR_SLOTS = 16
    100  1.1.1.1.4.2  perseant };
    101  1.1.1.1.4.2  perseant #define SLOT (State.slot)
    102  1.1.1.1.4.2  perseant #define SLOT_NR (State.slot_nr)
    103  1.1.1.1.4.2  perseant #define SLOT_PEND_MASK(DEST, MSK, VAL) \
    104  1.1.1.1.4.2  perseant   do \
    105  1.1.1.1.4.2  perseant     { \
    106  1.1.1.1.4.2  perseant       SLOT[SLOT_NR].dest = &(DEST); \
    107  1.1.1.1.4.2  perseant       SLOT[SLOT_NR].size = sizeof (DEST); \
    108  1.1.1.1.4.2  perseant       switch (sizeof (DEST)) \
    109  1.1.1.1.4.2  perseant         { \
    110  1.1.1.1.4.2  perseant         case 1: \
    111  1.1.1.1.4.2  perseant           SLOT[SLOT_NR].data._1 = (unsigned_1) (VAL); \
    112  1.1.1.1.4.2  perseant           SLOT[SLOT_NR].mask._1 = (unsigned_1) (MSK); \
    113  1.1.1.1.4.2  perseant           break; \
    114  1.1.1.1.4.2  perseant         case 2: \
    115  1.1.1.1.4.2  perseant           SLOT[SLOT_NR].data._2 = (unsigned_2) (VAL); \
    116  1.1.1.1.4.2  perseant           SLOT[SLOT_NR].mask._2 = (unsigned_2) (MSK); \
    117  1.1.1.1.4.2  perseant           break; \
    118  1.1.1.1.4.2  perseant         case 4: \
    119  1.1.1.1.4.2  perseant           SLOT[SLOT_NR].data._4 = (unsigned_4) (VAL); \
    120  1.1.1.1.4.2  perseant           SLOT[SLOT_NR].mask._4 = (unsigned_4) (MSK); \
    121  1.1.1.1.4.2  perseant           break; \
    122  1.1.1.1.4.2  perseant         } \
    123  1.1.1.1.4.2  perseant       SLOT_NR = (SLOT_NR + 1); \
    124  1.1.1.1.4.2  perseant     } \
    125  1.1.1.1.4.2  perseant   while (0)
    126  1.1.1.1.4.2  perseant #define SLOT_PEND(DEST, VAL) SLOT_PEND_MASK(DEST, 0, VAL)
    127  1.1.1.1.4.2  perseant #define SLOT_DISCARD() (SLOT_NR = 0)
    128  1.1.1.1.4.2  perseant #define SLOT_FLUSH() \
    129  1.1.1.1.4.2  perseant   do \
    130  1.1.1.1.4.2  perseant     { \
    131  1.1.1.1.4.2  perseant       int i; \
    132  1.1.1.1.4.2  perseant       for (i = 0; i < SLOT_NR; i++) \
    133  1.1.1.1.4.2  perseant 	{ \
    134  1.1.1.1.4.2  perseant 	  switch (SLOT[i].size) \
    135  1.1.1.1.4.2  perseant 	    { \
    136  1.1.1.1.4.2  perseant 	    case 1: \
    137  1.1.1.1.4.2  perseant 	      *(unsigned_1*) SLOT[i].dest &= SLOT[i].mask._1; \
    138  1.1.1.1.4.2  perseant 	      *(unsigned_1*) SLOT[i].dest |= SLOT[i].data._1; \
    139  1.1.1.1.4.2  perseant 	      break; \
    140  1.1.1.1.4.2  perseant 	    case 2: \
    141  1.1.1.1.4.2  perseant 	      *(unsigned_2*) SLOT[i].dest &= SLOT[i].mask._2; \
    142  1.1.1.1.4.2  perseant 	      *(unsigned_2*) SLOT[i].dest |= SLOT[i].data._2; \
    143  1.1.1.1.4.2  perseant 	      break; \
    144  1.1.1.1.4.2  perseant 	    case 4: \
    145  1.1.1.1.4.2  perseant 	      *(unsigned_4*) SLOT[i].dest &= SLOT[i].mask._4; \
    146  1.1.1.1.4.2  perseant 	      *(unsigned_4*) SLOT[i].dest |= SLOT[i].data._4; \
    147  1.1.1.1.4.2  perseant 	      break; \
    148  1.1.1.1.4.2  perseant 	    } \
    149  1.1.1.1.4.2  perseant         } \
    150  1.1.1.1.4.2  perseant       SLOT_NR = 0; \
    151  1.1.1.1.4.2  perseant     } \
    152  1.1.1.1.4.2  perseant   while (0)
    153  1.1.1.1.4.2  perseant #define SLOT_DUMP() \
    154  1.1.1.1.4.2  perseant   do \
    155  1.1.1.1.4.2  perseant     { \
    156  1.1.1.1.4.2  perseant       int i; \
    157  1.1.1.1.4.2  perseant       for (i = 0; i < SLOT_NR; i++) \
    158  1.1.1.1.4.2  perseant 	{ \
    159  1.1.1.1.4.2  perseant 	  switch (SLOT[i].size) \
    160  1.1.1.1.4.2  perseant 	    { \
    161  1.1.1.1.4.2  perseant 	    case 1: \
    162  1.1.1.1.4.2  perseant               printf ("SLOT %d *0x%08lx & 0x%02x | 0x%02x\n", i, \
    163  1.1.1.1.4.2  perseant 		      (long) SLOT[i].dest, \
    164  1.1.1.1.4.2  perseant                       (unsigned) SLOT[i].mask._1, \
    165  1.1.1.1.4.2  perseant                       (unsigned) SLOT[i].data._1); \
    166  1.1.1.1.4.2  perseant 	      break; \
    167  1.1.1.1.4.2  perseant 	    case 2: \
    168  1.1.1.1.4.2  perseant               printf ("SLOT %d *0x%08lx & 0x%04x | 0x%04x\n", i, \
    169  1.1.1.1.4.2  perseant 		      (long) SLOT[i].dest, \
    170  1.1.1.1.4.2  perseant                       (unsigned) SLOT[i].mask._2, \
    171  1.1.1.1.4.2  perseant                       (unsigned) SLOT[i].data._2); \
    172  1.1.1.1.4.2  perseant 	      break; \
    173  1.1.1.1.4.2  perseant 	    case 4: \
    174  1.1.1.1.4.2  perseant               printf ("SLOT %d *0x%08lx & 0x%08x | 0x%08x\n", i, \
    175  1.1.1.1.4.2  perseant 		      (long) SLOT[i].dest, \
    176  1.1.1.1.4.2  perseant                       (unsigned) SLOT[i].mask._4, \
    177  1.1.1.1.4.2  perseant                       (unsigned) SLOT[i].data._4); \
    178  1.1.1.1.4.2  perseant 	      break; \
    179  1.1.1.1.4.2  perseant 	    case 8: \
    180  1.1.1.1.4.2  perseant               printf ("SLOT %d *0x%08lx & 0x%08x%08x | 0x%08x%08x\n", i, \
    181  1.1.1.1.4.2  perseant 		      (long) SLOT[i].dest, \
    182  1.1.1.1.4.2  perseant                       (unsigned) (SLOT[i].mask._8 >> 32),  \
    183  1.1.1.1.4.2  perseant                       (unsigned) SLOT[i].mask._8, \
    184  1.1.1.1.4.2  perseant                       (unsigned) (SLOT[i].data._8 >> 32),  \
    185  1.1.1.1.4.2  perseant                       (unsigned) SLOT[i].data._8); \
    186  1.1.1.1.4.2  perseant 	      break; \
    187  1.1.1.1.4.2  perseant 	    } \
    188  1.1.1.1.4.2  perseant         } \
    189  1.1.1.1.4.2  perseant     } \
    190  1.1.1.1.4.2  perseant   while (0)
    191  1.1.1.1.4.2  perseant 
    192  1.1.1.1.4.2  perseant struct _state
    193  1.1.1.1.4.2  perseant {
    194  1.1.1.1.4.2  perseant   creg_t regs[16];		/* general-purpose registers */
    195  1.1.1.1.4.2  perseant #define GPR(N) (State.regs[(N)] + 0)
    196  1.1.1.1.4.2  perseant #define SET_GPR(N,VAL) (State.regs[(N)] = (VAL))
    197  1.1.1.1.4.2  perseant 
    198  1.1.1.1.4.2  perseant #define GPR32(N) \
    199  1.1.1.1.4.2  perseant      (N < 12) ? \
    200  1.1.1.1.4.2  perseant      ((((uint16_t) State.regs[(N) + 1]) << 16) | (uint16_t) State.regs[(N)]) \
    201  1.1.1.1.4.2  perseant      : GPR (N)
    202  1.1.1.1.4.2  perseant 
    203  1.1.1.1.4.2  perseant #define SET_GPR32(N,VAL) do { \
    204  1.1.1.1.4.2  perseant      if (N < 11)  \
    205  1.1.1.1.4.2  perseant        { SET_GPR (N + 1, (VAL) >> 16); SET_GPR (N, ((VAL) & 0xffff));} \
    206  1.1.1.1.4.2  perseant      else { if ( N == 11) \
    207  1.1.1.1.4.2  perseant              { SET_GPR (N + 1, ((GPR32 (12)) & 0xffff0000)|((VAL) >> 16)); \
    208  1.1.1.1.4.2  perseant 	       SET_GPR (N, ((VAL) & 0xffff));} \
    209  1.1.1.1.4.2  perseant             else SET_GPR (N, (VAL));} \
    210  1.1.1.1.4.2  perseant     } while (0)
    211  1.1.1.1.4.2  perseant 
    212  1.1.1.1.4.2  perseant   creg_t cregs[16];		/* control registers */
    213  1.1.1.1.4.2  perseant #define CREG(N) (State.cregs[(N)] + 0)
    214  1.1.1.1.4.2  perseant #define SET_CREG(N,VAL) move_to_cr (sd, cpu, (N), 0, (VAL), 0)
    215  1.1.1.1.4.2  perseant #define SET_HW_CREG(N,VAL) move_to_cr (sd, cpu, (N), 0, (VAL), 1)
    216  1.1.1.1.4.2  perseant 
    217  1.1.1.1.4.2  perseant   reg_t sp[2];                  /* holding area for SPI(0)/SPU(1) */
    218  1.1.1.1.4.2  perseant #define HELD_SP(N) (State.sp[(N)] + 0)
    219  1.1.1.1.4.2  perseant #define SET_HELD_SP(N,VAL) SLOT_PEND (State.sp[(N)], (VAL))
    220  1.1.1.1.4.2  perseant 
    221  1.1.1.1.4.2  perseant   /* writeback info */
    222  1.1.1.1.4.2  perseant   struct slot slot[NR_SLOTS];
    223  1.1.1.1.4.2  perseant   int slot_nr;
    224  1.1.1.1.4.2  perseant 
    225  1.1.1.1.4.2  perseant   /* trace data */
    226  1.1.1.1.4.2  perseant   struct {
    227  1.1.1.1.4.2  perseant     uint16_t psw;
    228  1.1.1.1.4.2  perseant   } trace;
    229  1.1.1.1.4.2  perseant 
    230  1.1.1.1.4.2  perseant   int	pc_changed;
    231  1.1.1.1.4.2  perseant 
    232  1.1.1.1.4.2  perseant   /* NOTE: everything below this line is not reset by
    233  1.1.1.1.4.2  perseant      sim_create_inferior() */
    234  1.1.1.1.4.2  perseant 
    235  1.1.1.1.4.2  perseant   enum _ins_type ins_type;
    236  1.1.1.1.4.2  perseant 
    237  1.1.1.1.4.2  perseant };
    238  1.1.1.1.4.2  perseant 
    239  1.1.1.1.4.2  perseant extern struct _state State;
    240  1.1.1.1.4.2  perseant 
    241  1.1.1.1.4.2  perseant 
    242  1.1.1.1.4.2  perseant extern uint32_t OP[4];
    243  1.1.1.1.4.2  perseant extern uint32_t sign_flag;
    244  1.1.1.1.4.2  perseant extern struct simops Simops[];
    245  1.1.1.1.4.2  perseant 
    246  1.1.1.1.4.2  perseant enum
    247  1.1.1.1.4.2  perseant {
    248  1.1.1.1.4.2  perseant   PC_CR   = 0,
    249  1.1.1.1.4.2  perseant   BDS_CR  = 1,
    250  1.1.1.1.4.2  perseant   BSR_CR  = 2,
    251  1.1.1.1.4.2  perseant   DCR_CR  = 3,
    252  1.1.1.1.4.2  perseant   CAR0_CR = 5,
    253  1.1.1.1.4.2  perseant   CAR1_CR = 7,
    254  1.1.1.1.4.2  perseant   CFG_CR  = 9,
    255  1.1.1.1.4.2  perseant   PSR_CR  = 10,
    256  1.1.1.1.4.2  perseant   INTBASE_CR = 11,
    257  1.1.1.1.4.2  perseant   ISP_CR = 13,
    258  1.1.1.1.4.2  perseant   USP_CR = 15
    259  1.1.1.1.4.2  perseant };
    260  1.1.1.1.4.2  perseant 
    261  1.1.1.1.4.2  perseant enum
    262  1.1.1.1.4.2  perseant {
    263  1.1.1.1.4.2  perseant   PSR_I_BIT = 0x0800,
    264  1.1.1.1.4.2  perseant   PSR_P_BIT = 0x0400,
    265  1.1.1.1.4.2  perseant   PSR_E_BIT = 0x0200,
    266  1.1.1.1.4.2  perseant   PSR_N_BIT = 0x0080,
    267  1.1.1.1.4.2  perseant   PSR_Z_BIT = 0x0040,
    268  1.1.1.1.4.2  perseant   PSR_F_BIT = 0x0020,
    269  1.1.1.1.4.2  perseant   PSR_U_BIT = 0x0008,
    270  1.1.1.1.4.2  perseant   PSR_L_BIT = 0x0004,
    271  1.1.1.1.4.2  perseant   PSR_T_BIT = 0x0002,
    272  1.1.1.1.4.2  perseant   PSR_C_BIT = 0x0001
    273  1.1.1.1.4.2  perseant };
    274  1.1.1.1.4.2  perseant 
    275  1.1.1.1.4.2  perseant #define PSR CREG (PSR_CR)
    276  1.1.1.1.4.2  perseant #define SET_PSR(VAL) SET_CREG (PSR_CR, (VAL))
    277  1.1.1.1.4.2  perseant #define SET_HW_PSR(VAL) SET_HW_CREG (PSR_CR, (VAL))
    278  1.1.1.1.4.2  perseant #define SET_PSR_BIT(MASK,VAL) move_to_cr (sd, cpu, PSR_CR, ~((creg_t) MASK), (VAL) ? (MASK) : 0, 1)
    279  1.1.1.1.4.2  perseant 
    280  1.1.1.1.4.2  perseant #define PSR_SM ((PSR & PSR_SM_BIT) != 0)
    281  1.1.1.1.4.2  perseant #define SET_PSR_SM(VAL) SET_PSR_BIT (PSR_SM_BIT, (VAL))
    282  1.1.1.1.4.2  perseant 
    283  1.1.1.1.4.2  perseant #define PSR_I ((PSR & PSR_I_BIT) != 0)
    284  1.1.1.1.4.2  perseant #define SET_PSR_I(VAL) SET_PSR_BIT (PSR_I_BIT, (VAL))
    285  1.1.1.1.4.2  perseant 
    286  1.1.1.1.4.2  perseant #define PSR_DB ((PSR & PSR_DB_BIT) != 0)
    287  1.1.1.1.4.2  perseant #define SET_PSR_DB(VAL) SET_PSR_BIT (PSR_DB_BIT, (VAL))
    288  1.1.1.1.4.2  perseant 
    289  1.1.1.1.4.2  perseant #define PSR_P ((PSR & PSR_P_BIT) != 0)
    290  1.1.1.1.4.2  perseant #define SET_PSR_P(VAL) SET_PSR_BIT (PSR_P_BIT, (VAL))
    291  1.1.1.1.4.2  perseant 
    292  1.1.1.1.4.2  perseant #define PSR_E ((PSR & PSR_E_BIT) != 0)
    293  1.1.1.1.4.2  perseant #define SET_PSR_E(VAL) SET_PSR_BIT (PSR_E_BIT, (VAL))
    294  1.1.1.1.4.2  perseant 
    295  1.1.1.1.4.2  perseant #define PSR_N ((PSR & PSR_N_BIT) != 0)
    296  1.1.1.1.4.2  perseant #define SET_PSR_N(VAL) SET_PSR_BIT (PSR_N_BIT, (VAL))
    297  1.1.1.1.4.2  perseant 
    298  1.1.1.1.4.2  perseant #define PSR_Z ((PSR & PSR_Z_BIT) != 0)
    299  1.1.1.1.4.2  perseant #define SET_PSR_Z(VAL) SET_PSR_BIT (PSR_Z_BIT, (VAL))
    300  1.1.1.1.4.2  perseant 
    301  1.1.1.1.4.2  perseant #define PSR_F ((PSR & PSR_F_BIT) != 0)
    302  1.1.1.1.4.2  perseant #define SET_PSR_F(VAL) SET_PSR_BIT (PSR_F_BIT, (VAL))
    303  1.1.1.1.4.2  perseant 
    304  1.1.1.1.4.2  perseant #define PSR_U ((PSR & PSR_U_BIT) != 0)
    305  1.1.1.1.4.2  perseant #define SET_PSR_U(VAL) SET_PSR_BIT (PSR_U_BIT, (VAL))
    306  1.1.1.1.4.2  perseant 
    307  1.1.1.1.4.2  perseant #define PSR_L ((PSR & PSR_L_BIT) != 0)
    308  1.1.1.1.4.2  perseant #define SET_PSR_L(VAL) SET_PSR_BIT (PSR_L_BIT, (VAL))
    309  1.1.1.1.4.2  perseant 
    310  1.1.1.1.4.2  perseant #define PSR_T ((PSR & PSR_T_BIT) != 0)
    311  1.1.1.1.4.2  perseant #define SET_PSR_T(VAL) SET_PSR_BIT (PSR_T_BIT, (VAL))
    312  1.1.1.1.4.2  perseant 
    313  1.1.1.1.4.2  perseant #define PSR_C ((PSR & PSR_C_BIT) != 0)
    314  1.1.1.1.4.2  perseant #define SET_PSR_C(VAL) SET_PSR_BIT (PSR_C_BIT, (VAL))
    315  1.1.1.1.4.2  perseant 
    316  1.1.1.1.4.2  perseant /* See simopsc.:move_to_cr() for registers that can not be read-from
    317  1.1.1.1.4.2  perseant    or assigned-to directly */
    318  1.1.1.1.4.2  perseant 
    319  1.1.1.1.4.2  perseant #define PC	CREG (PC_CR)
    320  1.1.1.1.4.2  perseant #define SET_PC(VAL) SET_CREG (PC_CR, (VAL))
    321  1.1.1.1.4.2  perseant //#define SET_PC(VAL) (State.cregs[PC_CR] = (VAL))
    322  1.1.1.1.4.2  perseant 
    323  1.1.1.1.4.2  perseant #define BPSR	CREG (BPSR_CR)
    324  1.1.1.1.4.2  perseant #define SET_BPSR(VAL) SET_CREG (BPSR_CR, (VAL))
    325  1.1.1.1.4.2  perseant 
    326  1.1.1.1.4.2  perseant #define BPC	CREG (BPC_CR)
    327  1.1.1.1.4.2  perseant #define SET_BPC(VAL) SET_CREG (BPC_CR, (VAL))
    328  1.1.1.1.4.2  perseant 
    329  1.1.1.1.4.2  perseant #define DPSR	CREG (DPSR_CR)
    330  1.1.1.1.4.2  perseant #define SET_DPSR(VAL) SET_CREG (DPSR_CR, (VAL))
    331  1.1.1.1.4.2  perseant 
    332  1.1.1.1.4.2  perseant #define DPC	CREG (DPC_CR)
    333  1.1.1.1.4.2  perseant #define SET_DPC(VAL) SET_CREG (DPC_CR, (VAL))
    334  1.1.1.1.4.2  perseant 
    335  1.1.1.1.4.2  perseant #define RPT_C	CREG (RPT_C_CR)
    336  1.1.1.1.4.2  perseant #define SET_RPT_C(VAL) SET_CREG (RPT_C_CR, (VAL))
    337  1.1.1.1.4.2  perseant 
    338  1.1.1.1.4.2  perseant #define RPT_S	CREG (RPT_S_CR)
    339  1.1.1.1.4.2  perseant #define SET_RPT_S(VAL) SET_CREG (RPT_S_CR, (VAL))
    340  1.1.1.1.4.2  perseant 
    341  1.1.1.1.4.2  perseant #define RPT_E	CREG (RPT_E_CR)
    342  1.1.1.1.4.2  perseant #define SET_RPT_E(VAL) SET_CREG (RPT_E_CR, (VAL))
    343  1.1.1.1.4.2  perseant 
    344  1.1.1.1.4.2  perseant #define MOD_S	CREG (MOD_S_CR)
    345  1.1.1.1.4.2  perseant #define SET_MOD_S(VAL) SET_CREG (MOD_S_CR, (VAL))
    346  1.1.1.1.4.2  perseant 
    347  1.1.1.1.4.2  perseant #define MOD_E	CREG (MOD_E_CR)
    348  1.1.1.1.4.2  perseant #define SET_MOD_E(VAL) SET_CREG (MOD_E_CR, (VAL))
    349  1.1.1.1.4.2  perseant 
    350  1.1.1.1.4.2  perseant #define IBA	CREG (IBA_CR)
    351  1.1.1.1.4.2  perseant #define SET_IBA(VAL) SET_CREG (IBA_CR, (VAL))
    352  1.1.1.1.4.2  perseant 
    353  1.1.1.1.4.2  perseant 
    354  1.1.1.1.4.2  perseant #define SIG_CR16_STOP	-1
    355  1.1.1.1.4.2  perseant #define SIG_CR16_EXIT	-2
    356  1.1.1.1.4.2  perseant #define SIG_CR16_BUS    -3
    357  1.1.1.1.4.2  perseant #define SIG_CR16_IAD    -4
    358  1.1.1.1.4.2  perseant 
    359  1.1.1.1.4.2  perseant /* TODO: Resolve conflicts with common headers.  */
    360  1.1.1.1.4.2  perseant #undef SEXT8
    361  1.1.1.1.4.2  perseant #undef SEXT16
    362  1.1.1.1.4.2  perseant #undef SEXT32
    363  1.1.1.1.4.2  perseant 
    364  1.1.1.1.4.2  perseant #define SEXT3(x)	((((x)&0x7)^(~3))+4)
    365  1.1.1.1.4.2  perseant 
    366  1.1.1.1.4.2  perseant /* sign-extend a 4-bit number */
    367  1.1.1.1.4.2  perseant #define SEXT4(x)	((((x)&0xf)^(~7))+8)
    368  1.1.1.1.4.2  perseant 
    369  1.1.1.1.4.2  perseant /* sign-extend an 8-bit number */
    370  1.1.1.1.4.2  perseant #define SEXT8(x)	((((x)&0xff)^(~0x7f))+0x80)
    371  1.1.1.1.4.2  perseant 
    372  1.1.1.1.4.2  perseant /* sign-extend a 16-bit number */
    373  1.1.1.1.4.2  perseant #define SEXT16(x)	((((x)&0xffff)^(~0x7fff))+0x8000)
    374  1.1.1.1.4.2  perseant 
    375  1.1.1.1.4.2  perseant /* sign-extend a 24-bit number */
    376  1.1.1.1.4.2  perseant #define SEXT24(x)	((((x)&0xffffff)^(~0x7fffff))+0x800000)
    377  1.1.1.1.4.2  perseant 
    378  1.1.1.1.4.2  perseant /* sign-extend a 32-bit number */
    379  1.1.1.1.4.2  perseant #define SEXT32(x)	((((x)&0xffffffff)^(~0x7fffffff))+0x80000000)
    380  1.1.1.1.4.2  perseant 
    381  1.1.1.1.4.2  perseant #define SB(addr, data)		sim_core_write_1 (cpu, PC, read_map, addr, data)
    382  1.1.1.1.4.2  perseant #define RB(addr)		sim_core_read_1 (cpu, PC, read_map, addr)
    383  1.1.1.1.4.2  perseant #define SW(addr, data)		sim_core_write_unaligned_2 (cpu, PC, read_map, addr, data)
    384  1.1.1.1.4.2  perseant #define RW(addr)		sim_core_read_unaligned_2 (cpu, PC, read_map, addr)
    385  1.1.1.1.4.2  perseant #define SLW(addr, data)		sim_core_write_unaligned_4 (cpu, PC, read_map, addr, data)
    386  1.1.1.1.4.2  perseant 
    387  1.1.1.1.4.2  perseant /* Yes, this is as whacked as it looks.  The sim currently reads little endian
    388  1.1.1.1.4.2  perseant    for 16 bits, but then merge them like big endian to get 32 bits.  */
    389  1.1.1.1.4.2  perseant static inline uint32_t get_longword (SIM_CPU *cpu, address_word addr)
    390  1.1.1.1.4.2  perseant {
    391  1.1.1.1.4.2  perseant   return (RW (addr) << 16) | RW (addr + 2);
    392  1.1.1.1.4.2  perseant }
    393  1.1.1.1.4.2  perseant #define RLW(addr)		get_longword (cpu, addr)
    394  1.1.1.1.4.2  perseant 
    395  1.1.1.1.4.2  perseant #define JMP(x)			do { SET_PC (x); State.pc_changed = 1; } while (0)
    396  1.1.1.1.4.2  perseant 
    397  1.1.1.1.4.2  perseant #define RIE_VECTOR_START  0xffc2
    398  1.1.1.1.4.2  perseant #define AE_VECTOR_START   0xffc3
    399  1.1.1.1.4.2  perseant #define TRAP_VECTOR_START 0xffc4	/* vector for trap 0 */
    400  1.1.1.1.4.2  perseant #define DBT_VECTOR_START  0xffd4
    401  1.1.1.1.4.2  perseant #define SDBT_VECTOR_START 0xffd5
    402  1.1.1.1.4.2  perseant 
    403  1.1.1.1.4.2  perseant #define INT_VECTOR_START   0xFFFE00 /*maskable interrupt - mapped to ICU */
    404  1.1.1.1.4.2  perseant #define NMI_VECTOR_START   0xFFFF00 /*non-maskable interrupt;for observability*/
    405  1.1.1.1.4.2  perseant #define ISE_VECTOR_START   0xFFFC00 /*in-system emulation trap */
    406  1.1.1.1.4.2  perseant #define ADBG_VECTOR_START  0xFFFC02 /*alternate debug trap */
    407  1.1.1.1.4.2  perseant #define ATRC_VECTOR_START  0xFFFC0C /*alternate trace trap */
    408  1.1.1.1.4.2  perseant #define ABPT_VECTOR_START  0xFFFC0E /*alternate break point trap */
    409  1.1.1.1.4.2  perseant 
    410  1.1.1.1.4.2  perseant 
    411  1.1.1.1.4.2  perseant /* Scedule a store of VAL into cr[CR].  MASK indicates the bits in
    412  1.1.1.1.4.2  perseant    cr[CR] that should not be modified (i.e. cr[CR] = (cr[CR] & MASK) |
    413  1.1.1.1.4.2  perseant    (VAL & ~MASK)).  In addition, unless PSR_HW_P, a VAL intended for
    414  1.1.1.1.4.2  perseant    PSR is masked for zero bits. */
    415  1.1.1.1.4.2  perseant 
    416  1.1.1.1.4.2  perseant extern creg_t move_to_cr (SIM_DESC, SIM_CPU *, int cr, creg_t mask, creg_t val, int psw_hw_p);
    417  1.1.1.1.4.2  perseant 
    418  1.1.1.1.4.2  perseant #ifndef SIGTRAP
    419  1.1.1.1.4.2  perseant #define SIGTRAP 5
    420  1.1.1.1.4.2  perseant #endif
    421  1.1.1.1.4.2  perseant /* Special purpose trap  */
    422  1.1.1.1.4.2  perseant #define TRAP_BREAKPOINT 8
    423