z8: Convert ports to DEVCB (nw)

This commit is contained in:
AJR 2017-06-26 21:41:14 -04:00
parent 23e2d65182
commit 50235ac311
3 changed files with 64 additions and 23 deletions

View File

@ -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();

View File

@ -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 */

View File

@ -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")