void handle_step (int rc) { if (RL78_STEPPED (rc) || RL78_HIT_BREAK (rc)) { reason = sim_stopped; siggnal = GDB_SIGNAL_TRAP; } else if (RL78_STOPPED (rc)) { reason = sim_stopped; siggnal = rl78_signal_to_target (RL78_STOP_SIG (rc)); } else { assert (RL78_EXITED (rc)); reason = sim_exited; siggnal = RL78_EXIT_STATUS (rc); } }
int main (int argc, char **argv) { int o; int save_trace; bfd *prog; int rc; xmalloc_set_program_name (argv[0]); while ((o = getopt (argc, argv, "tvdr:D:")) != -1) { switch (o) { case 't': trace ++; break; case 'v': verbose ++; break; case 'd': disassemble ++; break; case 'r': mem_ram_size (atoi (optarg)); break; case 'D': dump_counts_filename = optarg; break; case '?': { fprintf (stderr, "usage: run [options] program [arguments]\n"); fprintf (stderr, "\t-v\t\t- increase verbosity.\n" "\t-t\t\t- trace.\n" "\t-d\t\t- disassemble.\n" "\t-r <bytes>\t- ram size.\n" "\t-D <filename>\t- dump cycle count histogram\n"); exit (1); } } } prog = bfd_openr (argv[optind], 0); if (!prog) { fprintf (stderr, "Can't read %s\n", argv[optind]); exit (1); } if (!bfd_check_format (prog, bfd_object)) { fprintf (stderr, "%s not a rl78 program\n", argv[optind]); exit (1); } init_cpu (); rl78_in_gdb = 0; save_trace = trace; trace = 0; rl78_load (prog, 0, argv[0]); trace = save_trace; sim_disasm_init (prog); rc = setjmp (decode_jmp_buf); if (rc == 0) { if (!trace && !disassemble) { /* This will longjmp to the above if an exception happens. */ for (;;) decode_opcode (); } else while (1) { if (trace) printf ("\n"); if (disassemble) sim_disasm_one (); rc = decode_opcode (); if (trace) trace_register_changes (); } } if (RL78_HIT_BREAK (rc)) done (1); else if (RL78_EXITED (rc)) done (RL78_EXIT_STATUS (rc)); else if (RL78_STOPPED (rc)) { if (verbose) printf ("Stopped on signal %d\n", RL78_STOP_SIG (rc)); exit (1); } done (0); exit (0); }