2 * Simulator of microcontrollers (cmd.src/cmdset.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
45 *----------------------------------------------------------------------------
49 cl_state_cmd::do_work(class cl_sim *sim,
50 class cl_cmdline *cmdline, class cl_console *con)
52 //con->printf("sim state= %d\n", sim->state);
53 con->printf("CPU state= %s PC= 0x%06x XTAL= %g\n",
54 get_id_string(cpu_states, sim->uc->state),
57 con->printf("Total time since last reset= %g sec (%lu clks)\n",
58 sim->uc->get_rtime(), sim->uc->ticks->ticks);
59 con->printf("Time in isr = %g sec (%lu clks) %3.2g%%\n",
60 sim->uc->isr_ticks->get_rtime(sim->uc->xtal),
61 sim->uc->isr_ticks->ticks,
62 (sim->uc->ticks->ticks == 0)?0.0:
63 (100.0*((double)(sim->uc->isr_ticks->ticks)/
64 (double)(sim->uc->ticks->ticks))));
65 con->printf("Time in idle= %g sec (%lu clks) %3.2g%%\n",
66 sim->uc->idle_ticks->get_rtime(sim->uc->xtal),
67 sim->uc->idle_ticks->ticks,
68 (sim->uc->ticks->ticks == 0)?0.0:
69 (100.0*((double)(sim->uc->idle_ticks->ticks)/
70 (double)(sim->uc->ticks->ticks))));
71 con->printf("Max value of stack pointer= 0x%06x, avg= 0x%06x\n",
72 sim->uc->sp_max, sim->uc->sp_avg);
79 *----------------------------------------------------------------------------
83 cl_file_cmd::do_work(class cl_sim *sim,
84 class cl_cmdline *cmdline, class cl_console *con)
89 if ((cmdline->param(0) == 0) ||
90 ((fname= cmdline->param(0)->get_svalue()) == NULL))
92 con->printf("File name is missing.\n");
95 if ((l= sim->uc->read_hex_file(fname)) >= 0)
96 con->printf("%ld words read from %s\n", l, fname);
104 *----------------------------------------------------------------------------
108 cl_dl_cmd::do_work(class cl_sim *sim,
109 class cl_cmdline *cmdline, class cl_console *con)
113 if ((l= sim->uc->read_hex_file(NULL)) >= 0)
114 con->printf("%ld words loaded\n", l);
122 *----------------------------------------------------------------------------
126 cl_run_cmd::do_work(class cl_sim *sim,
127 class cl_cmdline *cmdline, class cl_console *con)
131 class cl_cmd_arg *params[4]= { cmdline->param(0),
137 if (!(params[0]->get_address(&start)))
139 con->printf("Error: wrong start address\n");
143 if (!(params[1]->get_address(&end)))
145 con->printf("Error: wromg end address\n");
150 if (!sim->uc->inst_at(start))
151 con->printf("Warning: maybe not instruction at 0x%06lx\n", start);
157 con->printf("Addresses must be different.\n");
160 if ((b= sim->uc->fbrk_at(end)))
165 b= new cl_fetch_brk(sim->uc->make_new_brknr(), end,
167 sim->uc->fbrk->add_bp(b);
171 con->printf("Simulation started, PC=0x%06x\n", sim->uc->PC);
172 if (sim->uc->fbrk_at(start))
181 *----------------------------------------------------------------------------
185 cl_stop_cmd::do_work(class cl_sim *sim,
186 class cl_cmdline *cmdline, class cl_console *con)
189 sim->uc->print_disass(sim->uc->PC, con);
196 *----------------------------------------------------------------------------
200 cl_step_cmd::do_work(class cl_sim *sim,
201 class cl_cmdline *cmdline, class cl_console *con)
204 sim->uc->print_regs(con);
211 *----------------------------------------------------------------------------
215 cl_next_cmd::do_work(class cl_sim *sim,
216 class cl_cmdline *cmdline, class cl_console *con)
220 struct dis_entry *de;
222 t_mem code= sim->uc->get_mem(MEM_ROM, sim->uc->PC);
224 de= &(sim->uc->dis_tbl()[i]);
225 while ((code & de->mask) != de->code &&
229 de= &(sim->uc->dis_tbl()[i]);
231 if ((de->branch == 'a') ||
234 next= sim->uc->PC + de->length;
235 if (!sim->uc->fbrk_at(next))
237 b= new cl_fetch_brk(sim->uc->make_new_brknr(),
238 next, brkDYNAMIC, 1);
239 sim->uc->fbrk->add(b);
242 //sim->uc->do_inst(-1);
246 sim->uc->print_regs(con);
253 *----------------------------------------------------------------------------
257 cl_pc_cmd::do_work(class cl_sim *sim,
258 class cl_cmdline *cmdline, class cl_console *con)
261 class cl_cmd_arg *params[1]= { cmdline->param(0) };
265 if (!(params[0]->get_address(&addr)))
267 con->printf("Error: wrong parameter\n");
270 if (addr >= sim->uc->get_mem_size(MEM_ROM))
272 if (!sim->uc->inst_at(addr))
273 con->printf("Warning: maybe not instruction at 0x%06x\n", addr);
276 sim->uc->print_disass(sim->uc->PC, con);
283 *----------------------------------------------------------------------------
287 cl_reset_cmd::do_work(class cl_sim *sim,
288 class cl_cmdline *cmdline, class cl_console *con)
297 *----------------------------------------------------------------------------
301 cl_dump_cmd::do_work(class cl_sim *sim,
302 class cl_cmdline *cmdline, class cl_console *con)
304 class cl_mem *mem= 0;
306 t_addr start= 0, end;
307 class cl_cmd_arg *params[4]= { cmdline->param(0),
313 params[0]->as_bit(sim->uc))
317 params[0]->as_bit(sim->uc))
320 mem= params[0]->value.bit.mem;
321 m= mem->read(params[0]->value.bit.mem_address);
323 sim->uc->symbolic_bit_name((t_addr)-1,
325 params[0]->value.bit.mem_address,
326 params[0]->value.bit.mask);
327 con->printf("%10s ", sn?sn:"");
328 con->printf(mem->addr_format, params[0]->value.bit.mem_address);
330 con->printf(mem->data_format, m);
331 con->printf(" %c\n", (m&(params[0]->value.bit.mask))?'1':'0');
333 params[0]= cmdline->param(i);
336 con->printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
338 else if (cmdline->syntax_match(sim, MEMORY))
340 mem= params[0]->value.memory;
343 else if (cmdline->syntax_match(sim, MEMORY ADDRESS)) {
344 mem = params[0]->value.memory;
345 start= params[1]->value.address;
347 mem->dump(start, end, bpl, con);
349 else if (cmdline->syntax_match(sim, MEMORY ADDRESS ADDRESS)) {
350 mem = params[0]->value.memory;
351 start= params[1]->value.address;
352 end = params[2]->value.address;
353 mem->dump(start, end, bpl, con);
355 else if (cmdline->syntax_match(sim, MEMORY ADDRESS ADDRESS NUMBER)) {
356 mem = params[0]->value.memory;
357 start= params[1]->value.address;
358 end = params[2]->value.address;
359 bpl = params[3]->value.number;
360 mem->dump(start, end, bpl, con);
363 con->printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
371 *----------------------------------------------------------------------------
375 cl_di_cmd::do_work(class cl_sim *sim,
376 class cl_cmdline *cmdline, class cl_console *con)
378 cmdline->insert_param(0, new cl_cmd_sym_arg(sim->uc, "i"));
379 cl_dump_cmd::do_work(sim, cmdline, con);
386 *----------------------------------------------------------------------------
390 cl_dx_cmd::do_work(class cl_sim *sim,
391 class cl_cmdline *cmdline, class cl_console *con)
393 cmdline->insert_param(0, new cl_cmd_sym_arg(sim->uc, "x"));
394 cl_dump_cmd::do_work(sim, cmdline, con);
401 *----------------------------------------------------------------------------
405 cl_dch_cmd::do_work(class cl_sim *sim,
406 class cl_cmdline *cmdline, class cl_console *con)
408 cmdline->insert_param(0, new cl_cmd_sym_arg(sim->uc, "r"));
409 cl_dump_cmd::do_work(sim, cmdline, con);
416 *----------------------------------------------------------------------------
420 cl_ds_cmd::do_work(class cl_sim *sim,
421 class cl_cmdline *cmdline, class cl_console *con)
423 cmdline->insert_param(0, new cl_cmd_sym_arg(sim->uc, "s"));
424 cl_dump_cmd::do_work(sim, cmdline, con);
431 *----------------------------------------------------------------------------
435 cl_dc_cmd::do_work(class cl_sim *sim,
436 class cl_cmdline *cmdline, class cl_console *con)
438 t_addr start= last, end= last+20;
439 class cl_cmd_arg *params[2]= { cmdline->param(0),
441 class cl_mem *rom= sim->uc->mem(MEM_ROM);
447 else if (cmdline->syntax_match(sim, ADDRESS)) {
448 start= params[0]->value.address;
451 else if (cmdline->syntax_match(sim, ADDRESS ADDRESS)) {
452 start= params[0]->value.address;
453 end= params[1]->value.address;
455 if (start >= rom->size)
457 con->printf("Error: start address is wrong\n");
460 if (end >= rom->size)
462 con->printf("Error: end address is wrong\n");
468 start+= sim->uc->inst_length(rom->get(start)))
469 sim->uc->print_disass(start, con);
476 * Command: disassemble
477 *----------------------------------------------------------------------------
480 static int disass_last_stop= 0;
483 cl_disassemble_cmd::do_work(class cl_sim *sim,
484 class cl_cmdline *cmdline, class cl_console *con)
486 t_addr start, realstart;
487 int offset= -1, dir, lines= 20;
488 class cl_cmd_arg *params[4]= { cmdline->param(0),
493 start= disass_last_stop;
494 if (params[0] == 0) ;
495 else if (cmdline->syntax_match(sim, ADDRESS)) {
496 start= params[0]->value.address;
498 else if (cmdline->syntax_match(sim, ADDRESS NUMBER)) {
499 start= params[0]->value.address;
500 offset= params[1]->value.number;
502 else if (cmdline->syntax_match(sim, ADDRESS NUMBER NUMBER)) {
503 start= params[0]->value.address;
504 offset= params[1]->value.number;
505 lines= params[2]->value.number;
509 con->printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
515 con->printf("Error: wrong `lines' parameter\n");
518 if (!sim->uc->there_is_inst())
521 class cl_mem *rom= sim->uc->mem(MEM_ROM);
524 while (realstart < rom->size &&
525 !sim->uc->inst_at(realstart))
526 realstart= realstart+1;
529 dir= (offset < 0)?-1:+1;
532 realstart= (realstart+dir) % rom->size;
533 while (!sim->uc->inst_at(realstart))
534 realstart= (realstart+dir) % rom->size;
541 sim->uc->print_disass(realstart, sim->cmd->actual_console);
542 realstart= (realstart+1) % rom->size;
543 while (!sim->uc->inst_at(realstart))
544 realstart= (realstart+1) % rom->size;
548 disass_last_stop= realstart;
556 *----------------------------------------------------------------------------
560 cl_fill_cmd::do_work(class cl_sim *sim,
561 class cl_cmdline *cmdline, class cl_console *con)
563 class cl_mem *mem= 0;
565 t_addr start= 0, end;
566 class cl_cmd_arg *params[4]= { cmdline->param(0),
571 if (cmdline->syntax_match(sim, MEMORY ADDRESS ADDRESS NUMBER)) {
572 mem = params[0]->value.memory;
573 start= params[1]->value.address;
574 end = params[2]->value.address;
575 what = params[3]->value.number;
577 for (i= start; i <= end; i++)
585 con->printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
593 *----------------------------------------------------------------------------
597 cl_where_cmd::do_real_work(class cl_sim *sim,
598 class cl_cmdline *cmdline, class cl_console *con,
601 class cl_mem *mem= 0;
602 class cl_cmd_arg *params[2]= { cmdline->param(0),
605 if (cmdline->syntax_match(sim, MEMORY DATALIST)) {
606 mem= params[0]->value.memory;
607 t_mem *array= params[1]->value.data_list.array;
608 int len= params[1]->value.data_list.len;
611 con->printf("Error: nothing to search for\n");
615 bool found= mem->search_next(case_sensitive, array, len, &addr);
618 mem->dump(addr, addr+len-1, 8, con);
620 found= mem->search_next(case_sensitive, array, len, &addr);
624 con->printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
630 cl_where_cmd::do_work(class cl_sim *sim,
631 class cl_cmdline *cmdline, class cl_console *con)
633 return(do_real_work(sim, cmdline, con, DD_FALSE));
637 cl_Where_cmd::do_work(class cl_sim *sim,
638 class cl_cmdline *cmdline, class cl_console *con)
640 return(do_real_work(sim, cmdline, con, DD_TRUE));
646 *----------------------------------------------------------------------------
650 cl_help_cmd::do_work(class cl_sim *sim,
651 class cl_cmdline *cmdline, class cl_console *con)
655 class cl_cmd_arg *parm= cmdline->param(0);
658 for (i= 0; i < sim->cmd->cmdset->count; i++)
660 c= (class cl_cmd *)(sim->cmd->cmdset->at(i));
662 con->printf("%s\n", c->short_help);
664 con->printf("%s\n", (char*)(c->names->at(0)));
667 else if (cmdline->syntax_match(sim, STRING)) {
669 for (i= 0; i < sim->cmd->cmdset->count; i++)
671 c= (class cl_cmd *)(sim->cmd->cmdset->at(i));
672 if (c->name_match(parm->value.string.string, DD_FALSE))
676 con->printf("No such command\n");
677 else if (matches > 1)
678 for (i= 0; i < sim->cmd->cmdset->count; i++)
680 c= (class cl_cmd *)(sim->cmd->cmdset->at(i));
681 if (!c->name_match(parm->value.string.string, DD_FALSE))
684 con->printf("%s\n", c->short_help);
686 con->printf("%s\n", (char*)(c->names->at(0)));
689 for (i= 0; i < sim->cmd->cmdset->count; i++)
691 c= (class cl_cmd *)(sim->cmd->cmdset->at(i));
692 if (!c->name_match(parm->value.string.string, DD_FALSE))
695 con->printf("%s\n", c->short_help);
697 con->printf("%s\n", (char*)(c->names->at(0)));
699 con->printf("Names of command:");
700 for (names= 0; names < c->names->count; names++)
701 con->printf(" %s", (char*)(c->names->at(names)));
704 con->printf("%s\n", c->long_help);
706 con->printf("%s\n", (char*)(c->names->at(0)));
710 con->printf("%s\n", short_help?short_help:"Error: wrong syntax");
718 *----------------------------------------------------------------------------
722 cl_quit_cmd::do_work(class cl_sim *sim,
723 class cl_cmdline */*cmdline*/, class cl_console */*con*/)
731 *----------------------------------------------------------------------------
735 cl_kill_cmd::do_work(class cl_sim *sim,
736 class cl_cmdline */*cmdline*/, class cl_console */*con*/)
738 sim->state|= SIM_QUIT;
743 /* End of cmd.src/cmdset.cc */