OSDN Git Service

[General] Merge upstream 2018-05-24. Still not test to build, will test.
[csp-qt/common_source_project-fm7.git] / source / src / vm / upd765a.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : M88
5         Author : Takeda.Toshiya
6         Date   : 2006.09.17-
7
8         [ uPD765A ]
9 */
10
11 #ifndef _UPD765A_H_
12 #define _UPD765A_H_
13
14 //#include "vm.h"
15 //#include "../emu.h"
16 #include "device.h"
17
18 #define SIG_UPD765A_RESET       0
19 #define SIG_UPD765A_TC          1
20 #define SIG_UPD765A_MOTOR       2
21 #define SIG_UPD765A_MOTOR_NEG   3
22 #define SIG_UPD765A_DRVSEL      4
23 #define SIG_UPD765A_IRQ_MASK    5
24 #define SIG_UPD765A_DRQ_MASK    6
25 #define SIG_UPD765A_FREADY      7
26
27 class DISK;
28 class NOISE;
29
30 class UPD765A : public DEVICE
31 {
32 private:
33         // output signals
34         outputs_t outputs_irq;
35         outputs_t outputs_drq;
36         outputs_t outputs_hdu;
37         outputs_t outputs_index;
38         
39         // drive noise
40         NOISE* d_noise_seek;
41         NOISE* d_noise_head_down;
42         NOISE* d_noise_head_up;
43         
44         // fdc
45         struct {
46                 uint8_t track;
47                 uint8_t cur_track;
48                 uint8_t result;
49                 bool access;
50                 bool head_load;
51                 // timing
52                 int cur_position;
53                 int next_trans_position;
54                 uint32_t prev_clock;
55         } fdc[4];
56         DISK* disk[4];
57         
58         uint8_t hdu, hdue, id[4], eot, gpl, dtl;
59         
60         int phase, prevphase;
61         uint8_t status, seekstat, command;
62         uint32_t result;
63         int step_rate_time;
64         int head_unload_time;
65         bool no_dma_mode, motor_on;
66 //#ifdef UPD765A_DMA_MODE
67         bool dma_data_lost;
68 //#endif
69         bool irq_masked, drq_masked;
70         
71         uint8_t* bufptr;
72         uint8_t buffer[0x8000];
73         int count;
74         int event_phase;
75         int phase_id, drq_id, lost_id, result7_id, seek_step_id[4], seek_end_id[4], head_unload_id[4];
76         bool force_ready;
77         bool reset_signal;
78         bool prev_index;
79
80         int _max_drive;
81         bool _fdc_debug_log;
82         bool _upd765a_dma_mode;
83         bool _upd765a_ext_drvsel;
84         bool _upd765a_sence_intstat_result;
85         bool _upd765a_dont_wait_seek;
86         bool _upd765a_no_st0_at_for_seek;
87         bool _upd765a_wait_result7;
88         bool _upd765a_no_st1_en_or_for_result7;
89         
90         // timing
91         uint32_t prev_drq_clock;
92         
93         int get_cur_position(int drv);
94         double get_usec_to_exec_phase();
95         
96         // update status
97         void set_irq(bool val);
98         void set_drq(bool val);
99         void set_hdu(uint8_t val);
100         
101         // phase shift
102         void shift_to_idle();
103         void shift_to_cmd(int length);
104         void shift_to_exec();
105         void shift_to_read(int length);
106         void shift_to_write(int length);
107         void shift_to_scan(int length);
108         void shift_to_result(int length);
109         void shift_to_result7();
110         void shift_to_result7_event();
111         void start_transfer();
112         void finish_transfer();
113         
114         // command
115         void process_cmd(int cmd);
116         void cmd_sence_devstat();
117         void cmd_sence_intstat();
118         uint8_t get_devstat(int drv);
119         void cmd_seek();
120         void cmd_recalib();
121         void seek(int drv, int trk);
122         void seek_event(int drv);
123         void cmd_read_data();
124         void cmd_write_data();
125         void cmd_scan();
126         void cmd_read_diagnostic();
127         void read_data(bool deleted, bool scan);
128         void write_data(bool deleted);
129         void read_diagnostic();
130         uint32_t read_sector();
131         uint32_t write_sector(bool deleted);
132         uint32_t find_id();
133         uint32_t check_cond(bool write);
134         void get_sector_params();
135         bool id_incr();
136         void cmd_read_id();
137         void cmd_write_id();
138         uint32_t read_id();
139         uint32_t write_id();
140         void cmd_specify();
141         void cmd_invalid();
142         void update_head_flag(int drv, bool head_load);
143         
144 public:
145         UPD765A(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
146         {
147                 initialize_output_signals(&outputs_irq);
148                 initialize_output_signals(&outputs_drq);
149                 initialize_output_signals(&outputs_hdu);
150                 initialize_output_signals(&outputs_index);
151                 d_noise_seek = NULL;
152                 d_noise_head_down = NULL;
153                 d_noise_head_up = NULL;
154                 force_ready = false;
155                 raise_irq_when_media_changed = false;
156                 
157                 _max_drive = 4;
158                 _fdc_debug_log = false;
159                 _upd765a_dma_mode = _upd765a_ext_drvsel = _upd765a_sence_intstat_result = false;
160                 _upd765a_dont_wait_seek = _upd765a_no_st0_at_for_seek = false;
161                 _upd765a_wait_result7 = _upd765a_no_st1_en_or_for_result7 = false;
162                 set_device_name(_T("uPD765A FDC"));
163         }
164         ~UPD765A() {}
165         
166         // common functions
167         void initialize();
168         void release();
169         void reset();
170         void write_io8(uint32_t addr, uint32_t data);
171         uint32_t read_io8(uint32_t addr);
172         void write_dma_io8(uint32_t addr, uint32_t data);
173         uint32_t read_dma_io8(uint32_t addr);
174         void write_signal(int id, uint32_t data, uint32_t mask);
175         uint32_t read_signal(int ch);
176         void event_callback(int event_id, int err);
177         void update_config();
178         //#ifdef USE_DEBUGGER
179         void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
180 //#endif
181         void save_state(FILEIO* state_fio);
182         bool load_state(FILEIO* state_fio);
183         
184         // unique function
185         void set_context_irq(DEVICE* device, int id, uint32_t mask)
186         {
187                 register_output_signal(&outputs_irq, device, id, mask);
188         }
189         void set_context_drq(DEVICE* device, int id, uint32_t mask)
190         {
191                 register_output_signal(&outputs_drq, device, id, mask);
192         }
193         void set_context_hdu(DEVICE* device, int id, uint32_t mask)
194         {
195                 register_output_signal(&outputs_hdu, device, id, mask);
196         }
197         void set_context_index(DEVICE* device, int id, uint32_t mask)
198         {
199                 register_output_signal(&outputs_index, device, id, mask);
200         }
201         void set_context_noise_seek(NOISE* device)
202         {
203                 d_noise_seek = device;
204         }
205         NOISE* get_context_noise_seek()
206         {
207                 return d_noise_seek;
208         }
209         void set_context_noise_head_down(NOISE* device)
210         {
211                 d_noise_head_down = device;
212         }
213         NOISE* get_context_noise_head_down()
214         {
215                 return d_noise_head_down;
216         }
217         void set_context_noise_head_up(NOISE* device)
218         {
219                 d_noise_head_up = device;
220         }
221         NOISE* get_context_noise_head_up()
222         {
223                 return d_noise_head_up;
224         }
225         DISK* get_disk_handler(int drv)
226         {
227                 if(drv < 4) {
228                         return disk[drv];
229                 }
230                 return NULL;
231         }
232         void open_disk(int drv, const _TCHAR* file_path, int bank);
233         void close_disk(int drv);
234         bool is_disk_inserted(int drv);
235         bool is_disk_inserted();        // current hdu
236         bool disk_ejected(int drv);
237         bool disk_ejected();    // current hdu
238         void is_disk_protected(int drv, bool value);
239         bool is_disk_protected(int drv);
240         uint8_t media_type(int drv);
241         void set_drive_type(int drv, uint8_t type);
242         uint8_t get_drive_type(int drv);
243         void set_drive_rpm(int drv, int rpm);
244         void set_drive_mfm(int drv, bool mfm);
245         bool raise_irq_when_media_changed;
246 };
247
248 #endif
249