kl5c80a12, kl5c80a16: Emulate on-chip parallel ports

* getbass: Add EEPROM for I/O CPU
This commit is contained in:
AJR 2021-02-18 16:57:19 -05:00
parent be97d5438d
commit 214cb32fe7
7 changed files with 437 additions and 138 deletions

View File

@ -14,7 +14,7 @@
USART (KP51) (unemulated)
16-bit timer/counters (KP64, KP63) (KP64 unemulated)
16-level interrupt controller (KP69)
Parallel ports (KP65, KP66) (unemulated)
Parallel ports (KP65, KP66)
512-byte high-speed RAM
External bus interface unit (unemulated)
@ -39,6 +39,16 @@ kl5c80a12_device::kl5c80a12_device(const machine_config &mconfig, const char *ta
address_map_constructor(FUNC(kl5c80a12_device::internal_ram), this),
address_map_constructor(FUNC(kl5c80a12_device::internal_io), this))
, m_kp69(*this, "kp69")
, m_porta_in_callback(*this)
, m_porta_out_callback(*this)
, m_portb_in_callback(*this)
, m_portb_out_callback(*this)
, m_porta_data{0, 0}
, m_porta_direction{0, 0}
, m_porta_3state{0, 0}
, m_portb_data{0, 0, 0}
, m_portb_direction(0)
, m_portb_3state{0, 0, 0}
{
}
@ -61,6 +71,9 @@ void kl5c80a12_device::internal_io(address_map &map)
{
map(0x00, 0x07).mirror(0xff00).rw(FUNC(kl5c80a12_device::mmu_r), FUNC(kl5c80a12_device::mmu_w));
map(0x20, 0x25).mirror(0xff00).rw("timerb", FUNC(kp63_3channel_device::read), FUNC(kp63_3channel_device::write));
map(0x2c, 0x2f).mirror(0xff00).rw(FUNC(kl5c80a12_device::porta_r), FUNC(kl5c80a12_device::porta_w));
map(0x30, 0x32).mirror(0xff00).rw(FUNC(kl5c80a12_device::portb_r), FUNC(kl5c80a12_device::portb_w));
map(0x33, 0x33).mirror(0xff00).rw(FUNC(kl5c80a12_device::portb_control_r), FUNC(kl5c80a12_device::portb_control_w));
map(0x34, 0x34).mirror(0xff00).rw(m_kp69, FUNC(kp69_device::isrl_r), FUNC(kp69_device::lerl_pgrl_w));
map(0x35, 0x35).mirror(0xff00).rw(m_kp69, FUNC(kp69_device::isrh_r), FUNC(kp69_device::lerh_pgrh_w));
map(0x36, 0x36).mirror(0xff00).rw(m_kp69, FUNC(kp69_device::imrl_r), FUNC(kp69_device::imrl_w));
@ -68,6 +81,24 @@ void kl5c80a12_device::internal_io(address_map &map)
}
//-------------------------------------------------
// device_resolve_objects - resolve objects that
// may be needed for other devices to set
// initial conditions at start time
//-------------------------------------------------
void kl5c80a12_device::device_resolve_objects()
{
// Resolve parallel port callbacks
for (int i = 0; i < 2; i++)
m_porta_in_callback[i].resolve_safe(m_porta_3state[i]);
m_porta_out_callback.resolve_all_safe();
for (int i = 0; i < 3; i++)
m_portb_in_callback[i].resolve_safe(m_portb_3state[i]);
m_portb_out_callback.resolve_all_safe();
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@ -77,6 +108,12 @@ void kl5c80a12_device::device_start()
kc82_device::device_start();
m_kp69->add_to_state(*this, KP69_IRR);
// Register save state
save_item(NAME(m_porta_data));
save_item(NAME(m_porta_direction));
save_item(NAME(m_portb_data));
save_item(NAME(m_portb_direction));
}
@ -87,6 +124,18 @@ void kl5c80a12_device::device_start()
void kl5c80a12_device::device_reset()
{
kc82_device::device_reset();
// Reset parallel port registers
std::fill(std::begin(m_porta_data), std::end(m_porta_data), 0x00);
std::fill(std::begin(m_porta_direction), std::end(m_porta_direction), 0x00);
std::fill(std::begin(m_portb_data), std::end(m_portb_data), 0x00);
m_portb_direction = 0x00;
// Reset parallel port outputs
for (int i = 0; i < 2; i++)
m_porta_out_callback[i](0, m_porta_3state[i], 0x00);
for (int i = 0; i < 3; i++)
m_portb_out_callback[i](0, m_portb_3state[i], 0x00);
}
@ -117,3 +166,160 @@ void kl5c80a12_device::device_config_complete()
{
set_daisy_config(pseudo_daisy_config);
}
//**************************************************************************
// KP65 PARALLEL PORT
//**************************************************************************
//-------------------------------------------------
// porta_r - read from parallel port A data or
// direction register
//-------------------------------------------------
u8 kl5c80a12_device::porta_r(offs_t offset)
{
const unsigned n = offset >> 1;
if (BIT(offset, 0))
return m_porta_direction[n];
else
{
u8 data = m_porta_data[n];
const u8 dir = m_porta_direction[n];
if (dir != 0xff)
data = (data & dir) | (m_porta_in_callback[n](0, u8(~dir)) & ~dir);
return data;
}
}
//-------------------------------------------------
// porta_w - write to parallel port A data or
// direction register
//-------------------------------------------------
void kl5c80a12_device::porta_w(offs_t offset, u8 data)
{
const unsigned n = offset >> 1;
u8 dir = m_porta_direction[n];
if (BIT(offset, 0))
{
if (dir == data)
return;
m_porta_direction[n] = dir = data;
data = m_porta_data[n];
}
else
{
u8 old_data = std::exchange(m_porta_data[n], data);
if (((old_data ^ data) & dir) == 0)
return;
}
// Update port output
m_porta_out_callback[n](0, (data & dir) | (m_porta_3state[n] & ~dir), dir);
}
//**************************************************************************
// KP66 PARALLEL PORT
//**************************************************************************
//-------------------------------------------------
// portb_r - read from parallel port B data
// register
//-------------------------------------------------
u8 kl5c80a12_device::portb_r(offs_t offset)
{
u8 data = m_portb_data[offset];
const u8 dir = std::array<u8, 4>{{0x00, 0x0f, 0xf0, 0xff}}[BIT(m_portb_direction, offset * 2, 2)];
if (dir != 0xff)
data = (data & dir) | (m_portb_in_callback[offset](0, u8(~dir)) & ~dir);
return data;
}
//-------------------------------------------------
// portb_update_output - update output for one
// port in parallel port B
//-------------------------------------------------
void kl5c80a12_device::portb_update_output(unsigned n)
{
const u8 dir = std::array<u8, 4>{{0x00, 0x0f, 0xf0, 0xff}}[BIT(m_portb_direction, n * 2, 2)];
m_portb_out_callback[n](0, (m_portb_data[n] & dir) | (m_portb_3state[n] & ~dir), dir);
}
//-------------------------------------------------
// portb_w - write to parallel port B data
// register
//-------------------------------------------------
void kl5c80a12_device::portb_w(offs_t offset, u8 data)
{
const u8 old_data = std::exchange(m_portb_data[offset], data);
const u8 dir = std::array<u8, 4>{{0x00, 0x0f, 0xf0, 0xff}}[BIT(m_portb_direction, offset * 2, 2)];
if (((old_data ^ data) & dir) != 0)
portb_update_output(offset);
}
//-------------------------------------------------
// portb_control_r - read from parallel port B
// direction register
//-------------------------------------------------
u8 kl5c80a12_device::portb_control_r()
{
return m_portb_direction;
}
//-------------------------------------------------
// portb_control_w - write to parallel port B
// direction register or bit command
//-------------------------------------------------
void kl5c80a12_device::portb_control_w(u8 data)
{
if ((data & 0xc0) == 0xc0)
{
// Bit set/reset command
const unsigned b = BIT(data, 1, 3);
const unsigned n = BIT(data, 4, 2);
if (n < 3)
{
if (BIT(m_portb_data[n], b) != BIT(data, 0))
{
m_portb_data[n] ^= 1 << b;
if (BIT(m_portb_direction, n * 2 + (b < 4 ? 0 : 1)))
portb_update_output(n);
}
}
else
{
if ((data & 0x0d) == 0x0d)
logerror("%s: Attempt to set bit %d in port B direction register\n", machine().describe_context(), BIT(data, 1, 3));
else if (BIT(m_portb_direction, b) != BIT(data, 0))
{
m_portb_direction ^= 1 << b;
portb_update_output(b >> 1);
}
}
}
else if ((data & 0xc0) == 0)
{
// Write direction register
const u8 old_dir = std::exchange(m_portb_direction, data);
if (((data ^ old_dir) & 0x03) != 0)
portb_update_output(0);
if (((data ^ old_dir) & 0x0c) != 0)
portb_update_output(1);
if (((data ^ old_dir) & 0x30) != 0)
portb_update_output(2);
}
else
logerror("%s: Writing %02X to port B command register\n", machine().describe_context(), data);
}

View File

@ -30,10 +30,30 @@ public:
// device type constructor
kl5c80a12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// callback configuration
auto in_p0_callback() { return m_porta_in_callback[0].bind(); }
auto out_p0_callback() { return m_porta_out_callback[0].bind(); }
auto in_p1_callback() { return m_porta_in_callback[1].bind(); }
auto out_p1_callback() { return m_porta_out_callback[1].bind(); }
auto in_p2_callback() { return m_portb_in_callback[0].bind(); }
auto out_p2_callback() { return m_portb_out_callback[0].bind(); }
auto in_p3_callback() { return m_portb_in_callback[1].bind(); }
auto out_p3_callback() { return m_portb_out_callback[1].bind(); }
auto in_p4_callback() { return m_portb_in_callback[2].bind(); }
auto out_p4_callback() { return m_portb_out_callback[2].bind(); }
// misc. configuration
void set_p0_3state(u8 value) { m_porta_3state[0] = value; }
void set_p1_3state(u8 value) { m_porta_3state[1] = value; }
void set_p2_3state(u8 value) { m_portb_3state[0] = value; }
void set_p3_3state(u8 value) { m_portb_3state[1] = value; }
void set_p4_3state(u8 value) { m_portb_3state[2] = value; }
protected:
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_config_complete() override;
virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
@ -42,12 +62,39 @@ protected:
virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 2); }
private:
// internal I/O handlers
u8 porta_r(offs_t offset);
void porta_w(offs_t offset, u8 data);
u8 portb_r(offs_t offset);
void portb_w(offs_t offset, u8 data);
u8 portb_control_r();
void portb_control_w(u8 data);
// internal helpers
void portb_update_output(unsigned n);
// internal address maps
void internal_ram(address_map &map);
void internal_io(address_map &map);
// subdevice finders
required_device<kp69_device> m_kp69;
// callback objects
devcb_read8::array<2> m_porta_in_callback;
devcb_write8::array<2> m_porta_out_callback;
devcb_read8::array<3> m_portb_in_callback;
devcb_write8::array<3> m_portb_out_callback;
// parallel port A state
u8 m_porta_data[2];
u8 m_porta_direction[2];
u8 m_porta_3state[2];
// parallel port B state
u8 m_portb_data[3];
u8 m_portb_direction;
u8 m_portb_3state[3];
};

View File

@ -11,7 +11,7 @@
Synchronous serial port (KP62) (unemulated)
16-bit timer/counters (KP63A)
16-level interrupt controller (KP69)
Parallel ports (KP67) (unemulated)
Parallel ports (KP67)
External bus/DRAM interface unit (unemulated)
***************************************************************************/
@ -35,6 +35,11 @@ kl5c80a16_device::kl5c80a16_device(const machine_config &mconfig, const char *ta
address_map_constructor(),
address_map_constructor(FUNC(kl5c80a16_device::internal_io), this))
, m_kp69(*this, "kp69")
, m_port_in_callback(*this)
, m_port_out_callback(*this)
, m_port_data{0, 0, 0, 0}
, m_port_direction{0x0f, 0, 0, 0}
, m_port_3state{0, 0, 0, 0}
{
}
@ -51,6 +56,22 @@ void kl5c80a16_device::internal_io(address_map &map)
map(0x35, 0x35).mirror(0xff00).rw(m_kp69, FUNC(kp69_device::isrh_r), FUNC(kp69_device::lerh_pgrh_w));
map(0x36, 0x36).mirror(0xff00).rw(m_kp69, FUNC(kp69_device::imrl_r), FUNC(kp69_device::imrl_w));
map(0x37, 0x37).mirror(0xff00).rw(m_kp69, FUNC(kp69_device::imrh_r), FUNC(kp69_device::ivr_imrh_w));
map(0x38, 0x3f).mirror(0xff00).rw(FUNC(kl5c80a16_device::port_r), FUNC(kl5c80a16_device::port_w));
}
//-------------------------------------------------
// device_resolve_objects - resolve objects that
// may be needed for other devices to set
// initial conditions at start time
//-------------------------------------------------
void kl5c80a16_device::device_resolve_objects()
{
// Resolve parallel port callbacks
for (int i = 0; i < 4; i++)
m_port_in_callback[i].resolve_safe(m_port_3state[i]);
m_port_out_callback.resolve_all_safe();
}
@ -63,6 +84,10 @@ void kl5c80a16_device::device_start()
kc82_device::device_start();
m_kp69->add_to_state(*this, KP69_IRR);
// Register save state
save_item(NAME(m_port_data));
save_item(NAME(m_port_direction));
}
@ -73,6 +98,14 @@ void kl5c80a16_device::device_start()
void kl5c80a16_device::device_reset()
{
kc82_device::device_reset();
// Reset parallel port registers (Port 0 direction is fixed to upper 4 bits input & lower 4 bits output)
std::fill(std::begin(m_port_data), std::end(m_port_data), 0x00);
std::fill(std::begin(m_port_direction) + 1, std::end(m_port_direction), 0x00);
// Reset parallel port outputs
for (int i = 1; i < 4; i++)
m_port_out_callback[i](0, m_port_3state[i] & ~m_port_direction[i], m_port_direction[i]);
}
@ -104,3 +137,67 @@ void kl5c80a16_device::device_config_complete()
{
set_daisy_config(pseudo_daisy_config);
}
//**************************************************************************
// KP67 PARALLEL PORT
//**************************************************************************
//-------------------------------------------------
// port_r - read from parallel port data or
// direction register
//-------------------------------------------------
u8 kl5c80a16_device::port_r(offs_t offset)
{
if (BIT(offset, 0))
return m_port_direction[offset >> 1];
else
{
u8 data = m_port_data[offset >> 1];
const u8 dir = m_port_direction[offset >> 1];
if (dir != 0xff)
data = (data & dir) | (m_port_in_callback[offset >> 1](0, u8(~dir)) & ~dir);
return data;
}
}
//-------------------------------------------------
// port_w - write to parallel port data or
// direction register or bit control
//-------------------------------------------------
void kl5c80a16_device::port_w(offs_t offset, u8 data)
{
unsigned p = offset >> 1;
u8 dir = m_port_direction[p];
if (offset == 1)
{
// Bit set/reset command
const unsigned b = BIT(data, 1, 3);
p = BIT(data, 4, 2);
if (BIT(m_port_data[p], b) == BIT(data, 0))
return;
data = (m_port_data[p] ^= 1 << b);
dir = m_port_direction[p];
if (!BIT(dir, b))
return;
}
else if (BIT(offset, 0))
{
if (dir == data)
return;
m_port_direction[p] = dir = data;
data = m_port_data[p];
}
else
{
u8 old_data = std::exchange(m_port_data[p], data);
if (((old_data ^ data) & dir) == 0)
return;
}
// Update port output
m_port_out_callback[offset >> 1](0, (data & dir) | (m_port_3state[offset >> 1] & ~dir), dir);
}

View File

@ -30,10 +30,27 @@ public:
// device type constructor
kl5c80a16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// callback configuration
auto in_p0_callback() { return m_port_in_callback[0].bind(); }
auto out_p0_callback() { return m_port_out_callback[0].bind(); }
auto in_p1_callback() { return m_port_in_callback[1].bind(); }
auto out_p1_callback() { return m_port_out_callback[1].bind(); }
auto in_p2_callback() { return m_port_in_callback[2].bind(); }
auto out_p2_callback() { return m_port_out_callback[2].bind(); }
auto in_p3_callback() { return m_port_in_callback[3].bind(); }
auto out_p3_callback() { return m_port_out_callback[3].bind(); }
// misc. configuration
void set_p0_3state(u8 value) { m_port_3state[0] = value; }
void set_p1_3state(u8 value) { m_port_3state[1] = value; }
void set_p2_3state(u8 value) { m_port_3state[2] = value; }
void set_p3_3state(u8 value) { m_port_3state[3] = value; }
protected:
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_config_complete() override;
virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
@ -42,11 +59,24 @@ protected:
virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 2); }
private:
// internal I/O handlers
u8 port_r(offs_t offset);
void port_w(offs_t offset, u8 data);
// internal address map
void internal_io(address_map &map);
// subdevice finders
required_device<kp69_device> m_kp69;
// callback objects
devcb_read8::array<4> m_port_in_callback;
devcb_write8::array<4> m_port_out_callback;
// parallel port state
u8 m_port_data[4];
u8 m_port_direction[4];
u8 m_port_3state[4];
};

View File

@ -2867,11 +2867,6 @@ uint8_t ddenlovr_state::hanakanz_rand_r()
void hanakanz_state::hanakanz_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(hanakanz_state::hanakanz_busy_r), FUNC(hanakanz_state::hanakanz_oki_bank_w));
map(0x2e, 0x2e).w(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
map(0x30, 0x30).w(FUNC(hanakanz_state::hanakanz_rombank_w));
map(0x31, 0x31).w(FUNC(hanakanz_state::hanakanz_dsw_w));
map(0x32, 0x32).r(FUNC(hanakanz_state::hanakanz_dsw_r));
map(0x80, 0x80).w(FUNC(hanakanz_state::hanakanz_blitter_data_w));
map(0x81, 0x81).w(FUNC(hanakanz_state::hanakanz_palette_w));
map(0x83, 0x84).r(FUNC(hanakanz_state::hanakanz_gfxrom_r));
@ -2889,11 +2884,6 @@ void hanakanz_state::hanakanz_portmap(address_map &map)
void hanakanz_state::hkagerou_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(hanakanz_state::hanakanz_busy_r), FUNC(hanakanz_state::hanakanz_oki_bank_w));
map(0x2e, 0x2e).w(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
map(0x30, 0x30).w(FUNC(hanakanz_state::hanakanz_rombank_w));
map(0x31, 0x31).w(FUNC(hanakanz_state::hanakanz_dsw_w));
map(0x32, 0x32).r(FUNC(hanakanz_state::hanakanz_dsw_r));
map(0x80, 0x80).w(FUNC(hanakanz_state::hanakanz_blitter_data_w));
map(0x81, 0x81).w(FUNC(hanakanz_state::hanakanz_palette_w));
map(0x83, 0x84).r(FUNC(hanakanz_state::hanakanz_gfxrom_r));
@ -2912,11 +2902,6 @@ void hanakanz_state::hkagerou_portmap(address_map &map)
void hanakanz_state::kotbinyo_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(hanakanz_state::hanakanz_busy_r), FUNC(hanakanz_state::hanakanz_oki_bank_w));
map(0x2e, 0x2e).w(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
map(0x30, 0x30).w(FUNC(hanakanz_state::hanakanz_rombank_w));
map(0x31, 0x31).w(FUNC(hanakanz_state::hanakanz_dsw_w));
map(0x32, 0x32).r(FUNC(hanakanz_state::hanakanz_dsw_r));
map(0x80, 0x80).w(FUNC(hanakanz_state::hanakanz_blitter_data_w));
map(0x81, 0x81).w(FUNC(hanakanz_state::hanakanz_palette_w));
map(0x83, 0x84).r(FUNC(hanakanz_state::hanakanz_gfxrom_r));
@ -2937,11 +2922,6 @@ void hanakanz_state::kotbinyo_portmap(address_map &map)
void hanakanz_state::kotbinsp_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(hanakanz_state::hanakanz_busy_r), FUNC(hanakanz_state::hanakanz_oki_bank_w));
map(0x2e, 0x2e).w(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
map(0x30, 0x30).w(FUNC(hanakanz_state::hanakanz_rombank_w));
map(0x31, 0x31).w(FUNC(hanakanz_state::hanakanz_dsw_w));
map(0x32, 0x32).r(FUNC(hanakanz_state::hanakanz_dsw_r));
map(0x80, 0x80).w(FUNC(hanakanz_state::hanakanz_blitter_data_w));
map(0x81, 0x81).w(FUNC(hanakanz_state::hanakanz_palette_w));
map(0x83, 0x84).r(FUNC(hanakanz_state::hanakanz_gfxrom_r));
@ -2971,11 +2951,6 @@ uint8_t hanakanz_state::mjreach1_protection_r()
void hanakanz_state::mjreach1_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(hanakanz_state::hanakanz_busy_r), FUNC(hanakanz_state::hanakanz_oki_bank_w));
map(0x2e, 0x2e).w(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
map(0x30, 0x30).w(FUNC(hanakanz_state::hanakanz_rombank_w));
map(0x31, 0x31).w(FUNC(hanakanz_state::hanakanz_dsw_w));
map(0x32, 0x32).r(FUNC(hanakanz_state::hanakanz_dsw_r));
map(0x80, 0x80).w(FUNC(hanakanz_state::hanakanz_blitter_data_w));
map(0x81, 0x81).w(FUNC(hanakanz_state::hanakanz_palette_w));
map(0x83, 0x84).r(FUNC(hanakanz_state::hanakanz_gfxrom_r));
@ -3966,11 +3941,6 @@ uint8_t hanakanz_state::jongtei_busy_r()
void hanakanz_state::jongtei_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(hanakanz_state::jongtei_busy_r), FUNC(hanakanz_state::jongtei_okibank_w));
map(0x2e, 0x2e).w(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
map(0x30, 0x30).w(FUNC(hanakanz_state::hanakanz_rombank_w));
map(0x31, 0x31).w(FUNC(hanakanz_state::jongtei_dsw_keyb_w));
map(0x32, 0x32).r(FUNC(hanakanz_state::hanakanz_dsw_r));
map(0x40, 0x40).portr("SYSTEM");
map(0x41, 0x42).r(FUNC(hanakanz_state::hanakanz_keyb_r));
map(0x43, 0x43).w(FUNC(hanakanz_state::hanakanz_coincounter_w));
@ -4023,11 +3993,6 @@ uint8_t hanakanz_state::mjgnight_protection_r()
void hanakanz_state::mjgnight_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(hanakanz_state::jongtei_busy_r), FUNC(hanakanz_state::jongtei_okibank_w));
map(0x2e, 0x2e).w(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
map(0x30, 0x30).w(FUNC(hanakanz_state::hanakanz_rombank_w));
map(0x31, 0x31).w(FUNC(hanakanz_state::jongtei_dsw_keyb_w));
map(0x32, 0x32).r(FUNC(hanakanz_state::hanakanz_dsw_r));
map(0x40, 0x40).portr("SYSTEM");
map(0x41, 0x42).r(FUNC(hanakanz_state::hanakanz_keyb_r));
map(0x46, 0x46).w(FUNC(hanakanz_state::mjgnight_coincounter_w));
@ -4600,11 +4565,6 @@ uint8_t hanakanz_state::daimyojn_year_hack_r(offs_t offset)
void hanakanz_state::daimyojn_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(hanakanz_state::jongtei_busy_r), FUNC(hanakanz_state::daimyojn_okibank_w));
map(0x2e, 0x2e).w(FUNC(hanakanz_state::daimyojn_palette_sel_w));
map(0x30, 0x30).w(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
map(0x31, 0x31).w(FUNC(hanakanz_state::jongtei_dsw_keyb_w));
map(0x32, 0x32).r(FUNC(hanakanz_state::hanakanz_dsw_r));
map(0x40, 0x40).w(FUNC(hanakanz_state::daimyojn_blitter_data_palette_w));
map(0x42, 0x44).r(FUNC(hanakanz_state::hanakanz_gfxrom_r));
map(0x80, 0x8f).rw("rtc", FUNC(msm6242_device::read), FUNC(msm6242_device::write));
@ -10092,9 +10052,15 @@ void mmpanic_state::mmpanic(machine_config &config)
void hanakanz_state::hanakanz(machine_config &config)
{
/* basic machine hardware */
KL5C80A12(config, m_maincpu, 20'000'000); // KL5C80A12
m_maincpu->set_addrmap(AS_PROGRAM, &hanakanz_state::hanakanz_map);
m_maincpu->set_addrmap(AS_IO, &hanakanz_state::hanakanz_portmap);
kl5c80a12_device &maincpu(KL5C80A12(config, m_maincpu, 20'000'000));
maincpu.set_addrmap(AS_PROGRAM, &hanakanz_state::hanakanz_map);
maincpu.set_addrmap(AS_IO, &hanakanz_state::hanakanz_portmap);
maincpu.in_p0_callback().set(FUNC(hanakanz_state::hanakanz_busy_r));
maincpu.out_p0_callback().set(FUNC(hanakanz_state::hanakanz_oki_bank_w));
maincpu.out_p1_callback().set(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
maincpu.out_p2_callback().set(FUNC(hanakanz_state::hanakanz_rombank_w));
maincpu.out_p3_callback().set(FUNC(hanakanz_state::hanakanz_dsw_w));
maincpu.in_p4_callback().set(FUNC(hanakanz_state::hanakanz_dsw_r));
MCFG_MACHINE_START_OVERRIDE(hanakanz_state,hanakanz)
MCFG_MACHINE_RESET_OVERRIDE(hanakanz_state,hanakanz)
@ -10137,9 +10103,15 @@ void hanakanz_state::hkagerou(machine_config &config)
void hanakanz_state::kotbinyo(machine_config &config)
{
/* basic machine hardware */
KL5C80A12(config, m_maincpu, XTAL(20'000'000)); // !! KL5C80A12CFP @ 10MHz? (actually 4 times faster than Z80) !!
m_maincpu->set_addrmap(AS_PROGRAM, &hanakanz_state::hanakanz_map);
m_maincpu->set_addrmap(AS_IO, &hanakanz_state::kotbinyo_portmap);
kl5c80a12_device &maincpu(KL5C80A12(config, m_maincpu, XTAL(20'000'000))); // !! KL5C80A12CFP @ 10MHz? (actually 4 times faster than Z80) !!
maincpu.set_addrmap(AS_PROGRAM, &hanakanz_state::hanakanz_map);
maincpu.set_addrmap(AS_IO, &hanakanz_state::kotbinyo_portmap);
maincpu.in_p0_callback().set(FUNC(hanakanz_state::hanakanz_busy_r));
maincpu.out_p0_callback().set(FUNC(hanakanz_state::hanakanz_oki_bank_w));
maincpu.out_p1_callback().set(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
maincpu.out_p2_callback().set(FUNC(hanakanz_state::hanakanz_rombank_w));
maincpu.out_p3_callback().set(FUNC(hanakanz_state::hanakanz_dsw_w));
maincpu.in_p4_callback().set(FUNC(hanakanz_state::hanakanz_dsw_r));
MCFG_MACHINE_START_OVERRIDE(hanakanz_state,hanakanz)
MCFG_MACHINE_RESET_OVERRIDE(hanakanz_state,hanakanz)
@ -10540,9 +10512,15 @@ void ddenlovr_state::hparadis(machine_config &config)
void hanakanz_state::jongtei(machine_config &config)
{
/* basic machine hardware */
KL5C80A12(config, m_maincpu, XTAL(20'000'000)); // KL5C80A12
m_maincpu->set_addrmap(AS_PROGRAM, &hanakanz_state::hanakanz_map);
m_maincpu->set_addrmap(AS_IO, &hanakanz_state::jongtei_portmap);
kl5c80a12_device &maincpu(KL5C80A12(config, m_maincpu, XTAL(20'000'000)));
maincpu.set_addrmap(AS_PROGRAM, &hanakanz_state::hanakanz_map);
maincpu.set_addrmap(AS_IO, &hanakanz_state::jongtei_portmap);
maincpu.in_p0_callback().set(FUNC(hanakanz_state::jongtei_busy_r));
maincpu.out_p0_callback().set(FUNC(hanakanz_state::jongtei_okibank_w));
maincpu.out_p1_callback().set(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
maincpu.out_p2_callback().set(FUNC(hanakanz_state::hanakanz_rombank_w));
maincpu.out_p3_callback().set(FUNC(hanakanz_state::jongtei_dsw_keyb_w));
maincpu.in_p4_callback().set(FUNC(hanakanz_state::hanakanz_dsw_r));
MCFG_MACHINE_START_OVERRIDE(hanakanz_state,hanakanz)
MCFG_MACHINE_RESET_OVERRIDE(hanakanz_state,hanakanz)
@ -10754,9 +10732,15 @@ void ddenlovr_state::seljan2(machine_config &config)
void hanakanz_state::daimyojn(machine_config &config)
{
/* basic machine hardware */
KL5C80A12(config, m_maincpu, XTAL(20'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &hanakanz_state::hanakanz_map);
m_maincpu->set_addrmap(AS_IO, &hanakanz_state::daimyojn_portmap);
kl5c80a12_device &maincpu(KL5C80A12(config, m_maincpu, XTAL(20'000'000)));
maincpu.set_addrmap(AS_PROGRAM, &hanakanz_state::hanakanz_map);
maincpu.set_addrmap(AS_IO, &hanakanz_state::daimyojn_portmap);
maincpu.in_p0_callback().set(FUNC(hanakanz_state::jongtei_busy_r));
maincpu.out_p0_callback().set(FUNC(hanakanz_state::daimyojn_okibank_w));
maincpu.out_p1_callback().set(FUNC(hanakanz_state::daimyojn_palette_sel_w));
maincpu.out_p2_callback().set(FUNC(hanakanz_state::hanakanz_blitter_reg_w));
maincpu.out_p3_callback().set(FUNC(hanakanz_state::jongtei_dsw_keyb_w));
maincpu.in_p4_callback().set(FUNC(hanakanz_state::hanakanz_dsw_r));
MCFG_MACHINE_START_OVERRIDE(hanakanz_state,mjflove)
MCFG_MACHINE_RESET_OVERRIDE(hanakanz_state,hanakanz)

View File

@ -6140,6 +6140,7 @@ void model3_state::getbass_iocpu_mem(address_map &map)
void model3_state::getbass_iocpu_io(address_map &map)
{
map.global_mask(0xff);
//map(0x40, 0x47).w("iodac", FUNC(ad7805_device::write8));
map(0x60, 0x6f).rw("io60", FUNC(sega_315_5296_device::read), FUNC(sega_315_5296_device::write));
map(0x70, 0x7f).rw("io70", FUNC(sega_315_5649_device::read), FUNC(sega_315_5649_device::write));
}
@ -6151,9 +6152,17 @@ void model3_state::getbass(machine_config &config)
kl5c80a16_device &iocpu(KL5C80A16(config, "iocpu", 32_MHz_XTAL / 2));
iocpu.set_addrmap(AS_PROGRAM, &model3_state::getbass_iocpu_mem);
iocpu.set_addrmap(AS_IO, &model3_state::getbass_iocpu_io);
iocpu.in_p2_callback().set("ioeeprom", FUNC(eeprom_serial_93cxx_device::do_read)).lshift(3);
iocpu.out_p2_callback().set("ioeeprom", FUNC(eeprom_serial_93cxx_device::di_write)).bit(4);
iocpu.out_p2_callback().set("ioeeprom", FUNC(eeprom_serial_93cxx_device::clk_write)).bit(5);
iocpu.out_p2_callback().set("ioeeprom", FUNC(eeprom_serial_93cxx_device::cs_write)).bit(6);
SEGA_315_5296(config, "io60", 32_MHz_XTAL);
SEGA_315_5649(config, "io70", 0);
EEPROM_93C46_16BIT(config, "ioeeprom"); // AK93C45
//AD7805(config, "iodac");
}
void model3_state::model3_15(machine_config &config)

View File

@ -310,9 +310,7 @@ private:
TIMER_DEVICE_CALLBACK_MEMBER(gocowboy_int);
TIMER_DEVICE_CALLBACK_MEMBER(timer_1khz);
uint8_t coin_counter_r();
void coin_counter_w(uint8_t data);
uint8_t leds_r();
void leds_w(uint8_t data);
void hopper_w(uint8_t data);
uint8_t coin_hopper_r();
@ -330,12 +328,8 @@ private:
void animalc_map(address_map &map);
void gocowboy_io(address_map &map);
void gocowboy_map(address_map &map);
void haekaka_io(address_map &map);
void haekaka_map(address_map &map);
void itazuram_io(address_map &map);
void itazuram_map(address_map &map);
void pyenaget_io(address_map &map);
void tdoboon_io(address_map &map);
void tdoboon_map(address_map &map);
// Required devices
@ -968,10 +962,6 @@ void sammymdl_state::show_3_outputs()
#endif
}
// Port 31
uint8_t sammymdl_state::coin_counter_r()
{
return m_out[0];
}
void sammymdl_state::coin_counter_w(uint8_t data)
{
machine().bookkeeping().coin_counter_w(0, data & 0x01 ); // coin1 in
@ -989,10 +979,6 @@ void sammymdl_state::coin_counter_w(uint8_t data)
}
// Port 32
uint8_t sammymdl_state::leds_r()
{
return m_out[1];
}
void sammymdl_state::leds_w(uint8_t data)
{
m_leds[0] = BIT(data, 0); // button
@ -1039,11 +1025,6 @@ void sammymdl_state::animalc_map(address_map &map)
void sammymdl_state::animalc_io(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(sammymdl_state::eeprom_r), FUNC(sammymdl_state::eeprom_w));
map(0x2e, 0x2e).r(FUNC(sammymdl_state::coin_hopper_r));
map(0x30, 0x30).portr("BUTTON");
map(0x31, 0x31).rw(FUNC(sammymdl_state::coin_counter_r), FUNC(sammymdl_state::coin_counter_w));
map(0x32, 0x32).rw(FUNC(sammymdl_state::leds_r), FUNC(sammymdl_state::leds_w));
map(0x90, 0x90).w("oki", FUNC(okim9810_device::write));
map(0x91, 0x91).w("oki", FUNC(okim9810_device::tmp_register_w));
map(0x92, 0x92).r("oki", FUNC(okim9810_device::read));
@ -1085,11 +1066,6 @@ void sammymdl_state::gocowboy_leds_w(uint8_t data)
void sammymdl_state::gocowboy_io(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(sammymdl_state::eeprom_r), FUNC(sammymdl_state::eeprom_w));
map(0x2e, 0x2e).r(FUNC(sammymdl_state::coin_hopper_r));
map(0x30, 0x30).portr("BUTTON");
map(0x31, 0x31).rw(FUNC(sammymdl_state::coin_counter_r), FUNC(sammymdl_state::coin_counter_w));
map(0x32, 0x32).rw(FUNC(sammymdl_state::leds_r), FUNC(sammymdl_state::gocowboy_leds_w));
map(0x90, 0x90).rw("oki", FUNC(okim9810_device::read), FUNC(okim9810_device::write));
map(0x91, 0x91).w("oki", FUNC(okim9810_device::tmp_register_w));
map(0x92, 0x92).r("oki", FUNC(okim9810_device::read));
@ -1145,21 +1121,6 @@ void sammymdl_state::haekaka_map(address_map &map)
map(0x73013, 0x73013).r(FUNC(sammymdl_state::haekaka_vblank_r));
}
void sammymdl_state::haekaka_io(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(sammymdl_state::eeprom_r), FUNC(sammymdl_state::eeprom_w));
map(0x2e, 0x2e).r(FUNC(sammymdl_state::coin_hopper_r));
map(0x30, 0x30).portr("BUTTON");
map(0x31, 0x31).rw(FUNC(sammymdl_state::coin_counter_r), FUNC(sammymdl_state::haekaka_coin_counter_w));
map(0x32, 0x32).rw(FUNC(sammymdl_state::leds_r), FUNC(sammymdl_state::haekaka_leds_w));
map(0x90, 0x90).w("oki", FUNC(okim9810_device::write));
map(0x91, 0x91).w("oki", FUNC(okim9810_device::tmp_register_w));
map(0x92, 0x92).r("oki", FUNC(okim9810_device::read));
map(0xb0, 0xb0).w(FUNC(sammymdl_state::hopper_w));
map(0xc0, 0xc0).w("watchdog", FUNC(watchdog_timer_device::reset_w)); // 1
}
/***************************************************************************
Itazura Monkey
***************************************************************************/
@ -1177,31 +1138,6 @@ void sammymdl_state::itazuram_map(address_map &map)
map(0x73013, 0x73013).r(FUNC(sammymdl_state::haekaka_vblank_r)).nopw(); // IRQ Ack?
}
void sammymdl_state::itazuram_io(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(sammymdl_state::eeprom_r), FUNC(sammymdl_state::eeprom_w));
map(0x2e, 0x2e).r(FUNC(sammymdl_state::coin_hopper_r));
map(0x30, 0x30).portr("BUTTON");
map(0x31, 0x31).rw(FUNC(sammymdl_state::coin_counter_r), FUNC(sammymdl_state::coin_counter_w));
map(0x32, 0x32).rw(FUNC(sammymdl_state::leds_r), FUNC(sammymdl_state::leds_w));
map(0x90, 0x90).w("oki", FUNC(okim9810_device::write));
map(0x91, 0x91).w("oki", FUNC(okim9810_device::tmp_register_w));
map(0x92, 0x92).r("oki", FUNC(okim9810_device::read));
map(0xb0, 0xb0).w(FUNC(sammymdl_state::hopper_w));
map(0xc0, 0xc0).w("watchdog", FUNC(watchdog_timer_device::reset_w)); // 1
}
/***************************************************************************
Pye-nage Taikai
***************************************************************************/
void sammymdl_state::pyenaget_io(address_map &map)
{
haekaka_io(map);
map(0x31, 0x31).rw(FUNC(sammymdl_state::coin_counter_r), FUNC(sammymdl_state::coin_counter_w));
}
/***************************************************************************
Taihou de Doboon
***************************************************************************/
@ -1218,21 +1154,6 @@ void sammymdl_state::tdoboon_map(address_map &map)
map(0x73013, 0x73013).r(FUNC(sammymdl_state::haekaka_vblank_r));
}
void sammymdl_state::tdoboon_io(address_map &map)
{
map.global_mask(0xff);
map(0x2c, 0x2c).rw(FUNC(sammymdl_state::eeprom_r), FUNC(sammymdl_state::eeprom_w));
map(0x2e, 0x2e).r(FUNC(sammymdl_state::coin_hopper_r));
map(0x30, 0x30).portr("BUTTON");
map(0x31, 0x31).rw(FUNC(sammymdl_state::coin_counter_r), FUNC(sammymdl_state::coin_counter_w));
map(0x32, 0x32).rw(FUNC(sammymdl_state::leds_r), FUNC(sammymdl_state::leds_w));
map(0x90, 0x90).w("oki", FUNC(okim9810_device::write));
map(0x91, 0x91).w("oki", FUNC(okim9810_device::tmp_register_w));
map(0x92, 0x92).r("oki", FUNC(okim9810_device::read));
map(0xb0, 0xb0).w(FUNC(sammymdl_state::hopper_w));
map(0xc0, 0xc0).w("watchdog", FUNC(watchdog_timer_device::reset_w)); // 1
}
/***************************************************************************
@ -1660,6 +1581,12 @@ void sammymdl_state::sammymdl(machine_config &config)
KL5C80A12(config, m_maincpu, XTAL(20'000'000)); // !! KL5C80A12CFP @ 10MHz? (actually 4 times faster than Z80) !!
m_maincpu->set_addrmap(AS_PROGRAM, &sammymdl_state::animalc_map);
m_maincpu->set_addrmap(AS_IO, &sammymdl_state::animalc_io);
m_maincpu->in_p0_callback().set(FUNC(sammymdl_state::eeprom_r));
m_maincpu->out_p0_callback().set(FUNC(sammymdl_state::eeprom_w));
m_maincpu->in_p1_callback().set(FUNC(sammymdl_state::coin_hopper_r));
m_maincpu->in_p2_callback().set_ioport("BUTTON");
m_maincpu->out_p3_callback().set(FUNC(sammymdl_state::coin_counter_w));
m_maincpu->out_p4_callback().set(FUNC(sammymdl_state::leds_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // battery backed RAM
EEPROM_93C46_8BIT(config, "eeprom");
@ -1698,7 +1625,6 @@ void sammymdl_state::animalc(machine_config &config)
sammymdl(config);
m_maincpu->set_addrmap(AS_PROGRAM, &sammymdl_state::animalc_map);
m_maincpu->set_addrmap(AS_IO, &sammymdl_state::animalc_io);
}
void sammymdl_state::gocowboy(machine_config &config)
@ -1707,6 +1633,7 @@ void sammymdl_state::gocowboy(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &sammymdl_state::gocowboy_map);
m_maincpu->set_addrmap(AS_IO, &sammymdl_state::gocowboy_io);
m_maincpu->out_p4_callback().set(FUNC(sammymdl_state::gocowboy_leds_w));
TIMER(config, "scantimer").configure_scanline(FUNC(sammymdl_state::gocowboy_int), "screen", 0, 1);
TIMER(config, "1khztimer").configure_periodic(FUNC(sammymdl_state::timer_1khz), attotime::from_msec(1));
@ -1723,7 +1650,8 @@ void sammymdl_state::haekaka(machine_config &config)
sammymdl(config);
m_maincpu->set_addrmap(AS_PROGRAM, &sammymdl_state::haekaka_map);
m_maincpu->set_addrmap(AS_IO, &sammymdl_state::haekaka_io);
m_maincpu->out_p3_callback().set(FUNC(sammymdl_state::haekaka_coin_counter_w));
m_maincpu->out_p4_callback().set(FUNC(sammymdl_state::haekaka_leds_w));
m_screen->screen_vblank().set(m_kp69, FUNC(kp69_device::ir_w<2>));
}
@ -1736,7 +1664,6 @@ void sammymdl_state::itazuram(machine_config &config)
TIMER(config, "1khztimer").configure_periodic(FUNC(sammymdl_state::timer_1khz), attotime::from_msec(1));
m_maincpu->set_addrmap(AS_PROGRAM, &sammymdl_state::itazuram_map);
m_maincpu->set_addrmap(AS_IO, &sammymdl_state::itazuram_io);
m_screen->screen_vblank().set_nop();
}
@ -1746,7 +1673,7 @@ void sammymdl_state::pyenaget(machine_config &config)
sammymdl(config);
m_maincpu->set_addrmap(AS_PROGRAM, &sammymdl_state::haekaka_map);
m_maincpu->set_addrmap(AS_IO, &sammymdl_state::pyenaget_io);
m_maincpu->out_p4_callback().set(FUNC(sammymdl_state::haekaka_leds_w));
m_screen->screen_vblank().set(m_kp69, FUNC(kp69_device::ir_w<2>));
}
@ -1756,7 +1683,6 @@ void sammymdl_state::tdoboon(machine_config &config)
sammymdl(config);
m_maincpu->set_addrmap(AS_PROGRAM, &sammymdl_state::tdoboon_map);
m_maincpu->set_addrmap(AS_IO, &sammymdl_state::tdoboon_io);
m_screen->screen_vblank().set(m_kp69, FUNC(kp69_device::ir_w<2>));
m_screen->set_visarea(0,0x140-1, 0+4,0xf0+4-1);