summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/tanbus/radisc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/tanbus/radisc.cpp')
-rw-r--r--src/devices/bus/tanbus/radisc.cpp94
1 files changed, 47 insertions, 47 deletions
diff --git a/src/devices/bus/tanbus/radisc.cpp b/src/devices/bus/tanbus/radisc.cpp
index 383a8b0d1bb..add9a7e3945 100644
--- a/src/devices/bus/tanbus/radisc.cpp
+++ b/src/devices/bus/tanbus/radisc.cpp
@@ -11,6 +11,8 @@
#include "emu.h"
#include "radisc.h"
+#include "formats/acorn_dsk.h"
+#include "formats/flex_dsk.h"
#include "speaker.h"
@@ -31,32 +33,37 @@ static void tandos_floppies(device_slot_interface &device)
device.option_add("525qd", FLOPPY_525_QD);
}
+void tanbus_radisc_device::floppy_formats(format_registration &fr)
+{
+ fr.add_mfm_containers();
+ fr.add(FLOPPY_FLEX_FORMAT);
+ fr.add(FLOPPY_ACORN_SSD_FORMAT);
+}
+
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void tanbus_radisc_device::device_add_mconfig(machine_config &config)
{
- INPUT_MERGER_ANY_HIGH(config, m_irq_line).output_handler().set(FUNC(tanbus_radisc_device::fdc_irq_w));
+ INPUT_MERGER_ANY_HIGH(config, m_irq_line).output_handler().set(FUNC(tanbus_radisc_device::irq_w));
FD1793(config, m_fdc, 4_MHz_XTAL / 4);
- m_fdc->intrq_wr_callback().set(m_irq_line, FUNC(input_merger_device::in_w<IRQ_FDC>));
+ m_fdc->intrq_wr_callback().set(FUNC(tanbus_radisc_device::fdc_irq_w));
m_fdc->drq_wr_callback().set(FUNC(tanbus_radisc_device::fdc_drq_w));
- m_fdc->hld_wr_callback().set(FUNC(tanbus_radisc_device::fdc_hld_w));
m_fdc->set_force_ready(true);
- FLOPPY_CONNECTOR(config, m_floppies[0], tandos_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppies[1], tandos_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppies[2], tandos_floppies, nullptr, floppy_image_device::default_floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppies[3], tandos_floppies, nullptr, floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppies[0], tandos_floppies, "525qd", tanbus_radisc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppies[1], tandos_floppies, "525qd", tanbus_radisc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppies[2], tandos_floppies, nullptr, tanbus_radisc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppies[3], tandos_floppies, nullptr, tanbus_radisc_device::floppy_formats).enable_sound(true);
MC146818(config, m_rtc, 32.768_kHz_XTAL);
m_rtc->irq().set(m_irq_line, FUNC(input_merger_device::in_w<IRQ_RTC>));
- VIA6522(config, m_via, 4_MHz_XTAL / 4);
+ MOS6522(config, m_via, 4_MHz_XTAL / 4);
m_via->irq_handler().set(m_irq_line, FUNC(input_merger_device::in_w<IRQ_VIA>));
- /* audio hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 1000); // TODO: unknown frequency
m_beeper->add_route(ALL_OUTPUTS, "mono", 1.0);
@@ -75,13 +82,14 @@ tanbus_radisc_device::tanbus_radisc_device(const machine_config &mconfig, const
, device_tanbus_interface(mconfig, *this)
, m_fdc(*this, "fdc")
, m_floppies(*this, "fdc:%u", 0)
- , m_floppy(nullptr)
, m_rtc(*this, "rtc")
, m_via(*this, "via")
, m_irq_line(*this, "irq_line")
, m_beeper(*this, "beeper")
, m_beeper_state(0)
- , m_drive_control(0)
+ , m_status(0)
+ , m_irq_enable(0)
+ , m_drq_enable(0)
{
}
@@ -95,14 +103,6 @@ void tanbus_radisc_device::device_start()
}
//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void tanbus_radisc_device::device_reset()
-{
-}
-
-//-------------------------------------------------
// read - card read
//-------------------------------------------------
@@ -119,10 +119,10 @@ uint8_t tanbus_radisc_device::read(offs_t offset, int inhrom, int inhram, int be
data = m_fdc->read(offset & 0x03);
break;
case 0xbf94:
- data = control_r();
+ data = status_r();
break;
- case 0xbf98: case 0xbf99:
- data = m_rtc->read(offset & 0x01);
+ case 0xbf99:
+ data = m_rtc->data_r();
break;
}
@@ -150,8 +150,11 @@ void tanbus_radisc_device::write(offs_t offset, uint8_t data, int inhrom, int in
m_beeper_state ^= 1;
m_beeper->set_state(m_beeper_state);
break;
- case 0xbf98: case 0xbf99:
- m_rtc->write(offset & 0x01, data);
+ case 0xbf98:
+ m_rtc->address_w(data);
+ break;
+ case 0xbf99:
+ m_rtc->data_w(data);
break;
}
}
@@ -160,54 +163,51 @@ void tanbus_radisc_device::write(offs_t offset, uint8_t data, int inhrom, int in
// IMPLEMENTATION
//**************************************************************************
-void tanbus_radisc_device::control_w(uint8_t val)
+void tanbus_radisc_device::control_w(uint8_t data)
{
- logerror("control_w %02x\n", val);
- m_drive_control = val;
+ m_status = data & 0x3e;
// bit 0: irq enable
- m_irq_enable = BIT(val, 0);
+ m_irq_enable = BIT(data, 0);
// bit 1: data select (data stream controller)
// bit 2, 3: drive select
- m_floppy = m_floppies[(val >> 2) & 0x03]->get_device();
- m_fdc->set_floppy(m_floppy);
+ floppy_image_device *floppy = m_floppies[BIT(data, 2, 2)]->get_device();
+ m_fdc->set_floppy(floppy);
// bit 4: side select
- if (m_floppy)
- m_floppy->ss_w(BIT(val, 4));
+ if (floppy)
+ floppy->ss_w(BIT(data, 4));
// bit 5: density
- m_fdc->dden_w(BIT(val, 5));
+ m_fdc->dden_w(BIT(data, 5));
- // bit 6: head load
- if (m_floppy)
- m_floppy->mon_w(BIT(val, 6));
+ // bit 6: head load timing
+ m_fdc->hlt_w(BIT(data, 6));
+ if (floppy)
+ floppy->mon_w(!BIT(data, 6));
// bit 7: drq enable
- m_drq_enable = BIT(val, 7);
+ m_drq_enable = BIT(data, 7);
}
-uint8_t tanbus_radisc_device::control_r()
+uint8_t tanbus_radisc_device::status_r()
{
- logerror("control_r %02x\n", m_drive_control);
- return m_drive_control;
+ return m_status | (m_fdc->drq_r() << 7) | (m_fdc->hld_r() << 6) | (m_fdc->intrq_r() << 0);
}
-WRITE_LINE_MEMBER(tanbus_radisc_device::fdc_drq_w)
+void tanbus_radisc_device::fdc_drq_w(int state)
{
m_tanbus->so_w((m_drq_enable && state) ? ASSERT_LINE : CLEAR_LINE);
}
-WRITE_LINE_MEMBER(tanbus_radisc_device::fdc_irq_w)
+void tanbus_radisc_device::fdc_irq_w(int state)
{
- m_tanbus->irq_w((m_irq_enable && state) ? ASSERT_LINE : CLEAR_LINE);
+ m_irq_line->in_w<IRQ_FDC>((m_irq_enable && state) ? ASSERT_LINE : CLEAR_LINE);
}
-WRITE_LINE_MEMBER(tanbus_radisc_device::fdc_hld_w)
+void tanbus_radisc_device::irq_w(int state)
{
- logerror("fdc_hld_w %d\n", state);
- if (m_floppy)
- m_floppy->mon_w(state);
+ m_tanbus->irq_w(state ? ASSERT_LINE : CLEAR_LINE);
}