summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mooglyguy <therealmogminer@gmail.com>2019-03-17 11:10:17 +0100
committer MooglyGuy <therealmogminer@gmail.com>2019-03-17 11:10:43 +0100
commit16b1e9923d9c9aceb4a7665e9f21c9806acb309d (patch)
tree252296c9a266c7e23aedf00f0029a1a73ee89696
parent735ac8764eeb35866fe3ce1286f92d4ecfe7a823 (diff)
-ins8154: Added internal 128-byte RAM and simplified handlers. [Ryan Holtz]
-astrocde: Various changes. [Ryan Holtz] * Added I/O access handling to expansion slot. * Added INS8154 I/O functionality to Blue RAM boards (RAM not yet hooked up). * Hooked up cassette saving and loading to Blue RAM boards.
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/bus/astrocde/cassette.cpp7
-rw-r--r--src/devices/bus/astrocde/exp.cpp14
-rw-r--r--src/devices/bus/astrocde/exp.h4
-rw-r--r--src/devices/bus/astrocde/ram.cpp61
-rw-r--r--src/devices/bus/astrocde/ram.h12
-rw-r--r--src/devices/machine/ins8154.cpp31
-rw-r--r--src/devices/machine/ins8154.h13
-rw-r--r--src/mame/drivers/acrnsys.cpp2
-rw-r--r--src/mame/drivers/acrnsys1.cpp4
-rw-r--r--src/mame/drivers/astrohome.cpp9
-rw-r--r--src/mame/drivers/didact.cpp4
-rw-r--r--src/mame/drivers/mk14.cpp4
-rw-r--r--src/mame/drivers/vega.cpp9
14 files changed, 139 insertions, 36 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 4a1f7b9eeb1..9f4d4e86493 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -866,6 +866,7 @@ FORMATS["APPLIX_DSK"] = true
FORMATS["APRIDISK"] = true
FORMATS["AP_DSK35"] = true
FORMATS["ASST128_DSK"] = true
+FORMATS["ASTROCADE_WAV"] = true
FORMATS["ATARI_DSK"] = true
FORMATS["ATOM_DSK"] = true
FORMATS["ATOM_TAP"] = true
diff --git a/src/devices/bus/astrocde/cassette.cpp b/src/devices/bus/astrocde/cassette.cpp
index 789b0d7e175..50c27f18b5a 100644
--- a/src/devices/bus/astrocde/cassette.cpp
+++ b/src/devices/bus/astrocde/cassette.cpp
@@ -1,5 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
+//
+// TODO: Emulation of the circuitry to convert 300-baud Kansas City Standard data into bits.
+//
+// Decoding is done in hardware by an external box, and decoded bits are fed to bit 0 of the controller port,
+// with sync bits being fed to bit 1.
#include "emu.h"
#include "cassette.h"
@@ -29,13 +34,11 @@ astrocade_cassette_device::~astrocade_cassette_device()
uint8_t astrocade_cassette_device::read_handle()
{
uint8_t data = m_cassette->input() > 0.0 ? 0 : 1;
- logerror("%s: Cassette Handle Read: %d\n", machine().describe_context(), data);
return data;
}
uint8_t astrocade_cassette_device::read_knob()
{
- logerror("%s: Cassette Knob Read\n", machine().describe_context());
return 0;
}
diff --git a/src/devices/bus/astrocde/exp.cpp b/src/devices/bus/astrocde/exp.cpp
index 40b6fbecbc4..9fe3c9f3fda 100644
--- a/src/devices/bus/astrocde/exp.cpp
+++ b/src/devices/bus/astrocde/exp.cpp
@@ -74,6 +74,14 @@ READ8_MEMBER(astrocade_exp_device::read)
return 0xff;
}
+READ8_MEMBER(astrocade_exp_device::read_io)
+{
+ if (m_card)
+ return m_card->read_io(space, offset);
+ else
+ return 0xff;
+}
+
/*-------------------------------------------------
write
-------------------------------------------------*/
@@ -83,3 +91,9 @@ WRITE8_MEMBER(astrocade_exp_device::write)
if (m_card)
m_card->write(space, offset, data);
}
+
+WRITE8_MEMBER(astrocade_exp_device::write_io)
+{
+ if (m_card)
+ m_card->write_io(space, offset, data);
+}
diff --git a/src/devices/bus/astrocde/exp.h b/src/devices/bus/astrocde/exp.h
index e6c97862224..a01db130974 100644
--- a/src/devices/bus/astrocde/exp.h
+++ b/src/devices/bus/astrocde/exp.h
@@ -14,6 +14,8 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(write) { }
+ virtual DECLARE_READ8_MEMBER(read_io) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_io) { }
protected:
device_astrocade_card_interface(const machine_config &mconfig, device_t &device);
@@ -46,6 +48,8 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read);
virtual DECLARE_WRITE8_MEMBER(write);
+ virtual DECLARE_READ8_MEMBER(read_io);
+ virtual DECLARE_WRITE8_MEMBER(write_io);
protected:
bool m_card_mounted;
diff --git a/src/devices/bus/astrocde/ram.cpp b/src/devices/bus/astrocde/ram.cpp
index 36d1ed9ab77..8f20b0256fa 100644
--- a/src/devices/bus/astrocde/ram.cpp
+++ b/src/devices/bus/astrocde/ram.cpp
@@ -21,10 +21,10 @@
switch and run it as a cartridge. This is useful for cartridge development.
Blue RAM -- available in 4K, 16K, and 32K. These also use an INS8154 chip,
- (not yet implemented) which has an additional $80 bytes of RAM mapped
- immediately after the end of the expansion address space. This memory
- can't be write protected. The INS8154 has I/O features needed for loading
- tape programs into Blue RAM BASIC, as well as running the Blue RAM Utility cart.
+ which has an additional $80 bytes of RAM mapped immediately after the end of
+ the expansion address space (not yet implemented). This memory can't be write
+ protected. The INS8154 has I/O features needed for loading tape programs into
+ Blue RAM BASIC, as well as running the Blue RAM Utility cart.
4K: $6000 to $6FFF (can't run VIPERSoft BASIC, because this program needs memory
past this range)
16K: $6000 to $9FFF
@@ -69,9 +69,11 @@ DEFINE_DEVICE_TYPE(ASTROCADE_RL64RAM, astrocade_rl64ram_device, "astroca
astrocade_blueram_4k_device::astrocade_blueram_4k_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock),
- device_astrocade_card_interface(mconfig, *this),
- m_write_prot(*this, "RAM_PROTECT")
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_astrocade_card_interface(mconfig, *this)
+ , m_write_prot(*this, "RAM_PROTECT")
+ , m_ramio(*this, "ramio")
+ , m_cassette(*this, "cassette")
{
}
@@ -163,7 +165,35 @@ WRITE8_MEMBER(astrocade_blueram_4k_device::write)
m_ram[offset - 0x1000] = data;
}
+READ8_MEMBER(astrocade_blueram_4k_device::read_io)
+{
+ return m_ramio->read_io(offset & 0x7f);
+}
+
+WRITE8_MEMBER(astrocade_blueram_4k_device::write_io)
+{
+ logerror("write_io: %04x = %02x\n", offset, data);
+ m_ramio->write_io(offset & 0x7f, data);
+}
+
+uint8_t astrocade_blueram_4k_device::porta_r()
+{
+ return 0;
+}
+
+uint8_t astrocade_blueram_4k_device::portb_r()
+{
+ return m_cassette->input() > 0.0 ? 1 : 0;
+}
+
+void astrocade_blueram_4k_device::porta_w(uint8_t data)
+{
+}
+void astrocade_blueram_4k_device::portb_w(uint8_t data)
+{
+ m_cassette->output(BIT(data, 0) ? +1 : -1);
+}
// Viper System 1 expansion has RAM in 0x6000-0x9fff
READ8_MEMBER(astrocade_viper_sys1_device::read)
@@ -207,3 +237,20 @@ WRITE8_MEMBER(astrocade_rl64ram_device::write)
if (!m_write_prot->read())
m_ram[offset] = data;
}
+
+/*-------------------------------------------------
+ machine configuration
+ -------------------------------------------------*/
+
+void astrocade_blueram_4k_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("astrocade_cass");
+
+ INS8154(config, m_ramio);
+ m_ramio->out_a().set(FUNC(astrocade_blueram_4k_device::porta_w));
+ m_ramio->out_b().set(FUNC(astrocade_blueram_4k_device::portb_w));
+ m_ramio->in_a().set(FUNC(astrocade_blueram_4k_device::porta_r));
+ m_ramio->in_b().set(FUNC(astrocade_blueram_4k_device::portb_r));
+}
diff --git a/src/devices/bus/astrocde/ram.h b/src/devices/bus/astrocde/ram.h
index 83f9483d2e8..ee5ed884ef4 100644
--- a/src/devices/bus/astrocde/ram.h
+++ b/src/devices/bus/astrocde/ram.h
@@ -6,6 +6,8 @@
#pragma once
#include "exp.h"
+#include "imagedev/cassette.h"
+#include "machine/ins8154.h"
// ======================> astrocade_blueram_4k_device
@@ -22,15 +24,25 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read) override;
virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual DECLARE_READ8_MEMBER(read_io) override;
+ virtual DECLARE_WRITE8_MEMBER(write_io) override;
+
+ uint8_t porta_r();
+ uint8_t portb_r();
+ void porta_w(uint8_t data);
+ void portb_w(uint8_t data);
protected:
astrocade_blueram_4k_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
virtual void device_start() override { m_ram.resize(0x1000); save_item(NAME(m_ram)); }
virtual void device_reset() override { }
+ virtual void device_add_mconfig(machine_config &config) override;
std::vector<uint8_t> m_ram;
required_ioport m_write_prot;
+ required_device<ins8154_device> m_ramio;
+ required_device<cassette_image_device> m_cassette;
};
// ======================> astrocade_blueram_16k_device
diff --git a/src/devices/machine/ins8154.cpp b/src/devices/machine/ins8154.cpp
index ff1cd79906e..11943cdee2c 100644
--- a/src/devices/machine/ins8154.cpp
+++ b/src/devices/machine/ins8154.cpp
@@ -78,6 +78,7 @@ void ins8154_device::device_start()
save_item(NAME(m_mdr));
save_item(NAME(m_odra));
save_item(NAME(m_odrb));
+ save_item(NAME(m_ram));
}
@@ -97,7 +98,7 @@ void ins8154_device::device_reset()
}
-READ8_MEMBER(ins8154_device::ins8154_r)
+uint8_t ins8154_device::read_io(offs_t offset)
{
uint8_t val = 0xff;
@@ -146,7 +147,12 @@ READ8_MEMBER(ins8154_device::ins8154_r)
return val;
}
-WRITE8_MEMBER(ins8154_device::ins8154_porta_w)
+uint8_t ins8154_device::read_ram(offs_t offset)
+{
+ return m_ram[offset & 0x7f];
+}
+
+void ins8154_device::porta_w(uint8_t data)
{
m_out_a = data;
@@ -155,7 +161,7 @@ WRITE8_MEMBER(ins8154_device::ins8154_porta_w)
m_out_a_cb(offs_t(0), (data & m_odra) | (m_odra ^ 0xff));
}
-WRITE8_MEMBER(ins8154_device::ins8154_portb_w)
+void ins8154_device::portb_w(uint8_t data)
{
LOG("%s: INS8154 Write PortB %02x with odrb: %02x\n", machine().describe_context(), data, m_odrb);
m_out_b = data;
@@ -165,7 +171,7 @@ WRITE8_MEMBER(ins8154_device::ins8154_portb_w)
m_out_b_cb(offs_t(0), (data & m_odrb) | (m_odrb ^ 0xff));
}
-WRITE8_MEMBER(ins8154_device::ins8154_w)
+void ins8154_device::write_io(offs_t offset, uint8_t data)
{
if (offset > 0x24)
{
@@ -176,11 +182,11 @@ WRITE8_MEMBER(ins8154_device::ins8154_w)
switch (offset)
{
case 0x20:
- ins8154_porta_w(space, 0, data);
+ porta_w(data);
break;
case 0x21:
- ins8154_portb_w(space, 0, data);
+ portb_w(data);
break;
case 0x22:
@@ -205,12 +211,12 @@ WRITE8_MEMBER(ins8154_device::ins8154_w)
if (offset < 0x08)
{
LOGBITS("%s: INS8154 Port A set bit %02x\n", machine().describe_context(), offset & 0x07);
- ins8154_porta_w(space, 0, m_out_a |= (1 << (offset & 0x07)));
+ porta_w(m_out_a |= (1 << (offset & 0x07)));
}
else
{
LOGBITS("%s: INS8154 Port B set bit %02x\n", machine().describe_context(), offset & 0x07);
- ins8154_portb_w(space, 0, m_out_b |= (1 << (offset & 0x07)));
+ portb_w(m_out_b |= (1 << (offset & 0x07)));
}
}
else
@@ -219,14 +225,19 @@ WRITE8_MEMBER(ins8154_device::ins8154_w)
if (offset < 0x08)
{
LOGBITS("%s: INS8154 Port A clear bit %02x\n", machine().describe_context(), offset & 0x07);
- ins8154_porta_w(space, 0, m_out_a & ~(1 << (offset & 0x07)));
+ porta_w(m_out_a & ~(1 << (offset & 0x07)));
}
else
{
LOGBITS("%s: INS8154 Port B clear bit %02x\n", machine().describe_context(), offset & 0x07);
- ins8154_portb_w(space, 0, m_out_b & ~(1 << (offset & 0x07)));
+ portb_w(m_out_b & ~(1 << (offset & 0x07)));
}
}
break;
}
}
+
+void ins8154_device::write_ram(offs_t offset, uint8_t data)
+{
+ m_ram[offset & 0x7f] = data;
+}
diff --git a/src/devices/machine/ins8154.h b/src/devices/machine/ins8154.h
index 5ba94ab9cda..2ce40ec9e70 100644
--- a/src/devices/machine/ins8154.h
+++ b/src/devices/machine/ins8154.h
@@ -47,11 +47,13 @@ public:
auto out_b() { return m_out_b_cb.bind(); }
auto out_irq() { return m_out_irq_cb.bind(); }
- DECLARE_READ8_MEMBER( ins8154_r );
- DECLARE_WRITE8_MEMBER( ins8154_w );
+ uint8_t read_io(offs_t offset);
+ void write_io(offs_t offset, uint8_t data);
+ uint8_t read_ram(offs_t offset);
+ void write_ram(offs_t offset, uint8_t data);
- DECLARE_WRITE8_MEMBER( ins8154_porta_w );
- DECLARE_WRITE8_MEMBER( ins8154_portb_w );
+ void porta_w(uint8_t data);
+ void portb_w(uint8_t data);
protected:
// device-level overrides
@@ -77,6 +79,9 @@ private:
uint8_t m_mdr; /* Mode Definition Register */
uint8_t m_odra; /* Output Definition Register Port A */
uint8_t m_odrb; /* Output Definition Register Port B */
+
+ /* on-board RAM */
+ uint8_t m_ram[0x80];
};
diff --git a/src/mame/drivers/acrnsys.cpp b/src/mame/drivers/acrnsys.cpp
index e7dcea8a45a..2eaa8aca2eb 100644
--- a/src/mame/drivers/acrnsys.cpp
+++ b/src/mame/drivers/acrnsys.cpp
@@ -123,7 +123,7 @@ void acrnsys_state::a6502_mem(address_map &map)
{
map.unmap_value_low();
map(0x0000, 0x03ff).ram();
- map(0x0e00, 0x0e7f).mirror(0x100).rw(m_ins8154, FUNC(ins8154_device::ins8154_r), FUNC(ins8154_device::ins8154_w));
+ map(0x0e00, 0x0e7f).mirror(0x100).rw(m_ins8154, FUNC(ins8154_device::read_io), FUNC(ins8154_device::write_io));
map(0xf000, 0xffff).rom().region("maincpu", 0);
}
diff --git a/src/mame/drivers/acrnsys1.cpp b/src/mame/drivers/acrnsys1.cpp
index af3e882cfee..e9ba3b9f17b 100644
--- a/src/mame/drivers/acrnsys1.cpp
+++ b/src/mame/drivers/acrnsys1.cpp
@@ -185,8 +185,8 @@ WRITE8_MEMBER( acrnsys1_state::acrnsys1_led_segment_w )
void acrnsys1_state::acrnsys1_map(address_map &map)
{
map(0x0000, 0x03ff).ram();
- map(0x0e00, 0x0e7f).mirror(0x100).rw("b1", FUNC(ins8154_device::ins8154_r), FUNC(ins8154_device::ins8154_w));
- map(0x0e80, 0x0eff).mirror(0x100).ram();
+ map(0x0e00, 0x0e7f).mirror(0x100).rw("b1", FUNC(ins8154_device::read_io), FUNC(ins8154_device::write_io));
+ map(0x0e80, 0x0eff).mirror(0x100).rw("b1", FUNC(ins8154_device::read_ram), FUNC(ins8154_device::write_ram));
map(0xf800, 0xf9ff).mirror(0x600).rom();
}
diff --git a/src/mame/drivers/astrohome.cpp b/src/mame/drivers/astrohome.cpp
index b04948e5487..9cd36b55b8e 100644
--- a/src/mame/drivers/astrohome.cpp
+++ b/src/mame/drivers/astrohome.cpp
@@ -107,7 +107,11 @@ READ8_MEMBER(astrocde_home_state::inputs_r)
if (BIT(offset, 2))
return m_keypad[offset & 3]->read();
else
- return m_ctrl[offset & 3]->read_handle();
+ {
+ uint8_t data = m_ctrl[offset & 3]->read_handle();
+ //printf("%d", BIT(data, 0));
+ return data;
+ }
}
static INPUT_PORTS_START( astrocde )
@@ -258,7 +262,10 @@ MACHINE_START_MEMBER(astrocde_home_state, astrocde)
// if no RAM is mounted and the handlers are installed, the system starts with garbage on screen and a RESET is necessary
// thus, install RAM only if an expansion is mounted
if (m_exp->get_card_mounted())
+ {
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x5000, 0xffff, read8_delegate(FUNC(astrocade_exp_device::read),(astrocade_exp_device*)m_exp), write8_delegate(FUNC(astrocade_exp_device::write),(astrocade_exp_device*)m_exp));
+ m_maincpu->space(AS_IO).install_readwrite_handler(0x0080, 0x00ff, 0x0000, 0x0000, 0xff00, read8_delegate(FUNC(astrocade_exp_device::read_io),(astrocade_exp_device*)m_exp), write8_delegate(FUNC(astrocade_exp_device::write_io),(astrocade_exp_device*)m_exp));
+ }
}
/*************************************
diff --git a/src/mame/drivers/didact.cpp b/src/mame/drivers/didact.cpp
index d0b969a2a5f..0fa835eb64f 100644
--- a/src/mame/drivers/didact.cpp
+++ b/src/mame/drivers/didact.cpp
@@ -649,8 +649,8 @@ void modulab_state::modulab_map(address_map &map)
// map(0x0800, 0x13ff).ram().mirror(0xe000); // expansion port area consisting of 3 chip selects each selecting 0x3ff byte addresses
map(0x1400, 0x17ff).rom().mirror(0xe000).region("maincpu", 0x0000);
map(0x1800, 0x187f).rw(FUNC(modulab_state::io_r), FUNC(modulab_state::io_w)).mirror(0xe200);
- map(0x1900, 0x197f).rw(m_pia1, FUNC(ins8154_device::ins8154_r), FUNC(ins8154_device::ins8154_w)).mirror(0xe200);
- map(0x1980, 0x19ff).ram().mirror(0xe200); // 8154 internal RAM
+ map(0x1900, 0x197f).rw(m_pia1, FUNC(ins8154_device::read_io), FUNC(ins8154_device::write_io)).mirror(0xe200);
+ map(0x1980, 0x19ff).rw(m_pia1, FUNC(ins8154_device::read_ram), FUNC(ins8154_device::write_ram)).mirror(0xe200);
map(0x1c00, 0x1fff).rom().mirror(0xe000).region("maincpu", 0x0400);
}
diff --git a/src/mame/drivers/mk14.cpp b/src/mame/drivers/mk14.cpp
index eaf6bb8b5c9..076e88fe577 100644
--- a/src/mame/drivers/mk14.cpp
+++ b/src/mame/drivers/mk14.cpp
@@ -117,8 +117,8 @@ void mk14_state::mem_map(address_map &map)
map.unmap_value_high();
map.global_mask(0x0fff);
map(0x000, 0x1ff).mirror(0x600).rom(); // ROM
- map(0x800, 0x87f).mirror(0x600).rw("ic8", FUNC(ins8154_device::ins8154_r), FUNC(ins8154_device::ins8154_w)); // I/O
- map(0x880, 0x8ff).mirror(0x600).ram(); // 128 I/O chip RAM
+ map(0x800, 0x87f).mirror(0x600).rw("ic8", FUNC(ins8154_device::read_io), FUNC(ins8154_device::write_io)); // I/O
+ map(0x880, 0x8ff).mirror(0x600).rw("ic8", FUNC(ins8154_device::read_ram), FUNC(ins8154_device::write_ram)); // 128 bytes I/O chip RAM
map(0x900, 0x9ff).mirror(0x400).rw(FUNC(mk14_state::keyboard_r), FUNC(mk14_state::display_w));
map(0xb00, 0xbff).ram(); // VDU RAM
map(0xf00, 0xfff).ram(); // Standard RAM
diff --git a/src/mame/drivers/vega.cpp b/src/mame/drivers/vega.cpp
index fc174a80f47..f4046254162 100644
--- a/src/mame/drivers/vega.cpp
+++ b/src/mame/drivers/vega.cpp
@@ -139,7 +139,6 @@ private:
int m_tmp;
int m_t1;
- uint8_t m_ins8154_ram[0x80];
uint8_t m_txt_ram[0x400];
vega_obj m_obj[NUM_OBJ];
@@ -204,12 +203,12 @@ WRITE8_MEMBER(vega_state::extern_w)
if(m_p2_data&0x40) /* P26 connected to M/IO pin */
{
- m_ins8154_ram[offset&0x7f]=data;
+ m_ins8154->write_ram(offset, data);
}
else
{
//register w ?
- m_ins8154->ins8154_w(space,offset&0x7f,data);
+ m_ins8154->write_io(offset & 0x7f, data);
}
}
break;
@@ -332,12 +331,12 @@ READ8_MEMBER(vega_state::extern_r)
if(m_p2_data&0x40) /* P26 connected to M/IO pin */
{
- return m_ins8154_ram[offset&0x7f];
+ return m_ins8154->read_ram(offset);
}
else
{
//register r ?
- return m_ins8154->ins8154_r(space,offset&0x7f);
+ return m_ins8154->read_io(offset & 0x7f);
}
}
#if 0