summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/dec/rainbow.cpp
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2025-01-02 12:30:59 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2025-01-02 12:32:32 +0700
commit2da636bb214ee65c339b385ffc3be275d06ff76e (patch)
tree02fccfdded5689b089e0f3cb711debd6cc1f1386 /src/mame/dec/rainbow.cpp
parentab34107f9f6487444682837e106edaed0c35c491 (diff)
ds1215: modernize and complete emulation
* rename previous ds1315 to earlier/original ds1215 device * support both ds1215 and transparent access methods * implement rtc and nvram interfaces * support updating registers
Diffstat (limited to 'src/mame/dec/rainbow.cpp')
-rw-r--r--src/mame/dec/rainbow.cpp92
1 files changed, 28 insertions, 64 deletions
diff --git a/src/mame/dec/rainbow.cpp b/src/mame/dec/rainbow.cpp
index cce1a9af14e..2a5bedd48a6 100644
--- a/src/mame/dec/rainbow.cpp
+++ b/src/mame/dec/rainbow.cpp
@@ -350,7 +350,7 @@ W17 pulls J1 serial port pin 1 to GND when set (chassis to logical GND).
#include "machine/timer.h"
#include "machine/ram.h"
-#include "machine/ds1315.h"
+#include "machine/ds1215.h"
#include "emupal.h"
#include "softlist.h"
#include "screen.h"
@@ -492,7 +492,6 @@ public:
m_p_vol_ram(*this, "vol_ram"),
m_p_nvram(*this, "nvram"),
- m_rtc(*this, "rtc"),
m_hgdc(*this, "upd7220"), // GDC
m_screen2(*this, "screen2"),
@@ -519,8 +518,6 @@ protected:
uint8_t ext_ram_r(offs_t offset);
- void rtc_w(offs_t offset, uint8_t data);
-
uint8_t read_video_ram_r(offs_t offset);
void video_interrupt(int state);
@@ -650,8 +647,6 @@ protected:
required_shared_ptr<uint8_t> m_p_vol_ram;
required_shared_ptr<uint8_t> m_p_nvram;
- optional_device<ds1315_device> m_rtc;
-
required_device<upd7220_device> m_hgdc; // GDC
required_device<screen_device> m_screen2;
required_device<palette_device> m_palette2;
@@ -753,7 +748,8 @@ class rainbow_modela_state : public rainbow_base_state
{
public:
rainbow_modela_state(const machine_config &mconfig, device_type type, const char *tag) :
- rainbow_base_state(mconfig, type, tag)
+ rainbow_base_state(mconfig, type, tag),
+ m_rtc(*this, "rtc")
{
}
@@ -767,15 +763,19 @@ private:
void ext_ram_w(offs_t offset, uint8_t data);
uint8_t rtc_r(offs_t offset);
+ void rtc_w(offs_t offset, uint8_t data);
void irq_hi_w(int state);
uint8_t system_parameter_r();
+
+ required_device<ds1215_device> m_rtc;
};
class rainbow_modelb_state : public rainbow_base_state
{
public:
rainbow_modelb_state(const machine_config &mconfig, device_type type, const char *tag) :
- rainbow_base_state(mconfig, type, tag)
+ rainbow_base_state(mconfig, type, tag),
+ m_rtc(*this, "rtc")
{
}
@@ -791,6 +791,8 @@ private:
uint8_t rtc_r(offs_t offset);
void irq_hi_w(int state);
uint8_t system_parameter_r();
+
+ required_device<ds1216e_device> m_rtc;
};
// It * should be * OK to RESET the SCROLL_BUFFER and the COLOR_MAP (at least with WELL WRITTEN programs)
@@ -1180,8 +1182,6 @@ void rainbow_base_state::machine_reset()
m_crtc->MHFU(MHFU_RESET_and_DISABLE);
- m_rtc->chip_reset(); // * Reset RTC to a defined state *
-
// *********** HARD DISK CONTROLLERS...
address_space &io = m_i8088->space(AS_IO);
if (m_inp5->read() == 0x01) // ...PRESENT?
@@ -1528,27 +1528,20 @@ void rainbow_modelb_state::ext_ram_w(offs_t offset, uint8_t data)
// Requires a short program from the Suitable Solutions ClikClok distribution disk (CLIKA.COM)
// - also needed to set time/date (*). Reads $ed000, writes ed0fe/ed0ff.
-void rainbow_base_state::rtc_w(offs_t offset, uint8_t data)
+void rainbow_modela_state::rtc_w(offs_t offset, uint8_t data)
{
if (m_inp11->read() == 0x01) // if enabled...
{
- switch (offset)
+ if (m_rtc->ceo_r())
{
- case 0x00: // Write to 0xED0FE
- if (m_rtc->chip_enable())
- m_rtc->write_data(offset & 0x01); // Transfer data to DS1315 (data = offset):
- else
- m_rtc->read_0(); // (RTC ACTIVATION) read magic pattern 0
- break;
+ m_rtc->write(offset & 0x01);
- case 0x01: // Write to 0xED0FF
- if (m_rtc->chip_enable())
- m_rtc->write_data(offset & 0x01); // Transfer data to DS1315 (data = offset):
- else
- m_rtc->read_1(); // (RTC ACTIVATION) read magic pattern 1
- break;
+ return;
}
+
+ m_rtc->write(offset & 0x01);
}
+
m_p_vol_ram[offset] = data; // Poke value into VOL_RAM.
}
@@ -1561,10 +1554,10 @@ uint8_t rainbow_modela_state::rtc_r(offs_t offset)
{
if (offset == 0x00) // read time/date from 0xED000 (ClikClok for 100-A)
{
- if (m_rtc->chip_enable())
- return m_rtc->read_data() & 0x01;
+ if (m_rtc->ceo_r())
+ return m_rtc->read();
else
- m_rtc->chip_reset();
+ m_rtc->read();
}
}
@@ -1575,41 +1568,10 @@ uint8_t rainbow_modelb_state::rtc_r(offs_t offset)
{
if (m_inp11->read() == 0x01) // if enabled...
{
- switch (offset)
- {
- // Transfer data to DS1315 (data = offset):
- case 0x0000: // RTC_WRITE_DATA_0 0xFC000
- case 0x2000: // RTC_WRITE_DATA_0 0xFE000 (MIRROR)
-
- case 0x0001: // RTC_WRITE_DATA_1 0xFC001
- case 0x2001: // RTC_WRITE_DATA_1 0xFE001 (MIRROR)
- m_rtc->write_data(offset & 0x01);
- break;
-
- // Read actual time/date from ClikClok:
- case 0x0004: // 0xFC004
- case 0x2004: // 0xFE004 (MIRROR)
- if (m_rtc->chip_enable())
- return (m_rtc->read_data() & 0x01);
- [[fallthrough]]; // FIXME: really?
- // (RTC ACTIVATION) read magic pattern 0
- case 0x0100: // 0xFC100
- case 0x2100: // 0xFE100 (MIRROR)
- m_rtc->read_0();
- break;
-
- // (RTC ACTIVATION) read magic pattern 1
- case 0x0101: // 0xFC101
- case 0x2101: // 0xFE101 (MIRROR)
- m_rtc->read_1();
- break;
-
- // RESET
- case 0x0104: // 0xFC104
- case 0x2104: // 0xFE104 (MIRROR)
- m_rtc->chip_reset();
- break;
- }
+ if (m_rtc->ceo_r())
+ return m_rtc->read(offset);
+ else
+ m_rtc->read(offset);
}
uint8_t *rom = memregion("maincpu")->base();
@@ -3278,8 +3240,6 @@ void rainbow_base_state::rainbow_base(machine_config &config)
HARDDISK(config, "harddisk3", "corvus_hdd");
HARDDISK(config, "harddisk4", "corvus_hdd");
- DS1315(config, m_rtc, 0); // DS1315 (ClikClok for DEC-100 B) * OPTIONAL *
-
COM8116_003(config, m_dbrg, 24.0734_MHz_XTAL / 4); // 6.01835 MHz (nominally 6 MHz)
m_dbrg->fr_handler().set(FUNC(rainbow_base_state::dbrg_fr_w));
m_dbrg->ft_handler().set(FUNC(rainbow_base_state::dbrg_ft_w));
@@ -3330,6 +3290,8 @@ void rainbow_modela_state::rainbow_modela(machine_config &config)
m_i8088->set_addrmap(AS_IO, &rainbow_modela_state::rainbow8088_io);
RAM(config, m_ram).set_default_size("64K").set_extra_options("64K,128K,192K,256K,320K,384K,448K,512K,576K,640K,704K,768K");
m_kbd8251->dtr_handler().set(FUNC(rainbow_modela_state::irq_hi_w));
+
+ DS1215(config, m_rtc); // DS1315 (ClikClok for DEC-100 B) * OPTIONAL *
}
void rainbow_modelb_state::rainbow_modelb(machine_config &config)
@@ -3339,6 +3301,8 @@ void rainbow_modelb_state::rainbow_modelb(machine_config &config)
m_i8088->set_addrmap(AS_IO, &rainbow_modelb_state::rainbow8088_io);
RAM(config, m_ram).set_default_size("128K").set_extra_options("128K,192K,256K,320K,384K,448K,512K,576K,640K,704K,768K,832K,896K");
m_kbd8251->dtr_handler().set(FUNC(rainbow_modelb_state::irq_hi_w));
+
+ DS1216E(config, m_rtc); // DS1315 (ClikClok for DEC-100 B) * OPTIONAL *
}
//----------------------------------------------------------------------------------------