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} 5036