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