summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mcs96/mcs96.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mcs96/mcs96.cpp')
-rw-r--r--src/devices/cpu/mcs96/mcs96.cpp195
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, &regs_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);
}