From 7da65f10992f9bde8f83302cb4b6b8f006f77e58 Mon Sep 17 00:00:00 2001 From: arbee Date: Sat, 24 Sep 2022 16:59:14 -0400 Subject: apple2e.cpp: all Laser 128 models now use the new floppy system and can run .woz images. [R. Belmont] --- src/mame/apple/apple2e.cpp | 142 +++++++++++++++++++++++++++------------------ 1 file changed, 86 insertions(+), 56 deletions(-) diff --git a/src/mame/apple/apple2e.cpp b/src/mame/apple/apple2e.cpp index c006c8cf2a8..d2862996580 100644 --- a/src/mame/apple/apple2e.cpp +++ b/src/mame/apple/apple2e.cpp @@ -122,8 +122,6 @@ MIG RAM page 2 $CE02 is the speaker/slot bitfield and $CE03 is the paddle/accele #include "cpu/z80/z80.h" #include "imagedev/cassette.h" #include "imagedev/flopdrv.h" -#include "machine/appldriv.h" -#include "machine/applefdc.h" #include "machine/applefdintf.h" #include "machine/bankdev.h" #include "machine/ds1315.h" @@ -235,8 +233,7 @@ public: m_lcbank(*this, A2_LCBANK_TAG), m_acia1(*this, IIC_ACIA1_TAG), m_acia2(*this, IIC_ACIA2_TAG), - m_laserudc(*this, LASER128_UDC_TAG), - m_iicpiwm(*this, "fdc"), + m_iwm(*this, "fdc"), m_floppy(*this, "fdc:%d", 0U), m_ds1315(*this, "nsc"), m_printer_conn(*this, "parallel"), @@ -255,6 +252,8 @@ public: m_pal = false; m_cur_floppy = nullptr; m_devsel = 0; + m_laser_speed = 0; + m_laser_fdc_on = false; } required_device m_maincpu; @@ -279,8 +278,7 @@ public: memory_view m_0800bank, m_2000bank, m_4000bank, m_c100bank; memory_view m_c300bank, m_c400bank, m_c800bank, m_lcbank; optional_device m_acia1, m_acia2; - optional_device m_laserudc; - optional_device m_iicpiwm; + optional_device m_iwm; optional_device_array m_floppy; required_device m_ds1315; optional_device m_printer_conn; @@ -466,9 +464,10 @@ private: bool m_accel_temp_slowdown; bool m_accel_laser; bool m_has_laser_mouse; + bool m_laser_fdc_on; int m_accel_stage; u32 m_accel_speed; - u8 m_accel_slotspk, m_accel_gameio; + u8 m_accel_slotspk, m_accel_gameio, m_laser_speed; emu_timer *m_strobe_timer; u8 m_next_strobe; @@ -511,6 +510,7 @@ private: void accel_full_speed(); void accel_normal_speed(); void accel_slot(int slot); + void laser_calc_speed(); u8 m_cec_remap[0x40000]; @@ -525,6 +525,20 @@ private: floppy_image_device *m_cur_floppy; int m_devsel; + u8 laser_motor_r(offs_t offset) + { + m_laser_fdc_on = (offset == 1); + laser_calc_speed(); + return m_iwm->read(offset + 8); + } + + void laser_motor_w(offs_t offset, u8 data) + { + m_laser_fdc_on = (offset == 1); + laser_calc_speed(); + m_iwm->write(offset + 8, data); + } + offs_t dasm_trampoline(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer ¶ms); }; @@ -585,7 +599,7 @@ void apple2e_state::mig_w(u16 offset, u8 data) if (offset == 0x40) { - m_iicpiwm->reset(); + m_iwm->reset(); return; } @@ -695,7 +709,7 @@ void apple2e_state::recalc_active_device() m_cur_floppy = nullptr; } - m_iicpiwm->set_floppy(m_cur_floppy); + m_iwm->set_floppy(m_cur_floppy); if (m_cur_floppy) { @@ -1101,6 +1115,8 @@ void apple2e_state::machine_start() save_item(NAME(m_ace500rombank)); save_item(NAME(m_ace_cnxx_bank)); save_item(NAME(m_ace2200_axxx_bank)); + save_item(NAME(m_laser_speed)); + save_item(NAME(m_laser_fdc_on)); } void apple2e_state::machine_reset() @@ -1138,6 +1154,7 @@ void apple2e_state::machine_reset() m_accel_temp_slowdown = false; m_accel_fast = false; m_centronics_busy = false; + m_35sel = false; // is Zip enabled? if (m_sysconfig->read() & 0x10) @@ -2091,30 +2108,43 @@ u8 apple2e_state::c000_laser_r(offs_t offset) return c000_r(offset); } -void apple2e_state::c000_laser_w(offs_t offset, u8 data) +void apple2e_state::laser_calc_speed() { - if ((m_accel_laser) && (offset == 0x74)) + if (m_laser_fdc_on) { - switch ((data & 0xc0) >> 6) - { - case 0: - case 1: - accel_normal_speed(); - m_accel_fast = false; - break; + accel_normal_speed(); + m_accel_fast = false; + return; + } - case 2: - m_accel_speed = A2BUS_7M_CLOCK/3; // 2.38 MHz - m_accel_fast = true; - accel_full_speed(); - break; + switch ((m_laser_speed & 0xc0) >> 6) + { + case 0: + case 1: + accel_normal_speed(); + m_accel_fast = false; + break; - case 3: - m_accel_speed = A2BUS_7M_CLOCK/2; // 3.58 MHz - m_accel_fast = true; - accel_full_speed(); - break; - } + case 2: + m_accel_speed = A2BUS_7M_CLOCK/3; // 2.38 MHz + m_accel_fast = true; + accel_full_speed(); + break; + + case 3: + m_accel_speed = A2BUS_7M_CLOCK/2; // 3.58 MHz + m_accel_fast = true; + accel_full_speed(); + break; + } +} + +void apple2e_state::c000_laser_w(offs_t offset, u8 data) +{ + if ((m_accel_laser) && (offset == 0x74)) + { + m_laser_speed = data; + laser_calc_speed(); } else { @@ -2846,7 +2876,7 @@ u8 apple2e_state::c080_r(offs_t offset) if ((m_isiicplus) && (slot == 6)) { - return m_iicpiwm->read(offset % 0x10); + return m_iwm->read(offset % 0x10); } if (m_slotdevice[slot] != nullptr) @@ -2881,7 +2911,7 @@ void apple2e_state::c080_w(offs_t offset, u8 data) { if ((m_isiicplus) && (slot == 6)) { - m_iicpiwm->write(offset % 0x10, data); + m_iwm->write(offset % 0x10, data); return; } @@ -3643,7 +3673,8 @@ void apple2e_state::laser128_map(address_map &map) map(0xc0a8, 0xc0ab).rw(m_acia2, FUNC(mos6551_device::read), FUNC(mos6551_device::write)); map(0xc0c0, 0xc0cf).rw(FUNC(apple2e_state::laser_mouse_r), FUNC(apple2e_state::laser_mouse_w)); map(0xc0d0, 0xc0d3).rw(FUNC(apple2e_state::memexp_r), FUNC(apple2e_state::memexp_w)); - map(0xc0e0, 0xc0ef).rw(m_laserudc, FUNC(applefdc_base_device::read), FUNC(applefdc_base_device::write)); + map(0xc0e0, 0xc0ef).rw(m_iwm, FUNC(applefdintf_device::read), FUNC(applefdintf_device::write)); + map(0xc0e8, 0xc0e9).rw(FUNC(apple2e_state::laser_motor_r), FUNC(apple2e_state::laser_motor_w)); map(0xc1c1, 0xc1c1).r(FUNC(apple2e_state::laserprn_busy_r)); } @@ -5163,10 +5194,10 @@ void apple2e_state::apple2cp(machine_config &config) config.device_remove("sl4"); config.device_remove("sl6"); - IWM(config, m_iicpiwm, A2BUS_7M_CLOCK, 1021800*2); - m_iicpiwm->phases_cb().set(FUNC(apple2e_state::phases_w)); - m_iicpiwm->sel35_cb().set(FUNC(apple2e_state::sel35_w)); - m_iicpiwm->devsel_cb().set(FUNC(apple2e_state::devsel_w)); + IWM(config, m_iwm, A2BUS_7M_CLOCK, 1021800*2); + m_iwm->phases_cb().set(FUNC(apple2e_state::phases_w)); + m_iwm->sel35_cb().set(FUNC(apple2e_state::sel35_w)); + m_iwm->devsel_cb().set(FUNC(apple2e_state::devsel_w)); applefdintf_device::add_525(config, m_floppy[0]); applefdintf_device::add_525(config, m_floppy[1]); @@ -5197,16 +5228,6 @@ void apple2e_state::apple2c_mem(machine_config &config) m_ram->set_default_size("128K").set_extra_options("128K, 384K, 640K, 896K, 1152K"); } -const applefdc_interface fdc_interface = -{ - apple525_set_lines, /* set_lines */ - apple525_set_enable_lines, /* set_enable_lines */ - - apple525_read_data, /* read_data */ - apple525_write_data, /* write_data */ - apple525_read_status /* read_status */ -}; - void apple2e_state::laser128(machine_config &config) { apple2c(config); @@ -5216,9 +5237,12 @@ void apple2e_state::laser128(machine_config &config) m_screen->set_screen_update(FUNC(apple2e_state::screen_update_tf)); - LEGACY_APPLEFDC(config, m_laserudc, &fdc_interface); - FLOPPY_APPLE(config, FLOPPY_0, &floppy_interface, 15, 16); - FLOPPY_APPLE(config, FLOPPY_1, &floppy_interface, 15, 16); + IWM(config, m_iwm, A2BUS_7M_CLOCK, 1021800 * 2); + m_iwm->phases_cb().set(FUNC(apple2e_state::phases_w)); + m_iwm->devsel_cb().set(FUNC(apple2e_state::devsel_w)); + + applefdintf_device::add_525(config, m_floppy[0]); + applefdintf_device::add_525(config, m_floppy[1]); config.device_remove("sl4"); config.device_remove("sl6"); @@ -5248,9 +5272,12 @@ void apple2e_state::laser128o(machine_config &config) m_screen->set_screen_update(FUNC(apple2e_state::screen_update_tf)); - LEGACY_APPLEFDC(config, m_laserudc, &fdc_interface); - FLOPPY_APPLE(config, FLOPPY_0, &floppy_interface, 15, 16); - FLOPPY_APPLE(config, FLOPPY_1, &floppy_interface, 15, 16); + IWM(config, m_iwm, A2BUS_7M_CLOCK, 1021800 * 2); + m_iwm->phases_cb().set(FUNC(apple2e_state::phases_w)); + m_iwm->devsel_cb().set(FUNC(apple2e_state::devsel_w)); + + applefdintf_device::add_525(config, m_floppy[0]); + applefdintf_device::add_525(config, m_floppy[1]); config.device_remove("sl4"); config.device_remove("sl6"); @@ -5281,9 +5308,12 @@ void apple2e_state::laser128ex2(machine_config &config) m_screen->set_screen_update(FUNC(apple2e_state::screen_update_tf)); - LEGACY_APPLEFDC(config, m_laserudc, &fdc_interface); - FLOPPY_APPLE(config, FLOPPY_0, &floppy_interface, 15, 16); - FLOPPY_APPLE(config, FLOPPY_1, &floppy_interface, 15, 16); + IWM(config, m_iwm, A2BUS_7M_CLOCK, 1021800 * 2); + m_iwm->phases_cb().set(FUNC(apple2e_state::phases_w)); + m_iwm->devsel_cb().set(FUNC(apple2e_state::devsel_w)); + + applefdintf_device::add_525(config, m_floppy[0]); + applefdintf_device::add_525(config, m_floppy[1]); config.device_remove("sl4"); config.device_remove("sl6"); @@ -5307,7 +5337,7 @@ void apple2e_state::laser128ex2(machine_config &config) void apple2e_state::ace500(machine_config &config) { apple2ee(config); - subdevice("flop_a2_orig")->set_filter("A2C"); // Filter list to compatible disks for this machine. + subdevice("flop_a2_orig")->set_filter("A2C"); // Filter list to compatible disks for this machine. M65C02(config.replace(), m_maincpu, 1021800); m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::ace500_map); -- cgit v1.2.3