sim/h8300/ChangeLog:
[external/binutils.git] / sim / h8300 / compile.c
1 /*
2  * Simulator for the Renesas (formerly 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 <signal.h>
21 #ifdef HAVE_TIME_H
22 #include <time.h>
23 #endif
24 #ifdef HAVE_STDLIB_H
25 #include <stdlib.h>
26 #endif
27 #ifdef HAVE_SYS_PARAM_H
28 #include <sys/param.h>
29 #endif
30
31 #include "bfd.h"
32 #include "sim-main.h"
33 #include "gdb/sim-h8300.h"
34 #include "sys/stat.h"
35 #include "sys/types.h"
36
37 #ifndef SIGTRAP
38 # define SIGTRAP 5
39 #endif
40
41 int debug;
42
43 host_callback *sim_callback;
44
45 static SIM_OPEN_KIND sim_kind;
46 static char *myname;
47
48 /* FIXME: Needs to live in header file.
49    This header should also include the things in remote-sim.h.
50    One could move this to remote-sim.h but this function isn't needed
51    by gdb.  */
52 static void set_simcache_size (SIM_DESC, int);
53
54 #define X(op, size)  (op * 4 + size)
55
56 #define SP (h8300hmode && !h8300_normal_mode ? SL : SW)
57
58 #define h8_opcodes ops
59 #define DEFINE_TABLE
60 #include "opcode/h8300.h"
61
62 /* CPU data object: */
63
64 static int
65 sim_state_initialize (SIM_DESC sd, sim_cpu *cpu)
66 {
67   /* FIXME: not really necessary, since sim_cpu_alloc calls zalloc.  */
68
69   memset (&cpu->regs, 0, sizeof(cpu->regs));
70   cpu->regs[SBR_REGNUM] = 0xFFFFFF00;
71   cpu->pc = 0;
72   cpu->delayed_branch = 0;
73   cpu->memory = NULL;
74   cpu->eightbit = NULL;
75   cpu->mask = 0;
76
77   /* Initialize local simulator state.  */
78   sd->sim_cache = NULL;
79   sd->sim_cache_size = 0;
80   sd->cache_idx = NULL;
81   sd->cache_top = 0;
82   sd->memory_size = 0;
83   sd->compiles = 0;
84 #ifdef ADEBUG
85   memset (&cpu->stats, 0, sizeof (cpu->stats));
86 #endif
87   return 0;
88 }
89
90 static unsigned int
91 h8_get_pc (SIM_DESC sd)
92 {
93   return (STATE_CPU (sd, 0)) -> pc;
94 }
95
96 static void
97 h8_set_pc (SIM_DESC sd, unsigned int val)
98 {
99   (STATE_CPU (sd, 0)) -> pc = val;
100 }
101
102 static unsigned int
103 h8_get_ccr (SIM_DESC sd)
104 {
105   return (STATE_CPU (sd, 0)) -> regs[CCR_REGNUM];
106 }
107
108 static void
109 h8_set_ccr (SIM_DESC sd, unsigned int val)
110 {
111   (STATE_CPU (sd, 0)) -> regs[CCR_REGNUM] = val;
112 }
113
114 static unsigned int
115 h8_get_exr (SIM_DESC sd)
116 {
117   return (STATE_CPU (sd, 0)) -> regs[EXR_REGNUM];
118 }
119
120 static void
121 h8_set_exr (SIM_DESC sd, unsigned int val)
122 {
123   (STATE_CPU (sd, 0)) -> regs[EXR_REGNUM] = val;
124 }
125
126 static int
127 h8_get_sbr (SIM_DESC sd)
128 {
129   return (STATE_CPU (sd, 0)) -> regs[SBR_REGNUM];
130 }
131
132 static void
133 h8_set_sbr (SIM_DESC sd, int val)
134 {
135   (STATE_CPU (sd, 0)) -> regs[SBR_REGNUM] = val;
136 }
137
138 static int
139 h8_get_vbr (SIM_DESC sd)
140 {
141   return (STATE_CPU (sd, 0)) -> regs[VBR_REGNUM];
142 }
143
144 static void
145 h8_set_vbr (SIM_DESC sd, int val)
146 {
147   (STATE_CPU (sd, 0)) -> regs[VBR_REGNUM] = val;
148 }
149
150 static int
151 h8_get_cache_top (SIM_DESC sd)
152 {
153   return sd -> cache_top;
154 }
155
156 static void
157 h8_set_cache_top (SIM_DESC sd, int val)
158 {
159   sd -> cache_top = val;
160 }
161
162 static int
163 h8_get_mask (SIM_DESC sd)
164 {
165   return (STATE_CPU (sd, 0)) -> mask;
166 }
167
168 static void
169 h8_set_mask (SIM_DESC sd, int val)
170 {
171   (STATE_CPU (sd, 0)) -> mask = val;
172 }
173 #if 0
174 static int
175 h8_get_exception (SIM_DESC sd)
176 {
177   return (STATE_CPU (sd, 0)) -> exception;
178 }
179
180 static void
181 h8_set_exception (SIM_DESC sd, int val)
182 {
183   (STATE_CPU (sd, 0)) -> exception = val;
184 }
185
186 static enum h8300_sim_state
187 h8_get_state (SIM_DESC sd)
188 {
189   return sd -> state;
190 }
191
192 static void
193 h8_set_state (SIM_DESC sd, enum h8300_sim_state val)
194 {
195   sd -> state = val;
196 }
197 #endif
198 static unsigned int
199 h8_get_cycles (SIM_DESC sd)
200 {
201   return (STATE_CPU (sd, 0)) -> regs[CYCLE_REGNUM];
202 }
203
204 static void
205 h8_set_cycles (SIM_DESC sd, unsigned int val)
206 {
207   (STATE_CPU (sd, 0)) -> regs[CYCLE_REGNUM] = val;
208 }
209
210 static unsigned int
211 h8_get_insts (SIM_DESC sd)
212 {
213   return (STATE_CPU (sd, 0)) -> regs[INST_REGNUM];
214 }
215
216 static void
217 h8_set_insts (SIM_DESC sd, unsigned int val)
218 {
219   (STATE_CPU (sd, 0)) -> regs[INST_REGNUM] = val;
220 }
221
222 static unsigned int
223 h8_get_ticks (SIM_DESC sd)
224 {
225   return (STATE_CPU (sd, 0)) -> regs[TICK_REGNUM];
226 }
227
228 static void
229 h8_set_ticks (SIM_DESC sd, unsigned int val)
230 {
231   (STATE_CPU (sd, 0)) -> regs[TICK_REGNUM] = val;
232 }
233
234 static unsigned int
235 h8_get_mach (SIM_DESC sd)
236 {
237   return (STATE_CPU (sd, 0)) -> regs[MACH_REGNUM];
238 }
239
240 static void
241 h8_set_mach (SIM_DESC sd, unsigned int val)
242 {
243   (STATE_CPU (sd, 0)) -> regs[MACH_REGNUM] = val;
244 }
245
246 static unsigned int
247 h8_get_macl (SIM_DESC sd)
248 {
249   return (STATE_CPU (sd, 0)) -> regs[MACL_REGNUM];
250 }
251
252 static void
253 h8_set_macl (SIM_DESC sd, unsigned int val)
254 {
255   (STATE_CPU (sd, 0)) -> regs[MACL_REGNUM] = val;
256 }
257
258 static int
259 h8_get_compiles (SIM_DESC sd)
260 {
261   return sd -> compiles;
262 }
263
264 static void
265 h8_increment_compiles (SIM_DESC sd)
266 {
267   sd -> compiles ++;
268 }
269
270 static unsigned int *
271 h8_get_reg_buf (SIM_DESC sd)
272 {
273   return &(((STATE_CPU (sd, 0)) -> regs)[0]);
274 }
275
276 static unsigned int
277 h8_get_reg (SIM_DESC sd, int regnum)
278 {
279   return (STATE_CPU (sd, 0)) -> regs[regnum];
280 }
281
282 static void
283 h8_set_reg (SIM_DESC sd, int regnum, int val)
284 {
285   (STATE_CPU (sd, 0)) -> regs[regnum] = val;
286 }
287
288 #ifdef ADEBUG
289 static int
290 h8_get_stats (SIM_DESC sd, int idx)
291 {
292   return sd -> stats[idx];
293 }
294
295 static void
296 h8_increment_stats (SIM_DESC sd, int idx)
297 {
298   sd -> stats[idx] ++;
299 }
300 #endif /* ADEBUG */
301
302 static unsigned short *
303 h8_get_cache_idx_buf (SIM_DESC sd)
304 {
305   return sd -> cache_idx;
306 }
307
308 static void
309 h8_set_cache_idx_buf (SIM_DESC sd, unsigned short *ptr)
310 {
311   sd -> cache_idx = ptr;
312 }
313
314 static unsigned short
315 h8_get_cache_idx (SIM_DESC sd, unsigned int idx)
316 {
317   if (idx > sd->memory_size)
318     return (unsigned short) -1;
319   return sd -> cache_idx[idx];
320 }
321
322 static void
323 h8_set_cache_idx (SIM_DESC sd, int idx, unsigned int val)
324 {
325   sd -> cache_idx[idx] = (unsigned short) val;
326 }
327
328 static unsigned char *
329 h8_get_memory_buf (SIM_DESC sd)
330 {
331   return (STATE_CPU (sd, 0)) -> memory;
332 }
333
334 static void
335 h8_set_memory_buf (SIM_DESC sd, unsigned char *ptr)
336 {
337   (STATE_CPU (sd, 0)) -> memory = ptr;
338 }
339
340 static unsigned char
341 h8_get_memory (SIM_DESC sd, int idx)
342 {
343   return (STATE_CPU (sd, 0)) -> memory[idx];
344 }
345
346 static void
347 h8_set_memory (SIM_DESC sd, int idx, unsigned int val)
348 {
349   (STATE_CPU (sd, 0)) -> memory[idx] = (unsigned char) val;
350 }
351
352 static unsigned char *
353 h8_get_eightbit_buf (SIM_DESC sd)
354 {
355   return (STATE_CPU (sd, 0)) -> eightbit;
356 }
357
358 static void
359 h8_set_eightbit_buf (SIM_DESC sd, unsigned char *ptr)
360 {
361   (STATE_CPU (sd, 0)) -> eightbit = ptr;
362 }
363
364 static unsigned char
365 h8_get_eightbit (SIM_DESC sd, int idx)
366 {
367   return (STATE_CPU (sd, 0)) -> eightbit[idx];
368 }
369
370 static void
371 h8_set_eightbit (SIM_DESC sd, int idx, unsigned int val)
372 {
373   (STATE_CPU (sd, 0)) -> eightbit[idx] = (unsigned char) val;
374 }
375
376 static unsigned int
377 h8_get_delayed_branch (SIM_DESC sd)
378 {
379   return (STATE_CPU (sd, 0)) -> delayed_branch;
380 }
381
382 static void
383 h8_set_delayed_branch (SIM_DESC sd, unsigned int dest)
384 {
385   (STATE_CPU (sd, 0)) -> delayed_branch = dest;
386 }
387
388 static char **
389 h8_get_command_line (SIM_DESC sd)
390 {
391   return (STATE_CPU (sd, 0)) -> command_line;
392 }
393
394 static void
395 h8_set_command_line (SIM_DESC sd, char ** val)
396 {
397   (STATE_CPU (sd, 0)) -> command_line = val;
398 }
399
400 static char *
401 h8_get_cmdline_arg (SIM_DESC sd, int index)
402 {
403   return (STATE_CPU (sd, 0)) -> command_line[index];
404 }
405
406 static void
407 h8_set_cmdline_arg (SIM_DESC sd, int index, char * val)
408 {
409   (STATE_CPU (sd, 0)) -> command_line[index] = val;
410 }
411
412 /* MAC Saturation Mode */
413 static int
414 h8_get_macS (SIM_DESC sd)
415 {
416   return (STATE_CPU (sd, 0)) -> macS;
417 }
418
419 static void
420 h8_set_macS (SIM_DESC sd, int val)
421 {
422   (STATE_CPU (sd, 0)) -> macS = (val != 0);
423 }
424
425 /* MAC Zero Flag */
426 static int
427 h8_get_macZ (SIM_DESC sd)
428 {
429   return (STATE_CPU (sd, 0)) -> macZ;
430 }
431
432 static void
433 h8_set_macZ (SIM_DESC sd, int val)
434 {
435   (STATE_CPU (sd, 0)) -> macZ = (val != 0);
436 }
437
438 /* MAC Negative Flag */
439 static int
440 h8_get_macN (SIM_DESC sd)
441 {
442   return (STATE_CPU (sd, 0)) -> macN;
443 }
444
445 static void
446 h8_set_macN (SIM_DESC sd, int val)
447 {
448   (STATE_CPU (sd, 0)) -> macN = (val != 0);
449 }
450
451 /* MAC Overflow Flag */
452 static int
453 h8_get_macV (SIM_DESC sd)
454 {
455   return (STATE_CPU (sd, 0)) -> macV;
456 }
457
458 static void
459 h8_set_macV (SIM_DESC sd, int val)
460 {
461   (STATE_CPU (sd, 0)) -> macV = (val != 0);
462 }
463
464 /* End CPU data object.  */
465
466 /* The rate at which to call the host's poll_quit callback.  */
467
468 enum { POLL_QUIT_INTERVAL = 0x80000 };
469
470 #define LOW_BYTE(x) ((x) & 0xff)
471 #define HIGH_BYTE(x) (((x) >> 8) & 0xff)
472 #define P(X, Y) ((X << 8) | Y)
473
474 #define C (c != 0)
475 #define Z (nz == 0)
476 #define V (v != 0)
477 #define N (n != 0)
478 #define U (u != 0)
479 #define H (h != 0)
480 #define UI (ui != 0)
481 #define I (intMaskBit != 0)
482
483 #define BUILDSR(SD)                                             \
484   h8_set_ccr (SD, (I << 7) | (UI << 6) | (H << 5) | (U << 4)    \
485              | (N << 3) | (Z << 2) | (V << 1) | C)
486
487 #define GETSR(SD) \
488   /* Get Status Register (flags).  */           \
489   c = (h8_get_ccr (sd) >> 0) & 1;               \
490   v = (h8_get_ccr (sd) >> 1) & 1;               \
491   nz = !((h8_get_ccr (sd) >> 2) & 1);           \
492   n = (h8_get_ccr (sd) >> 3) & 1;               \
493   u = (h8_get_ccr (sd) >> 4) & 1;               \
494   h = (h8_get_ccr (sd) >> 5) & 1;               \
495   ui = ((h8_get_ccr (sd) >> 6) & 1);            \
496   intMaskBit = (h8_get_ccr (sd) >> 7) & 1
497
498
499 #ifdef __CHAR_IS_SIGNED__
500 #define SEXTCHAR(x) ((char) (x))
501 #endif
502
503 #ifndef SEXTCHAR
504 #define SEXTCHAR(x) ((x & 0x80) ? (x | ~0xff) : x & 0xff)
505 #endif
506
507 #define UEXTCHAR(x) ((x) & 0xff)
508 #define UEXTSHORT(x) ((x) & 0xffff)
509 #define SEXTSHORT(x) ((short) (x))
510
511 int h8300hmode  = 0;
512 int h8300smode  = 0;
513 int h8300_normal_mode  = 0;
514 int h8300sxmode = 0;
515
516 static int memory_size;
517
518 static int
519 get_now (void)
520 {
521   return time (0);      /* WinXX HAS UNIX like 'time', so why not use it? */
522 }
523
524 static int
525 now_persec (void)
526 {
527   return 1;
528 }
529
530 static int
531 bitfrom (int x)
532 {
533   switch (x & SIZE)
534     {
535     case L_8:
536       return SB;
537     case L_16:
538     case L_16U:
539       return SW;
540     case L_32:
541       return SL;
542     case L_P:
543       return (h8300hmode && !h8300_normal_mode)? SL : SW;
544     }
545   return 0;
546 }
547
548 /* Simulate an indirection / dereference.  
549    return 0 for success, -1 for failure.
550 */
551
552 static unsigned int
553 lvalue (SIM_DESC sd, int x, int rn, unsigned int *val)
554 {
555   if (val == NULL)      /* Paranoia.  */
556     return -1;
557
558   switch (x / 4)
559     {
560     case OP_DISP:
561       if (rn == ZERO_REGNUM)
562         *val = X (OP_IMM, SP);
563       else
564         *val = X (OP_REG, SP);
565       break;
566     case OP_MEM:
567       *val = X (OP_MEM, SP);
568       break;
569     default:
570       sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
571       return -1;
572     }
573   return 0;
574 }
575
576 static int
577 cmdline_location()
578 {
579   if (h8300smode && !h8300_normal_mode)
580     return 0xffff00L;
581   else if (h8300hmode && !h8300_normal_mode)
582     return 0x2ff00L;
583   else
584     return 0xff00L;
585 }
586
587 static void
588 decode (SIM_DESC sd, int addr, unsigned char *data, decoded_inst *dst)
589 {
590   int cst[3]   = {0, 0, 0};
591   int reg[3]   = {0, 0, 0};
592   int rdisp[3] = {0, 0, 0};
593   int opnum;
594   const struct h8_opcode *q;
595
596   dst->dst.type = -1;
597   dst->src.type = -1;
598
599   /* Find the exact opcode/arg combo.  */
600   for (q = h8_opcodes; q->name; q++)
601     {
602       op_type *nib = q->data.nib;
603       unsigned int len = 0;
604
605       if ((q->available == AV_H8SX && !h8300sxmode) ||
606           (q->available == AV_H8S  && !h8300smode)  ||
607           (q->available == AV_H8H  && !h8300hmode))
608         continue;
609
610       cst[0]   = cst[1]   = cst[2]   = 0;
611       reg[0]   = reg[1]   = reg[2]   = 0;
612       rdisp[0] = rdisp[1] = rdisp[2] = 0;
613
614       while (1)
615         {
616           op_type looking_for = *nib;
617           int thisnib = data[len / 2];
618
619           thisnib = (len & 1) ? (thisnib & 0xf) : ((thisnib >> 4) & 0xf);
620           opnum = ((looking_for & OP3) ? 2 :
621                    (looking_for & DST) ? 1 : 0);
622
623           if (looking_for < 16 && looking_for >= 0)
624             {
625               if (looking_for != thisnib)
626                 goto fail;
627             }
628           else
629             {
630               if (looking_for & B31)
631                 {
632                   if (!((thisnib & 0x8) != 0))
633                     goto fail;
634
635                   looking_for = (op_type) (looking_for & ~B31);
636                   thisnib &= 0x7;
637                 }
638               else if (looking_for & B30)
639                 {
640                   if (!((thisnib & 0x8) == 0))
641                     goto fail;
642
643                   looking_for = (op_type) (looking_for & ~B30);
644                 }
645
646               if (looking_for & B21)
647                 {
648                   if (!((thisnib & 0x4) != 0))
649                     goto fail;
650
651                   looking_for = (op_type) (looking_for & ~B21);
652                   thisnib &= 0xb;
653                 }
654               else if (looking_for & B20)
655                 {
656                   if (!((thisnib & 0x4) == 0))
657                     goto fail;
658
659                   looking_for = (op_type) (looking_for & ~B20);
660                 }
661
662               if (looking_for & B11)
663                 {
664                   if (!((thisnib & 0x2) != 0))
665                     goto fail;
666
667                   looking_for = (op_type) (looking_for & ~B11);
668                   thisnib &= 0xd;
669                 }
670               else if (looking_for & B10)
671                 {
672                   if (!((thisnib & 0x2) == 0))
673                     goto fail;
674
675                   looking_for = (op_type) (looking_for & ~B10);
676                 }
677
678               if (looking_for & B01)
679                 {
680                   if (!((thisnib & 0x1) != 0))
681                     goto fail;
682
683                   looking_for = (op_type) (looking_for & ~B01);
684                   thisnib &= 0xe;
685                 }
686               else if (looking_for & B00)
687                 {
688                   if (!((thisnib & 0x1) == 0))
689                     goto fail;
690
691                   looking_for = (op_type) (looking_for & ~B00);
692                 }
693
694               if (looking_for & IGNORE)
695                 {
696                   /* Hitachi has declared that IGNORE must be zero.  */
697                   if (thisnib != 0)
698                     goto fail;
699                 }
700               else if ((looking_for & MODE) == DATA)
701                 {
702                   ;                     /* Skip embedded data.  */
703                 }
704               else if ((looking_for & MODE) == DBIT)
705                 {
706                   /* Exclude adds/subs by looking at bit 0 and 2, and
707                      make sure the operand size, either w or l,
708                      matches by looking at bit 1.  */
709                   if ((looking_for & 7) != (thisnib & 7))
710                     goto fail;
711
712                   cst[opnum] = (thisnib & 0x8) ? 2 : 1;
713                 }
714               else if ((looking_for & MODE) == REG     ||
715                        (looking_for & MODE) == LOWREG  ||
716                        (looking_for & MODE) == IND     ||
717                        (looking_for & MODE) == PREINC  ||
718                        (looking_for & MODE) == POSTINC ||
719                        (looking_for & MODE) == PREDEC  ||
720                        (looking_for & MODE) == POSTDEC)
721                 {
722                   reg[opnum] = thisnib;
723                 }
724               else if (looking_for & CTRL)
725                 {
726                   thisnib &= 7;
727                   if (((looking_for & MODE) == CCR  && (thisnib != C_CCR))  ||
728                       ((looking_for & MODE) == EXR  && (thisnib != C_EXR))  ||
729                       ((looking_for & MODE) == MACH && (thisnib != C_MACH)) ||
730                       ((looking_for & MODE) == MACL && (thisnib != C_MACL)) ||
731                       ((looking_for & MODE) == VBR  && (thisnib != C_VBR))  ||
732                       ((looking_for & MODE) == SBR  && (thisnib != C_SBR)))
733                     goto fail;
734                   if (((looking_for & MODE) == CCR_EXR && 
735                        (thisnib != C_CCR && thisnib != C_EXR)) ||
736                       ((looking_for & MODE) == VBR_SBR && 
737                        (thisnib != C_VBR && thisnib != C_SBR)) ||
738                       ((looking_for & MODE) == MACREG && 
739                        (thisnib != C_MACH && thisnib != C_MACL)))
740                     goto fail;
741                   if (((looking_for & MODE) == CC_EX_VB_SB && 
742                        (thisnib != C_CCR && thisnib != C_EXR &&
743                         thisnib != C_VBR && thisnib != C_SBR)))
744                     goto fail;
745
746                   reg[opnum] = thisnib;
747                 }
748               else if ((looking_for & MODE) == ABS)
749                 {
750                   /* Absolute addresses are unsigned.  */
751                   switch (looking_for & SIZE)
752                     {
753                     case L_8:
754                       cst[opnum] = UEXTCHAR (data[len / 2]);
755                       break;
756                     case L_16:
757                     case L_16U:
758                       cst[opnum] = (data[len / 2] << 8) + data[len / 2 + 1];
759                       break;
760                     case L_32:
761                       cst[opnum] = 
762                         (data[len / 2 + 0] << 24) + 
763                         (data[len / 2 + 1] << 16) +
764                         (data[len / 2 + 2] <<  8) +  
765                         (data[len / 2 + 3]);
766                       break;
767                     default:
768                       printf ("decode: bad size ABS: %d\n", 
769                               (looking_for & SIZE));
770                       goto end;
771                     }
772                 }
773               else if ((looking_for & MODE) == DISP   ||
774                        (looking_for & MODE) == PCREL  ||
775                        (looking_for & MODE) == INDEXB ||
776                        (looking_for & MODE) == INDEXW ||
777                        (looking_for & MODE) == INDEXL)
778                 {
779                   switch (looking_for & SIZE)
780                     {
781                     case L_2:
782                       cst[opnum] = thisnib & 3;
783                       break;
784                     case L_8:
785                       cst[opnum] = SEXTCHAR (data[len / 2]);
786                       break;
787                     case L_16:
788                       cst[opnum] = (data[len / 2] << 8) + data[len / 2 + 1];
789                       cst[opnum] = (short) cst[opnum];  /* Sign extend.  */
790                       break;
791                     case L_16U:
792                       cst[opnum] = (data[len / 2] << 8) + data[len / 2 + 1];
793                       break;
794                     case L_32:
795                       cst[opnum] = 
796                         (data[len / 2 + 0] << 24) + 
797                         (data[len / 2 + 1] << 16) +
798                         (data[len / 2 + 2] <<  8) +  
799                         (data[len / 2 + 3]);
800                       break;
801                     default:
802                       printf ("decode: bad size DISP/PCREL/INDEX: %d\n", 
803                               (looking_for & SIZE));
804                       goto end;
805                     }
806                 }
807               else if ((looking_for & SIZE) == L_16 ||
808                        (looking_for & SIZE) == L_16U)
809                 {
810                   cst[opnum] = (data[len / 2] << 8) + data[len / 2 + 1];
811                   /* Immediates are always unsigned.  */
812                   if ((looking_for & SIZE) != L_16U &&
813                       (looking_for & MODE) != IMM)
814                     cst[opnum] = (short) cst[opnum];    /* Sign extend.  */
815                 }
816               else if (looking_for & ABSJMP)
817                 {
818                   switch (looking_for & SIZE) {
819                   case L_24:
820                     cst[opnum] = (data[1] << 16) | (data[2] << 8) | (data[3]);
821                     break;
822                   case L_32:
823                     cst[opnum] = 
824                       (data[len / 2 + 0] << 24) + 
825                       (data[len / 2 + 1] << 16) +
826                       (data[len / 2 + 2] <<  8) +  
827                       (data[len / 2 + 3]);
828                     break;
829                   default:
830                     printf ("decode: bad size ABSJMP: %d\n", 
831                             (looking_for & SIZE));
832                       goto end;
833                   }
834                 }
835               else if ((looking_for & MODE) == MEMIND)
836                 {
837                   cst[opnum] = data[1];
838                 }
839               else if ((looking_for & MODE) == VECIND)
840                 {
841                   if(h8300_normal_mode)
842                     cst[opnum] = ((data[1] & 0x7f) + 0x80) * 2;
843                   else
844                     cst[opnum] = ((data[1] & 0x7f) + 0x80) * 4;
845                   cst[opnum] += h8_get_vbr (sd); /* Add vector base reg.  */
846                 }
847               else if ((looking_for & SIZE) == L_32)
848                 {
849                   int i = len / 2;
850
851                   cst[opnum] = 
852                     (data[i + 0] << 24) |
853                     (data[i + 1] << 16) |
854                     (data[i + 2] <<  8) |
855                     (data[i + 3]);
856                 }
857               else if ((looking_for & SIZE) == L_24)
858                 {
859                   int i = len / 2;
860
861                   cst[opnum] = 
862                     (data[i + 0] << 16) | 
863                     (data[i + 1] << 8) | 
864                     (data[i + 2]);
865                 }
866               else if (looking_for & DISPREG)
867                 {
868                   rdisp[opnum] = thisnib & 0x7;
869                 }
870               else if ((looking_for & MODE) == KBIT)
871                 {
872                   switch (thisnib)
873                     {
874                     case 9:
875                       cst[opnum] = 4;
876                       break;
877                     case 8:
878                       cst[opnum] = 2;
879                       break;
880                     case 0:
881                       cst[opnum] = 1;
882                       break;
883                     default:
884                       goto fail;
885                     }
886                 }
887               else if ((looking_for & SIZE) == L_8)
888                 {
889                   if ((looking_for & MODE) == ABS)
890                     {
891                       /* Will be combined with contents of SBR_REGNUM
892                          by fetch ().  For all modes except h8sx, this
893                          will always contain the value 0xFFFFFF00.  */
894                       cst[opnum] = data[len / 2] & 0xff;
895                     }
896                   else
897                     {
898                       cst[opnum] = data[len / 2] & 0xff;
899                     }
900                 }
901               else if ((looking_for & SIZE) == L_2)
902                 {
903                   cst[opnum] = thisnib & 3;
904                 }
905               else if ((looking_for & SIZE) == L_3 ||
906                        (looking_for & SIZE) == L_3NZ)
907                 {
908                   cst[opnum] = thisnib & 7;
909                   if (cst[opnum] == 0 && (looking_for & SIZE) == L_3NZ)
910                     goto fail;
911                 }
912               else if ((looking_for & SIZE) == L_4)
913                 {
914                   cst[opnum] = thisnib & 15;
915                 }
916               else if ((looking_for & SIZE) == L_5)
917                 {
918                   cst[opnum] = data[len / 2] & 0x1f;
919                 }
920               else if (looking_for == E)
921                 {
922 #ifdef ADEBUG
923                   dst->op = q;
924 #endif
925                   /* Fill in the args.  */
926                   {
927                     op_type *args = q->args.nib;
928                     int hadone = 0;
929                     int nargs;
930
931                     for (nargs = 0; 
932                          nargs < 3 && *args != E; 
933                          nargs++)
934                       {
935                         int x = *args;
936                         ea_type *p;
937
938                         opnum = ((x & OP3) ? 2 :
939                                  (x & DST) ? 1 : 0);
940                         if (x & DST)
941                           p = &dst->dst;
942                         else if (x & OP3)
943                           p = &dst->op3;
944                         else
945                           p = &dst->src;
946
947                         if ((x & MODE) == IMM  ||
948                             (x & MODE) == KBIT ||
949                             (x & MODE) == DBIT)
950                           {
951                             /* Use the instruction to determine 
952                                the operand size.  */
953                             p->type = X (OP_IMM, OP_SIZE (q->how));
954                             p->literal = cst[opnum];
955                           }
956                         else if ((x & MODE) == CONST_2 ||
957                                  (x & MODE) == CONST_4 ||
958                                  (x & MODE) == CONST_8 ||
959                                  (x & MODE) == CONST_16)
960                           {
961                             /* Use the instruction to determine 
962                                the operand size.  */
963                             p->type = X (OP_IMM, OP_SIZE (q->how));
964                             switch (x & MODE) {
965                             case CONST_2:       p->literal =  2; break;
966                             case CONST_4:       p->literal =  4; break;
967                             case CONST_8:       p->literal =  8; break;
968                             case CONST_16:      p->literal = 16; break;
969                             }
970                           }
971                         else if ((x & MODE) == REG)
972                           {
973                             p->type = X (OP_REG, bitfrom (x));
974                             p->reg = reg[opnum];
975                           }
976                         else if ((x & MODE) == LOWREG)
977                           {
978                             p->type = X (OP_LOWREG, bitfrom (x));
979                             p->reg = reg[opnum];
980                           }
981                         else if ((x & MODE) == PREINC)
982                           {
983                             /* Use the instruction to determine 
984                                the operand size.  */
985                             p->type = X (OP_PREINC, OP_SIZE (q->how));
986                             p->reg = reg[opnum] & 0x7;
987                           }
988                         else if ((x & MODE) == POSTINC)
989                           {
990                             /* Use the instruction to determine 
991                                the operand size.  */
992                             p->type = X (OP_POSTINC, OP_SIZE (q->how));
993                             p->reg = reg[opnum] & 0x7;
994                           }
995                         else if ((x & MODE) == PREDEC)
996                           {
997                             /* Use the instruction to determine 
998                                the operand size.  */
999                             p->type = X (OP_PREDEC, OP_SIZE (q->how));
1000                             p->reg = reg[opnum] & 0x7;
1001                           }
1002                         else if ((x & MODE) == POSTDEC)
1003                           {
1004                             /* Use the instruction to determine 
1005                                the operand size.  */
1006                             p->type = X (OP_POSTDEC, OP_SIZE (q->how));
1007                             p->reg = reg[opnum] & 0x7;
1008                           }
1009                         else if ((x & MODE) == IND)
1010                           {
1011                             /* Note: an indirect is transformed into
1012                                a displacement of zero.  
1013                             */
1014                             /* Use the instruction to determine 
1015                                the operand size.  */
1016                             p->type = X (OP_DISP, OP_SIZE (q->how));
1017                             p->reg = reg[opnum] & 0x7;
1018                             p->literal = 0;
1019                             if (OP_KIND (q->how) == O_JSR ||
1020                                 OP_KIND (q->how) == O_JMP)
1021                               if (lvalue (sd, p->type, p->reg, &p->type))
1022                                 goto end;
1023                           }
1024                         else if ((x & MODE) == ABS)
1025                           {
1026                             /* Note: a 16 or 32 bit ABS is transformed into a 
1027                                displacement from pseudo-register ZERO_REGNUM,
1028                                which is always zero.  An 8 bit ABS becomes
1029                                a displacement from SBR_REGNUM.
1030                             */
1031                             /* Use the instruction to determine 
1032                                the operand size.  */
1033                             p->type = X (OP_DISP, OP_SIZE (q->how));
1034                             p->literal = cst[opnum];
1035
1036                             /* 8-bit ABS is displacement from SBR.
1037                                16 and 32-bit ABS are displacement from ZERO.
1038                                (SBR will always be zero except for h8/sx)
1039                             */
1040                             if ((x & SIZE) == L_8)
1041                               p->reg = SBR_REGNUM;
1042                             else
1043                               p->reg = ZERO_REGNUM;;
1044                           }
1045                         else if ((x & MODE) == MEMIND ||
1046                                  (x & MODE) == VECIND)
1047                           {
1048                             /* Size doesn't matter.  */
1049                             p->type = X (OP_MEM, SB);
1050                             p->literal = cst[opnum];
1051                             if (OP_KIND (q->how) == O_JSR ||
1052                                 OP_KIND (q->how) == O_JMP)
1053                               if (lvalue (sd, p->type, p->reg, &p->type))
1054                                 goto end;
1055                           }
1056                         else if ((x & MODE) == PCREL)
1057                           {
1058                             /* Size doesn't matter.  */
1059                             p->type = X (OP_PCREL, SB);
1060                             p->literal = cst[opnum];
1061                           }
1062                         else if (x & ABSJMP)
1063                           {
1064                             p->type = X (OP_IMM, SP);
1065                             p->literal = cst[opnum];
1066                           }
1067                         else if ((x & MODE) == INDEXB)
1068                           {
1069                             p->type = X (OP_INDEXB, OP_SIZE (q->how));
1070                             p->literal = cst[opnum];
1071                             p->reg     = rdisp[opnum];
1072                           }
1073                         else if ((x & MODE) == INDEXW)
1074                           {
1075                             p->type = X (OP_INDEXW, OP_SIZE (q->how));
1076                             p->literal = cst[opnum];
1077                             p->reg     = rdisp[opnum];
1078                           }
1079                         else if ((x & MODE) == INDEXL)
1080                           {
1081                             p->type = X (OP_INDEXL, OP_SIZE (q->how));
1082                             p->literal = cst[opnum];
1083                             p->reg     = rdisp[opnum];
1084                           }
1085                         else if ((x & MODE) == DISP)
1086                           {
1087                             /* Yuck -- special for mova args.  */
1088                             if (strncmp (q->name, "mova", 4) == 0 &&
1089                                 (x & SIZE) == L_2)
1090                               {
1091                                 /* Mova can have a DISP2 dest, with an
1092                                    INDEXB or INDEXW src.  The multiplier
1093                                    for the displacement value is determined
1094                                    by the src operand, not by the insn.  */
1095
1096                                 switch (OP_KIND (dst->src.type))
1097                                   {
1098                                   case OP_INDEXB:
1099                                     p->type = X (OP_DISP, SB);
1100                                     p->literal = cst[opnum];
1101                                     break;
1102                                   case OP_INDEXW:
1103                                     p->type = X (OP_DISP, SW);
1104                                     p->literal = cst[opnum] * 2;
1105                                     break;
1106                                   default:
1107                                     goto fail;
1108                                   }
1109                               }
1110                             else
1111                               {
1112                                 p->type = X (OP_DISP,   OP_SIZE (q->how));
1113                                 p->literal = cst[opnum];
1114                                 /* DISP2 is special.  */
1115                                 if ((x & SIZE) == L_2)
1116                                   switch (OP_SIZE (q->how))
1117                                     {
1118                                     case SB:                  break;
1119                                     case SW: p->literal *= 2; break;
1120                                     case SL: p->literal *= 4; break;
1121                                     }
1122                               }
1123                             p->reg     = rdisp[opnum];
1124                           }
1125                         else if (x & CTRL)
1126                           {
1127                             switch (reg[opnum])
1128                               {
1129                               case C_CCR:
1130                                 p->type = X (OP_CCR, SB);
1131                                 break;
1132                               case C_EXR:
1133                                 p->type = X (OP_EXR, SB);
1134                                 break;
1135                               case C_MACH:
1136                                 p->type = X (OP_MACH, SL);
1137                                 break;
1138                               case C_MACL:
1139                                 p->type = X (OP_MACL, SL);
1140                                 break;
1141                               case C_VBR:
1142                                 p->type = X (OP_VBR, SL);
1143                                 break;
1144                               case C_SBR:
1145                                 p->type = X (OP_SBR, SL);
1146                                 break;
1147                               }
1148                           }
1149                         else if ((x & MODE) == CCR)
1150                           {
1151                             p->type = OP_CCR;
1152                           }
1153                         else if ((x & MODE) == EXR)
1154                           {
1155                             p->type = OP_EXR;
1156                           }
1157                         else
1158                           printf ("Hmmmm 0x%x...\n", x);
1159
1160                         args++;
1161                       }
1162                   }
1163
1164                   /* Unary operators: treat src and dst as equivalent.  */
1165                   if (dst->dst.type == -1)
1166                     dst->dst = dst->src;
1167                   if (dst->src.type == -1)
1168                     dst->src = dst->dst;
1169
1170                   dst->opcode = q->how;
1171                   dst->cycles = q->time;
1172
1173                   /* And jsr's to these locations are turned into 
1174                      magic traps.  */
1175
1176                   if (OP_KIND (dst->opcode) == O_JSR)
1177                     {
1178                       switch (dst->src.literal)
1179                         {
1180                         case 0xc5:
1181                           dst->opcode = O (O_SYS_OPEN, SB);
1182                           break;
1183                         case 0xc6:
1184                           dst->opcode = O (O_SYS_READ, SB);
1185                           break;
1186                         case 0xc7:
1187                           dst->opcode = O (O_SYS_WRITE, SB);
1188                           break;
1189                         case 0xc8:
1190                           dst->opcode = O (O_SYS_LSEEK, SB);
1191                           break;
1192                         case 0xc9:
1193                           dst->opcode = O (O_SYS_CLOSE, SB);
1194                           break;
1195                         case 0xca:
1196                           dst->opcode = O (O_SYS_STAT, SB);
1197                           break;
1198                         case 0xcb:
1199                           dst->opcode = O (O_SYS_FSTAT, SB);
1200                           break;
1201                         case 0xcc:
1202                           dst->opcode = O (O_SYS_CMDLINE, SB);
1203                           break;
1204                         }
1205                       /* End of Processing for system calls.  */
1206                     }
1207
1208                   dst->next_pc = addr + len / 2;
1209                   return;
1210                 }
1211               else
1212                 printf ("Don't understand 0x%x \n", looking_for);
1213             }
1214
1215           len++;
1216           nib++;
1217         }
1218
1219     fail:
1220       ;
1221     }
1222  end:
1223   /* Fell off the end.  */
1224   dst->opcode = O (O_ILL, SB);
1225 }
1226
1227 static void
1228 compile (SIM_DESC sd, int pc)
1229 {
1230   int idx;
1231
1232   /* Find the next cache entry to use.  */
1233   idx = h8_get_cache_top (sd) + 1;
1234   h8_increment_compiles (sd);
1235   if (idx >= sd->sim_cache_size)
1236     {
1237       idx = 1;
1238     }
1239   h8_set_cache_top (sd, idx);
1240
1241   /* Throw away its old meaning.  */
1242   h8_set_cache_idx (sd, sd->sim_cache[idx].oldpc, 0);
1243
1244   /* Set to new address.  */
1245   sd->sim_cache[idx].oldpc = pc;
1246
1247   /* Fill in instruction info.  */
1248   decode (sd, pc, h8_get_memory_buf (sd) + pc, sd->sim_cache + idx);
1249
1250   /* Point to new cache entry.  */
1251   h8_set_cache_idx (sd, pc, idx);
1252 }
1253
1254
1255 static unsigned char  *breg[32];
1256 static unsigned short *wreg[16];
1257 static unsigned int   *lreg[18];
1258
1259 #define GET_B_REG(X)     *(breg[X])
1260 #define SET_B_REG(X, Y) (*(breg[X])) = (Y)
1261 #define GET_W_REG(X)     *(wreg[X])
1262 #define SET_W_REG(X, Y) (*(wreg[X])) = (Y)
1263 #define GET_L_REG(X)     h8_get_reg (sd, X)
1264 #define SET_L_REG(X, Y)  h8_set_reg (sd, X, Y)
1265
1266 #define GET_MEMORY_L(X) \
1267   ((X) < memory_size \
1268    ? ((h8_get_memory (sd, (X)+0) << 24) | (h8_get_memory (sd, (X)+1) << 16)  \
1269     | (h8_get_memory (sd, (X)+2) <<  8) | (h8_get_memory (sd, (X)+3) <<  0)) \
1270    : ((h8_get_eightbit (sd, ((X)+0) & 0xff) << 24) \
1271     | (h8_get_eightbit (sd, ((X)+1) & 0xff) << 16) \
1272     | (h8_get_eightbit (sd, ((X)+2) & 0xff) <<  8) \
1273     | (h8_get_eightbit (sd, ((X)+3) & 0xff) <<  0)))
1274
1275 #define GET_MEMORY_W(X) \
1276   ((X) < memory_size \
1277    ? ((h8_get_memory   (sd, (X)+0) << 8) \
1278     | (h8_get_memory   (sd, (X)+1) << 0)) \
1279    : ((h8_get_eightbit (sd, ((X)+0) & 0xff) << 8) \
1280     | (h8_get_eightbit (sd, ((X)+1) & 0xff) << 0)))
1281
1282
1283 #define GET_MEMORY_B(X) \
1284   ((X) < memory_size ? (h8_get_memory   (sd, (X))) \
1285                      : (h8_get_eightbit (sd, (X) & 0xff)))
1286
1287 #define SET_MEMORY_L(X, Y)  \
1288 {  register unsigned char *_p; register int __y = (Y); \
1289    _p = ((X) < memory_size ? h8_get_memory_buf   (sd) +  (X) : \
1290                              h8_get_eightbit_buf (sd) + ((X) & 0xff)); \
1291    _p[0] = __y >> 24; _p[1] = __y >> 16; \
1292    _p[2] = __y >>  8; _p[3] = __y >>  0; \
1293 }
1294
1295 #define SET_MEMORY_W(X, Y) \
1296 {  register unsigned char *_p; register int __y = (Y); \
1297    _p = ((X) < memory_size ? h8_get_memory_buf   (sd) +  (X) : \
1298                              h8_get_eightbit_buf (sd) + ((X) & 0xff)); \
1299    _p[0] = __y >> 8; _p[1] = __y; \
1300 }
1301
1302 #define SET_MEMORY_B(X, Y) \
1303   ((X) < memory_size ? (h8_set_memory   (sd, (X), (Y))) \
1304                      : (h8_set_eightbit (sd, (X) & 0xff, (Y))))
1305
1306 /* Simulate a memory fetch.
1307    Return 0 for success, -1 for failure.
1308 */
1309
1310 static int
1311 fetch_1 (SIM_DESC sd, ea_type *arg, int *val, int twice)
1312 {
1313   int rn = arg->reg;
1314   int abs = arg->literal;
1315   int r;
1316   int t;
1317
1318   if (val == NULL)
1319     return -1;          /* Paranoia.  */
1320
1321   switch (arg->type)
1322     {
1323       /* Indexed register plus displacement mode:
1324
1325          This new family of addressing modes are similar to OP_DISP
1326          (register plus displacement), with two differences:
1327            1) INDEXB uses only the least significant byte of the register,
1328               INDEXW uses only the least significant word, and
1329               INDEXL uses the entire register (just like OP_DISP).
1330          and
1331            2) The displacement value in abs is multiplied by two
1332               for SW-sized operations, and by four for SL-size.
1333
1334         This gives nine possible variations.
1335       */
1336
1337     case X (OP_INDEXB, SB):
1338     case X (OP_INDEXB, SW):
1339     case X (OP_INDEXB, SL):
1340     case X (OP_INDEXW, SB):
1341     case X (OP_INDEXW, SW):
1342     case X (OP_INDEXW, SL):
1343     case X (OP_INDEXL, SB):
1344     case X (OP_INDEXL, SW):
1345     case X (OP_INDEXL, SL):
1346       t = GET_L_REG (rn);
1347       switch (OP_KIND (arg->type)) {
1348       case OP_INDEXB:   t &= 0xff;      break;
1349       case OP_INDEXW:   t &= 0xffff;    break;
1350       case OP_INDEXL:
1351       default:          break;
1352       }
1353       switch (OP_SIZE (arg->type)) {
1354       case SB:
1355         *val = GET_MEMORY_B ((t * 1 + abs) & h8_get_mask (sd));
1356         break;
1357       case SW:
1358         *val = GET_MEMORY_W ((t * 2 + abs) & h8_get_mask (sd));
1359         break;
1360       case SL:
1361         *val = GET_MEMORY_L ((t * 4 + abs) & h8_get_mask (sd));
1362         break;
1363       }
1364       break;
1365
1366     case X (OP_LOWREG, SB):
1367       *val = GET_L_REG (rn) & 0xff;
1368       break;
1369     case X (OP_LOWREG, SW):
1370       *val = GET_L_REG (rn) & 0xffff; 
1371       break;
1372
1373     case X (OP_REG, SB):        /* Register direct, byte.  */
1374       *val = GET_B_REG (rn);
1375       break;
1376     case X (OP_REG, SW):        /* Register direct, word.  */
1377       *val = GET_W_REG (rn);
1378       break;
1379     case X (OP_REG, SL):        /* Register direct, long.  */
1380       *val = GET_L_REG (rn);
1381       break;
1382     case X (OP_IMM, SB):        /* Immediate, byte.  */
1383     case X (OP_IMM, SW):        /* Immediate, word.  */
1384     case X (OP_IMM, SL):        /* Immediate, long.  */
1385       *val = abs;
1386       break;
1387     case X (OP_POSTINC, SB):    /* Register indirect w/post-incr: byte.  */
1388       t = GET_L_REG (rn);
1389       t &= h8_get_mask (sd);
1390       r = GET_MEMORY_B (t);
1391       if (!twice)
1392         t += 1;
1393       t = t & h8_get_mask (sd);
1394       SET_L_REG (rn, t);
1395       *val = r;
1396       break;
1397     case X (OP_POSTINC, SW):    /* Register indirect w/post-incr: word.  */
1398       t = GET_L_REG (rn);
1399       t &= h8_get_mask (sd);
1400       r = GET_MEMORY_W (t);
1401       if (!twice)
1402         t += 2;
1403       t = t & h8_get_mask (sd);
1404       SET_L_REG (rn, t);
1405       *val = r;
1406       break;
1407     case X (OP_POSTINC, SL):    /* Register indirect w/post-incr: long.  */
1408       t = GET_L_REG (rn);
1409       t &= h8_get_mask (sd);
1410       r = GET_MEMORY_L (t);
1411       if (!twice)
1412         t += 4;
1413       t = t & h8_get_mask (sd);
1414       SET_L_REG (rn, t);
1415       *val = r;
1416       break;
1417
1418     case X (OP_POSTDEC, SB):    /* Register indirect w/post-decr: byte.  */
1419       t = GET_L_REG (rn);
1420       t &= h8_get_mask (sd);
1421       r = GET_MEMORY_B (t);
1422       if (!twice)
1423         t -= 1;
1424       t = t & h8_get_mask (sd);
1425       SET_L_REG (rn, t);
1426       *val = r;
1427       break;
1428     case X (OP_POSTDEC, SW):    /* Register indirect w/post-decr: word.  */
1429       t = GET_L_REG (rn);
1430       t &= h8_get_mask (sd);
1431       r = GET_MEMORY_W (t);
1432       if (!twice)
1433         t -= 2;
1434       t = t & h8_get_mask (sd);
1435       SET_L_REG (rn, t);
1436       *val = r;
1437       break;
1438     case X (OP_POSTDEC, SL):    /* Register indirect w/post-decr: long.  */
1439       t = GET_L_REG (rn);
1440       t &= h8_get_mask (sd);
1441       r = GET_MEMORY_L (t);
1442       if (!twice)
1443         t -= 4;
1444       t = t & h8_get_mask (sd);
1445       SET_L_REG (rn, t);
1446       *val = r;
1447       break;
1448
1449     case X (OP_PREDEC, SB):     /* Register indirect w/pre-decr: byte.  */
1450       t = GET_L_REG (rn) - 1;
1451       t &= h8_get_mask (sd);
1452       SET_L_REG (rn, t);
1453       *val = GET_MEMORY_B (t);
1454       break;
1455       
1456     case X (OP_PREDEC, SW):     /* Register indirect w/pre-decr: word.  */
1457       t = GET_L_REG (rn) - 2;
1458       t &= h8_get_mask (sd);
1459       SET_L_REG (rn, t);
1460       *val = GET_MEMORY_W (t);
1461       break;
1462       
1463     case X (OP_PREDEC, SL):     /* Register indirect w/pre-decr: long.  */
1464       t = GET_L_REG (rn) - 4;
1465       t &= h8_get_mask (sd);
1466       SET_L_REG (rn, t);
1467       *val = GET_MEMORY_L (t);
1468       break;
1469       
1470     case X (OP_PREINC, SB):     /* Register indirect w/pre-incr: byte.  */
1471       t = GET_L_REG (rn) + 1;
1472       t &= h8_get_mask (sd);
1473       SET_L_REG (rn, t);
1474       *val = GET_MEMORY_B (t);
1475       break;
1476
1477     case X (OP_PREINC, SW):     /* Register indirect w/pre-incr: long.  */
1478       t = GET_L_REG (rn) + 2;
1479       t &= h8_get_mask (sd);
1480       SET_L_REG (rn, t);
1481       *val = GET_MEMORY_W (t);
1482       break;
1483
1484     case X (OP_PREINC, SL):     /* Register indirect w/pre-incr: long.  */
1485       t = GET_L_REG (rn) + 4;
1486       t &= h8_get_mask (sd);
1487       SET_L_REG (rn, t);
1488       *val = GET_MEMORY_L (t);
1489       break;
1490
1491     case X (OP_DISP, SB):       /* Register indirect w/displacement: byte.  */
1492       t = GET_L_REG (rn) + abs;
1493       t &= h8_get_mask (sd);
1494       *val = GET_MEMORY_B (t);
1495       break;
1496
1497     case X (OP_DISP, SW):       /* Register indirect w/displacement: word.  */
1498       t = GET_L_REG (rn) + abs;
1499       t &= h8_get_mask (sd);
1500       *val = GET_MEMORY_W (t);
1501       break;
1502
1503     case X (OP_DISP, SL):       /* Register indirect w/displacement: long.  */
1504       t = GET_L_REG (rn) + abs;
1505       t &= h8_get_mask (sd);
1506       *val =GET_MEMORY_L (t);
1507       break;
1508
1509     case X (OP_MEM, SL):        /* Absolute memory address, long.  */
1510       t = GET_MEMORY_L (abs);
1511       t &= h8_get_mask (sd);
1512       *val = t;
1513       break;
1514
1515     case X (OP_MEM, SW):        /* Absolute memory address, word.  */
1516       t = GET_MEMORY_W (abs);
1517       t &= h8_get_mask (sd);
1518       *val = t;
1519       break;
1520
1521     case X (OP_PCREL, SB):      /* PC relative (for jump, branch etc).  */
1522     case X (OP_PCREL, SW):
1523     case X (OP_PCREL, SL):
1524     case X (OP_PCREL, SN):
1525       *val = abs;
1526       break;
1527
1528     case X (OP_MEM, SB):        /* Why isn't this implemented?  */
1529     default:
1530       sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
1531       return -1;
1532     }
1533   return 0;     /* Success.  */
1534 }
1535
1536 /* Normal fetch.  */
1537
1538 static int
1539 fetch (SIM_DESC sd, ea_type *arg, int *val)
1540 {
1541   return fetch_1 (sd, arg, val, 0);
1542 }
1543
1544 /* Fetch which will be followed by a store to the same location.
1545    The difference being that we don't want to do a post-increment
1546    or post-decrement at this time: we'll do it when we store.  */
1547
1548 static int
1549 fetch2 (SIM_DESC sd, ea_type *arg, int *val)
1550 {
1551   return fetch_1 (sd, arg, val, 1);
1552 }
1553
1554 /* Simulate a memory store.
1555    Return 0 for success, -1 for failure.
1556 */
1557
1558 static int
1559 store_1 (SIM_DESC sd, ea_type *arg, int n, int twice)
1560 {
1561   int rn = arg->reg;
1562   int abs = arg->literal;
1563   int t;
1564
1565   switch (arg->type)
1566     {
1567       /* Indexed register plus displacement mode:
1568
1569          This new family of addressing modes are similar to OP_DISP
1570          (register plus displacement), with two differences:
1571            1) INDEXB uses only the least significant byte of the register,
1572               INDEXW uses only the least significant word, and
1573               INDEXL uses the entire register (just like OP_DISP).
1574          and
1575            2) The displacement value in abs is multiplied by two
1576               for SW-sized operations, and by four for SL-size.
1577
1578         This gives nine possible variations.
1579       */
1580
1581     case X (OP_INDEXB, SB):
1582     case X (OP_INDEXB, SW):
1583     case X (OP_INDEXB, SL):
1584     case X (OP_INDEXW, SB):
1585     case X (OP_INDEXW, SW):
1586     case X (OP_INDEXW, SL):
1587     case X (OP_INDEXL, SB):
1588     case X (OP_INDEXL, SW):
1589     case X (OP_INDEXL, SL):
1590       t = GET_L_REG (rn);
1591       switch (OP_KIND (arg->type)) {
1592       case OP_INDEXB:   t &= 0xff;      break;
1593       case OP_INDEXW:   t &= 0xffff;    break;
1594       case OP_INDEXL:
1595       default:          break;
1596       }
1597       switch (OP_SIZE (arg->type)) {
1598       case SB:
1599         SET_MEMORY_B ((t * 1 + abs) & h8_get_mask (sd), n);
1600         break;
1601       case SW:
1602         SET_MEMORY_W ((t * 2 + abs) & h8_get_mask (sd), n);
1603         break;
1604       case SL:
1605         SET_MEMORY_L ((t * 4 + abs) & h8_get_mask (sd), n);
1606         break;
1607       }
1608       break;
1609
1610     case X (OP_REG, SB):        /* Register direct, byte.  */
1611       SET_B_REG (rn, n);
1612       break;
1613     case X (OP_REG, SW):        /* Register direct, word.  */
1614       SET_W_REG (rn, n);
1615       break;
1616     case X (OP_REG, SL):        /* Register direct, long.  */
1617       SET_L_REG (rn, n);
1618       break;
1619
1620     case X (OP_PREDEC, SB):     /* Register indirect w/pre-decr, byte.  */
1621       t = GET_L_REG (rn);
1622       if (!twice)
1623         t -= 1;
1624       t &= h8_get_mask (sd);
1625       SET_L_REG (rn, t);
1626       SET_MEMORY_B (t, n);
1627
1628       break;
1629     case X (OP_PREDEC, SW):     /* Register indirect w/pre-decr, word.  */
1630       t = GET_L_REG (rn);
1631       if (!twice)
1632         t -= 2;
1633       t &= h8_get_mask (sd);
1634       SET_L_REG (rn, t);
1635       SET_MEMORY_W (t, n);
1636       break;
1637
1638     case X (OP_PREDEC, SL):     /* Register indirect w/pre-decr, long.  */
1639       t = GET_L_REG (rn);
1640       if (!twice)
1641         t -= 4;
1642       t &= h8_get_mask (sd);
1643       SET_L_REG (rn, t);
1644       SET_MEMORY_L (t, n);
1645       break;
1646
1647     case X (OP_PREINC, SB):     /* Register indirect w/pre-incr, byte.  */
1648       t = GET_L_REG (rn);
1649       if (!twice)
1650         t += 1;
1651       t &= h8_get_mask (sd);
1652       SET_L_REG (rn, t);
1653       SET_MEMORY_B (t, n);
1654
1655       break;
1656     case X (OP_PREINC, SW):     /* Register indirect w/pre-incr, word.  */
1657       t = GET_L_REG (rn);
1658       if (!twice)
1659         t += 2;
1660       t &= h8_get_mask (sd);
1661       SET_L_REG (rn, t);
1662       SET_MEMORY_W (t, n);
1663       break;
1664
1665     case X (OP_PREINC, SL):     /* Register indirect w/pre-incr, long.  */
1666       t = GET_L_REG (rn);
1667       if (!twice)
1668         t += 4;
1669       t &= h8_get_mask (sd);
1670       SET_L_REG (rn, t);
1671       SET_MEMORY_L (t, n);
1672       break;
1673
1674     case X (OP_POSTDEC, SB):    /* Register indirect w/post-decr, byte.  */
1675       t = GET_L_REG (rn) & h8_get_mask (sd);
1676       SET_MEMORY_B (t, n);
1677       SET_L_REG (rn, t - 1);
1678       break;
1679
1680     case X (OP_POSTDEC, SW):    /* Register indirect w/post-decr, word.  */
1681       t = GET_L_REG (rn) & h8_get_mask (sd);
1682       SET_MEMORY_W (t, n);
1683       SET_L_REG (rn, t - 2);
1684       break;
1685
1686     case X (OP_POSTDEC, SL):    /* Register indirect w/post-decr, long.  */
1687       t = GET_L_REG (rn) & h8_get_mask (sd);
1688       SET_MEMORY_L (t, n);
1689       SET_L_REG (rn, t - 4);
1690       break;
1691
1692     case X (OP_POSTINC, SB):    /* Register indirect w/post-incr, byte.  */
1693       t = GET_L_REG (rn) & h8_get_mask (sd);
1694       SET_MEMORY_B (t, n);
1695       SET_L_REG (rn, t + 1);
1696       break;
1697
1698     case X (OP_POSTINC, SW):    /* Register indirect w/post-incr, word.  */
1699       t = GET_L_REG (rn) & h8_get_mask (sd);
1700       SET_MEMORY_W (t, n);
1701       SET_L_REG (rn, t + 2);
1702       break;
1703
1704     case X (OP_POSTINC, SL):    /* Register indirect w/post-incr, long.  */
1705       t = GET_L_REG (rn) & h8_get_mask (sd);
1706       SET_MEMORY_L (t, n);
1707       SET_L_REG (rn, t + 4);
1708       break;
1709
1710     case X (OP_DISP, SB):       /* Register indirect w/displacement, byte.  */
1711       t = GET_L_REG (rn) + abs;
1712       t &= h8_get_mask (sd);
1713       SET_MEMORY_B (t, n);
1714       break;
1715
1716     case X (OP_DISP, SW):       /* Register indirect w/displacement, word.  */
1717       t = GET_L_REG (rn) + abs;
1718       t &= h8_get_mask (sd);
1719       SET_MEMORY_W (t, n);
1720       break;
1721
1722     case X (OP_DISP, SL):       /* Register indirect w/displacement, long.  */
1723       t = GET_L_REG (rn) + abs;
1724       t &= h8_get_mask (sd);
1725       SET_MEMORY_L (t, n);
1726       break;
1727
1728
1729     case X (OP_MEM, SB):        /* Why isn't this implemented?  */
1730     case X (OP_MEM, SW):        /* Why isn't this implemented?  */
1731     case X (OP_MEM, SL):        /* Why isn't this implemented?  */
1732     default:
1733       sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
1734       return -1;
1735     }
1736   return 0;
1737 }
1738
1739 /* Normal store.  */
1740
1741 static int
1742 store (SIM_DESC sd, ea_type *arg, int n)
1743 {
1744   return store_1 (sd, arg, n, 0);
1745 }
1746
1747 /* Store which follows a fetch from the same location.
1748    The difference being that we don't want to do a pre-increment
1749    or pre-decrement at this time: it was already done when we fetched.  */
1750
1751 static int
1752 store2 (SIM_DESC sd, ea_type *arg, int n)
1753 {
1754   return store_1 (sd, arg, n, 1);
1755 }
1756
1757 static union
1758 {
1759   short int i;
1760   struct
1761     {
1762       char low;
1763       char high;
1764     }
1765   u;
1766 } littleendian;
1767
1768 /* Flag to be set whenever a new SIM_DESC object is created.  */
1769 static int init_pointers_needed = 1;
1770
1771 static void
1772 init_pointers (SIM_DESC sd)
1773 {
1774   if (init_pointers_needed)
1775     {
1776       int i;
1777
1778       littleendian.i = 1;
1779
1780       if (h8300smode && !h8300_normal_mode)
1781         memory_size = H8300S_MSIZE;
1782       else if (h8300hmode && !h8300_normal_mode)
1783         memory_size = H8300H_MSIZE;
1784       else
1785         memory_size = H8300_MSIZE;
1786       /* `msize' must be a power of two.  */
1787       if ((memory_size & (memory_size - 1)) != 0)
1788         {
1789           (*sim_callback->printf_filtered) 
1790             (sim_callback,
1791              "init_pointers: bad memory size %d, defaulting to %d.\n", 
1792              memory_size, memory_size = H8300S_MSIZE);
1793         }
1794
1795       if (h8_get_memory_buf (sd))
1796         free (h8_get_memory_buf (sd));
1797       if (h8_get_cache_idx_buf (sd))
1798         free (h8_get_cache_idx_buf (sd));
1799       if (h8_get_eightbit_buf (sd))
1800         free (h8_get_eightbit_buf (sd));
1801
1802       h8_set_memory_buf (sd, (unsigned char *) 
1803                          calloc (sizeof (char), memory_size));
1804       h8_set_cache_idx_buf (sd, (unsigned short *) 
1805                             calloc (sizeof (short), memory_size));
1806       sd->memory_size = memory_size;
1807       h8_set_eightbit_buf (sd, (unsigned char *) calloc (sizeof (char), 256));
1808
1809       h8_set_mask (sd, memory_size - 1);
1810
1811       memset (h8_get_reg_buf (sd), 0, sizeof (((STATE_CPU (sd, 0))->regs)));
1812
1813       for (i = 0; i < 8; i++)
1814         {
1815           /* FIXME: rewrite using local buffer.  */
1816           unsigned char *p = (unsigned char *) (h8_get_reg_buf (sd) + i);
1817           unsigned char *e = (unsigned char *) (h8_get_reg_buf (sd) + i + 1);
1818           unsigned short *q = (unsigned short *) (h8_get_reg_buf (sd) + i);
1819           unsigned short *u = (unsigned short *) (h8_get_reg_buf (sd) + i + 1);
1820           h8_set_reg (sd, i, 0x00112233);
1821
1822           while (p < e)
1823             {
1824               if (*p == 0x22)
1825                   breg[i] = p;
1826               if (*p == 0x33)
1827                   breg[i + 8] = p;
1828               if (*p == 0x11)
1829                 breg[i + 16] = p;
1830               if (*p == 0x00)
1831                 breg[i + 24] = p;
1832               p++;
1833             }
1834
1835           wreg[i] = wreg[i + 8] = 0;
1836           while (q < u)
1837             {
1838               if (*q == 0x2233)
1839                 {
1840                   wreg[i] = q;
1841                 }
1842               if (*q == 0x0011)
1843                 {
1844                   wreg[i + 8] = q;
1845                 }
1846               q++;
1847             }
1848
1849           if (wreg[i] == 0 || wreg[i + 8] == 0)
1850             (*sim_callback->printf_filtered) (sim_callback, 
1851                                               "init_pointers: internal error.\n");
1852
1853           h8_set_reg (sd, i, 0);
1854           lreg[i] = h8_get_reg_buf (sd) + i;
1855         }
1856
1857       /* Note: sim uses pseudo-register ZERO as a zero register.  */
1858       lreg[ZERO_REGNUM] = h8_get_reg_buf (sd) + ZERO_REGNUM;
1859       init_pointers_needed = 0;
1860
1861       /* Initialize the seg registers.  */
1862       if (!sd->sim_cache)
1863         set_simcache_size (sd, CSIZE);
1864     }
1865 }
1866
1867 /* Grotty global variable for use by control_c signal handler.  */
1868 static SIM_DESC control_c_sim_desc;
1869
1870 static void
1871 control_c (int sig)
1872 {
1873   sim_engine_set_run_state (control_c_sim_desc, sim_stopped, SIGINT);
1874 }
1875
1876 int
1877 sim_stop (SIM_DESC sd)
1878 {
1879   /* FIXME: use a real signal value.  */
1880   sim_engine_set_run_state (sd, sim_stopped, SIGINT);
1881   return 1;
1882 }
1883
1884 #define OBITOP(name, f, s, op)                  \
1885 case O (name, SB):                              \
1886 {                                               \
1887   int m, tmp;                                   \
1888                                                 \
1889   if (f)                                        \
1890     if (fetch (sd, &code->dst, &ea))            \
1891       goto end;                                 \
1892   if (fetch (sd, &code->src, &tmp))             \
1893     goto end;                                   \
1894   m = 1 << tmp;                                 \
1895   op;                                           \
1896   if (s)                                        \
1897     if (store (sd, &code->dst,ea))              \
1898       goto end;                                 \
1899   goto next;                                    \
1900 }
1901
1902 void
1903 sim_resume (SIM_DESC sd, int step, int siggnal)
1904 {
1905   static int init1;
1906   int cycles = 0;
1907   int insts = 0;
1908   int tick_start = get_now ();
1909   void (*prev) ();
1910   int poll_count = 0;
1911   int res;
1912   int tmp;
1913   int rd;
1914   int ea;
1915   int bit;
1916   int pc;
1917   int c, nz, v, n, u, h, ui, intMaskBit;
1918   int trace, intMask;
1919   int oldmask;
1920   enum sim_stop reason;
1921   int sigrc;
1922
1923   init_pointers (sd);
1924
1925   control_c_sim_desc = sd;
1926   prev = signal (SIGINT, control_c);
1927
1928   if (step)
1929     {
1930       sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
1931     }
1932   else
1933     {
1934       sim_engine_set_run_state (sd, sim_running, 0);
1935     }
1936
1937   pc = h8_get_pc (sd);
1938
1939   /* The PC should never be odd.  */
1940   if (pc & 0x1)
1941     {
1942       sim_engine_set_run_state (sd, sim_stopped, SIGBUS);
1943       return;
1944     }
1945
1946   /* Get Status Register (flags).  */
1947   GETSR (sd);
1948
1949   if (h8300smode)       /* Get exr.  */
1950     {
1951       trace = (h8_get_exr (sd) >> 7) & 1;
1952       intMask = h8_get_exr (sd) & 7;
1953     }
1954
1955   oldmask = h8_get_mask (sd);
1956   if (!h8300hmode || h8300_normal_mode)
1957     h8_set_mask (sd, 0xffff);
1958   do
1959     {
1960       unsigned short cidx;
1961       decoded_inst *code;
1962
1963     top:
1964       cidx = h8_get_cache_idx (sd, pc);
1965       if (cidx == (unsigned short) -1 ||
1966           cidx >= sd->sim_cache_size)
1967         goto illegal;
1968           
1969       code = sd->sim_cache + cidx;
1970
1971 #if ADEBUG
1972       if (debug)
1973         {
1974           printf ("%x %d %s\n", pc, code->opcode,
1975                   code->op ? code->op->name : "**");
1976         }
1977       h8_increment_stats (sd, code->opcode);
1978 #endif
1979
1980       if (code->opcode)
1981         {
1982           cycles += code->cycles;
1983           insts++;
1984         }
1985
1986       switch (code->opcode)
1987         {
1988         case 0:
1989           /*
1990            * This opcode is a fake for when we get to an
1991            * instruction which hasnt been compiled
1992            */
1993           compile (sd, pc);
1994           goto top;
1995           break;
1996
1997         case O (O_MOVAB, SL):
1998         case O (O_MOVAW, SL):
1999         case O (O_MOVAL, SL):
2000           /* 1) Evaluate 2nd argument (dst).
2001              2) Mask / zero extend according to whether 1st argument (src)
2002                 is INDEXB, INDEXW, or INDEXL.
2003              3) Left-shift the result by 0, 1 or 2, according to size of mova
2004                 (mova/b, mova/w, mova/l).
2005              4) Add literal value of 1st argument (src).
2006              5) Store result in 3rd argument (op3).
2007           */
2008
2009           /* Alas, since this is the only instruction with 3 arguments, 
2010              decode doesn't handle them very well.  Some fix-up is required.
2011
2012              a) The size of dst is determined by whether src is 
2013                 INDEXB or INDEXW.  */
2014
2015           if (OP_KIND (code->src.type) == OP_INDEXB)
2016             code->dst.type = X (OP_KIND (code->dst.type), SB);
2017           else if (OP_KIND (code->src.type) == OP_INDEXW)
2018             code->dst.type = X (OP_KIND (code->dst.type), SW);
2019
2020           /* b) If op3 == null, then this is the short form of the insn.
2021                 Dst is the dispreg of src, and op3 is the 32-bit form
2022                 of the same register.
2023           */
2024
2025           if (code->op3.type == 0)
2026             {
2027               /* Short form: src == INDEXB/INDEXW, dst == op3 == 0.
2028                  We get to compose dst and op3 as follows:
2029
2030                      op3 is a 32-bit register, ID == src.reg.
2031                      dst is the same register, but 8 or 16 bits
2032                      depending on whether src is INDEXB or INDEXW.
2033               */
2034
2035               code->op3.type = X (OP_REG, SL);
2036               code->op3.reg  = code->src.reg;
2037               code->op3.literal = 0;
2038
2039               if (OP_KIND (code->src.type) == OP_INDEXB)
2040                 {
2041                   code->dst.type = X (OP_REG, SB);
2042                   code->dst.reg = code->op3.reg + 8;
2043                 }
2044               else
2045                 code->dst.type = X (OP_REG, SW);
2046             }
2047
2048           if (fetch (sd, &code->dst, &ea))
2049             goto end;
2050
2051           switch (OP_KIND (code->src.type)) {
2052           case OP_INDEXB:    ea = ea & 0xff;            break;
2053           case OP_INDEXW:    ea = ea & 0xffff;          break;
2054           case OP_INDEXL:                               break;
2055           default:           goto illegal;
2056           }
2057
2058           switch (code->opcode) {
2059           case O (O_MOVAB, SL):                         break;
2060           case O (O_MOVAW, SL):     ea = ea << 1;       break;
2061           case O (O_MOVAL, SL):     ea = ea << 2;       break;
2062           default:                  goto illegal;
2063           }
2064           
2065           ea = ea + code->src.literal;
2066
2067           if (store (sd, &code->op3, ea))
2068             goto end;
2069
2070           goto next;      
2071
2072         case O (O_SUBX, SB):    /* subx, extended sub */
2073           if (fetch2 (sd, &code->dst, &rd))
2074             goto end;
2075           if (fetch (sd, &code->src, &ea))
2076             goto end;
2077           ea = -(ea + C);
2078           res = rd + ea;
2079           goto alu8;
2080
2081         case O (O_SUBX, SW):    /* subx, extended sub */
2082           if (fetch2 (sd, &code->dst, &rd))
2083             goto end;
2084           if (fetch (sd, &code->src, &ea))
2085             goto end;
2086           ea = -(ea + C);
2087           res = rd + ea;
2088           goto alu16;
2089
2090         case O (O_SUBX, SL):    /* subx, extended sub */
2091           if (fetch2 (sd, &code->dst, &rd))
2092             goto end;
2093           if (fetch (sd, &code->src, &ea))
2094             goto end;
2095           ea = -(ea + C);
2096           res = rd + ea;
2097           goto alu32;
2098
2099         case O (O_ADDX, SB):    /* addx, extended add */
2100           if (fetch2 (sd, &code->dst, &rd))
2101             goto end;
2102           if (fetch (sd, &code->src, &ea))
2103             goto end;
2104           ea = ea + C;
2105           res = rd + ea;
2106           goto alu8;
2107
2108         case O (O_ADDX, SW):    /* addx, extended add */
2109           if (fetch2 (sd, &code->dst, &rd))
2110             goto end;
2111           if (fetch (sd, &code->src, &ea))
2112             goto end;
2113           ea = ea + C;
2114           res = rd + ea;
2115           goto alu16;
2116
2117         case O (O_ADDX, SL):    /* addx, extended add */
2118           if (fetch2 (sd, &code->dst, &rd))
2119             goto end;
2120           if (fetch (sd, &code->src, &ea))
2121             goto end;
2122           ea = ea + C;
2123           res = rd + ea;
2124           goto alu32;
2125
2126         case O (O_SUB, SB):             /* sub.b */
2127           /* Fetch rd and ea.  */
2128           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2129             goto end;
2130           ea = -ea;
2131           res = rd + ea;
2132           goto alu8;
2133
2134         case O (O_SUB, SW):             /* sub.w */
2135           /* Fetch rd and ea.  */
2136           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2137             goto end;
2138           ea = -ea;
2139           res = rd + ea;
2140           goto alu16;
2141
2142         case O (O_SUB, SL):             /* sub.l */
2143           /* Fetch rd and ea.  */
2144           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2145             goto end;
2146           ea = -ea;
2147           res = rd + ea;
2148           goto alu32;
2149
2150         case O (O_NEG, SB):             /* neg.b */
2151           /* Fetch ea.  */
2152           if (fetch2 (sd, &code->src, &ea)) 
2153             goto end;
2154           ea = -ea;
2155           rd = 0;
2156           res = rd + ea;
2157           goto alu8;
2158
2159         case O (O_NEG, SW):             /* neg.w */
2160           /* Fetch ea.  */
2161           if (fetch2 (sd, &code->src, &ea)) 
2162             goto end;
2163           ea = -ea;
2164           rd = 0;
2165           res = rd + ea;
2166           goto alu16;
2167
2168         case O (O_NEG, SL):             /* neg.l */
2169           /* Fetch ea.  */
2170           if (fetch2 (sd, &code->src, &ea)) 
2171             goto end;
2172           ea = -ea;
2173           rd = 0;
2174           res = rd + ea;
2175           goto alu32;
2176
2177         case O (O_ADD, SB):             /* add.b */
2178           if (fetch2 (sd, &code->dst, &rd))
2179             goto end;
2180           if (fetch (sd, &code->src, &ea))
2181             goto end;
2182           res = rd + ea;
2183           goto alu8;
2184
2185         case O (O_ADD, SW):             /* add.w */
2186           if (fetch2 (sd, &code->dst, &rd))
2187             goto end;
2188           if (fetch (sd, &code->src, &ea))
2189             goto end;
2190           res = rd + ea;
2191           goto alu16;
2192
2193         case O (O_ADD, SL):             /* add.l */
2194           if (fetch2 (sd, &code->dst, &rd))
2195             goto end;
2196           if (fetch (sd, &code->src, &ea))
2197             goto end;
2198           res = rd + ea;
2199           goto alu32;
2200
2201         case O (O_AND, SB):             /* and.b */
2202           /* Fetch rd and ea.  */
2203           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2204             goto end;
2205           res = rd & ea;
2206           goto log8;
2207
2208         case O (O_AND, SW):             /* and.w */
2209           /* Fetch rd and ea.  */
2210           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2211             goto end;
2212           res = rd & ea;
2213           goto log16;
2214
2215         case O (O_AND, SL):             /* and.l */
2216           /* Fetch rd and ea.  */
2217           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2218             goto end;
2219           res = rd & ea;
2220           goto log32;
2221
2222         case O (O_OR, SB):              /* or.b */
2223           /* Fetch rd and ea.  */
2224           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2225             goto end;
2226           res = rd | ea;
2227           goto log8;
2228
2229         case O (O_OR, SW):              /* or.w */
2230           /* Fetch rd and ea.  */
2231           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2232             goto end;
2233           res = rd | ea;
2234           goto log16;
2235
2236         case O (O_OR, SL):              /* or.l */
2237           /* Fetch rd and ea.  */
2238           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2239             goto end;
2240           res = rd | ea;
2241           goto log32;
2242
2243         case O (O_XOR, SB):             /* xor.b */
2244           /* Fetch rd and ea.  */
2245           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2246             goto end;
2247           res = rd ^ ea;
2248           goto log8;
2249
2250         case O (O_XOR, SW):             /* xor.w */
2251           /* Fetch rd and ea.  */
2252           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2253             goto end;
2254           res = rd ^ ea;
2255           goto log16;
2256
2257         case O (O_XOR, SL):             /* xor.l */
2258           /* Fetch rd and ea.  */
2259           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2260             goto end;
2261           res = rd ^ ea;
2262           goto log32;
2263
2264         case O (O_MOV, SB):
2265           if (fetch (sd, &code->src, &res))
2266             goto end;
2267           if (store (sd, &code->dst, res))
2268             goto end;
2269           goto just_flags_log8;
2270         case O (O_MOV, SW):
2271           if (fetch (sd, &code->src, &res))
2272             goto end;
2273           if (store (sd, &code->dst, res))
2274             goto end;
2275           goto just_flags_log16;
2276         case O (O_MOV, SL):
2277           if (fetch (sd, &code->src, &res))
2278             goto end;
2279           if (store (sd, &code->dst, res))
2280             goto end;
2281           goto just_flags_log32;
2282
2283         case O (O_MOVMD, SB):           /* movmd.b */
2284           ea = GET_W_REG (4);
2285           if (ea == 0)
2286             ea = 0x10000;
2287
2288           while (ea--)
2289             {
2290               rd = GET_MEMORY_B (GET_L_REG (5));
2291               SET_MEMORY_B (GET_L_REG (6), rd);
2292               SET_L_REG (5, GET_L_REG (5) + 1);
2293               SET_L_REG (6, GET_L_REG (6) + 1);
2294               SET_W_REG (4, ea);
2295             }
2296           goto next;
2297
2298         case O (O_MOVMD, SW):           /* movmd.w */
2299           ea = GET_W_REG (4);
2300           if (ea == 0)
2301             ea = 0x10000;
2302
2303           while (ea--)
2304             {
2305               rd = GET_MEMORY_W (GET_L_REG (5));
2306               SET_MEMORY_W (GET_L_REG (6), rd);
2307               SET_L_REG (5, GET_L_REG (5) + 2);
2308               SET_L_REG (6, GET_L_REG (6) + 2);
2309               SET_W_REG (4, ea);
2310             }
2311           goto next;
2312
2313         case O (O_MOVMD, SL):           /* movmd.l */
2314           ea = GET_W_REG (4);
2315           if (ea == 0)
2316             ea = 0x10000;
2317
2318           while (ea--)
2319             {
2320               rd = GET_MEMORY_L (GET_L_REG (5));
2321               SET_MEMORY_L (GET_L_REG (6), rd);
2322               SET_L_REG (5, GET_L_REG (5) + 4);
2323               SET_L_REG (6, GET_L_REG (6) + 4);
2324               SET_W_REG (4, ea);
2325             }
2326           goto next;
2327
2328         case O (O_MOVSD, SB):           /* movsd.b */
2329           /* This instruction implements strncpy, with a conditional branch.
2330              r4 contains n, r5 contains src, and r6 contains dst.
2331              The 16-bit displacement operand is added to the pc
2332              if and only if the end of string is reached before
2333              n bytes are transferred.  */
2334
2335           ea = GET_L_REG (4) & 0xffff;
2336           if (ea == 0)
2337             ea = 0x10000;
2338
2339           while (ea--)
2340             {
2341               rd = GET_MEMORY_B (GET_L_REG (5));
2342               SET_MEMORY_B (GET_L_REG (6), rd);
2343               SET_L_REG (5, GET_L_REG (5) + 1);
2344               SET_L_REG (6, GET_L_REG (6) + 1);
2345               SET_W_REG (4, ea); 
2346               if (rd == 0)
2347                 goto condtrue;
2348             }
2349           goto next;
2350
2351         case O (O_EEPMOV, SB):          /* eepmov.b */
2352         case O (O_EEPMOV, SW):          /* eepmov.w */
2353           if (h8300hmode || h8300smode)
2354             {
2355               register unsigned char *_src, *_dst;
2356               unsigned int count = ((code->opcode == O (O_EEPMOV, SW))
2357                                     ? h8_get_reg (sd, R4_REGNUM) & 0xffff
2358                                     : h8_get_reg (sd, R4_REGNUM) & 0xff);
2359
2360               _src = (h8_get_reg (sd, R5_REGNUM) < memory_size
2361                       ? h8_get_memory_buf   (sd) + h8_get_reg (sd, R5_REGNUM)
2362                       : h8_get_eightbit_buf (sd) + 
2363                        (h8_get_reg (sd, R5_REGNUM) & 0xff));
2364               if ((_src + count) >= (h8_get_memory_buf (sd) + memory_size))
2365                 {
2366                   if ((_src + count) >= (h8_get_eightbit_buf (sd) + 0x100))
2367                     goto illegal;
2368                 }
2369               _dst = (h8_get_reg (sd, R6_REGNUM) < memory_size
2370                       ? h8_get_memory_buf   (sd) + h8_get_reg (sd, R6_REGNUM)
2371                       : h8_get_eightbit_buf (sd) + 
2372                        (h8_get_reg (sd, R6_REGNUM) & 0xff));
2373
2374               if ((_dst + count) >= (h8_get_memory_buf (sd) + memory_size))
2375                 {
2376                   if ((_dst + count) >= (h8_get_eightbit_buf (sd) + 0x100))
2377                     goto illegal;
2378                 }
2379               memcpy (_dst, _src, count);
2380
2381               h8_set_reg (sd, R5_REGNUM, h8_get_reg (sd, R5_REGNUM) + count);
2382               h8_set_reg (sd, R6_REGNUM, h8_get_reg (sd, R6_REGNUM) + count);
2383               h8_set_reg (sd, R4_REGNUM, h8_get_reg (sd, R4_REGNUM) &
2384                           ((code->opcode == O (O_EEPMOV, SW))
2385                           ? (~0xffff) : (~0xff)));
2386               cycles += 2 * count;
2387               goto next;
2388             }
2389           goto illegal;
2390
2391         case O (O_ADDS, SL):            /* adds (.l) */
2392           /* FIXME fetch.
2393            * This insn only uses register operands, but still
2394            * it would be cleaner to use fetch and store...  */    
2395           SET_L_REG (code->dst.reg,
2396                      GET_L_REG (code->dst.reg)
2397                      + code->src.literal);
2398
2399           goto next;
2400
2401         case O (O_SUBS, SL):            /* subs (.l) */
2402           /* FIXME fetch.
2403            * This insn only uses register operands, but still
2404            * it would be cleaner to use fetch and store...  */    
2405           SET_L_REG (code->dst.reg,
2406                      GET_L_REG (code->dst.reg)
2407                      - code->src.literal);
2408           goto next;
2409
2410         case O (O_CMP, SB):             /* cmp.b */
2411           if (fetch (sd, &code->dst, &rd))
2412             goto end;
2413           if (fetch (sd, &code->src, &ea))
2414             goto end;
2415           ea = -ea;
2416           res = rd + ea;
2417           goto just_flags_alu8;
2418
2419         case O (O_CMP, SW):             /* cmp.w */
2420           if (fetch (sd, &code->dst, &rd))
2421             goto end;
2422           if (fetch (sd, &code->src, &ea))
2423             goto end;
2424           ea = -ea;
2425           res = rd + ea;
2426           goto just_flags_alu16;
2427
2428         case O (O_CMP, SL):             /* cmp.l */
2429           if (fetch (sd, &code->dst, &rd))
2430             goto end;
2431           if (fetch (sd, &code->src, &ea))
2432             goto end;
2433           ea = -ea;
2434           res = rd + ea;
2435           goto just_flags_alu32;
2436
2437         case O (O_DEC, SB):             /* dec.b */
2438           /* FIXME fetch.
2439            * This insn only uses register operands, but still
2440            * it would be cleaner to use fetch and store...  */    
2441           rd = GET_B_REG (code->src.reg);
2442           ea = -1;
2443           res = rd + ea;
2444           SET_B_REG (code->src.reg, res);
2445           goto just_flags_inc8;
2446
2447         case O (O_DEC, SW):             /* dec.w */
2448           /* FIXME fetch.
2449            * This insn only uses register operands, but still
2450            * it would be cleaner to use fetch and store...  */    
2451           rd = GET_W_REG (code->dst.reg);
2452           ea = -code->src.literal;
2453           res = rd + ea;
2454           SET_W_REG (code->dst.reg, res);
2455           goto just_flags_inc16;
2456
2457         case O (O_DEC, SL):             /* dec.l */
2458           /* FIXME fetch.
2459            * This insn only uses register operands, but still
2460            * it would be cleaner to use fetch and store...  */    
2461           rd = GET_L_REG (code->dst.reg);
2462           ea = -code->src.literal;
2463           res = rd + ea;
2464           SET_L_REG (code->dst.reg, res);
2465           goto just_flags_inc32;
2466
2467         case O (O_INC, SB):             /* inc.b */
2468           /* FIXME fetch.
2469            * This insn only uses register operands, but still
2470            * it would be cleaner to use fetch and store...  */    
2471           rd = GET_B_REG (code->src.reg);
2472           ea = 1;
2473           res = rd + ea;
2474           SET_B_REG (code->src.reg, res);
2475           goto just_flags_inc8;
2476
2477         case O (O_INC, SW):             /* inc.w */
2478           /* FIXME fetch.
2479            * This insn only uses register operands, but still
2480            * it would be cleaner to use fetch and store...  */    
2481           rd = GET_W_REG (code->dst.reg);
2482           ea = code->src.literal;
2483           res = rd + ea;
2484           SET_W_REG (code->dst.reg, res);
2485           goto just_flags_inc16;
2486
2487         case O (O_INC, SL):             /* inc.l */
2488           /* FIXME fetch.
2489            * This insn only uses register operands, but still
2490            * it would be cleaner to use fetch and store...  */    
2491           rd = GET_L_REG (code->dst.reg);
2492           ea = code->src.literal;
2493           res = rd + ea;
2494           SET_L_REG (code->dst.reg, res);
2495           goto just_flags_inc32;
2496
2497         case O (O_LDC, SB):             /* ldc.b */
2498           if (fetch (sd, &code->src, &res))
2499             goto end;
2500           goto setc;
2501
2502         case O (O_LDC, SW):             /* ldc.w */
2503           if (fetch (sd, &code->src, &res))
2504             goto end;
2505
2506           /* Word operand, value from MSB, must be shifted.  */
2507           res >>= 8;
2508           goto setc;
2509
2510         case O (O_LDC, SL):             /* ldc.l */
2511           if (fetch (sd, &code->src, &res))
2512             goto end;
2513           switch (code->dst.type) {
2514           case X (OP_SBR, SL):
2515             h8_set_sbr (sd, res);
2516             break;
2517           case X (OP_VBR, SL):
2518             h8_set_vbr (sd, res);
2519             break;
2520           default:
2521             goto illegal;
2522           }
2523           goto next;
2524
2525         case O (O_STC, SW):             /* stc.w */
2526         case O (O_STC, SB):             /* stc.b */
2527           if (code->src.type == X (OP_CCR, SB))
2528             {
2529               BUILDSR (sd);
2530               res = h8_get_ccr (sd);
2531             }
2532           else if (code->src.type == X (OP_EXR, SB) && h8300smode)
2533             {
2534               if (h8300smode)
2535                 h8_set_exr (sd, (trace << 7) | intMask);
2536               res = h8_get_exr (sd);
2537             }
2538           else
2539             goto illegal;
2540
2541           /* Word operand, value to MSB, must be shifted.  */
2542           if (code->opcode == X (O_STC, SW))
2543             res <<= 8;
2544           if (store (sd, &code->dst, res))
2545             goto end;
2546           goto next;
2547         case O (O_STC, SL):             /* stc.l */
2548           switch (code->src.type) {
2549           case X (OP_SBR, SL):
2550             res = h8_get_sbr (sd);
2551             break;
2552           case X (OP_VBR, SL):
2553             res = h8_get_vbr (sd);
2554             break;
2555           default:
2556             goto illegal;
2557           }
2558           if (store (sd, &code->dst, res))
2559             goto end;
2560           goto next;
2561
2562         case O (O_ANDC, SB):            /* andc.b */
2563           if (code->dst.type == X (OP_CCR, SB))
2564             {
2565               BUILDSR (sd);
2566               rd = h8_get_ccr (sd);
2567             }
2568           else if (code->dst.type == X (OP_EXR, SB) && h8300smode)
2569             {
2570               if (h8300smode)
2571                 h8_set_exr (sd, (trace << 7) | intMask);
2572               rd = h8_get_exr (sd);
2573             }
2574           else
2575             goto illegal;
2576           ea = code->src.literal;
2577           res = rd & ea;
2578           goto setc;
2579
2580         case O (O_ORC, SB):             /* orc.b */
2581           if (code->dst.type == X (OP_CCR, SB))
2582             {
2583               BUILDSR (sd);
2584               rd = h8_get_ccr (sd);
2585             }
2586           else if (code->dst.type == X (OP_EXR, SB) && h8300smode)
2587             {
2588               if (h8300smode)
2589                 h8_set_exr (sd, (trace << 7) | intMask);
2590               rd = h8_get_exr (sd);
2591             }
2592           else
2593             goto illegal;
2594           ea = code->src.literal;
2595           res = rd | ea;
2596           goto setc;
2597
2598         case O (O_XORC, SB):            /* xorc.b */
2599           if (code->dst.type == X (OP_CCR, SB))
2600             {
2601               BUILDSR (sd);
2602               rd = h8_get_ccr (sd);
2603             }
2604           else if (code->dst.type == X (OP_EXR, SB) && h8300smode)
2605             {
2606               if (h8300smode)
2607                 h8_set_exr (sd, (trace << 7) | intMask);
2608               rd = h8_get_exr (sd);
2609             }
2610           else
2611             goto illegal;
2612           ea = code->src.literal;
2613           res = rd ^ ea;
2614           goto setc;
2615
2616         case O (O_BRAS, SB):            /* bra/s  */
2617           /* This is basically an ordinary branch, with a delay slot.  */
2618           if (fetch (sd, &code->src, &res))
2619             goto end;
2620
2621           if ((res & 1) == 0)
2622             goto illegal;
2623
2624           res -= 1;
2625
2626           /* Execution continues at next instruction, but
2627              delayed_branch is set up for next cycle.  */
2628           h8_set_delayed_branch (sd, code->next_pc + res);
2629           pc = code->next_pc;
2630           goto end;
2631
2632         case O (O_BRAB, SB):            /* bra rd.b */
2633         case O (O_BRAW, SW):            /* bra rd.w */
2634         case O (O_BRAL, SL):            /* bra erd.l */
2635           if (fetch (sd, &code->src, &rd))
2636             goto end;
2637           switch (OP_SIZE (code->opcode)) {
2638           case SB:      rd &= 0xff;             break;
2639           case SW:      rd &= 0xffff;           break;
2640           case SL:      rd &= 0xffffffff;       break;
2641           }
2642           pc = code->next_pc + rd;
2643           goto end;
2644
2645         case O (O_BRABC, SB):           /* bra/bc, branch if bit clear */
2646         case O (O_BRABS, SB):           /* bra/bs, branch if bit set   */
2647         case O (O_BSRBC, SB):           /* bsr/bc, call   if bit clear */
2648         case O (O_BSRBS, SB):           /* bsr/bs, call   if bit set   */
2649           if (fetch (sd, &code->dst, &rd) ||
2650               fetch (sd, &code->src, &bit))
2651             goto end;
2652
2653           if (code->opcode == O (O_BRABC, SB) || /* branch if clear */
2654               code->opcode == O (O_BSRBC, SB))   /* call   if clear */
2655             {
2656               if ((rd & (1 << bit)))            /* no branch */
2657                 goto next;
2658             }
2659           else                                  /* branch/call if set */
2660             {
2661               if (!(rd & (1 << bit)))           /* no branch */
2662                 goto next;
2663             }
2664
2665           if (fetch (sd, &code->op3, &res))     /* branch */
2666             goto end;
2667           pc = code->next_pc + res;
2668
2669           if (code->opcode == O (O_BRABC, SB) ||
2670               code->opcode == O (O_BRABS, SB))  /* branch */
2671             goto end;
2672           else                                  /* call   */
2673             goto call;
2674
2675         case O (O_BRA, SN):
2676         case O (O_BRA, SL):
2677         case O (O_BRA, SW):
2678         case O (O_BRA, SB):             /* bra, branch always */
2679           if (1)
2680             goto condtrue;
2681           goto next;
2682
2683         case O (O_BRN, SB):             /* brn, ;-/  branch never? */
2684           if (0)
2685             goto condtrue;
2686           goto next;
2687
2688         case O (O_BHI, SB):             /* bhi */
2689           if ((C || Z) == 0)
2690             goto condtrue;
2691           goto next;
2692
2693
2694         case O (O_BLS, SB):             /* bls */
2695           if ((C || Z))
2696             goto condtrue;
2697           goto next;
2698
2699         case O (O_BCS, SB):             /* bcs, branch if carry set */
2700           if ((C == 1))
2701             goto condtrue;
2702           goto next;
2703
2704         case O (O_BCC, SB):             /* bcc, branch if carry clear */
2705           if ((C == 0))
2706             goto condtrue;
2707           goto next;
2708
2709         case O (O_BEQ, SB):             /* beq, branch if zero set */
2710           if (Z)
2711             goto condtrue;
2712           goto next;
2713         case O (O_BGT, SB):             /* bgt */
2714           if (((Z || (N ^ V)) == 0))
2715             goto condtrue;
2716           goto next;
2717
2718         case O (O_BLE, SB):             /* ble */
2719           if (((Z || (N ^ V)) == 1))
2720             goto condtrue;
2721           goto next;
2722
2723         case O (O_BGE, SB):             /* bge */
2724           if ((N ^ V) == 0)
2725             goto condtrue;
2726           goto next;
2727         case O (O_BLT, SB):             /* blt */
2728           if ((N ^ V))
2729             goto condtrue;
2730           goto next;
2731         case O (O_BMI, SB):             /* bmi */
2732           if ((N))
2733             goto condtrue;
2734           goto next;
2735         case O (O_BNE, SB):             /* bne, branch if zero clear */
2736           if ((Z == 0))
2737             goto condtrue;
2738           goto next;
2739
2740         case O (O_BPL, SB):             /* bpl */
2741           if (N == 0)
2742             goto condtrue;
2743           goto next;
2744         case O (O_BVC, SB):             /* bvc */
2745           if ((V == 0))
2746             goto condtrue;
2747           goto next;
2748         case O (O_BVS, SB):             /* bvs */
2749           if ((V == 1))
2750             goto condtrue;
2751           goto next;
2752
2753         /* Trap for Command Line setup.  */
2754         case O (O_SYS_CMDLINE, SB):
2755           {
2756             int i = 0;          /* Loop counter.  */
2757             int j = 0;          /* Loop counter.  */
2758             int ind_arg_len = 0;        /* Length of each argument.  */
2759             int no_of_args = 0; /* The no. or cmdline args.  */
2760             int current_location = 0;   /* Location of string.  */
2761             int old_sp = 0;     /* The Initial Stack Pointer.  */
2762             int no_of_slots = 0;        /* No. of slots required on the stack
2763                                            for storing cmdline args.  */
2764             int sp_move = 0;    /* No. of locations by which the stack needs
2765                                    to grow.  */
2766             int new_sp = 0;     /* The final stack pointer location passed
2767                                    back.  */
2768             int *argv_ptrs;     /* Pointers of argv strings to be stored.  */
2769             int argv_ptrs_location = 0; /* Location of pointers to cmdline
2770                                            args on the stack.  */
2771             int char_ptr_size = 0;      /* Size of a character pointer on
2772                                            target machine.  */
2773             int addr_cmdline = 0;       /* Memory location where cmdline has
2774                                            to be stored.  */
2775             int size_cmdline = 0;       /* Size of cmdline.  */
2776
2777             /* Set the address of 256 free locations where command line is
2778                stored.  */
2779             addr_cmdline = cmdline_location();
2780             h8_set_reg (sd, 0, addr_cmdline);
2781
2782             /* Counting the no. of commandline arguments.  */
2783             for (i = 0; h8_get_cmdline_arg (sd, i) != NULL; i++)
2784               continue;
2785
2786             /* No. of arguments in the command line.  */
2787             no_of_args = i;
2788
2789             /* Current location is just a temporary variable,which we are
2790                setting to the point to the start of our commandline string.  */
2791             current_location = addr_cmdline;
2792
2793             /* Allocating space for storing pointers of the command line
2794                arguments.  */
2795             argv_ptrs = (int *) malloc (sizeof (int) * no_of_args);
2796
2797             /* Setting char_ptr_size to the sizeof (char *) on the different
2798                architectures.  */
2799             if ((h8300hmode || h8300smode) && !h8300_normal_mode)
2800               {
2801                 char_ptr_size = 4;
2802               }
2803             else
2804               {
2805                 char_ptr_size = 2;
2806               }
2807
2808             for (i = 0; i < no_of_args; i++)
2809               {
2810                 ind_arg_len = 0;
2811
2812                 /* The size of the commandline argument.  */
2813                 ind_arg_len = strlen (h8_get_cmdline_arg (sd, i) + 1);
2814
2815                 /* The total size of the command line string.  */
2816                 size_cmdline += ind_arg_len;
2817
2818                 /* As we have only 256 bytes, we need to provide a graceful
2819                    exit. Anyways, a program using command line arguments 
2820                    where we cannot store all the command line arguments
2821                    given may behave unpredictably.  */
2822                 if (size_cmdline >= 256)
2823                   {
2824                     h8_set_reg (sd, 0, 0);
2825                     goto next;
2826                   }
2827                 else
2828                   {
2829                     /* current_location points to the memory where the next
2830                        commandline argument is stored.  */
2831                     argv_ptrs[i] = current_location;
2832                     for (j = 0; j < ind_arg_len; j++)
2833                       {
2834                         SET_MEMORY_B ((current_location +
2835                                        (sizeof (char) * j)),
2836                                       *(h8_get_cmdline_arg (sd, i) + 
2837                                        sizeof (char) * j));
2838                       }
2839
2840                     /* Setting current_location to the starting of next
2841                        argument.  */
2842                     current_location += ind_arg_len;
2843                   }
2844               }
2845
2846             /* This is the original position of the stack pointer.  */
2847             old_sp = h8_get_reg (sd, SP_REGNUM);
2848
2849             /* We need space from the stack to store the pointers to argvs.  */
2850             /* As we will infringe on the stack, we need to shift the stack
2851                pointer so that the data is not overwritten. We calculate how
2852                much space is required.  */
2853             sp_move = (no_of_args) * (char_ptr_size);
2854
2855             /* The final position of stack pointer, we have thus taken some
2856                space from the stack.  */
2857             new_sp = old_sp - sp_move;
2858
2859             /* Temporary variable holding value where the argv pointers need
2860                to be stored.  */
2861             argv_ptrs_location = new_sp;
2862
2863             /* The argv pointers are stored at sequential locations. As per
2864                the H8300 ABI.  */
2865             for (i = 0; i < no_of_args; i++)
2866               {
2867                 /* Saving the argv pointer.  */
2868                 if ((h8300hmode || h8300smode) && !h8300_normal_mode)
2869                   {
2870                     SET_MEMORY_L (argv_ptrs_location, argv_ptrs[i]);
2871                   }
2872                 else
2873                   {
2874                     SET_MEMORY_W (argv_ptrs_location, argv_ptrs[i]);
2875                   }
2876         
2877                 /* The next location where the pointer to the next argv
2878                    string has to be stored.  */    
2879                 argv_ptrs_location += char_ptr_size;
2880               }
2881
2882             /* Required by POSIX, Setting 0x0 at the end of the list of argv
2883                pointers.  */
2884             if ((h8300hmode || h8300smode) && !h8300_normal_mode)
2885               {
2886                 SET_MEMORY_L (old_sp, 0x0);
2887               }
2888             else
2889               {
2890                 SET_MEMORY_W (old_sp, 0x0);
2891               }
2892
2893             /* Freeing allocated memory.  */
2894             free (argv_ptrs);
2895             for (i = 0; i <= no_of_args; i++)
2896               {
2897                 free (h8_get_cmdline_arg (sd, i));
2898               }
2899             free (h8_get_command_line (sd));
2900
2901             /* The no. of argv arguments are returned in Reg 0.  */
2902             h8_set_reg (sd, 0, no_of_args);
2903             /* The Pointer to argv in Register 1.  */
2904             h8_set_reg (sd, 1, new_sp);
2905             /* Setting the stack pointer to the new value.  */
2906             h8_set_reg (sd, SP_REGNUM, new_sp);
2907           }
2908           goto next;
2909
2910           /* System call processing starts.  */
2911         case O (O_SYS_OPEN, SB):
2912           {
2913             int len = 0;        /* Length of filename.  */
2914             char *filename;     /* Filename would go here.  */
2915             char temp_char;     /* Temporary character */
2916             int mode = 0;       /* Mode bits for the file.  */
2917             int open_return;    /* Return value of open, file descriptor.  */
2918             int i;              /* Loop counter */
2919             int filename_ptr;   /* Pointer to filename in cpu memory.  */
2920
2921             /* Setting filename_ptr to first argument of open,  */
2922             /* and trying to get mode.  */
2923             if ((h8300sxmode || h8300hmode || h8300smode) && !h8300_normal_mode)
2924               {
2925                 filename_ptr = GET_L_REG (0);
2926                 mode = GET_MEMORY_L (h8_get_reg (sd, SP_REGNUM) + 4);
2927               }
2928             else
2929               {
2930                 filename_ptr = GET_W_REG (0);
2931                 mode = GET_MEMORY_W (h8_get_reg (sd, SP_REGNUM) + 2);
2932               }
2933
2934             /* Trying to find the length of the filename.  */
2935             temp_char = GET_MEMORY_B (h8_get_reg (sd, 0));
2936
2937             len = 1;
2938             while (temp_char != '\0')
2939               {
2940                 temp_char = GET_MEMORY_B (filename_ptr + len);
2941                 len++;
2942               }
2943
2944             /* Allocating space for the filename.  */
2945             filename = (char *) malloc (sizeof (char) * len);
2946
2947             /* String copying the filename from memory.  */
2948             for (i = 0; i < len; i++)
2949               {
2950                 temp_char = GET_MEMORY_B (filename_ptr + i);
2951                 filename[i] = temp_char;
2952               }
2953
2954             /* Callback to open and return the file descriptor.  */
2955             open_return = sim_callback->open (sim_callback, filename, mode);
2956
2957             /* Return value in register 0.  */
2958             h8_set_reg (sd, 0, open_return);
2959
2960             /* Freeing memory used for filename. */
2961             free (filename);
2962           }
2963           goto next;
2964
2965         case O (O_SYS_READ, SB):
2966           {
2967             char *char_ptr;     /* Where characters read would be stored.  */
2968             int fd;             /* File descriptor */
2969             int buf_size;       /* BUF_SIZE parameter in read.  */
2970             int i = 0;          /* Temporary Loop counter */
2971             int read_return = 0;        /* Return value from callback to
2972                                            read.  */
2973
2974             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
2975             buf_size = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (2) : GET_W_REG (2);
2976
2977             char_ptr = (char *) malloc (sizeof (char) * buf_size);
2978
2979             /* Callback to read and return the no. of characters read.  */
2980             read_return =
2981               sim_callback->read (sim_callback, fd, char_ptr, buf_size);
2982
2983             /* The characters read are stored in cpu memory.  */
2984             for (i = 0; i < buf_size; i++)
2985               {
2986                 SET_MEMORY_B ((h8_get_reg (sd, 1) + (sizeof (char) * i)),
2987                               *(char_ptr + (sizeof (char) * i)));
2988               }
2989
2990             /* Return value in Register 0.  */
2991             h8_set_reg (sd, 0, read_return);
2992
2993             /* Freeing memory used as buffer.  */
2994             free (char_ptr);
2995           }
2996           goto next;
2997
2998         case O (O_SYS_WRITE, SB):
2999           {
3000             int fd;             /* File descriptor */
3001             char temp_char;     /* Temporary character */
3002             int len;            /* Length of write, Parameter II to write.  */
3003             int char_ptr;       /* Character Pointer, Parameter I of write.  */
3004             char *ptr;          /* Where characters to be written are stored. 
3005                                  */
3006             int write_return;   /* Return value from callback to write.  */
3007             int i = 0;          /* Loop counter */
3008
3009             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3010             char_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3011             len = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (2) : GET_W_REG (2);
3012
3013             /* Allocating space for the characters to be written.  */
3014             ptr = (char *) malloc (sizeof (char) * len);
3015
3016             /* Fetching the characters from cpu memory.  */
3017             for (i = 0; i < len; i++)
3018               {
3019                 temp_char = GET_MEMORY_B (char_ptr + i);
3020                 ptr[i] = temp_char;
3021               }
3022
3023             /* Callback write and return the no. of characters written.  */
3024             write_return = sim_callback->write (sim_callback, fd, ptr, len);
3025
3026             /* Return value in Register 0.  */
3027             h8_set_reg (sd, 0, write_return);
3028
3029             /* Freeing memory used as buffer.  */
3030             free (ptr);
3031           }
3032           goto next;
3033
3034         case O (O_SYS_LSEEK, SB):
3035           {
3036             int fd;             /* File descriptor */
3037             int offset;         /* Offset */
3038             int origin;         /* Origin */
3039             int lseek_return;   /* Return value from callback to lseek.  */
3040
3041             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3042             offset = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3043             origin = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (2) : GET_W_REG (2);
3044
3045             /* Callback lseek and return offset.  */
3046             lseek_return =
3047               sim_callback->lseek (sim_callback, fd, offset, origin);
3048
3049             /* Return value in register 0.  */
3050             h8_set_reg (sd, 0, lseek_return);
3051           }
3052           goto next;
3053
3054         case O (O_SYS_CLOSE, SB):
3055           {
3056             int fd;             /* File descriptor */
3057             int close_return;   /* Return value from callback to close.  */
3058
3059             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3060
3061             /* Callback close and return.  */
3062             close_return = sim_callback->close (sim_callback, fd);
3063
3064             /* Return value in register 0.  */
3065             h8_set_reg (sd, 0, close_return);
3066           }
3067           goto next;
3068
3069         case O (O_SYS_FSTAT, SB):
3070           {
3071             int fd;             /* File descriptor */
3072             struct stat stat_rec;       /* Stat record */
3073             int fstat_return;   /* Return value from callback to stat.  */
3074             int stat_ptr;       /* Pointer to stat record.  */
3075             char *temp_stat_ptr;        /* Temporary stat_rec pointer.  */
3076
3077             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3078
3079             /* Setting stat_ptr to second argument of stat.  */
3080             stat_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3081
3082             /* Callback stat and return.  */
3083             fstat_return = sim_callback->fstat (sim_callback, fd, &stat_rec);
3084
3085             /* Have stat_ptr point to starting of stat_rec.  */
3086             temp_stat_ptr = (char *) (&stat_rec);
3087
3088             /* Setting up the stat structure returned.  */
3089             SET_MEMORY_W (stat_ptr, stat_rec.st_dev);
3090             stat_ptr += 2;
3091             SET_MEMORY_W (stat_ptr, stat_rec.st_ino);
3092             stat_ptr += 2;
3093             SET_MEMORY_L (stat_ptr, stat_rec.st_mode);
3094             stat_ptr += 4;
3095             SET_MEMORY_W (stat_ptr, stat_rec.st_nlink);
3096             stat_ptr += 2;
3097             SET_MEMORY_W (stat_ptr, stat_rec.st_uid);
3098             stat_ptr += 2;
3099             SET_MEMORY_W (stat_ptr, stat_rec.st_gid);
3100             stat_ptr += 2;
3101             SET_MEMORY_W (stat_ptr, stat_rec.st_rdev);
3102             stat_ptr += 2;
3103             SET_MEMORY_L (stat_ptr, stat_rec.st_size);
3104             stat_ptr += 4;
3105             SET_MEMORY_L (stat_ptr, stat_rec.st_atime);
3106             stat_ptr += 8;
3107             SET_MEMORY_L (stat_ptr, stat_rec.st_mtime);
3108             stat_ptr += 8;
3109             SET_MEMORY_L (stat_ptr, stat_rec.st_ctime);
3110
3111             /* Return value in register 0.  */
3112             h8_set_reg (sd, 0, fstat_return);
3113           }
3114           goto next;
3115
3116         case O (O_SYS_STAT, SB):
3117           {
3118             int len = 0;        /* Length of filename.  */
3119             char *filename;     /* Filename would go here.  */
3120             char temp_char;     /* Temporary character */
3121             int filename_ptr;   /* Pointer to filename in cpu memory.  */
3122             struct stat stat_rec;       /* Stat record */
3123             int stat_return;    /* Return value from callback to stat */
3124             int stat_ptr;       /* Pointer to stat record.  */
3125             char *temp_stat_ptr;        /* Temporary stat_rec pointer.  */
3126             int i = 0;          /* Loop Counter */
3127
3128             /* Setting filename_ptr to first argument of open.  */
3129             filename_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3130
3131             /* Trying to find the length of the filename.  */
3132             temp_char = GET_MEMORY_B (h8_get_reg (sd, 0));
3133
3134             len = 1;
3135             while (temp_char != '\0')
3136               {
3137                 temp_char = GET_MEMORY_B (filename_ptr + len);
3138                 len++;
3139               }
3140
3141             /* Allocating space for the filename.  */
3142             filename = (char *) malloc (sizeof (char) * len);
3143
3144             /* String copying the filename from memory.  */
3145             for (i = 0; i < len; i++)
3146               {
3147                 temp_char = GET_MEMORY_B (filename_ptr + i);
3148                 filename[i] = temp_char;
3149               }
3150
3151             /* Setting stat_ptr to second argument of stat.  */
3152             /* stat_ptr = h8_get_reg (sd, 1); */
3153             stat_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3154
3155             /* Callback stat and return.  */
3156             stat_return =
3157               sim_callback->stat (sim_callback, filename, &stat_rec);
3158
3159             /* Have stat_ptr point to starting of stat_rec.  */
3160             temp_stat_ptr = (char *) (&stat_rec);
3161  
3162             /* Freeing memory used for filename.  */
3163             free (filename);
3164  
3165             /* Setting up the stat structure returned.  */
3166             SET_MEMORY_W (stat_ptr, stat_rec.st_dev);
3167             stat_ptr += 2;
3168             SET_MEMORY_W (stat_ptr, stat_rec.st_ino);
3169             stat_ptr += 2;
3170             SET_MEMORY_L (stat_ptr, stat_rec.st_mode);
3171             stat_ptr += 4;
3172             SET_MEMORY_W (stat_ptr, stat_rec.st_nlink);
3173             stat_ptr += 2;
3174             SET_MEMORY_W (stat_ptr, stat_rec.st_uid);
3175             stat_ptr += 2;
3176             SET_MEMORY_W (stat_ptr, stat_rec.st_gid);
3177             stat_ptr += 2;
3178             SET_MEMORY_W (stat_ptr, stat_rec.st_rdev);
3179             stat_ptr += 2;
3180             SET_MEMORY_L (stat_ptr, stat_rec.st_size);
3181             stat_ptr += 4;
3182             SET_MEMORY_L (stat_ptr, stat_rec.st_atime);
3183             stat_ptr += 8;
3184             SET_MEMORY_L (stat_ptr, stat_rec.st_mtime);
3185             stat_ptr += 8;
3186             SET_MEMORY_L (stat_ptr, stat_rec.st_ctime);
3187  
3188             /* Return value in register 0.  */
3189             h8_set_reg (sd, 0, stat_return);
3190           }
3191           goto next;
3192           /* End of system call processing.  */
3193
3194         case O (O_NOT, SB):             /* not.b */
3195           if (fetch2 (sd, &code->src, &rd))
3196             goto end;
3197           rd = ~rd; 
3198           v = 0;
3199           goto shift8;
3200
3201         case O (O_NOT, SW):             /* not.w */
3202           if (fetch2 (sd, &code->src, &rd))
3203             goto end;
3204           rd = ~rd; 
3205           v = 0;
3206           goto shift16;
3207
3208         case O (O_NOT, SL):             /* not.l */
3209           if (fetch2 (sd, &code->src, &rd))
3210             goto end;
3211           rd = ~rd; 
3212           v = 0;
3213           goto shift32;
3214
3215         case O (O_SHLL, SB):    /* shll.b */
3216         case O (O_SHLR, SB):    /* shlr.b */
3217           if (fetch2 (sd, &code->dst, &rd))
3218             goto end;
3219
3220           if (memcmp (&code->src, &code->dst, sizeof (code->src)) == 0)
3221             ea = 1;             /* unary  op */
3222           else                  /* binary op */
3223             fetch (sd, &code->src, &ea);
3224
3225           if (code->opcode == O (O_SHLL, SB))
3226             {
3227               v = (ea > 8);
3228               c = rd & (0x80 >> (ea - 1));
3229               rd <<= ea;
3230             }
3231           else
3232             {
3233               v = 0;
3234               c = rd & (1 << (ea - 1));
3235               rd = (unsigned char) rd >> ea;
3236             }
3237           goto shift8;
3238
3239         case O (O_SHLL, SW):    /* shll.w */
3240         case O (O_SHLR, SW):    /* shlr.w */
3241           if (fetch2 (sd, &code->dst, &rd))
3242             goto end;
3243
3244           if (memcmp (&code->src, &code->dst, sizeof (code->src)) == 0)
3245             ea = 1;             /* unary  op */
3246           else
3247             fetch (sd, &code->src, &ea);
3248
3249           if (code->opcode == O (O_SHLL, SW))
3250             {
3251               v = (ea > 16);
3252               c = rd & (0x8000 >> (ea - 1));
3253               rd <<= ea;
3254             }
3255           else
3256             {
3257               v = 0;
3258               c = rd & (1 << (ea - 1));
3259               rd = (unsigned short) rd >> ea;
3260             }
3261           goto shift16;
3262
3263         case O (O_SHLL, SL):    /* shll.l */
3264         case O (O_SHLR, SL):    /* shlr.l */
3265           if (fetch2 (sd, &code->dst, &rd))
3266             goto end;
3267
3268           if (memcmp (&code->src, &code->dst, sizeof (code->src)) == 0)
3269             ea = 1;             /* unary  op */
3270           else
3271             fetch (sd, &code->src, &ea);
3272
3273           if (code->opcode == O (O_SHLL, SL))
3274             {
3275               v = (ea > 32);
3276               c = rd & (0x80000000 >> (ea - 1));
3277               rd <<= ea;
3278             }
3279           else
3280             {
3281               v = 0;
3282               c = rd & (1 << (ea - 1));
3283               rd = (unsigned int) rd >> ea;
3284             }
3285           goto shift32;
3286
3287         case O (O_SHAL, SB):
3288         case O (O_SHAR, SB):
3289           if (fetch2 (sd, &code->dst, &rd))
3290             goto end;
3291
3292           if (code->src.type == X (OP_IMM, SB))
3293             fetch (sd, &code->src, &ea);
3294           else
3295             ea = 1;
3296
3297           if (code->opcode == O (O_SHAL, SB))
3298             {
3299               c = rd & (0x80 >> (ea - 1));
3300               res = rd >> (7 - ea);
3301               v = ((res & 1) && !(res & 2)) 
3302                 || (!(res & 1) && (res & 2));
3303               rd <<= ea;
3304             }
3305           else
3306             {
3307               c = rd & (1 << (ea - 1));
3308               v = 0;
3309               rd = ((signed char) rd) >> ea;
3310             }
3311           goto shift8;
3312
3313         case O (O_SHAL, SW):
3314         case O (O_SHAR, SW):
3315           if (fetch2 (sd, &code->dst, &rd))
3316             goto end;
3317
3318           if (code->src.type == X (OP_IMM, SW))
3319             fetch (sd, &code->src, &ea);
3320           else
3321             ea = 1;
3322
3323           if (code->opcode == O (O_SHAL, SW))
3324             {
3325               c = rd & (0x8000 >> (ea - 1));
3326               res = rd >> (15 - ea);
3327               v = ((res & 1) && !(res & 2)) 
3328                 || (!(res & 1) && (res & 2));
3329               rd <<= ea;
3330             }
3331           else
3332             {
3333               c = rd & (1 << (ea - 1));
3334               v = 0;
3335               rd = ((signed short) rd) >> ea;
3336             }
3337           goto shift16;
3338
3339         case O (O_SHAL, SL):
3340         case O (O_SHAR, SL):
3341           if (fetch2 (sd, &code->dst, &rd))
3342             goto end;
3343
3344           if (code->src.type == X (OP_IMM, SL))
3345             fetch (sd, &code->src, &ea);
3346           else
3347             ea = 1;
3348
3349           if (code->opcode == O (O_SHAL, SL))
3350             {
3351               c = rd & (0x80000000 >> (ea - 1));
3352               res = rd >> (31 - ea);
3353               v = ((res & 1) && !(res & 2)) 
3354                 || (!(res & 1) && (res & 2));
3355               rd <<= ea;
3356             }
3357           else
3358             {
3359               c = rd & (1 << (ea - 1));
3360               v = 0;
3361               rd = ((signed int) rd) >> ea;
3362             }
3363           goto shift32;
3364
3365         case O (O_ROTL, SB):
3366         case O (O_ROTR, SB):
3367           if (fetch2 (sd, &code->dst, &rd))
3368             goto end;
3369
3370           if (code->src.type == X (OP_IMM, SB))
3371             fetch (sd, &code->src, &ea);
3372           else
3373             ea = 1;
3374
3375           while (ea--)
3376             if (code->opcode == O (O_ROTL, SB))
3377               {
3378                 c = rd & 0x80;
3379                 rd <<= 1;
3380                 if (c)
3381                   rd |= 1;
3382               }
3383             else
3384               {
3385                 c = rd & 1;
3386                 rd = ((unsigned char) rd) >> 1;
3387                 if (c)
3388                   rd |= 0x80;
3389               }
3390
3391           v = 0;
3392           goto shift8;
3393
3394         case O (O_ROTL, SW):
3395         case O (O_ROTR, SW):
3396           if (fetch2 (sd, &code->dst, &rd))
3397             goto end;
3398
3399           if (code->src.type == X (OP_IMM, SW))
3400             fetch (sd, &code->src, &ea);
3401           else
3402             ea = 1;
3403
3404           while (ea--)
3405             if (code->opcode == O (O_ROTL, SW))
3406               {
3407                 c = rd & 0x8000;
3408                 rd <<= 1;
3409                 if (c)
3410                   rd |= 1;
3411               }
3412             else
3413               {
3414                 c = rd & 1;
3415                 rd = ((unsigned short) rd) >> 1;
3416                 if (c)
3417                   rd |= 0x8000;
3418               }
3419
3420           v = 0;
3421           goto shift16;
3422
3423         case O (O_ROTL, SL):
3424         case O (O_ROTR, SL):
3425           if (fetch2 (sd, &code->dst, &rd))
3426             goto end;
3427
3428           if (code->src.type == X (OP_IMM, SL))
3429             fetch (sd, &code->src, &ea);
3430           else
3431             ea = 1;
3432
3433           while (ea--)
3434             if (code->opcode == O (O_ROTL, SL))
3435               {
3436                 c = rd & 0x80000000;
3437                 rd <<= 1;
3438                 if (c)
3439                   rd |= 1;
3440               }
3441             else
3442               {
3443                 c = rd & 1;
3444                 rd = ((unsigned int) rd) >> 1;
3445                 if (c)
3446                   rd |= 0x80000000;
3447               }
3448
3449           v = 0;
3450           goto shift32;
3451
3452         case O (O_ROTXL, SB):
3453         case O (O_ROTXR, SB):
3454           if (fetch2 (sd, &code->dst, &rd))
3455             goto end;
3456
3457           if (code->src.type == X (OP_IMM, SB))
3458             fetch (sd, &code->src, &ea);
3459           else
3460             ea = 1;
3461
3462           while (ea--)
3463             if (code->opcode == O (O_ROTXL, SB))
3464               {
3465                 res = rd & 0x80;
3466                 rd <<= 1;
3467                 if (C)
3468                   rd |= 1;
3469                 c = res;
3470               }
3471             else
3472               {
3473                 res = rd & 1;
3474                 rd = ((unsigned char) rd) >> 1;
3475                 if (C)
3476                   rd |= 0x80;
3477                 c = res;
3478               }
3479
3480           v = 0;
3481           goto shift8;
3482
3483         case O (O_ROTXL, SW):
3484         case O (O_ROTXR, SW):
3485           if (fetch2 (sd, &code->dst, &rd))
3486             goto end;
3487
3488           if (code->src.type == X (OP_IMM, SW))
3489             fetch (sd, &code->src, &ea);
3490           else
3491             ea = 1;
3492
3493           while (ea--)
3494             if (code->opcode == O (O_ROTXL, SW))
3495               {
3496                 res = rd & 0x8000;
3497                 rd <<= 1;
3498                 if (C)
3499                   rd |= 1;
3500                 c = res;
3501               }
3502             else
3503               {
3504                 res = rd & 1;
3505                 rd = ((unsigned short) rd) >> 1;
3506                 if (C)
3507                   rd |= 0x8000;
3508                 c = res;
3509               }
3510
3511           v = 0;
3512           goto shift16;
3513
3514         case O (O_ROTXL, SL):
3515         case O (O_ROTXR, SL):
3516           if (fetch2 (sd, &code->dst, &rd))
3517             goto end;
3518
3519           if (code->src.type == X (OP_IMM, SL))
3520             fetch (sd, &code->src, &ea);
3521           else
3522             ea = 1;
3523
3524           while (ea--)
3525             if (code->opcode == O (O_ROTXL, SL))
3526               {
3527                 res = rd & 0x80000000;
3528                 rd <<= 1;
3529                 if (C)
3530                   rd |= 1;
3531                 c = res;
3532               }
3533             else
3534               {
3535                 res = rd & 1;
3536                 rd = ((unsigned int) rd) >> 1;
3537                 if (C)
3538                   rd |= 0x80000000;
3539                 c = res;
3540               }
3541
3542           v = 0;
3543           goto shift32;
3544
3545         case O (O_JMP, SN):
3546         case O (O_JMP, SL):
3547         case O (O_JMP, SB):             /* jmp */
3548         case O (O_JMP, SW):
3549           fetch (sd, &code->src, &pc);
3550           goto end;
3551
3552         case O (O_JSR, SN):
3553         case O (O_JSR, SL):
3554         case O (O_JSR, SB):             /* jsr, jump to subroutine */
3555         case O (O_JSR, SW):
3556           if (fetch (sd, &code->src, &pc))
3557             goto end;
3558         call:
3559           tmp = h8_get_reg (sd, SP_REGNUM);
3560
3561           if (h8300hmode && !h8300_normal_mode)
3562             {
3563               tmp -= 4;
3564               SET_MEMORY_L (tmp, code->next_pc);
3565             }
3566           else
3567             {
3568               tmp -= 2;
3569               SET_MEMORY_W (tmp, code->next_pc);
3570             }
3571           h8_set_reg (sd, SP_REGNUM, tmp);
3572
3573           goto end;
3574
3575         case O (O_BSR, SW):
3576         case O (O_BSR, SL):
3577         case O (O_BSR, SB):             /* bsr, branch to subroutine */
3578           if (fetch (sd, &code->src, &res))
3579             goto end;
3580           pc = code->next_pc + res;
3581           goto call;
3582
3583         case O (O_RTE, SN):             /* rte, return from exception */
3584         rte:
3585           /* Pops exr and ccr before pc -- otherwise identical to rts.  */
3586           tmp = h8_get_reg (sd, SP_REGNUM);
3587
3588           if (h8300smode)                       /* pop exr */
3589             {
3590               h8_set_exr (sd, GET_MEMORY_L (tmp));
3591               tmp += 4;
3592             }
3593           if (h8300hmode && !h8300_normal_mode)
3594             {
3595               h8_set_ccr (sd, GET_MEMORY_L (tmp));
3596               tmp += 4;
3597               pc = GET_MEMORY_L (tmp);
3598               tmp += 4;
3599             }
3600           else
3601             {
3602               h8_set_ccr (sd, GET_MEMORY_W (tmp));
3603               tmp += 2;
3604               pc = GET_MEMORY_W (tmp);
3605               tmp += 2;
3606             }
3607
3608           GETSR (sd);
3609           h8_set_reg (sd, SP_REGNUM, tmp);
3610           goto end;
3611
3612         case O (O_RTS, SN):             /* rts, return from subroutine */
3613         rts:
3614           tmp = h8_get_reg (sd, SP_REGNUM);
3615
3616           if (h8300hmode && !h8300_normal_mode)
3617             {
3618               pc = GET_MEMORY_L (tmp);
3619               tmp += 4;
3620             }
3621           else
3622             {
3623               pc = GET_MEMORY_W (tmp);
3624               tmp += 2;
3625             }
3626
3627           h8_set_reg (sd, SP_REGNUM, tmp);
3628           goto end;
3629
3630         case O (O_ILL, SB):             /* illegal */
3631           sim_engine_set_run_state (sd, sim_stopped, SIGILL);
3632           goto end;
3633
3634         case O (O_SLEEP, SN):           /* sleep */
3635           /* Check for magic numbers in r1 and r2.  */
3636           if ((h8_get_reg (sd, R1_REGNUM) & 0xffff) == LIBC_EXIT_MAGIC1 &&
3637               (h8_get_reg (sd, R2_REGNUM) & 0xffff) == LIBC_EXIT_MAGIC2 &&
3638               SIM_WIFEXITED (h8_get_reg (sd, 0)))
3639             {
3640               /* This trap comes from _exit, not from gdb.  */
3641               sim_engine_set_run_state (sd, sim_exited, 
3642                                         SIM_WEXITSTATUS (h8_get_reg (sd, 0)));
3643             }
3644 #if 0
3645           /* Unfortunately this won't really work, because
3646              when we take a breakpoint trap, R0 has a "random", 
3647              user-defined value.  Don't see any immediate solution.  */
3648           else if (SIM_WIFSTOPPED (h8_get_reg (sd, 0)))
3649             {
3650               /* Pass the stop signal up to gdb.  */
3651               sim_engine_set_run_state (sd, sim_stopped, 
3652                                         SIM_WSTOPSIG (h8_get_reg (sd, 0)));
3653             }
3654 #endif
3655           else
3656             {
3657               /* Treat it as a sigtrap.  */
3658               sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
3659             }
3660           goto end;
3661
3662         case O (O_TRAPA, SB):           /* trapa */
3663           if (fetch (sd, &code->src, &res))
3664             goto end;                   /* res is vector number.  */
3665   
3666           tmp = h8_get_reg (sd, SP_REGNUM);
3667           if(h8300_normal_mode)
3668             {
3669               tmp -= 2;
3670               SET_MEMORY_W (tmp, code->next_pc);
3671               tmp -= 2;
3672               SET_MEMORY_W (tmp, h8_get_ccr (sd));
3673             }
3674           else
3675             {
3676               tmp -= 4;
3677               SET_MEMORY_L (tmp, code->next_pc);
3678               tmp -= 4;
3679               SET_MEMORY_L (tmp, h8_get_ccr (sd));
3680             }
3681           intMaskBit = 1;
3682           BUILDSR (sd);
3683  
3684           if (h8300smode)
3685             {
3686               tmp -= 4;
3687               SET_MEMORY_L (tmp, h8_get_exr (sd));
3688             }
3689
3690           h8_set_reg (sd, SP_REGNUM, tmp);
3691
3692           if(h8300_normal_mode)
3693             pc = GET_MEMORY_L (0x10 + res * 2); /* Vector addresses are 0x10,0x12,0x14 and 0x16 */
3694           else
3695             pc = GET_MEMORY_L (0x20 + res * 4);
3696           goto end;
3697
3698         case O (O_BPT, SN):
3699           sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
3700           goto end;
3701
3702         case O (O_BSETEQ, SB):
3703           if (Z)
3704             goto bset;
3705           goto next;
3706
3707         case O (O_BSETNE, SB):
3708           if (!Z)
3709             goto bset;
3710           goto next;
3711
3712         case O (O_BCLREQ, SB):
3713           if (Z)
3714             goto bclr;
3715           goto next;
3716
3717         case O (O_BCLRNE, SB):
3718           if (!Z)
3719             goto bclr;
3720           goto next;
3721
3722           OBITOP (O_BNOT, 1, 1, ea ^= m);               /* bnot */
3723           OBITOP (O_BTST, 1, 0, nz = ea & m);           /* btst */
3724         bset:
3725           OBITOP (O_BSET, 1, 1, ea |= m);               /* bset */
3726         bclr:
3727           OBITOP (O_BCLR, 1, 1, ea &= ~m);              /* bclr */
3728           OBITOP (O_BLD, 1, 0, c = ea & m);             /* bld  */
3729           OBITOP (O_BILD, 1, 0, c = !(ea & m));         /* bild */
3730           OBITOP (O_BST, 1, 1, ea &= ~m;
3731                   if (C) ea |= m);                      /* bst  */
3732           OBITOP (O_BIST, 1, 1, ea &= ~m;
3733                   if (!C) ea |= m);                     /* bist */
3734           OBITOP (O_BSTZ, 1, 1, ea &= ~m;
3735                   if (Z) ea |= m);                      /* bstz */
3736           OBITOP (O_BISTZ, 1, 1, ea &= ~m;
3737                   if (!Z) ea |= m);                     /* bistz */
3738           OBITOP (O_BAND, 1, 0, c = (ea & m) && C);     /* band */
3739           OBITOP (O_BIAND, 1, 0, c = !(ea & m) && C);   /* biand */
3740           OBITOP (O_BOR, 1, 0, c = (ea & m) || C);      /* bor  */
3741           OBITOP (O_BIOR, 1, 0, c = !(ea & m) || C);    /* bior */
3742           OBITOP (O_BXOR, 1, 0, c = ((ea & m) != 0)!= C);       /* bxor */
3743           OBITOP (O_BIXOR, 1, 0, c = !(ea & m) != C);   /* bixor */
3744
3745         case O (O_BFLD, SB):                            /* bfld */
3746           /* bitfield load */
3747           ea = 0;
3748           if (fetch (sd, &code->src, &bit))
3749             goto end;
3750
3751           if (bit != 0)
3752             {
3753               if (fetch (sd, &code->dst, &ea))
3754                 goto end;
3755
3756               ea &= bit;
3757               while (!(bit & 1))
3758                 {
3759                   ea  >>= 1;
3760                   bit >>= 1;
3761                 }
3762             }
3763           if (store (sd, &code->op3, ea))
3764             goto end;
3765
3766           goto next;
3767
3768         case O(O_BFST, SB):                     /* bfst */
3769           /* bitfield store */
3770           /* NOTE: the imm8 value is in dst, and the ea value
3771              (which is actually the destination) is in op3.
3772              It has to be that way, to avoid breaking the assembler.  */
3773
3774           if (fetch (sd, &code->dst, &bit))     /* imm8 */
3775             goto end;
3776           if (bit == 0)                         /* noop -- nothing to do.  */
3777             goto next;
3778
3779           if (fetch (sd, &code->src, &rd))      /* reg8 src */
3780             goto end;
3781
3782           if (fetch2 (sd, &code->op3, &ea))     /* ea dst */
3783             goto end;
3784
3785           /* Left-shift the register data into position.  */
3786           for (tmp = bit; !(tmp & 1); tmp >>= 1)
3787             rd <<= 1;
3788
3789           /* Combine it with the neighboring bits.  */
3790           ea = (ea & ~bit) | (rd & bit);
3791
3792           /* Put it back.  */
3793           if (store2 (sd, &code->op3, ea))
3794             goto end;
3795           goto next;
3796
3797         case O (O_CLRMAC, SN):          /* clrmac */
3798           h8_set_mach (sd, 0);
3799           h8_set_macl (sd, 0);
3800           h8_set_macZ (sd, 1);
3801           h8_set_macV (sd, 0);
3802           h8_set_macN (sd, 0);
3803           goto next;
3804
3805         case O (O_STMAC, SL):           /* stmac, 260 */
3806           switch (code->src.type) {
3807           case X (OP_MACH, SL): 
3808             res = h8_get_mach (sd);
3809             if (res & 0x200)            /* sign extend */
3810               res |= 0xfffffc00;
3811             break;
3812           case X (OP_MACL, SL): 
3813             res = h8_get_macl (sd);
3814             break;
3815           default:      goto illegal;
3816           }
3817           nz = !h8_get_macZ (sd);
3818           n = h8_get_macN (sd);
3819           v = h8_get_macV (sd);
3820
3821           if (store (sd, &code->dst, res))
3822             goto end;
3823
3824           goto next;
3825
3826         case O (O_LDMAC, SL):           /* ldmac, 179 */
3827           if (fetch (sd, &code->src, &rd))
3828             goto end;
3829
3830           switch (code->dst.type) {
3831           case X (OP_MACH, SL): 
3832             rd &= 0x3ff;                /* Truncate to 10 bits */
3833             h8_set_mach (sd, rd);
3834             break;
3835           case X (OP_MACL, SL): 
3836             h8_set_macl (sd, rd);
3837             break;
3838           default:      goto illegal;
3839           }
3840           h8_set_macV (sd, 0);
3841           goto next;
3842
3843         case O (O_MAC, SW):
3844           if (fetch (sd, &code->src, &rd) ||
3845               fetch (sd, &code->dst, &res))
3846             goto end;
3847
3848           /* Ye gods, this is non-portable!
3849              However, the existing mul/div code is similar.  */
3850           res = SEXTSHORT (res) * SEXTSHORT (rd);
3851
3852           if (h8_get_macS (sd))         /* Saturating mode */
3853             {
3854               long long mac = h8_get_macl (sd);
3855
3856               if (mac & 0x80000000)             /* sign extend */
3857                 mac |= 0xffffffff00000000LL;
3858
3859               mac += res;
3860               if (mac > 0x7fffffff || mac < 0xffffffff80000000LL)
3861                 h8_set_macV (sd, 1);
3862               h8_set_macZ (sd, (mac == 0));
3863               h8_set_macN (sd, (mac  < 0));
3864               h8_set_macl (sd, (int) mac);
3865             }
3866           else                          /* "Less Saturating" mode */
3867             {
3868               long long mac = h8_get_mach (sd);
3869               mac <<= 32;
3870               mac += h8_get_macl (sd);
3871
3872               if (mac & 0x20000000000LL)        /* sign extend */
3873                 mac |= 0xfffffc0000000000LL;
3874
3875               mac += res;
3876               if (mac > 0x1ffffffffffLL || 
3877                   mac < (long long) 0xfffffe0000000000LL)
3878                 h8_set_macV (sd, 1);
3879               h8_set_macZ (sd, (mac == 0));
3880               h8_set_macN (sd, (mac  < 0));
3881               h8_set_macl (sd, (int) mac);
3882               mac >>= 32;
3883               h8_set_mach (sd, (int) (mac & 0x3ff));
3884             }
3885           goto next;
3886
3887         case O (O_MULS, SW):            /* muls.w */
3888           if (fetch (sd, &code->src, &ea) ||
3889               fetch (sd, &code->dst, &rd))
3890             goto end;
3891
3892           ea = SEXTSHORT (ea);
3893           res = SEXTSHORT (ea * SEXTSHORT (rd));
3894
3895           n  = res & 0x8000;
3896           nz = res & 0xffff;
3897           if (store (sd, &code->dst, res))
3898             goto end;
3899
3900           goto next;
3901
3902         case O (O_MULS, SL):            /* muls.l */
3903           if (fetch (sd, &code->src, &ea) ||
3904               fetch (sd, &code->dst, &rd))
3905             goto end;
3906
3907           res = ea * rd;
3908
3909           n  = res & 0x80000000;
3910           nz = res & 0xffffffff;
3911           if (store (sd, &code->dst, res))
3912             goto end;
3913           goto next;
3914
3915         case O (O_MULSU, SL):           /* muls/u.l */
3916           if (fetch (sd, &code->src, &ea) ||
3917               fetch (sd, &code->dst, &rd))
3918             goto end;
3919
3920           /* Compute upper 32 bits of the 64-bit result.  */
3921           res = (((long long) ea) * ((long long) rd)) >> 32;
3922
3923           n  = res & 0x80000000;
3924           nz = res & 0xffffffff;
3925           if (store (sd, &code->dst, res))
3926             goto end;
3927           goto next;
3928
3929         case O (O_MULU, SW):            /* mulu.w */
3930           if (fetch (sd, &code->src, &ea) ||
3931               fetch (sd, &code->dst, &rd))
3932             goto end;
3933
3934           res = UEXTSHORT ((UEXTSHORT (ea) * UEXTSHORT (rd)));
3935
3936           /* Don't set Z or N.  */
3937           if (store (sd, &code->dst, res))
3938             goto end;
3939
3940           goto next;
3941
3942         case O (O_MULU, SL):            /* mulu.l */
3943           if (fetch (sd, &code->src, &ea) ||
3944               fetch (sd, &code->dst, &rd))
3945             goto end;
3946
3947           res = ea * rd;
3948
3949           /* Don't set Z or N.  */
3950           if (store (sd, &code->dst, res))
3951             goto end;
3952
3953           goto next;
3954
3955         case O (O_MULUU, SL):           /* mulu/u.l */
3956           if (fetch (sd, &code->src, &ea) ||
3957               fetch (sd, &code->dst, &rd))
3958             goto end;
3959
3960           /* Compute upper 32 bits of the 64-bit result.  */
3961           res = (((unsigned long long) (unsigned) ea) *
3962                  ((unsigned long long) (unsigned) rd)) >> 32;
3963
3964           /* Don't set Z or N.  */
3965           if (store (sd, &code->dst, res))
3966             goto end;
3967
3968           goto next;
3969
3970         case O (O_MULXS, SB):           /* mulxs.b */
3971           if (fetch (sd, &code->src, &ea) ||
3972               fetch (sd, &code->dst, &rd))
3973             goto end;
3974
3975           ea = SEXTCHAR (ea);
3976           res = ea * SEXTCHAR (rd);
3977
3978           n  = res & 0x8000;
3979           nz = res & 0xffff;
3980           if (store (sd, &code->dst, res))
3981             goto end;
3982
3983           goto next;
3984
3985         case O (O_MULXS, SW):           /* mulxs.w */
3986           if (fetch (sd, &code->src, &ea) ||
3987               fetch (sd, &code->dst, &rd))
3988             goto end;
3989
3990           ea = SEXTSHORT (ea);
3991           res = ea * SEXTSHORT (rd & 0xffff);
3992
3993           n  = res & 0x80000000;
3994           nz = res & 0xffffffff;
3995           if (store (sd, &code->dst, res))
3996             goto end;
3997
3998           goto next;
3999
4000         case O (O_MULXU, SB):           /* mulxu.b */
4001           if (fetch (sd, &code->src, &ea) ||
4002               fetch (sd, &code->dst, &rd))
4003             goto end;
4004
4005           res = UEXTCHAR (ea) * UEXTCHAR (rd);
4006
4007           if (store (sd, &code->dst, res))
4008             goto end;
4009
4010           goto next;
4011
4012         case O (O_MULXU, SW):           /* mulxu.w */
4013           if (fetch (sd, &code->src, &ea) ||
4014               fetch (sd, &code->dst, &rd))
4015             goto end;
4016
4017           res = UEXTSHORT (ea) * UEXTSHORT (rd);
4018
4019           if (store (sd, &code->dst, res))
4020             goto end;
4021
4022           goto next;
4023
4024         case O (O_TAS, SB):             /* tas (test and set) */
4025           if (!h8300sxmode)             /* h8sx can use any register. */
4026             switch (code->src.reg)
4027               {
4028               case R0_REGNUM:
4029               case R1_REGNUM:
4030               case R4_REGNUM:
4031               case R5_REGNUM:
4032                 break;
4033               default:
4034                 goto illegal;
4035               }
4036
4037           if (fetch (sd, &code->src, &res))
4038             goto end;
4039           if (store (sd, &code->src, res | 0x80))
4040             goto end;
4041
4042           goto just_flags_log8;
4043
4044         case O (O_DIVU, SW):                    /* divu.w */
4045           if (fetch (sd, &code->src, &ea) ||
4046               fetch (sd, &code->dst, &rd))
4047             goto end;
4048
4049           n  = ea & 0x8000;
4050           nz = ea & 0xffff;
4051           if (ea)
4052             res = (unsigned) (UEXTSHORT (rd) / UEXTSHORT (ea));
4053           else
4054             res = 0;
4055
4056           if (store (sd, &code->dst, res))
4057             goto end;
4058           goto next;
4059
4060         case O (O_DIVU, SL):                    /* divu.l */
4061           if (fetch (sd, &code->src, &ea) ||
4062               fetch (sd, &code->dst, &rd))
4063             goto end;
4064
4065           n  = ea & 0x80000000;
4066           nz = ea & 0xffffffff;
4067           if (ea)
4068             res = (unsigned) rd / ea;
4069           else
4070             res = 0;
4071
4072           if (store (sd, &code->dst, res))
4073             goto end;
4074           goto next;
4075
4076         case O (O_DIVS, SW):                    /* divs.w */
4077           if (fetch (sd, &code->src, &ea) ||
4078               fetch (sd, &code->dst, &rd))
4079             goto end;
4080
4081           if (ea)
4082             {
4083               res = SEXTSHORT (rd) / SEXTSHORT (ea);
4084               nz  = 1;
4085             }
4086           else
4087             {
4088               res = 0;
4089               nz  = 0;
4090             }
4091
4092           n = res & 0x8000;
4093           if (store (sd, &code->dst, res))
4094             goto end;
4095           goto next;
4096
4097         case O (O_DIVS, SL):                    /* divs.l */
4098           if (fetch (sd, &code->src, &ea) ||
4099               fetch (sd, &code->dst, &rd))
4100             goto end;
4101
4102           if (ea)
4103             {
4104               res = rd / ea;
4105               nz  = 1;
4106             }
4107           else
4108             {
4109               res = 0;
4110               nz  = 0;
4111             }
4112
4113           n = res & 0x80000000;
4114           if (store (sd, &code->dst, res))
4115             goto end;
4116           goto next;
4117
4118         case O (O_DIVXU, SB):                   /* divxu.b */
4119           if (fetch (sd, &code->src, &ea) ||
4120               fetch (sd, &code->dst, &rd))
4121             goto end;
4122
4123           rd = UEXTSHORT (rd);
4124           ea = UEXTCHAR (ea);
4125
4126           n  = ea & 0x80;
4127           nz = ea & 0xff;
4128           if (ea)
4129             {
4130               tmp = (unsigned) rd % ea;
4131               res = (unsigned) rd / ea;
4132             }
4133           else
4134             {
4135               tmp = 0;
4136               res = 0;
4137             }
4138
4139           if (store (sd, &code->dst, (res & 0xff) | (tmp << 8)))
4140             goto end;
4141           goto next;
4142
4143         case O (O_DIVXU, SW):                   /* divxu.w */
4144           if (fetch (sd, &code->src, &ea) ||
4145               fetch (sd, &code->dst, &rd))
4146             goto end;
4147
4148           ea = UEXTSHORT (ea);
4149
4150           n  = ea & 0x8000;
4151           nz = ea & 0xffff;
4152           if (ea)
4153             {
4154               tmp = (unsigned) rd % ea;
4155               res = (unsigned) rd / ea;
4156             }
4157           else
4158             {
4159               tmp = 0;
4160               res = 0;
4161             }
4162
4163           if (store (sd, &code->dst, (res & 0xffff) | (tmp << 16)))
4164             goto end;
4165           goto next;
4166
4167         case O (O_DIVXS, SB):                   /* divxs.b */
4168           if (fetch (sd, &code->src, &ea) ||
4169               fetch (sd, &code->dst, &rd))
4170             goto end;
4171
4172           rd = SEXTSHORT (rd);
4173           ea = SEXTCHAR (ea);
4174
4175           if (ea)
4176             {
4177               tmp = (int) rd % (int) ea;
4178               res = (int) rd / (int) ea;
4179               nz  = 1;
4180             }
4181           else
4182             {
4183               tmp = 0;
4184               res = 0;
4185               nz  = 0;
4186             }
4187
4188           n = res & 0x8000;
4189           if (store (sd, &code->dst, (res & 0xff) | (tmp << 8)))
4190             goto end;
4191           goto next;
4192
4193         case O (O_DIVXS, SW):                   /* divxs.w */
4194           if (fetch (sd, &code->src, &ea) ||
4195               fetch (sd, &code->dst, &rd))
4196             goto end;
4197
4198           ea = SEXTSHORT (ea);
4199
4200           if (ea)
4201             {
4202               tmp = (int) rd % (int) ea;
4203               res = (int) rd / (int) ea;
4204               nz  = 1;
4205             }
4206           else
4207             {
4208               tmp = 0;
4209               res = 0;
4210               nz  = 0;
4211             }
4212
4213           n = res & 0x80000000;
4214           if (store (sd, &code->dst, (res & 0xffff) | (tmp << 16)))
4215             goto end;
4216           goto next;
4217
4218         case O (O_EXTS, SW):                    /* exts.w, signed extend */
4219           if (fetch2 (sd, &code->dst, &rd))
4220             goto end;
4221           ea = rd & 0x80 ? -256 : 0;
4222           res = (rd & 0xff) + ea;
4223           goto log16;
4224
4225         case O (O_EXTS, SL):                    /* exts.l, signed extend */
4226           if (fetch2 (sd, &code->dst, &rd))
4227             goto end;
4228           if (code->src.type == X (OP_IMM, SL))
4229             {
4230               if (fetch (sd, &code->src, &ea))
4231                 goto end;
4232
4233               if (ea == 2)                      /* exts.l #2, nn */
4234                 {
4235                   /* Sign-extend from 8-bit to 32-bit.  */
4236                   ea = rd & 0x80 ? -256 : 0;
4237                   res = (rd & 0xff) + ea;
4238                   goto log32;
4239                 }
4240             }
4241           /* Sign-extend from 16-bit to 32-bit.  */
4242           ea = rd & 0x8000 ? -65536 : 0;
4243           res = (rd & 0xffff) + ea;
4244           goto log32;
4245
4246         case O (O_EXTU, SW):                    /* extu.w, unsigned extend */
4247           if (fetch2 (sd, &code->dst, &rd))
4248             goto end;
4249           ea = 0;
4250           res = (rd & 0xff) + ea;
4251           goto log16;
4252
4253         case O (O_EXTU, SL):                    /* extu.l, unsigned extend */
4254           if (fetch2 (sd, &code->dst, &rd))
4255             goto end;
4256           if (code->src.type == X (OP_IMM, SL))
4257             {
4258               if (fetch (sd, &code->src, &ea))
4259                 goto end;
4260
4261               if (ea == 2)                      /* extu.l #2, nn */
4262                 {
4263                   /* Zero-extend from 8-bit to 32-bit.  */
4264                   ea = 0;
4265                   res = (rd & 0xff) + ea;
4266                   goto log32;
4267                 }
4268             }
4269           /* Zero-extend from 16-bit to 32-bit.  */
4270           ea = 0;
4271           res = (rd & 0xffff) + ea;
4272           goto log32;
4273
4274         case O (O_NOP, SN):                     /* nop */
4275           goto next;
4276
4277         case O (O_STM, SL):                     /* stm, store to memory */
4278           {
4279             int nregs, firstreg, i;
4280
4281             nregs = GET_MEMORY_B (pc + 1);
4282             nregs >>= 4;
4283             nregs &= 0xf;
4284             firstreg = code->src.reg;
4285             firstreg &= 0xf;
4286             for (i = firstreg; i <= firstreg + nregs; i++)
4287               {
4288                 h8_set_reg (sd, SP_REGNUM, h8_get_reg (sd, SP_REGNUM) - 4);
4289                 SET_MEMORY_L (h8_get_reg (sd, SP_REGNUM), h8_get_reg (sd, i));
4290               }
4291           }
4292           goto next;
4293
4294         case O (O_LDM, SL):                     /* ldm,  load from memory */
4295         case O (O_RTEL, SN):                    /* rte/l, ldm plus rte */
4296         case O (O_RTSL, SN):                    /* rts/l, ldm plus rts */
4297           {
4298             int nregs, firstreg, i;
4299
4300             nregs = ((GET_MEMORY_B (pc + 1) >> 4) & 0xf);
4301             firstreg = code->dst.reg & 0xf;
4302             for (i = firstreg; i >= firstreg - nregs; i--)
4303               {
4304                 h8_set_reg (sd, i, GET_MEMORY_L (h8_get_reg (sd, SP_REGNUM)));
4305                 h8_set_reg (sd, SP_REGNUM, h8_get_reg (sd, SP_REGNUM) + 4);
4306               }
4307           }
4308           switch (code->opcode) {
4309           case O (O_RTEL, SN):
4310             goto rte;
4311           case O (O_RTSL, SN):
4312             goto rts;
4313           case O (O_LDM, SL):
4314             goto next;
4315           default:
4316             goto illegal;
4317           }
4318
4319         case O (O_DAA, SB):
4320           /* Decimal Adjust Addition.  This is for BCD arithmetic.  */
4321           res = GET_B_REG (code->src.reg);      /* FIXME fetch? */
4322           if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) && 
4323               !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
4324             res = res;          /* Value added == 0.  */
4325           else if (!c && (0  <= (res >>  4) && (res >>  4) <=  8) && 
4326                    !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
4327             res = res + 0x6;            /* Value added == 6.  */
4328           else if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) && 
4329                     h && (0 <= (res & 0xf) && (res & 0xf) <= 3))
4330             res = res + 0x6;            /* Value added == 6.  */
4331           else if (!c && (10 <= (res >>  4) && (res >>  4) <= 15) && 
4332                    !h && (0  <= (res & 0xf) && (res & 0xf) <=  9))
4333             res = res + 0x60;           /* Value added == 60.  */
4334           else if (!c && (9  <= (res >>  4) && (res >>  4) <= 15) && 
4335                    !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
4336             res = res + 0x66;           /* Value added == 66.  */
4337           else if (!c && (10 <= (res >>  4) && (res >>  4) <= 15) && 
4338                     h && (0  <= (res & 0xf) && (res & 0xf) <=  3))
4339             res = res + 0x66;           /* Value added == 66.  */
4340           else if ( c && (1 <= (res >>  4) && (res >>  4) <= 2) && 
4341                    !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
4342             res = res + 0x60;           /* Value added == 60.  */
4343           else if ( c && (1  <= (res >>  4) && (res >>  4) <=  2) && 
4344                    !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
4345             res = res + 0x66;           /* Value added == 66.  */
4346           else if (c && (1 <= (res >>  4) && (res >>  4) <= 3) && 
4347                    h && (0 <= (res & 0xf) && (res & 0xf) <= 3))
4348             res = res + 0x66;           /* Value added == 66.  */
4349
4350           goto alu8;
4351
4352         case O (O_DAS, SB):
4353           /* Decimal Adjust Subtraction.  This is for BCD arithmetic.  */
4354           res = GET_B_REG (code->src.reg); /* FIXME fetch, fetch2... */
4355           if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) && 
4356               !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
4357             res = res;          /* Value added == 0.  */
4358           else if (!c && (0 <= (res >>  4) && (res >>  4) <=  8) && 
4359                     h && (6 <= (res & 0xf) && (res & 0xf) <= 15))
4360             res = res + 0xfa;           /* Value added == 0xfa.  */
4361           else if ( c && (7 <= (res >>  4) && (res >>  4) <= 15) && 
4362                    !h && (0 <= (res & 0xf) && (res & 0xf) <=  9))
4363             res = res + 0xa0;           /* Value added == 0xa0.  */
4364           else if (c && (6 <= (res >>  4) && (res >>  4) <= 15) && 
4365                    h && (6 <= (res & 0xf) && (res & 0xf) <= 15))
4366             res = res + 0x9a;           /* Value added == 0x9a.  */
4367
4368           goto alu8;
4369
4370         default:
4371         illegal:
4372           sim_engine_set_run_state (sd, sim_stopped, SIGILL);
4373           goto end;
4374
4375         }
4376
4377       (*sim_callback->printf_filtered) (sim_callback,
4378                                         "sim_resume: internal error.\n");
4379       sim_engine_set_run_state (sd, sim_stopped, SIGILL);
4380       goto end;
4381
4382     setc:
4383       if (code->dst.type == X (OP_CCR, SB) ||
4384           code->dst.type == X (OP_CCR, SW))
4385         {
4386           h8_set_ccr (sd, res);
4387           GETSR (sd);
4388         }
4389       else if (h8300smode &&
4390                (code->dst.type == X (OP_EXR, SB) ||
4391                 code->dst.type == X (OP_EXR, SW)))
4392         {
4393           h8_set_exr (sd, res);
4394           if (h8300smode)       /* Get exr.  */
4395             {
4396               trace = (h8_get_exr (sd) >> 7) & 1;
4397               intMask = h8_get_exr (sd) & 7;
4398             }
4399         }
4400       else
4401         goto illegal;
4402
4403       goto next;
4404
4405     condtrue:
4406       /* When a branch works */
4407       if (fetch (sd, &code->src, &res))
4408         goto end;
4409       if (res & 1)              /* bad address */
4410         goto illegal;
4411       pc = code->next_pc + res;
4412       goto end;
4413
4414       /* Set the cond codes from res */
4415     bitop:
4416
4417       /* Set the flags after an 8 bit inc/dec operation */
4418     just_flags_inc8:
4419       n = res & 0x80;
4420       nz = res & 0xff;
4421       v = (rd & 0x7f) == 0x7f;
4422       goto next;
4423
4424       /* Set the flags after an 16 bit inc/dec operation */
4425     just_flags_inc16:
4426       n = res & 0x8000;
4427       nz = res & 0xffff;
4428       v = (rd & 0x7fff) == 0x7fff;
4429       goto next;
4430
4431       /* Set the flags after an 32 bit inc/dec operation */
4432     just_flags_inc32:
4433       n = res & 0x80000000;
4434       nz = res & 0xffffffff;
4435       v = (rd & 0x7fffffff) == 0x7fffffff;
4436       goto next;
4437
4438     shift8:
4439       /* Set flags after an 8 bit shift op, carry,overflow set in insn */
4440       n = (rd & 0x80);
4441       nz = rd & 0xff;
4442       if (store2 (sd, &code->dst, rd))
4443         goto end;
4444       goto next;
4445
4446     shift16:
4447       /* Set flags after an 16 bit shift op, carry,overflow set in insn */
4448       n = (rd & 0x8000);
4449       nz = rd & 0xffff;
4450       if (store2 (sd, &code->dst, rd))
4451         goto end;
4452       goto next;
4453
4454     shift32:
4455       /* Set flags after an 32 bit shift op, carry,overflow set in insn */
4456       n = (rd & 0x80000000);
4457       nz = rd & 0xffffffff;
4458       if (store2 (sd, &code->dst, rd))
4459         goto end;
4460       goto next;
4461
4462     log32:
4463       if (store2 (sd, &code->dst, res))
4464         goto end;
4465
4466     just_flags_log32:
4467       /* flags after a 32bit logical operation */
4468       n = res & 0x80000000;
4469       nz = res & 0xffffffff;
4470       v = 0;
4471       goto next;
4472
4473     log16:
4474       if (store2 (sd, &code->dst, res))
4475         goto end;
4476
4477     just_flags_log16:
4478       /* flags after a 16bit logical operation */
4479       n = res & 0x8000;
4480       nz = res & 0xffff;
4481       v = 0;
4482       goto next;
4483
4484     log8:
4485       if (store2 (sd, &code->dst, res))
4486         goto end;
4487
4488     just_flags_log8:
4489       n = res & 0x80;
4490       nz = res & 0xff;
4491       v = 0;
4492       goto next;
4493
4494     alu8:
4495       if (store2 (sd, &code->dst, res))
4496         goto end;
4497
4498     just_flags_alu8:
4499       n = res & 0x80;
4500       nz = res & 0xff;
4501       c = (res & 0x100);
4502       switch (code->opcode / 4)
4503         {
4504         case O_ADD:
4505         case O_ADDX:
4506           v = ((rd & 0x80) == (ea & 0x80)
4507                && (rd & 0x80) != (res & 0x80));
4508           break;
4509         case O_SUB:
4510         case O_SUBX:
4511         case O_CMP:
4512           v = ((rd & 0x80) != (-ea & 0x80)
4513                && (rd & 0x80) != (res & 0x80));
4514           break;
4515         case O_NEG:
4516           v = (rd == 0x80);
4517           break;
4518         case O_DAA:
4519         case O_DAS:
4520           break;        /* No effect on v flag.  */
4521         }
4522       goto next;
4523
4524     alu16:
4525       if (store2 (sd, &code->dst, res))
4526         goto end;
4527
4528     just_flags_alu16:
4529       n = res & 0x8000;
4530       nz = res & 0xffff;
4531       c = (res & 0x10000);
4532       switch (code->opcode / 4)
4533         {
4534         case O_ADD:
4535         case O_ADDX:
4536           v = ((rd & 0x8000) == (ea & 0x8000)
4537                && (rd & 0x8000) != (res & 0x8000));
4538           break;
4539         case O_SUB:
4540         case O_SUBX:
4541         case O_CMP:
4542           v = ((rd & 0x8000) != (-ea & 0x8000)
4543                && (rd & 0x8000) != (res & 0x8000));
4544           break;
4545         case O_NEG:
4546           v = (rd == 0x8000);
4547           break;
4548         }
4549       goto next;
4550
4551     alu32:
4552       if (store2 (sd, &code->dst, res))
4553         goto end;
4554
4555     just_flags_alu32:
4556       n = res & 0x80000000;
4557       nz = res & 0xffffffff;
4558       switch (code->opcode / 4)
4559         {
4560         case O_ADD:
4561         case O_ADDX:
4562           v = ((rd & 0x80000000) == (ea & 0x80000000)
4563                && (rd & 0x80000000) != (res & 0x80000000));
4564           c = ((unsigned) res < (unsigned) rd) || 
4565             ((unsigned) res < (unsigned) ea);
4566           break;
4567         case O_SUB:
4568         case O_SUBX:
4569         case O_CMP:
4570           v = ((rd & 0x80000000) != (-ea & 0x80000000)
4571                && (rd & 0x80000000) != (res & 0x80000000));
4572           c = (unsigned) rd < (unsigned) -ea;
4573           break;
4574         case O_NEG:
4575           v = (rd == 0x80000000);
4576           c = res != 0;
4577           break;
4578         }
4579       goto next;
4580
4581     next:
4582       if ((res = h8_get_delayed_branch (sd)) != 0)
4583         {
4584           pc = res;
4585           h8_set_delayed_branch (sd, 0);
4586         }
4587       else
4588         pc = code->next_pc;
4589
4590     end:
4591       
4592       if (--poll_count < 0)
4593         {
4594           poll_count = POLL_QUIT_INTERVAL;
4595           if ((*sim_callback->poll_quit) != NULL
4596               && (*sim_callback->poll_quit) (sim_callback))
4597             sim_engine_set_run_state (sd, sim_stopped, SIGINT);
4598         }
4599       sim_engine_get_run_state (sd, &reason, &sigrc);
4600     } while (reason == sim_running);
4601
4602   h8_set_ticks (sd, h8_get_ticks (sd) + get_now () - tick_start);
4603   h8_set_cycles (sd, h8_get_cycles (sd) + cycles);
4604   h8_set_insts (sd, h8_get_insts (sd) + insts);
4605   h8_set_pc (sd, pc);
4606   BUILDSR (sd);
4607
4608   if (h8300smode)
4609     h8_set_exr (sd, (trace<<7) | intMask);
4610
4611   h8_set_mask (sd, oldmask);
4612   signal (SIGINT, prev);
4613 }
4614
4615 int
4616 sim_trace (SIM_DESC sd)
4617 {
4618   /* FIXME: Unfinished.  */
4619   (*sim_callback->printf_filtered) (sim_callback,
4620                                     "sim_trace: trace not supported.\n");
4621   return 1;     /* Done.  */
4622 }
4623
4624 int
4625 sim_write (SIM_DESC sd, SIM_ADDR addr, unsigned char *buffer, int size)
4626 {
4627   int i;
4628
4629   init_pointers (sd);
4630   if (addr < 0)
4631     return 0;
4632   for (i = 0; i < size; i++)
4633     {
4634       if (addr < memory_size)
4635         {
4636           h8_set_memory    (sd, addr + i, buffer[i]);
4637           h8_set_cache_idx (sd, addr + i,  0);
4638         }
4639       else
4640         {
4641           h8_set_eightbit (sd, (addr + i) & 0xff, buffer[i]);
4642         }
4643     }
4644   return size;
4645 }
4646
4647 int
4648 sim_read (SIM_DESC sd, SIM_ADDR addr, unsigned char *buffer, int size)
4649 {
4650   init_pointers (sd);
4651   if (addr < 0)
4652     return 0;
4653   if (addr < memory_size)
4654     memcpy (buffer, h8_get_memory_buf (sd) + addr, size);
4655   else
4656     memcpy (buffer, h8_get_eightbit_buf (sd) + (addr & 0xff), size);
4657   return size;
4658 }
4659
4660
4661 int
4662 sim_store_register (SIM_DESC sd, int rn, unsigned char *value, int length)
4663 {
4664   int longval;
4665   int shortval;
4666   int intval;
4667   longval = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
4668   shortval = (value[0] << 8) | (value[1]);
4669   intval = h8300hmode ? longval : shortval;
4670
4671   init_pointers (sd);
4672   switch (rn)
4673     {
4674     case PC_REGNUM:
4675       if(h8300_normal_mode)
4676         h8_set_pc (sd, shortval); /* PC for Normal mode is 2 bytes */
4677       else
4678         h8_set_pc (sd, intval);
4679       break;
4680     default:
4681       (*sim_callback->printf_filtered) (sim_callback, 
4682                                         "sim_store_register: bad regnum %d.\n",
4683                                         rn);
4684     case R0_REGNUM:
4685     case R1_REGNUM:
4686     case R2_REGNUM:
4687     case R3_REGNUM:
4688     case R4_REGNUM:
4689     case R5_REGNUM:
4690     case R6_REGNUM:
4691     case R7_REGNUM:
4692       h8_set_reg (sd, rn, intval);
4693       break;
4694     case CCR_REGNUM:
4695       h8_set_ccr (sd, intval);
4696       break;
4697     case EXR_REGNUM:
4698       h8_set_exr (sd, intval);
4699       break;
4700     case SBR_REGNUM:
4701       h8_set_sbr (sd, intval);
4702       break;
4703     case VBR_REGNUM:
4704       h8_set_vbr (sd, intval);
4705       break;
4706     case MACH_REGNUM:
4707       h8_set_mach (sd, intval);
4708       break;
4709     case MACL_REGNUM:
4710       h8_set_macl (sd, intval);
4711       break;
4712     case CYCLE_REGNUM:
4713       h8_set_cycles (sd, longval);
4714       break;
4715
4716     case INST_REGNUM:
4717       h8_set_insts (sd, longval);
4718       break;
4719
4720     case TICK_REGNUM:
4721       h8_set_ticks (sd, longval);
4722       break;
4723     }
4724   return -1;
4725 }
4726
4727 int
4728 sim_fetch_register (SIM_DESC sd, int rn, unsigned char *buf, int length)
4729 {
4730   int v;
4731   int longreg = 0;
4732
4733   init_pointers (sd);
4734
4735   if (!h8300smode && rn >= EXR_REGNUM)
4736     rn++;
4737   switch (rn)
4738     {
4739     default:
4740       (*sim_callback->printf_filtered) (sim_callback, 
4741                                         "sim_fetch_register: bad regnum %d.\n",
4742                                         rn);
4743       v = 0;
4744       break;
4745     case CCR_REGNUM:
4746       v = h8_get_ccr (sd);
4747       break;
4748     case EXR_REGNUM:
4749       v = h8_get_exr (sd);
4750       break;
4751     case PC_REGNUM:
4752       v = h8_get_pc (sd);
4753       break;
4754     case SBR_REGNUM:
4755       v = h8_get_sbr (sd);
4756       break;
4757     case VBR_REGNUM:
4758       v = h8_get_vbr (sd);
4759       break;
4760     case MACH_REGNUM:
4761       v = h8_get_mach (sd);
4762       break;
4763     case MACL_REGNUM:
4764       v = h8_get_macl (sd);
4765       break;
4766     case R0_REGNUM:
4767     case R1_REGNUM:
4768     case R2_REGNUM:
4769     case R3_REGNUM:
4770     case R4_REGNUM:
4771     case R5_REGNUM:
4772     case R6_REGNUM:
4773     case R7_REGNUM:
4774       v = h8_get_reg (sd, rn);
4775       break;
4776     case CYCLE_REGNUM:
4777       v = h8_get_cycles (sd);
4778       longreg = 1;
4779       break;
4780     case TICK_REGNUM:
4781       v = h8_get_ticks (sd);
4782       longreg = 1;
4783       break;
4784     case INST_REGNUM:
4785       v = h8_get_insts (sd);
4786       longreg = 1;
4787       break;
4788     }
4789   /* In Normal mode PC is 2 byte, but other registers are 4 byte */
4790   if ((h8300hmode || longreg) && !(rn == PC_REGNUM && h8300_normal_mode))
4791     {
4792       buf[0] = v >> 24;
4793       buf[1] = v >> 16;
4794       buf[2] = v >> 8;
4795       buf[3] = v >> 0;
4796     }
4797   else
4798     {
4799       buf[0] = v >> 8;
4800       buf[1] = v;
4801     }
4802   return -1;
4803 }
4804
4805 void
4806 sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc)
4807 {
4808   sim_engine_get_run_state (sd, reason, sigrc);
4809 }
4810
4811 /* FIXME: Rename to sim_set_mem_size.  */
4812
4813 void
4814 sim_size (int n)
4815 {
4816   /* Memory size is fixed.  */
4817 }
4818
4819 static void
4820 set_simcache_size (SIM_DESC sd, int n)
4821 {
4822   if (sd->sim_cache)
4823     free (sd->sim_cache);
4824   if (n < 2)
4825     n = 2;
4826   sd->sim_cache = (decoded_inst *) malloc (sizeof (decoded_inst) * n);
4827   memset (sd->sim_cache, 0, sizeof (decoded_inst) * n);
4828   sd->sim_cache_size = n;
4829 }
4830
4831
4832 void
4833 sim_info (SIM_DESC sd, int verbose)
4834 {
4835   double timetaken = (double) h8_get_ticks (sd) / (double) now_persec ();
4836   double virttime = h8_get_cycles (sd) / 10.0e6;
4837
4838   (*sim_callback->printf_filtered) (sim_callback,
4839                                     "\n\n#instructions executed  %10d\n",
4840                                     h8_get_insts (sd));
4841   (*sim_callback->printf_filtered) (sim_callback,
4842                                     "#cycles (v approximate) %10d\n",
4843                                     h8_get_cycles (sd));
4844   (*sim_callback->printf_filtered) (sim_callback,
4845                                     "#real time taken        %10.4f\n",
4846                                     timetaken);
4847   (*sim_callback->printf_filtered) (sim_callback,
4848                                     "#virtual time taken     %10.4f\n",
4849                                     virttime);
4850   if (timetaken != 0.0)
4851     (*sim_callback->printf_filtered) (sim_callback,
4852                                       "#simulation ratio       %10.4f\n",
4853                                       virttime / timetaken);
4854   (*sim_callback->printf_filtered) (sim_callback,
4855                                     "#compiles               %10d\n",
4856                                     h8_get_compiles (sd));
4857   (*sim_callback->printf_filtered) (sim_callback,
4858                                     "#cache size             %10d\n",
4859                                     sd->sim_cache_size);
4860
4861 #ifdef ADEBUG
4862   /* This to be conditional on `what' (aka `verbose'),
4863      however it was never passed as non-zero.  */
4864   if (1)
4865     {
4866       int i;
4867       for (i = 0; i < O_LAST; i++)
4868         {
4869           if (h8_get_stats (sd, i))
4870             (*sim_callback->printf_filtered) (sim_callback, "%d: %d\n", 
4871                                               i, h8_get_stats (sd, i));
4872         }
4873     }
4874 #endif
4875 }
4876
4877 /* Indicate whether the cpu is an H8/300 or H8/300H.
4878    FLAG is non-zero for the H8/300H.  */
4879
4880 void
4881 set_h8300h (unsigned long machine)
4882 {
4883   /* FIXME: Much of the code in sim_load can be moved to sim_open.
4884      This function being replaced by a sim_open:ARGV configuration
4885      option.  */
4886
4887   h8300hmode = h8300smode = h8300sxmode = h8300_normal_mode = 0;
4888
4889   if (machine == bfd_mach_h8300sx || machine == bfd_mach_h8300sxn)
4890     h8300sxmode = 1;
4891
4892   if (machine == bfd_mach_h8300s || machine == bfd_mach_h8300sn || h8300sxmode)
4893     h8300smode = 1;
4894
4895   if (machine == bfd_mach_h8300h || machine == bfd_mach_h8300hn || h8300smode)
4896     h8300hmode = 1;
4897
4898   if(machine == bfd_mach_h8300hn || machine == bfd_mach_h8300sn || machine == bfd_mach_h8300sxn)
4899     h8300_normal_mode = 1;
4900 }
4901
4902 /* Cover function of sim_state_free to free the cpu buffers as well.  */
4903
4904 static void
4905 free_state (SIM_DESC sd)
4906 {
4907   if (STATE_MODULES (sd) != NULL)
4908     sim_module_uninstall (sd);
4909
4910   /* Fixme: free buffers in _sim_cpu.  */
4911   sim_state_free (sd);
4912 }
4913
4914 SIM_DESC
4915 sim_open (SIM_OPEN_KIND kind, 
4916           struct host_callback_struct *callback, 
4917           struct bfd *abfd, 
4918           char **argv)
4919 {
4920   SIM_DESC sd;
4921   sim_cpu *cpu;
4922
4923   sd = sim_state_alloc (kind, callback);
4924   sd->cpu = sim_cpu_alloc (sd, 0);
4925   cpu = STATE_CPU (sd, 0);
4926   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
4927   sim_state_initialize (sd, cpu);
4928   /* sim_cpu object is new, so some initialization is needed.  */
4929   init_pointers_needed = 1;
4930
4931   /* For compatibility (FIXME: is this right?).  */
4932   current_alignment = NONSTRICT_ALIGNMENT;
4933   current_target_byte_order = BIG_ENDIAN;
4934
4935   if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
4936     {
4937       free_state (sd);
4938       return 0;
4939     }
4940
4941     /* getopt will print the error message so we just have to exit if
4942        this fails.  FIXME: Hmmm...  in the case of gdb we need getopt
4943        to call print_filtered.  */
4944   if (sim_parse_args (sd, argv) != SIM_RC_OK)
4945     {
4946       /* Uninstall the modules to avoid memory leaks,
4947          file descriptor leaks, etc.  */
4948       free_state (sd);
4949       return 0;
4950     }
4951
4952   /* Check for/establish the a reference program image.  */
4953   if (sim_analyze_program (sd,
4954                            (STATE_PROG_ARGV (sd) != NULL
4955                             ? *STATE_PROG_ARGV (sd)
4956                             : NULL), abfd) != SIM_RC_OK)
4957     {
4958       free_state (sd);
4959       return 0;
4960     }
4961
4962   /* Establish any remaining configuration options.  */
4963   if (sim_config (sd) != SIM_RC_OK)
4964     {
4965       free_state (sd);
4966       return 0;
4967     }
4968
4969   if (sim_post_argv_init (sd) != SIM_RC_OK)
4970     {
4971       /* Uninstall the modules to avoid memory leaks,
4972          file descriptor leaks, etc.  */
4973       free_state (sd);
4974       return 0;
4975     }
4976
4977   /*  sim_hw_configure (sd); */
4978
4979   /* FIXME: Much of the code in sim_load can be moved here.  */
4980
4981   sim_kind = kind;
4982   myname = argv[0];
4983   sim_callback = callback;
4984   return sd;
4985 }
4986
4987 void
4988 sim_close (SIM_DESC sd, int quitting)
4989 {
4990   /* Nothing to do.  */
4991 }
4992
4993 /* Called by gdb to load a program into memory.  */
4994
4995 SIM_RC
4996 sim_load (SIM_DESC sd, char *prog, bfd *abfd, int from_tty)
4997 {
4998   bfd *prog_bfd;
4999
5000   /* FIXME: The code below that sets a specific variant of the H8/300
5001      being simulated should be moved to sim_open().  */
5002
5003   /* See if the file is for the H8/300 or H8/300H.  */
5004   /* ??? This may not be the most efficient way.  The z8k simulator
5005      does this via a different mechanism (INIT_EXTRA_SYMTAB_INFO).  */
5006   if (abfd != NULL)
5007     prog_bfd = abfd;
5008   else
5009     prog_bfd = bfd_openr (prog, NULL);
5010   if (prog_bfd != NULL)
5011     {
5012       /* Set the cpu type.  We ignore failure from bfd_check_format
5013          and bfd_openr as sim_load_file checks too.  */
5014       if (bfd_check_format (prog_bfd, bfd_object))
5015         {
5016           set_h8300h (bfd_get_mach (prog_bfd));
5017         }
5018     }
5019
5020   /* If we're using gdb attached to the simulator, then we have to
5021      reallocate memory for the simulator.
5022
5023      When gdb first starts, it calls fetch_registers (among other
5024      functions), which in turn calls init_pointers, which allocates
5025      simulator memory.
5026
5027      The problem is when we do that, we don't know whether we're
5028      debugging an H8/300 or H8/300H program.
5029
5030      This is the first point at which we can make that determination,
5031      so we just reallocate memory now; this will also allow us to handle
5032      switching between H8/300 and H8/300H programs without exiting
5033      gdb.  */
5034
5035   if (h8300smode && !h8300_normal_mode)
5036     memory_size = H8300S_MSIZE;
5037   else if (h8300hmode && !h8300_normal_mode)
5038     memory_size = H8300H_MSIZE;
5039   else
5040     memory_size = H8300_MSIZE;
5041
5042   if (h8_get_memory_buf (sd))
5043     free (h8_get_memory_buf (sd));
5044   if (h8_get_cache_idx_buf (sd))
5045     free (h8_get_cache_idx_buf (sd));
5046   if (h8_get_eightbit_buf (sd))
5047     free (h8_get_eightbit_buf (sd));
5048
5049   h8_set_memory_buf (sd, (unsigned char *) 
5050                      calloc (sizeof (char), memory_size));
5051   h8_set_cache_idx_buf (sd, (unsigned short *) 
5052                         calloc (sizeof (short), memory_size));
5053   sd->memory_size = memory_size;
5054   h8_set_eightbit_buf (sd, (unsigned char *) calloc (sizeof (char), 256));
5055
5056   /* `msize' must be a power of two.  */
5057   if ((memory_size & (memory_size - 1)) != 0)
5058     {
5059       (*sim_callback->printf_filtered) (sim_callback, 
5060                                         "sim_load: bad memory size.\n");
5061       return SIM_RC_FAIL;
5062     }
5063   h8_set_mask (sd, memory_size - 1);
5064
5065   if (sim_load_file (sd, myname, sim_callback, prog, prog_bfd,
5066                      sim_kind == SIM_OPEN_DEBUG,
5067                      0, sim_write)
5068       == NULL)
5069     {
5070       /* Close the bfd if we opened it.  */
5071       if (abfd == NULL && prog_bfd != NULL)
5072         bfd_close (prog_bfd);
5073       return SIM_RC_FAIL;
5074     }
5075
5076   /* Close the bfd if we opened it.  */
5077   if (abfd == NULL && prog_bfd != NULL)
5078     bfd_close (prog_bfd);
5079   return SIM_RC_OK;
5080 }
5081
5082 SIM_RC
5083 sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **env)
5084 {
5085   int i = 0;
5086   int len_arg = 0;
5087   int no_of_args = 0;
5088
5089   if (abfd != NULL)
5090     h8_set_pc (sd, bfd_get_start_address (abfd));
5091   else
5092     h8_set_pc (sd, 0);
5093
5094   /* Command Line support.  */
5095   if (argv != NULL)
5096     {
5097       /* Counting the no. of commandline arguments.  */
5098       for (no_of_args = 0; argv[no_of_args] != NULL; no_of_args++)
5099         continue;
5100
5101       /* Allocating memory for the argv pointers.  */
5102       h8_set_command_line (sd, (char **) malloc ((sizeof (char *))
5103                                                  * (no_of_args + 1)));
5104
5105       for (i = 0; i < no_of_args; i++)
5106         {
5107           /* Copying the argument string.  */
5108           h8_set_cmdline_arg (sd, i, (char *) strdup (argv[i]));
5109         }
5110       h8_set_cmdline_arg (sd, i, NULL);
5111     }
5112   
5113   return SIM_RC_OK;
5114 }
5115
5116 void
5117 sim_do_command (SIM_DESC sd, char *cmd)
5118 {
5119   (*sim_callback->printf_filtered) (sim_callback,
5120                                     "This simulator does not accept any commands.\n");
5121 }
5122
5123 void
5124 sim_set_callbacks (struct host_callback_struct *ptr)
5125 {
5126   sim_callback = ptr;
5127 }