]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/h8500/compile.c
Initial creation of sourceware repository
[thirdparty/binutils-gdb.git] / sim / h8500 / compile.c
1 /* Simulator for the Hitachi H8/500 architecture.
2
3 Written by Steve Chamberlain of Cygnus Support.
4 sac@cygnus.com
5
6 This file is part of H8/500 sim
7
8
9 THIS SOFTWARE IS NOT COPYRIGHTED
10
11 Cygnus offers the following for use in the public domain. Cygnus
12 makes no warranty with regard to the software or it's performance
13 and the user accepts the software "AS IS" with all faults.
14
15 CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
16 THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18
19 */
20
21 #include "config.h"
22
23 #include <signal.h>
24 #ifdef HAVE_STDLIB_H
25 #include <stdlib.h>
26 #endif
27 #ifdef HAVE_TIME_H
28 #include <time.h>
29 #endif
30 #include <sys/param.h>
31 #include <setjmp.h>
32 #include "ansidecl.h"
33 #include "bfd.h"
34 #include "callback.h"
35 #include "remote-sim.h"
36
37 #define O_RECOMPILE 85
38 #define DEFINE_TABLE
39 #define DISASSEMBLER_TABLE
40
41 /* FIXME: Needs to live in header file.
42 This header should also include the things in remote-sim.h.
43 One could move this to remote-sim.h but this function isn't needed
44 by gdb. */
45 void sim_set_simcache_size PARAMS ((int));
46
47 int debug;
48
49 host_callback *sim_callback;
50
51 static SIM_OPEN_KIND sim_kind;
52 static char *myname;
53
54 /* This code can be compiled with any old C compiler, in which case
55 four or five switch statements will be executed for each
56 instruction simulated. It can be compiled with GCC, then the
57 simulated instructions thread through the code fragments, and
58 everything goes much faster.
59
60 These definitions make the code work either way
61 */
62 #ifdef __GNUC__
63 #define DISPATCH(X) goto *(X); do
64 #define LABEL(X) X##_L
65 #define LABELN(X,N) X##_L##N
66 #define LABEL_REF(X) &&X##_L
67 #define LABEL_REFN(X,N) &&X##_L##N
68 #define ENDDISPATCH while (0);
69 #define fastref void *
70
71 #define DEFAULT ;
72 #define INLINE __inline__
73 #else
74 #define DEFAULT default :
75 #define DISPATCH(X) switch (X)
76 #define LABEL(X) case X
77 #define LABELN(X,N) case X
78 #define LABEL_REF(X) X
79 #define LABEL_REFN(X,N) X
80 #define ENDDISPATCH
81 #define fastref int
82
83
84
85 #define INLINE
86 #define STORE_REG_B 1
87 #define STORE_REG_W 2
88 #define STORE_INC_B 3
89 #define STORE_INC_W 4
90 #define STORE_DEC_B 5
91 #define STORE_DEC_W 6
92 #define STORE_DISP_B 7
93 #define STORE_DISP_W 8
94 #define STORE_CRB 9
95 #define STORE_CRW 10
96 #define STORE_REG_L 11
97 #define STORE_NOP 12
98
99 #define FETCH_NOP 9
100 #define FETCH_REG_B 10
101 #define FETCH_REG_W 11
102 #define FETCH_INC_B 12
103 #define FETCH_INC_W 13
104 #define FETCH_DEC_B 14
105 #define FETCH_DEC_W 15
106 #define FETCH_DISP_B 16
107 #define FETCH_DISP_W 17
108 #define FETCH_IMM 18
109 #define FETCH_CRB 19
110 #define FETCH_CRW 20
111 #define FETCH_LVAL 21
112 #define FETCH_LVAL24 22
113 #define FETCH_REG_L 23
114
115 #define FLAG_m 20
116 #define FLAG_M 21
117 #define FLAG_A 22
118 #define FLAG_NONE 23
119 #define FLAG_NOSTORE 24
120 #define FLAG_CLEAR 25
121 #define FLAG_a 26
122 #define FLAG_BRANCH 27
123 #define FLAG_special 28
124
125 #define FLAG_shiftword 29
126 #define FLAG_shiftbyte 30
127
128 #define FLAG_multword 31
129 #define FLAG_multbyte 32
130 #endif
131
132
133 #define h8500_table h8500_compile_table
134 #include "../opcodes/h8500-opc.h"
135
136 #include "inst.h"
137
138 #define LOW_BYTE(x) ((x) & 0xff)
139 #define HIGH_BYTE(x) (((x)>>8) & 0xff)
140 #define NORMAL_CP ((cpu.regs[R_CP].c - cpu.memory)>>16)
141 #define NORMAL_DP ((cpu.regs[R_DP].c - cpu.memory)>>16)
142 #define NORMAL_EP ((cpu.regs[R_EP].c - cpu.memory)>>16)
143 #define NORMAL_TP ((cpu.regs[R_TP].c - cpu.memory)>>16)
144 #define SET_NORMREG(x,y) ((cpu.regs[x].l = (y)))
145 #define GET_NORMREG(x) (cpu.regs[x].l)
146 #define SET_SEGREG(x,y) { cpu.regs[x].c = ((y) & 0xff0000) + cpu.memory;}
147 #define GET_SEGREG(x) ( (cpu.regs[x].c - cpu.memory ) >> 16)
148 #define SET_NORMAL_CPPC(x) { pc = (x) & 0xffff; SET_SEGREG(R_CP, (x));}
149 #define NORMAL_SR ((N<<3)|(Z<<2)|(V<<1)|(C))
150 #define P(X,Y) ((X<<8) | Y)
151
152 #define BUILDSR() cpu.regs[R_SR].s[LOW] = (N << 3) | (Z << 2) | (V<<1) | C;
153
154 #define GETSR() \
155 C = (cpu.regs[R_SR].s[LOW] >> 0) & 1;\
156 V = (cpu.regs[R_SR].s[LOW] >> 1) & 1;\
157 Z = (cpu.regs[R_SR].s[LOW] >> 2) & 1;\
158 N = (cpu.regs[R_SR].s[LOW] >> 3) & 1;
159
160 #ifdef __CHAR_IS_SIGNED__
161 #define SEXTCHAR(x) ((char)(x))
162 #endif
163
164 #ifndef SEXTCHAR
165 #define SEXTCHAR(x) ((x & 0x80) ? (x | ~0xff):x)
166 #endif
167
168 #define SEXTSHORT(x) ((short)(x))
169
170 /* Which segment registers go with which pointer registers */
171 static unsigned char **segmap[R_LAST];
172 static unsigned char *(regptr[R_LAST][3]);
173 static unsigned char *(segregptr[R_LAST][3]);
174 static cpu_state_type cpu;
175
176 static int segforreg[] = {R_DP, R_DP, R_DP, R_DP,
177 R_EP, R_EP, R_TP, R_TP,
178 R_DP, R_DP, R_DP, R_DP,
179 R_EP, R_EP, R_TP, R_TP};
180 int LOW;
181 int HIGH;
182
183 /* routines for getting and storing args */
184 #define elval(struct, lit) \
185 (((*(struct.reg.wptr) + lit) & 0xffff) + (*(struct.r2.segreg)))
186
187 #define displval(s) elval((s),(s).literal)
188
189 #define ireglval(struct) elval(struct, 0)
190 #define wordat(x) (((x)[0] << 8) | (x)[1])
191 #define longat(x) ((wordat((x))<<16)|(wordat((x)+2)))
192 #define byteat(x) ((x)[0])
193
194 #define setwordat(x,y) {x[0] =( y)>>8; x[1] = y;}
195 #define setbyteat(x,y) {x[0] = y;}
196
197 /*#define setalignedwordat(x,y) {((short *)x)[0] =y;}*/
198 /*
199 statics
200 */
201
202 ea_type rd;
203 ea_type rs;
204 ea_type imm;
205 ea_type cr;
206 ea_type ea;
207 ea_type nop;
208 ea_type lval;
209 ea_type lval24;
210
211 ea_type eavector[2];
212
213 int disp;
214
215 #define JBYTE 0
216 #define JWORD 1
217 #define JLONG 2
218
219 typedef union
220 {
221 struct
222 {
223 fastref srcabyte;
224 fastref srcaword;
225 fastref srcalong;
226
227 fastref srcbbyte;
228 fastref srcbword;
229 fastref srcblong;
230
231 fastref dstbyte;
232 fastref dstword;
233 fastref dstlong;
234 } s;
235 struct
236 {
237 fastref byte;
238 fastref word;
239 fastref lon;
240 } a[3];
241
242 fastref j[9];
243 } size_ptr;
244
245 union
246 {
247 struct ea_struct
248 {
249 size_ptr ea_nop;
250 size_ptr ea_reg;
251 size_ptr ea_inc;
252 size_ptr ea_dec;
253 size_ptr ea_disp;
254
255 size_ptr ea_imm;
256 size_ptr ea_cr;
257 size_ptr ea_lval;
258 size_ptr ea_lval24;
259 } s;
260 #define N_EATYPES (sizeof(struct ea_struct) / sizeof(size_ptr))
261 size_ptr a[N_EATYPES];
262 } eas;
263
264 /* This function takes an ea structure filled in for the 1st source
265 operand and modifies it to be for either the 1st, 2nd or dst operand */
266
267 static void
268 howto_workout (encoded, semiencoded, n)
269 ea_type *encoded;
270 ea_type *semiencoded;
271 int n;
272 {
273 int i;
274 *encoded = *semiencoded;
275
276 for (i = 0; i < N_EATYPES; i++)
277 {
278 if (encoded->type == eas.a[i].s.srcabyte)
279 {
280 encoded->type = eas.a[i].a[n].byte;
281 return;
282 }
283 else if (encoded->type == eas.a[i].s.srcaword)
284 {
285 encoded->type = eas.a[i].a[n].word;
286 return;
287 }
288 else if (encoded->type == eas.a[i].s.srcalong)
289 {
290 encoded->type = eas.a[i].a[n].lon;
291 return;
292 }
293 }
294
295 abort ();
296 }
297
298 fastref flag_shiftword;
299 fastref flag_shiftbyte;
300 fastref flag_multword;
301 fastref flag_multbyte;
302 fastref flag_mp;
303 fastref flag_special;
304 fastref flag_Mp;
305 fastref flag_ap;
306 fastref flag_Ap;
307 fastref flag_nonep;
308 fastref flag_nostorep;
309 fastref flag_clearp;
310 fastref flag_branch;
311 fastref exec_dispatch[100];
312
313 static int
314 get_now ()
315 {
316 return time (0);
317 }
318
319 static int
320 now_persec ()
321 {
322 return 1;
323 }
324
325 static void
326 gotcr (ptr, n)
327 ea_type *ptr;
328 int n;
329 {
330 int size;
331 n &= 0x7;
332 if (n == 0)
333 {
334 abort ();
335 }
336 else
337 {
338 ptr->type = eas.s.ea_cr.j[JBYTE];
339 ptr->reg.bptr = segregptr[n][JLONG];
340 }
341 }
342 static void
343 gotreg (ptr, n, size)
344 ea_type *ptr;
345 int n;
346 int size;
347 {
348 n &= 0x7;
349 ptr->type = eas.s.ea_reg.j[size];
350 ptr->reg.bptr = regptr[n][size];
351 }
352
353 static void
354 gotinc (ptr, n, inc, size)
355 ea_type *ptr;
356 int n;
357 int size;
358 {
359 n &= 0x7;
360 if (inc > 0)
361 {
362 ptr->type = eas.s.ea_inc.j[size];
363 }
364 else
365 {
366 ptr->type = eas.s.ea_dec.j[size];
367 }
368 ptr->reg.bptr = regptr[n][JWORD];
369 ptr->r2.segreg = segmap[n];
370 }
371
372
373 static void
374 gotabs (ptr, disp, reg, size)
375 ea_type *ptr;
376 int disp;
377 int reg;
378 int size;
379 {
380 ptr->type = eas.s.ea_disp.j[size];
381 ptr->reg.bptr = regptr[reg][JWORD];
382 ptr->r2.segreg = segmap[reg];
383 ptr->literal = disp;
384 }
385
386 static void
387 gotind (ptr, disp, reg, size)
388 ea_type *ptr;
389 int disp;
390 int reg;
391 int size;
392 {
393 gotabs (ptr, disp, reg & 0x7, size);
394 }
395
396 static void
397 gotimm (ptr, val)
398 ea_type *ptr;
399 int val;
400 {
401 ptr->type = eas.s.ea_imm.j[0];
402 ptr->literal = val;
403 }
404
405 static void
406 indoff (ptr)
407 ea_type *ptr;
408 {
409 int i;
410 for (i = 0; i < 6; i++)
411 {
412 if (ptr->type == eas.s.ea_disp.j[i])
413 {
414 ptr->type = eas.s.ea_lval.j[i];
415 return;
416 }
417 }
418 }
419
420 thinkabout_shifts (d, bytesized)
421 decoded_inst *d;
422 int bytesized;
423 {
424 if (bytesized)
425 {
426 /* Got a byte shift, fake up second arg */
427 d->srcb.type = eas.s.ea_imm.s.srcbword;
428 d->srcb.literal = 8;
429 }
430 else
431 {
432 /* got a word shift, fake up second arg */
433 d->srcb.type = eas.s.ea_imm.s.srcbword;
434 d->srcb.literal = 16;
435 }
436 }
437
438 /* Calculate the number of cycles required to run this
439 instruction
440 */
441 static void
442 compcycles (dst, opcode)
443 decoded_inst *dst;
444 h8500_opcode_info *opcode;
445 {
446 int cycles = 0;
447 /* Guess for the time being - 1 cycle for the first two bytes in the
448 opcode - to fecth the operand, and 3 cycles for all the rest of
449 the bytes, since they mean that there is probably an operand to
450 fetch */
451
452 switch (opcode->length)
453 {
454 case 1:
455 case 2:
456 cycles += opcode->length;
457 break;
458 default:
459 cycles += opcode->length * 3;
460 break;
461 }
462
463 dst->cycles = cycles;
464 }
465
466 static void
467 translate (ptr, from, to)
468 ea_type *ptr;
469 fastref from;
470 fastref to;
471 {
472 if (ptr->reg.wptr == &cpu.regs[7].s[LOW]
473 && ptr->type == from)
474 {
475 ptr->type = to;
476 }
477 }
478
479 static
480 void
481 fix_incdecs (dst)
482 decoded_inst *dst;
483 {
484 if (dst->dst.type == eas.s.ea_inc.s.dstbyte
485 && (dst->srca.type == eas.s.ea_inc.s.srcabyte
486 || dst->srcb.type == eas.s.ea_inc.s.srcbbyte))
487 {
488 dst->dst.type = eas.s.ea_disp.s.dstbyte;
489 }
490
491 if (dst->dst.type == eas.s.ea_inc.s.dstword
492 && (dst->srca.type == eas.s.ea_inc.s.srcaword
493 || dst->srcb.type == eas.s.ea_inc.s.srcbword))
494 {
495 dst->dst.type = eas.s.ea_disp.s.dstword;
496 }
497
498 if (dst->dst.type == eas.s.ea_dec.s.dstbyte
499 || dst->dst.type == eas.s.ea_dec.s.dstword)
500 {
501 if (dst->srca.type == eas.s.ea_dec.s.srcabyte)
502 {
503 dst->srca.type = eas.s.ea_disp.s.srcabyte;
504 }
505 else if (dst->srca.type == eas.s.ea_dec.s.srcaword)
506 {
507 dst->srca.type = eas.s.ea_disp.s.srcaword;
508 }
509 else if (dst->srcb.type == eas.s.ea_dec.s.srcbbyte)
510 {
511 dst->srcb.type = eas.s.ea_disp.s.srcbbyte;
512 }
513 else if (dst->srcb.type == eas.s.ea_dec.s.srcbword)
514 {
515 dst->srcb.type = eas.s.ea_disp.s.srcbword;
516 }
517 }
518
519
520 /* Turn a byte ops from the sp into word ops */
521 translate (&dst->dst, eas.s.ea_dec.s.dstbyte, eas.s.ea_dec.s.dstword);
522 translate (&dst->dst, eas.s.ea_inc.s.dstbyte, eas.s.ea_inc.s.dstword);
523
524 translate (&dst->srca, eas.s.ea_dec.s.srcabyte, eas.s.ea_dec.s.srcaword);
525 translate (&dst->srca, eas.s.ea_inc.s.srcabyte, eas.s.ea_inc.s.srcaword);
526
527 translate (&dst->srcb, eas.s.ea_dec.s.srcbbyte, eas.s.ea_dec.s.srcbword);
528 translate (&dst->srcb, eas.s.ea_inc.s.srcbbyte, eas.s.ea_inc.s.srcbword);
529
530
531 }
532
533
534 static void
535 find (pc, buffer, dst)
536 int pc;
537 unsigned char *buffer;
538 decoded_inst *dst;
539 {
540 h8500_opcode_info *opcode;
541 int i;
542 int idx;
543 int hadimm = 0;
544 dst->srca.reg.rptr = 0;
545
546 /* Run down the table to find the one which matches */
547 for (opcode = h8500_table; opcode->name; opcode++)
548 {
549 int byte;
550 int rn;
551 int rd;
552 int rs;
553 int disp;
554 int abs;
555 int imm;
556 int pcrel;
557 int qim;
558 int i;
559 int cr;
560
561
562 dst->opcode = exec_dispatch[opcode->flavor & 0x7f];
563
564 for (byte = 0; byte < opcode->length; byte++)
565 {
566 if ((buffer[byte] & opcode->bytes[byte].mask)
567 != (opcode->bytes[byte].contents))
568 {
569 goto next;
570 }
571 else
572 {
573 /* extract any info parts */
574 switch (opcode->bytes[byte].insert)
575 {
576 case 0:
577 case FP:
578 break;
579 default:
580 abort ();
581 break;
582 case RN:
583 rn = buffer[byte] & 0x7;
584 break;
585 case RS:
586 rs = buffer[byte] & 0x7;
587 break;
588 case CRB:
589 cr = buffer[byte] & 0x7;
590 if (cr == 0)
591 goto next;
592 break;
593 case CRW:
594 cr = buffer[byte] & 0x7;
595 if (cr != 0)
596 goto next;
597 break;
598 case DISP16:
599 disp = (buffer[byte] << 8) | (buffer[byte + 1]);
600 break;
601 case FPIND_D8:
602 case DISP8:
603 disp = ((char) (buffer[byte]));
604 break;
605 case RD:
606 case RDIND:
607 rd = buffer[byte] & 0x7;
608 break;
609 case ABS24:
610 abs =
611 (buffer[byte] << 16)
612 | (buffer[byte + 1] << 8)
613 | (buffer[byte + 2]);
614 break;
615 case ABS16:
616 abs = (buffer[byte] << 8) | (buffer[byte + 1]);
617 break;
618 case ABS8:
619 abs = (buffer[byte]);
620 break;
621 case IMM16:
622 imm = (buffer[byte] << 8) | (buffer[byte + 1]);
623 break;
624 case IMM4:
625 imm = (buffer[byte]) & 0xf;
626 break;
627 case IMM8:
628 case RLIST:
629 imm = SEXTCHAR (buffer[byte]);
630 break;
631 case PCREL16:
632 pcrel = SEXTSHORT ((buffer[byte] << 8) | (buffer[byte + 1]));
633 break;
634 case PCREL8:
635 pcrel = SEXTCHAR ((buffer[byte]));
636 break;
637 case QIM:
638 switch (buffer[byte] & 0x7)
639 {
640 case 0:
641 imm = 1;
642 break;
643 case 1:
644 imm = 2;
645 break;
646 case 4:
647 imm = -1;
648 break;
649 case 5:
650 imm = -2;
651 break;
652 }
653 break;
654
655 }
656 }
657 }
658 if (opcode->flavor & O_BYTE)
659 {
660 idx = 0;
661 switch (opcode->flags)
662 {
663 case 'h':
664 dst->flags = flag_shiftbyte;
665 break;
666 case 'p':
667 dst->flags = flag_multbyte;
668 break;
669 case 'B':
670 dst->flags = flag_branch;
671 break;
672 case 'm':
673 dst->flags = flag_mp;
674 break;
675 case 'a':
676 dst->flags = flag_ap;
677 break;
678 case '-':
679 dst->flags = flag_nonep;
680 break;
681 case 0:
682 dst->flags = flag_nostorep;
683 break;
684 case 'c':
685 dst->flags = flag_clearp;
686 break;
687 case 's':
688 /* special */
689 dst->flags = flag_special;
690 }
691 }
692 else
693 {
694 idx = 1;
695 switch (opcode->flags)
696 {
697 case 'h':
698 dst->flags = flag_shiftword;
699 break;
700 case 'p':
701 dst->flags = flag_multword;
702 break;
703 case 'B':
704 dst->flags = flag_branch;
705 break;
706 case 'm':
707 dst->flags = flag_Mp;
708 break;
709 case 'a':
710 dst->flags = flag_Ap;
711 break;
712 case '-':
713 dst->flags = flag_nonep;
714 break;
715 case 0:
716 dst->flags = flag_nostorep;
717 break;
718 case 'c':
719 dst->flags = flag_clearp;
720 break;
721 case 's':
722 /* special */
723 dst->flags = flag_special;
724 break;
725 }
726 }
727
728 for (i = 0; i < opcode->nargs; i++)
729 {
730 ea_type *p = eavector + i;
731
732 switch (opcode->arg_type[i])
733 {
734 default:
735 abort ();
736
737 case FP:
738 gotreg (p, 6, idx);
739 break;
740 case RNIND:
741 disp = 0;
742 case RNIND_D16:
743 case RNIND_D8:
744 gotind (p, disp, rn, idx);
745 break;
746 break;
747 case RDIND:
748 disp = 0;
749 case RDIND_D16:
750 case RDIND_D8:
751 gotind (p, disp, rd, idx);
752 break;
753 case FPIND_D8:
754 gotind (p, disp, 6, idx);
755 break;
756 case CRB:
757 case CRW:
758 gotcr (p, cr);
759 break;
760 case RN:
761 gotreg (p, rn, idx);
762 break;
763 case RD:
764 gotreg (p, rd, idx);
765 break;
766 case RS:
767 gotreg (p, rs, idx);
768 break;
769 case RNDEC:
770 gotinc (p, rn, -1, idx);
771 break;
772 case RNINC:
773 gotinc (p, rn, 1, idx);
774 break;
775 case SPINC:
776 gotinc (p, 7, 1, idx);
777 break;
778 case SPDEC:
779 gotinc (p, 7, -1, idx);
780 break;
781 case ABS24:
782 case ABS16:
783 gotabs (p, abs, R_HARD_0, idx);
784 break;
785 case ABS8:
786 gotabs (p, abs, R_HARD8_0, idx);
787 break;
788 case IMM16:
789 case RLIST:
790 case QIM:
791 case IMM4:
792 case IMM8:
793 gotimm (p, imm);
794 break;
795 case PCREL16:
796 case PCREL8:
797 gotimm (p,
798 ((pcrel + pc + opcode->length) & 0xffff) | (pc & 0xff0000),
799 R_HARD_0, JLONG);
800
801 }
802 }
803
804 /* Finished and done - turn from two operand stuff into three */
805
806 dst->srca.type = eas.s.ea_nop.s.srcabyte;
807 dst->srcb.type = eas.s.ea_nop.s.srcbbyte;
808 dst->dst.type = eas.s.ea_nop.s.dstbyte;
809
810 if (opcode->nargs)
811 {
812 switch (opcode->nargs)
813 {
814 case 1:
815 howto_workout (&dst->srca, &eavector[0], 0);
816 if (opcode->dst != '!')
817 howto_workout (&dst->dst, &eavector[0], 2);
818 break;
819 case 2:
820 if (opcode->src2 == '!')
821 {
822 howto_workout (&dst->srca, &eavector[0], 0);
823 howto_workout (&dst->dst, &eavector[1], 2);
824 }
825 else
826 {
827 howto_workout (&dst->srca, &eavector[0], 0);
828 howto_workout (&dst->srcb, &eavector[1], 1);
829 if (opcode->dst != '!')
830 {
831 howto_workout (&dst->dst, &eavector[1], 2);
832 }
833 }
834 break;
835 }
836
837
838
839 /* Some extra stuff with pre inc and post dec,
840 make sure that if the same ea is there twice, only one of the
841 ops is auto inc/dec */
842
843 fix_incdecs (dst);
844
845
846 /* Some special cases */
847 if (dst->opcode == exec_dispatch[O_PJSR]
848 || dst->opcode == exec_dispatch[O_PJMP])
849 {
850 /* Both the @abs:24 and @rn turn into a disp word,
851 chose the right a mode since @abs:24 is 4 bytes
852 long */
853
854 if (opcode->length == 4)
855 {
856 dst->srca.type = eas.s.ea_lval24.s.srcabyte;
857 }
858 else
859 {
860 dst->srca.type = eas.s.ea_reg.s.srcalong;
861 }
862
863 dst->srca.r2.rptr = &cpu.regs[R_HARD_0];
864
865 /* For [P]JSR, keep return address precomputed */
866 dst->srcb.literal = pc + opcode->length;
867 dst->srcb.type = eas.s.ea_imm.s.srcbword;
868 }
869 else if (dst->opcode == exec_dispatch[O_MULXU])
870 {
871 /* This is a multiply -fix the destination op */
872 if (dst->dst.type == eas.s.ea_reg.s.dstword)
873 {
874 dst->dst.type = eas.s.ea_reg.s.dstlong;
875 }
876 else
877 {
878 dst->dst.type = eas.s.ea_reg.s.dstword;
879 }
880 dst->dst.reg.bptr = regptr[rd][JWORD];
881 }
882 else if (dst->opcode == exec_dispatch[O_DIVXU])
883 {
884 /* This is a wider than normal, fix the source operand */
885 dst->srcb.type
886 = (dst->srcb.type == eas.s.ea_reg.s.srcbword)
887 ? eas.s.ea_reg.s.srcblong
888 : eas.s.ea_reg.s.srcbword;
889
890 dst->dst.type
891 = (dst->dst.type == eas.s.ea_reg.s.dstword)
892 ? eas.s.ea_reg.s.dstlong
893 : eas.s.ea_reg.s.dstword;
894
895 }
896
897 else if (dst->opcode == exec_dispatch[O_LDM])
898 {
899 /* Turn of the stack ref */
900 dst->srca.type = eas.s.ea_nop.s.srcabyte;
901 }
902 else if (dst->opcode == exec_dispatch[O_STM])
903 {
904 /* Turn of the stack ref */
905 dst->srcb.type = eas.s.ea_nop.s.srcbbyte;
906 }
907
908
909 /* extends read one size and write another */
910 else if (dst->opcode == exec_dispatch[O_EXTS]
911 || dst->opcode == exec_dispatch[O_EXTU])
912 {
913 dst->dst.type = eas.s.ea_reg.s.dstword;
914 dst->dst.reg.bptr = regptr[rd][JWORD];
915 dst->flags = flag_Ap;
916 }
917
918
919 if (opcode->flags == 'h')
920 thinkabout_shifts (dst, opcode->flavor & O_BYTE);
921
922
923 /* For a branch, turn off one level of indirection */
924 if (opcode->src1 == 'B')
925 {
926 indoff (&dst->srca, 0);
927 }
928
929 }
930 dst->next_pc = pc + opcode->length;
931
932 compcycles (dst, opcode);
933
934 return;
935
936
937 next:;
938 }
939
940 /* Couldn't understand anything */
941 dst->opcode = exec_dispatch[O_TRAPA];
942 dst->next_pc = pc + 1;
943
944 }
945
946 compile (pc)
947 {
948 int idx;
949
950 /* find the next cache entry to use */
951
952 idx = cpu.cache_top + 1;
953 cpu.compiles++;
954 if (idx >= cpu.csize)
955 {
956 idx = 1;
957 }
958 cpu.cache_top = idx;
959
960 /* Throw away its old meaning */
961 cpu.cache_idx[cpu.cache[idx].oldpc] = 0;
962
963 /* set to new address */
964 cpu.cache[idx].oldpc = pc;
965
966 /* fill in instruction info */
967 find (pc, cpu.memory + pc, cpu.cache + idx);
968
969 /* point to new cache entry */
970 cpu.cache_idx[pc] = idx;
971 }
972
973 baddefault (x)
974 {
975 printf ("bad default %d\n", x);
976 }
977
978 static int fetch_l (arg)
979 ea_type *arg;
980 {
981 int l, r;
982
983 int h = *(arg->reg.wptr);
984 r = (union rtype *) (arg->reg.wptr) - &cpu.regs[0];
985 r++;
986
987 l = cpu.regs[r].s[LOW];
988 return (h << 16) | l;
989
990 }
991
992 #define FETCH(dst, arg, n) \
993 { \
994 int r; unsigned char*lval; \
995 DISPATCH((arg).type) \
996 { LABELN(FETCH_NOP,n): \
997 dst= 0; \
998 break; \
999 DEFAULT baddefault((arg).type); break; \
1000 LABELN(FETCH_LVAL,n): \
1001 dst = (*(((arg).reg.wptr)) + (arg.literal)) ; \
1002 break; \
1003 LABELN(FETCH_LVAL24,n): \
1004 dst = (*(((arg).reg.wptr)) + *(((arg).r2.wptr)) + (arg.literal)) &0xffffff; \
1005 break; \
1006 LABELN(FETCH_CRB,n): \
1007 dst = (*((arg).reg.segptr) - cpu.memory)>>16; \
1008 break; \
1009 LABELN(FETCH_CRW,n): \
1010 dst = BUILDSR();\
1011 break; \
1012 LABELN(FETCH_REG_B,n): \
1013 dst = *((arg).reg.bptr); \
1014 break; \
1015 LABELN(FETCH_REG_W,n): \
1016 dst = *((arg).reg.wptr); \
1017 break; \
1018 LABELN(FETCH_REG_L,n): \
1019 dst = fetch_l(&(arg));\
1020 break; \
1021 LABELN(FETCH_INC_B,n): \
1022 lval = elval ((arg), 0); \
1023 dst = byteat (lval); \
1024 (*((arg).reg.wptr))++; \
1025 break; \
1026 LABELN(FETCH_INC_W,n): \
1027 lval = elval ((arg), 0); \
1028 dst = wordat (lval); \
1029 (*(((arg).reg.wptr))) += 2; \
1030 break; \
1031 LABELN(FETCH_DEC_B, n): \
1032 (*(arg).reg.wptr)--; \
1033 lval = elval ((arg), 0); \
1034 r = byteat (lval); \
1035 dst = r; \
1036 break; \
1037 LABELN(FETCH_DEC_W, n): \
1038 (*((arg).reg.wptr)) -= 2; \
1039 lval = elval ((arg), 0); \
1040 r = wordat (lval); \
1041 dst = r; \
1042 break; \
1043 LABELN(FETCH_DISP_B,n): \
1044 lval = displval ((arg)); \
1045 dst = byteat (lval); \
1046 break; \
1047 LABELN(FETCH_DISP_W,n): \
1048 lval = displval ((arg)); \
1049 dst = wordat (lval); \
1050 break; \
1051 LABELN(FETCH_IMM, n): \
1052 dst = (arg).literal; \
1053 break; \
1054 } \
1055 ENDDISPATCH; \
1056 }
1057
1058 static union
1059 {
1060 short int i;
1061 struct
1062 {
1063 char low;
1064 char high;
1065 }
1066 u;
1067 }
1068
1069 littleendian;
1070
1071 static
1072 void
1073 init_pointers ()
1074 {
1075 static int init;
1076
1077 if (!init)
1078 {
1079 int i;
1080
1081 init = 1;
1082 littleendian.i = 1;
1083
1084 for (i = 0; i < (int) R_LAST; i++)
1085 {
1086 if (littleendian.u.high)
1087 {
1088 /* big endian host */
1089
1090
1091 LOW = 1;
1092 HIGH = 0;
1093
1094 regptr[i][0] = ((unsigned char *) (cpu.regs + i)) + 3;
1095 regptr[i][1] = ((unsigned char *) (cpu.regs + i)) + 2;
1096 }
1097 else
1098 {
1099 LOW = 0;
1100 HIGH = 1;
1101
1102 regptr[i][0] = (unsigned char *) &(cpu.regs[i]);
1103 regptr[i][1] = (unsigned char *) (&(cpu.regs[i]));
1104 }
1105
1106 regptr[i][2] = (unsigned char *) &(cpu.regs[i]);
1107 }
1108
1109 memcpy (segregptr + 0, regptr + R_SR, sizeof (segregptr[0]));
1110 memcpy (segregptr + 1, regptr + R_TP, sizeof (segregptr[1]));
1111 memcpy (segregptr + 3, regptr + R_BR, sizeof (segregptr[3]));
1112 memcpy (segregptr + 4, regptr + R_EP, sizeof (segregptr[4]));
1113 memcpy (segregptr + 5, regptr + R_DP, sizeof (segregptr[5]));
1114 memcpy (segregptr + 6, regptr + R_CP, sizeof (segregptr[6]));
1115 memcpy (segregptr + 7, regptr + R_TP, sizeof (segregptr[7]));
1116
1117 /* Pointers to into the cpu state for the seg registers */
1118
1119 segmap[R0] = &cpu.regs[R_DP].c;
1120 segmap[R1] = &cpu.regs[R_DP].c;
1121 segmap[R2] = &cpu.regs[R_DP].c;
1122 segmap[R3] = &cpu.regs[R_DP].c;
1123 segmap[R4] = &cpu.regs[R_EP].c;
1124 segmap[R5] = &cpu.regs[R_EP].c;
1125 segmap[R6] = &cpu.regs[R_TP].c;
1126 segmap[R7] = &cpu.regs[R_TP].c;
1127 segmap[R_HARD_0] = &cpu.regs[R_DP].c;
1128 segmap[R_HARD8_0] = &cpu.regs[R_BP].c;
1129
1130 cpu.memory = (unsigned char *) calloc (sizeof (char), H8500_MSIZE);
1131 cpu.cache_idx = (unsigned short *) calloc (sizeof (short), H8500_MSIZE);
1132
1133 /* initialize the seg registers */
1134
1135 cpu.regs[R_DP].c = cpu.memory;
1136 cpu.regs[R_TP].c = cpu.memory;
1137 cpu.regs[R_CP].c = cpu.memory;
1138 cpu.regs[R_BP].c = cpu.memory;
1139 cpu.regs[R_EP].c = cpu.memory;
1140 cpu.regs[R7].s[LOW] = 0xfffe;
1141 cpu.regs[R6].s[LOW] = 0xfffe;
1142 if (!cpu.cache)
1143 sim_set_simcache_size (CSIZE);
1144 }
1145 }
1146
1147 #define PUSHWORD(x) \
1148 { \
1149 int sp = cpu.regs[R7].s[LOW]; \
1150 unsigned char *p; \
1151 \
1152 sp -= 2; \
1153 p = (sp & 0xffff) + (cpu.regs[R_TP].c); \
1154 cpu.regs[R7].s[LOW] = sp; \
1155 setwordat (p, x); \
1156 } \
1157
1158 #define POPWORD(d) \
1159 { \
1160 int spx= cpu.regs[R7].s[LOW]; \
1161 unsigned char *p; \
1162 \
1163 p = (spx& 0xffff) + (cpu.regs[R_TP].c); \
1164 spx+= 2; \
1165 cpu.regs[R7].s[LOW] = spx; \
1166 d = wordat (p); \
1167 } \
1168
1169 /* simulate a monitor trap */
1170 trap ()
1171 {
1172 switch (cpu.regs[R3].s[LOW] & 0xff)
1173 {
1174 case 33:
1175 /* exit */
1176 cpu.exception = SIGQUIT;
1177 break;
1178 case 34:
1179 /* abort */
1180 cpu.exception = SIGABRT;
1181 break;
1182 case 6:
1183 /* print char in r0 */
1184 printf ("%c", cpu.regs[R0].s[LOW]);
1185 break;
1186 }
1187 }
1188 void
1189 control_c (sig, code, scp, addr)
1190 int sig;
1191 int code;
1192 char *scp;
1193 char *addr;
1194 {
1195 cpu.exception = SIGINT;
1196 }
1197
1198 static jmp_buf jbuf;
1199 static void
1200 segv ()
1201 {
1202 cpu.exception = SIGSEGV;
1203 longjmp (jbuf, 1);
1204 }
1205
1206 int
1207 sim_stop (sd)
1208 SIM_DESC sd;
1209 {
1210 cpu.exception = SIGINT;
1211 return 1;
1212 }
1213
1214 void
1215 sim_resume (sd, step, siggnal)
1216 SIM_DESC sd;
1217 {
1218 static int init1;
1219 int res;
1220 int tmp;
1221 int arga;
1222 int argb;
1223 int bit;
1224 int pc;
1225 int C, Z, V, N;
1226 int cycles = 0;
1227 int insts = 0;
1228 int tick_start = get_now ();
1229 void (*prev) ();
1230 void (*prev_seg) ();
1231
1232 if (!init1)
1233 {
1234 int i;
1235
1236 init1 = 1;
1237 init_pointers ();
1238
1239 for (i = 0; i < N_EATYPES; i++)
1240 {
1241 eas.a[i].s.srcabyte = LABEL_REFN (FETCH_NOP, 0);
1242 eas.a[i].s.srcaword = LABEL_REFN (FETCH_NOP, 0);
1243 eas.a[i].s.srcalong = LABEL_REFN (FETCH_NOP, 0);
1244
1245 eas.a[i].s.srcbbyte = LABEL_REFN (FETCH_NOP, 1);
1246 eas.a[i].s.srcbword = LABEL_REFN (FETCH_NOP, 1);
1247 eas.a[i].s.srcblong = LABEL_REFN (FETCH_NOP, 1);
1248
1249 eas.a[i].s.dstbyte = LABEL_REF (STORE_NOP);
1250 eas.a[i].s.dstword = LABEL_REF (STORE_NOP);
1251 eas.a[i].s.dstlong = LABEL_REF (STORE_NOP);
1252 }
1253
1254 eas.s.ea_lval.s.srcabyte = LABEL_REFN (FETCH_LVAL, 0);
1255 eas.s.ea_lval.s.srcaword = LABEL_REFN (FETCH_LVAL, 0);
1256 eas.s.ea_lval24.s.srcabyte = LABEL_REFN (FETCH_LVAL24, 0);
1257 eas.s.ea_lval24.s.srcaword = LABEL_REFN (FETCH_LVAL24, 0);
1258
1259 eas.s.ea_nop.s.srcabyte = LABEL_REFN (FETCH_NOP, 0);
1260 eas.s.ea_nop.s.srcaword = LABEL_REFN (FETCH_NOP, 0);
1261 eas.s.ea_nop.s.srcbbyte = LABEL_REFN (FETCH_NOP, 1);
1262 eas.s.ea_nop.s.srcbword = LABEL_REFN (FETCH_NOP, 1);
1263 eas.s.ea_nop.s.dstbyte = LABEL_REF (STORE_NOP);
1264 eas.s.ea_nop.s.dstword = LABEL_REF (STORE_NOP);
1265
1266 eas.s.ea_cr.s.srcabyte = LABEL_REFN (FETCH_CRB, 0);
1267 eas.s.ea_cr.s.srcaword = LABEL_REFN (FETCH_CRW, 0);
1268
1269 eas.s.ea_cr.s.srcbbyte = LABEL_REFN (FETCH_CRB, 1);
1270 eas.s.ea_cr.s.srcbword = LABEL_REFN (FETCH_CRW, 1);
1271
1272 eas.s.ea_cr.s.dstbyte = LABEL_REF (STORE_CRB);
1273 eas.s.ea_cr.s.dstword = LABEL_REF (STORE_CRW);
1274
1275 eas.s.ea_reg.s.srcabyte = LABEL_REFN (FETCH_REG_B, 0);
1276 eas.s.ea_reg.s.srcaword = LABEL_REFN (FETCH_REG_W, 0);
1277 eas.s.ea_reg.s.srcalong = LABEL_REFN (FETCH_REG_L, 0);
1278
1279 eas.s.ea_reg.s.srcbbyte = LABEL_REFN (FETCH_REG_B, 1);
1280 eas.s.ea_reg.s.srcbword = LABEL_REFN (FETCH_REG_W, 1);
1281 eas.s.ea_reg.s.srcblong = LABEL_REFN (FETCH_REG_L, 1);
1282
1283 eas.s.ea_reg.s.dstbyte = LABEL_REF (STORE_REG_B);
1284 eas.s.ea_reg.s.dstword = LABEL_REF (STORE_REG_W);
1285 eas.s.ea_reg.s.dstlong = LABEL_REF (STORE_REG_L);
1286
1287 eas.s.ea_inc.s.srcabyte = LABEL_REFN (FETCH_INC_B, 0);
1288 eas.s.ea_inc.s.srcaword = LABEL_REFN (FETCH_INC_W, 0);
1289 eas.s.ea_inc.s.srcbbyte = LABEL_REFN (FETCH_INC_B, 1);
1290 eas.s.ea_inc.s.srcbword = LABEL_REFN (FETCH_INC_W, 1);
1291 eas.s.ea_inc.s.dstbyte = LABEL_REF (STORE_INC_B);
1292 eas.s.ea_inc.s.dstword = LABEL_REF (STORE_INC_W);
1293
1294 eas.s.ea_dec.s.srcabyte = LABEL_REFN (FETCH_DEC_B, 0);
1295 eas.s.ea_dec.s.srcaword = LABEL_REFN (FETCH_DEC_W, 0);
1296 eas.s.ea_dec.s.srcbbyte = LABEL_REFN (FETCH_DEC_B, 1);
1297 eas.s.ea_dec.s.srcbword = LABEL_REFN (FETCH_DEC_W, 1);
1298 eas.s.ea_dec.s.dstbyte = LABEL_REF (STORE_DEC_B);
1299 eas.s.ea_dec.s.dstword = LABEL_REF (STORE_DEC_W);
1300
1301 eas.s.ea_disp.s.srcabyte = LABEL_REFN (FETCH_DISP_B, 0);
1302 eas.s.ea_disp.s.srcaword = LABEL_REFN (FETCH_DISP_W, 0);
1303 eas.s.ea_disp.s.srcbbyte = LABEL_REFN (FETCH_DISP_B, 1);
1304 eas.s.ea_disp.s.srcbword = LABEL_REFN (FETCH_DISP_W, 1);
1305 eas.s.ea_disp.s.dstbyte = LABEL_REF (STORE_DISP_B);
1306 eas.s.ea_disp.s.dstword = LABEL_REF (STORE_DISP_W);
1307
1308 eas.s.ea_imm.s.srcabyte = LABEL_REFN (FETCH_IMM, 0);
1309 eas.s.ea_imm.s.srcaword = LABEL_REFN (FETCH_IMM, 0);
1310 eas.s.ea_imm.s.srcbbyte = LABEL_REFN (FETCH_IMM, 1);
1311 eas.s.ea_imm.s.srcbword = LABEL_REFN (FETCH_IMM, 1);
1312
1313 flag_special = LABEL_REF (FLAG_special);
1314 flag_mp = LABEL_REF (FLAG_m);
1315 flag_Mp = LABEL_REF (FLAG_M);
1316 flag_ap = LABEL_REF (FLAG_a);
1317 flag_Ap = LABEL_REF (FLAG_A);
1318 flag_nonep = LABEL_REF (FLAG_NONE);
1319 flag_nostorep = LABEL_REF (FLAG_NOSTORE);
1320 flag_clearp = LABEL_REF (FLAG_CLEAR);
1321 flag_shiftbyte = LABEL_REF (FLAG_shiftbyte);
1322 flag_shiftword = LABEL_REF (FLAG_shiftword);
1323 flag_multbyte = LABEL_REF (FLAG_multbyte);
1324 flag_multword = LABEL_REF (FLAG_multword);
1325
1326
1327 exec_dispatch[O_ADDS] = LABEL_REF (O_ADDS);
1328 exec_dispatch[O_ADDX] = LABEL_REF (O_ADDX);
1329 exec_dispatch[O_ADD] = LABEL_REF (O_ADD);
1330 exec_dispatch[O_ANDC] = LABEL_REF (O_ANDC);
1331 exec_dispatch[O_AND] = LABEL_REF (O_AND);
1332 exec_dispatch[O_BCC] = LABEL_REF (O_BCC);
1333 exec_dispatch[O_BCLR] = LABEL_REF (O_BCLR);
1334 exec_dispatch[O_BCS] = LABEL_REF (O_BCS);
1335 exec_dispatch[O_BEQ] = LABEL_REF (O_BEQ);
1336 exec_dispatch[O_BF] = LABEL_REF (O_BF);
1337 exec_dispatch[O_BGE] = LABEL_REF (O_BGE);
1338 exec_dispatch[O_BGT] = LABEL_REF (O_BGT);
1339 exec_dispatch[O_BHI] = LABEL_REF (O_BHI);
1340 exec_dispatch[O_BHS] = LABEL_REF (O_BHS);
1341 exec_dispatch[O_BLE] = LABEL_REF (O_BLE);
1342 exec_dispatch[O_BLO] = LABEL_REF (O_BLO);
1343 exec_dispatch[O_BLS] = LABEL_REF (O_BLS);
1344 exec_dispatch[O_BLT] = LABEL_REF (O_BLT);
1345 exec_dispatch[O_BMI] = LABEL_REF (O_BMI);
1346 exec_dispatch[O_BNE] = LABEL_REF (O_BNE);
1347 exec_dispatch[O_BNOT] = LABEL_REF (O_BNOT);
1348 exec_dispatch[O_BPL] = LABEL_REF (O_BPL);
1349 exec_dispatch[O_BPT] = LABEL_REF (O_BPT);
1350 exec_dispatch[O_BRA] = LABEL_REF (O_BRA);
1351 exec_dispatch[O_BRN] = LABEL_REF (O_BRN);
1352 exec_dispatch[O_BSET] = LABEL_REF (O_BSET);
1353 exec_dispatch[O_BSR] = LABEL_REF (O_BSR);
1354 exec_dispatch[O_BTST] = LABEL_REF (O_BTST);
1355 exec_dispatch[O_BT] = LABEL_REF (O_BT);
1356 exec_dispatch[O_BVC] = LABEL_REF (O_BVC);
1357 exec_dispatch[O_BVS] = LABEL_REF (O_BVS);
1358 exec_dispatch[O_CLR] = LABEL_REF (O_CLR);
1359 exec_dispatch[O_CMP] = LABEL_REF (O_CMP);
1360 exec_dispatch[O_DADD] = LABEL_REF (O_DADD);
1361 exec_dispatch[O_DIVXU] = LABEL_REF (O_DIVXU);
1362 exec_dispatch[O_DSUB] = LABEL_REF (O_DSUB);
1363 exec_dispatch[O_EXTS] = LABEL_REF (O_EXTS);
1364 exec_dispatch[O_EXTU] = LABEL_REF (O_EXTU);
1365 exec_dispatch[O_JMP] = LABEL_REF (O_JMP);
1366 exec_dispatch[O_JSR] = LABEL_REF (O_JSR);
1367 exec_dispatch[O_LDC] = LABEL_REF (O_LDC);
1368 exec_dispatch[O_LDM] = LABEL_REF (O_LDM);
1369 exec_dispatch[O_LINK] = LABEL_REF (O_LINK);
1370 exec_dispatch[O_MOVFPE] = LABEL_REF (O_MOVFPE);
1371 exec_dispatch[O_MOVTPE] = LABEL_REF (O_MOVTPE);
1372 exec_dispatch[O_MOV] = LABEL_REF (O_MOV);
1373 exec_dispatch[O_MULXU] = LABEL_REF (O_MULXU);
1374 exec_dispatch[O_NEG] = LABEL_REF (O_NEG);
1375 exec_dispatch[O_NOP] = LABEL_REF (O_NOP);
1376 exec_dispatch[O_NOT] = LABEL_REF (O_NOT);
1377 exec_dispatch[O_ORC] = LABEL_REF (O_ORC);
1378 exec_dispatch[O_OR] = LABEL_REF (O_OR);
1379 exec_dispatch[O_PJMP] = LABEL_REF (O_PJMP);
1380 exec_dispatch[O_PJSR] = LABEL_REF (O_PJSR);
1381 exec_dispatch[O_PRTD] = LABEL_REF (O_PRTD);
1382 exec_dispatch[O_PRTS] = LABEL_REF (O_PRTS);
1383 exec_dispatch[O_RECOMPILE] = LABEL_REF (O_RECOMPILE);
1384
1385 exec_dispatch[O_ROTL] = LABEL_REF (O_ROTL);
1386 exec_dispatch[O_ROTR] = LABEL_REF (O_ROTR);
1387 exec_dispatch[O_ROTXL] = LABEL_REF (O_ROTXL);
1388 exec_dispatch[O_ROTXR] = LABEL_REF (O_ROTXR);
1389
1390 exec_dispatch[O_RTD] = LABEL_REF (O_RTD);
1391 exec_dispatch[O_RTS] = LABEL_REF (O_RTS);
1392 exec_dispatch[O_SCB_EQ] = LABEL_REF (O_SCB_EQ);
1393 exec_dispatch[O_SCB_F] = LABEL_REF (O_SCB_F);
1394 exec_dispatch[O_SCB_NE] = LABEL_REF (O_SCB_NE);
1395 exec_dispatch[O_SHAL] = LABEL_REF (O_SHAL);
1396 exec_dispatch[O_SHAR] = LABEL_REF (O_SHAR);
1397 exec_dispatch[O_SHLL] = LABEL_REF (O_SHLL);
1398 exec_dispatch[O_SHLR] = LABEL_REF (O_SHLR);
1399
1400 exec_dispatch[O_SLEEP] = LABEL_REF (O_SLEEP);
1401 exec_dispatch[O_STC] = LABEL_REF (O_STC);
1402 exec_dispatch[O_STM] = LABEL_REF (O_STM);
1403 exec_dispatch[O_SUBS] = LABEL_REF (O_SUBS);
1404 exec_dispatch[O_SUBX] = LABEL_REF (O_SUBX);
1405 exec_dispatch[O_SUB] = LABEL_REF (O_SUB);
1406 exec_dispatch[O_SWAP] = LABEL_REF (O_SWAP);
1407 exec_dispatch[O_TAS] = LABEL_REF (O_TAS);
1408 exec_dispatch[O_TRAPA] = LABEL_REF (O_TRAPA);
1409 exec_dispatch[O_TRAP_VS] = LABEL_REF (O_TRAP_VS);
1410 exec_dispatch[O_TST] = LABEL_REF (O_TST);
1411 exec_dispatch[O_UNLK] = LABEL_REF (O_UNLK);
1412 exec_dispatch[O_XCH] = LABEL_REF (O_XCH);
1413 exec_dispatch[O_XORC] = LABEL_REF (O_XORC);
1414 exec_dispatch[O_XOR] = LABEL_REF (O_XOR);
1415 nop.type = eas.s.ea_nop.s.srcabyte;
1416 cpu.cache[0].opcode = exec_dispatch[O_RECOMPILE];
1417 cpu.cache[0].srca.type = eas.s.ea_nop.s.srcabyte;
1418 cpu.cache[0].srcb.type = eas.s.ea_nop.s.srcbbyte;
1419 }
1420
1421 prev = signal (SIGINT, control_c);
1422 prev_seg = signal (SIGSEGV, segv);
1423
1424 if (step)
1425 {
1426 cpu.exception = SIGTRAP;
1427 }
1428 else
1429 {
1430 cpu.exception = 0;
1431 }
1432
1433 pc = cpu.regs[R_PC].s[LOW] + (NORMAL_CP << 16);
1434
1435 GETSR ();
1436
1437 if (setjmp (jbuf) == 0) {
1438 do
1439 {
1440 int cidx;
1441 decoded_inst *code;
1442
1443 top:
1444 cidx = cpu.cache_idx[pc];
1445 code = cpu.cache + cidx;
1446
1447 FETCH (arga, code->srca, 0);
1448 FETCH (argb, code->srcb, 1);
1449
1450
1451
1452 #ifdef DEBUG
1453 if (debug)
1454 {
1455 printf ("%x %d %s\n", pc, code->opcode,
1456 code->op ? code->op->name : "**");
1457 }
1458 #endif
1459
1460 cycles += code->cycles;
1461 insts++;
1462 DISPATCH (code->opcode)
1463 {
1464 LABEL (O_RECOMPILE):
1465 /* This opcode is a fake for when we get to an instruction which
1466 hasn't been compiled */
1467 compile (pc);
1468 goto top;
1469 break;
1470 LABEL (O_NEG):
1471 arga = -arga;
1472 argb = 0;
1473 res = arga + argb;
1474 break;
1475 LABEL (O_SUBX):
1476 arga += C;
1477 LABEL (O_SUB):
1478 LABEL (O_SUBS):
1479 arga = -arga;
1480 LABEL (O_ADD):
1481 LABEL (O_ADDS):
1482 res = arga + argb;
1483 break;
1484
1485 LABEL (O_ADDX):
1486 res = arga + argb + C;
1487 break;
1488
1489 LABEL (O_AND):
1490 LABEL (O_ANDC):
1491 res = arga & argb;
1492 break;
1493 break;
1494
1495 LABEL (O_BCLR):
1496 arga &= 0xf;
1497 bit = (argb & (1 << arga));
1498 res = argb & ~(1 << arga);
1499 goto bitop;
1500
1501
1502 LABEL (O_BRA):
1503 LABEL (O_BT):
1504 if (1)
1505 goto condtrue;
1506
1507 LABEL (O_BRN):
1508 LABEL (O_BF):
1509 if (0)
1510 goto condtrue;
1511 break;
1512
1513 LABEL (O_BHI):
1514 if ((C || Z) == 0)
1515 goto condtrue;
1516 break;
1517
1518 LABEL (O_BLS):
1519 if ((C || Z))
1520 goto condtrue;
1521 break;
1522
1523 LABEL (O_BCS):
1524 LABEL (O_BLO):
1525 if ((C == 1))
1526 goto condtrue;
1527 break;
1528
1529 LABEL (O_BCC):
1530 LABEL (O_BHS):
1531 if ((C == 0))
1532 goto condtrue;
1533 break;
1534
1535 LABEL (O_BEQ):
1536 if (Z)
1537 goto condtrue;
1538 break;
1539 LABEL (O_BGT):
1540 if (((Z || (N ^ V)) == 0))
1541 goto condtrue;
1542 break;
1543
1544
1545 LABEL (O_BLE):
1546 if (((Z || (N ^ V)) == 1))
1547 goto condtrue;
1548 break;
1549
1550 LABEL (O_BGE):
1551 if ((N ^ V) == 0)
1552 goto condtrue;
1553 break;
1554 LABEL (O_BLT):
1555 if ((N ^ V))
1556 goto condtrue;
1557 break;
1558 LABEL (O_BMI):
1559 if ((N))
1560 goto condtrue;
1561 break;
1562 LABEL (O_BNE):
1563 if ((Z == 0))
1564 goto condtrue;
1565 break;
1566 LABEL (O_BPL):
1567 if (N == 0)
1568 goto condtrue;
1569 break;
1570 break;
1571 LABEL (O_BVC):
1572 if ((V == 0))
1573 goto condtrue;
1574 break;
1575 LABEL (O_BVS):
1576 if ((V == 1))
1577 goto condtrue;
1578 break;
1579
1580 LABEL (O_BNOT):
1581 bit = argb & (1<<(arga & 0xf));
1582 res = argb ^ (1<<(arga & 0xf));
1583 goto bitop;
1584 break;
1585
1586 LABEL (O_BSET):
1587 arga = 1 << (arga & 0xf);
1588 bit = argb & arga;
1589 res = argb | arga;
1590 goto bitop;
1591 break;
1592
1593 LABEL (O_PJMP):
1594 pc = arga;
1595 goto next;
1596
1597 LABEL (O_UNLK):
1598 {
1599 int t;
1600 SET_NORMREG (R7, GET_NORMREG (R6));
1601 POPWORD (t);
1602 SET_NORMREG (R6, t);
1603 pc = code->next_pc;
1604 goto next;
1605 }
1606
1607 LABEL (O_RTS):
1608 {
1609 int cp = pc & 0xff0000;
1610 POPWORD (pc);
1611 pc |= cp;
1612 goto next;
1613 }
1614 break;
1615
1616 LABEL (O_PRTS):
1617 {
1618 int cp;
1619 int off;
1620 POPWORD (cp);
1621 POPWORD (off);
1622 cp <<= 16;
1623 SET_SEGREG (R_CP, cp);
1624 pc = cp + off;
1625 }
1626 goto next;
1627
1628 LABEL (O_PJSR):
1629 PUSHWORD (argb & 0xffff);
1630 PUSHWORD (argb >> 16);
1631 pc = (arga & 0xffffff);
1632 goto next;
1633
1634 LABEL (O_BSR):
1635 LABEL (O_JSR):
1636 PUSHWORD (code->next_pc);
1637 pc = arga | (pc & 0xff0000);
1638 goto next;
1639
1640 LABEL (O_BTST):
1641 Z = (((argb >> (arga & 0xf)) & 1) == 0);
1642 pc = code->next_pc;
1643 goto next;
1644
1645 LABEL (O_CLR):
1646 res = 0;
1647 break;
1648
1649 LABEL (O_CMP):
1650 arga = -arga;
1651 res = arga + argb;
1652 break;
1653
1654 LABEL (O_DADD):
1655 res = arga + argb + C;
1656 if (res > 99)
1657 {
1658 res -= 100;
1659 C = 1;
1660 }
1661 else
1662 {
1663 C = 0;
1664 }
1665 Z = Z && (res == 0);
1666 break;
1667
1668
1669 LABEL (O_DSUB):
1670 res = argb - arga - C;
1671 if (res < 0)
1672 {
1673 res += 100;
1674 C = 1;
1675 }
1676 else
1677 {
1678 C = 0;
1679 }
1680 Z = Z && (res == 0);
1681 break;
1682
1683 LABEL (O_EXTS):
1684 res = SEXTCHAR (arga);
1685 break;
1686
1687 LABEL (O_EXTU):
1688 res = (unsigned char) arga;
1689 break;
1690
1691 LABEL (O_JMP):
1692 pc = arga | (pc & 0xff0000);
1693 goto next;
1694 break;
1695
1696 LABEL (O_LDM):
1697
1698 for (tmp = 0; tmp < 7; tmp++)
1699 {
1700 if (argb & (1 << tmp))
1701 {
1702 POPWORD (cpu.regs[tmp].s[LOW]);
1703 }
1704 }
1705 if (argb & 0x80)
1706 POPWORD (tmp); /* dummy ready for sp */
1707 goto nextpc;
1708 break;
1709
1710 LABEL (O_LINK):
1711 PUSHWORD (cpu.regs[R6].s[LOW]);
1712 cpu.regs[R6].s[LOW] = cpu.regs[R7].s[LOW];
1713 cpu.regs[R7].s[LOW] += argb;
1714 goto nextpc;
1715
1716 LABEL (O_STC):
1717 LABEL (O_LDC):
1718 LABEL (O_MOVFPE):
1719 LABEL (O_MOVTPE):
1720 LABEL (O_MOV):
1721 LABEL (O_TST):
1722 res = arga;
1723 break;
1724
1725 LABEL (O_TRAPA):
1726 if (arga == 15)
1727 {
1728 trap ();
1729 }
1730 else
1731 {
1732 PUSHWORD (pc & 0xffff);
1733 if (cpu.maximum)
1734 {
1735 PUSHWORD (NORMAL_CP);
1736 }
1737 PUSHWORD (NORMAL_SR);
1738 if (cpu.maximum)
1739 {
1740 arga = arga * 4 + 0x40;
1741 SET_NORMAL_CPPC (longat (cpu.memory + arga));
1742 }
1743 else
1744 {
1745 arga = arga * 2 + 0x20;
1746 SET_NORMAL_CPPC (wordat (cpu.memory + arga));
1747 }
1748 }
1749 break;
1750
1751 LABEL (O_OR):
1752 LABEL (O_ORC):
1753 res = arga | argb;
1754 break;
1755
1756 LABEL (O_XOR):
1757 LABEL (O_XORC):
1758 res = arga ^ argb;
1759 break;
1760
1761 LABEL (O_SCB_F):
1762 {
1763 scb_f:
1764 res = arga - 1;
1765 code->srca.reg.wptr[0] = res;
1766 if (res != -1)
1767 {
1768 pc = argb;
1769 goto next;
1770 }
1771 }
1772 break;
1773
1774 LABEL (O_SCB_EQ):
1775 if (Z == 1)
1776 break;
1777 else
1778 goto scb_f;
1779
1780 LABEL (O_SCB_NE):
1781 if (Z == 0)
1782 break;
1783 else
1784 goto scb_f;
1785
1786 LABEL (O_NOP):
1787 /* If only they were all as simple as this */
1788 break;
1789
1790 LABEL (O_ROTL):
1791 res = arga << 1;
1792 C = (res >> argb) & 1;
1793 res |= C;
1794 break;
1795
1796
1797 LABEL (O_ROTR):
1798 C = arga & 1;
1799 res = arga >> 1;
1800 res |= (C << (argb - 1));
1801 break;
1802
1803 LABEL (O_ROTXL):
1804 res = arga << 1;
1805 res |= C;
1806 C = (res >> argb) & 1;
1807 break;
1808
1809 LABEL (O_ROTXR):
1810 res = arga >> 1;
1811 res |= (C << (argb - 1));
1812 C = arga & 1;
1813 break;
1814
1815 LABEL (O_SHAL):
1816 res = arga << 1;
1817 if (argb == 16)
1818 {
1819 C = (res >> (16)) & 1;
1820 Z = ((res & 0xffff) == 0);
1821 N = ((res & 0x8000) != 0);
1822 }
1823
1824 else
1825 {
1826 C = (res >> (8)) & 1;
1827 Z = ((res & 0xff) == 0);
1828 N = ((res & 0x80) != 0);
1829
1830 }
1831 V = C ^ N;
1832 goto none;
1833
1834 LABEL (O_SHAR):
1835 C = arga & 1;
1836 if (argb == 16)
1837 {
1838 res = ((short) arga) >> 1;
1839 }
1840 else
1841 {
1842 res = (SEXTCHAR (arga)) >> 1;
1843 }
1844 break;
1845
1846 LABEL (O_SHLL):
1847 res = arga << 1;
1848 C = (res >> argb) & 1;
1849 break;
1850
1851 LABEL (O_SHLR):
1852 C = arga & 1;
1853 res = arga >> 1;
1854 break;
1855
1856 LABEL (O_DIVXU):
1857 if (arga == 0)
1858 {
1859 N = V = C = 0;
1860 Z = 1;
1861 cpu.exception = SIGILL;
1862 }
1863 else
1864 {
1865 int d = argb / arga;
1866 int m = argb % arga;
1867 if (code->dst.type == eas.s.ea_reg.s.dstlong)
1868 {
1869 res = (m << 16) | (d & 0xffff);
1870 }
1871 else
1872 {
1873 res = (m << 8) | (d & 0xff);
1874 }
1875
1876 }
1877 break;
1878
1879 LABEL (O_MULXU):
1880 res = arga * argb;
1881 break;
1882
1883 LABEL (O_NOT):
1884 res = ~arga;
1885 break;
1886
1887 LABEL (O_SWAP):
1888 res = ((arga >> 8) & 0xff) | ((arga << 8) & 0xff00);
1889 break;
1890
1891
1892 LABEL (O_STM):
1893 for (tmp = 7; tmp >= 0; tmp--)
1894 {
1895 if (arga & (1 << tmp))
1896 {
1897 PUSHWORD (cpu.regs[tmp].s[LOW]);
1898 }
1899 }
1900 goto nextpc;
1901
1902 LABEL (O_TAS):
1903 C = 0;
1904 V = 0;
1905 Z = arga == 0;
1906 N = arga < 0;
1907 res = arga | 0x80;
1908 goto none;
1909
1910 LABEL (O_PRTD):
1911 LABEL (O_XCH):
1912 LABEL (O_RTD):
1913 cpu.exception = SIGILL;
1914 goto next;
1915
1916 LABEL (O_TRAP_VS):
1917 LABEL (O_SLEEP):
1918 LABEL (O_BPT):
1919 cpu.exception = SIGTRAP;
1920 goto next;
1921 break;
1922 }
1923
1924 ENDDISPATCH;
1925
1926 DISPATCH (code->flags)
1927 {
1928 bitop:
1929 Z = (res & bit) == 0;
1930 pc = code->next_pc;
1931 break;
1932 LABEL (FLAG_multword):
1933 Z = (res & 0xffff) == 0;
1934 N = (res & 0x8000) != 0;
1935 V = 0;
1936 C = 0;
1937 pc = code->next_pc;
1938 break;
1939
1940 LABEL (FLAG_multbyte):
1941 /* 8*8 -> 16 */
1942 Z = (res & 0xff) == 0;
1943 N = (res & 0x80) != 0;
1944 V = 0;
1945 C = 0;
1946 pc = code->next_pc;
1947 break;
1948
1949 LABEL (FLAG_shiftword):
1950 N = (res & 0x8000) != 0;
1951 Z = (res & 0xffff) == 0;
1952 V = 0;
1953 pc = code->next_pc;
1954 break;
1955
1956 LABEL (FLAG_shiftbyte):
1957 N = (res & 0x80) != 0;
1958 Z = (res & 0xff) == 0;
1959 V = 0;
1960 pc = code->next_pc;
1961 break;
1962
1963 LABEL (FLAG_special):
1964 pc = code->next_pc;
1965 break;
1966
1967 LABEL (FLAG_m):
1968 /* Move byte flags */
1969 /* after a logical instruction */
1970 N = (res & 0x80) != 0;
1971 Z = (res & 0xff) == 0;
1972 V = (((~arga & ~argb & res) | (arga & argb & ~res)) & 0x80) != 0;
1973 pc = code->next_pc;
1974 break;
1975
1976 LABEL (FLAG_M):
1977 /* Move word flags */
1978 /* after a logical instruction */
1979 N = (res & 0x8000) != 0;
1980 Z = (res & 0xffff) == 0;
1981 V = (((~arga & ~argb & res) | (arga & argb & ~res)) & 0x8000) != 0;
1982 pc = code->next_pc;
1983 break;
1984
1985 LABEL (FLAG_a):
1986 /* after byte sized arith */
1987 C = (res & 0x100) != 0;
1988 N = (res & 0x80) != 0;
1989 Z = (res & 0xff) == 0;
1990 V = (((~arga & ~argb & res) | (arga & argb & ~res)) & 0x80) != 0;
1991 pc = code->next_pc;
1992 break;
1993
1994 LABEL (FLAG_A):
1995 /* after word sized arith */
1996 C = (res & 0x10000) != 0;
1997 N = (res & 0x8000) != 0;
1998 Z = (res & 0xffff) == 0;
1999 V = (((~arga & ~argb & res) | (arga & argb & ~res)) & 0x8000) != 0;
2000 pc = code->next_pc;
2001 break;
2002
2003 LABEL (FLAG_NONE):
2004 none:;
2005 /* no flags but store */
2006 pc = code->next_pc;
2007 break;
2008 LABEL (FLAG_NOSTORE):
2009 /* no flags and no store */
2010 pc = code->next_pc;
2011 break;
2012 LABEL (FLAG_CLEAR):
2013 /* clear flags */
2014 N = 0;
2015 Z = 1;
2016 V = 0;
2017 C = 0;
2018 pc = code->next_pc;
2019 break;
2020 condtrue:
2021 pc = arga;
2022 goto next;
2023 }
2024 ENDDISPATCH;
2025
2026 DISPATCH (code->dst.type)
2027 {
2028 unsigned char *lval;
2029
2030 LABEL (STORE_CRB):
2031 (*(code->dst.reg.segptr)) = cpu.memory + (res << 16);
2032 break;
2033
2034 LABEL (STORE_NOP):
2035 break;
2036
2037 LABEL (STORE_REG_B):
2038 (*(code->dst.reg.bptr)) = res;
2039 break;
2040
2041 LABEL (STORE_REG_W):
2042 (*(code->dst.reg.wptr)) = res;
2043 break;
2044
2045 LABEL (STORE_REG_L):
2046 {
2047 int l, r;
2048
2049 r = (union rtype *) (code->dst.reg.wptr) - &cpu.regs[0];
2050 r++;
2051 *(code->dst.reg.wptr) = res >> 16;
2052 cpu.regs[r].s[LOW] = res & 0xffff;
2053
2054 }
2055
2056 break;
2057
2058 LABEL (STORE_DISP_W):
2059 lval = displval (code->dst);
2060 setwordat (lval, res);
2061 break;
2062
2063 LABEL (STORE_DISP_B):
2064 lval = displval (code->dst);
2065 setbyteat (lval, res);
2066 break;
2067
2068 LABEL (STORE_INC_B):
2069 lval = elval (code->dst, 0);
2070 setbyteat (lval, res);
2071 (*(code->dst.reg.wptr))++;
2072 break;
2073
2074 LABEL (STORE_INC_W):
2075 lval = elval (code->dst, 0);
2076 setwordat (lval, res);
2077 (*(code->dst.reg.wptr)) += 2;
2078 break;
2079
2080 LABEL (STORE_DEC_B):
2081 (*(code->dst.reg.wptr))--;
2082 lval = elval (code->dst, 0);
2083 setbyteat (lval, res);
2084 break;
2085
2086 LABEL (STORE_CRW):
2087 /* Make an up to date sr from the flag state */
2088 cpu.regs[R_SR].s[LOW] = res;
2089 GETSR ();
2090 break;
2091
2092 LABEL (STORE_DEC_W):
2093 (*(code->dst.reg.wptr)) -= 2;
2094 lval = elval (code->dst, 0);
2095 setwordat (lval, res);
2096
2097 break;
2098
2099 nextpc:
2100 pc = code->next_pc;
2101
2102 }
2103 ENDDISPATCH;
2104 next:;
2105 }
2106 while (!cpu.exception);
2107 }
2108
2109 cpu.ticks += get_now () - tick_start;
2110 cpu.cycles += cycles;
2111 cpu.insts += insts;
2112 cpu.regs[R_PC].s[LOW] = pc;
2113 BUILDSR ();
2114
2115 signal (SIGINT, prev);
2116 signal (SIGSEGV, prev_seg);
2117 }
2118
2119
2120
2121
2122 int
2123 sim_write (sd, addr, buffer, size)
2124 SIM_DESC sd;
2125 SIM_ADDR addr;
2126 unsigned char *buffer;
2127 int size;
2128 {
2129 int i;
2130
2131 init_pointers ();
2132 if (addr < 0 || addr + size > H8500_MSIZE)
2133 return 0;
2134 for (i = 0; i < size; i++)
2135 {
2136 cpu.memory[addr + i] = buffer[i];
2137 cpu.cache_idx[addr + i] = 0;
2138 }
2139 return size;
2140 }
2141
2142 int
2143 sim_read (sd, addr, buffer, size)
2144 SIM_DESC sd;
2145 SIM_ADDR addr;
2146 unsigned char *buffer;
2147 int size;
2148 {
2149 init_pointers ();
2150 if (addr < 0 || addr + size > H8500_MSIZE)
2151 return 0;
2152 memcpy (buffer, cpu.memory + addr, size);
2153 return size;
2154 }
2155
2156 /* Ripped off from tm-h8500.h */
2157
2158 #define R0_REGNUM 0
2159 #define R1_REGNUM 1
2160 #define R2_REGNUM 2
2161 #define R3_REGNUM 3
2162 #define R4_REGNUM 4
2163 #define R5_REGNUM 5
2164 #define R6_REGNUM 6
2165 #define R7_REGNUM 7
2166
2167 /* As above, but with correct seg register glued on */
2168 #define PR0_REGNUM 8
2169 #define PR1_REGNUM 9
2170 #define PR2_REGNUM 10
2171 #define PR3_REGNUM 11
2172 #define PR4_REGNUM 12
2173 #define PR5_REGNUM 13
2174 #define PR6_REGNUM 14
2175 #define PR7_REGNUM 15
2176
2177 #define SP_REGNUM PR7_REGNUM /* Contains address of top of stack */
2178 #define FP_REGNUM PR6_REGNUM /* Contains address of executing stack frame */
2179
2180
2181 #define SEG_C_REGNUM 16 /* Segment registers */
2182 #define SEG_D_REGNUM 17
2183 #define SEG_E_REGNUM 18
2184 #define SEG_T_REGNUM 19
2185
2186 #define CCR_REGNUM 20 /* Contains processor status */
2187 #define PC_REGNUM 21 /* Contains program counter */
2188
2189 #define CYCLE_REGNUM 22
2190 #define INST_REGNUM 23
2191 #define TICK_REGNUM 24
2192
2193 int
2194 sim_store_register (sd, rn, value, length)
2195 SIM_DESC sd;
2196 int rn;
2197 unsigned char *value;
2198 int length;
2199 {
2200 int seg = 0;
2201 int reg = -1;
2202
2203 init_pointers ();
2204 switch (rn)
2205 {
2206 case PC_REGNUM:
2207 SET_SEGREG (R_CP, (value[1]<<16));
2208 cpu.regs[R_PC].s[LOW] = (value[2] << 8) | value[3];
2209 break;
2210 case SEG_C_REGNUM:
2211 case SEG_D_REGNUM:
2212 case SEG_E_REGNUM:
2213 case SEG_T_REGNUM:
2214 seg = rn - SEG_C_REGNUM + R_CP;
2215 reg = -1;
2216 break;
2217 default:
2218 abort ();
2219 case R0_REGNUM:
2220 case R1_REGNUM:
2221 case R2_REGNUM:
2222 case R3_REGNUM:
2223 case R4_REGNUM:
2224 case R5_REGNUM:
2225 case R6_REGNUM:
2226 case R7_REGNUM:
2227 seg = 0;
2228 reg = rn - R0_REGNUM;
2229 break;
2230 case CCR_REGNUM:
2231 seg = 0;
2232 reg = R_SR;
2233 break;
2234 case CYCLE_REGNUM:
2235 cpu.cycles = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
2236 return;
2237 case INST_REGNUM:
2238 cpu.insts = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
2239 return;
2240 case TICK_REGNUM:
2241 cpu.ticks = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
2242 return;
2243 case PR0_REGNUM:
2244 case PR1_REGNUM:
2245 case PR2_REGNUM:
2246 case PR3_REGNUM:
2247 case PR4_REGNUM:
2248 case PR5_REGNUM:
2249 case PR6_REGNUM:
2250 case PR7_REGNUM:
2251 SET_SEGREG (segforreg[rn], value[1]);
2252 reg = rn - PR0_REGNUM;
2253 cpu.regs[reg].s[LOW] = (value[2] << 8) | value[3];
2254 return;
2255 }
2256
2257 if (seg)
2258 SET_SEGREG (seg, value[0] << 16);
2259
2260 if (reg > 0)
2261 {
2262 cpu.regs[reg].s[LOW] = (value[0] << 8) | value[1];
2263 }
2264 return -1;
2265 }
2266
2267 int
2268 sim_fetch_register (sd, rn, buf, length)
2269 SIM_DESC sd;
2270 int rn;
2271 unsigned char *buf;
2272 int length;
2273 {
2274 init_pointers ();
2275
2276 switch (rn)
2277 {
2278 default:
2279 abort ();
2280 case SEG_C_REGNUM:
2281 case SEG_D_REGNUM:
2282 case SEG_E_REGNUM:
2283 case SEG_T_REGNUM:
2284 buf[0] = GET_SEGREG(rn - SEG_C_REGNUM + R_CP);
2285 break;
2286 case CCR_REGNUM:
2287 buf[0] = cpu.regs[R_SR].s[HIGH];
2288 buf[1] = cpu.regs[R_SR].s[LOW];
2289 break;
2290 case PC_REGNUM:
2291 buf[0] = 0;
2292 buf[1] = GET_SEGREG(R_CP);
2293 buf[2] = HIGH_BYTE (cpu.regs[R_PC].s[LOW]);
2294 buf[3] = LOW_BYTE (cpu.regs[R_PC].s[LOW]);
2295 break;
2296
2297 case PR0_REGNUM:
2298 case PR1_REGNUM:
2299 case PR2_REGNUM:
2300 case PR3_REGNUM:
2301 case PR4_REGNUM:
2302 case PR5_REGNUM:
2303 case PR6_REGNUM:
2304 case PR7_REGNUM:
2305 rn -= PR0_REGNUM;
2306 buf[0] = 0;
2307 buf[1] = GET_SEGREG(segforreg[rn]);
2308 buf[2] = HIGH_BYTE (cpu.regs[rn].s[LOW]);
2309 buf[3] = LOW_BYTE (cpu.regs[rn].s[LOW]);
2310 break;
2311 case R0_REGNUM:
2312 case R1_REGNUM:
2313 case R2_REGNUM:
2314 case R3_REGNUM:
2315 case R4_REGNUM:
2316 case R5_REGNUM:
2317 case R6_REGNUM:
2318 case R7_REGNUM:
2319 buf[0] = HIGH_BYTE (cpu.regs[rn].s[LOW]);
2320 buf[1] = LOW_BYTE (cpu.regs[rn].s[LOW]);
2321 break;
2322 case CYCLE_REGNUM:
2323 buf[0] = cpu.cycles >> 24;
2324 buf[1] = cpu.cycles >> 16;
2325 buf[2] = cpu.cycles >> 8;
2326 buf[3] = cpu.cycles >> 0;
2327 break;
2328
2329 case TICK_REGNUM:
2330 buf[0] = cpu.ticks >> 24;
2331 buf[1] = cpu.ticks >> 16;
2332 buf[2] = cpu.ticks >> 8;
2333 buf[3] = cpu.ticks >> 0;
2334 break;
2335
2336 case INST_REGNUM:
2337 buf[0] = cpu.insts >> 24;
2338 buf[1] = cpu.insts >> 16;
2339 buf[2] = cpu.insts >> 8;
2340 buf[3] = cpu.insts >> 0;
2341 break;
2342 }
2343 return -1;
2344 }
2345
2346 int
2347 sim_trace (sd)
2348 SIM_DESC sd;
2349 {
2350
2351 int i;
2352
2353 for (i = 0; i < 12; i += 2)
2354 {
2355 unsigned char *p = cpu.regs[R_TP].c + ((cpu.regs[R6].s[LOW] + i) & 0xffff);
2356 unsigned short *j = (unsigned short *) p;
2357
2358 printf ("%04x ", *j);
2359 }
2360 printf ("\n");
2361 printf ("%02x %02x %02x %02x:%04x %04x %04x %04x %04x %04x %04x %04x %04x\n",
2362 NORMAL_DP,
2363 NORMAL_EP,
2364 NORMAL_TP,
2365 NORMAL_CP,
2366 cpu.regs[R_PC].s[LOW],
2367 cpu.regs[0].s[LOW],
2368 cpu.regs[1].s[LOW],
2369 cpu.regs[2].s[LOW],
2370 cpu.regs[3].s[LOW],
2371 cpu.regs[4].s[LOW],
2372 cpu.regs[5].s[LOW],
2373 cpu.regs[6].s[LOW],
2374 cpu.regs[7].s[LOW]);
2375 sim_resume (sd, 1, 0);
2376 return 0;
2377 }
2378
2379 void
2380 sim_stop_reason (sd, reason, sigrc)
2381 SIM_DESC sd;
2382 enum sim_stop *reason;
2383 int *sigrc;
2384 {
2385 *reason = sim_stopped;
2386 *sigrc = cpu.exception;
2387 }
2388
2389 void
2390 sim_set_simcache_size (n)
2391 {
2392 if (cpu.cache)
2393 free (cpu.cache);
2394 if (n < 2)
2395 n = 2;
2396 cpu.cache = (decoded_inst *) malloc (sizeof (decoded_inst) * n);
2397 cpu.csize = n;
2398 }
2399
2400 void
2401 sim_size (n)
2402 int n;
2403 {
2404 /* Fixed size. */
2405 }
2406
2407 void
2408 sim_info (sd, verbose)
2409 SIM_DESC sd;
2410 int verbose;
2411 {
2412 double timetaken = (double) cpu.ticks / (double) now_persec ();
2413 double virttime = cpu.cycles / 10.0e6;
2414
2415 (*sim_callback->printf_filtered) (sim_callback,
2416 "\n\ninstructions executed %10d\n",
2417 cpu.insts);
2418 (*sim_callback->printf_filtered) (sim_callback,
2419 "cycles (v approximate) %10d\n",
2420 cpu.cycles);
2421 (*sim_callback->printf_filtered) (sim_callback,
2422 "real time taken %10.4f\n",
2423 timetaken);
2424 (*sim_callback->printf_filtered) (sim_callback,
2425 "virtual time taked %10.4f\n",
2426 virttime);
2427 if (timetaken)
2428 {
2429 (*sim_callback->printf_filtered) (sim_callback,
2430 "simulation ratio %10.4f\n",
2431 virttime / timetaken);
2432 }
2433
2434 (*sim_callback->printf_filtered) (sim_callback,
2435 "compiles %10d\n",
2436 cpu.compiles);
2437 (*sim_callback->printf_filtered) (sim_callback,
2438 "cache size %10d\n",
2439 cpu.csize);
2440 }
2441
2442 SIM_DESC
2443 sim_open (kind, cb, abfd, argv)
2444 SIM_OPEN_KIND kind;
2445 host_callback *cb;
2446 struct _bfd *abfd;
2447 char **argv;
2448 {
2449 sim_kind = kind;
2450 myname = argv[0];
2451 sim_callback = cb;
2452 /* fudge our descriptor */
2453 return (SIM_DESC) 1;
2454 }
2455
2456 void
2457 sim_close (sd, quitting)
2458 SIM_DESC sd;
2459 int quitting;
2460 {
2461 /* nothing to do */
2462 }
2463
2464 SIM_RC
2465 sim_load (sd, prog, abfd, from_tty)
2466 SIM_DESC sd;
2467 char *prog;
2468 bfd *abfd;
2469 int from_tty;
2470 {
2471 extern bfd *sim_load_file (); /* ??? Don't know where this should live. */
2472 bfd *prog_bfd;
2473
2474 prog_bfd = sim_load_file (sd, myname, sim_callback, prog, abfd,
2475 sim_kind == SIM_OPEN_DEBUG,
2476 0, sim_write);
2477 if (prog_bfd == NULL)
2478 return SIM_RC_FAIL;
2479 if (abfd == NULL)
2480 bfd_close (prog_bfd);
2481 return SIM_RC_OK;
2482 }
2483
2484 SIM_RC
2485 sim_create_inferior (sd, abfd, argv, env)
2486 SIM_DESC sd;
2487 struct _bfd *abfd;
2488 char **argv;
2489 char **env;
2490 {
2491 int pc;
2492 bfd_vma start_address;
2493 if (abfd != NULL)
2494 start_address = bfd_get_start_address (abfd);
2495 else
2496 start_address = 0;
2497
2498 /* ??? We assume this is a 4 byte quantity. */
2499 pc = start_address;
2500
2501 sim_store_register (sd, PC_REGNUM, (unsigned char *) &pc, 4);
2502 return SIM_RC_OK;
2503 }
2504
2505 void
2506 sim_do_command (sd, cmd)
2507 SIM_DESC sd;
2508 char *cmd;
2509 {
2510 (*sim_callback->printf_filtered) (sim_callback,
2511 "This simulator does not accept any commands.\n");
2512 }
2513
2514 void
2515 sim_set_callbacks (ptr)
2516 struct host_callback_struct *ptr;
2517 {
2518 sim_callback = ptr;
2519 }