X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=sim%2Fucsim%2Fhc08.src%2Fhc08.cc;h=3550cbb9ded3904e3f2268a22921a0c27be557f8;hb=f27da39dbcab5678aca6d8462f1cc37a643f37e9;hp=06af92c95137d473c77925c8e743054b8e5191a9;hpb=7fe573ea83f6e0762dc73bc493f15fa2a8f6273d;p=fw%2Fsdcc diff --git a/sim/ucsim/hc08.src/hc08.cc b/sim/ucsim/hc08.src/hc08.cc index 06af92c9..3550cbb9 100644 --- a/sim/ucsim/hc08.src/hc08.cc +++ b/sim/ucsim/hc08.src/hc08.cc @@ -74,7 +74,7 @@ cl_hc08::init(void) xtal = 8000000; - rom= mem(MEM_ROM); + rom= address_space(MEM_ROM_ID); // ram= mem(MEM_XRAM); ram= rom; @@ -112,7 +112,7 @@ cl_hc08::id_string(void) /* * Making elements of the controller */ - +/* t_addr cl_hc08::get_mem_size(enum mem_class type) { @@ -124,7 +124,7 @@ cl_hc08::get_mem_size(enum mem_class type) } return(cl_uc::get_mem_size(type)); } - +*/ void cl_hc08::mk_hw_elements(void) { @@ -132,6 +132,27 @@ cl_hc08::mk_hw_elements(void) /* t_uc::mk_hw() does nothing */ } +void +cl_hc08::make_memories(void) +{ + class cl_address_space *as; + + as= new cl_address_space("rom", 0, 0x10000, 8); + as->init(); + address_spaces->add(as); + + class cl_address_decoder *ad; + class cl_memory_chip *chip; + + chip= new cl_memory_chip("rom_chip", 0x10000, 8); + chip->init(); + memchips->add(chip); + ad= new cl_address_decoder(as= address_space("rom"), chip, 0, 0xffff, 0); + ad->init(); + as->decoders->add(ad); + ad->activate(0); +} + /* * Help command interpreter @@ -199,12 +220,12 @@ cl_hc08::get_disasm_info(t_addr addr, int start_addr = addr; struct dis_entry *dis_e; - code= get_mem(MEM_ROM, addr++); + code= get_mem(MEM_ROM_ID, addr++); dis_e = NULL; switch(code) { case 0x9e: /* ESC code to sp relative op-codes */ - code= get_mem(MEM_ROM, addr++); + code= get_mem(MEM_ROM_ID, addr++); i= 0; while ((code & disass_hc08_9e[i].mask) != disass_hc08_9e[i].code && disass_hc08_9e[i].mnemonic) @@ -272,46 +293,46 @@ cl_hc08::disass(t_addr addr, char *sep) switch (*(b++)) { case 's': // s signed byte immediate - sprintf(temp, "#%d", (char)get_mem(MEM_ROM, addr+immed_offset)); + sprintf(temp, "#%d", (char)get_mem(MEM_ROM_ID, addr+immed_offset)); ++immed_offset; break; case 'w': // w word immediate operand sprintf(temp, "#0x%04x", - (uint)((get_mem(MEM_ROM, addr+immed_offset)<<8) | - (get_mem(MEM_ROM, addr+immed_offset+1))) ); + (uint)((get_mem(MEM_ROM_ID, addr+immed_offset)<<8) | + (get_mem(MEM_ROM_ID, addr+immed_offset+1))) ); ++immed_offset; ++immed_offset; break; case 'b': // b byte immediate operand - sprintf(temp, "#0x%02x", (uint)get_mem(MEM_ROM, addr+immed_offset)); + sprintf(temp, "#0x%02x", (uint)get_mem(MEM_ROM_ID, addr+immed_offset)); ++immed_offset; break; case 'x': // x extended addressing sprintf(temp, "0x%04x", - (uint)((get_mem(MEM_ROM, addr+immed_offset)<<8) | - (get_mem(MEM_ROM, addr+immed_offset+1))) ); + (uint)((get_mem(MEM_ROM_ID, addr+immed_offset)<<8) | + (get_mem(MEM_ROM_ID, addr+immed_offset+1))) ); ++immed_offset; ++immed_offset; break; case 'd': // d direct addressing - sprintf(temp, "*0x%02x", (uint)get_mem(MEM_ROM, addr+immed_offset)); + sprintf(temp, "*0x%02x", (uint)get_mem(MEM_ROM_ID, addr+immed_offset)); ++immed_offset; break; case '2': // 2 word index offset sprintf(temp, "0x%04x", - (uint)((get_mem(MEM_ROM, addr+immed_offset)<<8) | - (get_mem(MEM_ROM, addr+immed_offset+1))) ); + (uint)((get_mem(MEM_ROM_ID, addr+immed_offset)<<8) | + (get_mem(MEM_ROM_ID, addr+immed_offset+1))) ); ++immed_offset; ++immed_offset; break; case '1': // b byte index offset - sprintf(temp, "0x%02x", (uint)get_mem(MEM_ROM, addr+immed_offset)); + sprintf(temp, "0x%02x", (uint)get_mem(MEM_ROM_ID, addr+immed_offset)); ++immed_offset; break; case 'p': // b byte index offset sprintf(temp, "0x%04x", addr+immed_offset+1 - +(char)get_mem(MEM_ROM, addr+immed_offset)); + +(char)get_mem(MEM_ROM_ID, addr+immed_offset)); ++immed_offset; break; default: @@ -569,10 +590,11 @@ cl_hc08::exec_inst(void) default: return(resHALT); } - if (PC) + /*if (PC) PC--; else - PC= get_mem_size(MEM_ROM)-1; + PC= get_mem_size(MEM_ROM_ID)-1;*/ + PC= rom->inc_address(PC, -1); sim->stop(resINV_INST); return(resINV_INST);