summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/wd1010.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/wd1010.h')
-rw-r--r--src/devices/machine/wd1010.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/devices/machine/wd1010.h b/src/devices/machine/wd1010.h
new file mode 100644
index 00000000000..b5db9975693
--- /dev/null
+++ b/src/devices/machine/wd1010.h
@@ -0,0 +1,143 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ Western Digital WD1010-05 Winchester Disk Controller
+
+***************************************************************************/
+
+#ifndef MAME_MACHINE_WD1010_H
+#define MAME_MACHINE_WD1010_H
+
+#pragma once
+
+#include "imagedev/harddriv.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> wd1010_device
+
+class wd1010_device : public device_t
+{
+public:
+ // construction/destruction
+ wd1010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ auto out_intrq_callback() { return m_out_intrq_cb.bind(); }
+ auto out_bcr_callback() { return m_out_bcr_cb.bind(); }
+ auto in_data_callback() { return m_in_data_cb.bind(); }
+ auto out_data_callback() { return m_out_data_cb.bind(); }
+
+ DECLARE_READ8_MEMBER(read);
+ DECLARE_WRITE8_MEMBER(write);
+
+ DECLARE_WRITE_LINE_MEMBER(drdy_w);
+ DECLARE_WRITE_LINE_MEMBER(brdy_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+private:
+ enum
+ {
+ STATUS_ERR = 0x01, // error
+ STATUS_CIP = 0x02, // command in progress
+ STATUS_RSV = 0x04, // reserved
+ STATUS_DRQ = 0x08, // data request
+ STATUS_SC = 0x10, // seek complete
+ STATUS_WF = 0x20, // write fault
+ STATUS_RDY = 0x40, // drive ready
+ STATUS_BSY = 0x80 // controller busy
+ };
+
+ enum
+ {
+ ERR_DM = 0x01, // data address mark not found
+ ERR_TK = 0x02, // track zero error
+ ERR_AC = 0x04, // aborted command
+ ERR_RSV1 = 0x08, // reserved, forced to 0
+ ERR_ID = 0x10, // id not found
+ ERR_RSV2 = 0x20, // reserved, forced to 0
+ ERR_CRC = 0x40, // crc error
+ ERR_BB = 0x80 // bad block
+ };
+
+ enum
+ {
+ CMD_RESTORE = 1,
+ CMD_READ_SECTOR = 2,
+ CMD_WRITE_SECTOR = 3,
+ CMD_SCAN_ID = 4,
+ CMD_WRITE_FORMAT = 5,
+ CMD_SEEK = 7
+ };
+
+ enum
+ {
+ TIMER_SEEK,
+ TIMER_DATA
+ };
+
+ void set_error(int error);
+ void set_intrq(int state);
+ attotime get_stepping_rate();
+ void start_command();
+ void end_command();
+ int get_lbasector();
+
+ // extract values from sdh
+ int head() { return (m_sdh >> 0) & 0x07; }
+ int drive() { return (m_sdh >> 3) & 0x03; }
+ int sector_size()
+ {
+ const int S[4] = { 256, 512, 1024, 128 };
+ return S[(m_sdh >> 5) & 0x03];
+ }
+
+ void cmd_restore();
+ void cmd_read_sector();
+ void cmd_write_sector();
+ void cmd_scan_id();
+ void cmd_seek();
+
+ devcb_write_line m_out_intrq_cb;
+ devcb_write_line m_out_bcr_cb;
+ devcb_read8 m_in_data_cb;
+ devcb_write8 m_out_data_cb;
+
+ struct
+ {
+ harddisk_image_device *drive;
+ uint8_t head;
+ uint16_t cylinder;
+ uint8_t sector;
+ } m_drives[4];
+
+ emu_timer *m_seek_timer;
+ emu_timer *m_data_timer;
+
+ int m_intrq;
+ int m_brdy;
+ uint8_t m_stepping_rate;
+ uint8_t m_command;
+
+ // task file registers
+ uint8_t m_error;
+ uint8_t m_precomp;
+ uint8_t m_sector_count;
+ uint8_t m_sector_number;
+ uint16_t m_cylinder;
+ uint8_t m_sdh;
+ uint8_t m_status;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(WD1010, wd1010_device)
+
+#endif // MAME_MACHINE_WD1010_H