2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
8 [ MB8877 / MB8876 / MB8866 / MB89311 ]
18 #define SIG_MB8877_ACCESS 0
19 #define SIG_MB8877_DRIVEREG 1
20 #define SIG_MB8877_SIDEREG 2
21 #define SIG_MB8877_MOTOR 3
26 class MB8877 : public DEVICE
30 outputs_t outputs_irq;
31 outputs_t outputs_drq;
35 NOISE* d_noise_head_down;
36 NOISE* d_noise_head_up;
53 int next_trans_position;
54 int bytes_before_2nd_drq;
55 int next_am1_position;
57 bool count_immediate; // Hack for FLEX.
62 uint8_t status, status_tmp;
63 uint8_t cmdreg, cmdreg_tmp;
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);
81 bool check_drive(void);
82 bool check_drive2(void);
100 uint32_t prev_drq_clock;
101 uint32_t seekend_clock;
105 bool invert_registers;
106 bool type_fm77av_2dd;
113 bool mb8877_no_busy_after_seek;
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);
123 uint8_t search_track();
124 uint8_t search_sector();
125 uint8_t search_addr();
134 void cmd_readdata(bool first_sector);
135 void cmd_writedata(bool first_sector);
137 void cmd_readtrack();
138 void cmd_writetrack();
143 void update_head_flag(int drv, bool head_load);
146 void set_irq(bool val);
147 void set_drq(bool val);
149 void decl_state_fdc(int ch);
151 MB8877(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
153 initialize_output_signals(&outputs_irq);
154 initialize_output_signals(&outputs_drq);
156 d_noise_head_down = NULL;
157 d_noise_head_up = NULL;
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;
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"));
173 // set_device_name(_T("MB8877 FDC"));
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);
194 void save_state(FILEIO* state_fio);
195 bool load_state(FILEIO* state_fio);
198 void set_context_irq(DEVICE* device, int id, uint32_t mask)
200 register_output_signal(&outputs_irq, device, id, mask);
202 void set_context_drq(DEVICE* device, int id, uint32_t mask)
204 register_output_signal(&outputs_drq, device, id, mask);
206 void set_context_noise_seek(NOISE* device)
208 d_noise_seek = device;
210 NOISE* get_context_noise_seek()
214 void set_context_noise_head_down(NOISE* device)
216 d_noise_head_down = device;
218 NOISE* get_context_noise_head_down()
220 return d_noise_head_down;
222 void set_context_noise_head_up(NOISE* device)
224 d_noise_head_up = device;
226 NOISE* get_context_noise_head_up()
228 return d_noise_head_up;
230 DISK* get_disk_handler(int drv)
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();