OSDN Git Service

[VM][COMMON_VM] Include IO:: class to common_vm.
[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(bool first);
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  mb8877_delay_after_seek;
115         int _max_drive;
116         int _drive_mask;
117         
118         int __FASTCALL get_cur_position();
119         double __FASTCALL  get_usec_to_start_trans(bool first_sector);
120         double __FASTCALL get_usec_to_next_trans_pos(bool delay);
121         double __FASTCALL get_usec_to_detect_index_hole(int count, bool delay);
122         
123         // image handler
124         uint8_t search_track();
125         uint8_t search_sector();
126         uint8_t search_addr();
127         
128         // command
129         void process_cmd();
130         void cmd_restore();
131         void cmd_seek();
132         void cmd_step();
133         void cmd_stepin();
134         void cmd_stepout();
135         void cmd_readdata(bool first_sector);
136         void cmd_writedata(bool first_sector);
137         void cmd_readaddr();
138         void cmd_readtrack();
139         void cmd_writetrack();
140 //#ifdef HAS_MB89311
141         void cmd_format();
142 //#endif
143         void cmd_forceint();
144         void update_head_flag(int drv, bool head_load);
145         
146         // irq/dma
147         void __FASTCALL set_irq(bool val);
148         void __FASTCALL set_drq(bool val);
149
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                 // these parameters may be modified before calling initialize()
159                 drvreg = sidereg = 0;
160                 motor_on = drive_sel = false;
161                 //
162                 mb8877_delay_after_seek = 0;
163                 fdc_debug_log = invert_registers = type_fm77av_2dd = false;
164                 type_mb8866 = type_mb89311 = false;
165                 type_x1 = type_fm7 = type_fmr50 = type_fmr60 = false;
166                 mb8877_no_busy_after_seek = false;
167                 _max_drive = 4;
168                 _drive_mask = _max_drive - 1;
169 //#if defined(HAS_MB89311)
170 //              set_device_name(_T("MB89311 FDC"));
171 //#elif defined(HAS_MB8866)
172 //              set_device_name(_T("MB8866 FDC"));
173 //#elif defined(HAS_MB8876)
174 //              set_device_name(_T("MB8876 FDC"));
175 //#else
176 //              set_device_name(_T("MB8877 FDC"));
177 //#endif
178         }
179         ~MB8877() {}
180         
181         // common functions
182         void initialize();
183         void release();
184         void reset();
185         void __FASTCALL write_io8(uint32_t addr, uint32_t data);
186         uint32_t __FASTCALL read_io8(uint32_t addr);
187         void __FASTCALL write_dma_io8(uint32_t addr, uint32_t data);
188         uint32_t __FASTCALL read_dma_io8(uint32_t addr);
189         void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
190         uint32_t __FASTCALL read_signal(int ch);
191         void event_callback(int event_id, int err);
192         void update_config();
193         bool is_debugger_available()
194         {
195                 return true;
196         }
197         bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
198         bool process_state(FILEIO* state_fio, bool loading);
199         
200         // unique functions
201         void set_context_irq(DEVICE* device, int id, uint32_t mask)
202         {
203                 register_output_signal(&outputs_irq, device, id, mask);
204         }
205         void set_context_drq(DEVICE* device, int id, uint32_t mask)
206         {
207                 register_output_signal(&outputs_drq, device, id, mask);
208         }
209         void set_context_noise_seek(NOISE* device)
210         {
211                 d_noise_seek = device;
212         }
213         NOISE* get_context_noise_seek()
214         {
215                 return d_noise_seek;
216         }
217         void set_context_noise_head_down(NOISE* device)
218         {
219                 d_noise_head_down = device;
220         }
221         NOISE* get_context_noise_head_down()
222         {
223                 return d_noise_head_down;
224         }
225         void set_context_noise_head_up(NOISE* device)
226         {
227                 d_noise_head_up = device;
228         }
229         NOISE* get_context_noise_head_up()
230         {
231                 return d_noise_head_up;
232         }
233         DISK* get_disk_handler(int drv)
234         {
235                 return disk[drv];
236         }
237         void open_disk(int drv, const _TCHAR* file_path, int bank);
238         void close_disk(int drv);
239         bool is_disk_inserted(int drv);
240         void is_disk_protected(int drv, bool value);
241         bool is_disk_protected(int drv);
242         uint8_t get_media_type(int drv);
243         void set_drive_type(int drv, uint8_t type);
244         uint8_t get_drive_type(int drv);
245         void set_drive_rpm(int drv, int rpm);
246         void set_drive_mfm(int drv, bool mfm);
247         void set_track_size(int drv, int size);
248         uint8_t fdc_status();
249 };
250
251 #endif