2 * Simulator of microcontrollers (sim.cc)
4 * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
6 * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
10 /* This file is part of microcontroller simulator: ucsim.
12 UCSIM is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 UCSIM is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with UCSIM; see the file COPYING. If not, write to the Free
24 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
51 cl_sim::cl_sim(class cl_app *the_app):
56 //arguments= new cl_list(2, 2);
57 //accept_args= more_args?strdup(more_args):0;
58 gui= new cl_gui(this);
69 build_cmdset(app->get_commander()->cmdset);
70 if (!(uc= mk_controller()))
83 cl_sim::mk_controller(void)
85 return(new cl_uc(this));
90 * Main cycle of the simulator
99 (state & SIM_QUIT) == 0)
104 if (app->get_commander()->input_avail())
106 done= app->get_commander()->proc_input();
111 app->get_commander()->wait_input();
112 done= app->get_commander()->proc_input();
127 cl_sim::do_cmd(char *cmdstr, class cl_console_base *console)
129 class cl_cmdline *cmdline;
133 cmdline= new cl_cmdline(cmdstr, console);
135 cm= cmd->cmdset->get_cmd(cmdline);
137 retval= cm->work(cmdline, console);
141 return(console->interpret(cmdstr));
145 cl_sim::start(class cl_console_base *con)
148 con->flags|= CONS_FROZEN;
149 app->get_commander()->frozen_console= con;
150 app->get_commander()->set_fd_set();
154 cl_sim::stop(int reason)
156 class cl_commander_base *cmd= app->get_commander();
159 if (cmd->frozen_console)
161 if (reason == resUSER &&
162 cmd->frozen_console->input_avail())
163 cmd->frozen_console->read_line();
164 cmd->frozen_console->dd_printf("Stop at 0x%06x: (%d) ", uc->PC, reason);
168 cmd->frozen_console->dd_printf("Halted\n");
171 cmd->frozen_console->dd_printf("Invalid address\n");
174 cmd->frozen_console->dd_printf("Stack overflow\n");
177 cmd->frozen_console->dd_printf("Breakpoint\n");
178 uc->print_regs(cmd->frozen_console);
181 cmd->frozen_console->dd_printf("Interrupt\n");
184 cmd->frozen_console->dd_printf("Watchdog reset\n");
187 cmd->frozen_console->dd_printf("User stopped\n");
191 cmd->frozen_console->dd_printf("Invalid instruction");
193 cmd->frozen_console->dd_printf(" 0x%04x\n",
194 uc->rom->get(uc->PC));
198 // uc::check_error prints error messages...
201 cmd->frozen_console->dd_printf("Unknown reason\n");
204 cmd->frozen_console->dd_printf("F 0x%06x\n", uc->PC); // for sdcdb
205 //if (cmd->actual_console != cmd->frozen_console)
206 cmd->frozen_console->flags&= ~CONS_FROZEN;
207 cmd->frozen_console->print_prompt();
208 cmd->frozen_console= 0;
214 cl_sim::stop(class cl_ev_brk *brk)
216 class cl_commander_base *cmd= app->get_commander();
219 if (cmd->frozen_console)
221 class cl_console_base *con= cmd->frozen_console;
223 if (reason == resUSER &&
224 cmd->frozen_console->input_avail())
225 cmd->frozen_console->read_line();
227 //con->dd_printf("Stop at 0x%06x\n", uc->PC);
228 con->dd_printf("Event `%s' at %s[0x%"_A_"x]: 0x%"_A_"x %s\n",
229 brk->id, brk->get_mem()->get_name(), brk->addr,
231 uc->disass(uc->instPC, " "));
232 //con->flags&= ~CONS_FROZEN;
233 //con->print_prompt();
234 //cmd->frozen_console= 0;
243 cl_sim::build_cmdset(class cl_cmdset *cmdset)
246 class cl_cmdset *cset;
248 cmdset->add(cmd= new cl_run_cmd("run", 0,
249 "run [start [stop]] Go",
250 "long help of run"));
255 cmdset->add(cmd= new cl_stop_cmd("stop", 0,
257 "long help of stop"));
260 cmdset->add(cmd= new cl_step_cmd("step", DD_TRUE,
262 "long help of step"));
266 cmdset->add(cmd= new cl_next_cmd("next", DD_TRUE,
268 "long help of next"));
273 cset= new cl_cmdset();
275 cset->add(cmd= new cl_gui_start_cmd("start", 0,
276 "gui start Start interfacing with GUI tool",
277 "long help of gui start"));
279 cset->add(cmd= new cl_gui_stop_cmd("stop", 0,
280 "gui stop Stop interfacing with GUI tool",
281 "long help of gui stop"));
284 cmdset->add(cmd= new cl_super_cmd("gui", 0,
285 "gui subcommand Operations to support GUI tools",
286 "long help of gui", cset));
292 * Messages to broadcast
296 cl_sim::mem_cell_changed(class cl_address_space *mem, t_addr addr)
299 uc->mem_cell_changed(mem, addr);
305 /* End of sim.src/sim.cc */