summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/thmfc1.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/thmfc1.h')
-rw-r--r--src/devices/machine/thmfc1.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/devices/machine/thmfc1.h b/src/devices/machine/thmfc1.h
new file mode 100644
index 00000000000..60a6d0f9183
--- /dev/null
+++ b/src/devices/machine/thmfc1.h
@@ -0,0 +1,106 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+
+#ifndef MAME_MACHINE_THMFC1_H
+#define MAME_MACHINE_THMFC1_H
+
+#pragma once
+
+#include "imagedev/floppy.h"
+
+class thmfc1_device : public device_t
+{
+public:
+ thmfc1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual ~thmfc1_device() = default;
+
+ void map(address_map &map) ATTR_COLD;
+
+protected:
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+ virtual void device_post_load() override;
+
+ TIMER_CALLBACK_MEMBER(motor_off);
+
+private:
+ enum {
+ S0_BYTE = 0x80,
+ S0_END = 0x10,
+ S0_FREE = 0x08,
+ S0_CRCER = 0x04,
+ S0_DREQ = 0x02,
+ S0_SYNC = 0x01,
+
+ S1_INDX = 0x40,
+ S1_DKCH = 0x20,
+ S1_MTON = 0x10,
+ S1_TRK0 = 0x08,
+ S1_WPRT = 0x04,
+ S1_RDY = 0x02,
+
+ C0_FM = 0x20,
+ C0_ENSYN = 0x10,
+ C0_NOMCK = 0x08,
+ C0_WGC = 0x04,
+
+ C1_SIDE = 0x10,
+ C1_DSYRD = 0x01,
+
+ C2_SISELB = 0x40,
+ C2_DIRECB = 0x20,
+ C2_STEP = 0x10,
+ C2_MTON = 0x04,
+ C2_DRS1 = 0x02,
+ C2_DRS0 = 0x01,
+ };
+
+ enum {
+ S_IDLE,
+ S_WAIT_HEADER_SYNC,
+ S_VERIFY_HEADER,
+ S_SKIP_GAP,
+ S_WAIT_SECTOR_SYNC,
+ S_READ_SECTOR,
+ };
+
+ required_device_array<floppy_connector, 2> m_floppy;
+ floppy_image_device *m_cur_floppy;
+ emu_timer *m_timer_motoroff;
+
+ u64 m_last_sync, m_window_start;
+ int m_state;
+
+ u16 m_shift_reg, m_crc, m_bit_counter;
+ u8 m_data_reg;
+
+ u8 m_cmd0, m_cmd1, m_cmd2, m_stat0;
+ u8 m_data, m_clk, m_sect, m_trck, m_cell;
+
+ bool m_data_separator_phase;
+
+ u8 clk_bits() const;
+
+ void cmd0_w(u8 data);
+ void cmd1_w(u8 data);
+ void cmd2_w(u8 data);
+ void wdata_w(u8 data);
+ void wclk_w(u8 data);
+ void wsect_w(u8 data);
+ void wtrck_w(u8 data);
+ void wcell_w(u8 data);
+
+ u8 stat0_r();
+ u8 stat1_r();
+ u8 rdata_r();
+
+ u64 time_to_cycles(const attotime &tm) const;
+ attotime cycles_to_time(u64 cycles) const;
+
+ void sync();
+ bool read_one_bit(u64 limit, u64 &next_flux_change);
+};
+
+DECLARE_DEVICE_TYPE(THMFC1, thmfc1_device)
+
+#endif // MAME_MACHINE_THMFC1_H