summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/dec/rainbow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/dec/rainbow.cpp')
-rw-r--r--src/mame/dec/rainbow.cpp123
1 files changed, 43 insertions, 80 deletions
diff --git a/src/mame/dec/rainbow.cpp b/src/mame/dec/rainbow.cpp
index cba9f19d317..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"),
@@ -508,19 +507,17 @@ public:
void rainbow_base(machine_config &config);
protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
TIMER_CALLBACK_MEMBER(command_tick);
TIMER_CALLBACK_MEMBER(switch_off_tick);
- void rainbow8088_base_map(address_map &map);
- void rainbow8088_base_io(address_map &map);
+ void rainbow8088_base_map(address_map &map) ATTR_COLD;
+ void rainbow8088_base_io(address_map &map) ATTR_COLD;
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);
@@ -599,9 +596,9 @@ protected:
void vram_w(offs_t offset, uint16_t data);
void GDC_vblank_irq(int state);
- void rainbowz80_io(address_map &map);
- void rainbowz80_mem(address_map &map);
- void upd7220_map(address_map &map);
+ void rainbowz80_io(address_map &map) ATTR_COLD;
+ void rainbowz80_mem(address_map &map) ATTR_COLD;
+ void upd7220_map(address_map &map) ATTR_COLD;
enum
{ // LOWEST PRIORITY
// Mnemonic - - - - - - TYPE ADDRESS - Source
@@ -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,44 +748,51 @@ 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")
{
}
void rainbow_modela(machine_config &config);
private:
- virtual void machine_reset() override;
+ virtual void machine_reset() override ATTR_COLD;
- void rainbow8088_map(address_map &map);
- void rainbow8088_io(address_map &map);
+ void rainbow8088_map(address_map &map) ATTR_COLD;
+ void rainbow8088_io(address_map &map) ATTR_COLD;
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")
{
}
void rainbow_modelb(machine_config &config);
private:
- virtual void machine_reset() override;
+ virtual void machine_reset() override ATTR_COLD;
- void rainbow8088_map(address_map &map);
- void rainbow8088_io(address_map &map);
+ void rainbow8088_map(address_map &map) ATTR_COLD;
+ void rainbow8088_io(address_map &map) ATTR_COLD;
void ext_ram_w(offs_t offset, uint8_t data);
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)
@@ -1151,7 +1153,7 @@ static INPUT_PORTS_START(rainbow100b_in)
PORT_DIPNAME(0x01, 0x00, "W18 (FACTORY TEST D, LEAVE OFF) (8251A: DSR)") PORT_TOGGLE
PORT_DIPSETTING(0x00, DEF_STR(Off))
PORT_DIPSETTING(0x01, DEF_STR(On))
- PORT_WRITE_LINE_DEVICE_MEMBER("kbdser", i8251_device, write_dsr)
+ PORT_WRITE_LINE_DEVICE_MEMBER("kbdser", FUNC(i8251_device::write_dsr))
// J17 jumper on FDC controller board shifts drive select (experimental) -
PORT_START("J17")
@@ -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));
@@ -3301,7 +3261,6 @@ void rainbow_base_state::rainbow_base(machine_config &config)
m_comm_port->option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE);
m_comm_port->option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE);
- m_comm_port->option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE);
m_comm_port->set_default_option("logitech_mouse");
printer.set_default_option("printer");
@@ -3331,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)
@@ -3340,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 *
}
//----------------------------------------------------------------------------------------
@@ -3465,6 +3428,6 @@ ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS */
-COMP(1982, rainbow100a, rainbow, 0, rainbow_modela, rainbow100b_in, rainbow_modela_state, empty_init, "Digital Equipment Corporation", "Rainbow 100-A", MACHINE_IS_SKELETON)
+COMP(1982, rainbow100a, rainbow, 0, rainbow_modela, rainbow100b_in, rainbow_modela_state, empty_init, "Digital Equipment Corporation", "Rainbow 100-A", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
COMP(1983, rainbow, 0, 0, rainbow_modelb, rainbow100b_in, rainbow_modelb_state, empty_init, "Digital Equipment Corporation", "Rainbow 100-B", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS)
COMP(1985, rainbow190, rainbow, 0, rainbow_modelb, rainbow100b_in, rainbow_modelb_state, empty_init, "Digital Equipment Corporation", "Rainbow 190-B", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_COLORS)