* compile.c (sim_resume): Fix overflow checks for ALU insns.
[platform/upstream/binutils.git] / sim / h8300 / compile.c
1 /*
2  * Simulator for the Hitachi H8/300 architecture.
3  *
4  * Written by Steve Chamberlain of Cygnus Support. sac@cygnus.com
5  *
6  * This file is part of H8/300 sim
7  *
8  *
9  * THIS SOFTWARE IS NOT COPYRIGHTED
10  *
11  * Cygnus offers the following for use in the public domain.  Cygnus makes no
12  * warranty with regard to the software or its performance and the user
13  * accepts the software "AS IS" with all faults.
14  *
15  * CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO THIS
16  * SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
17  * AND FITNESS FOR A PARTICULAR PURPOSE.
18  */
19
20 #include "config.h"
21
22 #include <signal.h>
23 #ifdef HAVE_TIME_H
24 #include <time.h>
25 #endif
26 #ifdef HAVE_STDLIB_H
27 #include <stdlib.h>
28 #endif
29 #include <sys/param.h>
30 #include "wait.h"
31 #include "ansidecl.h"
32 #include "callback.h"
33 #include "remote-sim.h"
34 #include "bfd.h"
35
36 int debug;
37
38
39 #define X(op, size)  op*4+size
40
41 #define SP (h8300hmode ? SL:SW)
42 #define SB 0
43 #define SW 1
44 #define SL 2
45 #define OP_REG 1
46 #define OP_DEC 2
47 #define OP_DISP 3
48 #define OP_INC 4
49 #define OP_PCREL 5
50 #define OP_MEM 6
51 #define OP_CCR 7
52 #define OP_IMM 8
53 #define OP_ABS 10
54 #define h8_opcodes ops
55 #define DEFINE_TABLE
56 #include "opcode/h8300.h"
57
58 #include "inst.h"
59
60 #define LOW_BYTE(x) ((x) & 0xff)
61 #define HIGH_BYTE(x) (((x)>>8) & 0xff)
62 #define P(X,Y) ((X<<8) | Y)
63
64 #define BUILDSR()   cpu.ccr = (N << 3) | (Z << 2) | (V<<1) | C;
65
66 #define GETSR()             \
67   c = (cpu.ccr >> 0) & 1;\
68   v = (cpu.ccr >> 1) & 1;\
69   nz = !((cpu.ccr >> 2) & 1);\
70   n = (cpu.ccr >> 3) & 1;
71
72 #ifdef __CHAR_IS_SIGNED__
73 #define SEXTCHAR(x) ((char)(x))
74 #endif
75
76 #ifndef SEXTCHAR
77 #define SEXTCHAR(x) ((x & 0x80) ? (x | ~0xff):x)
78 #endif
79
80 #define UEXTCHAR(x) ((x) & 0xff)
81 #define UEXTSHORT(x) ((x) & 0xffff)
82 #define SEXTSHORT(x) ((short)(x))
83
84 static cpu_state_type cpu;
85
86 int h8300hmode = 0;
87
88 static int memory_size;
89
90
91 static int
92 get_now ()
93 {
94 #ifndef WIN32
95   return time (0);
96 #endif
97   return 0;
98 }
99
100 static int
101 now_persec ()
102 {
103   return 1;
104 }
105
106
107 static int
108 bitfrom (x)
109 {
110   switch (x & SIZE)
111     {
112     case L_8:
113       return SB;
114     case L_16:
115       return SW;
116     case L_32:
117       return SL;
118     case L_P:
119       return h8300hmode ? SL : SW;
120     }
121 }
122
123 static
124 unsigned int
125 lvalue (x, rn)
126 {
127   switch (x / 4)
128     {
129     case OP_DISP:
130       if (rn == 8)
131         {
132           return X (OP_IMM, SP);
133         }
134       return X (OP_REG, SP);
135
136     case OP_MEM:
137
138       return X (OP_MEM, SP);
139     default:
140       abort ();
141     }
142 }
143
144 static unsigned int
145 decode (addr, data, dst)
146      int addr;
147      unsigned char *data;
148      decoded_inst *dst;
149
150 {
151   int rs = 0;
152   int rd = 0;
153   int rdisp = 0;
154   int abs = 0;
155   int plen = 0;
156   int bit = 0;
157
158   struct h8_opcode *q = h8_opcodes;
159   int size = 0;
160   dst->dst.type = -1;
161   dst->src.type = -1;
162   /* Find the exact opcode/arg combo */
163   while (q->name)
164     {
165       op_type *nib;
166       unsigned int len = 0;
167
168       nib = q->data.nib;
169
170       while (1)
171         {
172           op_type looking_for = *nib;
173           int thisnib = data[len >> 1];
174
175           thisnib = (len & 1) ? (thisnib & 0xf) : ((thisnib >> 4) & 0xf);
176
177           if (looking_for < 16 && looking_for >= 0)
178             {
179               if (looking_for != thisnib)
180                 goto fail;
181             }
182           else
183             {
184               if ((int) looking_for & (int) B31)
185                 {
186                   if (!(((int) thisnib & 0x8) != 0))
187                     goto fail;
188                   looking_for = (op_type) ((int) looking_for & ~(int)
189                                            B31);
190                   thisnib &= 0x7;
191                 }
192               if ((int) looking_for & (int) B30)
193                 {
194                   if (!(((int) thisnib & 0x8) == 0))
195                     goto fail;
196                   looking_for = (op_type) ((int) looking_for & ~(int) B30);
197                 }
198               if (looking_for & DBIT)
199                 {
200                   if ((looking_for & 5) != (thisnib & 5))
201                     goto fail;
202                   abs = (thisnib & 0x8) ? 2 : 1;
203                 }
204               else if (looking_for & (REG | IND | INC | DEC))
205                 {
206                   if (looking_for & REG)
207                     {
208                       /*
209                        * Can work out size from the
210                        * register
211                        */
212                       size = bitfrom (looking_for);
213                     }
214                   if (looking_for & SRC)
215                     {
216                       rs = thisnib;
217                     }
218                   else
219                     {
220                       rd = thisnib;
221                     }
222                 }
223               else if (looking_for & L_16)
224                 {
225                   abs = (data[len >> 1]) * 256 + data[(len + 2) >> 1];
226                   plen = 16;
227                   if (looking_for & (PCREL | DISP))
228                     {
229                       abs = (short) (abs);
230                     }
231                 }
232               else if (looking_for & ABSJMP)
233                 {
234                   abs =
235                     (data[1] << 16)
236                     | (data[2] << 8)
237                     | (data[3]);
238                 }
239               else if (looking_for & MEMIND)
240                 {
241                   abs = data[1];
242                 }
243               else if (looking_for & L_32)
244                 {
245                   int i = len >> 1;
246                   abs = (data[i] << 24)
247                     | (data[i + 1] << 16)
248                     | (data[i + 2] << 8)
249                     | (data[i + 3]);
250
251                   plen = 32;
252                 }
253               else if (looking_for & L_24)
254                 {
255                   int i = len >> 1;
256                   abs = (data[i] << 16) | (data[i + 1] << 8) | (data[i + 2]);
257                   plen = 24;
258                 }
259               else if (looking_for & IGNORE)
260                 {
261                   /* nothing to do */
262                 }
263               else if (looking_for & DISPREG)
264                 {
265                   rdisp = thisnib & 0x7;
266                 }
267               else if (looking_for & KBIT)
268                 {
269                   switch (thisnib)
270                     {
271                     case 9:
272                       abs = 4;
273                       break;
274                     case 8:
275                       abs = 2;
276                       break;
277                     case 0:
278                       abs = 1;
279                       break;
280                     }
281                 }
282               else if (looking_for & L_8)
283                 {
284                   plen = 8;
285
286                   if (looking_for & PCREL)
287                     {
288                       abs = SEXTCHAR (data[len >> 1]);
289                     }
290                   else if (looking_for & ABS8MEM)
291                     {
292                       plen = 8;
293                       abs = h8300hmode ? ~0xff0000ff : ~0xffff00ff;
294                       abs |= data[len >> 1] & 0xff ;
295                     }
296                    else
297                     {
298                       abs = data[len >> 1] & 0xff;
299                     }
300                 }
301               else if (looking_for & L_3)
302                 {
303                   plen = 3;
304
305                   bit = thisnib;
306                 }
307               else if (looking_for == E)
308                 {
309                   dst->op = q;
310
311                   /* Fill in the args */
312                   {
313                     op_type *args = q->args.nib;
314                     int hadone = 0;
315
316                     while (*args != E)
317                       {
318                         int x = *args;
319                         int rn = (x & DST) ? rd : rs;
320                         ea_type *p;
321
322                         if (x & DST)
323                           {
324                             p = &(dst->dst);
325                           }
326                         else
327                           {
328                             p = &(dst->src);
329                           }
330
331                         if (x & (L_3))
332                           {
333                             p->type = X (OP_IMM, size);
334                             p->literal = bit;
335                           }
336                         else if (x & (IMM | KBIT | DBIT))
337                           {
338                             p->type = X (OP_IMM, size);
339                             p->literal = abs;
340                           }
341                         else if (x & REG)
342                           {
343                             /* Reset the size, some
344                                ops (like mul) have two sizes */
345
346                             size = bitfrom (x);
347                             p->type = X (OP_REG, size);
348                             p->reg = rn;
349                           }
350                         else if (x & INC)
351                           {
352                             p->type = X (OP_INC, size);
353                             p->reg = rn & 0x7;
354                           }
355                         else if (x & DEC)
356                           {
357                             p->type = X (OP_DEC, size);
358                             p->reg = rn & 0x7;
359                           }
360                         else if (x & IND)
361                           {
362                             p->type = X (OP_DISP, size);
363                             p->reg = rn & 0x7;
364                             p->literal = 0;
365                           }
366                         else if (x & (ABS | ABSJMP | ABS8MEM))
367                           {
368                             p->type = X (OP_DISP, size);
369                             p->literal = abs;
370                             p->reg = 8;
371                           }
372                         else if (x & MEMIND)
373                           {
374                             p->type = X (OP_MEM, size);
375                             p->literal = abs;
376                           }
377                         else if (x & PCREL)
378                           {
379                             p->type = X (OP_PCREL, size);
380                             p->literal = abs + addr + 2;
381                             if (x & L_16)
382                               p->literal += 2;
383                           }
384                         else if (x & ABSJMP)
385                           {
386                             p->type = X (OP_IMM, SP);
387                             p->literal = abs;
388                           }
389                         else if (x & DISP)
390                           {
391                             p->type = X (OP_DISP, size);
392                             p->literal = abs;
393                             p->reg = rdisp & 0x7;
394                           }
395                         else if (x & CCR)
396                           {
397                             p->type = OP_CCR;
398                           }
399                         else
400                           printf ("Hmmmm %x", x);
401
402                         args++;
403                       }
404                   }
405
406                   /*
407                      * But a jmp or a jsr gets
408                      * automagically lvalued, since we
409                      * branch to their address not their
410                      * contents
411                    */
412                   if (q->how == O (O_JSR, SB)
413                       || q->how == O (O_JMP, SB))
414                     {
415                       dst->src.type = lvalue (dst->src.type, dst->src.reg);
416                     }
417
418                   if (dst->dst.type == -1)
419                     dst->dst = dst->src;
420
421                   dst->opcode = q->how;
422                   dst->cycles = q->time;
423
424                   /* And a jsr to 0xc4 is turned into a magic trap */
425
426                   if (dst->opcode == O (O_JSR, SB))
427                     {
428                       if (dst->src.literal == 0xc4)
429                         {
430                           dst->opcode = O (O_SYSCALL, SB);
431                         }
432                     }
433
434                   dst->next_pc = addr + len / 2;
435                   return;
436                 }
437               else
438                 {
439                   printf ("Dont understand %x \n", looking_for);
440                 }
441             }
442
443           len++;
444           nib++;
445         }
446
447     fail:
448       q++;
449     }
450
451   dst->opcode = O (O_ILL, SB);
452 }
453
454
455 static void
456 compile (pc)
457 {
458   int idx;
459
460   /* find the next cache entry to use */
461
462   idx = cpu.cache_top + 1;
463   cpu.compiles++;
464   if (idx >= cpu.csize)
465     {
466       idx = 1;
467     }
468   cpu.cache_top = idx;
469
470   /* Throw away its old meaning */
471   cpu.cache_idx[cpu.cache[idx].oldpc] = 0;
472
473   /* set to new address */
474   cpu.cache[idx].oldpc = pc;
475
476   /* fill in instruction info */
477   decode (pc, cpu.memory + pc, cpu.cache + idx);
478
479   /* point to new cache entry */
480   cpu.cache_idx[pc] = idx;
481 }
482
483
484 static unsigned char *breg[18];
485 static unsigned short *wreg[18];
486 static unsigned int *lreg[18];
487
488 #define GET_B_REG(x) *(breg[x])
489 #define SET_B_REG(x,y) (*(breg[x])) = (y)
490 #define GET_W_REG(x) *(wreg[x])
491 #define SET_W_REG(x,y) (*(wreg[x])) = (y)
492
493 #define GET_L_REG(x) *(lreg[x])
494 #define SET_L_REG(x,y) (*(lreg[x])) = (y)
495
496 #define GET_MEMORY_L(x) \
497   ((cpu.memory[x+0] << 24) | (cpu.memory[x+1] << 16) | (cpu.memory[x+2] << 8) | cpu.memory[x+3])
498
499 #define GET_MEMORY_W(x) \
500   ((cpu.memory[x+0] << 8) | (cpu.memory[x+1] << 0))
501
502
503 #define SET_MEMORY_B(x,y) \
504   (cpu.memory[(x)] = y)
505
506 #define SET_MEMORY_W(x,y) \
507 {register unsigned char *_p = cpu.memory+x;\
508    register int __y = y;\
509      _p[0] = (__y)>>8;\
510        _p[1] =(__y);     }
511
512 #define SET_MEMORY_L(x,y)  \
513 {register unsigned char *_p = cpu.memory+x;register int __y = y;\
514    _p[0] = (__y)>>24;    _p[1] = (__y)>>16;      _p[2] = (__y)>>8;       _p[3] = (__y)>>0;}
515
516 #define GET_MEMORY_B(x)  (cpu.memory[x])
517
518 int
519 fetch (arg, n)
520      ea_type *arg;
521 {
522   int rn = arg->reg;
523   int abs = arg->literal;
524   int r;
525   int t;
526
527   switch (arg->type)
528     {
529     case X (OP_REG, SB):
530       return GET_B_REG (rn);
531     case X (OP_REG, SW):
532       return GET_W_REG (rn);
533     case X (OP_REG, SL):
534       return GET_L_REG (rn);
535     case X (OP_IMM, SB):
536     case X (OP_IMM, SW):
537     case X (OP_IMM, SL):
538       return abs;
539     case X (OP_DEC, SB):
540       abort ();
541
542     case X (OP_INC, SB):
543       t = GET_L_REG (rn);
544       t &= cpu.mask;
545       r = GET_MEMORY_B (t);
546       t++;
547       t = t & cpu.mask;
548       SET_L_REG (rn, t);
549       return r;
550       break;
551     case X (OP_INC, SW):
552       t = GET_L_REG (rn);
553       t &= cpu.mask;
554       r = GET_MEMORY_W (t);
555       t += 2;
556       t = t & cpu.mask;
557       SET_L_REG (rn, t);
558       return r;
559     case X (OP_INC, SL):
560       t = GET_L_REG (rn);
561       t &= cpu.mask;
562       r = GET_MEMORY_L (t);
563
564       t += 4;
565       t = t & cpu.mask;
566       SET_L_REG (rn, t);
567       return r;
568
569     case X (OP_DISP, SB):
570       t = GET_L_REG (rn) + abs;
571       t &= cpu.mask;
572       return GET_MEMORY_B (t);
573
574     case X (OP_DISP, SW):
575       t = GET_L_REG (rn) + abs;
576       t &= cpu.mask;
577       return GET_MEMORY_W (t);
578
579     case X (OP_DISP, SL):
580       t = GET_L_REG (rn) + abs;
581       t &= cpu.mask;
582       return GET_MEMORY_L (t);
583
584     case X (OP_MEM, SL):
585       t = GET_MEMORY_L (abs);
586       t &= cpu.mask;
587       return t;
588
589     case X (OP_MEM, SW):
590       t = GET_MEMORY_W (abs);
591       t &= cpu.mask;
592       return t;
593
594     default:
595       abort ();
596
597     }
598 }
599
600
601 static
602 void
603 store (arg, n)
604      ea_type *arg;
605      int n;
606 {
607   int rn = arg->reg;
608   int abs = arg->literal;
609   int t;
610
611   switch (arg->type)
612     {
613     case X (OP_REG, SB):
614       SET_B_REG (rn, n);
615       break;
616     case X (OP_REG, SW):
617       SET_W_REG (rn, n);
618       break;
619     case X (OP_REG, SL):
620       SET_L_REG (rn, n);
621       break;
622
623     case X (OP_DEC, SB):
624       t = GET_L_REG (rn) - 1;
625       t &= cpu.mask;
626       SET_L_REG (rn, t);
627       SET_MEMORY_B (t, n);
628
629       break;
630     case X (OP_DEC, SW):
631       t = (GET_L_REG (rn) - 2) & cpu.mask;
632       SET_L_REG (rn, t);
633       SET_MEMORY_W (t, n);
634       break;
635
636     case X (OP_DEC, SL):
637       t = (GET_L_REG (rn) - 4) & cpu.mask;
638       SET_L_REG (rn, t);
639       SET_MEMORY_L (t, n);
640       break;
641
642     case X (OP_DISP, SB):
643       t = GET_L_REG (rn) + abs;
644       t &= cpu.mask;
645       SET_MEMORY_B (t, n);
646       break;
647
648     case X (OP_DISP, SW):
649       t = GET_L_REG (rn) + abs;
650       t &= cpu.mask;
651       SET_MEMORY_W (t, n);
652       break;
653
654     case X (OP_DISP, SL):
655       t = GET_L_REG (rn) + abs;
656       t &= cpu.mask;
657       SET_MEMORY_L (t, n);
658       break;
659     default:
660       abort ();
661     }
662 }
663
664
665 static union
666 {
667   short int i;
668   struct
669     {
670       char low;
671       char high;
672     }
673   u;
674 }
675
676 littleendian;
677
678 static
679 void
680 init_pointers ()
681 {
682   static int init;
683
684   if (!init)
685     {
686       int i;
687
688       init = 1;
689       littleendian.i = 1;
690
691       if (h8300hmode)
692         memory_size = H8300H_MSIZE;
693       else
694         memory_size = H8300_MSIZE;
695       cpu.memory = (unsigned char *) calloc (sizeof (char), memory_size);
696       cpu.cache_idx = (unsigned short *) calloc (sizeof (short), memory_size);
697
698       /* `msize' must be a power of two */
699       if ((memory_size & (memory_size - 1)) != 0)
700         abort ();
701       cpu.mask = memory_size - 1;
702
703       for (i = 0; i < 9; i++)
704         {
705           cpu.regs[i] = 0;
706         }
707
708       for (i = 0; i < 8; i++)
709         {
710           unsigned char *p = (unsigned char *) (cpu.regs + i);
711           unsigned char *e = (unsigned char *) (cpu.regs + i + 1);
712           unsigned short *q = (unsigned short *) (cpu.regs + i);
713           unsigned short *u = (unsigned short *) (cpu.regs + i + 1);
714           cpu.regs[i] = 0x00112233;
715           while (p < e)
716             {
717               if (*p == 0x22)
718                 {
719                   breg[i] = p;
720                 }
721               if (*p == 0x33)
722                 {
723                   breg[i + 8] = p;
724                 }
725               p++;
726             }
727           while (q < u)
728             {
729               if (*q == 0x2233)
730                 {
731                   wreg[i] = q;
732                 }
733               if (*q == 0x0011)
734                 {
735                   wreg[i + 8] = q;
736                 }
737               q++;
738             }
739           cpu.regs[i] = 0;
740           lreg[i] = &cpu.regs[i];
741         }
742
743       lreg[8] = &cpu.regs[8];
744
745       /* initialize the seg registers */
746       if (!cpu.cache)
747         sim_csize (CSIZE);
748     }
749 }
750
751 static void
752 control_c (sig, code, scp, addr)
753      int sig;
754      int code;
755      char *scp;
756      char *addr;
757 {
758   cpu.exception = SIGINT;
759 }
760
761 #define C (c != 0)
762 #define Z (nz == 0)
763 #define V (v != 0)
764 #define N (n != 0)
765
766 static int
767 mop (code, bsize, sign)
768      decoded_inst *code;
769      int bsize;
770      int sign;
771 {
772   int multiplier;
773   int multiplicand;
774   int result;
775   int n, nz;
776
777   if (sign)
778     {
779       multiplicand =
780         bsize ? SEXTCHAR (GET_W_REG (code->dst.reg)) :
781         SEXTSHORT (GET_W_REG (code->dst.reg));
782       multiplier =
783         bsize ? SEXTCHAR (GET_B_REG (code->src.reg)) :
784         SEXTSHORT (GET_W_REG (code->src.reg));
785     }
786   else
787     {
788       multiplicand = bsize ? UEXTCHAR (GET_W_REG (code->dst.reg)) :
789         UEXTSHORT (GET_W_REG (code->dst.reg));
790       multiplier =
791         bsize ? UEXTCHAR (GET_B_REG (code->src.reg)) :
792         UEXTSHORT (GET_W_REG (code->src.reg));
793
794     }
795   result = multiplier * multiplicand;
796
797   if (sign)
798     {
799       n = result & (bsize ? 0x8000 : 0x80000000);
800       nz = result & (bsize ? 0xffff : 0xffffffff);
801     }
802   if (bsize)
803     {
804       SET_W_REG (code->dst.reg, result);
805     }
806   else
807     {
808       SET_L_REG (code->dst.reg, result);
809     }
810 /*  return ((n==1) << 1) | (nz==1); */
811
812 }
813
814 #define OSHIFTS(name, how) \
815 case O(name, SB):                               \
816 {                                               \
817   int t;                                        \
818   int hm = 0x80;                                \
819   rd = GET_B_REG (code->src.reg);               \
820   how;                                          \
821   goto shift8;                                  \
822 }                                               \
823 case O(name, SW):                               \
824 {                                               \
825   int t;                                        \
826   int hm = 0x8000;                              \
827   rd = GET_W_REG (code->src.reg);               \
828   how;                                          \
829   goto shift16;                                 \
830 }                                               \
831 case O(name, SL):                               \
832 {                                               \
833   int t;                                        \
834   int hm = 0x80000000;                          \
835   rd = GET_L_REG (code->src.reg);               \
836   how;                                          \
837   goto shift32;                                 \
838 }
839
840 #define OBITOP(name,f, s, op)                   \
841 case  O(name, SB):                              \
842 {                                               \
843   int m;                                        \
844   int b;                                        \
845   if (f) ea = fetch (&code->dst);               \
846   m=1<< fetch(&code->src);                      \
847   op;                                           \
848   if(s) store (&code->dst,ea); goto next;       \
849 }
850
851 void
852 sim_resume (step, siggnal)
853 {
854   static int init1;
855   int cycles = 0;
856   int insts = 0;
857   int tick_start = get_now ();
858   void (*prev) ();
859   int poll_count = 0;
860   int res;
861   int tmp;
862   int rd;
863   int ea;
864   int bit;
865   int pc;
866   int c, nz, v, n;
867   int oldmask;
868   init_pointers ();
869
870   prev = signal (SIGINT, control_c);
871
872   if (step)
873     {
874       cpu.exception = SIGTRAP;
875     }
876   else
877     {
878       cpu.exception = 0;
879     }
880
881   pc = cpu.pc;
882
883   GETSR ();
884   oldmask = cpu.mask;
885   if (!h8300hmode)
886     cpu.mask = 0xffff;
887   do
888     {
889       int cidx;
890       decoded_inst *code;
891
892     top:
893       cidx = cpu.cache_idx[pc];
894       code = cpu.cache + cidx;
895
896
897 #define ALUOP(STORE, NAME, HOW) \
898     case O(NAME,SB):  HOW; if(STORE)goto alu8;else goto just_flags_alu8;  \
899     case O(NAME, SW): HOW; if(STORE)goto alu16;else goto just_flags_alu16; \
900     case O(NAME,SL):  HOW; if(STORE)goto alu32;else goto just_flags_alu32;
901
902
903 #define LOGOP(NAME, HOW) \
904     case O(NAME,SB): HOW; goto log8;\
905     case O(NAME, SW): HOW; goto log16;\
906     case O(NAME,SL): HOW; goto log32;
907
908
909
910 #if ADEBUG
911       if (debug)
912         {
913           printf ("%x %d %s\n", pc, code->opcode,
914                   code->op ? code->op->name : "**");
915         }
916       cpu.stats[code->opcode]++;
917
918 #endif
919
920       cycles += code->cycles;
921       insts++;
922       switch (code->opcode)
923         {
924         case 0:
925           /*
926            * This opcode is a fake for when we get to an
927            * instruction which hasnt been compiled
928            */
929           compile (pc);
930           goto top;
931           break;
932
933
934         case O (O_SUBX, SB):
935           rd = fetch (&code->dst);
936           ea = fetch (&code->src);
937           ea = -(ea + C);
938           res = rd + ea;
939           goto alu8;
940
941         case O (O_ADDX, SB):
942           rd = fetch (&code->dst);
943           ea = fetch (&code->src);
944           ea = C + ea;
945           res = rd + ea;
946           goto alu8;
947
948 #define EA    ea = fetch(&code->src);
949 #define RD_EA ea = fetch(&code->src); rd = fetch(&code->dst);
950
951           ALUOP (1, O_SUB, RD_EA;
952                  ea = -ea;
953                  res = rd + ea);
954           ALUOP (1, O_NEG, EA;
955                  ea = -ea;
956                  rd = 0;
957                  res = rd + ea);
958
959         case O (O_ADD, SB):
960           rd = GET_B_REG (code->dst.reg);
961           ea = fetch (&code->src);
962           res = rd + ea;
963           goto alu8;
964         case O (O_ADD, SW):
965           rd = GET_W_REG (code->dst.reg);
966           ea = fetch (&code->src);
967           res = rd + ea;
968           goto alu16;
969         case O (O_ADD, SL):
970           rd = GET_L_REG (code->dst.reg);
971           ea = fetch (&code->src);
972           res = rd + ea;
973           goto alu32;
974
975
976           LOGOP (O_AND, RD_EA;
977                  res = rd & ea);
978
979           LOGOP (O_OR, RD_EA;
980                  res = rd | ea);
981
982           LOGOP (O_XOR, RD_EA;
983                  res = rd ^ ea);
984
985
986         case O (O_MOV_TO_MEM, SB):
987           res = GET_B_REG (code->src.reg);
988           goto log8;
989         case O (O_MOV_TO_MEM, SW):
990           res = GET_W_REG (code->src.reg);
991           goto log16;
992         case O (O_MOV_TO_MEM, SL):
993           res = GET_L_REG (code->src.reg);
994           goto log32;
995
996
997         case O (O_MOV_TO_REG, SB):
998           res = fetch (&code->src);
999           SET_B_REG (code->dst.reg, res);
1000           goto just_flags_log8;
1001         case O (O_MOV_TO_REG, SW):
1002           res = fetch (&code->src);
1003           SET_W_REG (code->dst.reg, res);
1004           goto just_flags_log16;
1005         case O (O_MOV_TO_REG, SL):
1006           res = fetch (&code->src);
1007           SET_L_REG (code->dst.reg, res);
1008           goto just_flags_log32;
1009
1010
1011         case O (O_ADDS, SL):
1012           SET_L_REG (code->dst.reg,
1013                      GET_L_REG (code->dst.reg)
1014                      + code->src.literal);
1015
1016           goto next;
1017
1018         case O (O_SUBS, SL):
1019           SET_L_REG (code->dst.reg,
1020                      GET_L_REG (code->dst.reg)
1021                      - code->src.literal);
1022           goto next;
1023
1024         case O (O_CMP, SB):
1025           rd = fetch (&code->dst);
1026           ea = fetch (&code->src);
1027           ea = -ea;
1028           res = rd + ea;
1029           goto just_flags_alu8;
1030
1031         case O (O_CMP, SW):
1032           rd = fetch (&code->dst);
1033           ea = fetch (&code->src);
1034           ea = -ea;
1035           res = rd + ea;
1036           goto just_flags_alu16;
1037
1038         case O (O_CMP, SL):
1039           rd = fetch (&code->dst);
1040           ea = fetch (&code->src);
1041           ea = -ea;
1042           res = rd + ea;
1043           goto just_flags_alu32;
1044
1045
1046         case O (O_DEC, SB):
1047           rd = GET_B_REG (code->src.reg);
1048           ea = -1;
1049           res = rd + ea;
1050           SET_B_REG (code->src.reg, res);
1051           goto just_flags_inc8;
1052
1053         case O (O_DEC, SW):
1054           rd = GET_W_REG (code->dst.reg);
1055           ea = -code->src.literal;
1056           res = rd + ea;
1057           SET_W_REG (code->dst.reg, res);
1058           goto just_flags_inc16;
1059
1060         case O (O_DEC, SL):
1061           rd = GET_L_REG (code->dst.reg);
1062           ea = -code->src.literal;
1063           res = rd + ea;
1064           SET_L_REG (code->dst.reg, res);
1065           goto just_flags_inc32;
1066
1067
1068         case O (O_INC, SB):
1069           rd = GET_B_REG (code->src.reg);
1070           ea = 1;
1071           res = rd + ea;
1072           SET_B_REG (code->src.reg, res);
1073           goto just_flags_inc8;
1074
1075         case O (O_INC, SW):
1076           rd = GET_W_REG (code->dst.reg);
1077           ea = code->src.literal;
1078           res = rd + ea;
1079           SET_W_REG (code->dst.reg, res);
1080           goto just_flags_inc16;
1081
1082         case O (O_INC, SL):
1083           rd = GET_L_REG (code->dst.reg);
1084           ea = code->src.literal;
1085           res = rd + ea;
1086           SET_L_REG (code->dst.reg, res);
1087           goto just_flags_inc32;
1088
1089
1090 #define GET_CCR(x) BUILDSR();x = cpu.ccr
1091
1092         case O (O_ANDC, SB):
1093           GET_CCR (rd);
1094           ea = code->src.literal;
1095           res = rd & ea;
1096           goto setc;
1097
1098         case O (O_ORC, SB):
1099           GET_CCR (rd);
1100           ea = code->src.literal;
1101           res = rd | ea;
1102           goto setc;
1103
1104         case O (O_XORC, SB):
1105           GET_CCR (rd);
1106           ea = code->src.literal;
1107           res = rd ^ ea;
1108           goto setc;
1109
1110
1111         case O (O_BRA, SB):
1112           if (1)
1113             goto condtrue;
1114           goto next;
1115
1116         case O (O_BRN, SB):
1117           if (0)
1118             goto condtrue;
1119           goto next;
1120
1121         case O (O_BHI, SB):
1122           if ((C || Z) == 0)
1123             goto condtrue;
1124           goto next;
1125
1126
1127         case O (O_BLS, SB):
1128           if ((C || Z))
1129             goto condtrue;
1130           goto next;
1131
1132         case O (O_BCS, SB):
1133           if ((C == 1))
1134             goto condtrue;
1135           goto next;
1136
1137         case O (O_BCC, SB):
1138           if ((C == 0))
1139             goto condtrue;
1140           goto next;
1141
1142         case O (O_BEQ, SB):
1143           if (Z)
1144             goto condtrue;
1145           goto next;
1146         case O (O_BGT, SB):
1147           if (((Z || (N ^ V)) == 0))
1148             goto condtrue;
1149           goto next;
1150
1151
1152         case O (O_BLE, SB):
1153           if (((Z || (N ^ V)) == 1))
1154             goto condtrue;
1155           goto next;
1156
1157         case O (O_BGE, SB):
1158           if ((N ^ V) == 0)
1159             goto condtrue;
1160           goto next;
1161         case O (O_BLT, SB):
1162           if ((N ^ V))
1163             goto condtrue;
1164           goto next;
1165         case O (O_BMI, SB):
1166           if ((N))
1167             goto condtrue;
1168           goto next;
1169         case O (O_BNE, SB):
1170           if ((Z == 0))
1171             goto condtrue;
1172           goto next;
1173
1174         case O (O_BPL, SB):
1175           if (N == 0)
1176             goto condtrue;
1177           goto next;
1178         case O (O_BVC, SB):
1179           if ((V == 0))
1180             goto condtrue;
1181           goto next;
1182         case O (O_BVS, SB):
1183           if ((V == 1))
1184             goto condtrue;
1185           goto next;
1186
1187         case O (O_SYSCALL, SB):
1188           printf ("%c", cpu.regs[2]);
1189           goto next;
1190
1191           OSHIFTS (O_NOT, rd = ~rd; v = 0;);
1192           OSHIFTS (O_SHLL, c = rd & hm; v = 0;
1193                    rd <<= 1);
1194           OSHIFTS (O_SHLR, c = rd & 1; v = 0;
1195                    rd = (unsigned int) rd >> 1);
1196           OSHIFTS (O_SHAL, c = rd & hm;
1197                    v = (rd & hm) != ((rd & (hm >> 1)) << 1);
1198                    rd <<= 1);
1199           OSHIFTS (O_SHAR, t = rd & hm;
1200                    c = rd & 1;
1201                    v = 0;
1202                    rd >>= 1;
1203                    rd |= t;
1204                    );
1205           OSHIFTS (O_ROTL, c = rd & hm;
1206                    v = 0;
1207                    rd <<= 1;
1208                    rd |= C);
1209           OSHIFTS (O_ROTR, c = rd & 1;
1210                    v = 0;
1211                    rd = (unsigned int) rd >> 1;
1212                    if (c) rd |= hm;);
1213           OSHIFTS (O_ROTXL, t = rd & hm;
1214                    rd <<= 1;
1215                    rd |= C;
1216                    c = t;
1217                    v = 0;
1218                    );
1219           OSHIFTS (O_ROTXR, t = rd & 1;
1220                    rd = (unsigned int) rd >> 1;
1221                    if (C) rd |= hm; c = t;
1222                    v = 0;);
1223
1224         case O (O_JMP, SB):
1225           {
1226             pc = fetch (&code->src);
1227             goto end;
1228
1229           }
1230
1231         case O (O_JSR, SB):
1232           {
1233             int tmp;
1234             pc = fetch (&code->src);
1235           call:
1236             tmp = cpu.regs[7];
1237
1238             if (h8300hmode)
1239               {
1240                 tmp -= 4;
1241                 SET_MEMORY_L (tmp, code->next_pc);
1242               }
1243             else
1244               {
1245                 tmp -= 2;
1246                 SET_MEMORY_W (tmp, code->next_pc);
1247               }
1248             cpu.regs[7] = tmp;
1249
1250             goto end;
1251           }
1252         case O (O_BSR, SB):
1253           pc = code->src.literal;
1254           goto call;
1255
1256         case O (O_RTS, SB):
1257           {
1258             int tmp;
1259
1260             tmp = cpu.regs[7];
1261
1262             if (h8300hmode)
1263               {
1264                 pc = GET_MEMORY_L (tmp);
1265                 tmp += 4;
1266               }
1267             else
1268               {
1269                 pc = GET_MEMORY_W (tmp);
1270                 tmp += 2;
1271               }
1272
1273             cpu.regs[7] = tmp;
1274             goto end;
1275           }
1276
1277         case O (O_ILL, SB):
1278           cpu.exception = SIGILL;
1279           goto end;
1280         case O (O_SLEEP, SB):
1281           /* The format of r0 is defined by devo/include/wait.h.
1282              cpu.exception handling needs some cleanup: we need to make the
1283              the handling of normal exits vs signals, etc. more sensible.  */
1284           if (! WIFEXITED (cpu.regs[0]) && WIFSIGNALED (cpu.regs[0]))
1285             cpu.exception = SIGILL;
1286           else
1287             cpu.exception = SIGTRAP;
1288           goto end;
1289         case O (O_BPT, SB):
1290           cpu.exception = SIGTRAP;
1291           goto end;
1292
1293           OBITOP (O_BNOT, 1, 1, ea ^= m);
1294           OBITOP (O_BTST, 1, 0, nz = ea & m);
1295           OBITOP (O_BCLR, 1, 1, ea &= ~m);
1296           OBITOP (O_BSET, 1, 1, ea |= m);       
1297           OBITOP (O_BLD, 1, 0, c = ea & m);
1298           OBITOP (O_BILD, 1, 0, c = !(ea & m));
1299           OBITOP (O_BST, 1, 1, ea &= ~m;
1300                   if (C) ea |= m);
1301           OBITOP (O_BIST, 1, 1, ea &= ~m;
1302                   if (!C) ea |= m);
1303           OBITOP (O_BAND, 1, 0, c = (ea & m) && C);
1304           OBITOP (O_BIAND, 1, 0, c = !(ea & m) && C);
1305           OBITOP (O_BOR, 1, 0, c = (ea & m) || C);
1306           OBITOP (O_BIOR, 1, 0, c = !(ea & m) || C);
1307           OBITOP (O_BXOR, 1, 0, c = (ea & m) != C);
1308           OBITOP (O_BIXOR, 1, 0, c = !(ea & m) != C);
1309
1310
1311 #define MOP(bsize, signed) mop(code, bsize,signed); goto next;
1312
1313         case O (O_MULS, SB):
1314           MOP (1, 1);
1315           break;
1316         case O (O_MULS, SW):
1317           MOP (0, 1);
1318           break;
1319         case O (O_MULU, SB):
1320           MOP (1, 0);
1321           break;
1322         case O (O_MULU, SW):
1323           MOP (0, 0);
1324           break;
1325
1326
1327         case O (O_DIVU, SB):
1328           {
1329             rd = GET_W_REG (code->dst.reg);
1330             ea = GET_B_REG (code->src.reg);
1331             if (ea)
1332               {
1333                 tmp = rd % ea;
1334                 rd = rd / ea;
1335               }
1336             SET_W_REG (code->dst.reg, (rd & 0xff) | (tmp << 8));
1337             n = ea & 0x80;
1338             nz = ea & 0xff;
1339
1340             goto next;
1341           }
1342         case O (O_DIVU, SW):
1343           {
1344             rd = GET_L_REG (code->dst.reg);
1345             ea = GET_W_REG (code->src.reg);
1346             n = ea & 0x8000;
1347             nz = ea & 0xffff;
1348             if (ea)
1349               {
1350                 tmp = rd % ea;
1351                 rd = rd / ea;
1352               }
1353             SET_L_REG (code->dst.reg, (rd & 0xffff) | (tmp << 16));
1354             goto next;
1355           }
1356
1357         case O (O_DIVS, SB):
1358           {
1359
1360             rd = SEXTSHORT (GET_W_REG (code->dst.reg));
1361             ea = SEXTCHAR (GET_B_REG (code->src.reg));
1362             if (ea)
1363               {
1364                 tmp = (int) rd % (int) ea;
1365                 rd = (int) rd / (int) ea;
1366                 n = rd & 0x8000;
1367                 nz = 1;
1368               }
1369             else
1370               nz = 0;
1371             SET_W_REG (code->dst.reg, (rd & 0xff) | (tmp << 8));
1372             goto next;
1373           }
1374         case O (O_DIVS, SW):
1375           {
1376             rd = GET_L_REG (code->dst.reg);
1377             ea = SEXTSHORT (GET_W_REG (code->src.reg));
1378             if (ea)
1379               {
1380                 tmp = (int) rd % (int) ea;
1381                 rd = (int) rd / (int) ea;
1382                 n = rd & 0x80000000;
1383                 nz = 1;
1384               }
1385             else
1386               nz = 0;
1387             SET_L_REG (code->dst.reg, (rd & 0xffff) | (tmp << 16));
1388             goto next;
1389           }
1390         case O (O_EXTS, SW):
1391           rd = GET_B_REG (code->src.reg + 8) & 0xff; /* Yes, src, not dst.  */
1392           ea = rd & 0x80 ? -256 : 0;
1393           res = rd + ea;
1394           goto log16;
1395         case O (O_EXTS, SL):
1396           rd = GET_W_REG (code->src.reg) & 0xffff;
1397           ea = rd & 0x8000 ? -65536 : 0;
1398           res = rd + ea;
1399           goto log32;
1400         case O (O_EXTU, SW):
1401           rd = GET_B_REG (code->src.reg + 8) & 0xff;
1402           ea = 0;
1403           res = rd + ea;
1404           goto log16;
1405         case O (O_EXTU, SL):
1406           rd = GET_W_REG (code->src.reg) & 0xffff;
1407           ea = 0;
1408           res = rd + ea;
1409           goto log32;
1410
1411         case O (O_NOP, SB):
1412           goto next;
1413
1414         default:
1415           cpu.exception = SIGILL;
1416           goto end;
1417
1418         }
1419       abort ();
1420
1421     setc:
1422       cpu.ccr = res;
1423       GETSR ();
1424       goto next;
1425
1426     condtrue:
1427       /* When a branch works */
1428       pc = code->src.literal;
1429       goto end;
1430
1431       /* Set the cond codes from res */
1432     bitop:
1433
1434       /* Set the flags after an 8 bit inc/dec operation */
1435     just_flags_inc8:
1436       n = res & 0x80;
1437       nz = res & 0xff;
1438       v = (rd & 0x7f) == 0x7f;
1439       goto next;
1440
1441
1442       /* Set the flags after an 16 bit inc/dec operation */
1443     just_flags_inc16:
1444       n = res & 0x8000;
1445       nz = res & 0xffff;
1446       v = (rd & 0x7fff) == 0x7fff;
1447       goto next;
1448
1449
1450       /* Set the flags after an 32 bit inc/dec operation */
1451     just_flags_inc32:
1452       n = res & 0x80000000;
1453       nz = res & 0xffffffff;
1454       v = (rd & 0x7fffffff) == 0x7fffffff;
1455       goto next;
1456
1457
1458     shift8:
1459       /* Set flags after an 8 bit shift op, carry,overflow set in insn */
1460       n = (rd & 0x80);
1461       nz = rd & 0xff;
1462       SET_B_REG (code->src.reg, rd);
1463       goto next;
1464
1465     shift16:
1466       /* Set flags after an 16 bit shift op, carry,overflow set in insn */
1467       n = (rd & 0x8000);
1468       nz = rd & 0xffff;
1469       SET_W_REG (code->src.reg, rd);
1470       goto next;
1471
1472     shift32:
1473       /* Set flags after an 32 bit shift op, carry,overflow set in insn */
1474       n = (rd & 0x80000000);
1475       nz = rd & 0xffffffff;
1476       SET_L_REG (code->src.reg, rd);
1477       goto next;
1478
1479     log32:
1480       store (&code->dst, res);
1481     just_flags_log32:
1482       /* flags after a 32bit logical operation */
1483       n = res & 0x80000000;
1484       nz = res & 0xffffffff;
1485       v = 0;
1486       goto next;
1487
1488     log16:
1489       store (&code->dst, res);
1490     just_flags_log16:
1491       /* flags after a 16bit logical operation */
1492       n = res & 0x8000;
1493       nz = res & 0xffff;
1494       v = 0;
1495       goto next;
1496
1497
1498     log8:
1499       store (&code->dst, res);
1500     just_flags_log8:
1501       n = res & 0x80;
1502       nz = res & 0xff;
1503       v = 0;
1504       goto next;
1505
1506     alu8:
1507       SET_B_REG (code->dst.reg, res);
1508     just_flags_alu8:
1509       n = res & 0x80;
1510       nz = res & 0xff;
1511       c = (res & 0x100);
1512       switch (code->opcode / 4)
1513         {
1514         case O_ADD:
1515           v = ((rd & 0x80) == (ea & 0x80)
1516                && (rd & 0x80) != (res & 0x80));
1517           break;
1518         case O_SUB:
1519         case O_CMP:
1520           v = ((rd & 0x80) != (-ea & 0x80)
1521                && (rd & 0x80) != (res & 0x80));
1522           break;
1523         case O_NEG:
1524           v = (rd == 0x80);
1525           break;
1526         }
1527       goto next;
1528
1529     alu16:
1530       SET_W_REG (code->dst.reg, res);
1531     just_flags_alu16:
1532       n = res & 0x8000;
1533       nz = res & 0xffff;
1534       c = (res & 0x10000);
1535       switch (code->opcode / 4)
1536         {
1537         case O_ADD:
1538           v = ((rd & 0x8000) == (ea & 0x8000)
1539                && (rd & 0x8000) != (res & 0x8000));
1540           break;
1541         case O_SUB:
1542         case O_CMP:
1543           v = ((rd & 0x8000) != (-ea & 0x8000)
1544                && (rd & 0x8000) != (res & 0x8000));
1545           break;
1546         case O_NEG:
1547           v = (rd == 0x8000);
1548           break;
1549         }
1550       goto next;
1551
1552     alu32:
1553       SET_L_REG (code->dst.reg, res);
1554     just_flags_alu32:
1555       n = res & 0x80000000;
1556       nz = res & 0xffffffff;
1557       switch (code->opcode / 4)
1558         {
1559         case O_ADD:
1560           v = ((rd & 0x80000000) == (ea & 0x80000000)
1561                && (rd & 0x80000000) != (res & 0x80000000));
1562           break;
1563         case O_SUB:
1564         case O_CMP:
1565           v = ((rd & 0x80000000) != (-ea & 0x80000000)
1566                && (rd & 0x80000000) != (res & 0x80000000));
1567           break;
1568         case O_NEG:
1569           v = (rd == 0x80000000);
1570           break;
1571         }
1572       goto next;
1573       switch (code->opcode / 4)
1574         {
1575         case O_ADD:
1576           c = ((unsigned) res < (unsigned) rd) || ((unsigned) res < (unsigned) ea);
1577           break;
1578         case O_SUB:
1579         case O_CMP:
1580           c = (unsigned) rd < (unsigned) -ea;
1581           break;
1582         case O_NEG:
1583           c = res != 0;
1584           break;
1585         }
1586       goto next;
1587
1588     next:;
1589       pc = code->next_pc;
1590
1591     end:
1592       ;
1593       /*      if (cpu.regs[8] ) abort(); */
1594
1595 #if defined (WIN32)
1596       /* Poll after every 100th insn, */
1597       if (poll_count++ > 100)
1598         {
1599           poll_count = 0;
1600           if (win32pollquit())
1601             {
1602               control_c();
1603             }
1604         }
1605 #endif
1606 #if defined(__GO32__)
1607       /* Poll after every 100th insn, */
1608       if (poll_count++ > 100)
1609         {
1610           poll_count = 0;
1611           if (kbhit ())
1612             {
1613               int c = getkey ();
1614               control_c ();
1615             }
1616         }
1617 #endif
1618
1619     }
1620   while (!cpu.exception);
1621   cpu.ticks += get_now () - tick_start;
1622   cpu.cycles += cycles;
1623   cpu.insts += insts;
1624   
1625   cpu.pc = pc;
1626   BUILDSR ();
1627   cpu.mask = oldmask;
1628   signal (SIGINT, prev);
1629 }
1630
1631
1632 int
1633 sim_write (addr, buffer, size)
1634      SIM_ADDR addr;
1635      unsigned char *buffer;
1636      int size;
1637 {
1638   int i;
1639
1640   init_pointers ();
1641   if (addr < 0 || addr + size > memory_size)
1642     return 0;
1643   for (i = 0; i < size; i++)
1644     {
1645       cpu.memory[addr + i] = buffer[i];
1646       cpu.cache_idx[addr + i] = 0;
1647     }
1648   return size;
1649 }
1650
1651 int
1652 sim_read (addr, buffer, size)
1653      SIM_ADDR addr;
1654      unsigned char *buffer;
1655      int size;
1656 {
1657   init_pointers ();
1658   if (addr < 0 || addr + size > memory_size)
1659     return 0;
1660   memcpy (buffer, cpu.memory + addr, size);
1661   return size;
1662 }
1663
1664
1665 #define R0_REGNUM       0
1666 #define R1_REGNUM       1
1667 #define R2_REGNUM       2
1668 #define R3_REGNUM       3
1669 #define R4_REGNUM       4
1670 #define R5_REGNUM       5
1671 #define R6_REGNUM       6
1672 #define R7_REGNUM       7
1673
1674 #define SP_REGNUM       R7_REGNUM       /* Contains address of top of stack */
1675 #define FP_REGNUM       R6_REGNUM       /* Contains address of executing
1676                                            * stack frame */
1677
1678 #define CCR_REGNUM      8       /* Contains processor status */
1679 #define PC_REGNUM       9       /* Contains program counter */
1680
1681 #define CYCLE_REGNUM    10
1682 #define INST_REGNUM     11
1683 #define TICK_REGNUM     12
1684
1685
1686 void
1687 sim_store_register (rn, value)
1688      int rn;
1689      unsigned char *value;
1690 {
1691   int longval;
1692   int shortval;
1693   int intval;
1694   longval = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
1695   shortval = (value[0] << 8) | (value[1]);
1696   intval = h8300hmode ? longval : shortval;
1697
1698   init_pointers ();
1699   switch (rn)
1700     {
1701     case PC_REGNUM:
1702       cpu.pc = intval;
1703       break;
1704     default:
1705       abort ();
1706     case R0_REGNUM:
1707     case R1_REGNUM:
1708     case R2_REGNUM:
1709     case R3_REGNUM:
1710     case R4_REGNUM:
1711     case R5_REGNUM:
1712     case R6_REGNUM:
1713     case R7_REGNUM:
1714       cpu.regs[rn] = intval;
1715       break;
1716     case CCR_REGNUM:
1717       cpu.ccr = intval;
1718       break;
1719     case CYCLE_REGNUM:
1720       cpu.cycles = longval;
1721       break;
1722
1723     case INST_REGNUM:
1724       cpu.insts = longval;
1725       break;
1726
1727     case TICK_REGNUM:
1728       cpu.ticks = longval;
1729       break;
1730     }
1731 }
1732
1733 void
1734 sim_fetch_register (rn, buf)
1735      int rn;
1736      unsigned char *buf;
1737 {
1738   int v;
1739   int longreg = 0;
1740
1741   init_pointers ();
1742
1743   switch (rn)
1744     {
1745     default:
1746       abort ();
1747     case 8:
1748       v = cpu.ccr;
1749       break;
1750     case 9:
1751       v = cpu.pc;
1752       break;
1753     case R0_REGNUM:
1754     case R1_REGNUM:
1755     case R2_REGNUM:
1756     case R3_REGNUM:
1757     case R4_REGNUM:
1758     case R5_REGNUM:
1759     case R6_REGNUM:
1760     case R7_REGNUM:
1761       v = cpu.regs[rn];
1762       break;
1763     case 10:
1764       v = cpu.cycles;
1765       longreg = 1;
1766       break;
1767     case 11:
1768       v = cpu.ticks;
1769       longreg = 1;
1770       break;
1771     case 12:
1772       v = cpu.insts;
1773       longreg = 1;
1774       break;
1775     }
1776   if (h8300hmode || longreg)
1777     {
1778       buf[0] = v >> 24;
1779       buf[1] = v >> 16;
1780       buf[2] = v >> 8;
1781       buf[3] = v >> 0;
1782     }
1783   else
1784     {
1785       buf[0] = v >> 8;
1786       buf[1] = v;
1787     }
1788 }
1789
1790 void
1791 sim_stop_reason (reason, sigrc)
1792      enum sim_stop *reason;
1793      int *sigrc;
1794 {
1795   *reason = sim_stopped;
1796   *sigrc = cpu.exception;
1797 }
1798
1799 sim_csize (n)
1800 {
1801   if (cpu.cache)
1802     free (cpu.cache);
1803   if (n < 2)
1804     n = 2;
1805   cpu.cache = (decoded_inst *) malloc (sizeof (decoded_inst) * n);
1806   memset (cpu.cache, 0, sizeof (decoded_inst) * n);
1807   cpu.csize = n;
1808 }
1809
1810
1811 void
1812 sim_info (verbose)
1813      int verbose;
1814 {
1815   double timetaken = (double) cpu.ticks / (double) now_persec ();
1816   double virttime = cpu.cycles / 10.0e6;
1817
1818   printf_filtered ("\n\n#instructions executed  %10d\n", cpu.insts);
1819   printf_filtered ("#cycles (v approximate) %10d\n", cpu.cycles);
1820   printf_filtered ("#real time taken        %10.4f\n", timetaken);
1821   printf_filtered ("#virtual time taked     %10.4f\n", virttime);
1822   if (timetaken != 0.0)
1823     printf_filtered ("#simulation ratio       %10.4f\n", virttime / timetaken);
1824   printf_filtered ("#compiles               %10d\n", cpu.compiles);
1825   printf_filtered ("#cache size             %10d\n", cpu.csize);
1826
1827 #ifdef ADEBUG
1828   if (verbose)
1829     {
1830       int i;
1831       for (i = 0; i < O_LAST; i++)
1832         {
1833           if (cpu.stats[i])
1834             printf_filtered ("%d: %d\n", i, cpu.stats[i]);
1835         }
1836     }
1837 #endif
1838 }
1839
1840 /* Indicate whether the cpu is an h8/300 or h8/300h.
1841    FLAG is non-zero for the h8/300h.  */
1842
1843 void
1844 set_h8300h (flag)
1845      int flag;
1846 {
1847   h8300hmode = flag;
1848 }
1849
1850 void
1851 sim_kill ()
1852 {
1853   /* nothing to do */
1854 }
1855
1856 void
1857 sim_open (args)
1858      char *args;
1859 {
1860   /* nothing to do */
1861 }
1862
1863 void
1864 sim_close (quitting)
1865      int quitting;
1866 {
1867   /* nothing to do */
1868 }
1869
1870 /* Called by gdb to load a program into memory.  */
1871
1872 int
1873 sim_load (prog, from_tty)
1874      char *prog;
1875      int from_tty;
1876 {
1877   bfd *abfd;
1878
1879   /* See if the file is for the h8/300 or h8/300h.  */
1880   /* ??? This may not be the most efficient way.  The z8k simulator
1881      does this via a different mechanism (INIT_EXTRA_SYMTAB_INFO).  */
1882   if ((abfd = bfd_openr (prog, "coff-h8300")) != 0)
1883     {
1884       if (bfd_check_format (abfd, bfd_object)) 
1885         set_h8300h (abfd->arch_info->mach == bfd_mach_h8300h);
1886       bfd_close (abfd);
1887     }
1888
1889   /* Return non-zero so gdb will handle it.  */
1890   return 1;
1891 }
1892
1893 void
1894 sim_create_inferior (start_address, argv, env)
1895      SIM_ADDR start_address;
1896      char **argv;
1897      char **env;
1898 {
1899   cpu.pc = start_address;
1900 }
1901
1902 void
1903 sim_do_command (cmd)
1904      char *cmd;
1905 {
1906   printf_filtered ("This simulator does not accept any commands.\n");
1907 }
1908
1909
1910
1911 void
1912 sim_set_callbacks (ptr)
1913 struct host_callback_struct *ptr;
1914 {
1915
1916 }
1917