+2008-06-12 Borut Razem <borut.razem AT siol.net>
+
+ * sim/ucsim/cmd.src/info.cc, sim/ucsim/cmd.src/bp.cc,
+ sim/ucsim/xa.src/xa.cc, sim/ucsim/xa.src/xacl.h,
+ sim/ucsim/z80.src/z80cl.h, sim/ucsim/z80.src/z80.cc,
+ sim/ucsim/sim.src/uc.cc, sim/ucsim/sim.src/uccl.h,
+ sim/ucsim/hc08.src/hc08.cc, sim/ucsim/hc08.src/hc08cl.h,
+ sim/ucsim/s51.src/uc51cl.h, sim/ucsim/s51.src/uc390.cc,
+ sim/ucsim/s51.src/uc51.cc, sim/ucsim/s51.src/uc390cl.h,
+ sim/ucsim/avr.src/avrcl.h, sim/ucsim/avr.src/avr.cc:
+ fixed bug 1990586: s51 simulator, uc::disass() unimplemented
+ by applying the modified patch from Risto Huotari
+
2008-06-04 Maarten Brock <sourceforge.brock AT dse.nl>
* .version,
* Simulator of microcontrollers (avr.cc)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
return(0);
}
-char *
-cl_avr::disass(t_addr addr, char *sep)
+const char *
+cl_avr::disass(t_addr addr, const char *sep)
{
char work[256], temp[20];
const char *b;
int i;
p= work;
-
+
code= get_mem(MEM_ROM_ID, addr);
i= 0;
while ((code & dis_tbl()[i].mask) != dis_tbl()[i].code &&
{
t_addr sp;
t_mem spl, sph;
-
+
spl= ram->read(SPL);
sph= ram->read(SPH);
sp= 0xffff & (256*sph + spl);
{
t_addr sp;
t_mem spl, sph, al, ah;
-
+
spl= ram->read(SPL);
sph= ram->read(SPH);
sp= 0xffff & (256*sph + spl);
sph= (sp>>8) & 0xff;
ram->write(SPL, spl);
ram->write(SPH, sph);
-
+
return(resGO);
}
* Simulator of microcontrollers (avrcl.h)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
virtual struct dis_entry *dis_tbl(void);
virtual struct name_entry *sfr_tbl(void);
virtual struct name_entry *bit_tbl(void);
- virtual char *disass(t_addr addr, char *sep);
+ virtual const char *disass(t_addr addr, const char *sep);
virtual void print_regs(class cl_console_base *con);
virtual int exec_inst(void);
* Simulator of microcontrollers (cmd.src/bp.cc)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
addr, perm, hit);
b->init();
uc->fbrk->add_bp(b);
- char *s= uc->disass(addr, NULL);
+ const char *s= uc->disass(addr, NULL);
con->dd_printf("Breakpoint %d at 0x%06x: %s\n", b->nr, addr, s);
- free(s);
+ free((char *)s);
}
}
* Simulator of microcontrollers (cmd.src/info.cc)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
// sim.src
#include "simcl.h"
-
+
// local
#include "infocl.h"
COMMAND_DO_WORK_UC(cl_info_bp_cmd)
{
int i;
- char *s;
con->dd_printf("Num Type Disp Hit Cnt Address What\n");
for (i= 0; i < uc->fbrk->count; i++)
{
class cl_brk *fb= (class cl_brk *)(uc->fbrk->at(i));
- s= uc->disass(fb->addr, NULL);
+ const char *s= uc->disass(fb->addr, NULL);
con->dd_printf("%-3d %-10s %s %-5d %-5d 0x%06x %s\n", fb->nr,
"fetch", (fb->perm==brkFIX)?"keep":"del ",
fb->hit, fb->cnt,
fb->addr, s);
- free(s);
+ free((char *)s);
}
for (i= 0; i < uc->ebrk->count; i++)
{
* Simulator of microcontrollers (hc08.cc)
*
* some hc08 code base from Karl Bongers karl@turbobit.com
- *
+ *
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
}
const char *
-cl_hc08::disass(t_addr addr, char *sep)
+cl_hc08::disass(t_addr addr, const char *sep)
{
char work[256], temp[20];
const char *b;
p= work;
b = get_disasm_info(addr, &len, NULL, &immed_offset);
-
+
if (b == NULL) {
buf= (char*)malloc(30);
strcpy(buf, "UNKNOWN/INVALID");
con->dd_printf("SP= 0x%04x [SP+1]= %02x %3d %c\n",
regs.SP, ram->get(regs.SP+1), ram->get(regs.SP+1),
isprint(ram->get(regs.SP+1))?ram->get(regs.SP+1):'.');
-
+
print_disass(PC, con);
}
}
default: return(resHALT);
}
-
+
}
case 0xa:
case 0xb:
* Simulator of microcontrollers (hc08cl.h)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
virtual int inst_length(t_addr addr);
virtual int inst_branch(t_addr addr);
virtual int longest_inst(void);
- virtual const char *disass(t_addr addr, char *sep);
+ virtual const char *disass(t_addr addr, const char *sep);
virtual void print_regs(class cl_console_base *con);
virtual int exec_inst(void);
}
-char *
-cl_uc390::disass (t_addr addr, char *sep)
+const char *
+cl_uc390::disass (t_addr addr, const char *sep)
{
char work[256], temp[20], c[2];
const char *b;
/* mods for disassembly of flat24 */
virtual struct dis_entry *dis_tbl(void);
- virtual char * disass(t_addr addr, char *sep);
+ virtual const char * disass(t_addr addr, const char *sep);
virtual void print_regs(class cl_console_base *con);
protected:
* Simulator of microcontrollers (uc51.cc)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
return(bit_tab51);
}
-char *
-cl_51core::disass(t_addr addr, char *sep)
+const char *
+cl_51core::disass(t_addr addr, const char *sep)
{
char work[256], temp[20], c[2];
const char *b;
iram->get(start), data, isprint(data)?data:'.');
con->dd_printf(" ACC= 0x%02x %3d %c B= 0x%02x", sfr->get(ACC), sfr->get(ACC),
- isprint(sfr->get(ACC))?(sfr->get(ACC)):'.', sfr->get(B));
+ isprint(sfr->get(ACC))?(sfr->get(ACC)):'.', sfr->get(B));
//eram2xram();
data= xram->get(sfr->get(DPH)*256+sfr->get(DPL));
con->dd_printf(" DPTR= 0x%02x%02x @DPTR= 0x%02x %3d %c\n", sfr->get(DPH),
cl_51core::clear_sfr(void)
{
int i;
-
+
for (i= 0x80; i <= 0xff; i++)
sfr->set(i, 0);
sfr->/*set*/write(P0, 0xff);
{
//fprintf(stderr,"uc: inp avail in PD mode, user stop\n");
result= resUSER;
- sim->stop(result);
+ sim->stop(result);
}
}
return(result);
* Simulator of microcontrollers (uc51cl.h)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
-
+
UCSIM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with UCSIM; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
virtual struct dis_entry *dis_tbl(void);
virtual struct name_entry *sfr_tbl(void);
virtual struct name_entry *bit_tbl(void);
- virtual char *disass(t_addr addr, char *sep);
+ virtual const char *disass(t_addr addr, const char *sep);
virtual void print_regs(class cl_console_base *con);
virtual class cl_address_space *bit2mem(t_addr bitaddr,
t_addr *memaddr, t_mem *bitmask);
* Simulator of microcontrollers (uc.cc)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
}
sp_max= 0;
sp_avg= 0;
-
+
stack_ops->free_all();
int i;
cset= new cl_cmdset();
cset->init();
}
- cset->add(cmd= new cl_info_bp_cmd("breakpoints", 0,
+ cset->add(cmd= new cl_info_bp_cmd("breakpoints", 0,
"info breakpoints Status of user-settable breakpoints",
"long help of info breakpoints"));
cmd->add_name("bp");
cmd->init();
- cset->add(cmd= new cl_info_reg_cmd("registers", 0,
+ cset->add(cmd= new cl_info_reg_cmd("registers", 0,
"info registers List of integer registers and their contents",
"long help of info registers"));
cmd->init();
- cset->add(cmd= new cl_info_hw_cmd("hardware", 0,
+ cset->add(cmd= new cl_info_hw_cmd("hardware", 0,
"info hardware cathegory\n"
" Status of hardware elements of the CPU",
"long help of info hardware"));
cmd->add_name("hw");
cmd->init();
- cset->add(cmd= new cl_info_stack_cmd("stack", 0,
+ cset->add(cmd= new cl_info_stack_cmd("stack", 0,
"info stack Status of stack of the CPU",
"long help of info stack"));
cmd->init();
cl_uc::mem(enum mem_class type)
{
class cl_m *m;
-
+
if (mems->count < type)
m= (class cl_m *)(mems->at(MEM_DUMMY));
else
}
-/*
+/*
* Reading intel hexa file into EROM
*____________________________________________________________________________
*
i++;
hw= get_hw(cath, &i);
}
- if (hw &&
+ if (hw &&
idx)
*idx= i;
return(hw);
i++;
hw= get_hw(id_string, &i);
}
- if (hw &&
+ if (hw &&
idx)
*idx= i;
return(hw);
return(&empty);
}
-char *
+const char *
cl_uc::disass(t_addr addr, const char *sep)
{
char *buf;
void
cl_uc::print_disass(t_addr addr, class cl_console_base *con)
{
- char *dis;
+ const char *dis;
class cl_brk *b;
int i;
i++;
}
con->dd_printf(" %s\n", dis);
- free(dis);
+ free((char *)dis);
}
void
cl_uc::del_counter(char *nam)
{
int i;
-
+
if (!nam)
return;
for (i= 0; i < counters->count; i++)
cl_uc::fetch(void)
{
ulong code;
-
+
if (!rom)
return(0);
cl_uc::stack_read(class cl_stack_op *op)
{
class cl_stack_op *top= (class cl_stack_op *)(stack_ops->top());
-
+
if (op->get_op() & stack_write_operation)
{
class cl_error_stack_tracker_wrong_handle *e= new
top?(top->get_pc()):0, top?(top->get_before()):0,
op->get_after());
}
-
+
if (top)
{
int ta= top->get_after(), oa= op->get_after();
error(e);
}
}
-
+
delete op;
}
cl_uc::fbrk_at(t_addr addr)
{
int idx;
-
+
return((class cl_fetch_brk *)(fbrk->get_bp(addr, &idx)));
}
* Simulator of microcontrollers (sim.src/uccl.h)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
cl_ticker(int adir, int in_isr, const char *aname);
virtual ~cl_ticker(void);
-
+
virtual int tick(int nr);
virtual double get_rtime(double xtal);
virtual void dump(int nr, double xtal, class cl_console_base *con);
class cl_sim *sim;
//class cl_list *mems;
class cl_hws *hws;
-
+
class cl_list *memchips; // v3
class cl_address_space_list *address_spaces;
class cl_address_space *rom; // Required for almost every uc
virtual void check_events(void);
// disassembling and symbol recognition
- virtual char *disass(t_addr addr, const char *sep);
+ virtual const char *disass(t_addr addr, const char *sep);
virtual struct dis_entry *dis_tbl(void);
virtual struct name_entry *sfr_tbl(void);
virtual struct name_entry *bit_tbl(void);
virtual t_addr bit_address(class cl_memory *mem,
t_addr mem_address,
int bit_number) { return(-1); }
-
+
// messages from app to handle and broadcast
virtual bool handle_event(class cl_event &event);
//virtual void mem_cell_changed(class cl_address_space *mem, t_addr addr);
// Error handling
virtual void error(class cl_error *error);
virtual void check_errors(void);
-
+
/* Following fields and virtual methods defined in uc51 I don't have
energy to redesign them:-( */
public:
addr - address of opcode to disassemble/print.
sep - optionally points to string(tab) to use as separator.
|--------------------------------------------------------------------*/
-char *
-cl_xa::disass(t_addr addr, char *sep)
+const char *
+cl_xa::disass(t_addr addr, const char *sep)
{
char work[256], parm_str[40];
char *buf, *p, *b;
break;
case DIRECT_REG :
sprintf(parm_str, "%s,%s",
- get_dir_name(((code & 0x7) << 8) |
+ get_dir_name(((code & 0x7) << 8) |
get_mem(MEM_ROM_ID, addr+immed_offset)),
reg_strs[((code >> 4) & 0xf)] );
++immed_offset;
break;
case REG_DIRECT :
sprintf(parm_str, "%s,%s",
- reg_strs[((code >> 4) & 0xf)],
- get_dir_name(((code & 0x7) << 8) |
+ reg_strs[((code >> 4) & 0xf)],
+ get_dir_name(((code & 0x7) << 8) |
get_mem(MEM_ROM_ID, addr+immed_offset)));
++immed_offset;
break;
break;
case DIRECT_DATA8 :
sprintf(parm_str, "%s,#0x%02x",
- get_dir_name(((code & 0x0070) << 4) |
+ get_dir_name(((code & 0x0070) << 4) |
get_mem(MEM_ROM_ID, addr+immed_offset)),
get_mem(MEM_ROM_ID, addr+immed_offset+1));
immed_offset += 3;
break;
case DIRECT_DATA16 :
sprintf(parm_str, "%s,#0x%04x",
- get_dir_name(((code & 0x0070) << 4) |
+ get_dir_name(((code & 0x0070) << 4) |
get_mem(MEM_ROM_ID, addr+immed_offset)),
get_mem(MEM_ROM_ID, addr+immed_offset+2) +
(get_mem(MEM_ROM_ID, addr+immed_offset+1)<<8));
strcpy(parm_str, "");
break;
case CY_BIT :
- sprintf(parm_str, "C,%s",
+ sprintf(parm_str, "C,%s",
get_bit_name(((code&0x0003)<<8) + get_mem(MEM_ROM_ID, addr+2)));
break;
case BIT_CY :
- sprintf(parm_str, "%s,C",
+ sprintf(parm_str, "%s,C",
get_bit_name(((code&0x0003)<<8) + get_mem(MEM_ROM_ID, addr+2)));
break;
case REG_DATA4 :
break;
case DIRECT :
sprintf(parm_str, "%s",
- get_dir_name(((code & 0x007) << 4) +
+ get_dir_name(((code & 0x007) << 4) +
get_mem(MEM_ROM_ID, addr+2)));
break;
case REG :
sprintf(parm_str, "#0x%02x", code&0x0f);
break;
case ADDR24 :
- sprintf(parm_str, "0x%06x",
- (get_mem(MEM_ROM_ID, addr+3)<<16) +
- (get_mem(MEM_ROM_ID, addr+1)<<8) +
+ sprintf(parm_str, "0x%06x",
+ (get_mem(MEM_ROM_ID, addr+3)<<16) +
+ (get_mem(MEM_ROM_ID, addr+1)<<8) +
get_mem(MEM_ROM_ID, addr+2));
break;
break;
case REG_DIRECT_REL8 :
sprintf(parm_str, "%s,%s,0x%02x",
reg_strs[((code >> 4) & 0xf)],
- get_dir_name(((code & 0x7) << 8) +
+ get_dir_name(((code & 0x7) << 8) +
get_mem(MEM_ROM_ID, addr+immed_offset)),
((signed char) get_mem(MEM_ROM_ID, addr+immed_offset+1) * 2) & 0xfffe );
break;
break;
case REG_REGOFF8 :
- sprintf(parm_str, "%s,%s+0x%02x",
+ sprintf(parm_str, "%s,%s+0x%02x",
w_reg_strs[(code >> 4) & 0x7],
w_reg_strs[code & 0x7],
get_mem(MEM_ROM_ID, addr+immed_offset));
break;
case REG_REGOFF16 :
- sprintf(parm_str, "%s,%s+0x%02x",
+ sprintf(parm_str, "%s,%s+0x%02x",
w_reg_strs[(code >> 4) & 0x7],
w_reg_strs[code & 0x7],
get_mem(MEM_ROM_ID, addr+immed_offset+1) +
int *parms,
int *mnemonic);
- virtual char *disass(t_addr addr, char *sep);
+ virtual const char *disass(t_addr addr, const char *sep);
virtual void print_regs(class cl_console_base *con);
virtual int exec_inst(void);
* Simulator of microcontrollers (z80.cc)
*
* some z80 code base from Karl Bongers karl@turbobit.com
- *
+ *
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
}
const char *
-cl_z80::disass(t_addr addr, char *sep)
+cl_z80::disass(t_addr addr, const char *sep)
{
char work[256], temp[20];
const char *b;
p= work;
b = get_disasm_info(addr, &len, NULL, &immed_offset);
-
+
if (b == NULL) {
buf= (char*)malloc(30);
strcpy(buf, "UNKNOWN/INVALID");
con->dd_printf("SP= 0x%04x [SP]= %02x %3d %c\n",
regs.SP, ram->get(regs.SP), ram->get(regs.SP),
isprint(ram->get(regs.SP))?ram->get(regs.SP):'.');
-
+
print_disass(PC, con);
}
case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x77:
case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
return(inst_ld(code));
- case 0x76:
+ case 0x76:
return(inst_halt(code));
case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
* Simulator of microcontrollers (z80cl.h)
*
* Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- *
+ *
* To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
*
*/
virtual int inst_length(t_addr addr);
virtual int inst_branch(t_addr addr);
virtual int longest_inst(void);
- virtual const char *disass(t_addr addr, char *sep);
+ virtual const char *disass(t_addr addr, const char *sep);
virtual void print_regs(class cl_console_base *con);
virtual int exec_inst(void);