summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author arbee <rb6502@users.noreply.github.com>2021-06-17 19:07:28 -0400
committer arbee <rb6502@users.noreply.github.com>2021-06-17 19:07:28 -0400
commit64455fdc4bc13c5d1c4a9d4f87deb1d9029c80ac (patch)
tree04456d708aab35e41fc148cb08ca8311b3a63e40 /src
parentceb4e0b644b1e49d0c0c6614b5875c8548f1e459 (diff)
apple2: some correctness improvements to the Mockingboard support. [R. Belmont]
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/a2bus/a2mockingboard.cpp107
-rw-r--r--src/devices/bus/a2bus/a2mockingboard.h51
2 files changed, 121 insertions, 37 deletions
diff --git a/src/devices/bus/a2bus/a2mockingboard.cpp b/src/devices/bus/a2bus/a2mockingboard.cpp
index 6073e843371..380e9988a8b 100644
--- a/src/devices/bus/a2bus/a2mockingboard.cpp
+++ b/src/devices/bus/a2bus/a2mockingboard.cpp
@@ -41,11 +41,13 @@ DEFINE_DEVICE_TYPE(A2BUS_ECHOPLUS, a2bus_echoplus_device, "a2echop", "S
void a2bus_ayboard_device::add_common_devices(machine_config &config)
{
MOS6522(config, m_via1, 1022727);
+ m_via1->readpa_handler().set(FUNC(a2bus_ayboard_device::via1_in_a));
m_via1->writepa_handler().set(FUNC(a2bus_ayboard_device::via1_out_a));
m_via1->writepb_handler().set(FUNC(a2bus_ayboard_device::via1_out_b));
m_via1->irq_handler().set(FUNC(a2bus_ayboard_device::via1_irq_w));
MOS6522(config, m_via2, 1022727);
+ m_via2->readpa_handler().set(FUNC(a2bus_ayboard_device::via2_in_a));
m_via2->writepa_handler().set(FUNC(a2bus_ayboard_device::via2_out_a));
m_via2->writepb_handler().set(FUNC(a2bus_ayboard_device::via2_out_b));
m_via2->irq_handler().set(FUNC(a2bus_ayboard_device::via2_irq_w));
@@ -101,6 +103,9 @@ void a2bus_echoplus_device::device_add_mconfig(machine_config &config)
{
add_common_devices(config);
+ config.device_remove(VIA2_TAG);
+ m_via1->writepb_handler().set(FUNC(a2bus_ayboard_device::via1_out_b));
+
AY8913(config, m_ay2, 1022727);
m_ay2->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
@@ -165,7 +170,7 @@ void a2bus_ayboard_device::device_reset()
read_cnxx - called for reads from this card's cnxx space
-------------------------------------------------*/
-uint8_t a2bus_ayboard_device::read_cnxx(uint8_t offset)
+u8 a2bus_ayboard_device::read_cnxx(u8 offset)
{
if (offset <= 0x7f)
{
@@ -179,9 +184,15 @@ uint8_t a2bus_ayboard_device::read_cnxx(uint8_t offset)
return 0;
}
-uint8_t a2bus_phasor_device::read_cnxx(uint8_t offset)
+u8 a2bus_echoplus_device::read_cnxx(u8 offset)
{
- uint8_t ret = 0;
+ m_last_cnxx_addr = offset;
+ return m_via1->read(offset & 0xf);
+}
+
+u8 a2bus_phasor_device::read_cnxx(u8 offset)
+{
+ u8 ret = 0;
int via_sel;
if (m_native)
@@ -212,7 +223,7 @@ uint8_t a2bus_phasor_device::read_cnxx(uint8_t offset)
write_cnxx - called for writes to this card's c0nx space
-------------------------------------------------*/
-void a2bus_ayboard_device::write_cnxx(uint8_t offset, uint8_t data)
+void a2bus_ayboard_device::write_cnxx(u8 offset, u8 data)
{
// When the SSI-263 is emulated, Cn40 will write to both the VIA and
// the first SSI-263, and Cn20 will write to both the VIA and the
@@ -227,7 +238,13 @@ void a2bus_ayboard_device::write_cnxx(uint8_t offset, uint8_t data)
}
}
-void a2bus_phasor_device::write_cnxx(uint8_t offset, uint8_t data)
+void a2bus_echoplus_device::write_cnxx(u8 offset, u8 data)
+{
+ m_last_cnxx_addr = offset;
+ m_via1->write(offset & 0xf, data);
+}
+
+void a2bus_phasor_device::write_cnxx(u8 offset, u8 data)
{
if ((offset < 0x20) || (offset >= 0x80 && offset < 0xa0))
{
@@ -277,12 +294,12 @@ WRITE_LINE_MEMBER( a2bus_ayboard_device::via2_irq_w )
}
}
-void a2bus_ayboard_device::via1_out_a(uint8_t data)
+void a2bus_ayboard_device::via1_out_a(u8 data)
{
m_porta1 = data;
}
-void a2bus_ayboard_device::via1_out_b(uint8_t data)
+void a2bus_ayboard_device::via1_out_b(u8 data)
{
if (!BIT(data, 2))
{
@@ -310,7 +327,65 @@ void a2bus_ayboard_device::via1_out_b(uint8_t data)
}
}
-void a2bus_phasor_device::via1_out_b(uint8_t data)
+void a2bus_echoplus_device::via1_out_b(u8 data)
+{
+ if (!(m_last_cnxx_addr & 0x80))
+ {
+ if (!BIT(data, 2))
+ {
+ m_ay1->reset_w();
+ }
+ else
+ {
+ switch (data & 3)
+ {
+ case 0: // BDIR=0, BC1=0 (inactive)
+ break;
+
+ case 1: // BDIR=0, BC1=1 (read PSG)
+ m_porta1 = m_ay1->data_r();
+ break;
+
+ case 2: // BDIR=1, BC1=0 (write PSG)
+ m_ay1->data_w(m_porta1);
+ break;
+
+ case 3: // BDIR=1, BC1=1 (latch)
+ m_ay1->address_w(m_porta1);
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (!BIT(data, 2))
+ {
+ m_ay2->reset_w();
+ }
+ else
+ {
+ switch (data & 3)
+ {
+ case 0: // BDIR=0, BC1=0 (inactive)
+ break;
+
+ case 1: // BDIR=0, BC1=1 (read PSG)
+ m_porta1 = m_ay2->data_r();
+ break;
+
+ case 2: // BDIR=1, BC1=0 (write PSG)
+ m_ay2->data_w(m_porta1);
+ break;
+
+ case 3: // BDIR=1, BC1=1 (latch)
+ m_ay2->address_w(m_porta1);
+ break;
+ }
+ }
+ }
+}
+
+void a2bus_phasor_device::via1_out_b(u8 data)
{
if (!(data & 4))
{
@@ -359,12 +434,12 @@ void a2bus_phasor_device::via1_out_b(uint8_t data)
}
}
-void a2bus_ayboard_device::via2_out_a(uint8_t data)
+void a2bus_ayboard_device::via2_out_a(u8 data)
{
m_porta2 = data;
}
-void a2bus_ayboard_device::via2_out_b(uint8_t data)
+void a2bus_ayboard_device::via2_out_b(u8 data)
{
if (!BIT(data, 2))
{
@@ -392,7 +467,7 @@ void a2bus_ayboard_device::via2_out_b(uint8_t data)
}
}
-void a2bus_phasor_device::via2_out_b(uint8_t data)
+void a2bus_phasor_device::via2_out_b(u8 data)
{
if (!BIT(data, 2))
{
@@ -463,20 +538,20 @@ void a2bus_phasor_device::set_clocks()
}
}
-uint8_t a2bus_phasor_device::read_c0nx(uint8_t offset)
+u8 a2bus_phasor_device::read_c0nx(u8 offset)
{
m_native = BIT(offset, 0);
set_clocks();
return 0xff;
}
-void a2bus_phasor_device::write_c0nx(uint8_t offset, uint8_t data)
+void a2bus_phasor_device::write_c0nx(u8 offset, u8 data)
{
m_native = BIT(offset, 0);
set_clocks();
}
-uint8_t a2bus_echoplus_device::read_c0nx(uint8_t offset)
+u8 a2bus_echoplus_device::read_c0nx(u8 offset)
{
switch (offset)
{
@@ -487,7 +562,7 @@ uint8_t a2bus_echoplus_device::read_c0nx(uint8_t offset)
return 0;
}
-void a2bus_echoplus_device::write_c0nx(uint8_t offset, uint8_t data)
+void a2bus_echoplus_device::write_c0nx(u8 offset, u8 data)
{
switch (offset)
{
@@ -513,7 +588,7 @@ WRITE_LINE_MEMBER( a2bus_mockingboard_device::write_via1_cb2 )
m_last_cb2_state = state;
}
-void a2bus_mockingboard_device::via1_out_b(uint8_t data)
+void a2bus_mockingboard_device::via1_out_b(u8 data)
{
m_portb1 = data;
diff --git a/src/devices/bus/a2bus/a2mockingboard.h b/src/devices/bus/a2bus/a2mockingboard.h
index 44acff10006..539363c1f10 100644
--- a/src/devices/bus/a2bus/a2mockingboard.h
+++ b/src/devices/bus/a2bus/a2mockingboard.h
@@ -28,10 +28,12 @@ class a2bus_ayboard_device:
public:
DECLARE_WRITE_LINE_MEMBER( via1_irq_w );
DECLARE_WRITE_LINE_MEMBER( via2_irq_w );
- void via1_out_a(uint8_t data);
- virtual void via1_out_b(uint8_t data);
- void via2_out_a(uint8_t data);
- virtual void via2_out_b(uint8_t data);
+ u8 via1_in_a() { return m_porta1; }
+ u8 via2_in_a() { return m_porta2; }
+ void via1_out_a(u8 data);
+ virtual void via1_out_b(u8 data);
+ void via2_out_a(u8 data);
+ virtual void via2_out_b(u8 data);
protected:
// construction/destruction
@@ -42,20 +44,20 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// overrides of standard a2bus slot functions
- virtual uint8_t read_c0nx(uint8_t offset) override { return 0xff; }
- virtual void write_c0nx(uint8_t offset, uint8_t data) override { }
- virtual uint8_t read_cnxx(uint8_t offset) override;
- virtual void write_cnxx(uint8_t offset, uint8_t data) override;
+ virtual u8 read_c0nx(u8 offset) override { return 0xff; }
+ virtual void write_c0nx(u8 offset, u8 data) override { }
+ virtual u8 read_cnxx(u8 offset) override;
+ virtual void write_cnxx(u8 offset, u8 data) override;
void add_common_devices(machine_config &config);
required_device<via6522_device> m_via1;
- required_device<via6522_device> m_via2;
+ optional_device<via6522_device> m_via2;
required_device<ay8913_device> m_ay1;
required_device<ay8913_device> m_ay2;
- uint8_t m_porta1;
- uint8_t m_porta2;
+ u8 m_porta1;
+ u8 m_porta2;
};
class a2bus_mockingboard_device : public a2bus_ayboard_device
@@ -63,7 +65,7 @@ class a2bus_mockingboard_device : public a2bus_ayboard_device
public:
a2bus_mockingboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual void via1_out_b(uint8_t data) override;
+ virtual void via1_out_b(u8 data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_reset() override;
@@ -73,7 +75,7 @@ protected:
private:
DECLARE_WRITE_LINE_MEMBER(write_via1_cb2);
- uint8_t m_portb1;
+ u8 m_portb1;
int m_last_cb2_state;
};
@@ -82,16 +84,16 @@ class a2bus_phasor_device : public a2bus_ayboard_device
public:
a2bus_phasor_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void via1_out_b(uint8_t data) override;
- void via2_out_b(uint8_t data) override;
+ void via1_out_b(u8 data) override;
+ void via2_out_b(u8 data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
- virtual uint8_t read_c0nx(uint8_t offset) override;
- virtual void write_c0nx(uint8_t offset, uint8_t data) override;
- virtual uint8_t read_cnxx(uint8_t offset) override;
- virtual void write_cnxx(uint8_t offset, uint8_t data) override;
+ virtual u8 read_c0nx(u8 offset) override;
+ virtual void write_c0nx(u8 offset, u8 data) override;
+ virtual u8 read_cnxx(u8 offset) override;
+ virtual void write_cnxx(u8 offset, u8 data) override;
required_device<ay8913_device> m_ay3;
required_device<ay8913_device> m_ay4;
@@ -110,10 +112,17 @@ public:
protected:
virtual void device_add_mconfig(machine_config &config) override;
- virtual uint8_t read_c0nx(uint8_t offset) override;
- virtual void write_c0nx(uint8_t offset, uint8_t data) override;
+ virtual void via1_out_b(u8 data) override;
+
+ virtual u8 read_c0nx(u8 offset) override;
+ virtual void write_c0nx(u8 offset, u8 data) override;
+ virtual u8 read_cnxx(u8 offset) override;
+ virtual void write_cnxx(u8 offset, u8 data) override;
required_device<tms5220_device> m_tms;
+
+private:
+ u8 m_last_cnxx_addr;
};
// device type definition