X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Fhc08.src%2Fhc08.cc;h=f333990d6cf5bb0329cfc392ae09794a11ecf2a6;hb=d46f1ad41d63b49a39c6616a9918a29cbc1755e4;hp=06af92c95137d473c77925c8e743054b8e5191a9;hpb=5f4c7aeda2b5672d87d0805103a394b62e3904c2;p=fw%2Fsdcc diff --git a/sim/ucsim/hc08.src/hc08.cc b/sim/ucsim/hc08.src/hc08.cc index 06af92c9..f333990d 100644 --- a/sim/ucsim/hc08.src/hc08.cc +++ b/sim/ucsim/hc08.src/hc08.cc @@ -51,9 +51,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define uint8 unsigned char #define int8 char -const bool TRUE = 1; -const bool FALSE = 0; - /*******************************************************************/ @@ -74,7 +71,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 +109,7 @@ cl_hc08::id_string(void) /* * Making elements of the controller */ - +/* t_addr cl_hc08::get_mem_size(enum mem_class type) { @@ -124,7 +121,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 +129,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 +217,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 +290,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: @@ -397,71 +415,71 @@ cl_hc08::exec_inst(void) return(resBREAKPOINT); tick(1); switch ((code >> 4) & 0xf) { - case 0x0: return(inst_bittestsetclear(code, FALSE)); - case 0x1: return(inst_bitsetclear(code, FALSE)); - case 0x2: return(inst_condbranch(code, FALSE)); + case 0x0: return(inst_bittestsetclear(code, false)); + case 0x1: return(inst_bitsetclear(code, false)); + case 0x2: return(inst_condbranch(code, false)); case 0x3: case 0x4: case 0x5: case 0x6: case 0x7: switch (code & 0xf) { - case 0x0: return(inst_neg(code, FALSE)); - case 0x1: return(inst_cbeq(code, FALSE)); + case 0x0: return(inst_neg(code, false)); + case 0x1: return(inst_cbeq(code, false)); case 0x2: switch (code) { - case 0x42: return(inst_mul(code, FALSE)); - case 0x52: return(inst_div(code, FALSE)); - case 0x62: return(inst_nsa(code, FALSE)); - case 0x72: return(inst_daa(code, FALSE)); + case 0x42: return(inst_mul(code, false)); + case 0x52: return(inst_div(code, false)); + case 0x62: return(inst_nsa(code, false)); + case 0x72: return(inst_daa(code, false)); default: return(resHALT); } - case 0x3: return(inst_com(code, FALSE)); - case 0x4: return(inst_lsr(code, FALSE)); + case 0x3: return(inst_com(code, false)); + case 0x4: return(inst_lsr(code, false)); case 0x5: switch (code) { - case 0x35: return(inst_sthx(code, FALSE)); + case 0x35: return(inst_sthx(code, false)); case 0x45: - case 0x55: return(inst_ldhx(code, FALSE)); + case 0x55: return(inst_ldhx(code, false)); case 0x65: - case 0x75: return(inst_cphx(code, FALSE)); + case 0x75: return(inst_cphx(code, false)); default: return(resHALT); } - case 0x6: return(inst_ror(code, FALSE)); - case 0x7: return(inst_asr(code, FALSE)); - case 0x8: return(inst_lsl(code, FALSE)); - case 0x9: return(inst_rol(code, FALSE)); - case 0xa: return(inst_dec(code, FALSE)); - case 0xb: return(inst_dbnz(code, FALSE)); - case 0xc: return(inst_inc(code, FALSE)); - case 0xd: return(inst_tst(code, FALSE)); + case 0x6: return(inst_ror(code, false)); + case 0x7: return(inst_asr(code, false)); + case 0x8: return(inst_lsl(code, false)); + case 0x9: return(inst_rol(code, false)); + case 0xa: return(inst_dec(code, false)); + case 0xb: return(inst_dbnz(code, false)); + case 0xc: return(inst_inc(code, false)); + case 0xd: return(inst_tst(code, false)); case 0xe: switch (code) { case 0x4e: case 0x5e: case 0x6e: - case 0x7e: return(inst_mov(code, FALSE)); + case 0x7e: return(inst_mov(code, false)); default: return(resHALT); } - case 0xf: return(inst_clr(code, FALSE)); + case 0xf: return(inst_clr(code, false)); default: return(resHALT); } case 0x8: switch (code & 0xf) { - case 0x0: return(inst_rti(code, FALSE)); - case 0x1: return(inst_rts(code, FALSE)); - case 0x3: return(inst_swi(code, FALSE)); + case 0x0: return(inst_rti(code, false)); + case 0x1: return(inst_rts(code, false)); + case 0x3: return(inst_swi(code, false)); case 0x4: - case 0x5: return(inst_transfer(code, FALSE)); + case 0x5: return(inst_transfer(code, false)); case 0x6: case 0x7: case 0x8: case 0x9: case 0xa: - case 0xb: return(inst_pushpull(code, FALSE)); - case 0xc: return(inst_clrh(code, FALSE)); - case 0xe: return(inst_stop(code, FALSE)); - case 0xf: return(inst_wait(code, FALSE)); + case 0xb: return(inst_pushpull(code, false)); + case 0xc: return(inst_clrh(code, false)); + case 0xe: return(inst_stop(code, false)); + case 0xf: return(inst_wait(code, false)); default: return(resHALT); } case 0x9: @@ -469,56 +487,56 @@ cl_hc08::exec_inst(void) case 0x0: case 0x1: case 0x2: - case 0x3: return(inst_condbranch(code, FALSE)); + case 0x3: return(inst_condbranch(code, false)); case 0x4: case 0x5: case 0x7: - case 0xf: return(inst_transfer(code, FALSE)); + case 0xf: return(inst_transfer(code, false)); case 0x8: case 0x9: case 0xa: - case 0xb: return(inst_setclearflags(code, FALSE)); - case 0xc: return(inst_rsp(code, FALSE)); - case 0xd: return(inst_nop(code, FALSE)); + case 0xb: return(inst_setclearflags(code, false)); + case 0xc: return(inst_rsp(code, false)); + case 0xd: return(inst_nop(code, false)); case 0xe: code = fetch(); switch ((code >> 4) & 0xf) { case 0x6: switch (code & 0xf) { - case 0x0: return(inst_neg(code, TRUE)); - case 0x1: return(inst_cbeq(code, TRUE)); - case 0x3: return(inst_com(code, TRUE)); - case 0x4: return(inst_lsr(code, TRUE)); - case 0x6: return(inst_ror(code, TRUE)); - case 0x7: return(inst_asr(code, TRUE)); - case 0x8: return(inst_lsl(code, TRUE)); - case 0x9: return(inst_rol(code, TRUE)); - case 0xa: return(inst_dec(code, TRUE)); - case 0xb: return(inst_dbnz(code, TRUE)); - case 0xc: return(inst_inc(code, TRUE)); - case 0xd: return(inst_tst(code, TRUE)); - case 0xf: return(inst_clr(code, TRUE)); + case 0x0: return(inst_neg(code, true)); + case 0x1: return(inst_cbeq(code, true)); + case 0x3: return(inst_com(code, true)); + case 0x4: return(inst_lsr(code, true)); + case 0x6: return(inst_ror(code, true)); + case 0x7: return(inst_asr(code, true)); + case 0x8: return(inst_lsl(code, true)); + case 0x9: return(inst_rol(code, true)); + case 0xa: return(inst_dec(code, true)); + case 0xb: return(inst_dbnz(code, true)); + case 0xc: return(inst_inc(code, true)); + case 0xd: return(inst_tst(code, true)); + case 0xf: return(inst_clr(code, true)); default: return(resHALT); } case 0xd: case 0xe: switch (code & 0xf) { - case 0x0: return(inst_sub(code, TRUE)); - case 0x1: return(inst_cmp(code, TRUE)); - case 0x2: return(inst_sbc(code, TRUE)); - case 0x3: return(inst_cpx(code, TRUE)); - case 0x4: return(inst_and(code, TRUE)); - case 0x5: return(inst_bit(code, TRUE)); - case 0x6: return(inst_lda(code, TRUE)); - case 0x7: return(inst_sta(code, TRUE)); - case 0x8: return(inst_eor(code, TRUE)); - case 0x9: return(inst_adc(code, TRUE)); - case 0xa: return(inst_ora(code, TRUE)); - case 0xb: return(inst_add(code, TRUE)); + case 0x0: return(inst_sub(code, true)); + case 0x1: return(inst_cmp(code, true)); + case 0x2: return(inst_sbc(code, true)); + case 0x3: return(inst_cpx(code, true)); + case 0x4: return(inst_and(code, true)); + case 0x5: return(inst_bit(code, true)); + case 0x6: return(inst_lda(code, true)); + case 0x7: return(inst_sta(code, true)); + case 0x8: return(inst_eor(code, true)); + case 0x9: return(inst_adc(code, true)); + case 0xa: return(inst_ora(code, true)); + case 0xb: return(inst_add(code, true)); case 0xc: return(resHALT); case 0xd: putchar(regs.A); fflush(stdout); return(resGO); - case 0xe: return(inst_ldx(code, TRUE)); - case 0xf: return(inst_stx(code, TRUE)); + case 0xe: return(inst_ldx(code, true)); + case 0xf: return(inst_stx(code, true)); default: return(resHALT); } default: return(resHALT); @@ -532,47 +550,48 @@ cl_hc08::exec_inst(void) case 0xe: case 0xf: switch (code & 0xf) { - case 0x0: return(inst_sub(code, FALSE)); - case 0x1: return(inst_cmp(code, FALSE)); - case 0x2: return(inst_sbc(code, FALSE)); - case 0x3: return(inst_cpx(code, FALSE)); - case 0x4: return(inst_and(code, FALSE)); - case 0x5: return(inst_bit(code, FALSE)); - case 0x6: return(inst_lda(code, FALSE)); + case 0x0: return(inst_sub(code, false)); + case 0x1: return(inst_cmp(code, false)); + case 0x2: return(inst_sbc(code, false)); + case 0x3: return(inst_cpx(code, false)); + case 0x4: return(inst_and(code, false)); + case 0x5: return(inst_bit(code, false)); + case 0x6: return(inst_lda(code, false)); case 0x7: if (code==0xa7) - return(inst_ais(code, FALSE)); + return(inst_ais(code, false)); else - return(inst_sta(code, FALSE)); - case 0x8: return(inst_eor(code, FALSE)); - case 0x9: return(inst_adc(code, FALSE)); - case 0xa: return(inst_ora(code, FALSE)); - case 0xb: return(inst_add(code, FALSE)); + return(inst_sta(code, false)); + case 0x8: return(inst_eor(code, false)); + case 0x9: return(inst_adc(code, false)); + case 0xa: return(inst_ora(code, false)); + case 0xb: return(inst_add(code, false)); case 0xc: if (code==0xac) return(resHALT); else - return(inst_jmp(code, FALSE)); + return(inst_jmp(code, false)); case 0xd: if (code==0xad) - return(inst_bsr(code, FALSE)); + return(inst_bsr(code, false)); else - return(inst_jsr(code, FALSE)); - case 0xe: return(inst_ldx(code, FALSE)); + return(inst_jsr(code, false)); + case 0xe: return(inst_ldx(code, false)); case 0xf: if (code==0xaf) - return(inst_aix(code, FALSE)); + return(inst_aix(code, false)); else - return(inst_stx(code, FALSE)); + return(inst_stx(code, false)); default: return(resHALT); } 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);