summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2021-02-01 15:08:07 +0100
committer hap <happppp@users.noreply.github.com>2021-02-01 15:08:23 +0100
commit9868d8322f99f9a495cbbd39ddc5a7740f2d8e2e (patch)
tree77e4d0748580852a146bb3a82c8a037fbb899a02
parentf891a3c7578400839963cbc10b8d8b91cf728411 (diff)
odyssey2/homecomp: make ram size configurable
-rw-r--r--src/devices/bus/odyssey2/homecomp.cpp38
-rw-r--r--src/devices/bus/odyssey2/homecomp.h4
-rw-r--r--src/devices/machine/ram.cpp7
-rw-r--r--src/devices/machine/ram.h2
-rw-r--r--src/mame/drivers/fidel_eag68k.cpp1
-rw-r--r--src/mame/drivers/saitek_risc2500.cpp4
6 files changed, 52 insertions, 4 deletions
diff --git a/src/devices/bus/odyssey2/homecomp.cpp b/src/devices/bus/odyssey2/homecomp.cpp
index fed8adf6b5f..3357bec193d 100644
--- a/src/devices/bus/odyssey2/homecomp.cpp
+++ b/src/devices/bus/odyssey2/homecomp.cpp
@@ -12,6 +12,9 @@ Hardware notes:
- 2*8KB ROM, 16KB RAM(2*TMS4416, 2 unpopulated sockets)
- optional data recorder
+The RAM can be expanded to 32KB by simply adding two more TMS4416. To enable it,
+enter command CLEAR 50,-2
+
TODO:
- lots of unacknowledged writes to latch 1, probably harmless
- cassette data saved from MAME can be loaded fine, but other WAVs can't, even
@@ -41,6 +44,23 @@ o2_homecomp_device::o2_homecomp_device(const machine_config &mconfig, const char
void o2_homecomp_device::device_start()
{
save_item(NAME(m_control));
+ save_item(NAME(m_installed));
+
+ // allocate maximum RAM beforehand
+ m_ram = std::make_unique<u8[]>(0x8000);
+ save_pointer(NAME(m_ram), 0x8000);
+}
+
+void o2_homecomp_device::device_reset()
+{
+ if (!m_installed)
+ {
+ // install RAM
+ u32 ramsize = ioport("RAM")->read() ? 0x8000 : 0x4000;
+ m_maincpu->space(AS_PROGRAM).install_ram(0x8000, ramsize - 1 + 0x8000, m_ram.get());
+
+ m_installed = true;
+ }
}
void o2_homecomp_device::cart_init()
@@ -51,6 +71,23 @@ void o2_homecomp_device::cart_init()
//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+static INPUT_PORTS_START( homecomp )
+ PORT_START("RAM")
+ PORT_CONFNAME( 0x01, 0x00, "RAM Size" )
+ PORT_CONFSETTING( 0x00, "16KB" )
+ PORT_CONFSETTING( 0x01, "32KB" ) // unofficial
+INPUT_PORTS_END
+
+ioport_constructor o2_homecomp_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(homecomp);
+}
+
+
+//-------------------------------------------------
// internal i/o
//-------------------------------------------------
@@ -107,7 +144,6 @@ void o2_homecomp_device::internal_io_w(offs_t offset, u8 data)
void o2_homecomp_device::homecomp_mem(address_map &map)
{
map(0x0000, 0x3fff).r(FUNC(o2_homecomp_device::internal_rom_r));
- map(0x8000, 0xbfff).ram();
}
void o2_homecomp_device::homecomp_io(address_map &map)
diff --git a/src/devices/bus/odyssey2/homecomp.h b/src/devices/bus/odyssey2/homecomp.h
index 6ecc67f1184..7971afbff02 100644
--- a/src/devices/bus/odyssey2/homecomp.h
+++ b/src/devices/bus/odyssey2/homecomp.h
@@ -30,7 +30,9 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
+ virtual ioport_constructor device_input_ports() const override;
virtual void cart_init() override;
@@ -54,7 +56,9 @@ private:
void homecomp_io(address_map &map);
void homecomp_mem(address_map &map);
+ std::unique_ptr<u8[]> m_ram;
u8 m_control = 0;
+ bool m_installed = false;
};
// device type definition
diff --git a/src/devices/machine/ram.cpp b/src/devices/machine/ram.cpp
index 3f8cfd94d51..623cbea1af0 100644
--- a/src/devices/machine/ram.cpp
+++ b/src/devices/machine/ram.cpp
@@ -1,11 +1,16 @@
// license:BSD-3-Clause
-// copyright-holders: Dirk Best
+// copyright-holders:Nathan Woods, Dirk Best
/*************************************************************************
RAM device
Provides a configurable amount of RAM to drivers
+ Limitations due to hardcoded RAM_TAG:
+ - *configurable* RAM device can only be added to root device
+ (that is the driver device)
+ - can only have one *configurable* RAM device per machine driver
+
**************************************************************************/
#include "emu.h"
diff --git a/src/devices/machine/ram.h b/src/devices/machine/ram.h
index 2af1f800ab4..34bf7949db3 100644
--- a/src/devices/machine/ram.h
+++ b/src/devices/machine/ram.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders: Dirk Best
+// copyright-holders:Nathan Woods, Dirk Best
/*************************************************************************
RAM device
diff --git a/src/mame/drivers/fidel_eag68k.cpp b/src/mame/drivers/fidel_eag68k.cpp
index 016d1071ae4..dd16ef8b581 100644
--- a/src/mame/drivers/fidel_eag68k.cpp
+++ b/src/mame/drivers/fidel_eag68k.cpp
@@ -643,6 +643,7 @@ void eag_state::eagv2(machine_config &config)
/* basic machine hardware */
RAM(config, m_ram).set_extra_options("128K, 512K, 1M");
m_ram->set_default_size("128K");
+ m_ram->set_default_value(0);
}
void eag_state::eagv3(machine_config &config)
diff --git a/src/mame/drivers/saitek_risc2500.cpp b/src/mame/drivers/saitek_risc2500.cpp
index 681b84376a9..9de8adc73ed 100644
--- a/src/mame/drivers/saitek_risc2500.cpp
+++ b/src/mame/drivers/saitek_risc2500.cpp
@@ -305,7 +305,9 @@ void risc2500_state::risc2500(machine_config &config)
m_board->set_delay(attotime::from_msec(100));
m_board->set_nvram_enable(true);
- RAM(config, m_ram).set_default_size("2M").set_extra_options("128K, 256K, 512K, 1M, 2M");
+ RAM(config, m_ram).set_extra_options("128K, 256K, 512K, 1M, 2M");
+ m_ram->set_default_size("2M");
+ m_ram->set_default_value(0);
NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);