diff options
Diffstat (limited to 'src/devices/cpu/mcs96/mcs96.cpp')
-rw-r--r-- | src/devices/cpu/mcs96/mcs96.cpp | 195 |
1 files changed, 29 insertions, 166 deletions
diff --git a/src/devices/cpu/mcs96/mcs96.cpp b/src/devices/cpu/mcs96/mcs96.cpp index 455cc7f3e00..a6f5ecd9638 100644 --- a/src/devices/cpu/mcs96/mcs96.cpp +++ b/src/devices/cpu/mcs96/mcs96.cpp @@ -12,10 +12,12 @@ #include "debugger.h" #include "mcs96.h" -mcs96_device::mcs96_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int data_width) : +mcs96_device::mcs96_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int data_width, address_map_constructor regs_map) : cpu_device(mconfig, type, tag, owner, clock), program_config("program", ENDIANNESS_LITTLE, data_width, 16), - program(nullptr), icount(0), bcount(0), inst_state(0), cycles_scaling(0), pending_irq(0), + regs_config("register", ENDIANNESS_LITTLE, 16, 8, 0, regs_map), + program(nullptr), regs(nullptr), register_file(*this, "register_file"), + icount(0), bcount(0), inst_state(0), cycles_scaling(0), pending_irq(0), PC(0), PPC(0), PSW(0), OP1(0), OP2(0), OP3(0), OPI(0), TMP(0), irq_requested(false) { } @@ -30,23 +32,17 @@ void mcs96_device::device_start() auto cache = program->cache<1, 0, ENDIANNESS_LITTLE>(); m_pr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); }; } + regs = &space(AS_DATA); set_icountptr(icount); state_add(STATE_GENPC, "GENPC", PC).noshow(); state_add(STATE_GENPCBASE, "CURPC", PPC).noshow(); - state_add(STATE_GENSP, "GENSP", R[0]).noshow(); + state_add(STATE_GENSP, "GENSP", register_file[0]).noshow(); state_add(STATE_GENFLAGS, "GENFLAGS", PSW).formatstr("%16s").noshow(); state_add(MCS96_PC, "PC", PC); state_add(MCS96_PSW, "PSW", PSW); - state_add(MCS96_R, "SP", R[0]); - for(int i=1; i<0x74; i++) { - char buf[10]; - sprintf(buf, "R%02x", i*2+0x18); - state_add(MCS96_R+i, buf, R[i]); - } - - memset(R, 0, sizeof(R)); + state_add(MCS96_R, "SP", register_file[0]); } void mcs96_device::device_reset() @@ -126,7 +122,8 @@ void mcs96_device::execute_set_input(int inputnum, int state) device_memory_interface::space_config_vector mcs96_device::memory_space_config() const { return space_config_vector { - std::make_pair(AS_PROGRAM, &program_config) + std::make_pair(AS_PROGRAM, &program_config), + std::make_pair(AS_DATA, ®s_config) }; } @@ -163,190 +160,56 @@ void mcs96_device::state_string_export(const device_state_entry &entry, std::str } } -void mcs96_device::io_w8(uint8_t adr, uint8_t data) -{ - switch(adr) { - case 0x02: - logerror("%s: ad_command %02x (%04x)\n", tag(), data, PPC); - break; - case 0x03: - logerror("%s: hsi_mode %02x (%04x)\n", tag(), data, PPC); - break; - case 0x04: - logerror("%s: hso_time.l %02x (%04x)\n", tag(), data, PPC); - break; - case 0x05: - logerror("%s: hso_time.h %02x (%04x)\n", tag(), data, PPC); - break; - case 0x06: - logerror("%s: hso_command %02x (%04x)\n", tag(), data, PPC); - break; - case 0x07: - logerror("%s: sbuf %02x (%04x)\n", tag(), data, PPC); - break; - case 0x08: - PSW = (PSW & 0xff00) | data; - break; - case 0x09: - logerror("%s: int_pending %02x (%04x)\n", tag(), data, PPC); - break; - case 0x0a: - logerror("%s: watchdog %02x (%04x)\n", tag(), data, PPC); - break; - case 0x0e: - logerror("%s: baud rate %02x (%04x)\n", tag(), data, PPC); - break; - case 0x0f: - logerror("%s: io port 1 %02x (%04x)\n", tag(), data, PPC); - break; - case 0x10: - logerror("%s: io port 2 %02x (%04x)\n", tag(), data, PPC); - break; - case 0x11: - logerror("%s: sp con %02x (%04x)\n", tag(), data, PPC); - break; - case 0x15: - logerror("%s: ioc0 %02x (%04x)\n", tag(), data, PPC); - break; - case 0x16: - logerror("%s: ioc1 %02x (%04x)\n", tag(), data, PPC); - break; - case 0x17: - logerror("%s: pwm control %02x (%04x)\n", tag(), data, PPC); - break; - } - return; -} - -void mcs96_device::io_w16(uint8_t adr, uint16_t data) -{ - switch(adr) { - case 0: - break; - case 4: - logerror("%s: hso_time %04x (%04x)\n", tag(), data, PPC); - break; - default: - io_w8(adr, data); - io_w8(adr+1, data>>8); - break; - } - return; -} - -uint8_t mcs96_device::io_r8(uint8_t adr) +void mcs96_device::reg_w8(u8 adr, u8 data) { - switch(adr) { - case 0x00: - return 0x00; - case 0x01: - return 0x00; - case 0x08: - return PSW; - } - uint8_t data = 0x00; - logerror("%s: io_r8 %02x, %02x (%04x)\n", tag(), adr, data, PPC); - return data; -} - -uint16_t mcs96_device::io_r16(uint8_t adr) -{ - if(adr < 2) - return 0x0000; - uint16_t data = 0x0000; - logerror("%s: io_r16 %02x, %04x (%04x)\n", tag(), adr, data, PPC); - return data; + regs->write_byte(adr, data); } -void mcs96_device::reg_w8(uint8_t adr, uint8_t data) +void mcs96_device::reg_w16(u8 adr, u16 data) { - if(adr < 0x18) - io_w8(adr, data); - else { - uint16_t &r = R[(adr - 0x18) >> 1]; - if(adr & 0x01) - r = (r & 0x00ff) | (data << 8); - else - r = (r & 0xff00) | data; - } -} - -void mcs96_device::reg_w16(uint8_t adr, uint16_t data) -{ - adr &= 0xfe; - if(adr < 0x18) - io_w16(adr, data); - else - R[(adr-0x18) >> 1] = data; + regs->write_word(adr & 0xfe, data); } uint8_t mcs96_device::reg_r8(uint8_t adr) { - if(adr < 0x18) - return io_r8(adr); - - uint16_t data = R[(adr - 0x18) >> 1]; - if(adr & 0x01) - return data >> 8; - else - return data; + return regs->read_byte(adr); } uint16_t mcs96_device::reg_r16(uint8_t adr) { - adr &= 0xfe; - if(adr < 0x18) - return io_r16(adr); - - return R[(adr-0x18) >> 1]; + return regs->read_word(adr & 0xfe); } -void mcs96_device::any_w8(uint16_t adr, uint8_t data) +void mcs96_device::any_w8(u16 adr, u8 data) { - if(adr < 0x18) - io_w8(adr, data); - else if(adr < 0x100) { - uint16_t &r = R[(adr - 0x18) >> 1]; - if(adr & 0x01) - r = (r & 0x00ff) | (data << 8); - else - r = (r & 0xff00) | data; - } else + if (adr < 0x100) + regs->write_byte(adr, data); + else program->write_byte(adr, data); } -void mcs96_device::any_w16(uint16_t adr, uint16_t data) +void mcs96_device::any_w16(u16 adr, u16 data) { adr &= 0xfffe; - if(adr < 0x18) - io_w16(adr, data); - else if(adr < 0x100) - R[(adr-0x18) >> 1] = data; + if (adr < 0x100) + regs->write_word(adr, data); else program->write_word(adr, data); } -uint8_t mcs96_device::any_r8(uint16_t adr) +u8 mcs96_device::any_r8(u16 adr) { - if(adr < 0x18) - return io_r8(adr); - else if(adr < 0x100) { - uint16_t data = R[(adr - 0x18) >> 1]; - if(adr & 0x01) - return data >> 8; - else - return data; - } else + if (adr < 0x100) + return regs->read_byte(adr); + else return program->read_byte(adr); } -uint16_t mcs96_device::any_r16(uint16_t adr) +u16 mcs96_device::any_r16(u16 adr) { adr &= 0xfffe; - if(adr < 0x18) - return io_r16(adr); - else if(adr < 0x100) - return R[(adr-0x18) >> 1]; + if (adr < 0x100) + return regs->read_word(adr); else return program->read_word(adr); } |