summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2017-06-26 21:41:14 -0400
committer AJR <ajrhacker@users.noreply.github.com>2017-06-26 21:41:14 -0400
commit50235ac3111e6b34a2bf65c59bcae4e7c3022e6e (patch)
tree0be9a37004bd697a5cc6267f395622f495259fdb
parent23e2d6518299b5dc8361aea056444c81ecf1eb3d (diff)
z8: Convert ports to DEVCB (nw)
-rw-r--r--src/devices/cpu/z8/z8.cpp27
-rw-r--r--src/devices/cpu/z8/z8.h48
-rw-r--r--src/mame/drivers/jtc.cpp12
3 files changed, 64 insertions, 23 deletions
diff --git a/src/devices/cpu/z8/z8.cpp b/src/devices/cpu/z8/z8.cpp
index ac9b98e02c6..5d4b63f1096 100644
--- a/src/devices/cpu/z8/z8.cpp
+++ b/src/devices/cpu/z8/z8.cpp
@@ -174,7 +174,8 @@ z8_device::z8_device(const machine_config &mconfig, device_type type, const char
: cpu_device(mconfig, type, tag, owner, clock)
, m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0, (size == 4) ? ADDRESS_MAP_NAME(program_4kb) : ADDRESS_MAP_NAME(program_2kb))
, m_data_config("data", ENDIANNESS_LITTLE, 8, 16, 0)
- , m_io_config("io", ENDIANNESS_LITTLE, 8, 2, 0)
+ , m_input_cb{{*this}, {*this}, {*this}, {*this}}
+ , m_output_cb{{*this}, {*this}, {*this}, {*this}}
{
}
@@ -242,7 +243,7 @@ uint8_t z8_device::register_read(uint8_t offset)
if (!(P3M & Z8_P3M_P0_STROBED))
{
- if (mask) m_input[offset] = m_io->read_byte(offset);
+ if (mask) m_input[offset] = m_input_cb[0](0, mask);
}
data |= m_input[offset] & mask;
@@ -258,7 +259,7 @@ uint8_t z8_device::register_read(uint8_t offset)
if ((P3M & Z8_P3M_P33_P34_MASK) != Z8_P3M_P33_P34_DAV1_RDY1)
{
- if (mask) m_input[offset] = m_io->read_byte(offset);
+ if (mask) m_input[offset] = m_input_cb[1](0, mask);
}
data |= m_input[offset] & mask;
@@ -269,7 +270,7 @@ uint8_t z8_device::register_read(uint8_t offset)
if (!(P3M & Z8_P3M_P2_STROBED))
{
- if (mask) m_input[offset] = m_io->read_byte(offset);
+ if (mask) m_input[offset] = m_input_cb[2](0, mask);
}
data = (m_input[offset] & mask) | (m_output[offset] & ~mask);
@@ -282,7 +283,7 @@ uint8_t z8_device::register_read(uint8_t offset)
mask = 0x0f;
}
- if (mask) m_input[offset] = m_io->read_byte(offset);
+ if (mask) m_input[offset] = m_input_cb[3](0, mask);
data = (m_input[offset] & mask) | (m_output[offset] & ~mask);
break;
@@ -327,19 +328,19 @@ void z8_device::register_write(uint8_t offset, uint8_t data)
m_output[offset] = data;
if ((P01M & Z8_P01M_P0L_MODE_MASK) == Z8_P01M_P0L_MODE_OUTPUT) mask |= 0x0f;
if ((P01M & Z8_P01M_P0H_MODE_MASK) == Z8_P01M_P0H_MODE_OUTPUT) mask |= 0xf0;
- if (mask) m_io->write_byte(offset, data & mask);
+ if (mask) m_output_cb[0](0, data & mask, mask);
break;
case Z8_REGISTER_P1:
m_output[offset] = data;
if ((P01M & Z8_P01M_P1_MODE_MASK) == Z8_P01M_P1_MODE_OUTPUT) mask = 0xff;
- if (mask) m_io->write_byte(offset, data & mask);
+ if (mask) m_output_cb[1](0, data & mask, mask);
break;
case Z8_REGISTER_P2:
m_output[offset] = data;
mask = m_r[Z8_REGISTER_P2M] ^ 0xff;
- if (mask) m_io->write_byte(offset, data & mask);
+ if (mask) m_output_cb[2](0, data & mask, mask);
break;
case Z8_REGISTER_P3:
@@ -351,7 +352,7 @@ void z8_device::register_write(uint8_t offset, uint8_t data)
mask = 0xf0;
}
- if (mask) m_io->write_byte(offset, data & mask);
+ if (mask) m_output_cb[3](0, data & mask, mask);
break;
case Z8_REGISTER_SIO:
@@ -666,6 +667,11 @@ TIMER_CALLBACK_MEMBER( z8_device::t1_tick )
void z8_device::device_start()
{
+ for (auto &cb : m_input_cb)
+ cb.resolve_safe(0xff);
+ for (auto &cb : m_output_cb)
+ cb.resolve_safe();
+
/* set up the state table */
{
state_add(Z8_PC, "PC", m_pc);
@@ -695,7 +701,6 @@ void z8_device::device_start()
m_program = &space(AS_PROGRAM);
m_direct = &m_program->direct();
m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
/* allocate timers */
m_t0_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(z8_device::t0_tick), this));
@@ -741,7 +746,7 @@ void z8_device::execute_run()
debugger_instruction_hook(this, m_pc);
/* TODO: sample interrupts */
- m_input[3] = m_io->read_byte(3);
+ m_input[3] = m_input_cb[3]();
/* fetch opcode */
opcode = fetch();
diff --git a/src/devices/cpu/z8/z8.h b/src/devices/cpu/z8/z8.h
index 603177157c9..e8485a65b12 100644
--- a/src/devices/cpu/z8/z8.h
+++ b/src/devices/cpu/z8/z8.h
@@ -12,8 +12,49 @@
#pragma once
+#define MCFG_Z8_PORT_P0_READ_CB(_devcb) \
+ devcb = &z8_device::set_input_cb(*device, 0, DEVCB_##_devcb);
+
+#define MCFG_Z8_PORT_P1_READ_CB(_devcb) \
+ devcb = &z8_device::set_input_cb(*device, 1, DEVCB_##_devcb);
+
+#define MCFG_Z8_PORT_P2_READ_CB(_devcb) \
+ devcb = &z8_device::set_input_cb(*device, 2, DEVCB_##_devcb);
+
+#define MCFG_Z8_PORT_P3_READ_CB(_devcb) \
+ devcb = &z8_device::set_input_cb(*device, 3, DEVCB_##_devcb);
+
+
+#define MCFG_Z8_PORT_P0_WRITE_CB(_devcb) \
+ devcb = &z8_device::set_output_cb(*device, 0, DEVCB_##_devcb);
+
+#define MCFG_Z8_PORT_P1_WRITE_CB(_devcb) \
+ devcb = &z8_device::set_output_cb(*device, 1, DEVCB_##_devcb);
+
+#define MCFG_Z8_PORT_P2_WRITE_CB(_devcb) \
+ devcb = &z8_device::set_output_cb(*device, 2, DEVCB_##_devcb);
+
+#define MCFG_Z8_PORT_P3_WRITE_CB(_devcb) \
+ devcb = &z8_device::set_output_cb(*device, 3, DEVCB_##_devcb);
+
+
class z8_device : public cpu_device
{
+public:
+ // static configuration
+ template<class Object>
+ static devcb_base &set_input_cb(device_t &device, int port, Object &&object)
+ {
+ assert(port >= 0 && port < 4);
+ return downcast<z8_device &>(device).m_input_cb[port].set_callback(std::forward<Object>(object));
+ }
+ template<class Object>
+ static devcb_base &set_output_cb(device_t &device, int port, Object &&object)
+ {
+ assert(port >= 0 && port < 4);
+ return downcast<z8_device &>(device).m_output_cb[port].set_callback(std::forward<Object>(object));
+ }
+
protected:
enum
{
@@ -48,7 +89,6 @@ protected:
{
case AS_PROGRAM: return &m_program_config;
case AS_DATA: return &m_data_config;
- case AS_IO: return &m_io_config;
default: return nullptr;
}
return nullptr;
@@ -68,12 +108,14 @@ protected:
private:
address_space_config m_program_config;
address_space_config m_data_config;
- address_space_config m_io_config;
address_space *m_program;
direct_read_data *m_direct;
address_space *m_data;
- address_space *m_io;
+
+ // callbacks
+ devcb_read8 m_input_cb[4];
+ devcb_write8 m_output_cb[4];
/* registers */
uint16_t m_pc; /* program counter */
diff --git a/src/mame/drivers/jtc.cpp b/src/mame/drivers/jtc.cpp
index d8fd6fc83a5..68fb8f58a94 100644
--- a/src/mame/drivers/jtc.cpp
+++ b/src/mame/drivers/jtc.cpp
@@ -282,14 +282,6 @@ static ADDRESS_MAP_START( jtc_es40_mem, AS_PROGRAM, 8, jtces40_state )
AM_RANGE(0x8000, 0xffff) AM_RAM//BANK(1)
ADDRESS_MAP_END
-static ADDRESS_MAP_START( jtc_io, AS_IO, 8, jtc_state )
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x00, 0x00) AM_NOP // A8-A15
- AM_RANGE(0x01, 0x01) AM_NOP // AD0-AD7
- AM_RANGE(0x02, 0x02) AM_WRITE(p2_w)
- AM_RANGE(0x03, 0x03) AM_READWRITE(p3_r, p3_w)
-ADDRESS_MAP_END
-
/* Input Ports */
static INPUT_PORTS_START( jtc )
@@ -724,7 +716,9 @@ static MACHINE_CONFIG_START( basic )
/* basic machine hardware */
MCFG_CPU_ADD(UB8830D_TAG, UB8830D, XTAL_8MHz)
MCFG_CPU_PROGRAM_MAP(jtc_mem)
- MCFG_CPU_IO_MAP(jtc_io)
+ MCFG_Z8_PORT_P2_WRITE_CB(WRITE8(jtc_state, p2_w))
+ MCFG_Z8_PORT_P3_READ_CB(READ8(jtc_state, p3_r))
+ MCFG_Z8_PORT_P3_WRITE_CB(WRITE8(jtc_state, p3_w))
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")