summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/oricext/microdisc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/oricext/microdisc.cpp')
-rw-r--r--src/devices/bus/oricext/microdisc.cpp131
1 files changed, 58 insertions, 73 deletions
diff --git a/src/devices/bus/oricext/microdisc.cpp b/src/devices/bus/oricext/microdisc.cpp
index a5e4bb4d889..9abe2debd27 100644
--- a/src/devices/bus/oricext/microdisc.cpp
+++ b/src/devices/bus/oricext/microdisc.cpp
@@ -4,115 +4,99 @@
#include "microdisc.h"
#include "formats/oric_dsk.h"
-DEFINE_DEVICE_TYPE(MICRODISC, microdisc_device, "microdisc", "Microdisc floppy drive interface")
+DEFINE_DEVICE_TYPE(ORIC_MICRODISC, oric_microdisc_device, "oric_microdisc", "Microdisc floppy drive interface")
ROM_START( microdisc )
ROM_REGION( 0x2000, "microdisc", 0 )
ROM_LOAD ("microdis.rom", 0, 0x02000, CRC(a9664a9c) SHA1(0d2ef6e67322f48f4b7e08d8bbe68827e2074561) )
ROM_END
-FLOPPY_FORMATS_MEMBER( microdisc_device::floppy_formats )
- FLOPPY_ORIC_DSK_FORMAT
-FLOPPY_FORMATS_END
+void oric_microdisc_device::floppy_formats(format_registration &fr)
+{
+ fr.add_mfm_containers();
+ fr.add(FLOPPY_ORIC_DSK_FORMAT);
+}
static void microdisc_floppies(device_slot_interface &device)
{
device.option_add("3dsdd", FLOPPY_3_DSDD);
+ device.option_add("3dsqd", FLOPPY_3_DSQD);
}
-void microdisc_device::map(address_map &map)
+void oric_microdisc_device::map_io(address_space_installer &space)
{
- map(0x310, 0x313).rw("fdc", FUNC(fd1793_device::read), FUNC(fd1793_device::write));
- map(0x314, 0x314).rw(FUNC(microdisc_device::port_314_r), FUNC(microdisc_device::port_314_w));
- map(0x318, 0x318).r(FUNC(microdisc_device::port_318_r));
+ space.install_read_handler(0x310, 0x313, read8sm_delegate(fdc, FUNC(fd1793_device::read)));
+ space.install_write_handler(0x310, 0x313, write8sm_delegate(fdc, FUNC(fd1793_device::write)));
+
+ space.install_read_handler(0x314, 0x314, read8smo_delegate(*this, FUNC(oric_microdisc_device::port_314_r)));
+ space.install_write_handler(0x314, 0x314, write8smo_delegate(*this, FUNC(oric_microdisc_device::port_314_w)));
+
+ space.install_read_handler(0x318, 0x318, read8smo_delegate(*this, FUNC(oric_microdisc_device::port_318_r)));
}
-microdisc_device::microdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- oricext_device(mconfig, MICRODISC, tag, owner, clock),
- fdc(*this, "fdc"), microdisc_rom(nullptr), port_314(0), intrq_state(false), drq_state(false), hld_state(false)
+void oric_microdisc_device::map_rom()
{
+ (*view)[2].unmap_write(0xe000, 0xffff);
+ (*view)[2].install_rom(0xe000, 0xffff, microdisc_rom);
}
-microdisc_device::~microdisc_device()
+oric_microdisc_device::oric_microdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, ORIC_MICRODISC, tag, owner, clock),
+ device_oricext_interface(mconfig, *this),
+ fdc(*this, "fdc"),
+ microdisc_rom(*this, "microdisc"),
+ floppies(*this, "fdc:%u", 0U),
+ port_314(0), intrq_state(false), drq_state(false), hld_state(false)
{
}
-void microdisc_device::device_start()
+oric_microdisc_device::~oric_microdisc_device()
{
- oricext_device::device_start();
- microdisc_rom = device().machine().root_device().memregion(this->subtag("microdisc").c_str())->base();
- cpu->space(AS_PROGRAM).install_device(0x0000, 0xffff, *this, &microdisc_device::map);
+}
- for(int i=0; i<4; i++) {
- char name[32];
- sprintf(name, "fdc:%d", i);
- floppies[i] = subdevice<floppy_connector>(name)->get_device();
- }
+void oric_microdisc_device::device_start()
+{
intrq_state = drq_state = hld_state = false;
}
-void microdisc_device::device_reset()
+void oric_microdisc_device::device_reset()
{
port_314 = 0x00;
+ view->select(2);
irq_w(false);
- remap();
- fdc->set_floppy(floppies[0]);
-
- // The bootstrap checksums part of the high ram and if the sum is
- // 0 it goes wrong.
- ram[0xe000] = 0x42;
+ fdc->set_floppy(floppies[0]->get_device());
}
-const tiny_rom_entry *microdisc_device::device_rom_region() const
+const tiny_rom_entry *oric_microdisc_device::device_rom_region() const
{
return ROM_NAME( microdisc );
}
-void microdisc_device::device_add_mconfig(machine_config &config)
+void oric_microdisc_device::device_add_mconfig(machine_config &config)
{
FD1793(config, fdc, 8_MHz_XTAL / 8);
- fdc->intrq_wr_callback().set(FUNC(microdisc_device::fdc_irq_w));
- fdc->drq_wr_callback().set(FUNC(microdisc_device::fdc_drq_w));
- fdc->hld_wr_callback().set(FUNC(microdisc_device::fdc_hld_w));
+ fdc->intrq_wr_callback().set(FUNC(oric_microdisc_device::fdc_irq_w));
+ fdc->drq_wr_callback().set(FUNC(oric_microdisc_device::fdc_drq_w));
+ fdc->hld_wr_callback().set(FUNC(oric_microdisc_device::fdc_hld_w));
fdc->set_force_ready(true);
- FLOPPY_CONNECTOR(config, "fdc:0", microdisc_floppies, "3dsdd", microdisc_device::floppy_formats);
- FLOPPY_CONNECTOR(config, "fdc:1", microdisc_floppies, nullptr, microdisc_device::floppy_formats);
- FLOPPY_CONNECTOR(config, "fdc:2", microdisc_floppies, nullptr, microdisc_device::floppy_formats);
- FLOPPY_CONNECTOR(config, "fdc:3", microdisc_floppies, nullptr, microdisc_device::floppy_formats);
-}
-
-void microdisc_device::remap()
-{
- if(port_314 & P_ROMDIS) {
- bank_c000_r->set_base(rom+0x0000);
- bank_e000_r->set_base(rom+0x2000);
- bank_f800_r->set_base(rom+0x3800);
- bank_c000_w->set_base(junk_write);
- bank_e000_w->set_base(junk_write);
- bank_f800_w->set_base(junk_write);
- } else {
- bank_c000_r->set_base(ram+0xc000);
- bank_c000_w->set_base(ram+0xc000);
- if(port_314 & P_EPROM) {
- bank_e000_r->set_base(ram+0xe000);
- bank_f800_r->set_base(ram+0xf800);
- bank_e000_w->set_base(ram+0xe000);
- bank_f800_w->set_base(ram+0xf800);
- } else {
- bank_e000_r->set_base(microdisc_rom+0x0000);
- bank_f800_r->set_base(microdisc_rom+0x1800);
- bank_e000_w->set_base(junk_write);
- bank_f800_w->set_base(junk_write);
- }
- }
+ FLOPPY_CONNECTOR(config, "fdc:0", microdisc_floppies, "3dsqd", oric_microdisc_device::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", microdisc_floppies, nullptr, oric_microdisc_device::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:2", microdisc_floppies, nullptr, oric_microdisc_device::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:3", microdisc_floppies, nullptr, oric_microdisc_device::floppy_formats);
}
-WRITE8_MEMBER(microdisc_device::port_314_w)
+void oric_microdisc_device::port_314_w(uint8_t data)
{
port_314 = data;
- remap();
- floppy_image_device *floppy = floppies[(port_314 >> 5) & 3];
+ if(port_314 & P_ROMDIS)
+ view->select(0);
+ else if(port_314 & P_EPROM)
+ view->select(1);
+ else
+ view->select(2);
+
+ floppy_image_device *floppy = floppies[(port_314 >> 5) & 3]->get_device();
fdc->set_floppy(floppy);
fdc->dden_w(port_314 & P_DDEN);
if(floppy) {
@@ -122,30 +106,31 @@ WRITE8_MEMBER(microdisc_device::port_314_w)
irq_w(intrq_state && (port_314 & P_IRQEN));
}
-READ8_MEMBER(microdisc_device::port_314_r)
+uint8_t oric_microdisc_device::port_314_r()
{
return (intrq_state && (port_314 & P_IRQEN)) ? 0x7f : 0xff;
}
-READ8_MEMBER(microdisc_device::port_318_r)
+uint8_t oric_microdisc_device::port_318_r()
{
return drq_state ? 0x7f : 0xff;
}
-WRITE_LINE_MEMBER(microdisc_device::fdc_irq_w)
+void oric_microdisc_device::fdc_irq_w(int state)
{
intrq_state = state;
irq_w(intrq_state && (port_314 & P_IRQEN));
}
-WRITE_LINE_MEMBER(microdisc_device::fdc_drq_w)
+void oric_microdisc_device::fdc_drq_w(int state)
{
drq_state = state;
}
-WRITE_LINE_MEMBER(microdisc_device::fdc_hld_w)
+void oric_microdisc_device::fdc_hld_w(int state)
{
- logerror("hld %d\n", state);
hld_state = state;
- floppies[(port_314 >> 5) & 3]->mon_w(!hld_state);
+ floppy_image_device *floppy = floppies[(port_314 >> 5) & 3]->get_device();
+ if(floppy)
+ floppy->mon_w(!hld_state);
}