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 DLL_PREFIX MB8877 : public DEVICE
30 outputs_t outputs_irq;
31 outputs_t outputs_drq;
32 outputs_t outputs_rdy;
36 NOISE* d_noise_head_down;
37 NOISE* d_noise_head_up;
54 int next_trans_position;
55 int bytes_before_2nd_drq;
56 int next_am1_position;
58 bool count_immediate; // Hack for FLEX.
63 uint8_t status, status_tmp;
64 uint8_t cmdreg, cmdreg_tmp;
75 void cancel_my_event(int event);
76 void register_my_event(int event, double usec);
77 bool register_my_event_with_check(int event, double usec);
78 void register_seek_event(bool first);
79 void register_drq_event(int bytes);
80 void register_lost_event(int bytes);
82 bool check_drive(void);
83 bool check_drive2(void);
101 uint32_t prev_drq_clock;
102 uint32_t seekend_clock;
106 bool invert_registers;
107 bool type_fm77av_2dd;
114 bool mb8877_no_busy_after_seek;
115 int mb8877_delay_after_seek;
119 int __FASTCALL get_cur_position();
120 double __FASTCALL get_usec_to_start_trans(bool first_sector);
121 double __FASTCALL get_usec_to_next_trans_pos(bool delay);
122 double __FASTCALL get_usec_to_detect_index_hole(int count, bool delay);
125 uint8_t search_track();
126 uint8_t search_sector();
127 uint8_t search_addr();
136 void cmd_readdata(bool first_sector);
137 void cmd_writedata(bool first_sector);
139 void cmd_readtrack();
140 void cmd_writetrack();
145 void update_head_flag(int drv, bool head_load);
146 virtual void update_ready();
149 void __FASTCALL set_irq(bool val);
150 void __FASTCALL set_drq(bool val);
153 MB8877(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
155 initialize_output_signals(&outputs_irq);
156 initialize_output_signals(&outputs_drq);
157 initialize_output_signals(&outputs_rdy);
159 d_noise_head_down = NULL;
160 d_noise_head_up = NULL;
161 // these parameters may be modified before calling initialize()
162 drvreg = sidereg = 0;
163 motor_on = drive_sel = false;
165 mb8877_delay_after_seek = 0;
166 fdc_debug_log = invert_registers = type_fm77av_2dd = false;
167 type_mb8866 = type_mb89311 = false;
168 type_x1 = type_fm7 = type_fmr50 = type_fmr60 = false;
169 mb8877_no_busy_after_seek = false;
171 _drive_mask = _max_drive - 1;
172 for(int i = 0; i < 16; i++) {
175 //#if defined(HAS_MB89311)
176 // set_device_name(_T("MB89311 FDC"));
177 //#elif defined(HAS_MB8866)
178 // set_device_name(_T("MB8866 FDC"));
179 //#elif defined(HAS_MB8876)
180 // set_device_name(_T("MB8876 FDC"));
182 // set_device_name(_T("MB8877 FDC"));
188 void initialize() override;
189 void release() override;
190 void reset() override;
191 void __FASTCALL write_io8(uint32_t addr, uint32_t data) override;
192 uint32_t __FASTCALL read_io8(uint32_t addr) override;
193 void __FASTCALL write_dma_io8(uint32_t addr, uint32_t data) override;
194 uint32_t __FASTCALL read_dma_io8(uint32_t addr) override;
195 void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask) override;
196 uint32_t __FASTCALL read_signal(int ch) override;
197 void __FASTCALL event_callback(int event_id, int err) override;
198 void update_config() override;
199 bool is_debugger_available() override
203 bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) override;
204 bool process_state(FILEIO* state_fio, bool loading) override;
207 void set_context_irq(DEVICE* device, int id, uint32_t mask)
209 register_output_signal(&outputs_irq, device, id, mask);
211 void set_context_drq(DEVICE* device, int id, uint32_t mask)
213 register_output_signal(&outputs_drq, device, id, mask);
215 void set_context_rdy(DEVICE* device, int id, uint32_t mask)
217 register_output_signal(&outputs_rdy, device, id, mask);
219 void set_context_noise_seek(NOISE* device)
221 d_noise_seek = device;
223 NOISE* get_context_noise_seek()
227 void set_context_noise_head_down(NOISE* device)
229 d_noise_head_down = device;
231 NOISE* get_context_noise_head_down()
233 return d_noise_head_down;
235 void set_context_noise_head_up(NOISE* device)
237 d_noise_head_up = device;
239 NOISE* get_context_noise_head_up()
241 return d_noise_head_up;
243 DISK* get_disk_handler(int drv)
247 void open_disk(int drv, const _TCHAR* file_path, int bank);
248 void close_disk(int drv);
249 bool is_disk_inserted(int drv);
250 bool is_disk_changed(int drv);
251 void is_disk_protected(int drv, bool value);
252 bool is_disk_protected(int drv);
253 bool is_drive_ready();
254 bool is_drive_ready(int drv);
255 uint8_t get_media_type(int drv);
256 void set_drive_type(int drv, uint8_t type);
257 uint8_t get_drive_type(int drv);
258 void set_drive_rpm(int drv, int rpm);
259 void set_drive_mfm(int drv, bool mfm);
260 void set_track_size(int drv, int size);
261 uint8_t fdc_status();