OSDN Git Service

4fb940f8f73ac7266cba7301c8e490ae5f4dc3e0
[csp-qt/common_source_project-fm7.git] / source / src / vm / mb8877.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : XM7
5         Author : Takeda.Toshiya
6         Date   : 2006.12.06 -
7
8         [ MB8877 / MB8876 / MB8866 / MB89311 ]
9 */
10
11 #ifndef _MB8877_H_ 
12 #define _MB8877_H_
13
14 //#include "vm.h"
15 //#include "../emu.h"
16 #include "device.h"
17
18 #define SIG_MB8877_ACCESS       0
19 #define SIG_MB8877_DRIVEREG     1
20 #define SIG_MB8877_SIDEREG      2
21 #define SIG_MB8877_MOTOR        3
22
23 class DISK;
24 class NOISE;
25
26 class MB8877 : public DEVICE
27 {
28 private:
29         // output signals
30         outputs_t outputs_irq;
31         outputs_t outputs_drq;
32
33         // drive noise
34         NOISE* d_noise_seek;
35         NOISE* d_noise_head_down;
36         NOISE* d_noise_head_up;
37         
38         // drive info
39         struct {
40                 int track;
41                 int index;
42                 bool access;
43                 bool head_load;
44                 // write track
45                 bool id_written;
46                 bool sector_found;
47                 int sector_length;
48                 int sector_index;
49                 int side;
50                 bool side_changed;
51                 // timing
52                 int cur_position;
53                 int next_trans_position;
54                 int bytes_before_2nd_drq;
55                 int next_am1_position;
56                 uint32_t prev_clock;
57                 bool count_immediate; // Hack for FLEX.
58         } fdc[16];
59         DISK* disk[16];
60         
61         // registor
62         uint8_t status, status_tmp;
63         uint8_t cmdreg, cmdreg_tmp;
64         uint8_t trkreg;
65         uint8_t secreg;
66         uint8_t datareg;
67         uint8_t drvreg;
68         uint8_t sidereg;
69         uint8_t cmdtype;
70         
71         // event
72         int register_id[10];
73         
74         void cancel_my_event(int event);
75         void register_my_event(int event, double usec);
76         bool register_my_event_with_check(int event, double usec);
77         void register_seek_event();
78         void register_drq_event(int bytes);
79         void register_lost_event(int bytes);
80         
81         bool check_drive(void);
82         bool check_drive2(void);
83         
84         // status
85         bool now_search;
86         bool now_seek;
87         bool sector_changed;
88         int no_command;
89         int seektrk;
90         bool seekvct;
91         bool motor_on;
92         bool drive_sel;
93         
94 //#ifdef HAS_MB89311
95         // MB89311
96         bool extended_mode;
97 //#endif
98         
99         // timing
100         uint32_t prev_drq_clock;
101         uint32_t seekend_clock;
102
103         // flags
104         bool fdc_debug_log;
105         bool invert_registers;
106         bool type_fm77av_2dd;
107         bool type_mb8866;
108         bool type_mb89311;
109         bool type_x1;
110         bool type_fm7;
111         bool type_fmr50;
112         bool type_fmr60;
113         bool mb8877_no_busy_after_seek;
114         int _max_drive;
115         int _drive_mask;
116         
117         int get_cur_position();
118         double get_usec_to_start_trans(bool first_sector);
119         double get_usec_to_next_trans_pos(bool delay);
120         double get_usec_to_detect_index_hole(int count, bool delay);
121         
122         // image handler
123         uint8_t search_track();
124         uint8_t search_sector();
125         uint8_t search_addr();
126         
127         // command
128         void process_cmd();
129         void cmd_restore();
130         void cmd_seek();
131         void cmd_step();
132         void cmd_stepin();
133         void cmd_stepout();
134         void cmd_readdata(bool first_sector);
135         void cmd_writedata(bool first_sector);
136         void cmd_readaddr();
137         void cmd_readtrack();
138         void cmd_writetrack();
139 //#ifdef HAS_MB89311
140         void cmd_format();
141 //#endif
142         void cmd_forceint();
143         void update_head_flag(int drv, bool head_load);
144         
145         // irq/dma
146         void set_irq(bool val);
147         void set_drq(bool val);
148
149         void decl_state_fdc(int ch);
150 public:
151         MB8877(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
152         {
153                 initialize_output_signals(&outputs_irq);
154                 initialize_output_signals(&outputs_drq);
155                 d_noise_seek = NULL;
156                 d_noise_head_down = NULL;
157                 d_noise_head_up = NULL;
158                 motor_on = false;
159                 //
160                 fdc_debug_log = invert_registers = type_fm77av_2dd = false;
161                 type_mb8866 = type_mb89311 = false;
162                 type_x1 = type_fm7 = type_fmr50 = type_fmr60 = false;
163                 mb8877_no_busy_after_seek = false;
164                 _max_drive = 4;
165                 _drive_mask = _max_drive - 1;
166 //#if defined(HAS_MB89311)
167 //              set_device_name(_T("MB89311 FDC"));
168 //#elif defined(HAS_MB8866)
169 //              set_device_name(_T("MB8866 FDC"));
170 //#elif defined(HAS_MB8876)
171 //              set_device_name(_T("MB8876 FDC"));
172 //#else
173 //              set_device_name(_T("MB8877 FDC"));
174 //#endif
175         }
176         ~MB8877() {}
177         
178         // common functions
179         void initialize();
180         void release();
181         void reset();
182         void write_io8(uint32_t addr, uint32_t data);
183         uint32_t read_io8(uint32_t addr);
184         void write_dma_io8(uint32_t addr, uint32_t data);
185         uint32_t read_dma_io8(uint32_t addr);
186         void write_signal(int id, uint32_t data, uint32_t mask);
187         uint32_t read_signal(int ch);
188         void event_callback(int event_id, int err);
189         void update_config();
190 //#ifdef USE_DEBUGGER
191         void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
192 //#endif
193         void decl_state();
194         void save_state(FILEIO* state_fio);
195         bool load_state(FILEIO* state_fio);
196         
197         // unique functions
198         void set_context_irq(DEVICE* device, int id, uint32_t mask)
199         {
200                 register_output_signal(&outputs_irq, device, id, mask);
201         }
202         void set_context_drq(DEVICE* device, int id, uint32_t mask)
203         {
204                 register_output_signal(&outputs_drq, device, id, mask);
205         }
206         void set_context_noise_seek(NOISE* device)
207         {
208                 d_noise_seek = device;
209         }
210         NOISE* get_context_noise_seek()
211         {
212                 return d_noise_seek;
213         }
214         void set_context_noise_head_down(NOISE* device)
215         {
216                 d_noise_head_down = device;
217         }
218         NOISE* get_context_noise_head_down()
219         {
220                 return d_noise_head_down;
221         }
222         void set_context_noise_head_up(NOISE* device)
223         {
224                 d_noise_head_up = device;
225         }
226         NOISE* get_context_noise_head_up()
227         {
228                 return d_noise_head_up;
229         }
230         DISK* get_disk_handler(int drv)
231         {
232                 return disk[drv];
233         }
234         void open_disk(int drv, const _TCHAR* file_path, int bank);
235         void close_disk(int drv);
236         bool is_disk_inserted(int drv);
237         void is_disk_protected(int drv, bool value);
238         bool is_disk_protected(int drv);
239         uint8_t get_media_type(int drv);
240         void set_drive_type(int drv, uint8_t type);
241         uint8_t get_drive_type(int drv);
242         void set_drive_rpm(int drv, int rpm);
243         void set_drive_mfm(int drv, bool mfm);
244         void set_track_size(int drv, int size);
245         uint8_t fdc_status();
246 };
247
248 #endif