1 // license:BSD-3-Clause 2 // copyright-holders:Olivier Galibert 3 /********************************************************************* 4 5 wozfdc.h 6 7 Apple Disk II floppy disk controller 8 9 *********************************************************************/ 10 11 #ifndef MAME_MACHINE_WOZFDC_H 12 #define MAME_MACHINE_WOZFDC_H 13 14 #pragma once 15 16 #include "imagedev/floppy.h" 17 #include "formats/flopimg.h" 18 #include "machine/74259.h" 19 20 //************************************************************************** 21 // TYPE DEFINITIONS 22 //************************************************************************** 23 24 25 class wozfdc_device: 26 public device_t 27 { 28 public: 29 // optional information overrides 30 virtual const tiny_rom_entry *device_rom_region() const override; 31 virtual void device_add_mconfig(machine_config &config) override; 32 33 uint8_t read(offs_t offset); 34 void write(offs_t offset, uint8_t data); 35 36 protected: 37 // construction/destruction 38 wozfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 39 40 virtual void device_start() override; 41 virtual void device_reset() override; 42 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 43 44 void control(int offset); 45 void set_phase(uint8_t data); 46 uint64_t time_to_cycles(const attotime &tm); 47 attotime cycles_to_time(uint64_t cycles); 48 void a3_update_drive_sel(); 49 50 void lss_start(); 51 void lss_sync(); 52 53 enum { 54 MODE_IDLE, MODE_ACTIVE, MODE_DELAY 55 }; 56 57 floppy_connector *floppy0, *floppy1, *floppy2, *floppy3; 58 floppy_image_device *floppy; 59 60 required_device<addressable_latch_device> m_phaselatch; 61 62 uint64_t cycles; 63 uint8_t data_reg, address; 64 attotime write_start_time; 65 attotime write_buffer[32]; 66 int write_position; 67 bool write_line_active; 68 69 const uint8_t *m_rom_p6; 70 uint8_t last_6502_write; 71 bool mode_write, mode_load; 72 int active; 73 emu_timer *timer, *delay_timer; 74 bool external_drive_select; 75 bool external_io_select; 76 77 int drvsel; 78 int enable1; 79 }; 80 81 class diskii_fdc_device : public wozfdc_device 82 { 83 public: 84 diskii_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 85 86 void set_floppies(floppy_connector *f0, floppy_connector *f1); 87 88 protected: 89 virtual void device_reset() override; 90 }; 91 92 class appleiii_fdc_device : public wozfdc_device 93 { 94 public: 95 appleiii_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 96 97 void set_floppies_4(floppy_connector *f0, floppy_connector *f1, floppy_connector *f2, floppy_connector *f3); 98 99 uint8_t read_c0dx(uint8_t offset); 100 void write_c0dx(uint8_t offset, uint8_t data); 101 102 protected: 103 virtual void device_reset() override; 104 105 private: 106 void control_dx(int offset); 107 }; 108 109 // device type definition 110 DECLARE_DEVICE_TYPE(DISKII_FDC, diskii_fdc_device) 111 DECLARE_DEVICE_TYPE(APPLEIII_FDC, appleiii_fdc_device) 112 113 #endif // MAME_MACHINE_WOZFDC_H 114