diff options
Diffstat (limited to 'src/devices/bus/oricext/microdisc.cpp')
-rw-r--r-- | src/devices/bus/oricext/microdisc.cpp | 131 |
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, µdisc_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); } |