diff options
Diffstat (limited to 'src/devices/machine/swim3.h')
-rw-r--r-- | src/devices/machine/swim3.h | 77 |
1 files changed, 75 insertions, 2 deletions
diff --git a/src/devices/machine/swim3.h b/src/devices/machine/swim3.h index 3315c5d9887..c3cf7d9361e 100644 --- a/src/devices/machine/swim3.h +++ b/src/devices/machine/swim3.h @@ -11,7 +11,7 @@ #pragma once #include "applefdintf.h" - +#include "machine/fdc_pll.h" //************************************************************************** // TYPE DEFINITIONS @@ -24,9 +24,16 @@ public: // construction/destruction swim3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + auto irq_cb() { return m_irq_cb.bind(); } + auto drq_cb() { return m_drq_cb.bind(); } + virtual u8 read(offs_t offset) override; virtual void write(offs_t offset, u8 data) override; + // For direct dma access + u8 dma_r(); + void dma_w(u8 data); + virtual void set_floppy(floppy_image_device *floppy) override; virtual floppy_image_device *get_floppy() const override; @@ -38,9 +45,75 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: + enum { + S_IDLE, + + S_STEP, + S_STEP_1, + S_STEP_0, + S_STEP_DONE, + + S_ID, + }; + + enum { + L_IDLE, + + L_GCR_SEARCH_ID, + + L_MFM_SEARCH_ID, + L_MFM_SCAN_ID, + L_MFM_READ_ID, + L_MFM_READ_ID_BYTE, + + L_MFM_SEARCH_DATA, + L_MFM_SCAN_DATA, + L_MFM_READ_DATA, + L_MFM_READ_DATA_BYTE, + }; + + struct live_info { + attotime tm; + fdc_pll_t pll; + int state, next_state; + u16 shift_reg; + u16 crc; + int bit_counter; + bool data_separator_phase, data_bit_context; + uint8_t data_reg; + }; + + devcb_write_line m_irq_cb, m_drq_cb; + emu_timer *m_timer; floppy_image_device *m_floppy; + + live_info m_cur_live, m_checkpoint_live; + u8 m_param; - u8 m_mode, m_setup, m_irq, m_imask, m_step; + u8 m_mode, m_setup, m_irq, m_imask, m_step, m_error; + u8 m_cur_track, m_cur_sector, m_cur_format; + u8 m_gap, m_sect1, m_xfer, m_fifo[2], m_fifo_pos; + + bool m_drq_write; + + int m_state; + + void update_irq(); + void update_drq(); + void index_callback(floppy_image_device *floppy, int state); + void run(bool timeout, bool index); + void delay(int); + void checkpoint(); + void rollback(); + void live_abort(); + void live_delay(int state); + bool read_one_bit(const attotime &limit); + bool write_one_bit(const attotime &limit); + void live_start(int state, bool start_writing = false); + void live_run(attotime limit = attotime::never); + + void fifo_push(u8 data); + u8 fifo_pop(); void show_mode() const; }; |