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