diff options
Diffstat (limited to 'src/devices/bus/vtech/memexp/floppy.cpp')
-rw-r--r-- | src/devices/bus/vtech/memexp/floppy.cpp | 66 |
1 files changed, 45 insertions, 21 deletions
diff --git a/src/devices/bus/vtech/memexp/floppy.cpp b/src/devices/bus/vtech/memexp/floppy.cpp index e1ad9939a42..47970b9a142 100644 --- a/src/devices/bus/vtech/memexp/floppy.cpp +++ b/src/devices/bus/vtech/memexp/floppy.cpp @@ -11,6 +11,8 @@ #include "emu.h" #include "floppy.h" +#include "formats/vt_dsk.h" +#include "formats/fs_vtech.h" //************************************************************************** @@ -19,12 +21,27 @@ DEFINE_DEVICE_TYPE(VTECH_FLOPPY_CONTROLLER, vtech_floppy_controller_device, "vtech_fdc", "Laser/VZ Floppy Disk Controller") -void vtech_floppy_controller_device::map(address_map &map) +//------------------------------------------------- +// mem_map - memory space address map +//------------------------------------------------- + +void vtech_floppy_controller_device::mem_map(address_map &map) +{ + map.unmap_value_high(); + map(0x4000, 0x5fff).rom().region("software", 0); +} + +//------------------------------------------------- +// io_map - io space address map +//------------------------------------------------- + +void vtech_floppy_controller_device::io_map(address_map &map) { - map(0, 0).w(FUNC(vtech_floppy_controller_device::latch_w)); - map(1, 1).r(FUNC(vtech_floppy_controller_device::shifter_r)); - map(2, 2).r(FUNC(vtech_floppy_controller_device::rd_r)); - map(3, 3).r(FUNC(vtech_floppy_controller_device::wpt_r)); + map.unmap_value_high(); + map(0x10, 0x10).w(FUNC(vtech_floppy_controller_device::latch_w)); + map(0x11, 0x11).r(FUNC(vtech_floppy_controller_device::shifter_r)); + map(0x12, 0x12).r(FUNC(vtech_floppy_controller_device::rd_r)); + map(0x13, 0x13).r(FUNC(vtech_floppy_controller_device::wpt_r)); } //------------------------------------------------- @@ -32,7 +49,7 @@ void vtech_floppy_controller_device::map(address_map &map) //------------------------------------------------- ROM_START( floppy ) - ROM_REGION(0x3000, "software", 0) + ROM_REGION(0x2000, "software", 0) ROM_LOAD("vzdos.rom", 0x0000, 0x2000, CRC(b6ed6084) SHA1(59d1cbcfa6c5e1906a32704fbf0d9670f0d1fd8b)) ROM_END @@ -47,14 +64,26 @@ const tiny_rom_entry *vtech_floppy_controller_device::device_rom_region() const static void laser_floppies(device_slot_interface &device) { - device.option_add("525", FLOPPY_525_SSSD); + device.option_add("525", FLOPPY_525_VTECH); +} + +void vtech_floppy_controller_device::floppy_formats(format_registration &fr) +{ + fr.add(FLOPPY_VTECH_BIN_FORMAT); + fr.add(FLOPPY_VTECH_DSK_FORMAT); + fr.add(FS_VTECH); } void vtech_floppy_controller_device::device_add_mconfig(machine_config &config) { + vtech_memexp_device::device_add_mconfig(config); + VTECH_MEMEXP_SLOT(config, m_memexp); - FLOPPY_CONNECTOR(config, m_floppy0, laser_floppies, "525", floppy_image_device::default_mfm_floppy_formats); - FLOPPY_CONNECTOR(config, m_floppy1, laser_floppies, "525", floppy_image_device::default_mfm_floppy_formats); + m_memexp->set_memspace(m_mem, AS_PROGRAM); + m_memexp->set_iospace(m_io, AS_PROGRAM); + + FLOPPY_CONNECTOR(config, m_floppy0, laser_floppies, "525", floppy_formats); + FLOPPY_CONNECTOR(config, m_floppy1, laser_floppies, "525", floppy_formats); } @@ -67,8 +96,7 @@ void vtech_floppy_controller_device::device_add_mconfig(machine_config &config) //------------------------------------------------- vtech_floppy_controller_device::vtech_floppy_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, VTECH_FLOPPY_CONTROLLER, tag, owner, clock), - device_vtech_memexp_interface(mconfig, *this), + vtech_memexp_device(mconfig, VTECH_FLOPPY_CONTROLLER, tag, owner, clock), m_memexp(*this, "mem"), m_floppy0(*this, "0"), m_floppy1(*this, "1"), @@ -82,6 +110,9 @@ vtech_floppy_controller_device::vtech_floppy_controller_device(const machine_con void vtech_floppy_controller_device::device_start() { + vtech_memexp_device::device_start(); + + // register for save states save_item(NAME(m_latch)); save_item(NAME(m_shifter)); save_item(NAME(m_latching_inverter)); @@ -92,13 +123,11 @@ void vtech_floppy_controller_device::device_start() // TODO: save m_write_buffer and rebuild m_floppy after load - uint8_t *bios = memregion("software")->base(); - // Obvious bugs... must have worked by sheer luck and very subtle // timings. Our current z80 is not subtle enough. - - bios[0x1678] = 0x75; - bios[0x1688] = 0x85; + uint8_t *rom = memregion("software")->base(); + rom[0x1678] = 0x75; + rom[0x1688] = 0x85; } //------------------------------------------------- @@ -107,10 +136,6 @@ void vtech_floppy_controller_device::device_start() void vtech_floppy_controller_device::device_reset() { - program_space().install_rom(0x4000, 0x5fff, memregion("software")->base()); - - io_space().install_device(0x10, 0x1f, *this, &vtech_floppy_controller_device::map); - m_latch = 0x00; m_floppy = nullptr; m_current_cyl = 0; @@ -152,7 +177,6 @@ void vtech_floppy_controller_device::latch_w(uint8_t data) m_floppy->setup_index_pulse_cb(floppy_image_device::index_pulse_cb()); } if(newflop) { - newflop->set_rpm(85); newflop->mon_w(0); newflop->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&vtech_floppy_controller_device::index_callback, this)); m_current_cyl = newflop->get_cyl() << 1; |