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