From 50235ac3111e6b34a2bf65c59bcae4e7c3022e6e Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 26 Jun 2017 21:41:14 -0400 Subject: z8: Convert ports to DEVCB (nw) --- src/devices/cpu/z8/z8.cpp | 27 +++++++++++++++----------- src/devices/cpu/z8/z8.h | 48 ++++++++++++++++++++++++++++++++++++++++++++--- src/mame/drivers/jtc.cpp | 12 +++--------- 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 + static devcb_base &set_input_cb(device_t &device, int port, Object &&object) + { + assert(port >= 0 && port < 4); + return downcast(device).m_input_cb[port].set_callback(std::forward(object)); + } + template + static devcb_base &set_output_cb(device_t &device, int port, Object &&object) + { + assert(port >= 0 && port < 4); + return downcast(device).m_output_cb[port].set_callback(std::forward(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") -- cgit v1.2.3