X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Fsim.src%2Fsim.cc;h=248ca31106598cec083e1d9807af9c977cd7f87b;hb=90f4aedaef8a2310573eef905f95c671f84e5cde;hp=982532984692b7ff660bec537436af8e7d9f531f;hpb=6ba6105dc5975c3b0cc0d1ce53f47a1ddf4be9cf;p=fw%2Fsdcc diff --git a/sim/ucsim/sim.src/sim.cc b/sim/ucsim/sim.src/sim.cc index 98253298..248ca311 100644 --- a/sim/ucsim/sim.src/sim.cc +++ b/sim/ucsim/sim.src/sim.cc @@ -2,7 +2,7 @@ * Simulator of microcontrollers (sim.cc) * * Copyright (C) 1999,99 Drotos Daniel, Talker Bt. - * + * * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu * */ @@ -56,6 +56,10 @@ cl_sim::cl_sim(class cl_app *the_app): //arguments= new cl_list(2, 2); //accept_args= more_args?strdup(more_args):0; gui= new cl_gui(this); + + state = SIM_QUIT; + argc = 0; + argv = 0; } int @@ -92,21 +96,21 @@ cl_sim::main(void) int done= 0; while (!done && - (state & SIM_QUIT) == 0) + (state & SIM_QUIT) == 0) { if (state & SIM_GO) - { - uc->do_inst(-1); - if (app->get_commander()->input_avail()) - { - done= app->get_commander()->proc_input(); - } - } + { + uc->do_inst(-1); + if (app->get_commander()->input_avail()) + { + done= app->get_commander()->proc_input(); + } + } else - { - app->get_commander()->wait_input(); - done= app->get_commander()->proc_input(); - } + { + app->get_commander()->wait_input(); + done= app->get_commander()->proc_input(); + } } return(0); } @@ -120,7 +124,7 @@ cl_sim::step(void) } /*int -cl_sim::do_cmd(char *cmdstr, class cl_console *console) +cl_sim::do_cmd(char *cmdstr, class cl_console_base *console) { class cl_cmdline *cmdline; class cl_cmd *cm; @@ -138,7 +142,7 @@ cl_sim::do_cmd(char *cmdstr, class cl_console *console) }*/ void -cl_sim::start(class cl_console *con) +cl_sim::start(class cl_console_base *con) { state|= SIM_GO; con->flags|= CONS_FROZEN; @@ -149,47 +153,55 @@ cl_sim::start(class cl_console *con) void cl_sim::stop(int reason) { - class cl_commander *cmd= app->get_commander(); + class cl_commander_base *cmd= app->get_commander(); state&= ~SIM_GO; if (cmd->frozen_console) { if (reason == resUSER && - cmd->frozen_console->input_avail()) - cmd->frozen_console->read_line(); - cmd->frozen_console->printf("Stop at 0x%06x: (%d) ", uc->PC, reason); + cmd->frozen_console->input_avail()) + cmd->frozen_console->read_line(); + cmd->frozen_console->dd_printf("Stop at 0x%06x: (%d) ", uc->PC, reason); switch (reason) - { - case resHALT: - cmd->frozen_console->printf("Halted\n"); - break; - case resINV_ADDR: - cmd->frozen_console->printf("Invalid address\n"); - break; - case resSTACK_OV: - cmd->frozen_console->printf("Stack overflow\n"); - break; - case resBREAKPOINT: - cmd->frozen_console->printf("Breakpoint\n"); - break; - case resINTERRUPT: - cmd->frozen_console->printf("Interrupt\n"); - break; - case resWDTRESET: - cmd->frozen_console->printf("Watchdog reset\n"); - break; - case resUSER: - cmd->frozen_console->printf("User stopped\n"); - break; - case resINV_INST: - cmd->frozen_console->printf("Invalid instruction 0x%04x\n", - uc->get_mem(MEM_ROM, uc->PC)); - break; - default: - cmd->frozen_console->printf("Unknown reason\n"); - break; - } - cmd->frozen_console->printf("F 0x%06x\n", uc->PC); // for sdcdb + { + case resHALT: + cmd->frozen_console->dd_printf("Halted\n"); + break; + case resINV_ADDR: + cmd->frozen_console->dd_printf("Invalid address\n"); + break; + case resSTACK_OV: + cmd->frozen_console->dd_printf("Stack overflow\n"); + break; + case resBREAKPOINT: + cmd->frozen_console->dd_printf("Breakpoint\n"); + uc->print_regs(cmd->frozen_console); + break; + case resINTERRUPT: + cmd->frozen_console->dd_printf("Interrupt\n"); + break; + case resWDTRESET: + cmd->frozen_console->dd_printf("Watchdog reset\n"); + break; + case resUSER: + cmd->frozen_console->dd_printf("User stopped\n"); + break; + case resINV_INST: + { + cmd->frozen_console->dd_printf("Invalid instruction"); + if (uc->rom) + cmd->frozen_console->dd_printf(" 0x%04x\n", + uc->rom->get(uc->PC)); + } + break; + case resERROR: + // uc::check_error prints error messages... + break; + default: + cmd->frozen_console->dd_printf("Unknown reason\n"); + break; + } + cmd->frozen_console->dd_printf("F 0x%06x\n", uc->PC); // for sdcdb //if (cmd->actual_console != cmd->frozen_console) cmd->frozen_console->flags&= ~CONS_FROZEN; cmd->frozen_console->print_prompt(); @@ -198,6 +210,31 @@ cl_sim::stop(int reason) cmd->set_fd_set(); } +void +cl_sim::stop(class cl_ev_brk *brk) +{ + class cl_commander_base *cmd= app->get_commander(); + + state&= ~SIM_GO; + if (cmd->frozen_console) + { + class cl_console_base *con= cmd->frozen_console; + /* + if (reason == resUSER && + cmd->frozen_console->input_avail()) + cmd->frozen_console->read_line(); + */ + //con->dd_printf("Stop at 0x%06x\n", uc->PC); + con->dd_printf("Event `%s' at %s[0x%"_A_"x]: 0x%"_A_"x %s\n", + brk->id, brk->get_mem()->get_name(), brk->addr, + uc->instPC, + uc->disass(uc->instPC, " ")); + //con->flags&= ~CONS_FROZEN; + //con->print_prompt(); + //cmd->frozen_console= 0; + } +} + /* */ @@ -220,13 +257,13 @@ cl_sim::build_cmdset(class cl_cmdset *cmdset) "long help of stop")); cmd->init(); - cmdset->add(cmd= new cl_step_cmd("step", 0, + cmdset->add(cmd= new cl_step_cmd("step", DD_TRUE, "step Step", "long help of step")); cmd->init(); cmd->add_name("s"); - cmdset->add(cmd= new cl_next_cmd("next", 0, + cmdset->add(cmd= new cl_next_cmd("next", DD_TRUE, "next Next", "long help of next")); cmd->init(); @@ -235,11 +272,11 @@ cl_sim::build_cmdset(class cl_cmdset *cmdset) { cset= new cl_cmdset(); cset->init(); - cset->add(cmd= new cl_gui_start_cmd("start", 0, + cset->add(cmd= new cl_gui_start_cmd("start", 0, "gui start Start interfacing with GUI tool", "long help of gui start")); cmd->init(); - cset->add(cmd= new cl_gui_stop_cmd("stop", 0, + cset->add(cmd= new cl_gui_stop_cmd("stop", 0, "gui stop Stop interfacing with GUI tool", "long help of gui stop")); cmd->init(); @@ -251,4 +288,18 @@ cl_sim::build_cmdset(class cl_cmdset *cmdset) } +/* + * Messages to broadcast + */ +/* +void +cl_sim::mem_cell_changed(class cl_address_space *mem, t_addr addr) +{ + if (uc) + uc->mem_cell_changed(mem, addr); + else + printf("JAJ sim\n"); +} +*/ + /* End of sim.src/sim.cc */