OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.1/] [sim/] [h8300/] [compile.c] - Blame information for rev 299

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 227 jeremybenn
/*
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
      const 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
                    const 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, (unsigned int *)&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, (unsigned int *)&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
      r = GET_MEMORY_B (t & h8_get_mask (sd));
1390
      if (!twice)
1391
        t += 1;
1392
      SET_L_REG (rn, t);
1393
      *val = r;
1394
      break;
1395
    case X (OP_POSTINC, SW):    /* Register indirect w/post-incr: word.  */
1396
      t = GET_L_REG (rn);
1397
      r = GET_MEMORY_W (t & h8_get_mask (sd));
1398
      if (!twice)
1399
        t += 2;
1400
      SET_L_REG (rn, t);
1401
      *val = r;
1402
      break;
1403
    case X (OP_POSTINC, SL):    /* Register indirect w/post-incr: long.  */
1404
      t = GET_L_REG (rn);
1405
      r = GET_MEMORY_L (t & h8_get_mask (sd));
1406
      if (!twice)
1407
        t += 4;
1408
      SET_L_REG (rn, t);
1409
      *val = r;
1410
      break;
1411
 
1412
    case X (OP_POSTDEC, SB):    /* Register indirect w/post-decr: byte.  */
1413
      t = GET_L_REG (rn);
1414
      r = GET_MEMORY_B (t & h8_get_mask (sd));
1415
      if (!twice)
1416
        t -= 1;
1417
      SET_L_REG (rn, t);
1418
      *val = r;
1419
      break;
1420
    case X (OP_POSTDEC, SW):    /* Register indirect w/post-decr: word.  */
1421
      t = GET_L_REG (rn);
1422
      r = GET_MEMORY_W (t & h8_get_mask (sd));
1423
      if (!twice)
1424
        t -= 2;
1425
      SET_L_REG (rn, t);
1426
      *val = r;
1427
      break;
1428
    case X (OP_POSTDEC, SL):    /* Register indirect w/post-decr: long.  */
1429
      t = GET_L_REG (rn);
1430
      r = GET_MEMORY_L (t & h8_get_mask (sd));
1431
      if (!twice)
1432
        t -= 4;
1433
      SET_L_REG (rn, t);
1434
      *val = r;
1435
      break;
1436
 
1437
    case X (OP_PREDEC, SB):     /* Register indirect w/pre-decr: byte.  */
1438
      t = GET_L_REG (rn) - 1;
1439
      SET_L_REG (rn, t);
1440
      t &= h8_get_mask (sd);
1441
      *val = GET_MEMORY_B (t);
1442
      break;
1443
 
1444
    case X (OP_PREDEC, SW):     /* Register indirect w/pre-decr: word.  */
1445
      t = GET_L_REG (rn) - 2;
1446
      SET_L_REG (rn, t);
1447
      t &= h8_get_mask (sd);
1448
      *val = GET_MEMORY_W (t);
1449
      break;
1450
 
1451
    case X (OP_PREDEC, SL):     /* Register indirect w/pre-decr: long.  */
1452
      t = GET_L_REG (rn) - 4;
1453
      SET_L_REG (rn, t);
1454
      t &= h8_get_mask (sd);
1455
      *val = GET_MEMORY_L (t);
1456
      break;
1457
 
1458
    case X (OP_PREINC, SB):     /* Register indirect w/pre-incr: byte.  */
1459
      t = GET_L_REG (rn) + 1;
1460
      SET_L_REG (rn, t);
1461
      t &= h8_get_mask (sd);
1462
      *val = GET_MEMORY_B (t);
1463
      break;
1464
 
1465
    case X (OP_PREINC, SW):     /* Register indirect w/pre-incr: long.  */
1466
      t = GET_L_REG (rn) + 2;
1467
      SET_L_REG (rn, t);
1468
      t &= h8_get_mask (sd);
1469
      *val = GET_MEMORY_W (t);
1470
      break;
1471
 
1472
    case X (OP_PREINC, SL):     /* Register indirect w/pre-incr: long.  */
1473
      t = GET_L_REG (rn) + 4;
1474
      SET_L_REG (rn, t);
1475
      t &= h8_get_mask (sd);
1476
      *val = GET_MEMORY_L (t);
1477
      break;
1478
 
1479
    case X (OP_DISP, SB):       /* Register indirect w/displacement: byte.  */
1480
      t = GET_L_REG (rn) + abs;
1481
      t &= h8_get_mask (sd);
1482
      *val = GET_MEMORY_B (t);
1483
      break;
1484
 
1485
    case X (OP_DISP, SW):       /* Register indirect w/displacement: word.  */
1486
      t = GET_L_REG (rn) + abs;
1487
      t &= h8_get_mask (sd);
1488
      *val = GET_MEMORY_W (t);
1489
      break;
1490
 
1491
    case X (OP_DISP, SL):       /* Register indirect w/displacement: long.  */
1492
      t = GET_L_REG (rn) + abs;
1493
      t &= h8_get_mask (sd);
1494
      *val =GET_MEMORY_L (t);
1495
      break;
1496
 
1497
    case X (OP_MEM, SL):        /* Absolute memory address, long.  */
1498
      t = GET_MEMORY_L (abs);
1499
      t &= h8_get_mask (sd);
1500
      *val = t;
1501
      break;
1502
 
1503
    case X (OP_MEM, SW):        /* Absolute memory address, word.  */
1504
      t = GET_MEMORY_W (abs);
1505
      t &= h8_get_mask (sd);
1506
      *val = t;
1507
      break;
1508
 
1509
    case X (OP_PCREL, SB):      /* PC relative (for jump, branch etc).  */
1510
    case X (OP_PCREL, SW):
1511
    case X (OP_PCREL, SL):
1512
    case X (OP_PCREL, SN):
1513
      *val = abs;
1514
      break;
1515
 
1516
    case X (OP_MEM, SB):        /* Why isn't this implemented?  */
1517
    default:
1518
      sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
1519
      return -1;
1520
    }
1521
  return 0;      /* Success.  */
1522
}
1523
 
1524
/* Normal fetch.  */
1525
 
1526
static int
1527
fetch (SIM_DESC sd, ea_type *arg, int *val)
1528
{
1529
  return fetch_1 (sd, arg, val, 0);
1530
}
1531
 
1532
/* Fetch which will be followed by a store to the same location.
1533
   The difference being that we don't want to do a post-increment
1534
   or post-decrement at this time: we'll do it when we store.  */
1535
 
1536
static int
1537
fetch2 (SIM_DESC sd, ea_type *arg, int *val)
1538
{
1539
  return fetch_1 (sd, arg, val, 1);
1540
}
1541
 
1542
/* Simulate a memory store.
1543
   Return 0 for success, -1 for failure.
1544
*/
1545
 
1546
static int
1547
store_1 (SIM_DESC sd, ea_type *arg, int n, int twice)
1548
{
1549
  int rn = arg->reg;
1550
  int abs = arg->literal;
1551
  int t;
1552
 
1553
  switch (arg->type)
1554
    {
1555
      /* Indexed register plus displacement mode:
1556
 
1557
         This new family of addressing modes are similar to OP_DISP
1558
         (register plus displacement), with two differences:
1559
           1) INDEXB uses only the least significant byte of the register,
1560
              INDEXW uses only the least significant word, and
1561
              INDEXL uses the entire register (just like OP_DISP).
1562
         and
1563
           2) The displacement value in abs is multiplied by two
1564
              for SW-sized operations, and by four for SL-size.
1565
 
1566
        This gives nine possible variations.
1567
      */
1568
 
1569
    case X (OP_INDEXB, SB):
1570
    case X (OP_INDEXB, SW):
1571
    case X (OP_INDEXB, SL):
1572
    case X (OP_INDEXW, SB):
1573
    case X (OP_INDEXW, SW):
1574
    case X (OP_INDEXW, SL):
1575
    case X (OP_INDEXL, SB):
1576
    case X (OP_INDEXL, SW):
1577
    case X (OP_INDEXL, SL):
1578
      t = GET_L_REG (rn);
1579
      switch (OP_KIND (arg->type)) {
1580
      case OP_INDEXB:   t &= 0xff;      break;
1581
      case OP_INDEXW:   t &= 0xffff;    break;
1582
      case OP_INDEXL:
1583
      default:          break;
1584
      }
1585
      switch (OP_SIZE (arg->type)) {
1586
      case SB:
1587
        SET_MEMORY_B ((t * 1 + abs) & h8_get_mask (sd), n);
1588
        break;
1589
      case SW:
1590
        SET_MEMORY_W ((t * 2 + abs) & h8_get_mask (sd), n);
1591
        break;
1592
      case SL:
1593
        SET_MEMORY_L ((t * 4 + abs) & h8_get_mask (sd), n);
1594
        break;
1595
      }
1596
      break;
1597
 
1598
    case X (OP_REG, SB):        /* Register direct, byte.  */
1599
      SET_B_REG (rn, n);
1600
      break;
1601
    case X (OP_REG, SW):        /* Register direct, word.  */
1602
      SET_W_REG (rn, n);
1603
      break;
1604
    case X (OP_REG, SL):        /* Register direct, long.  */
1605
      SET_L_REG (rn, n);
1606
      break;
1607
 
1608
    case X (OP_PREDEC, SB):     /* Register indirect w/pre-decr, byte.  */
1609
      t = GET_L_REG (rn);
1610
      if (!twice)
1611
        t -= 1;
1612
      SET_L_REG (rn, t);
1613
      t &= h8_get_mask (sd);
1614
      SET_MEMORY_B (t, n);
1615
 
1616
      break;
1617
    case X (OP_PREDEC, SW):     /* Register indirect w/pre-decr, word.  */
1618
      t = GET_L_REG (rn);
1619
      if (!twice)
1620
        t -= 2;
1621
      SET_L_REG (rn, t);
1622
      t &= h8_get_mask (sd);
1623
      SET_MEMORY_W (t, n);
1624
      break;
1625
 
1626
    case X (OP_PREDEC, SL):     /* Register indirect w/pre-decr, long.  */
1627
      t = GET_L_REG (rn);
1628
      if (!twice)
1629
        t -= 4;
1630
      SET_L_REG (rn, t);
1631
      t &= h8_get_mask (sd);
1632
      SET_MEMORY_L (t, n);
1633
      break;
1634
 
1635
    case X (OP_PREINC, SB):     /* Register indirect w/pre-incr, byte.  */
1636
      t = GET_L_REG (rn);
1637
      if (!twice)
1638
        t += 1;
1639
      SET_L_REG (rn, t);
1640
      t &= h8_get_mask (sd);
1641
      SET_MEMORY_B (t, n);
1642
 
1643
      break;
1644
    case X (OP_PREINC, SW):     /* Register indirect w/pre-incr, word.  */
1645
      t = GET_L_REG (rn);
1646
      if (!twice)
1647
        t += 2;
1648
      SET_L_REG (rn, t);
1649
      t &= h8_get_mask (sd);
1650
      SET_MEMORY_W (t, n);
1651
      break;
1652
 
1653
    case X (OP_PREINC, SL):     /* Register indirect w/pre-incr, long.  */
1654
      t = GET_L_REG (rn);
1655
      if (!twice)
1656
        t += 4;
1657
      SET_L_REG (rn, t);
1658
      t &= h8_get_mask (sd);
1659
      SET_MEMORY_L (t, n);
1660
      break;
1661
 
1662
    case X (OP_POSTDEC, SB):    /* Register indirect w/post-decr, byte.  */
1663
      t = GET_L_REG (rn);
1664
      SET_L_REG (rn, t - 1);
1665
      t &= h8_get_mask (sd);
1666
      SET_MEMORY_B (t, n);
1667
      break;
1668
 
1669
    case X (OP_POSTDEC, SW):    /* Register indirect w/post-decr, word.  */
1670
      t = GET_L_REG (rn);
1671
      SET_L_REG (rn, t - 2);
1672
      t &= h8_get_mask (sd);
1673
      SET_MEMORY_W (t, n);
1674
      break;
1675
 
1676
    case X (OP_POSTDEC, SL):    /* Register indirect w/post-decr, long.  */
1677
      t = GET_L_REG (rn);
1678
      SET_L_REG (rn, t - 4);
1679
      t &= h8_get_mask (sd);
1680
      SET_MEMORY_L (t, n);
1681
      break;
1682
 
1683
    case X (OP_POSTINC, SB):    /* Register indirect w/post-incr, byte.  */
1684
      t = GET_L_REG (rn);
1685
      SET_L_REG (rn, t + 1);
1686
      t &= h8_get_mask (sd);
1687
      SET_MEMORY_B (t, n);
1688
      break;
1689
 
1690
    case X (OP_POSTINC, SW):    /* Register indirect w/post-incr, word.  */
1691
      t = GET_L_REG (rn);
1692
      SET_L_REG (rn, t + 2);
1693
      t &= h8_get_mask (sd);
1694
      SET_MEMORY_W (t, n);
1695
      break;
1696
 
1697
    case X (OP_POSTINC, SL):    /* Register indirect w/post-incr, long.  */
1698
      t = GET_L_REG (rn);
1699
      SET_L_REG (rn, t + 4);
1700
      t &= h8_get_mask (sd);
1701
      SET_MEMORY_L (t, n);
1702
      break;
1703
 
1704
    case X (OP_DISP, SB):       /* Register indirect w/displacement, byte.  */
1705
      t = GET_L_REG (rn) + abs;
1706
      t &= h8_get_mask (sd);
1707
      SET_MEMORY_B (t, n);
1708
      break;
1709
 
1710
    case X (OP_DISP, SW):       /* Register indirect w/displacement, word.  */
1711
      t = GET_L_REG (rn) + abs;
1712
      t &= h8_get_mask (sd);
1713
      SET_MEMORY_W (t, n);
1714
      break;
1715
 
1716
    case X (OP_DISP, SL):       /* Register indirect w/displacement, long.  */
1717
      t = GET_L_REG (rn) + abs;
1718
      t &= h8_get_mask (sd);
1719
      SET_MEMORY_L (t, n);
1720
      break;
1721
 
1722
 
1723
    case X (OP_MEM, SB):        /* Why isn't this implemented?  */
1724
    case X (OP_MEM, SW):        /* Why isn't this implemented?  */
1725
    case X (OP_MEM, SL):        /* Why isn't this implemented?  */
1726
    default:
1727
      sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
1728
      return -1;
1729
    }
1730
  return 0;
1731
}
1732
 
1733
/* Normal store.  */
1734
 
1735
static int
1736
store (SIM_DESC sd, ea_type *arg, int n)
1737
{
1738
  return store_1 (sd, arg, n, 0);
1739
}
1740
 
1741
/* Store which follows a fetch from the same location.
1742
   The difference being that we don't want to do a pre-increment
1743
   or pre-decrement at this time: it was already done when we fetched.  */
1744
 
1745
static int
1746
store2 (SIM_DESC sd, ea_type *arg, int n)
1747
{
1748
  return store_1 (sd, arg, n, 1);
1749
}
1750
 
1751
static union
1752
{
1753
  short int i;
1754
  struct
1755
    {
1756
      char low;
1757
      char high;
1758
    }
1759
  u;
1760
} littleendian;
1761
 
1762
/* Flag to be set whenever a new SIM_DESC object is created.  */
1763
static int init_pointers_needed = 1;
1764
 
1765
static void
1766
init_pointers (SIM_DESC sd)
1767
{
1768
  if (init_pointers_needed)
1769
    {
1770
      int i;
1771
 
1772
      littleendian.i = 1;
1773
 
1774
      if (h8300smode && !h8300_normal_mode)
1775
        memory_size = H8300S_MSIZE;
1776
      else if (h8300hmode && !h8300_normal_mode)
1777
        memory_size = H8300H_MSIZE;
1778
      else
1779
        memory_size = H8300_MSIZE;
1780
      /* `msize' must be a power of two.  */
1781
      if ((memory_size & (memory_size - 1)) != 0)
1782
        {
1783
          (*sim_callback->printf_filtered)
1784
            (sim_callback,
1785
             "init_pointers: bad memory size %d, defaulting to %d.\n",
1786
             memory_size, memory_size = H8300S_MSIZE);
1787
        }
1788
 
1789
      if (h8_get_memory_buf (sd))
1790
        free (h8_get_memory_buf (sd));
1791
      if (h8_get_cache_idx_buf (sd))
1792
        free (h8_get_cache_idx_buf (sd));
1793
      if (h8_get_eightbit_buf (sd))
1794
        free (h8_get_eightbit_buf (sd));
1795
 
1796
      h8_set_memory_buf (sd, (unsigned char *)
1797
                         calloc (sizeof (char), memory_size));
1798
      h8_set_cache_idx_buf (sd, (unsigned short *)
1799
                            calloc (sizeof (short), memory_size));
1800
      sd->memory_size = memory_size;
1801
      h8_set_eightbit_buf (sd, (unsigned char *) calloc (sizeof (char), 256));
1802
 
1803
      h8_set_mask (sd, memory_size - 1);
1804
 
1805
      memset (h8_get_reg_buf (sd), 0, sizeof (((STATE_CPU (sd, 0))->regs)));
1806
 
1807
      for (i = 0; i < 8; i++)
1808
        {
1809
          /* FIXME: rewrite using local buffer.  */
1810
          unsigned char *p = (unsigned char *) (h8_get_reg_buf (sd) + i);
1811
          unsigned char *e = (unsigned char *) (h8_get_reg_buf (sd) + i + 1);
1812
          unsigned short *q = (unsigned short *) (h8_get_reg_buf (sd) + i);
1813
          unsigned short *u = (unsigned short *) (h8_get_reg_buf (sd) + i + 1);
1814
          h8_set_reg (sd, i, 0x00112233);
1815
 
1816
          while (p < e)
1817
            {
1818
              if (*p == 0x22)
1819
                  breg[i] = p;
1820
              if (*p == 0x33)
1821
                  breg[i + 8] = p;
1822
              if (*p == 0x11)
1823
                breg[i + 16] = p;
1824
              if (*p == 0x00)
1825
                breg[i + 24] = p;
1826
              p++;
1827
            }
1828
 
1829
          wreg[i] = wreg[i + 8] = 0;
1830
          while (q < u)
1831
            {
1832
              if (*q == 0x2233)
1833
                {
1834
                  wreg[i] = q;
1835
                }
1836
              if (*q == 0x0011)
1837
                {
1838
                  wreg[i + 8] = q;
1839
                }
1840
              q++;
1841
            }
1842
 
1843
          if (wreg[i] == 0 || wreg[i + 8] == 0)
1844
            (*sim_callback->printf_filtered) (sim_callback,
1845
                                              "init_pointers: internal error.\n");
1846
 
1847
          h8_set_reg (sd, i, 0);
1848
          lreg[i] = h8_get_reg_buf (sd) + i;
1849
        }
1850
 
1851
      /* Note: sim uses pseudo-register ZERO as a zero register.  */
1852
      lreg[ZERO_REGNUM] = h8_get_reg_buf (sd) + ZERO_REGNUM;
1853
      init_pointers_needed = 0;
1854
 
1855
      /* Initialize the seg registers.  */
1856
      if (!sd->sim_cache)
1857
        set_simcache_size (sd, CSIZE);
1858
    }
1859
}
1860
 
1861
/* Grotty global variable for use by control_c signal handler.  */
1862
static SIM_DESC control_c_sim_desc;
1863
 
1864
static void
1865
control_c (int sig)
1866
{
1867
  sim_engine_set_run_state (control_c_sim_desc, sim_stopped, SIGINT);
1868
}
1869
 
1870
int
1871
sim_stop (SIM_DESC sd)
1872
{
1873
  /* FIXME: use a real signal value.  */
1874
  sim_engine_set_run_state (sd, sim_stopped, SIGINT);
1875
  return 1;
1876
}
1877
 
1878
#define OBITOP(name, f, s, op)                  \
1879
case O (name, SB):                              \
1880
{                                               \
1881
  int m, tmp;                                   \
1882
                                                \
1883
  if (f)                                        \
1884
    if (fetch (sd, &code->dst, &ea))            \
1885
      goto end;                                 \
1886
  if (fetch (sd, &code->src, &tmp))             \
1887
    goto end;                                   \
1888
  m = 1 << (tmp & 7);                           \
1889
  op;                                           \
1890
  if (s)                                        \
1891
    if (store (sd, &code->dst,ea))              \
1892
      goto end;                                 \
1893
  goto next;                                    \
1894
}
1895
 
1896
void
1897
sim_resume (SIM_DESC sd, int step, int siggnal)
1898
{
1899
  static int init1;
1900
  int cycles = 0;
1901
  int insts = 0;
1902
  int tick_start = get_now ();
1903
  void (*prev) ();
1904
  int poll_count = 0;
1905
  int res;
1906
  int tmp;
1907
  int rd;
1908
  int ea;
1909
  int bit;
1910
  int pc;
1911
  int c, nz, v, n, u, h, ui, intMaskBit;
1912
  int trace, intMask;
1913
  int oldmask;
1914
  enum sim_stop reason;
1915
  int sigrc;
1916
 
1917
  init_pointers (sd);
1918
 
1919
  control_c_sim_desc = sd;
1920
  prev = signal (SIGINT, control_c);
1921
 
1922
  if (step)
1923
    {
1924
      sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
1925
    }
1926
  else
1927
    {
1928
      sim_engine_set_run_state (sd, sim_running, 0);
1929
    }
1930
 
1931
  pc = h8_get_pc (sd);
1932
 
1933
  /* The PC should never be odd.  */
1934
  if (pc & 0x1)
1935
    {
1936
      sim_engine_set_run_state (sd, sim_stopped, SIGBUS);
1937
      return;
1938
    }
1939
 
1940
  /* Get Status Register (flags).  */
1941
  GETSR (sd);
1942
 
1943
  if (h8300smode)       /* Get exr.  */
1944
    {
1945
      trace = (h8_get_exr (sd) >> 7) & 1;
1946
      intMask = h8_get_exr (sd) & 7;
1947
    }
1948
 
1949
  oldmask = h8_get_mask (sd);
1950
  if (!h8300hmode || h8300_normal_mode)
1951
    h8_set_mask (sd, 0xffff);
1952
  do
1953
    {
1954
      unsigned short cidx;
1955
      decoded_inst *code;
1956
 
1957
    top:
1958
      cidx = h8_get_cache_idx (sd, pc);
1959
      if (cidx == (unsigned short) -1 ||
1960
          cidx >= sd->sim_cache_size)
1961
        goto illegal;
1962
 
1963
      code = sd->sim_cache + cidx;
1964
 
1965
#if ADEBUG
1966
      if (debug)
1967
        {
1968
          printf ("%x %d %s\n", pc, code->opcode,
1969
                  code->op ? code->op->name : "**");
1970
        }
1971
      h8_increment_stats (sd, code->opcode);
1972
#endif
1973
 
1974
      if (code->opcode)
1975
        {
1976
          cycles += code->cycles;
1977
          insts++;
1978
        }
1979
 
1980
      switch (code->opcode)
1981
        {
1982
        case 0:
1983
          /*
1984
           * This opcode is a fake for when we get to an
1985
           * instruction which hasnt been compiled
1986
           */
1987
          compile (sd, pc);
1988
          goto top;
1989
          break;
1990
 
1991
        case O (O_MOVAB, SL):
1992
        case O (O_MOVAW, SL):
1993
        case O (O_MOVAL, SL):
1994
          /* 1) Evaluate 2nd argument (dst).
1995
             2) Mask / zero extend according to whether 1st argument (src)
1996
                is INDEXB, INDEXW, or INDEXL.
1997
             3) Left-shift the result by 0, 1 or 2, according to size of mova
1998
                (mova/b, mova/w, mova/l).
1999
             4) Add literal value of 1st argument (src).
2000
             5) Store result in 3rd argument (op3).
2001
          */
2002
 
2003
          /* Alas, since this is the only instruction with 3 arguments,
2004
             decode doesn't handle them very well.  Some fix-up is required.
2005
 
2006
             a) The size of dst is determined by whether src is
2007
                INDEXB or INDEXW.  */
2008
 
2009
          if (OP_KIND (code->src.type) == OP_INDEXB)
2010
            code->dst.type = X (OP_KIND (code->dst.type), SB);
2011
          else if (OP_KIND (code->src.type) == OP_INDEXW)
2012
            code->dst.type = X (OP_KIND (code->dst.type), SW);
2013
 
2014
          /* b) If op3 == null, then this is the short form of the insn.
2015
                Dst is the dispreg of src, and op3 is the 32-bit form
2016
                of the same register.
2017
          */
2018
 
2019
          if (code->op3.type == 0)
2020
            {
2021
              /* Short form: src == INDEXB/INDEXW, dst == op3 == 0.
2022
                 We get to compose dst and op3 as follows:
2023
 
2024
                     op3 is a 32-bit register, ID == src.reg.
2025
                     dst is the same register, but 8 or 16 bits
2026
                     depending on whether src is INDEXB or INDEXW.
2027
              */
2028
 
2029
              code->op3.type = X (OP_REG, SL);
2030
              code->op3.reg  = code->src.reg;
2031
              code->op3.literal = 0;
2032
 
2033
              if (OP_KIND (code->src.type) == OP_INDEXB)
2034
                {
2035
                  code->dst.type = X (OP_REG, SB);
2036
                  code->dst.reg = code->op3.reg + 8;
2037
                }
2038
              else
2039
                code->dst.type = X (OP_REG, SW);
2040
            }
2041
 
2042
          if (fetch (sd, &code->dst, &ea))
2043
            goto end;
2044
 
2045
          switch (OP_KIND (code->src.type)) {
2046
          case OP_INDEXB:    ea = ea & 0xff;            break;
2047
          case OP_INDEXW:    ea = ea & 0xffff;          break;
2048
          case OP_INDEXL:                               break;
2049
          default:           goto illegal;
2050
          }
2051
 
2052
          switch (code->opcode) {
2053
          case O (O_MOVAB, SL):                         break;
2054
          case O (O_MOVAW, SL):     ea = ea << 1;       break;
2055
          case O (O_MOVAL, SL):     ea = ea << 2;       break;
2056
          default:                  goto illegal;
2057
          }
2058
 
2059
          ea = ea + code->src.literal;
2060
 
2061
          if (store (sd, &code->op3, ea))
2062
            goto end;
2063
 
2064
          goto next;
2065
 
2066
        case O (O_SUBX, SB):    /* subx, extended sub */
2067
          if (fetch2 (sd, &code->dst, &rd))
2068
            goto end;
2069
          if (fetch (sd, &code->src, &ea))
2070
            goto end;
2071
          ea = -(ea + C);
2072
          res = rd + ea;
2073
          goto alu8;
2074
 
2075
        case O (O_SUBX, SW):    /* subx, extended sub */
2076
          if (fetch2 (sd, &code->dst, &rd))
2077
            goto end;
2078
          if (fetch (sd, &code->src, &ea))
2079
            goto end;
2080
          ea = -(ea + C);
2081
          res = rd + ea;
2082
          goto alu16;
2083
 
2084
        case O (O_SUBX, SL):    /* subx, extended sub */
2085
          if (fetch2 (sd, &code->dst, &rd))
2086
            goto end;
2087
          if (fetch (sd, &code->src, &ea))
2088
            goto end;
2089
          ea = -(ea + C);
2090
          res = rd + ea;
2091
          goto alu32;
2092
 
2093
        case O (O_ADDX, SB):    /* addx, extended add */
2094
          if (fetch2 (sd, &code->dst, &rd))
2095
            goto end;
2096
          if (fetch (sd, &code->src, &ea))
2097
            goto end;
2098
          ea = ea + C;
2099
          res = rd + ea;
2100
          goto alu8;
2101
 
2102
        case O (O_ADDX, SW):    /* addx, extended add */
2103
          if (fetch2 (sd, &code->dst, &rd))
2104
            goto end;
2105
          if (fetch (sd, &code->src, &ea))
2106
            goto end;
2107
          ea = ea + C;
2108
          res = rd + ea;
2109
          goto alu16;
2110
 
2111
        case O (O_ADDX, SL):    /* addx, extended add */
2112
          if (fetch2 (sd, &code->dst, &rd))
2113
            goto end;
2114
          if (fetch (sd, &code->src, &ea))
2115
            goto end;
2116
          ea = ea + C;
2117
          res = rd + ea;
2118
          goto alu32;
2119
 
2120
        case O (O_SUB, SB):             /* sub.b */
2121
          /* Fetch rd and ea.  */
2122
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2123
            goto end;
2124
          ea = -ea;
2125
          res = rd + ea;
2126
          goto alu8;
2127
 
2128
        case O (O_SUB, SW):             /* sub.w */
2129
          /* Fetch rd and ea.  */
2130
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2131
            goto end;
2132
          ea = -ea;
2133
          res = rd + ea;
2134
          goto alu16;
2135
 
2136
        case O (O_SUB, SL):             /* sub.l */
2137
          /* Fetch rd and ea.  */
2138
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2139
            goto end;
2140
          ea = -ea;
2141
          res = rd + ea;
2142
          goto alu32;
2143
 
2144
        case O (O_NEG, SB):             /* neg.b */
2145
          /* Fetch ea.  */
2146
          if (fetch2 (sd, &code->src, &ea))
2147
            goto end;
2148
          ea = -ea;
2149
          rd = 0;
2150
          res = rd + ea;
2151
          goto alu8;
2152
 
2153
        case O (O_NEG, SW):             /* neg.w */
2154
          /* Fetch ea.  */
2155
          if (fetch2 (sd, &code->src, &ea))
2156
            goto end;
2157
          ea = -ea;
2158
          rd = 0;
2159
          res = rd + ea;
2160
          goto alu16;
2161
 
2162
        case O (O_NEG, SL):             /* neg.l */
2163
          /* Fetch ea.  */
2164
          if (fetch2 (sd, &code->src, &ea))
2165
            goto end;
2166
          ea = -ea;
2167
          rd = 0;
2168
          res = rd + ea;
2169
          goto alu32;
2170
 
2171
        case O (O_ADD, SB):             /* add.b */
2172
          if (fetch2 (sd, &code->dst, &rd))
2173
            goto end;
2174
          if (fetch (sd, &code->src, &ea))
2175
            goto end;
2176
          res = rd + ea;
2177
          goto alu8;
2178
 
2179
        case O (O_ADD, SW):             /* add.w */
2180
          if (fetch2 (sd, &code->dst, &rd))
2181
            goto end;
2182
          if (fetch (sd, &code->src, &ea))
2183
            goto end;
2184
          res = rd + ea;
2185
          goto alu16;
2186
 
2187
        case O (O_ADD, SL):             /* add.l */
2188
          if (fetch2 (sd, &code->dst, &rd))
2189
            goto end;
2190
          if (fetch (sd, &code->src, &ea))
2191
            goto end;
2192
          res = rd + ea;
2193
          goto alu32;
2194
 
2195
        case O (O_AND, SB):             /* and.b */
2196
          /* Fetch rd and ea.  */
2197
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2198
            goto end;
2199
          res = rd & ea;
2200
          goto log8;
2201
 
2202
        case O (O_AND, SW):             /* and.w */
2203
          /* Fetch rd and ea.  */
2204
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2205
            goto end;
2206
          res = rd & ea;
2207
          goto log16;
2208
 
2209
        case O (O_AND, SL):             /* and.l */
2210
          /* Fetch rd and ea.  */
2211
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2212
            goto end;
2213
          res = rd & ea;
2214
          goto log32;
2215
 
2216
        case O (O_OR, SB):              /* or.b */
2217
          /* Fetch rd and ea.  */
2218
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2219
            goto end;
2220
          res = rd | ea;
2221
          goto log8;
2222
 
2223
        case O (O_OR, SW):              /* or.w */
2224
          /* Fetch rd and ea.  */
2225
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2226
            goto end;
2227
          res = rd | ea;
2228
          goto log16;
2229
 
2230
        case O (O_OR, SL):              /* or.l */
2231
          /* Fetch rd and ea.  */
2232
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2233
            goto end;
2234
          res = rd | ea;
2235
          goto log32;
2236
 
2237
        case O (O_XOR, SB):             /* xor.b */
2238
          /* Fetch rd and ea.  */
2239
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2240
            goto end;
2241
          res = rd ^ ea;
2242
          goto log8;
2243
 
2244
        case O (O_XOR, SW):             /* xor.w */
2245
          /* Fetch rd and ea.  */
2246
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2247
            goto end;
2248
          res = rd ^ ea;
2249
          goto log16;
2250
 
2251
        case O (O_XOR, SL):             /* xor.l */
2252
          /* Fetch rd and ea.  */
2253
          if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd))
2254
            goto end;
2255
          res = rd ^ ea;
2256
          goto log32;
2257
 
2258
        case O (O_MOV, SB):
2259
          if (fetch (sd, &code->src, &res))
2260
            goto end;
2261
          if (store (sd, &code->dst, res))
2262
            goto end;
2263
          goto just_flags_log8;
2264
        case O (O_MOV, SW):
2265
          if (fetch (sd, &code->src, &res))
2266
            goto end;
2267
          if (store (sd, &code->dst, res))
2268
            goto end;
2269
          goto just_flags_log16;
2270
        case O (O_MOV, SL):
2271
          if (fetch (sd, &code->src, &res))
2272
            goto end;
2273
          if (store (sd, &code->dst, res))
2274
            goto end;
2275
          goto just_flags_log32;
2276
 
2277
        case O (O_MOVMD, SB):           /* movmd.b */
2278
          ea = GET_W_REG (4);
2279
          if (ea == 0)
2280
            ea = 0x10000;
2281
 
2282
          while (ea--)
2283
            {
2284
              rd = GET_MEMORY_B (GET_L_REG (5));
2285
              SET_MEMORY_B (GET_L_REG (6), rd);
2286
              SET_L_REG (5, GET_L_REG (5) + 1);
2287
              SET_L_REG (6, GET_L_REG (6) + 1);
2288
              SET_W_REG (4, ea);
2289
            }
2290
          goto next;
2291
 
2292
        case O (O_MOVMD, SW):           /* movmd.w */
2293
          ea = GET_W_REG (4);
2294
          if (ea == 0)
2295
            ea = 0x10000;
2296
 
2297
          while (ea--)
2298
            {
2299
              rd = GET_MEMORY_W (GET_L_REG (5));
2300
              SET_MEMORY_W (GET_L_REG (6), rd);
2301
              SET_L_REG (5, GET_L_REG (5) + 2);
2302
              SET_L_REG (6, GET_L_REG (6) + 2);
2303
              SET_W_REG (4, ea);
2304
            }
2305
          goto next;
2306
 
2307
        case O (O_MOVMD, SL):           /* movmd.l */
2308
          ea = GET_W_REG (4);
2309
          if (ea == 0)
2310
            ea = 0x10000;
2311
 
2312
          while (ea--)
2313
            {
2314
              rd = GET_MEMORY_L (GET_L_REG (5));
2315
              SET_MEMORY_L (GET_L_REG (6), rd);
2316
              SET_L_REG (5, GET_L_REG (5) + 4);
2317
              SET_L_REG (6, GET_L_REG (6) + 4);
2318
              SET_W_REG (4, ea);
2319
            }
2320
          goto next;
2321
 
2322
        case O (O_MOVSD, SB):           /* movsd.b */
2323
          /* This instruction implements strncpy, with a conditional branch.
2324
             r4 contains n, r5 contains src, and r6 contains dst.
2325
             The 16-bit displacement operand is added to the pc
2326
             if and only if the end of string is reached before
2327
             n bytes are transferred.  */
2328
 
2329
          ea = GET_L_REG (4) & 0xffff;
2330
          if (ea == 0)
2331
            ea = 0x10000;
2332
 
2333
          while (ea--)
2334
            {
2335
              rd = GET_MEMORY_B (GET_L_REG (5));
2336
              SET_MEMORY_B (GET_L_REG (6), rd);
2337
              SET_L_REG (5, GET_L_REG (5) + 1);
2338
              SET_L_REG (6, GET_L_REG (6) + 1);
2339
              SET_W_REG (4, ea);
2340
              if (rd == 0)
2341
                goto condtrue;
2342
            }
2343
          goto next;
2344
 
2345
        case O (O_EEPMOV, SB):          /* eepmov.b */
2346
        case O (O_EEPMOV, SW):          /* eepmov.w */
2347
          if (h8300hmode || h8300smode)
2348
            {
2349
              register unsigned char *_src, *_dst;
2350
              unsigned int count = ((code->opcode == O (O_EEPMOV, SW))
2351
                                    ? h8_get_reg (sd, R4_REGNUM) & 0xffff
2352
                                    : h8_get_reg (sd, R4_REGNUM) & 0xff);
2353
 
2354
              _src = (h8_get_reg (sd, R5_REGNUM) < memory_size
2355
                      ? h8_get_memory_buf   (sd) + h8_get_reg (sd, R5_REGNUM)
2356
                      : h8_get_eightbit_buf (sd) +
2357
                       (h8_get_reg (sd, R5_REGNUM) & 0xff));
2358
              if ((_src + count) >= (h8_get_memory_buf (sd) + memory_size))
2359
                {
2360
                  if ((_src + count) >= (h8_get_eightbit_buf (sd) + 0x100))
2361
                    goto illegal;
2362
                }
2363
              _dst = (h8_get_reg (sd, R6_REGNUM) < memory_size
2364
                      ? h8_get_memory_buf   (sd) + h8_get_reg (sd, R6_REGNUM)
2365
                      : h8_get_eightbit_buf (sd) +
2366
                       (h8_get_reg (sd, R6_REGNUM) & 0xff));
2367
 
2368
              if ((_dst + count) >= (h8_get_memory_buf (sd) + memory_size))
2369
                {
2370
                  if ((_dst + count) >= (h8_get_eightbit_buf (sd) + 0x100))
2371
                    goto illegal;
2372
                }
2373
              memcpy (_dst, _src, count);
2374
 
2375
              h8_set_reg (sd, R5_REGNUM, h8_get_reg (sd, R5_REGNUM) + count);
2376
              h8_set_reg (sd, R6_REGNUM, h8_get_reg (sd, R6_REGNUM) + count);
2377
              h8_set_reg (sd, R4_REGNUM, h8_get_reg (sd, R4_REGNUM) &
2378
                          ((code->opcode == O (O_EEPMOV, SW))
2379
                          ? (~0xffff) : (~0xff)));
2380
              cycles += 2 * count;
2381
              goto next;
2382
            }
2383
          goto illegal;
2384
 
2385
        case O (O_ADDS, SL):            /* adds (.l) */
2386
          /* FIXME fetch.
2387
           * This insn only uses register operands, but still
2388
           * it would be cleaner to use fetch and store...  */
2389
          SET_L_REG (code->dst.reg,
2390
                     GET_L_REG (code->dst.reg)
2391
                     + code->src.literal);
2392
 
2393
          goto next;
2394
 
2395
        case O (O_SUBS, SL):            /* subs (.l) */
2396
          /* FIXME fetch.
2397
           * This insn only uses register operands, but still
2398
           * it would be cleaner to use fetch and store...  */
2399
          SET_L_REG (code->dst.reg,
2400
                     GET_L_REG (code->dst.reg)
2401
                     - code->src.literal);
2402
          goto next;
2403
 
2404
        case O (O_CMP, SB):             /* cmp.b */
2405
          if (fetch (sd, &code->dst, &rd))
2406
            goto end;
2407
          if (fetch (sd, &code->src, &ea))
2408
            goto end;
2409
          ea = -ea;
2410
          res = rd + ea;
2411
          goto just_flags_alu8;
2412
 
2413
        case O (O_CMP, SW):             /* cmp.w */
2414
          if (fetch (sd, &code->dst, &rd))
2415
            goto end;
2416
          if (fetch (sd, &code->src, &ea))
2417
            goto end;
2418
          ea = -ea;
2419
          res = rd + ea;
2420
          goto just_flags_alu16;
2421
 
2422
        case O (O_CMP, SL):             /* cmp.l */
2423
          if (fetch (sd, &code->dst, &rd))
2424
            goto end;
2425
          if (fetch (sd, &code->src, &ea))
2426
            goto end;
2427
          ea = -ea;
2428
          res = rd + ea;
2429
          goto just_flags_alu32;
2430
 
2431
        case O (O_DEC, SB):             /* dec.b */
2432
          /* FIXME fetch.
2433
           * This insn only uses register operands, but still
2434
           * it would be cleaner to use fetch and store...  */
2435
          rd = GET_B_REG (code->src.reg);
2436
          ea = -1;
2437
          res = rd + ea;
2438
          SET_B_REG (code->src.reg, res);
2439
          goto just_flags_inc8;
2440
 
2441
        case O (O_DEC, SW):             /* dec.w */
2442
          /* FIXME fetch.
2443
           * This insn only uses register operands, but still
2444
           * it would be cleaner to use fetch and store...  */
2445
          rd = GET_W_REG (code->dst.reg);
2446
          ea = -code->src.literal;
2447
          res = rd + ea;
2448
          SET_W_REG (code->dst.reg, res);
2449
          goto just_flags_inc16;
2450
 
2451
        case O (O_DEC, SL):             /* dec.l */
2452
          /* FIXME fetch.
2453
           * This insn only uses register operands, but still
2454
           * it would be cleaner to use fetch and store...  */
2455
          rd = GET_L_REG (code->dst.reg);
2456
          ea = -code->src.literal;
2457
          res = rd + ea;
2458
          SET_L_REG (code->dst.reg, res);
2459
          goto just_flags_inc32;
2460
 
2461
        case O (O_INC, SB):             /* inc.b */
2462
          /* FIXME fetch.
2463
           * This insn only uses register operands, but still
2464
           * it would be cleaner to use fetch and store...  */
2465
          rd = GET_B_REG (code->src.reg);
2466
          ea = 1;
2467
          res = rd + ea;
2468
          SET_B_REG (code->src.reg, res);
2469
          goto just_flags_inc8;
2470
 
2471
        case O (O_INC, SW):             /* inc.w */
2472
          /* FIXME fetch.
2473
           * This insn only uses register operands, but still
2474
           * it would be cleaner to use fetch and store...  */
2475
          rd = GET_W_REG (code->dst.reg);
2476
          ea = code->src.literal;
2477
          res = rd + ea;
2478
          SET_W_REG (code->dst.reg, res);
2479
          goto just_flags_inc16;
2480
 
2481
        case O (O_INC, SL):             /* inc.l */
2482
          /* FIXME fetch.
2483
           * This insn only uses register operands, but still
2484
           * it would be cleaner to use fetch and store...  */
2485
          rd = GET_L_REG (code->dst.reg);
2486
          ea = code->src.literal;
2487
          res = rd + ea;
2488
          SET_L_REG (code->dst.reg, res);
2489
          goto just_flags_inc32;
2490
 
2491
        case O (O_LDC, SB):             /* ldc.b */
2492
          if (fetch (sd, &code->src, &res))
2493
            goto end;
2494
          goto setc;
2495
 
2496
        case O (O_LDC, SW):             /* ldc.w */
2497
          if (fetch (sd, &code->src, &res))
2498
            goto end;
2499
 
2500
          /* Word operand, value from MSB, must be shifted.  */
2501
          res >>= 8;
2502
          goto setc;
2503
 
2504
        case O (O_LDC, SL):             /* ldc.l */
2505
          if (fetch (sd, &code->src, &res))
2506
            goto end;
2507
          switch (code->dst.type) {
2508
          case X (OP_SBR, SL):
2509
            h8_set_sbr (sd, res);
2510
            break;
2511
          case X (OP_VBR, SL):
2512
            h8_set_vbr (sd, res);
2513
            break;
2514
          default:
2515
            goto illegal;
2516
          }
2517
          goto next;
2518
 
2519
        case O (O_STC, SW):             /* stc.w */
2520
        case O (O_STC, SB):             /* stc.b */
2521
          if (code->src.type == X (OP_CCR, SB))
2522
            {
2523
              BUILDSR (sd);
2524
              res = h8_get_ccr (sd);
2525
            }
2526
          else if (code->src.type == X (OP_EXR, SB) && h8300smode)
2527
            {
2528
              if (h8300smode)
2529
                h8_set_exr (sd, (trace << 7) | intMask);
2530
              res = h8_get_exr (sd);
2531
            }
2532
          else
2533
            goto illegal;
2534
 
2535
          /* Word operand, value to MSB, must be shifted.  */
2536
          if (code->opcode == X (O_STC, SW))
2537
            res <<= 8;
2538
          if (store (sd, &code->dst, res))
2539
            goto end;
2540
          goto next;
2541
        case O (O_STC, SL):             /* stc.l */
2542
          switch (code->src.type) {
2543
          case X (OP_SBR, SL):
2544
            res = h8_get_sbr (sd);
2545
            break;
2546
          case X (OP_VBR, SL):
2547
            res = h8_get_vbr (sd);
2548
            break;
2549
          default:
2550
            goto illegal;
2551
          }
2552
          if (store (sd, &code->dst, res))
2553
            goto end;
2554
          goto next;
2555
 
2556
        case O (O_ANDC, SB):            /* andc.b */
2557
          if (code->dst.type == X (OP_CCR, SB))
2558
            {
2559
              BUILDSR (sd);
2560
              rd = h8_get_ccr (sd);
2561
            }
2562
          else if (code->dst.type == X (OP_EXR, SB) && h8300smode)
2563
            {
2564
              if (h8300smode)
2565
                h8_set_exr (sd, (trace << 7) | intMask);
2566
              rd = h8_get_exr (sd);
2567
            }
2568
          else
2569
            goto illegal;
2570
          ea = code->src.literal;
2571
          res = rd & ea;
2572
          goto setc;
2573
 
2574
        case O (O_ORC, SB):             /* orc.b */
2575
          if (code->dst.type == X (OP_CCR, SB))
2576
            {
2577
              BUILDSR (sd);
2578
              rd = h8_get_ccr (sd);
2579
            }
2580
          else if (code->dst.type == X (OP_EXR, SB) && h8300smode)
2581
            {
2582
              if (h8300smode)
2583
                h8_set_exr (sd, (trace << 7) | intMask);
2584
              rd = h8_get_exr (sd);
2585
            }
2586
          else
2587
            goto illegal;
2588
          ea = code->src.literal;
2589
          res = rd | ea;
2590
          goto setc;
2591
 
2592
        case O (O_XORC, SB):            /* xorc.b */
2593
          if (code->dst.type == X (OP_CCR, SB))
2594
            {
2595
              BUILDSR (sd);
2596
              rd = h8_get_ccr (sd);
2597
            }
2598
          else if (code->dst.type == X (OP_EXR, SB) && h8300smode)
2599
            {
2600
              if (h8300smode)
2601
                h8_set_exr (sd, (trace << 7) | intMask);
2602
              rd = h8_get_exr (sd);
2603
            }
2604
          else
2605
            goto illegal;
2606
          ea = code->src.literal;
2607
          res = rd ^ ea;
2608
          goto setc;
2609
 
2610
        case O (O_BRAS, SB):            /* bra/s  */
2611
          /* This is basically an ordinary branch, with a delay slot.  */
2612
          if (fetch (sd, &code->src, &res))
2613
            goto end;
2614
 
2615
          if ((res & 1) == 0)
2616
            goto illegal;
2617
 
2618
          res -= 1;
2619
 
2620
          /* Execution continues at next instruction, but
2621
             delayed_branch is set up for next cycle.  */
2622
          h8_set_delayed_branch (sd, code->next_pc + res);
2623
          pc = code->next_pc;
2624
          goto end;
2625
 
2626
        case O (O_BRAB, SB):            /* bra rd.b */
2627
        case O (O_BRAW, SW):            /* bra rd.w */
2628
        case O (O_BRAL, SL):            /* bra erd.l */
2629
          if (fetch (sd, &code->src, &rd))
2630
            goto end;
2631
          switch (OP_SIZE (code->opcode)) {
2632
          case SB:      rd &= 0xff;             break;
2633
          case SW:      rd &= 0xffff;           break;
2634
          case SL:      rd &= 0xffffffff;       break;
2635
          }
2636
          pc = code->next_pc + rd;
2637
          goto end;
2638
 
2639
        case O (O_BRABC, SB):           /* bra/bc, branch if bit clear */
2640
        case O (O_BRABS, SB):           /* bra/bs, branch if bit set   */
2641
        case O (O_BSRBC, SB):           /* bsr/bc, call   if bit clear */
2642
        case O (O_BSRBS, SB):           /* bsr/bs, call   if bit set   */
2643
          if (fetch (sd, &code->dst, &rd) ||
2644
              fetch (sd, &code->src, &bit))
2645
            goto end;
2646
 
2647
          if (code->opcode == O (O_BRABC, SB) || /* branch if clear */
2648
              code->opcode == O (O_BSRBC, SB))   /* call   if clear */
2649
            {
2650
              if ((rd & (1 << bit)))            /* no branch */
2651
                goto next;
2652
            }
2653
          else                                  /* branch/call if set */
2654
            {
2655
              if (!(rd & (1 << bit)))           /* no branch */
2656
                goto next;
2657
            }
2658
 
2659
          if (fetch (sd, &code->op3, &res))     /* branch */
2660
            goto end;
2661
          pc = code->next_pc + res;
2662
 
2663
          if (code->opcode == O (O_BRABC, SB) ||
2664
              code->opcode == O (O_BRABS, SB))  /* branch */
2665
            goto end;
2666
          else                                  /* call   */
2667
            goto call;
2668
 
2669
        case O (O_BRA, SN):
2670
        case O (O_BRA, SL):
2671
        case O (O_BRA, SW):
2672
        case O (O_BRA, SB):             /* bra, branch always */
2673
          if (1)
2674
            goto condtrue;
2675
          goto next;
2676
 
2677
        case O (O_BRN, SB):             /* brn, ;-/  branch never? */
2678
          if (0)
2679
            goto condtrue;
2680
          goto next;
2681
 
2682
        case O (O_BHI, SB):             /* bhi */
2683
          if ((C || Z) == 0)
2684
            goto condtrue;
2685
          goto next;
2686
 
2687
 
2688
        case O (O_BLS, SB):             /* bls */
2689
          if ((C || Z))
2690
            goto condtrue;
2691
          goto next;
2692
 
2693
        case O (O_BCS, SB):             /* bcs, branch if carry set */
2694
          if ((C == 1))
2695
            goto condtrue;
2696
          goto next;
2697
 
2698
        case O (O_BCC, SB):             /* bcc, branch if carry clear */
2699
          if ((C == 0))
2700
            goto condtrue;
2701
          goto next;
2702
 
2703
        case O (O_BEQ, SB):             /* beq, branch if zero set */
2704
          if (Z)
2705
            goto condtrue;
2706
          goto next;
2707
        case O (O_BGT, SB):             /* bgt */
2708
          if (((Z || (N ^ V)) == 0))
2709
            goto condtrue;
2710
          goto next;
2711
 
2712
        case O (O_BLE, SB):             /* ble */
2713
          if (((Z || (N ^ V)) == 1))
2714
            goto condtrue;
2715
          goto next;
2716
 
2717
        case O (O_BGE, SB):             /* bge */
2718
          if ((N ^ V) == 0)
2719
            goto condtrue;
2720
          goto next;
2721
        case O (O_BLT, SB):             /* blt */
2722
          if ((N ^ V))
2723
            goto condtrue;
2724
          goto next;
2725
        case O (O_BMI, SB):             /* bmi */
2726
          if ((N))
2727
            goto condtrue;
2728
          goto next;
2729
        case O (O_BNE, SB):             /* bne, branch if zero clear */
2730
          if ((Z == 0))
2731
            goto condtrue;
2732
          goto next;
2733
 
2734
        case O (O_BPL, SB):             /* bpl */
2735
          if (N == 0)
2736
            goto condtrue;
2737
          goto next;
2738
        case O (O_BVC, SB):             /* bvc */
2739
          if ((V == 0))
2740
            goto condtrue;
2741
          goto next;
2742
        case O (O_BVS, SB):             /* bvs */
2743
          if ((V == 1))
2744
            goto condtrue;
2745
          goto next;
2746
 
2747
        /* Trap for Command Line setup.  */
2748
        case O (O_SYS_CMDLINE, SB):
2749
          {
2750
            int i = 0;           /* Loop counter.  */
2751
            int j = 0;           /* Loop counter.  */
2752
            int ind_arg_len = 0; /* Length of each argument.  */
2753
            int no_of_args = 0;  /* The no. or cmdline args.  */
2754
            int current_location = 0;    /* Location of string.  */
2755
            int old_sp = 0;      /* The Initial Stack Pointer.  */
2756
            int no_of_slots = 0; /* No. of slots required on the stack
2757
                                           for storing cmdline args.  */
2758
            int sp_move = 0;     /* No. of locations by which the stack needs
2759
                                   to grow.  */
2760
            int new_sp = 0;      /* The final stack pointer location passed
2761
                                   back.  */
2762
            int *argv_ptrs;     /* Pointers of argv strings to be stored.  */
2763
            int argv_ptrs_location = 0;  /* Location of pointers to cmdline
2764
                                           args on the stack.  */
2765
            int char_ptr_size = 0;       /* Size of a character pointer on
2766
                                           target machine.  */
2767
            int addr_cmdline = 0;        /* Memory location where cmdline has
2768
                                           to be stored.  */
2769
            int size_cmdline = 0;        /* Size of cmdline.  */
2770
 
2771
            /* Set the address of 256 free locations where command line is
2772
               stored.  */
2773
            addr_cmdline = cmdline_location();
2774
            h8_set_reg (sd, 0, addr_cmdline);
2775
 
2776
            /* Counting the no. of commandline arguments.  */
2777
            for (i = 0; h8_get_cmdline_arg (sd, i) != NULL; i++)
2778
              continue;
2779
 
2780
            /* No. of arguments in the command line.  */
2781
            no_of_args = i;
2782
 
2783
            /* Current location is just a temporary variable,which we are
2784
               setting to the point to the start of our commandline string.  */
2785
            current_location = addr_cmdline;
2786
 
2787
            /* Allocating space for storing pointers of the command line
2788
               arguments.  */
2789
            argv_ptrs = (int *) malloc (sizeof (int) * no_of_args);
2790
 
2791
            /* Setting char_ptr_size to the sizeof (char *) on the different
2792
               architectures.  */
2793
            if ((h8300hmode || h8300smode) && !h8300_normal_mode)
2794
              {
2795
                char_ptr_size = 4;
2796
              }
2797
            else
2798
              {
2799
                char_ptr_size = 2;
2800
              }
2801
 
2802
            for (i = 0; i < no_of_args; i++)
2803
              {
2804
                ind_arg_len = 0;
2805
 
2806
                /* The size of the commandline argument.  */
2807
                ind_arg_len = strlen (h8_get_cmdline_arg (sd, i)) + 1;
2808
 
2809
                /* The total size of the command line string.  */
2810
                size_cmdline += ind_arg_len;
2811
 
2812
                /* As we have only 256 bytes, we need to provide a graceful
2813
                   exit. Anyways, a program using command line arguments
2814
                   where we cannot store all the command line arguments
2815
                   given may behave unpredictably.  */
2816
                if (size_cmdline >= 256)
2817
                  {
2818
                    h8_set_reg (sd, 0, 0);
2819
                    goto next;
2820
                  }
2821
                else
2822
                  {
2823
                    /* current_location points to the memory where the next
2824
                       commandline argument is stored.  */
2825
                    argv_ptrs[i] = current_location;
2826
                    for (j = 0; j < ind_arg_len; j++)
2827
                      {
2828
                        SET_MEMORY_B ((current_location +
2829
                                       (sizeof (char) * j)),
2830
                                      *(h8_get_cmdline_arg (sd, i) +
2831
                                       sizeof (char) * j));
2832
                      }
2833
 
2834
                    /* Setting current_location to the starting of next
2835
                       argument.  */
2836
                    current_location += ind_arg_len;
2837
                  }
2838
              }
2839
 
2840
            /* This is the original position of the stack pointer.  */
2841
            old_sp = h8_get_reg (sd, SP_REGNUM);
2842
 
2843
            /* We need space from the stack to store the pointers to argvs.  */
2844
            /* As we will infringe on the stack, we need to shift the stack
2845
               pointer so that the data is not overwritten. We calculate how
2846
               much space is required.  */
2847
            sp_move = (no_of_args) * (char_ptr_size);
2848
 
2849
            /* The final position of stack pointer, we have thus taken some
2850
               space from the stack.  */
2851
            new_sp = old_sp - sp_move;
2852
 
2853
            /* Temporary variable holding value where the argv pointers need
2854
               to be stored.  */
2855
            argv_ptrs_location = new_sp;
2856
 
2857
            /* The argv pointers are stored at sequential locations. As per
2858
               the H8300 ABI.  */
2859
            for (i = 0; i < no_of_args; i++)
2860
              {
2861
                /* Saving the argv pointer.  */
2862
                if ((h8300hmode || h8300smode) && !h8300_normal_mode)
2863
                  {
2864
                    SET_MEMORY_L (argv_ptrs_location, argv_ptrs[i]);
2865
                  }
2866
                else
2867
                  {
2868
                    SET_MEMORY_W (argv_ptrs_location, argv_ptrs[i]);
2869
                  }
2870
 
2871
                /* The next location where the pointer to the next argv
2872
                   string has to be stored.  */
2873
                argv_ptrs_location += char_ptr_size;
2874
              }
2875
 
2876
            /* Required by POSIX, Setting 0x0 at the end of the list of argv
2877
               pointers.  */
2878
            if ((h8300hmode || h8300smode) && !h8300_normal_mode)
2879
              {
2880
                SET_MEMORY_L (old_sp, 0x0);
2881
              }
2882
            else
2883
              {
2884
                SET_MEMORY_W (old_sp, 0x0);
2885
              }
2886
 
2887
            /* Freeing allocated memory.  */
2888
            free (argv_ptrs);
2889
            for (i = 0; i <= no_of_args; i++)
2890
              {
2891
                free (h8_get_cmdline_arg (sd, i));
2892
              }
2893
            free (h8_get_command_line (sd));
2894
 
2895
            /* The no. of argv arguments are returned in Reg 0.  */
2896
            h8_set_reg (sd, 0, no_of_args);
2897
            /* The Pointer to argv in Register 1.  */
2898
            h8_set_reg (sd, 1, new_sp);
2899
            /* Setting the stack pointer to the new value.  */
2900
            h8_set_reg (sd, SP_REGNUM, new_sp);
2901
          }
2902
          goto next;
2903
 
2904
          /* System call processing starts.  */
2905
        case O (O_SYS_OPEN, SB):
2906
          {
2907
            int len = 0; /* Length of filename.  */
2908
            char *filename;     /* Filename would go here.  */
2909
            char temp_char;     /* Temporary character */
2910
            int mode = 0;        /* Mode bits for the file.  */
2911
            int open_return;    /* Return value of open, file descriptor.  */
2912
            int i;              /* Loop counter */
2913
            int filename_ptr;   /* Pointer to filename in cpu memory.  */
2914
 
2915
            /* Setting filename_ptr to first argument of open,  */
2916
            /* and trying to get mode.  */
2917
            if ((h8300sxmode || h8300hmode || h8300smode) && !h8300_normal_mode)
2918
              {
2919
                filename_ptr = GET_L_REG (0);
2920
                mode = GET_MEMORY_L (h8_get_reg (sd, SP_REGNUM) + 4);
2921
              }
2922
            else
2923
              {
2924
                filename_ptr = GET_W_REG (0);
2925
                mode = GET_MEMORY_W (h8_get_reg (sd, SP_REGNUM) + 2);
2926
              }
2927
 
2928
            /* Trying to find the length of the filename.  */
2929
            temp_char = GET_MEMORY_B (h8_get_reg (sd, 0));
2930
 
2931
            len = 1;
2932
            while (temp_char != '\0')
2933
              {
2934
                temp_char = GET_MEMORY_B (filename_ptr + len);
2935
                len++;
2936
              }
2937
 
2938
            /* Allocating space for the filename.  */
2939
            filename = (char *) malloc (sizeof (char) * len);
2940
 
2941
            /* String copying the filename from memory.  */
2942
            for (i = 0; i < len; i++)
2943
              {
2944
                temp_char = GET_MEMORY_B (filename_ptr + i);
2945
                filename[i] = temp_char;
2946
              }
2947
 
2948
            /* Callback to open and return the file descriptor.  */
2949
            open_return = sim_callback->open (sim_callback, filename, mode);
2950
 
2951
            /* Return value in register 0.  */
2952
            h8_set_reg (sd, 0, open_return);
2953
 
2954
            /* Freeing memory used for filename. */
2955
            free (filename);
2956
          }
2957
          goto next;
2958
 
2959
        case O (O_SYS_READ, SB):
2960
          {
2961
            char *char_ptr;     /* Where characters read would be stored.  */
2962
            int fd;             /* File descriptor */
2963
            int buf_size;       /* BUF_SIZE parameter in read.  */
2964
            int i = 0;           /* Temporary Loop counter */
2965
            int read_return = 0; /* Return value from callback to
2966
                                           read.  */
2967
 
2968
            fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
2969
            buf_size = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (2) : GET_W_REG (2);
2970
 
2971
            char_ptr = (char *) malloc (sizeof (char) * buf_size);
2972
 
2973
            /* Callback to read and return the no. of characters read.  */
2974
            read_return =
2975
              sim_callback->read (sim_callback, fd, char_ptr, buf_size);
2976
 
2977
            /* The characters read are stored in cpu memory.  */
2978
            for (i = 0; i < buf_size; i++)
2979
              {
2980
                SET_MEMORY_B ((h8_get_reg (sd, 1) + (sizeof (char) * i)),
2981
                              *(char_ptr + (sizeof (char) * i)));
2982
              }
2983
 
2984
            /* Return value in Register 0.  */
2985
            h8_set_reg (sd, 0, read_return);
2986
 
2987
            /* Freeing memory used as buffer.  */
2988
            free (char_ptr);
2989
          }
2990
          goto next;
2991
 
2992
        case O (O_SYS_WRITE, SB):
2993
          {
2994
            int fd;             /* File descriptor */
2995
            char temp_char;     /* Temporary character */
2996
            int len;            /* Length of write, Parameter II to write.  */
2997
            int char_ptr;       /* Character Pointer, Parameter I of write.  */
2998
            char *ptr;          /* Where characters to be written are stored.
2999
                                 */
3000
            int write_return;   /* Return value from callback to write.  */
3001
            int i = 0;           /* Loop counter */
3002
 
3003
            fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3004
            char_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3005
            len = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (2) : GET_W_REG (2);
3006
 
3007
            /* Allocating space for the characters to be written.  */
3008
            ptr = (char *) malloc (sizeof (char) * len);
3009
 
3010
            /* Fetching the characters from cpu memory.  */
3011
            for (i = 0; i < len; i++)
3012
              {
3013
                temp_char = GET_MEMORY_B (char_ptr + i);
3014
                ptr[i] = temp_char;
3015
              }
3016
 
3017
            /* Callback write and return the no. of characters written.  */
3018
            write_return = sim_callback->write (sim_callback, fd, ptr, len);
3019
 
3020
            /* Return value in Register 0.  */
3021
            h8_set_reg (sd, 0, write_return);
3022
 
3023
            /* Freeing memory used as buffer.  */
3024
            free (ptr);
3025
          }
3026
          goto next;
3027
 
3028
        case O (O_SYS_LSEEK, SB):
3029
          {
3030
            int fd;             /* File descriptor */
3031
            int offset;         /* Offset */
3032
            int origin;         /* Origin */
3033
            int lseek_return;   /* Return value from callback to lseek.  */
3034
 
3035
            fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3036
            offset = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3037
            origin = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (2) : GET_W_REG (2);
3038
 
3039
            /* Callback lseek and return offset.  */
3040
            lseek_return =
3041
              sim_callback->lseek (sim_callback, fd, offset, origin);
3042
 
3043
            /* Return value in register 0.  */
3044
            h8_set_reg (sd, 0, lseek_return);
3045
          }
3046
          goto next;
3047
 
3048
        case O (O_SYS_CLOSE, SB):
3049
          {
3050
            int fd;             /* File descriptor */
3051
            int close_return;   /* Return value from callback to close.  */
3052
 
3053
            fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3054
 
3055
            /* Callback close and return.  */
3056
            close_return = sim_callback->close (sim_callback, fd);
3057
 
3058
            /* Return value in register 0.  */
3059
            h8_set_reg (sd, 0, close_return);
3060
          }
3061
          goto next;
3062
 
3063
        case O (O_SYS_FSTAT, SB):
3064
          {
3065
            int fd;             /* File descriptor */
3066
            struct stat stat_rec;       /* Stat record */
3067
            int fstat_return;   /* Return value from callback to stat.  */
3068
            int stat_ptr;       /* Pointer to stat record.  */
3069
            char *temp_stat_ptr;        /* Temporary stat_rec pointer.  */
3070
 
3071
            fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3072
 
3073
            /* Setting stat_ptr to second argument of stat.  */
3074
            stat_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3075
 
3076
            /* Callback stat and return.  */
3077
            fstat_return = sim_callback->fstat (sim_callback, fd, &stat_rec);
3078
 
3079
            /* Have stat_ptr point to starting of stat_rec.  */
3080
            temp_stat_ptr = (char *) (&stat_rec);
3081
 
3082
            /* Setting up the stat structure returned.  */
3083
            SET_MEMORY_W (stat_ptr, stat_rec.st_dev);
3084
            stat_ptr += 2;
3085
            SET_MEMORY_W (stat_ptr, stat_rec.st_ino);
3086
            stat_ptr += 2;
3087
            SET_MEMORY_L (stat_ptr, stat_rec.st_mode);
3088
            stat_ptr += 4;
3089
            SET_MEMORY_W (stat_ptr, stat_rec.st_nlink);
3090
            stat_ptr += 2;
3091
            SET_MEMORY_W (stat_ptr, stat_rec.st_uid);
3092
            stat_ptr += 2;
3093
            SET_MEMORY_W (stat_ptr, stat_rec.st_gid);
3094
            stat_ptr += 2;
3095
            SET_MEMORY_W (stat_ptr, stat_rec.st_rdev);
3096
            stat_ptr += 2;
3097
            SET_MEMORY_L (stat_ptr, stat_rec.st_size);
3098
            stat_ptr += 4;
3099
            SET_MEMORY_L (stat_ptr, stat_rec.st_atime);
3100
            stat_ptr += 8;
3101
            SET_MEMORY_L (stat_ptr, stat_rec.st_mtime);
3102
            stat_ptr += 8;
3103
            SET_MEMORY_L (stat_ptr, stat_rec.st_ctime);
3104
 
3105
            /* Return value in register 0.  */
3106
            h8_set_reg (sd, 0, fstat_return);
3107
          }
3108
          goto next;
3109
 
3110
        case O (O_SYS_STAT, SB):
3111
          {
3112
            int len = 0; /* Length of filename.  */
3113
            char *filename;     /* Filename would go here.  */
3114
            char temp_char;     /* Temporary character */
3115
            int filename_ptr;   /* Pointer to filename in cpu memory.  */
3116
            struct stat stat_rec;       /* Stat record */
3117
            int stat_return;    /* Return value from callback to stat */
3118
            int stat_ptr;       /* Pointer to stat record.  */
3119
            char *temp_stat_ptr;        /* Temporary stat_rec pointer.  */
3120
            int i = 0;           /* Loop Counter */
3121
 
3122
            /* Setting filename_ptr to first argument of open.  */
3123
            filename_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3124
 
3125
            /* Trying to find the length of the filename.  */
3126
            temp_char = GET_MEMORY_B (h8_get_reg (sd, 0));
3127
 
3128
            len = 1;
3129
            while (temp_char != '\0')
3130
              {
3131
                temp_char = GET_MEMORY_B (filename_ptr + len);
3132
                len++;
3133
              }
3134
 
3135
            /* Allocating space for the filename.  */
3136
            filename = (char *) malloc (sizeof (char) * len);
3137
 
3138
            /* String copying the filename from memory.  */
3139
            for (i = 0; i < len; i++)
3140
              {
3141
                temp_char = GET_MEMORY_B (filename_ptr + i);
3142
                filename[i] = temp_char;
3143
              }
3144
 
3145
            /* Setting stat_ptr to second argument of stat.  */
3146
            /* stat_ptr = h8_get_reg (sd, 1); */
3147
            stat_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3148
 
3149
            /* Callback stat and return.  */
3150
            stat_return =
3151
              sim_callback->stat (sim_callback, filename, &stat_rec);
3152
 
3153
            /* Have stat_ptr point to starting of stat_rec.  */
3154
            temp_stat_ptr = (char *) (&stat_rec);
3155
 
3156
            /* Freeing memory used for filename.  */
3157
            free (filename);
3158
 
3159
            /* Setting up the stat structure returned.  */
3160
            SET_MEMORY_W (stat_ptr, stat_rec.st_dev);
3161
            stat_ptr += 2;
3162
            SET_MEMORY_W (stat_ptr, stat_rec.st_ino);
3163
            stat_ptr += 2;
3164
            SET_MEMORY_L (stat_ptr, stat_rec.st_mode);
3165
            stat_ptr += 4;
3166
            SET_MEMORY_W (stat_ptr, stat_rec.st_nlink);
3167
            stat_ptr += 2;
3168
            SET_MEMORY_W (stat_ptr, stat_rec.st_uid);
3169
            stat_ptr += 2;
3170
            SET_MEMORY_W (stat_ptr, stat_rec.st_gid);
3171
            stat_ptr += 2;
3172
            SET_MEMORY_W (stat_ptr, stat_rec.st_rdev);
3173
            stat_ptr += 2;
3174
            SET_MEMORY_L (stat_ptr, stat_rec.st_size);
3175
            stat_ptr += 4;
3176
            SET_MEMORY_L (stat_ptr, stat_rec.st_atime);
3177
            stat_ptr += 8;
3178
            SET_MEMORY_L (stat_ptr, stat_rec.st_mtime);
3179
            stat_ptr += 8;
3180
            SET_MEMORY_L (stat_ptr, stat_rec.st_ctime);
3181
 
3182
            /* Return value in register 0.  */
3183
            h8_set_reg (sd, 0, stat_return);
3184
          }
3185
          goto next;
3186
          /* End of system call processing.  */
3187
 
3188
        case O (O_NOT, SB):             /* not.b */
3189
          if (fetch2 (sd, &code->src, &rd))
3190
            goto end;
3191
          rd = ~rd;
3192
          v = 0;
3193
          goto shift8;
3194
 
3195
        case O (O_NOT, SW):             /* not.w */
3196
          if (fetch2 (sd, &code->src, &rd))
3197
            goto end;
3198
          rd = ~rd;
3199
          v = 0;
3200
          goto shift16;
3201
 
3202
        case O (O_NOT, SL):             /* not.l */
3203
          if (fetch2 (sd, &code->src, &rd))
3204
            goto end;
3205
          rd = ~rd;
3206
          v = 0;
3207
          goto shift32;
3208
 
3209
        case O (O_SHLL, SB):    /* shll.b */
3210
        case O (O_SHLR, SB):    /* shlr.b */
3211
          if (fetch2 (sd, &code->dst, &rd))
3212
            goto end;
3213
 
3214
          if (memcmp (&code->src, &code->dst, sizeof (code->src)) == 0)
3215
            ea = 1;             /* unary  op */
3216
          else                  /* binary op */
3217
            fetch (sd, &code->src, &ea);
3218
 
3219
          if (code->opcode == O (O_SHLL, SB))
3220
            {
3221
              v = (ea > 8);
3222
              c = rd & (0x80 >> (ea - 1));
3223
              rd <<= ea;
3224
            }
3225
          else
3226
            {
3227
              v = 0;
3228
              c = rd & (1 << (ea - 1));
3229
              rd = (unsigned char) rd >> ea;
3230
            }
3231
          goto shift8;
3232
 
3233
        case O (O_SHLL, SW):    /* shll.w */
3234
        case O (O_SHLR, SW):    /* shlr.w */
3235
          if (fetch2 (sd, &code->dst, &rd))
3236
            goto end;
3237
 
3238
          if (memcmp (&code->src, &code->dst, sizeof (code->src)) == 0)
3239
            ea = 1;             /* unary  op */
3240
          else
3241
            fetch (sd, &code->src, &ea);
3242
 
3243
          if (code->opcode == O (O_SHLL, SW))
3244
            {
3245
              v = (ea > 16);
3246
              c = rd & (0x8000 >> (ea - 1));
3247
              rd <<= ea;
3248
            }
3249
          else
3250
            {
3251
              v = 0;
3252
              c = rd & (1 << (ea - 1));
3253
              rd = (unsigned short) rd >> ea;
3254
            }
3255
          goto shift16;
3256
 
3257
        case O (O_SHLL, SL):    /* shll.l */
3258
        case O (O_SHLR, SL):    /* shlr.l */
3259
          if (fetch2 (sd, &code->dst, &rd))
3260
            goto end;
3261
 
3262
          if (memcmp (&code->src, &code->dst, sizeof (code->src)) == 0)
3263
            ea = 1;             /* unary  op */
3264
          else
3265
            fetch (sd, &code->src, &ea);
3266
 
3267
          if (code->opcode == O (O_SHLL, SL))
3268
            {
3269
              v = (ea > 32);
3270
              c = rd & (0x80000000 >> (ea - 1));
3271
              rd <<= ea;
3272
            }
3273
          else
3274
            {
3275
              v = 0;
3276
              c = rd & (1 << (ea - 1));
3277
              rd = (unsigned int) rd >> ea;
3278
            }
3279
          goto shift32;
3280
 
3281
        case O (O_SHAL, SB):
3282
        case O (O_SHAR, SB):
3283
          if (fetch2 (sd, &code->dst, &rd))
3284
            goto end;
3285
 
3286
          if (code->src.type == X (OP_IMM, SB))
3287
            fetch (sd, &code->src, &ea);
3288
          else
3289
            ea = 1;
3290
 
3291
          if (code->opcode == O (O_SHAL, SB))
3292
            {
3293
              c = rd & (0x80 >> (ea - 1));
3294
              res = rd >> (7 - ea);
3295
              v = ((res & 1) && !(res & 2))
3296
                || (!(res & 1) && (res & 2));
3297
              rd <<= ea;
3298
            }
3299
          else
3300
            {
3301
              c = rd & (1 << (ea - 1));
3302
              v = 0;
3303
              rd = ((signed char) rd) >> ea;
3304
            }
3305
          goto shift8;
3306
 
3307
        case O (O_SHAL, SW):
3308
        case O (O_SHAR, SW):
3309
          if (fetch2 (sd, &code->dst, &rd))
3310
            goto end;
3311
 
3312
          if (code->src.type == X (OP_IMM, SW))
3313
            fetch (sd, &code->src, &ea);
3314
          else
3315
            ea = 1;
3316
 
3317
          if (code->opcode == O (O_SHAL, SW))
3318
            {
3319
              c = rd & (0x8000 >> (ea - 1));
3320
              res = rd >> (15 - ea);
3321
              v = ((res & 1) && !(res & 2))
3322
                || (!(res & 1) && (res & 2));
3323
              rd <<= ea;
3324
            }
3325
          else
3326
            {
3327
              c = rd & (1 << (ea - 1));
3328
              v = 0;
3329
              rd = ((signed short) rd) >> ea;
3330
            }
3331
          goto shift16;
3332
 
3333
        case O (O_SHAL, SL):
3334
        case O (O_SHAR, SL):
3335
          if (fetch2 (sd, &code->dst, &rd))
3336
            goto end;
3337
 
3338
          if (code->src.type == X (OP_IMM, SL))
3339
            fetch (sd, &code->src, &ea);
3340
          else
3341
            ea = 1;
3342
 
3343
          if (code->opcode == O (O_SHAL, SL))
3344
            {
3345
              c = rd & (0x80000000 >> (ea - 1));
3346
              res = rd >> (31 - ea);
3347
              v = ((res & 1) && !(res & 2))
3348
                || (!(res & 1) && (res & 2));
3349
              rd <<= ea;
3350
            }
3351
          else
3352
            {
3353
              c = rd & (1 << (ea - 1));
3354
              v = 0;
3355
              rd = ((signed int) rd) >> ea;
3356
            }
3357
          goto shift32;
3358
 
3359
        case O (O_ROTL, SB):
3360
        case O (O_ROTR, SB):
3361
          if (fetch2 (sd, &code->dst, &rd))
3362
            goto end;
3363
 
3364
          if (code->src.type == X (OP_IMM, SB))
3365
            fetch (sd, &code->src, &ea);
3366
          else
3367
            ea = 1;
3368
 
3369
          while (ea--)
3370
            if (code->opcode == O (O_ROTL, SB))
3371
              {
3372
                c = rd & 0x80;
3373
                rd <<= 1;
3374
                if (c)
3375
                  rd |= 1;
3376
              }
3377
            else
3378
              {
3379
                c = rd & 1;
3380
                rd = ((unsigned char) rd) >> 1;
3381
                if (c)
3382
                  rd |= 0x80;
3383
              }
3384
 
3385
          v = 0;
3386
          goto shift8;
3387
 
3388
        case O (O_ROTL, SW):
3389
        case O (O_ROTR, SW):
3390
          if (fetch2 (sd, &code->dst, &rd))
3391
            goto end;
3392
 
3393
          if (code->src.type == X (OP_IMM, SW))
3394
            fetch (sd, &code->src, &ea);
3395
          else
3396
            ea = 1;
3397
 
3398
          while (ea--)
3399
            if (code->opcode == O (O_ROTL, SW))
3400
              {
3401
                c = rd & 0x8000;
3402
                rd <<= 1;
3403
                if (c)
3404
                  rd |= 1;
3405
              }
3406
            else
3407
              {
3408
                c = rd & 1;
3409
                rd = ((unsigned short) rd) >> 1;
3410
                if (c)
3411
                  rd |= 0x8000;
3412
              }
3413
 
3414
          v = 0;
3415
          goto shift16;
3416
 
3417
        case O (O_ROTL, SL):
3418
        case O (O_ROTR, SL):
3419
          if (fetch2 (sd, &code->dst, &rd))
3420
            goto end;
3421
 
3422
          if (code->src.type == X (OP_IMM, SL))
3423
            fetch (sd, &code->src, &ea);
3424
          else
3425
            ea = 1;
3426
 
3427
          while (ea--)
3428
            if (code->opcode == O (O_ROTL, SL))
3429
              {
3430
                c = rd & 0x80000000;
3431
                rd <<= 1;
3432
                if (c)
3433
                  rd |= 1;
3434
              }
3435
            else
3436
              {
3437
                c = rd & 1;
3438
                rd = ((unsigned int) rd) >> 1;
3439
                if (c)
3440
                  rd |= 0x80000000;
3441
              }
3442
 
3443
          v = 0;
3444
          goto shift32;
3445
 
3446
        case O (O_ROTXL, SB):
3447
        case O (O_ROTXR, SB):
3448
          if (fetch2 (sd, &code->dst, &rd))
3449
            goto end;
3450
 
3451
          if (code->src.type == X (OP_IMM, SB))
3452
            fetch (sd, &code->src, &ea);
3453
          else
3454
            ea = 1;
3455
 
3456
          while (ea--)
3457
            if (code->opcode == O (O_ROTXL, SB))
3458
              {
3459
                res = rd & 0x80;
3460
                rd <<= 1;
3461
                if (C)
3462
                  rd |= 1;
3463
                c = res;
3464
              }
3465
            else
3466
              {
3467
                res = rd & 1;
3468
                rd = ((unsigned char) rd) >> 1;
3469
                if (C)
3470
                  rd |= 0x80;
3471
                c = res;
3472
              }
3473
 
3474
          v = 0;
3475
          goto shift8;
3476
 
3477
        case O (O_ROTXL, SW):
3478
        case O (O_ROTXR, SW):
3479
          if (fetch2 (sd, &code->dst, &rd))
3480
            goto end;
3481
 
3482
          if (code->src.type == X (OP_IMM, SW))
3483
            fetch (sd, &code->src, &ea);
3484
          else
3485
            ea = 1;
3486
 
3487
          while (ea--)
3488
            if (code->opcode == O (O_ROTXL, SW))
3489
              {
3490
                res = rd & 0x8000;
3491
                rd <<= 1;
3492
                if (C)
3493
                  rd |= 1;
3494
                c = res;
3495
              }
3496
            else
3497
              {
3498
                res = rd & 1;
3499
                rd = ((unsigned short) rd) >> 1;
3500
                if (C)
3501
                  rd |= 0x8000;
3502
                c = res;
3503
              }
3504
 
3505
          v = 0;
3506
          goto shift16;
3507
 
3508
        case O (O_ROTXL, SL):
3509
        case O (O_ROTXR, SL):
3510
          if (fetch2 (sd, &code->dst, &rd))
3511
            goto end;
3512
 
3513
          if (code->src.type == X (OP_IMM, SL))
3514
            fetch (sd, &code->src, &ea);
3515
          else
3516
            ea = 1;
3517
 
3518
          while (ea--)
3519
            if (code->opcode == O (O_ROTXL, SL))
3520
              {
3521
                res = rd & 0x80000000;
3522
                rd <<= 1;
3523
                if (C)
3524
                  rd |= 1;
3525
                c = res;
3526
              }
3527
            else
3528
              {
3529
                res = rd & 1;
3530
                rd = ((unsigned int) rd) >> 1;
3531
                if (C)
3532
                  rd |= 0x80000000;
3533
                c = res;
3534
              }
3535
 
3536
          v = 0;
3537
          goto shift32;
3538
 
3539
        case O (O_JMP, SN):
3540
        case O (O_JMP, SL):
3541
        case O (O_JMP, SB):             /* jmp */
3542
        case O (O_JMP, SW):
3543
          fetch (sd, &code->src, &pc);
3544
          goto end;
3545
 
3546
        case O (O_JSR, SN):
3547
        case O (O_JSR, SL):
3548
        case O (O_JSR, SB):             /* jsr, jump to subroutine */
3549
        case O (O_JSR, SW):
3550
          if (fetch (sd, &code->src, &pc))
3551
            goto end;
3552
        call:
3553
          tmp = h8_get_reg (sd, SP_REGNUM);
3554
 
3555
          if (h8300hmode && !h8300_normal_mode)
3556
            {
3557
              tmp -= 4;
3558
              SET_MEMORY_L (tmp, code->next_pc);
3559
            }
3560
          else
3561
            {
3562
              tmp -= 2;
3563
              SET_MEMORY_W (tmp, code->next_pc);
3564
            }
3565
          h8_set_reg (sd, SP_REGNUM, tmp);
3566
 
3567
          goto end;
3568
 
3569
        case O (O_BSR, SW):
3570
        case O (O_BSR, SL):
3571
        case O (O_BSR, SB):             /* bsr, branch to subroutine */
3572
          if (fetch (sd, &code->src, &res))
3573
            goto end;
3574
          pc = code->next_pc + res;
3575
          goto call;
3576
 
3577
        case O (O_RTE, SN):             /* rte, return from exception */
3578
        rte:
3579
          /* Pops exr and ccr before pc -- otherwise identical to rts.  */
3580
          tmp = h8_get_reg (sd, SP_REGNUM);
3581
 
3582
          if (h8300smode)                       /* pop exr */
3583
            {
3584
              h8_set_exr (sd, GET_MEMORY_L (tmp));
3585
              tmp += 4;
3586
            }
3587
          if (h8300hmode && !h8300_normal_mode)
3588
            {
3589
              h8_set_ccr (sd, GET_MEMORY_L (tmp));
3590
              tmp += 4;
3591
              pc = GET_MEMORY_L (tmp);
3592
              tmp += 4;
3593
            }
3594
          else
3595
            {
3596
              h8_set_ccr (sd, GET_MEMORY_W (tmp));
3597
              tmp += 2;
3598
              pc = GET_MEMORY_W (tmp);
3599
              tmp += 2;
3600
            }
3601
 
3602
          GETSR (sd);
3603
          h8_set_reg (sd, SP_REGNUM, tmp);
3604
          goto end;
3605
 
3606
        case O (O_RTS, SN):             /* rts, return from subroutine */
3607
        rts:
3608
          tmp = h8_get_reg (sd, SP_REGNUM);
3609
 
3610
          if (h8300hmode && !h8300_normal_mode)
3611
            {
3612
              pc = GET_MEMORY_L (tmp);
3613
              tmp += 4;
3614
            }
3615
          else
3616
            {
3617
              pc = GET_MEMORY_W (tmp);
3618
              tmp += 2;
3619
            }
3620
 
3621
          h8_set_reg (sd, SP_REGNUM, tmp);
3622
          goto end;
3623
 
3624
        case O (O_ILL, SB):             /* illegal */
3625
          sim_engine_set_run_state (sd, sim_stopped, SIGILL);
3626
          goto end;
3627
 
3628
        case O (O_SLEEP, SN):           /* sleep */
3629
          /* Check for magic numbers in r1 and r2.  */
3630
          if ((h8_get_reg (sd, R1_REGNUM) & 0xffff) == LIBC_EXIT_MAGIC1 &&
3631
              (h8_get_reg (sd, R2_REGNUM) & 0xffff) == LIBC_EXIT_MAGIC2 &&
3632
              SIM_WIFEXITED (h8_get_reg (sd, 0)))
3633
            {
3634
              /* This trap comes from _exit, not from gdb.  */
3635
              sim_engine_set_run_state (sd, sim_exited,
3636
                                        SIM_WEXITSTATUS (h8_get_reg (sd, 0)));
3637
            }
3638
#if 0
3639
          /* Unfortunately this won't really work, because
3640
             when we take a breakpoint trap, R0 has a "random",
3641
             user-defined value.  Don't see any immediate solution.  */
3642
          else if (SIM_WIFSTOPPED (h8_get_reg (sd, 0)))
3643
            {
3644
              /* Pass the stop signal up to gdb.  */
3645
              sim_engine_set_run_state (sd, sim_stopped,
3646
                                        SIM_WSTOPSIG (h8_get_reg (sd, 0)));
3647
            }
3648
#endif
3649
          else
3650
            {
3651
              /* Treat it as a sigtrap.  */
3652
              sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
3653
            }
3654
          goto end;
3655
 
3656
        case O (O_TRAPA, SB):           /* trapa */
3657
          if (fetch (sd, &code->src, &res))
3658
            goto end;                   /* res is vector number.  */
3659
 
3660
          tmp = h8_get_reg (sd, SP_REGNUM);
3661
          if(h8300_normal_mode)
3662
            {
3663
              tmp -= 2;
3664
              SET_MEMORY_W (tmp, code->next_pc);
3665
              tmp -= 2;
3666
              SET_MEMORY_W (tmp, h8_get_ccr (sd));
3667
            }
3668
          else
3669
            {
3670
              tmp -= 4;
3671
              SET_MEMORY_L (tmp, code->next_pc);
3672
              tmp -= 4;
3673
              SET_MEMORY_L (tmp, h8_get_ccr (sd));
3674
            }
3675
          intMaskBit = 1;
3676
          BUILDSR (sd);
3677
 
3678
          if (h8300smode)
3679
            {
3680
              tmp -= 4;
3681
              SET_MEMORY_L (tmp, h8_get_exr (sd));
3682
            }
3683
 
3684
          h8_set_reg (sd, SP_REGNUM, tmp);
3685
 
3686
          if(h8300_normal_mode)
3687
            pc = GET_MEMORY_L (0x10 + res * 2); /* Vector addresses are 0x10,0x12,0x14 and 0x16 */
3688
          else
3689
            pc = GET_MEMORY_L (0x20 + res * 4);
3690
          goto end;
3691
 
3692
        case O (O_BPT, SN):
3693
          sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
3694
          goto end;
3695
 
3696
        case O (O_BSETEQ, SB):
3697
          if (Z)
3698
            goto bset;
3699
          goto next;
3700
 
3701
        case O (O_BSETNE, SB):
3702
          if (!Z)
3703
            goto bset;
3704
          goto next;
3705
 
3706
        case O (O_BCLREQ, SB):
3707
          if (Z)
3708
            goto bclr;
3709
          goto next;
3710
 
3711
        case O (O_BCLRNE, SB):
3712
          if (!Z)
3713
            goto bclr;
3714
          goto next;
3715
 
3716
          OBITOP (O_BNOT, 1, 1, ea ^= m);               /* bnot */
3717
          OBITOP (O_BTST, 1, 0, nz = ea & m);            /* btst */
3718
        bset:
3719
          OBITOP (O_BSET, 1, 1, ea |= m);               /* bset */
3720
        bclr:
3721
          OBITOP (O_BCLR, 1, 1, ea &= ~m);              /* bclr */
3722
          OBITOP (O_BLD, 1, 0, c = ea & m);              /* bld  */
3723
          OBITOP (O_BILD, 1, 0, c = !(ea & m));          /* bild */
3724
          OBITOP (O_BST, 1, 1, ea &= ~m;
3725
                  if (C) ea |= m);                      /* bst  */
3726
          OBITOP (O_BIST, 1, 1, ea &= ~m;
3727
                  if (!C) ea |= m);                     /* bist */
3728
          OBITOP (O_BSTZ, 1, 1, ea &= ~m;
3729
                  if (Z) ea |= m);                      /* bstz */
3730
          OBITOP (O_BISTZ, 1, 1, ea &= ~m;
3731
                  if (!Z) ea |= m);                     /* bistz */
3732
          OBITOP (O_BAND, 1, 0, c = (ea & m) && C);      /* band */
3733
          OBITOP (O_BIAND, 1, 0, c = !(ea & m) && C);    /* biand */
3734
          OBITOP (O_BOR, 1, 0, c = (ea & m) || C);       /* bor  */
3735
          OBITOP (O_BIOR, 1, 0, c = !(ea & m) || C);     /* bior */
3736
          OBITOP (O_BXOR, 1, 0, c = ((ea & m) != 0)!= C); /* bxor */
3737
          OBITOP (O_BIXOR, 1, 0, c = !(ea & m) != C);    /* bixor */
3738
 
3739
        case O (O_BFLD, SB):                            /* bfld */
3740
          /* bitfield load */
3741
          ea = 0;
3742
          if (fetch (sd, &code->src, &bit))
3743
            goto end;
3744
 
3745
          if (bit != 0)
3746
            {
3747
              if (fetch (sd, &code->dst, &ea))
3748
                goto end;
3749
 
3750
              ea &= bit;
3751
              while (!(bit & 1))
3752
                {
3753
                  ea  >>= 1;
3754
                  bit >>= 1;
3755
                }
3756
            }
3757
          if (store (sd, &code->op3, ea))
3758
            goto end;
3759
 
3760
          goto next;
3761
 
3762
        case O(O_BFST, SB):                     /* bfst */
3763
          /* bitfield store */
3764
          /* NOTE: the imm8 value is in dst, and the ea value
3765
             (which is actually the destination) is in op3.
3766
             It has to be that way, to avoid breaking the assembler.  */
3767
 
3768
          if (fetch (sd, &code->dst, &bit))     /* imm8 */
3769
            goto end;
3770
          if (bit == 0)                          /* noop -- nothing to do.  */
3771
            goto next;
3772
 
3773
          if (fetch (sd, &code->src, &rd))      /* reg8 src */
3774
            goto end;
3775
 
3776
          if (fetch2 (sd, &code->op3, &ea))     /* ea dst */
3777
            goto end;
3778
 
3779
          /* Left-shift the register data into position.  */
3780
          for (tmp = bit; !(tmp & 1); tmp >>= 1)
3781
            rd <<= 1;
3782
 
3783
          /* Combine it with the neighboring bits.  */
3784
          ea = (ea & ~bit) | (rd & bit);
3785
 
3786
          /* Put it back.  */
3787
          if (store2 (sd, &code->op3, ea))
3788
            goto end;
3789
          goto next;
3790
 
3791
        case O (O_CLRMAC, SN):          /* clrmac */
3792
          h8_set_mach (sd, 0);
3793
          h8_set_macl (sd, 0);
3794
          h8_set_macZ (sd, 1);
3795
          h8_set_macV (sd, 0);
3796
          h8_set_macN (sd, 0);
3797
          goto next;
3798
 
3799
        case O (O_STMAC, SL):           /* stmac, 260 */
3800
          switch (code->src.type) {
3801
          case X (OP_MACH, SL):
3802
            res = h8_get_mach (sd);
3803
            if (res & 0x200)            /* sign extend */
3804
              res |= 0xfffffc00;
3805
            break;
3806
          case X (OP_MACL, SL):
3807
            res = h8_get_macl (sd);
3808
            break;
3809
          default:      goto illegal;
3810
          }
3811
          nz = !h8_get_macZ (sd);
3812
          n = h8_get_macN (sd);
3813
          v = h8_get_macV (sd);
3814
 
3815
          if (store (sd, &code->dst, res))
3816
            goto end;
3817
 
3818
          goto next;
3819
 
3820
        case O (O_LDMAC, SL):           /* ldmac, 179 */
3821
          if (fetch (sd, &code->src, &rd))
3822
            goto end;
3823
 
3824
          switch (code->dst.type) {
3825
          case X (OP_MACH, SL):
3826
            rd &= 0x3ff;                /* Truncate to 10 bits */
3827
            h8_set_mach (sd, rd);
3828
            break;
3829
          case X (OP_MACL, SL):
3830
            h8_set_macl (sd, rd);
3831
            break;
3832
          default:      goto illegal;
3833
          }
3834
          h8_set_macV (sd, 0);
3835
          goto next;
3836
 
3837
        case O (O_MAC, SW):
3838
          if (fetch (sd, &code->src, &rd) ||
3839
              fetch (sd, &code->dst, &res))
3840
            goto end;
3841
 
3842
          /* Ye gods, this is non-portable!
3843
             However, the existing mul/div code is similar.  */
3844
          res = SEXTSHORT (res) * SEXTSHORT (rd);
3845
 
3846
          if (h8_get_macS (sd))         /* Saturating mode */
3847
            {
3848
              long long mac = h8_get_macl (sd);
3849
 
3850
              if (mac & 0x80000000)             /* sign extend */
3851
                mac |= 0xffffffff00000000LL;
3852
 
3853
              mac += res;
3854
              if (mac > 0x7fffffff || mac < 0xffffffff80000000LL)
3855
                h8_set_macV (sd, 1);
3856
              h8_set_macZ (sd, (mac == 0));
3857
              h8_set_macN (sd, (mac  < 0));
3858
              h8_set_macl (sd, (int) mac);
3859
            }
3860
          else                          /* "Less Saturating" mode */
3861
            {
3862
              long long mac = h8_get_mach (sd);
3863
              mac <<= 32;
3864
              mac += h8_get_macl (sd);
3865
 
3866
              if (mac & 0x20000000000LL)        /* sign extend */
3867
                mac |= 0xfffffc0000000000LL;
3868
 
3869
              mac += res;
3870
              if (mac > 0x1ffffffffffLL ||
3871
                  mac < (long long) 0xfffffe0000000000LL)
3872
                h8_set_macV (sd, 1);
3873
              h8_set_macZ (sd, (mac == 0));
3874
              h8_set_macN (sd, (mac  < 0));
3875
              h8_set_macl (sd, (int) mac);
3876
              mac >>= 32;
3877
              h8_set_mach (sd, (int) (mac & 0x3ff));
3878
            }
3879
          goto next;
3880
 
3881
        case O (O_MULS, SW):            /* muls.w */
3882
          if (fetch (sd, &code->src, &ea) ||
3883
              fetch (sd, &code->dst, &rd))
3884
            goto end;
3885
 
3886
          ea = SEXTSHORT (ea);
3887
          res = SEXTSHORT (ea * SEXTSHORT (rd));
3888
 
3889
          n  = res & 0x8000;
3890
          nz = res & 0xffff;
3891
          if (store (sd, &code->dst, res))
3892
            goto end;
3893
 
3894
          goto next;
3895
 
3896
        case O (O_MULS, SL):            /* muls.l */
3897
          if (fetch (sd, &code->src, &ea) ||
3898
              fetch (sd, &code->dst, &rd))
3899
            goto end;
3900
 
3901
          res = ea * rd;
3902
 
3903
          n  = res & 0x80000000;
3904
          nz = res & 0xffffffff;
3905
          if (store (sd, &code->dst, res))
3906
            goto end;
3907
          goto next;
3908
 
3909
        case O (O_MULSU, SL):           /* muls/u.l */
3910
          if (fetch (sd, &code->src, &ea) ||
3911
              fetch (sd, &code->dst, &rd))
3912
            goto end;
3913
 
3914
          /* Compute upper 32 bits of the 64-bit result.  */
3915
          res = (((long long) ea) * ((long long) rd)) >> 32;
3916
 
3917
          n  = res & 0x80000000;
3918
          nz = res & 0xffffffff;
3919
          if (store (sd, &code->dst, res))
3920
            goto end;
3921
          goto next;
3922
 
3923
        case O (O_MULU, SW):            /* mulu.w */
3924
          if (fetch (sd, &code->src, &ea) ||
3925
              fetch (sd, &code->dst, &rd))
3926
            goto end;
3927
 
3928
          res = UEXTSHORT ((UEXTSHORT (ea) * UEXTSHORT (rd)));
3929
 
3930
          /* Don't set Z or N.  */
3931
          if (store (sd, &code->dst, res))
3932
            goto end;
3933
 
3934
          goto next;
3935
 
3936
        case O (O_MULU, SL):            /* mulu.l */
3937
          if (fetch (sd, &code->src, &ea) ||
3938
              fetch (sd, &code->dst, &rd))
3939
            goto end;
3940
 
3941
          res = ea * rd;
3942
 
3943
          /* Don't set Z or N.  */
3944
          if (store (sd, &code->dst, res))
3945
            goto end;
3946
 
3947
          goto next;
3948
 
3949
        case O (O_MULUU, SL):           /* mulu/u.l */
3950
          if (fetch (sd, &code->src, &ea) ||
3951
              fetch (sd, &code->dst, &rd))
3952
            goto end;
3953
 
3954
          /* Compute upper 32 bits of the 64-bit result.  */
3955
          res = (((unsigned long long) (unsigned) ea) *
3956
                 ((unsigned long long) (unsigned) rd)) >> 32;
3957
 
3958
          /* Don't set Z or N.  */
3959
          if (store (sd, &code->dst, res))
3960
            goto end;
3961
 
3962
          goto next;
3963
 
3964
        case O (O_MULXS, SB):           /* mulxs.b */
3965
          if (fetch (sd, &code->src, &ea) ||
3966
              fetch (sd, &code->dst, &rd))
3967
            goto end;
3968
 
3969
          ea = SEXTCHAR (ea);
3970
          res = ea * SEXTCHAR (rd);
3971
 
3972
          n  = res & 0x8000;
3973
          nz = res & 0xffff;
3974
          if (store (sd, &code->dst, res))
3975
            goto end;
3976
 
3977
          goto next;
3978
 
3979
        case O (O_MULXS, SW):           /* mulxs.w */
3980
          if (fetch (sd, &code->src, &ea) ||
3981
              fetch (sd, &code->dst, &rd))
3982
            goto end;
3983
 
3984
          ea = SEXTSHORT (ea);
3985
          res = ea * SEXTSHORT (rd & 0xffff);
3986
 
3987
          n  = res & 0x80000000;
3988
          nz = res & 0xffffffff;
3989
          if (store (sd, &code->dst, res))
3990
            goto end;
3991
 
3992
          goto next;
3993
 
3994
        case O (O_MULXU, SB):           /* mulxu.b */
3995
          if (fetch (sd, &code->src, &ea) ||
3996
              fetch (sd, &code->dst, &rd))
3997
            goto end;
3998
 
3999
          res = UEXTCHAR (ea) * UEXTCHAR (rd);
4000
 
4001
          if (store (sd, &code->dst, res))
4002
            goto end;
4003
 
4004
          goto next;
4005
 
4006
        case O (O_MULXU, SW):           /* mulxu.w */
4007
          if (fetch (sd, &code->src, &ea) ||
4008
              fetch (sd, &code->dst, &rd))
4009
            goto end;
4010
 
4011
          res = UEXTSHORT (ea) * UEXTSHORT (rd);
4012
 
4013
          if (store (sd, &code->dst, res))
4014
            goto end;
4015
 
4016
          goto next;
4017
 
4018
        case O (O_TAS, SB):             /* tas (test and set) */
4019
          if (!h8300sxmode)             /* h8sx can use any register. */
4020
            switch (code->src.reg)
4021
              {
4022
              case R0_REGNUM:
4023
              case R1_REGNUM:
4024
              case R4_REGNUM:
4025
              case R5_REGNUM:
4026
                break;
4027
              default:
4028
                goto illegal;
4029
              }
4030
 
4031
          if (fetch (sd, &code->src, &res))
4032
            goto end;
4033
          if (store (sd, &code->src, res | 0x80))
4034
            goto end;
4035
 
4036
          goto just_flags_log8;
4037
 
4038
        case O (O_DIVU, SW):                    /* divu.w */
4039
          if (fetch (sd, &code->src, &ea) ||
4040
              fetch (sd, &code->dst, &rd))
4041
            goto end;
4042
 
4043
          n  = ea & 0x8000;
4044
          nz = ea & 0xffff;
4045
          if (ea)
4046
            res = (unsigned) (UEXTSHORT (rd) / UEXTSHORT (ea));
4047
          else
4048
            res = 0;
4049
 
4050
          if (store (sd, &code->dst, res))
4051
            goto end;
4052
          goto next;
4053
 
4054
        case O (O_DIVU, SL):                    /* divu.l */
4055
          if (fetch (sd, &code->src, &ea) ||
4056
              fetch (sd, &code->dst, &rd))
4057
            goto end;
4058
 
4059
          n  = ea & 0x80000000;
4060
          nz = ea & 0xffffffff;
4061
          if (ea)
4062
            res = (unsigned) rd / ea;
4063
          else
4064
            res = 0;
4065
 
4066
          if (store (sd, &code->dst, res))
4067
            goto end;
4068
          goto next;
4069
 
4070
        case O (O_DIVS, SW):                    /* divs.w */
4071
          if (fetch (sd, &code->src, &ea) ||
4072
              fetch (sd, &code->dst, &rd))
4073
            goto end;
4074
 
4075
          if (ea)
4076
            {
4077
              res = SEXTSHORT (rd) / SEXTSHORT (ea);
4078
              nz  = 1;
4079
            }
4080
          else
4081
            {
4082
              res = 0;
4083
              nz  = 0;
4084
            }
4085
 
4086
          n = res & 0x8000;
4087
          if (store (sd, &code->dst, res))
4088
            goto end;
4089
          goto next;
4090
 
4091
        case O (O_DIVS, SL):                    /* divs.l */
4092
          if (fetch (sd, &code->src, &ea) ||
4093
              fetch (sd, &code->dst, &rd))
4094
            goto end;
4095
 
4096
          if (ea)
4097
            {
4098
              res = rd / ea;
4099
              nz  = 1;
4100
            }
4101
          else
4102
            {
4103
              res = 0;
4104
              nz  = 0;
4105
            }
4106
 
4107
          n = res & 0x80000000;
4108
          if (store (sd, &code->dst, res))
4109
            goto end;
4110
          goto next;
4111
 
4112
        case O (O_DIVXU, SB):                   /* divxu.b */
4113
          if (fetch (sd, &code->src, &ea) ||
4114
              fetch (sd, &code->dst, &rd))
4115
            goto end;
4116
 
4117
          rd = UEXTSHORT (rd);
4118
          ea = UEXTCHAR (ea);
4119
 
4120
          n  = ea & 0x80;
4121
          nz = ea & 0xff;
4122
          if (ea)
4123
            {
4124
              tmp = (unsigned) rd % ea;
4125
              res = (unsigned) rd / ea;
4126
            }
4127
          else
4128
            {
4129
              tmp = 0;
4130
              res = 0;
4131
            }
4132
 
4133
          if (store (sd, &code->dst, (res & 0xff) | (tmp << 8)))
4134
            goto end;
4135
          goto next;
4136
 
4137
        case O (O_DIVXU, SW):                   /* divxu.w */
4138
          if (fetch (sd, &code->src, &ea) ||
4139
              fetch (sd, &code->dst, &rd))
4140
            goto end;
4141
 
4142
          ea = UEXTSHORT (ea);
4143
 
4144
          n  = ea & 0x8000;
4145
          nz = ea & 0xffff;
4146
          if (ea)
4147
            {
4148
              tmp = (unsigned) rd % ea;
4149
              res = (unsigned) rd / ea;
4150
            }
4151
          else
4152
            {
4153
              tmp = 0;
4154
              res = 0;
4155
            }
4156
 
4157
          if (store (sd, &code->dst, (res & 0xffff) | (tmp << 16)))
4158
            goto end;
4159
          goto next;
4160
 
4161
        case O (O_DIVXS, SB):                   /* divxs.b */
4162
          if (fetch (sd, &code->src, &ea) ||
4163
              fetch (sd, &code->dst, &rd))
4164
            goto end;
4165
 
4166
          rd = SEXTSHORT (rd);
4167
          ea = SEXTCHAR (ea);
4168
 
4169
          if (ea)
4170
            {
4171
              tmp = (int) rd % (int) ea;
4172
              res = (int) rd / (int) ea;
4173
              nz  = 1;
4174
            }
4175
          else
4176
            {
4177
              tmp = 0;
4178
              res = 0;
4179
              nz  = 0;
4180
            }
4181
 
4182
          n = res & 0x8000;
4183
          if (store (sd, &code->dst, (res & 0xff) | (tmp << 8)))
4184
            goto end;
4185
          goto next;
4186
 
4187
        case O (O_DIVXS, SW):                   /* divxs.w */
4188
          if (fetch (sd, &code->src, &ea) ||
4189
              fetch (sd, &code->dst, &rd))
4190
            goto end;
4191
 
4192
          ea = SEXTSHORT (ea);
4193
 
4194
          if (ea)
4195
            {
4196
              tmp = (int) rd % (int) ea;
4197
              res = (int) rd / (int) ea;
4198
              nz  = 1;
4199
            }
4200
          else
4201
            {
4202
              tmp = 0;
4203
              res = 0;
4204
              nz  = 0;
4205
            }
4206
 
4207
          n = res & 0x80000000;
4208
          if (store (sd, &code->dst, (res & 0xffff) | (tmp << 16)))
4209
            goto end;
4210
          goto next;
4211
 
4212
        case O (O_EXTS, SW):                    /* exts.w, signed extend */
4213
          if (fetch2 (sd, &code->dst, &rd))
4214
            goto end;
4215
          ea = rd & 0x80 ? -256 : 0;
4216
          res = (rd & 0xff) + ea;
4217
          goto log16;
4218
 
4219
        case O (O_EXTS, SL):                    /* exts.l, signed extend */
4220
          if (fetch2 (sd, &code->dst, &rd))
4221
            goto end;
4222
          if (code->src.type == X (OP_IMM, SL))
4223
            {
4224
              if (fetch (sd, &code->src, &ea))
4225
                goto end;
4226
 
4227
              if (ea == 2)                      /* exts.l #2, nn */
4228
                {
4229
                  /* Sign-extend from 8-bit to 32-bit.  */
4230
                  ea = rd & 0x80 ? -256 : 0;
4231
                  res = (rd & 0xff) + ea;
4232
                  goto log32;
4233
                }
4234
            }
4235
          /* Sign-extend from 16-bit to 32-bit.  */
4236
          ea = rd & 0x8000 ? -65536 : 0;
4237
          res = (rd & 0xffff) + ea;
4238
          goto log32;
4239
 
4240
        case O (O_EXTU, SW):                    /* extu.w, unsigned extend */
4241
          if (fetch2 (sd, &code->dst, &rd))
4242
            goto end;
4243
          ea = 0;
4244
          res = (rd & 0xff) + ea;
4245
          goto log16;
4246
 
4247
        case O (O_EXTU, SL):                    /* extu.l, unsigned extend */
4248
          if (fetch2 (sd, &code->dst, &rd))
4249
            goto end;
4250
          if (code->src.type == X (OP_IMM, SL))
4251
            {
4252
              if (fetch (sd, &code->src, &ea))
4253
                goto end;
4254
 
4255
              if (ea == 2)                      /* extu.l #2, nn */
4256
                {
4257
                  /* Zero-extend from 8-bit to 32-bit.  */
4258
                  ea = 0;
4259
                  res = (rd & 0xff) + ea;
4260
                  goto log32;
4261
                }
4262
            }
4263
          /* Zero-extend from 16-bit to 32-bit.  */
4264
          ea = 0;
4265
          res = (rd & 0xffff) + ea;
4266
          goto log32;
4267
 
4268
        case O (O_NOP, SN):                     /* nop */
4269
          goto next;
4270
 
4271
        case O (O_STM, SL):                     /* stm, store to memory */
4272
          {
4273
            int nregs, firstreg, i;
4274
 
4275
            nregs = GET_MEMORY_B (pc + 1);
4276
            nregs >>= 4;
4277
            nregs &= 0xf;
4278
            firstreg = code->src.reg;
4279
            firstreg &= 0xf;
4280
            for (i = firstreg; i <= firstreg + nregs; i++)
4281
              {
4282
                h8_set_reg (sd, SP_REGNUM, h8_get_reg (sd, SP_REGNUM) - 4);
4283
                SET_MEMORY_L (h8_get_reg (sd, SP_REGNUM), h8_get_reg (sd, i));
4284
              }
4285
          }
4286
          goto next;
4287
 
4288
        case O (O_LDM, SL):                     /* ldm,  load from memory */
4289
        case O (O_RTEL, SN):                    /* rte/l, ldm plus rte */
4290
        case O (O_RTSL, SN):                    /* rts/l, ldm plus rts */
4291
          {
4292
            int nregs, firstreg, i;
4293
 
4294
            nregs = ((GET_MEMORY_B (pc + 1) >> 4) & 0xf);
4295
            firstreg = code->dst.reg & 0xf;
4296
            for (i = firstreg; i >= firstreg - nregs; i--)
4297
              {
4298
                h8_set_reg (sd, i, GET_MEMORY_L (h8_get_reg (sd, SP_REGNUM)));
4299
                h8_set_reg (sd, SP_REGNUM, h8_get_reg (sd, SP_REGNUM) + 4);
4300
              }
4301
          }
4302
          switch (code->opcode) {
4303
          case O (O_RTEL, SN):
4304
            goto rte;
4305
          case O (O_RTSL, SN):
4306
            goto rts;
4307
          case O (O_LDM, SL):
4308
            goto next;
4309
          default:
4310
            goto illegal;
4311
          }
4312
 
4313
        case O (O_DAA, SB):
4314
          /* Decimal Adjust Addition.  This is for BCD arithmetic.  */
4315
          res = GET_B_REG (code->src.reg);      /* FIXME fetch? */
4316
          if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) &&
4317
              !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
4318
            res = res;          /* Value added == 0.  */
4319
          else if (!c && (0  <= (res >>  4) && (res >>  4) <=  8) &&
4320
                   !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
4321
            res = res + 0x6;            /* Value added == 6.  */
4322
          else if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) &&
4323
                    h && (0 <= (res & 0xf) && (res & 0xf) <= 3))
4324
            res = res + 0x6;            /* Value added == 6.  */
4325
          else if (!c && (10 <= (res >>  4) && (res >>  4) <= 15) &&
4326
                   !h && (0  <= (res & 0xf) && (res & 0xf) <=  9))
4327
            res = res + 0x60;           /* Value added == 60.  */
4328
          else if (!c && (9  <= (res >>  4) && (res >>  4) <= 15) &&
4329
                   !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
4330
            res = res + 0x66;           /* Value added == 66.  */
4331
          else if (!c && (10 <= (res >>  4) && (res >>  4) <= 15) &&
4332
                    h && (0  <= (res & 0xf) && (res & 0xf) <=  3))
4333
            res = res + 0x66;           /* Value added == 66.  */
4334
          else if ( c && (1 <= (res >>  4) && (res >>  4) <= 2) &&
4335
                   !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
4336
            res = res + 0x60;           /* Value added == 60.  */
4337
          else if ( c && (1  <= (res >>  4) && (res >>  4) <=  2) &&
4338
                   !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
4339
            res = res + 0x66;           /* Value added == 66.  */
4340
          else if (c && (1 <= (res >>  4) && (res >>  4) <= 3) &&
4341
                   h && (0 <= (res & 0xf) && (res & 0xf) <= 3))
4342
            res = res + 0x66;           /* Value added == 66.  */
4343
 
4344
          goto alu8;
4345
 
4346
        case O (O_DAS, SB):
4347
          /* Decimal Adjust Subtraction.  This is for BCD arithmetic.  */
4348
          res = GET_B_REG (code->src.reg); /* FIXME fetch, fetch2... */
4349
          if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) &&
4350
              !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
4351
            res = res;          /* Value added == 0.  */
4352
          else if (!c && (0 <= (res >>  4) && (res >>  4) <=  8) &&
4353
                    h && (6 <= (res & 0xf) && (res & 0xf) <= 15))
4354
            res = res + 0xfa;           /* Value added == 0xfa.  */
4355
          else if ( c && (7 <= (res >>  4) && (res >>  4) <= 15) &&
4356
                   !h && (0 <= (res & 0xf) && (res & 0xf) <=  9))
4357
            res = res + 0xa0;           /* Value added == 0xa0.  */
4358
          else if (c && (6 <= (res >>  4) && (res >>  4) <= 15) &&
4359
                   h && (6 <= (res & 0xf) && (res & 0xf) <= 15))
4360
            res = res + 0x9a;           /* Value added == 0x9a.  */
4361
 
4362
          goto alu8;
4363
 
4364
        default:
4365
        illegal:
4366
          sim_engine_set_run_state (sd, sim_stopped, SIGILL);
4367
          goto end;
4368
 
4369
        }
4370
 
4371
      (*sim_callback->printf_filtered) (sim_callback,
4372
                                        "sim_resume: internal error.\n");
4373
      sim_engine_set_run_state (sd, sim_stopped, SIGILL);
4374
      goto end;
4375
 
4376
    setc:
4377
      if (code->dst.type == X (OP_CCR, SB) ||
4378
          code->dst.type == X (OP_CCR, SW))
4379
        {
4380
          h8_set_ccr (sd, res);
4381
          GETSR (sd);
4382
        }
4383
      else if (h8300smode &&
4384
               (code->dst.type == X (OP_EXR, SB) ||
4385
                code->dst.type == X (OP_EXR, SW)))
4386
        {
4387
          h8_set_exr (sd, res);
4388
          if (h8300smode)       /* Get exr.  */
4389
            {
4390
              trace = (h8_get_exr (sd) >> 7) & 1;
4391
              intMask = h8_get_exr (sd) & 7;
4392
            }
4393
        }
4394
      else
4395
        goto illegal;
4396
 
4397
      goto next;
4398
 
4399
    condtrue:
4400
      /* When a branch works */
4401
      if (fetch (sd, &code->src, &res))
4402
        goto end;
4403
      if (res & 1)              /* bad address */
4404
        goto illegal;
4405
      pc = code->next_pc + res;
4406
      goto end;
4407
 
4408
      /* Set the cond codes from res */
4409
    bitop:
4410
 
4411
      /* Set the flags after an 8 bit inc/dec operation */
4412
    just_flags_inc8:
4413
      n = res & 0x80;
4414
      nz = res & 0xff;
4415
      v = (rd & 0x7f) == 0x7f;
4416
      goto next;
4417
 
4418
      /* Set the flags after an 16 bit inc/dec operation */
4419
    just_flags_inc16:
4420
      n = res & 0x8000;
4421
      nz = res & 0xffff;
4422
      v = (rd & 0x7fff) == 0x7fff;
4423
      goto next;
4424
 
4425
      /* Set the flags after an 32 bit inc/dec operation */
4426
    just_flags_inc32:
4427
      n = res & 0x80000000;
4428
      nz = res & 0xffffffff;
4429
      v = (rd & 0x7fffffff) == 0x7fffffff;
4430
      goto next;
4431
 
4432
    shift8:
4433
      /* Set flags after an 8 bit shift op, carry,overflow set in insn */
4434
      n = (rd & 0x80);
4435
      nz = rd & 0xff;
4436
      if (store2 (sd, &code->dst, rd))
4437
        goto end;
4438
      goto next;
4439
 
4440
    shift16:
4441
      /* Set flags after an 16 bit shift op, carry,overflow set in insn */
4442
      n = (rd & 0x8000);
4443
      nz = rd & 0xffff;
4444
      if (store2 (sd, &code->dst, rd))
4445
        goto end;
4446
      goto next;
4447
 
4448
    shift32:
4449
      /* Set flags after an 32 bit shift op, carry,overflow set in insn */
4450
      n = (rd & 0x80000000);
4451
      nz = rd & 0xffffffff;
4452
      if (store2 (sd, &code->dst, rd))
4453
        goto end;
4454
      goto next;
4455
 
4456
    log32:
4457
      if (store2 (sd, &code->dst, res))
4458
        goto end;
4459
 
4460
    just_flags_log32:
4461
      /* flags after a 32bit logical operation */
4462
      n = res & 0x80000000;
4463
      nz = res & 0xffffffff;
4464
      v = 0;
4465
      goto next;
4466
 
4467
    log16:
4468
      if (store2 (sd, &code->dst, res))
4469
        goto end;
4470
 
4471
    just_flags_log16:
4472
      /* flags after a 16bit logical operation */
4473
      n = res & 0x8000;
4474
      nz = res & 0xffff;
4475
      v = 0;
4476
      goto next;
4477
 
4478
    log8:
4479
      if (store2 (sd, &code->dst, res))
4480
        goto end;
4481
 
4482
    just_flags_log8:
4483
      n = res & 0x80;
4484
      nz = res & 0xff;
4485
      v = 0;
4486
      goto next;
4487
 
4488
    alu8:
4489
      if (store2 (sd, &code->dst, res))
4490
        goto end;
4491
 
4492
    just_flags_alu8:
4493
      n = res & 0x80;
4494
      nz = res & 0xff;
4495
      c = (res & 0x100);
4496
      switch (code->opcode / 4)
4497
        {
4498
        case O_ADD:
4499
        case O_ADDX:
4500
          v = ((rd & 0x80) == (ea & 0x80)
4501
               && (rd & 0x80) != (res & 0x80));
4502
          break;
4503
        case O_SUB:
4504
        case O_SUBX:
4505
        case O_CMP:
4506
          v = ((rd & 0x80) != (-ea & 0x80)
4507
               && (rd & 0x80) != (res & 0x80));
4508
          break;
4509
        case O_NEG:
4510
          v = (rd == 0x80);
4511
          break;
4512
        case O_DAA:
4513
        case O_DAS:
4514
          break;        /* No effect on v flag.  */
4515
        }
4516
      goto next;
4517
 
4518
    alu16:
4519
      if (store2 (sd, &code->dst, res))
4520
        goto end;
4521
 
4522
    just_flags_alu16:
4523
      n = res & 0x8000;
4524
      nz = res & 0xffff;
4525
      c = (res & 0x10000);
4526
      switch (code->opcode / 4)
4527
        {
4528
        case O_ADD:
4529
        case O_ADDX:
4530
          v = ((rd & 0x8000) == (ea & 0x8000)
4531
               && (rd & 0x8000) != (res & 0x8000));
4532
          break;
4533
        case O_SUB:
4534
        case O_SUBX:
4535
        case O_CMP:
4536
          v = ((rd & 0x8000) != (-ea & 0x8000)
4537
               && (rd & 0x8000) != (res & 0x8000));
4538
          break;
4539
        case O_NEG:
4540
          v = (rd == 0x8000);
4541
          break;
4542
        }
4543
      goto next;
4544
 
4545
    alu32:
4546
      if (store2 (sd, &code->dst, res))
4547
        goto end;
4548
 
4549
    just_flags_alu32:
4550
      n = res & 0x80000000;
4551
      nz = res & 0xffffffff;
4552
      switch (code->opcode / 4)
4553
        {
4554
        case O_ADD:
4555
        case O_ADDX:
4556
          v = ((rd & 0x80000000) == (ea & 0x80000000)
4557
               && (rd & 0x80000000) != (res & 0x80000000));
4558
          c = ((unsigned) res < (unsigned) rd) ||
4559
            ((unsigned) res < (unsigned) ea);
4560
          break;
4561
        case O_SUB:
4562
        case O_SUBX:
4563
        case O_CMP:
4564
          v = ((rd & 0x80000000) != (-ea & 0x80000000)
4565
               && (rd & 0x80000000) != (res & 0x80000000));
4566
          c = (unsigned) rd < (unsigned) -ea;
4567
          break;
4568
        case O_NEG:
4569
          v = (rd == 0x80000000);
4570
          c = res != 0;
4571
          break;
4572
        }
4573
      goto next;
4574
 
4575
    next:
4576
      if ((res = h8_get_delayed_branch (sd)) != 0)
4577
        {
4578
          pc = res;
4579
          h8_set_delayed_branch (sd, 0);
4580
        }
4581
      else
4582
        pc = code->next_pc;
4583
 
4584
    end:
4585
 
4586
      if (--poll_count < 0)
4587
        {
4588
          poll_count = POLL_QUIT_INTERVAL;
4589
          if ((*sim_callback->poll_quit) != NULL
4590
              && (*sim_callback->poll_quit) (sim_callback))
4591
            sim_engine_set_run_state (sd, sim_stopped, SIGINT);
4592
        }
4593
      sim_engine_get_run_state (sd, &reason, &sigrc);
4594
    } while (reason == sim_running);
4595
 
4596
  h8_set_ticks (sd, h8_get_ticks (sd) + get_now () - tick_start);
4597
  h8_set_cycles (sd, h8_get_cycles (sd) + cycles);
4598
  h8_set_insts (sd, h8_get_insts (sd) + insts);
4599
  h8_set_pc (sd, pc);
4600
  BUILDSR (sd);
4601
 
4602
  if (h8300smode)
4603
    h8_set_exr (sd, (trace<<7) | intMask);
4604
 
4605
  h8_set_mask (sd, oldmask);
4606
  signal (SIGINT, prev);
4607
}
4608
 
4609
int
4610
sim_trace (SIM_DESC sd)
4611
{
4612
  /* FIXME: Unfinished.  */
4613
  (*sim_callback->printf_filtered) (sim_callback,
4614
                                    "sim_trace: trace not supported.\n");
4615
  return 1;     /* Done.  */
4616
}
4617
 
4618
int
4619
sim_write (SIM_DESC sd, SIM_ADDR addr, unsigned char *buffer, int size)
4620
{
4621
  int i;
4622
 
4623
  init_pointers (sd);
4624
  if (addr < 0)
4625
    return 0;
4626
  for (i = 0; i < size; i++)
4627
    {
4628
      if (addr < memory_size)
4629
        {
4630
          h8_set_memory    (sd, addr + i, buffer[i]);
4631
          h8_set_cache_idx (sd, addr + i,  0);
4632
        }
4633
      else
4634
        {
4635
          h8_set_eightbit (sd, (addr + i) & 0xff, buffer[i]);
4636
        }
4637
    }
4638
  return size;
4639
}
4640
 
4641
int
4642
sim_read (SIM_DESC sd, SIM_ADDR addr, unsigned char *buffer, int size)
4643
{
4644
  init_pointers (sd);
4645
  if (addr < 0)
4646
    return 0;
4647
  if (addr < memory_size)
4648
    memcpy (buffer, h8_get_memory_buf (sd) + addr, size);
4649
  else
4650
    memcpy (buffer, h8_get_eightbit_buf (sd) + (addr & 0xff), size);
4651
  return size;
4652
}
4653
 
4654
 
4655
int
4656
sim_store_register (SIM_DESC sd, int rn, unsigned char *value, int length)
4657
{
4658
  int longval;
4659
  int shortval;
4660
  int intval;
4661
  longval = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
4662
  shortval = (value[0] << 8) | (value[1]);
4663
  intval = h8300hmode ? longval : shortval;
4664
 
4665
  init_pointers (sd);
4666
  switch (rn)
4667
    {
4668
    case PC_REGNUM:
4669
      if(h8300_normal_mode)
4670
        h8_set_pc (sd, shortval); /* PC for Normal mode is 2 bytes */
4671
      else
4672
        h8_set_pc (sd, intval);
4673
      break;
4674
    default:
4675
      (*sim_callback->printf_filtered) (sim_callback,
4676
                                        "sim_store_register: bad regnum %d.\n",
4677
                                        rn);
4678
    case R0_REGNUM:
4679
    case R1_REGNUM:
4680
    case R2_REGNUM:
4681
    case R3_REGNUM:
4682
    case R4_REGNUM:
4683
    case R5_REGNUM:
4684
    case R6_REGNUM:
4685
    case R7_REGNUM:
4686
      h8_set_reg (sd, rn, intval);
4687
      break;
4688
    case CCR_REGNUM:
4689
      h8_set_ccr (sd, intval);
4690
      break;
4691
    case EXR_REGNUM:
4692
      h8_set_exr (sd, intval);
4693
      break;
4694
    case SBR_REGNUM:
4695
      h8_set_sbr (sd, intval);
4696
      break;
4697
    case VBR_REGNUM:
4698
      h8_set_vbr (sd, intval);
4699
      break;
4700
    case MACH_REGNUM:
4701
      h8_set_mach (sd, intval);
4702
      break;
4703
    case MACL_REGNUM:
4704
      h8_set_macl (sd, intval);
4705
      break;
4706
    case CYCLE_REGNUM:
4707
      h8_set_cycles (sd, longval);
4708
      break;
4709
 
4710
    case INST_REGNUM:
4711
      h8_set_insts (sd, longval);
4712
      break;
4713
 
4714
    case TICK_REGNUM:
4715
      h8_set_ticks (sd, longval);
4716
      break;
4717
    }
4718
  return -1;
4719
}
4720
 
4721
int
4722
sim_fetch_register (SIM_DESC sd, int rn, unsigned char *buf, int length)
4723
{
4724
  int v;
4725
  int longreg = 0;
4726
 
4727
  init_pointers (sd);
4728
 
4729
  if (!h8300smode && rn >= EXR_REGNUM)
4730
    rn++;
4731
  switch (rn)
4732
    {
4733
    default:
4734
      (*sim_callback->printf_filtered) (sim_callback,
4735
                                        "sim_fetch_register: bad regnum %d.\n",
4736
                                        rn);
4737
      v = 0;
4738
      break;
4739
    case CCR_REGNUM:
4740
      v = h8_get_ccr (sd);
4741
      break;
4742
    case EXR_REGNUM:
4743
      v = h8_get_exr (sd);
4744
      break;
4745
    case PC_REGNUM:
4746
      v = h8_get_pc (sd);
4747
      break;
4748
    case SBR_REGNUM:
4749
      v = h8_get_sbr (sd);
4750
      break;
4751
    case VBR_REGNUM:
4752
      v = h8_get_vbr (sd);
4753
      break;
4754
    case MACH_REGNUM:
4755
      v = h8_get_mach (sd);
4756
      break;
4757
    case MACL_REGNUM:
4758
      v = h8_get_macl (sd);
4759
      break;
4760
    case R0_REGNUM:
4761
    case R1_REGNUM:
4762
    case R2_REGNUM:
4763
    case R3_REGNUM:
4764
    case R4_REGNUM:
4765
    case R5_REGNUM:
4766
    case R6_REGNUM:
4767
    case R7_REGNUM:
4768
      v = h8_get_reg (sd, rn);
4769
      break;
4770
    case CYCLE_REGNUM:
4771
      v = h8_get_cycles (sd);
4772
      longreg = 1;
4773
      break;
4774
    case TICK_REGNUM:
4775
      v = h8_get_ticks (sd);
4776
      longreg = 1;
4777
      break;
4778
    case INST_REGNUM:
4779
      v = h8_get_insts (sd);
4780
      longreg = 1;
4781
      break;
4782
    }
4783
  /* In Normal mode PC is 2 byte, but other registers are 4 byte */
4784
  if ((h8300hmode || longreg) && !(rn == PC_REGNUM && h8300_normal_mode))
4785
    {
4786
      buf[0] = v >> 24;
4787
      buf[1] = v >> 16;
4788
      buf[2] = v >> 8;
4789
      buf[3] = v >> 0;
4790
    }
4791
  else
4792
    {
4793
      buf[0] = v >> 8;
4794
      buf[1] = v;
4795
    }
4796
  return -1;
4797
}
4798
 
4799
void
4800
sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc)
4801
{
4802
  sim_engine_get_run_state (sd, reason, sigrc);
4803
}
4804
 
4805
/* FIXME: Rename to sim_set_mem_size.  */
4806
 
4807
void
4808
sim_size (int n)
4809
{
4810
  /* Memory size is fixed.  */
4811
}
4812
 
4813
static void
4814
set_simcache_size (SIM_DESC sd, int n)
4815
{
4816
  if (sd->sim_cache)
4817
    free (sd->sim_cache);
4818
  if (n < 2)
4819
    n = 2;
4820
  sd->sim_cache = (decoded_inst *) malloc (sizeof (decoded_inst) * n);
4821
  memset (sd->sim_cache, 0, sizeof (decoded_inst) * n);
4822
  sd->sim_cache_size = n;
4823
}
4824
 
4825
 
4826
void
4827
sim_info (SIM_DESC sd, int verbose)
4828
{
4829
  double timetaken = (double) h8_get_ticks (sd) / (double) now_persec ();
4830
  double virttime = h8_get_cycles (sd) / 10.0e6;
4831
 
4832
  (*sim_callback->printf_filtered) (sim_callback,
4833
                                    "\n\n#instructions executed  %10d\n",
4834
                                    h8_get_insts (sd));
4835
  (*sim_callback->printf_filtered) (sim_callback,
4836
                                    "#cycles (v approximate) %10d\n",
4837
                                    h8_get_cycles (sd));
4838
  (*sim_callback->printf_filtered) (sim_callback,
4839
                                    "#real time taken        %10.4f\n",
4840
                                    timetaken);
4841
  (*sim_callback->printf_filtered) (sim_callback,
4842
                                    "#virtual time taken     %10.4f\n",
4843
                                    virttime);
4844
  if (timetaken != 0.0)
4845
    (*sim_callback->printf_filtered) (sim_callback,
4846
                                      "#simulation ratio       %10.4f\n",
4847
                                      virttime / timetaken);
4848
  (*sim_callback->printf_filtered) (sim_callback,
4849
                                    "#compiles               %10d\n",
4850
                                    h8_get_compiles (sd));
4851
  (*sim_callback->printf_filtered) (sim_callback,
4852
                                    "#cache size             %10d\n",
4853
                                    sd->sim_cache_size);
4854
 
4855
#ifdef ADEBUG
4856
  /* This to be conditional on `what' (aka `verbose'),
4857
     however it was never passed as non-zero.  */
4858
  if (1)
4859
    {
4860
      int i;
4861
      for (i = 0; i < O_LAST; i++)
4862
        {
4863
          if (h8_get_stats (sd, i))
4864
            (*sim_callback->printf_filtered) (sim_callback, "%d: %d\n",
4865
                                              i, h8_get_stats (sd, i));
4866
        }
4867
    }
4868
#endif
4869
}
4870
 
4871
/* Indicate whether the cpu is an H8/300 or H8/300H.
4872
   FLAG is non-zero for the H8/300H.  */
4873
 
4874
void
4875
set_h8300h (unsigned long machine)
4876
{
4877
  /* FIXME: Much of the code in sim_load can be moved to sim_open.
4878
     This function being replaced by a sim_open:ARGV configuration
4879
     option.  */
4880
 
4881
  h8300hmode = h8300smode = h8300sxmode = h8300_normal_mode = 0;
4882
 
4883
  if (machine == bfd_mach_h8300sx || machine == bfd_mach_h8300sxn)
4884
    h8300sxmode = 1;
4885
 
4886
  if (machine == bfd_mach_h8300s || machine == bfd_mach_h8300sn || h8300sxmode)
4887
    h8300smode = 1;
4888
 
4889
  if (machine == bfd_mach_h8300h || machine == bfd_mach_h8300hn || h8300smode)
4890
    h8300hmode = 1;
4891
 
4892
  if(machine == bfd_mach_h8300hn || machine == bfd_mach_h8300sn || machine == bfd_mach_h8300sxn)
4893
    h8300_normal_mode = 1;
4894
}
4895
 
4896
/* Cover function of sim_state_free to free the cpu buffers as well.  */
4897
 
4898
static void
4899
free_state (SIM_DESC sd)
4900
{
4901
  if (STATE_MODULES (sd) != NULL)
4902
    sim_module_uninstall (sd);
4903
 
4904
  /* Fixme: free buffers in _sim_cpu.  */
4905
  sim_state_free (sd);
4906
}
4907
 
4908
SIM_DESC
4909
sim_open (SIM_OPEN_KIND kind,
4910
          struct host_callback_struct *callback,
4911
          struct bfd *abfd,
4912
          char **argv)
4913
{
4914
  SIM_DESC sd;
4915
  sim_cpu *cpu;
4916
 
4917
  sd = sim_state_alloc (kind, callback);
4918
  sd->cpu = sim_cpu_alloc (sd, 0);
4919
  cpu = STATE_CPU (sd, 0);
4920
  SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
4921
  sim_state_initialize (sd, cpu);
4922
  /* sim_cpu object is new, so some initialization is needed.  */
4923
  init_pointers_needed = 1;
4924
 
4925
  /* For compatibility (FIXME: is this right?).  */
4926
  current_alignment = NONSTRICT_ALIGNMENT;
4927
  current_target_byte_order = BIG_ENDIAN;
4928
 
4929
  if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
4930
    {
4931
      free_state (sd);
4932
      return 0;
4933
    }
4934
 
4935
    /* getopt will print the error message so we just have to exit if
4936
       this fails.  FIXME: Hmmm...  in the case of gdb we need getopt
4937
       to call print_filtered.  */
4938
  if (sim_parse_args (sd, argv) != SIM_RC_OK)
4939
    {
4940
      /* Uninstall the modules to avoid memory leaks,
4941
         file descriptor leaks, etc.  */
4942
      free_state (sd);
4943
      return 0;
4944
    }
4945
 
4946
  /* Check for/establish the a reference program image.  */
4947
  if (sim_analyze_program (sd,
4948
                           (STATE_PROG_ARGV (sd) != NULL
4949
                            ? *STATE_PROG_ARGV (sd)
4950
                            : NULL), abfd) != SIM_RC_OK)
4951
    {
4952
      free_state (sd);
4953
      return 0;
4954
    }
4955
 
4956
  /* Establish any remaining configuration options.  */
4957
  if (sim_config (sd) != SIM_RC_OK)
4958
    {
4959
      free_state (sd);
4960
      return 0;
4961
    }
4962
 
4963
  if (sim_post_argv_init (sd) != SIM_RC_OK)
4964
    {
4965
      /* Uninstall the modules to avoid memory leaks,
4966
         file descriptor leaks, etc.  */
4967
      free_state (sd);
4968
      return 0;
4969
    }
4970
 
4971
  /*  sim_hw_configure (sd); */
4972
 
4973
  /* FIXME: Much of the code in sim_load can be moved here.  */
4974
 
4975
  sim_kind = kind;
4976
  myname = argv[0];
4977
  sim_callback = callback;
4978
  return sd;
4979
}
4980
 
4981
void
4982
sim_close (SIM_DESC sd, int quitting)
4983
{
4984
  /* Nothing to do.  */
4985
}
4986
 
4987
/* Called by gdb to load a program into memory.  */
4988
 
4989
SIM_RC
4990
sim_load (SIM_DESC sd, char *prog, bfd *abfd, int from_tty)
4991
{
4992
  bfd *prog_bfd;
4993
 
4994
  /* FIXME: The code below that sets a specific variant of the H8/300
4995
     being simulated should be moved to sim_open().  */
4996
 
4997
  /* See if the file is for the H8/300 or H8/300H.  */
4998
  /* ??? This may not be the most efficient way.  The z8k simulator
4999
     does this via a different mechanism (INIT_EXTRA_SYMTAB_INFO).  */
5000
  if (abfd != NULL)
5001
    prog_bfd = abfd;
5002
  else
5003
    prog_bfd = bfd_openr (prog, NULL);
5004
  if (prog_bfd != NULL)
5005
    {
5006
      /* Set the cpu type.  We ignore failure from bfd_check_format
5007
         and bfd_openr as sim_load_file checks too.  */
5008
      if (bfd_check_format (prog_bfd, bfd_object))
5009
        {
5010
          set_h8300h (bfd_get_mach (prog_bfd));
5011
        }
5012
    }
5013
 
5014
  /* If we're using gdb attached to the simulator, then we have to
5015
     reallocate memory for the simulator.
5016
 
5017
     When gdb first starts, it calls fetch_registers (among other
5018
     functions), which in turn calls init_pointers, which allocates
5019
     simulator memory.
5020
 
5021
     The problem is when we do that, we don't know whether we're
5022
     debugging an H8/300 or H8/300H program.
5023
 
5024
     This is the first point at which we can make that determination,
5025
     so we just reallocate memory now; this will also allow us to handle
5026
     switching between H8/300 and H8/300H programs without exiting
5027
     gdb.  */
5028
 
5029
  if (h8300smode && !h8300_normal_mode)
5030
    memory_size = H8300S_MSIZE;
5031
  else if (h8300hmode && !h8300_normal_mode)
5032
    memory_size = H8300H_MSIZE;
5033
  else
5034
    memory_size = H8300_MSIZE;
5035
 
5036
  if (h8_get_memory_buf (sd))
5037
    free (h8_get_memory_buf (sd));
5038
  if (h8_get_cache_idx_buf (sd))
5039
    free (h8_get_cache_idx_buf (sd));
5040
  if (h8_get_eightbit_buf (sd))
5041
    free (h8_get_eightbit_buf (sd));
5042
 
5043
  h8_set_memory_buf (sd, (unsigned char *)
5044
                     calloc (sizeof (char), memory_size));
5045
  h8_set_cache_idx_buf (sd, (unsigned short *)
5046
                        calloc (sizeof (short), memory_size));
5047
  sd->memory_size = memory_size;
5048
  h8_set_eightbit_buf (sd, (unsigned char *) calloc (sizeof (char), 256));
5049
 
5050
  /* `msize' must be a power of two.  */
5051
  if ((memory_size & (memory_size - 1)) != 0)
5052
    {
5053
      (*sim_callback->printf_filtered) (sim_callback,
5054
                                        "sim_load: bad memory size.\n");
5055
      return SIM_RC_FAIL;
5056
    }
5057
  h8_set_mask (sd, memory_size - 1);
5058
 
5059
  if (sim_load_file (sd, myname, sim_callback, prog, prog_bfd,
5060
                     sim_kind == SIM_OPEN_DEBUG,
5061
                     0, sim_write)
5062
      == NULL)
5063
    {
5064
      /* Close the bfd if we opened it.  */
5065
      if (abfd == NULL && prog_bfd != NULL)
5066
        bfd_close (prog_bfd);
5067
      return SIM_RC_FAIL;
5068
    }
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_OK;
5074
}
5075
 
5076
SIM_RC
5077
sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **env)
5078
{
5079
  int i = 0;
5080
  int len_arg = 0;
5081
  int no_of_args = 0;
5082
 
5083
  if (abfd != NULL)
5084
    h8_set_pc (sd, bfd_get_start_address (abfd));
5085
  else
5086
    h8_set_pc (sd, 0);
5087
 
5088
  /* Command Line support.  */
5089
  if (argv != NULL)
5090
    {
5091
      /* Counting the no. of commandline arguments.  */
5092
      for (no_of_args = 0; argv[no_of_args] != NULL; no_of_args++)
5093
        continue;
5094
 
5095
      /* Allocating memory for the argv pointers.  */
5096
      h8_set_command_line (sd, (char **) malloc ((sizeof (char *))
5097
                                                 * (no_of_args + 1)));
5098
 
5099
      for (i = 0; i < no_of_args; i++)
5100
        {
5101
          /* Copying the argument string.  */
5102
          h8_set_cmdline_arg (sd, i, (char *) strdup (argv[i]));
5103
        }
5104
      h8_set_cmdline_arg (sd, i, NULL);
5105
    }
5106
 
5107
  return SIM_RC_OK;
5108
}
5109
 
5110
void
5111
sim_do_command (SIM_DESC sd, char *cmd)
5112
{
5113
  (*sim_callback->printf_filtered) (sim_callback,
5114
                                    "This simulator does not accept any commands.\n");
5115
}
5116
 
5117
void
5118
sim_set_callbacks (struct host_callback_struct *ptr)
5119
{
5120
  sim_callback = ptr;
5121
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.