2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
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
30 class UPD765A : public DEVICE
34 outputs_t outputs_irq;
35 outputs_t outputs_drq;
36 outputs_t outputs_hdu;
37 outputs_t outputs_index;
41 NOISE* d_noise_head_down;
42 NOISE* d_noise_head_up;
53 int next_trans_position;
58 uint8_t hdu, hdue, id[4], eot, gpl, dtl;
61 uint8_t status, seekstat, command;
65 bool no_dma_mode, motor_on;
66 //#ifdef UPD765A_DMA_MODE
69 bool irq_masked, drq_masked;
72 uint8_t buffer[0x8000];
77 int phase_id, drq_id, lost_id, result7_id, seek_step_id[4], seek_end_id[4], head_unload_id[4];
84 bool _upd765a_dma_mode;
85 bool _upd765a_ext_drvsel;
86 bool _upd765a_sence_intstat_result;
87 bool _upd765a_dont_wait_seek;
88 bool _upd765a_no_st0_at_for_seek;
89 bool _upd765a_wait_result7;
90 bool _upd765a_no_st1_en_or_for_result7;
93 uint32_t prev_drq_clock;
95 int get_cur_position(int drv);
96 double get_usec_to_exec_phase();
99 void __FASTCALL set_irq(bool val);
100 void __FASTCALL set_drq(bool val);
101 void __FASTCALL set_hdu(uint8_t val);
104 void shift_to_idle();
105 void shift_to_cmd(int length);
106 void shift_to_exec();
107 void shift_to_read(int length);
108 void shift_to_write(int length);
109 void shift_to_scan(int length);
110 void shift_to_result(int length);
111 void shift_to_result7();
112 void shift_to_result7_event();
113 void start_transfer();
114 void finish_transfer();
117 void process_cmd(int cmd);
118 void cmd_sence_devstat();
119 void cmd_sence_intstat();
120 uint8_t get_devstat(int drv);
123 void seek(int drv, int trk);
124 void seek_event(int drv);
125 void cmd_read_data();
126 void cmd_write_data();
128 void cmd_read_diagnostic();
129 void read_data(bool deleted, bool scan);
130 void write_data(bool deleted);
131 void read_diagnostic();
132 uint32_t read_sector();
133 uint32_t write_sector(bool deleted);
135 uint32_t check_cond(bool write);
136 void get_sector_params();
144 void update_head_flag(int drv, bool head_load);
146 void process_state_fdc(int ch, FILEIO* state_fio, bool loading);
148 UPD765A(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
150 initialize_output_signals(&outputs_irq);
151 initialize_output_signals(&outputs_drq);
152 initialize_output_signals(&outputs_hdu);
153 initialize_output_signals(&outputs_index);
155 d_noise_head_down = NULL;
156 d_noise_head_up = NULL;
158 raise_irq_when_media_changed = false;
161 _fdc_debug_log = false;
162 _upd765a_dma_mode = _upd765a_ext_drvsel = _upd765a_sence_intstat_result = false;
163 _upd765a_dont_wait_seek = _upd765a_no_st0_at_for_seek = false;
164 _upd765a_wait_result7 = _upd765a_no_st1_en_or_for_result7 = false;
165 set_device_name(_T("uPD765A FDC"));
173 void __FASTCALL write_io8(uint32_t addr, uint32_t data);
174 uint32_t __FASTCALL read_io8(uint32_t addr);
175 void __FASTCALL write_dma_io8(uint32_t addr, uint32_t data);
176 uint32_t __FASTCALL read_dma_io8(uint32_t addr);
177 void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
178 uint32_t __FASTCALL read_signal(int ch);
179 void event_callback(int event_id, int err);
180 void update_config();
181 //#ifdef USE_DEBUGGER
182 bool is_debugger_available()
186 bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
188 bool process_state(FILEIO* state_fio, bool loading);
191 void set_context_irq(DEVICE* device, int id, uint32_t mask)
193 register_output_signal(&outputs_irq, device, id, mask);
195 void set_context_drq(DEVICE* device, int id, uint32_t mask)
197 register_output_signal(&outputs_drq, device, id, mask);
199 void set_context_hdu(DEVICE* device, int id, uint32_t mask)
201 register_output_signal(&outputs_hdu, device, id, mask);
203 void set_context_index(DEVICE* device, int id, uint32_t mask)
205 register_output_signal(&outputs_index, device, id, mask);
207 void set_context_noise_seek(NOISE* device)
209 d_noise_seek = device;
211 NOISE* get_context_noise_seek()
215 void set_context_noise_head_down(NOISE* device)
217 d_noise_head_down = device;
219 NOISE* get_context_noise_head_down()
221 return d_noise_head_down;
223 void set_context_noise_head_up(NOISE* device)
225 d_noise_head_up = device;
227 NOISE* get_context_noise_head_up()
229 return d_noise_head_up;
231 DISK* get_disk_handler(int drv)
238 void open_disk(int drv, const _TCHAR* file_path, int bank);
239 void close_disk(int drv);
240 bool is_disk_inserted(int drv);
241 bool is_disk_inserted(); // current hdu
242 bool disk_ejected(int drv);
243 bool disk_ejected(); // current hdu
244 void is_disk_protected(int drv, bool value);
245 bool is_disk_protected(int drv);
246 uint8_t get_media_type(int drv);
247 void set_drive_type(int drv, uint8_t type);
248 uint8_t get_drive_type(int drv);
249 void set_drive_rpm(int drv, int rpm);
250 void set_drive_mfm(int drv, bool mfm);
251 bool raise_irq_when_media_changed;