diff options
-rw-r--r-- | src/devices/cpu/z80/kl5c80a12.cpp | 208 | ||||
-rw-r--r-- | src/devices/cpu/z80/kl5c80a12.h | 47 | ||||
-rw-r--r-- | src/devices/cpu/z80/kl5c80a16.cpp | 99 | ||||
-rw-r--r-- | src/devices/cpu/z80/kl5c80a16.h | 30 | ||||
-rw-r--r-- | src/mame/drivers/ddenlovr.cpp | 88 | ||||
-rw-r--r-- | src/mame/drivers/model3.cpp | 9 | ||||
-rw-r--r-- | src/mame/drivers/sigmab98.cpp | 94 |
7 files changed, 437 insertions, 138 deletions
diff --git a/src/devices/cpu/z80/kl5c80a12.cpp b/src/devices/cpu/z80/kl5c80a12.cpp index 7f79c37dec9..b5674d3b339 100644 --- a/src/devices/cpu/z80/kl5c80a12.cpp +++ b/src/devices/cpu/z80/kl5c80a12.cpp @@ -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)); @@ -69,6 +82,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); +} diff --git a/src/devices/cpu/z80/kl5c80a12.h b/src/devices/cpu/z80/kl5c80a12.h index ebe1cb3bea3..28434f8c8f6 100644 --- a/src/devices/cpu/z80/kl5c80a12.h +++ b/src/devices/cpu/z80/kl5c80a12.h @@ -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]; }; diff --git a/src/devices/cpu/z80/kl5c80a16.cpp b/src/devices/cpu/z80/kl5c80a16.cpp index 8fa31925366..d92cc9142de 100644 --- a/src/devices/cpu/z80/kl5c80a16.cpp +++ b/src/devices/cpu/z80/kl5c80a16.cpp @@ -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); +} diff --git a/src/devices/cpu/z80/kl5c80a16.h b/src/devices/cpu/z80/kl5c80a16.h index 1593787010b..d3ac8eda636 100644 --- a/src/devices/cpu/z80/kl5c80a16.h +++ b/src/devices/cpu/z80/kl5c80a16.h @@ -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]; }; diff --git a/src/mame/drivers/ddenlovr.cpp b/src/mame/drivers/ddenlovr.cpp index 72f1b38e2a1..51981206859 100644 --- a/src/mame/drivers/ddenlovr.cpp +++ b/src/mame/drivers/ddenlovr.cpp @@ -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) diff --git a/src/mame/drivers/model3.cpp b/src/mame/drivers/model3.cpp index 1244cac840e..d0dc44103a4 100644 --- a/src/mame/drivers/model3.cpp +++ b/src/mame/drivers/model3.cpp @@ -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) diff --git a/src/mame/drivers/sigmab98.cpp b/src/mame/drivers/sigmab98.cpp index 0ec089f9b74..50aea20f0e4 100644 --- a/src/mame/drivers/sigmab98.cpp +++ b/src/mame/drivers/sigmab98.cpp @@ -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); |