summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author arbee <rb6502@users.noreply.github.com>2017-11-05 09:22:58 -0500
committer arbee <rb6502@users.noreply.github.com>2017-11-05 09:22:58 -0500
commitab0aebccec7799a7e034e3fc6783310666bb183d (patch)
treed9d59c4039ddd6da1f4c84695dd63b3c498feef7
parentb03a8f7f6149504d0124e5977ba393050bfac43d (diff)
apple2: //e, //c, and friends now have No-Slot Clock support. [R. Belmont]
ds1315: Added support to emulate DS121x parts where the RTC sits in a ROM's address space. [R. Belmont]
-rw-r--r--src/devices/machine/ds1315.cpp49
-rw-r--r--src/devices/machine/ds1315.h24
-rw-r--r--src/mame/drivers/apple2e.cpp23
3 files changed, 73 insertions, 23 deletions
diff --git a/src/devices/machine/ds1315.cpp b/src/devices/machine/ds1315.cpp
index 7be26b1a19e..712fb39e5d0 100644
--- a/src/devices/machine/ds1315.cpp
+++ b/src/devices/machine/ds1315.cpp
@@ -1,12 +1,16 @@
// license:BSD-3-Clause
-// copyright-holders:Tim Lindner
+// copyright-holders:Tim Lindner, R. Belmont
/*****************************************************************************************
- ds1315.c
+ ds1315.cpp
Dallas Semiconductor's Phantom Time Chip DS1315.
NOTE: writes are decoded, but the host's time will always be returned when asked.
+ November 2017: R. Belmont added capability to emulate DS1216 and other DS121x
+ parts where the clock sits in the same place as a ROM. The backing callback
+ returns the ROM contents when the RTC is locked.
+
April 2015: chip enable / chip reset / phantom writes by Karl-Ludwig Deisenhofer
November 2001: implementation by Tim Lindner
@@ -29,7 +33,10 @@
DEFINE_DEVICE_TYPE(DS1315, ds1315_device, "ds1315", "Dallas DS1315 Phantom Time Chip")
ds1315_device::ds1315_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, DS1315, tag, owner, clock), m_mode(), m_count(0)
+ : device_t(mconfig, DS1315, tag, owner, clock),
+ m_backing_read(*this),
+ m_mode(),
+ m_count(0)
{
}
@@ -39,6 +46,8 @@ ds1315_device::ds1315_device(const machine_config &mconfig, const char *tag, dev
void ds1315_device::device_start()
{
+ m_backing_read.resolve_safe(0xff);
+
save_item(NAME(m_count));
save_item(NAME(m_mode));
save_item(NAME(m_raw_data));
@@ -77,6 +86,37 @@ static const uint8_t ds1315_pattern[] =
IMPLEMENTATION
***************************************************************************/
+// automated read, does all the work the real Dallas chip does
+READ8_MEMBER( ds1315_device::read )
+{
+ if (m_mode == DS_SEEK_MATCHING)
+ {
+ if (offset & 1)
+ {
+ read_1(space, 0);
+ }
+ else
+ {
+ read_0(space, 0);
+ }
+
+ if (offset & 4)
+ {
+ m_count = 0;
+ m_mode = DS_SEEK_MATCHING;
+ }
+
+ return m_backing_read(offset);
+ }
+ else if (m_mode == DS_CALENDAR_IO)
+ {
+ return read_data(space, offset);
+ }
+
+ return 0xff; // shouldn't happen, but compilers don't know that
+}
+
+
/*-------------------------------------------------
read_0 (actual data)
-------------------------------------------------*/
@@ -92,7 +132,6 @@ READ8_MEMBER( ds1315_device::read_0 )
m_mode = DS_CALENDAR_IO;
fill_raw_data();
}
-
return 0;
}
@@ -246,7 +285,7 @@ void ds1315_device::input_raw_data()
raw[6] = bcd_2_dec(raw[6]); // month
raw[7] = bcd_2_dec(raw[7]); // year (two digits)
- printf("\nDS1315 RTC INPUT (WILL BE IGNORED) mm/dd/yy hh:mm:ss - %02d/%02d/%02d %02d/%02d/%02d",
+ logerror("\nDS1315 RTC INPUT (WILL BE IGNORED) mm/dd/yy hh:mm:ss - %02d/%02d/%02d %02d/%02d/%02d",
raw[6], raw[5], raw[7], raw[3], raw[2], raw[1]
);
}
diff --git a/src/devices/machine/ds1315.h b/src/devices/machine/ds1315.h
index 0468232cf31..769ddc7c8f9 100644
--- a/src/devices/machine/ds1315.h
+++ b/src/devices/machine/ds1315.h
@@ -15,7 +15,15 @@
#pragma once
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+***************************************************************************/
+
+#define MCFG_DS1315_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, DS1315, 0)
+#define MCFG_DS1315_BACKING_HANDLER(_devcb) \
+ devcb = &ds1315_device::set_backing_handler(*device, DEVCB_##_devcb);
/***************************************************************************
MACROS
@@ -27,6 +35,9 @@ public:
ds1315_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~ds1315_device() {}
+ // this handler automates the bits 0/2 stuff
+ DECLARE_READ8_MEMBER(read);
+
DECLARE_READ8_MEMBER(read_0);
DECLARE_READ8_MEMBER(read_1);
DECLARE_READ8_MEMBER(read_data);
@@ -35,12 +46,17 @@ public:
bool chip_enable();
void chip_reset();
+ template <class Object> static devcb_base &set_backing_handler(device_t &device, Object &&cb)
+ { return downcast<ds1315_device &>(device).m_backing_read.set_callback(std::forward<Object>(cb)); }
+
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
+ devcb_read8 m_backing_read;
+
enum mode_t : u8
{
DS_SEEK_MATCHING,
@@ -61,12 +77,4 @@ ALLOW_SAVE_TYPE(ds1315_device::mode_t);
DECLARE_DEVICE_TYPE(DS1315, ds1315_device)
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_DS1315_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, DS1315, 0)
-
-
#endif // MAME_MACHINE_DS1315_H
diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp
index 4e685f59087..25d0ae6cdc1 100644
--- a/src/mame/drivers/apple2e.cpp
+++ b/src/mame/drivers/apple2e.cpp
@@ -113,6 +113,7 @@ Address bus A0-A11 is Y0-Y11
#include "machine/ram.h"
#include "machine/sonydriv.h"
#include "machine/timer.h"
+#include "machine/ds1315.h"
#include "bus/a2bus/a2bus.h"
#include "bus/a2bus/a2diskii.h"
@@ -241,7 +242,8 @@ public:
m_acia1(*this, IIC_ACIA1_TAG),
m_acia2(*this, IIC_ACIA2_TAG),
m_laserudc(*this, LASER128_UDC_TAG),
- m_iicpiwm(*this, IICP_IWM_TAG)
+ m_iicpiwm(*this, IICP_IWM_TAG),
+ m_ds1315(*this, "nsc")
{ }
required_device<cpu_device> m_maincpu;
@@ -274,6 +276,7 @@ public:
optional_device<mos6551_device> m_acia1, m_acia2;
optional_device<applefdc_base_device> m_laserudc;
optional_device<iwm_device> m_iicpiwm;
+ required_device<ds1315_device> m_ds1315;
TIMER_DEVICE_CALLBACK_MEMBER(apple2_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(ay3600_repeat);
@@ -356,6 +359,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(ay3600_ako_w);
DECLARE_READ8_MEMBER(memexp_r);
DECLARE_WRITE8_MEMBER(memexp_w);
+ DECLARE_READ8_MEMBER(nsc_backing_r);
private:
int m_speaker_state;
@@ -2171,17 +2175,12 @@ void apple2e_state::write_slot_rom(address_space &space, int slotbias, int offse
uint8_t apple2e_state::read_int_rom(address_space &space, int slotbias, int offset)
{
-#if 0
- if ((m_cnxx_slot == CNXX_UNCLAIMED) && (!machine().side_effect_disabled()))
- {
- m_cnxx_slot = CNXX_INTROM;
- update_slotrom_banks();
- }
-#endif
-
- return m_rom_ptr[slotbias + offset];
+ //return m_rom_ptr[slotbias + offset];
+ return m_ds1315->read(space, slotbias + offset);
}
+READ8_MEMBER(apple2e_state::nsc_backing_r) { return m_rom_ptr[offset]; }
+
READ8_MEMBER(apple2e_state::c100_r) { return read_slot_rom(space, 1, offset); }
READ8_MEMBER(apple2e_state::c100_int_r) { return read_int_rom(space, 0x100, offset); }
READ8_MEMBER(apple2e_state::c100_int_bank_r) { return read_int_rom(space, 0x4100, offset); }
@@ -3856,6 +3855,10 @@ static MACHINE_CONFIG_START( apple2e )
MCFG_SOUND_ADD(A2_SPEAKER_TAG, SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ /* DS1315 for no-slot clock */
+ MCFG_DS1315_ADD("nsc")
+ MCFG_DS1315_BACKING_HANDLER(READ8(apple2e_state, nsc_backing_r))
+
/* RAM */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("64K")