reg.c revision 1.1 1 1.1 christos /* reg.c --- register set model for M32C simulator.
2 1.1 christos
3 1.1 christos Copyright (C) 2005-2014 Free Software Foundation, Inc.
4 1.1 christos Contributed by Red Hat, Inc.
5 1.1 christos
6 1.1 christos This file is part of the GNU simulators.
7 1.1 christos
8 1.1 christos This program is free software; you can redistribute it and/or modify
9 1.1 christos it under the terms of the GNU General Public License as published by
10 1.1 christos the Free Software Foundation; either version 3 of the License, or
11 1.1 christos (at your option) any later version.
12 1.1 christos
13 1.1 christos This program is distributed in the hope that it will be useful,
14 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 christos GNU General Public License for more details.
17 1.1 christos
18 1.1 christos You should have received a copy of the GNU General Public License
19 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 1.1 christos
21 1.1 christos
22 1.1 christos #include <stdio.h>
23 1.1 christos #include <stdlib.h>
24 1.1 christos #include <string.h>
25 1.1 christos
26 1.1 christos #include "cpu.h"
27 1.1 christos
28 1.1 christos int verbose = 0;
29 1.1 christos int trace = 0;
30 1.1 christos int enable_counting = 0;
31 1.1 christos int in_gdb = 1;
32 1.1 christos
33 1.1 christos regs_type regs;
34 1.1 christos int addr_mask = 0xffff;
35 1.1 christos int membus_mask = 0xfffff;
36 1.1 christos int m32c_cpu = 0;
37 1.1 christos int step_result;
38 1.1 christos unsigned int heapbottom = 0;
39 1.1 christos unsigned int heaptop = 0;
40 1.1 christos
41 1.1 christos char *reg_names[] = {
42 1.1 christos "mem",
43 1.1 christos "r0", "r0h", "r0l",
44 1.1 christos "r1", "r1h", "r1l",
45 1.1 christos "r2", "r2r0",
46 1.1 christos "r3", "r3r1",
47 1.1 christos "r3r1r2r0",
48 1.1 christos "r3r2r1r0",
49 1.1 christos "a0",
50 1.1 christos "a1", "a1a0",
51 1.1 christos "sb", "fb",
52 1.1 christos "intb", "intbl", "intbh",
53 1.1 christos "sp", "usp", "isp", "pc", "flags"
54 1.1 christos };
55 1.1 christos
56 1.1 christos int reg_bytes[] = {
57 1.1 christos 0,
58 1.1 christos 2, 1, 1,
59 1.1 christos 2, 1, 1,
60 1.1 christos 2, 4,
61 1.1 christos 2, 4,
62 1.1 christos 8,
63 1.1 christos 8,
64 1.1 christos 2,
65 1.1 christos 2, 4,
66 1.1 christos 2, 2,
67 1.1 christos 2, 1, 3,
68 1.1 christos 2, 2, 2, 3, 2
69 1.1 christos };
70 1.1 christos
71 1.1 christos
72 1.1 christos unsigned int b2mask[] = { 0, 0xff, 0xffff, 0xffffff, 0xffffffff };
73 1.1 christos unsigned int b2signbit[] = { 0, (1 << 7), (1 << 15), (1 << 24), (1 << 31) };
74 1.1 christos int b2maxsigned[] = { 0, 0x7f, 0x7fff, 0x7fffff, 0x7fffffff };
75 1.1 christos int b2minsigned[] = { 0, -128, -32768, -8388608, -2147483647 - 1 };
76 1.1 christos
77 1.1 christos static regs_type oldregs;
78 1.1 christos
79 1.1 christos int m32c_opcode_pc;
80 1.1 christos
81 1.1 christos void
82 1.1 christos init_regs (void)
83 1.1 christos {
84 1.1 christos memset (®s, 0, sizeof (regs));
85 1.1 christos memset (&oldregs, 0, sizeof (oldregs));
86 1.1 christos }
87 1.1 christos
88 1.1 christos void
89 1.1 christos set_pointer_width (int bytes)
90 1.1 christos {
91 1.1 christos if (bytes == 2)
92 1.1 christos {
93 1.1 christos addr_mask = 0xffff;
94 1.1 christos membus_mask = 0x000fffff;
95 1.1 christos reg_bytes[a0] = reg_bytes[a1] = reg_bytes[sb] = reg_bytes[fb] =
96 1.1 christos reg_bytes[sp] = reg_bytes[usp] = reg_bytes[isp] = 2;
97 1.1 christos }
98 1.1 christos else
99 1.1 christos {
100 1.1 christos addr_mask = 0xffffff;
101 1.1 christos membus_mask = 0x00ffffff;
102 1.1 christos reg_bytes[a0] = reg_bytes[a1] = reg_bytes[sb] = reg_bytes[fb] =
103 1.1 christos reg_bytes[sp] = reg_bytes[usp] = reg_bytes[isp] = 3;
104 1.1 christos }
105 1.1 christos }
106 1.1 christos
107 1.1 christos void
108 1.1 christos m32c_set_cpu (int cpu)
109 1.1 christos {
110 1.1 christos switch (cpu)
111 1.1 christos {
112 1.1 christos case CPU_R8C:
113 1.1 christos case CPU_M16C:
114 1.1 christos set_pointer_width (2);
115 1.1 christos decode_opcode = decode_r8c;
116 1.1 christos break;
117 1.1 christos case CPU_M32CM:
118 1.1 christos case CPU_M32C:
119 1.1 christos set_pointer_width (3);
120 1.1 christos decode_opcode = decode_m32c;
121 1.1 christos break;
122 1.1 christos default:
123 1.1 christos abort ();
124 1.1 christos }
125 1.1 christos m32c_cpu = cpu;
126 1.1 christos }
127 1.1 christos
128 1.1 christos static unsigned int
129 1.1 christos get_reg_i (reg_id id)
130 1.1 christos {
131 1.1 christos reg_bank_type *b = regs.r + (FLAG_B ? 1 : 0);
132 1.1 christos
133 1.1 christos switch (id)
134 1.1 christos {
135 1.1 christos case r0:
136 1.1 christos return b->r_r0;
137 1.1 christos case r0h:
138 1.1 christos return b->r_r0 >> 8;
139 1.1 christos case r0l:
140 1.1 christos return b->r_r0 & 0xff;
141 1.1 christos case r1:
142 1.1 christos return b->r_r1;
143 1.1 christos case r1h:
144 1.1 christos return b->r_r1 >> 8;
145 1.1 christos case r1l:
146 1.1 christos return b->r_r1 & 0xff;
147 1.1 christos case r2:
148 1.1 christos return b->r_r2;
149 1.1 christos case r2r0:
150 1.1 christos return b->r_r2 * 65536 + b->r_r0;
151 1.1 christos case r3:
152 1.1 christos return b->r_r3;
153 1.1 christos case r3r1:
154 1.1 christos return b->r_r3 * 65536 + b->r_r1;
155 1.1 christos
156 1.1 christos case a0:
157 1.1 christos return b->r_a0 & addr_mask;
158 1.1 christos case a1:
159 1.1 christos return b->r_a1 & addr_mask;
160 1.1 christos case a1a0:
161 1.1 christos return (b->r_a1 & 0xffff) * 65536 | (b->r_a0 & 0xffff);
162 1.1 christos
163 1.1 christos case sb:
164 1.1 christos return b->r_sb & addr_mask;
165 1.1 christos case fb:
166 1.1 christos return b->r_fb & addr_mask;
167 1.1 christos
168 1.1 christos case intb:
169 1.1 christos return regs.r_intbh * 65536 + regs.r_intbl;
170 1.1 christos case intbl:
171 1.1 christos return regs.r_intbl;
172 1.1 christos case intbh:
173 1.1 christos return regs.r_intbh;
174 1.1 christos
175 1.1 christos case sp:
176 1.1 christos return ((regs.r_flags & FLAGBIT_U) ? regs.r_usp : regs.
177 1.1 christos r_isp) & addr_mask;
178 1.1 christos case usp:
179 1.1 christos return regs.r_usp & addr_mask;
180 1.1 christos case isp:
181 1.1 christos return regs.r_isp & addr_mask;
182 1.1 christos
183 1.1 christos case pc:
184 1.1 christos return regs.r_pc & membus_mask;
185 1.1 christos case flags:
186 1.1 christos return regs.r_flags;
187 1.1 christos default:
188 1.1 christos abort ();
189 1.1 christos }
190 1.1 christos }
191 1.1 christos
192 1.1 christos unsigned int
193 1.1 christos get_reg (reg_id id)
194 1.1 christos {
195 1.1 christos unsigned int rv = get_reg_i (id);
196 1.1 christos if (trace > ((id != pc && id != fb && id != sp) ? 0 : 1))
197 1.1 christos printf ("get_reg (%s) = %0*x\n", reg_names[id], reg_bytes[id] * 2, rv);
198 1.1 christos return rv;
199 1.1 christos }
200 1.1 christos
201 1.1 christos DI
202 1.1 christos get_reg_ll (reg_id id)
203 1.1 christos {
204 1.1 christos reg_bank_type *b = regs.r + (FLAG_B ? 1 : 0);
205 1.1 christos
206 1.1 christos switch (id)
207 1.1 christos {
208 1.1 christos case r3r1r2r0:
209 1.1 christos return ((DI) b->r_r3 << 48
210 1.1 christos | (DI) b->r_r1 << 32 | (DI) b->r_r2 << 16 | (DI) b->r_r0);
211 1.1 christos case r3r2r1r0:
212 1.1 christos return ((DI) b->r_r3 << 48
213 1.1 christos | (DI) b->r_r2 << 32 | (DI) b->r_r1 << 16 | (DI) b->r_r0);
214 1.1 christos default:
215 1.1 christos return get_reg (id);
216 1.1 christos }
217 1.1 christos }
218 1.1 christos
219 1.1 christos static int highest_sp = 0, lowest_sp = 0xffffff;
220 1.1 christos
221 1.1 christos void
222 1.1 christos stack_heap_stats ()
223 1.1 christos {
224 1.1 christos printf ("heap: %08x - %08x (%d bytes)\n", heapbottom, heaptop,
225 1.1 christos heaptop - heapbottom);
226 1.1 christos printf ("stack: %08x - %08x (%d bytes)\n", lowest_sp, highest_sp,
227 1.1 christos highest_sp - lowest_sp);
228 1.1 christos }
229 1.1 christos
230 1.1 christos void
231 1.1 christos put_reg (reg_id id, unsigned int v)
232 1.1 christos {
233 1.1 christos if (trace > ((id != pc) ? 0 : 1))
234 1.1 christos printf ("put_reg (%s) = %0*x\n", reg_names[id], reg_bytes[id] * 2, v);
235 1.1 christos
236 1.1 christos reg_bank_type *b = regs.r + (FLAG_B ? 1 : 0);
237 1.1 christos switch (id)
238 1.1 christos {
239 1.1 christos case r0:
240 1.1 christos b->r_r0 = v;
241 1.1 christos break;
242 1.1 christos case r0h:
243 1.1 christos b->r_r0 = (b->r_r0 & 0xff) | (v << 8);
244 1.1 christos break;
245 1.1 christos case r0l:
246 1.1 christos b->r_r0 = (b->r_r0 & 0xff00) | (v & 0xff);
247 1.1 christos break;
248 1.1 christos case r1:
249 1.1 christos b->r_r1 = v;
250 1.1 christos break;
251 1.1 christos case r1h:
252 1.1 christos b->r_r1 = (b->r_r1 & 0xff) | (v << 8);
253 1.1 christos break;
254 1.1 christos case r1l:
255 1.1 christos b->r_r1 = (b->r_r1 & 0xff00) | (v & 0xff);
256 1.1 christos break;
257 1.1 christos case r2:
258 1.1 christos b->r_r2 = v;
259 1.1 christos break;
260 1.1 christos case r2r0:
261 1.1 christos b->r_r0 = v & 0xffff;
262 1.1 christos b->r_r2 = v >> 16;
263 1.1 christos break;
264 1.1 christos case r3:
265 1.1 christos b->r_r3 = v;
266 1.1 christos break;
267 1.1 christos case r3r1:
268 1.1 christos b->r_r1 = v & 0xffff;
269 1.1 christos b->r_r3 = v >> 16;
270 1.1 christos break;
271 1.1 christos
272 1.1 christos case a0:
273 1.1 christos b->r_a0 = v & addr_mask;
274 1.1 christos break;
275 1.1 christos case a1:
276 1.1 christos b->r_a1 = v & addr_mask;
277 1.1 christos break;
278 1.1 christos case a1a0:
279 1.1 christos b->r_a0 = v & 0xffff;
280 1.1 christos b->r_a1 = v >> 16;
281 1.1 christos break;
282 1.1 christos
283 1.1 christos case sb:
284 1.1 christos b->r_sb = v & addr_mask;
285 1.1 christos break;
286 1.1 christos case fb:
287 1.1 christos b->r_fb = v & addr_mask;
288 1.1 christos break;
289 1.1 christos
290 1.1 christos case intb:
291 1.1 christos regs.r_intbl = v & 0xffff;
292 1.1 christos regs.r_intbh = v >> 16;
293 1.1 christos break;
294 1.1 christos case intbl:
295 1.1 christos regs.r_intbl = v & 0xffff;
296 1.1 christos break;
297 1.1 christos case intbh:
298 1.1 christos regs.r_intbh = v & 0xff;
299 1.1 christos break;
300 1.1 christos
301 1.1 christos case sp:
302 1.1 christos {
303 1.1 christos SI *spp;
304 1.1 christos if (regs.r_flags & FLAGBIT_U)
305 1.1 christos spp = ®s.r_usp;
306 1.1 christos else
307 1.1 christos spp = ®s.r_isp;
308 1.1 christos *spp = v & addr_mask;
309 1.1 christos if (*spp < heaptop)
310 1.1 christos {
311 1.1 christos printf ("collision: pc %08lx heap %08x stack %08lx\n", regs.r_pc,
312 1.1 christos heaptop, *spp);
313 1.1 christos exit (1);
314 1.1 christos }
315 1.1 christos if (*spp < lowest_sp)
316 1.1 christos lowest_sp = *spp;
317 1.1 christos if (*spp > highest_sp)
318 1.1 christos highest_sp = *spp;
319 1.1 christos break;
320 1.1 christos }
321 1.1 christos case usp:
322 1.1 christos regs.r_usp = v & addr_mask;
323 1.1 christos break;
324 1.1 christos case isp:
325 1.1 christos regs.r_isp = v & addr_mask;
326 1.1 christos break;
327 1.1 christos
328 1.1 christos case pc:
329 1.1 christos regs.r_pc = v & membus_mask;
330 1.1 christos break;
331 1.1 christos case flags:
332 1.1 christos regs.r_flags = v;
333 1.1 christos break;
334 1.1 christos default:
335 1.1 christos abort ();
336 1.1 christos }
337 1.1 christos }
338 1.1 christos
339 1.1 christos int
340 1.1 christos condition_true (int cond_id)
341 1.1 christos {
342 1.1 christos int f;
343 1.1 christos if (A16)
344 1.1 christos {
345 1.1 christos static const char *cond_name[] = {
346 1.1 christos "C", "C&!Z", "Z", "S",
347 1.1 christos "!C", "!(C&!Z)", "!Z", "!S",
348 1.1 christos "(S^O)|Z", "O", "!(S^O)", "unk",
349 1.1 christos "!((S^O)|Z)", "!O", "S^O", "unk"
350 1.1 christos };
351 1.1 christos switch (cond_id & 15)
352 1.1 christos {
353 1.1 christos case 0:
354 1.1 christos f = FLAG_C;
355 1.1 christos break; /* GEU/C */
356 1.1 christos case 1:
357 1.1 christos f = FLAG_C & !FLAG_Z;
358 1.1 christos break; /* GTU */
359 1.1 christos case 2:
360 1.1 christos f = FLAG_Z;
361 1.1 christos break; /* EQ/Z */
362 1.1 christos case 3:
363 1.1 christos f = FLAG_S;
364 1.1 christos break; /* N */
365 1.1 christos case 4:
366 1.1 christos f = !FLAG_C;
367 1.1 christos break; /* LTU/NC */
368 1.1 christos case 5:
369 1.1 christos f = !(FLAG_C & !FLAG_Z);
370 1.1 christos break; /* LEU */
371 1.1 christos case 6:
372 1.1 christos f = !FLAG_Z;
373 1.1 christos break; /* NE/NZ */
374 1.1 christos case 7:
375 1.1 christos f = !FLAG_S;
376 1.1 christos break; /* PZ */
377 1.1 christos
378 1.1 christos case 8:
379 1.1 christos f = (FLAG_S ^ FLAG_O) | FLAG_Z;
380 1.1 christos break; /* LE */
381 1.1 christos case 9:
382 1.1 christos f = FLAG_O;
383 1.1 christos break; /* O */
384 1.1 christos case 10:
385 1.1 christos f = !(FLAG_S ^ FLAG_O);
386 1.1 christos break; /* GE */
387 1.1 christos case 12:
388 1.1 christos f = !((FLAG_S ^ FLAG_O) | FLAG_Z);
389 1.1 christos break; /* GT */
390 1.1 christos case 13:
391 1.1 christos f = !FLAG_O;
392 1.1 christos break; /* NO */
393 1.1 christos case 14:
394 1.1 christos f = FLAG_S ^ FLAG_O;
395 1.1 christos break; /* LT */
396 1.1 christos
397 1.1 christos default:
398 1.1 christos f = 0;
399 1.1 christos break;
400 1.1 christos }
401 1.1 christos if (trace)
402 1.1 christos printf ("cond[%d] %s = %s\n", cond_id, cond_name[cond_id & 15],
403 1.1 christos f ? "true" : "false");
404 1.1 christos }
405 1.1 christos else
406 1.1 christos {
407 1.1 christos static const char *cond_name[] = {
408 1.1 christos "!C", "LEU", "!Z", "PZ",
409 1.1 christos "!O", "GT", "GE", "?",
410 1.1 christos "C", "GTU", "Z", "N",
411 1.1 christos "O", "LE", "LT", "!?"
412 1.1 christos };
413 1.1 christos switch (cond_id & 15)
414 1.1 christos {
415 1.1 christos case 0:
416 1.1 christos f = !FLAG_C;
417 1.1 christos break; /* LTU/NC */
418 1.1 christos case 1:
419 1.1 christos f = !(FLAG_C & !FLAG_Z);
420 1.1 christos break; /* LEU */
421 1.1 christos case 2:
422 1.1 christos f = !FLAG_Z;
423 1.1 christos break; /* NE/NZ */
424 1.1 christos case 3:
425 1.1 christos f = !FLAG_S;
426 1.1 christos break; /* PZ */
427 1.1 christos
428 1.1 christos case 4:
429 1.1 christos f = !FLAG_O;
430 1.1 christos break; /* NO */
431 1.1 christos case 5:
432 1.1 christos f = !((FLAG_S ^ FLAG_O) | FLAG_Z);
433 1.1 christos break; /* GT */
434 1.1 christos case 6:
435 1.1 christos f = !(FLAG_S ^ FLAG_O);
436 1.1 christos break; /* GE */
437 1.1 christos
438 1.1 christos case 8:
439 1.1 christos f = FLAG_C;
440 1.1 christos break; /* GEU/C */
441 1.1 christos case 9:
442 1.1 christos f = FLAG_C & !FLAG_Z;
443 1.1 christos break; /* GTU */
444 1.1 christos case 10:
445 1.1 christos f = FLAG_Z;
446 1.1 christos break; /* EQ/Z */
447 1.1 christos case 11:
448 1.1 christos f = FLAG_S;
449 1.1 christos break; /* N */
450 1.1 christos
451 1.1 christos case 12:
452 1.1 christos f = FLAG_O;
453 1.1 christos break; /* O */
454 1.1 christos case 13:
455 1.1 christos f = (FLAG_S ^ FLAG_O) | FLAG_Z;
456 1.1 christos break; /* LE */
457 1.1 christos case 14:
458 1.1 christos f = FLAG_S ^ FLAG_O;
459 1.1 christos break; /* LT */
460 1.1 christos
461 1.1 christos default:
462 1.1 christos f = 0;
463 1.1 christos break;
464 1.1 christos }
465 1.1 christos if (trace)
466 1.1 christos printf ("cond[%d] %s = %s\n", cond_id, cond_name[cond_id & 15],
467 1.1 christos f ? "true" : "false");
468 1.1 christos }
469 1.1 christos return f;
470 1.1 christos }
471 1.1 christos
472 1.1 christos void
473 1.1 christos set_flags (int mask, int newbits)
474 1.1 christos {
475 1.1 christos int i;
476 1.1 christos regs.r_flags &= ~mask;
477 1.1 christos regs.r_flags |= newbits & mask;
478 1.1 christos if (trace)
479 1.1 christos {
480 1.1 christos printf ("flags now \033[32m %d", (regs.r_flags >> (A16 ? 8 : 12)) & 7);
481 1.1 christos for (i = 7; i >= 0; i--)
482 1.1 christos if (regs.r_flags & (1 << i))
483 1.1 christos putchar ("CDZSBOIU"[i]);
484 1.1 christos else
485 1.1 christos putchar ('-');
486 1.1 christos printf ("\033[0m\n");
487 1.1 christos }
488 1.1 christos }
489 1.1 christos
490 1.1 christos void
491 1.1 christos set_oszc (int value, int b, int c)
492 1.1 christos {
493 1.1 christos int mask = b2mask[b];
494 1.1 christos int f = 0;
495 1.1 christos
496 1.1 christos if (c)
497 1.1 christos f |= FLAGBIT_C;
498 1.1 christos if ((value & mask) == 0)
499 1.1 christos f |= FLAGBIT_Z;
500 1.1 christos if (value & b2signbit[b])
501 1.1 christos f |= FLAGBIT_S;
502 1.1 christos if ((value > b2maxsigned[b]) || (value < b2minsigned[b]))
503 1.1 christos f |= FLAGBIT_O;
504 1.1 christos set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O | FLAGBIT_C, f);
505 1.1 christos }
506 1.1 christos
507 1.1 christos void
508 1.1 christos set_szc (int value, int b, int c)
509 1.1 christos {
510 1.1 christos int mask = b2mask[b];
511 1.1 christos int f = 0;
512 1.1 christos
513 1.1 christos if (c)
514 1.1 christos f |= FLAGBIT_C;
515 1.1 christos if ((value & mask) == 0)
516 1.1 christos f |= FLAGBIT_Z;
517 1.1 christos if (value & b2signbit[b])
518 1.1 christos f |= FLAGBIT_S;
519 1.1 christos set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_C, f);
520 1.1 christos }
521 1.1 christos
522 1.1 christos void
523 1.1 christos set_osz (int value, int b)
524 1.1 christos {
525 1.1 christos int mask = b2mask[b];
526 1.1 christos int f = 0;
527 1.1 christos
528 1.1 christos if ((value & mask) == 0)
529 1.1 christos f |= FLAGBIT_Z;
530 1.1 christos if (value & b2signbit[b])
531 1.1 christos f |= FLAGBIT_S;
532 1.1 christos if (value & ~mask && (value & ~mask) != ~mask)
533 1.1 christos f |= FLAGBIT_O;
534 1.1 christos set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O, f);
535 1.1 christos }
536 1.1 christos
537 1.1 christos void
538 1.1 christos set_sz (int value, int b)
539 1.1 christos {
540 1.1 christos int mask = b2mask[b];
541 1.1 christos int f = 0;
542 1.1 christos
543 1.1 christos if ((value & mask) == 0)
544 1.1 christos f |= FLAGBIT_Z;
545 1.1 christos if (value & b2signbit[b])
546 1.1 christos f |= FLAGBIT_S;
547 1.1 christos set_flags (FLAGBIT_Z | FLAGBIT_S, f);
548 1.1 christos }
549 1.1 christos
550 1.1 christos void
551 1.1 christos set_zc (int z, int c)
552 1.1 christos {
553 1.1 christos set_flags (FLAGBIT_C | FLAGBIT_Z,
554 1.1 christos (c ? FLAGBIT_C : 0) | (z ? FLAGBIT_Z : 0));
555 1.1 christos }
556 1.1 christos
557 1.1 christos void
558 1.1 christos set_c (int c)
559 1.1 christos {
560 1.1 christos set_flags (FLAGBIT_C, c ? FLAGBIT_C : 0);
561 1.1 christos }
562 1.1 christos
563 1.1 christos void
564 1.1 christos put_reg_ll (reg_id id, DI v)
565 1.1 christos {
566 1.1 christos reg_bank_type *b = regs.r + (FLAG_B ? 1 : 0);
567 1.1 christos
568 1.1 christos switch (id)
569 1.1 christos {
570 1.1 christos case r3r1r2r0:
571 1.1 christos b->r_r3 = v >> 48;
572 1.1 christos b->r_r1 = v >> 32;
573 1.1 christos b->r_r2 = v >> 16;
574 1.1 christos b->r_r0 = v;
575 1.1 christos break;
576 1.1 christos case r3r2r1r0:
577 1.1 christos b->r_r3 = v >> 48;
578 1.1 christos b->r_r2 = v >> 32;
579 1.1 christos b->r_r1 = v >> 16;
580 1.1 christos b->r_r0 = v;
581 1.1 christos break;
582 1.1 christos default:
583 1.1 christos put_reg (id, v);
584 1.1 christos }
585 1.1 christos }
586 1.1 christos
587 1.1 christos static void
588 1.1 christos print_flags (int f)
589 1.1 christos {
590 1.1 christos int i;
591 1.1 christos static char fn[] = "CDZSBOIU";
592 1.1 christos printf ("%d.", (f >> 12) & 7);
593 1.1 christos for (i = 7; i >= 0; i--)
594 1.1 christos if (f & (1 << i))
595 1.1 christos putchar (fn[i]);
596 1.1 christos }
597 1.1 christos
598 1.1 christos #define TRC(f,n, id) \
599 1.1 christos if (oldregs.f != regs.f) \
600 1.1 christos { \
601 1.1 christos printf(" %s %0*x:%0*x", n, \
602 1.1 christos reg_bytes[id]*2, (unsigned int)oldregs.f, \
603 1.1 christos reg_bytes[id]*2, (unsigned int)regs.f); \
604 1.1 christos oldregs.f = regs.f; \
605 1.1 christos }
606 1.1 christos
607 1.1 christos void
608 1.1 christos trace_register_changes ()
609 1.1 christos {
610 1.1 christos if (!trace)
611 1.1 christos return;
612 1.1 christos printf ("\033[36mREGS:");
613 1.1 christos TRC (r[0].r_r0, "r0", r0);
614 1.1 christos TRC (r[0].r_r1, "r1", r1);
615 1.1 christos TRC (r[0].r_r2, "r2", r2);
616 1.1 christos TRC (r[0].r_r3, "r3", r3);
617 1.1 christos TRC (r[0].r_a0, "a0", a0);
618 1.1 christos TRC (r[0].r_a1, "a1", a1);
619 1.1 christos TRC (r[0].r_sb, "sb", sb);
620 1.1 christos TRC (r[0].r_fb, "fb", fb);
621 1.1 christos TRC (r[1].r_r0, "r0'", r0);
622 1.1 christos TRC (r[1].r_r1, "r1'", r1);
623 1.1 christos TRC (r[1].r_r2, "r2'", r2);
624 1.1 christos TRC (r[1].r_r3, "r3'", r3);
625 1.1 christos TRC (r[1].r_a0, "a0'", a0);
626 1.1 christos TRC (r[1].r_a1, "a1'", a1);
627 1.1 christos TRC (r[1].r_sb, "sb'", sb);
628 1.1 christos TRC (r[1].r_fb, "fb'", fb);
629 1.1 christos TRC (r_intbh, "intbh", intbh);
630 1.1 christos TRC (r_intbl, "intbl", intbl);
631 1.1 christos TRC (r_usp, "usp", usp);
632 1.1 christos TRC (r_isp, "isp", isp);
633 1.1 christos TRC (r_pc, "pc", pc);
634 1.1 christos if (oldregs.r_flags != regs.r_flags)
635 1.1 christos {
636 1.1 christos printf (" flags ");
637 1.1 christos print_flags (oldregs.r_flags);
638 1.1 christos printf (":");
639 1.1 christos print_flags (regs.r_flags);
640 1.1 christos }
641 1.1 christos printf ("\033[0m\n");
642 1.1 christos }
643 1.1 christos
644 1.1 christos #define DRC(f, n, id) \
645 1.1 christos printf(" %-3s %0*x", n, \
646 1.1 christos reg_bytes[id]*2, (unsigned int)regs.f); \
647 1.1 christos
648 1.1 christos void
649 1.1 christos m32c_dump_all_registers ()
650 1.1 christos {
651 1.1 christos printf ("\033[36mREGS:");
652 1.1 christos DRC (r[0].r_r0, "r0", r0);
653 1.1 christos DRC (r[0].r_r1, "r1", r1);
654 1.1 christos DRC (r[0].r_r2, "r2", r2);
655 1.1 christos DRC (r[0].r_r3, "r3", r3);
656 1.1 christos DRC (r[0].r_a0, "a0", a0);
657 1.1 christos DRC (r[0].r_a1, "a1", a1);
658 1.1 christos DRC (r[0].r_sb, "sb", sb);
659 1.1 christos DRC (r[0].r_fb, "fb", fb);
660 1.1 christos printf ("\n ");
661 1.1 christos DRC (r[1].r_r0, "r0'", r0);
662 1.1 christos DRC (r[1].r_r1, "r1'", r1);
663 1.1 christos DRC (r[1].r_r2, "r2'", r2);
664 1.1 christos DRC (r[1].r_r3, "r3'", r3);
665 1.1 christos DRC (r[1].r_a0, "a0'", a0);
666 1.1 christos DRC (r[1].r_a1, "a1'", a1);
667 1.1 christos DRC (r[1].r_sb, "sb'", sb);
668 1.1 christos DRC (r[1].r_fb, "fb'", fb);
669 1.1 christos printf (" \n");
670 1.1 christos DRC (r_intbh, "intbh", intbh);
671 1.1 christos DRC (r_intbl, "intbl", intbl);
672 1.1 christos DRC (r_usp, "usp", usp);
673 1.1 christos DRC (r_isp, "isp", isp);
674 1.1 christos DRC (r_pc, "pc", pc);
675 1.1 christos printf (" flags ");
676 1.1 christos print_flags (regs.r_flags);
677 1.1 christos printf ("\033[0m\n");
678 1.1 christos /*sim_disasm_one (); */
679 1.1 christos }
680