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.cpp94
1 files changed, 39 insertions, 55 deletions
diff --git a/src/devices/bus/oricext/microdisc.cpp b/src/devices/bus/oricext/microdisc.cpp
index 16af24029e6..b85d56182f9 100644
--- a/src/devices/bus/oricext/microdisc.cpp
+++ b/src/devices/bus/oricext/microdisc.cpp
@@ -11,26 +11,41 @@ ROM_START( microdisc )
ROM_LOAD ("microdis.rom", 0, 0x02000, CRC(a9664a9c) SHA1(0d2ef6e67322f48f4b7e08d8bbe68827e2074561) )
ROM_END
-FLOPPY_FORMATS_MEMBER( oric_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);
}
-void oric_microdisc_device::map(address_map &map)
+void oric_microdisc_device::map_io(address_space_installer &space)
+{
+ 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)));
+}
+
+void oric_microdisc_device::map_rom()
{
- map(0x310, 0x313).rw("fdc", FUNC(fd1793_device::read), FUNC(fd1793_device::write));
- map(0x314, 0x314).rw(FUNC(oric_microdisc_device::port_314_r), FUNC(oric_microdisc_device::port_314_w));
- map(0x318, 0x318).r(FUNC(oric_microdisc_device::port_318_r));
+ (*view)[2].unmap_write(0xe000, 0xffff);
+ (*view)[2].install_rom(0xe000, 0xffff, microdisc_rom);
}
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(nullptr), port_314(0), intrq_state(false), drq_state(false), hld_state(false)
+ fdc(*this, "fdc"),
+ microdisc_rom(*this, "microdisc"),
+ floppies(*this, "fdc:%u", 0U),
+ port_314(0), intrq_state(false), drq_state(false), hld_state(false)
{
}
@@ -40,27 +55,15 @@ oric_microdisc_device::~oric_microdisc_device()
void oric_microdisc_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, &oric_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();
- }
intrq_state = drq_state = hld_state = false;
}
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 *oric_microdisc_device::device_rom_region() const
@@ -82,37 +85,17 @@ void oric_microdisc_device::device_add_mconfig(machine_config &config)
FLOPPY_CONNECTOR(config, "fdc:3", microdisc_floppies, nullptr, oric_microdisc_device::floppy_formats);
}
-void oric_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);
- }
- }
-}
-
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) {
@@ -132,20 +115,21 @@ uint8_t oric_microdisc_device::port_318_r()
return drq_state ? 0x7f : 0xff;
}
-WRITE_LINE_MEMBER(oric_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(oric_microdisc_device::fdc_drq_w)
+void oric_microdisc_device::fdc_drq_w(int state)
{
drq_state = state;
}
-WRITE_LINE_MEMBER(oric_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);
}