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];
75 int phase_id, drq_id, lost_id, result7_id, seek_step_id[4], seek_end_id[4], head_unload_id[4];
81 uint32_t prev_drq_clock;
83 int get_cur_position(int drv);
84 double get_usec_to_exec_phase();
87 void set_irq(bool val);
88 void set_drq(bool val);
89 void set_hdu(uint8_t val);
93 void shift_to_cmd(int length);
95 void shift_to_read(int length);
96 void shift_to_write(int length);
97 void shift_to_scan(int length);
98 void shift_to_result(int length);
99 void shift_to_result7();
100 void shift_to_result7_event();
101 void start_transfer();
102 void finish_transfer();
105 void process_cmd(int cmd);
106 void cmd_sence_devstat();
107 void cmd_sence_intstat();
108 uint8_t get_devstat(int drv);
111 void seek(int drv, int trk);
112 void seek_event(int drv);
113 void cmd_read_data();
114 void cmd_write_data();
116 void cmd_read_diagnostic();
117 void read_data(bool deleted, bool scan);
118 void write_data(bool deleted);
119 void read_diagnostic();
120 uint32_t read_sector();
121 uint32_t write_sector(bool deleted);
123 uint32_t check_cond(bool write);
124 void get_sector_params();
132 void update_head_flag(int drv, bool head_load);
135 UPD765A(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
137 initialize_output_signals(&outputs_irq);
138 initialize_output_signals(&outputs_drq);
139 initialize_output_signals(&outputs_hdu);
140 initialize_output_signals(&outputs_index);
142 d_noise_head_down = NULL;
143 d_noise_head_up = NULL;
145 raise_irq_when_media_changed = false;
146 set_device_name(_T("uPD765A FDC"));
154 void write_io8(uint32_t addr, uint32_t data);
155 uint32_t read_io8(uint32_t addr);
156 void write_dma_io8(uint32_t addr, uint32_t data);
157 uint32_t read_dma_io8(uint32_t addr);
158 void write_signal(int id, uint32_t data, uint32_t mask);
159 uint32_t read_signal(int ch);
160 void event_callback(int event_id, int err);
161 void update_config();
162 void save_state(FILEIO* state_fio);
163 bool load_state(FILEIO* state_fio);
166 void set_context_irq(DEVICE* device, int id, uint32_t mask)
168 register_output_signal(&outputs_irq, device, id, mask);
170 void set_context_drq(DEVICE* device, int id, uint32_t mask)
172 register_output_signal(&outputs_drq, device, id, mask);
174 void set_context_hdu(DEVICE* device, int id, uint32_t mask)
176 register_output_signal(&outputs_hdu, device, id, mask);
178 void set_context_index(DEVICE* device, int id, uint32_t mask)
180 register_output_signal(&outputs_index, device, id, mask);
182 void set_context_noise_seek(NOISE* device)
184 d_noise_seek = device;
186 NOISE* get_context_noise_seek()
190 void set_context_noise_head_down(NOISE* device)
192 d_noise_head_down = device;
194 NOISE* get_context_noise_head_down()
196 return d_noise_head_down;
198 void set_context_noise_head_up(NOISE* device)
200 d_noise_head_up = device;
202 NOISE* get_context_noise_head_up()
204 return d_noise_head_up;
206 DISK* get_disk_handler(int drv)
210 void open_disk(int drv, const _TCHAR* file_path, int bank);
211 void close_disk(int drv);
212 bool is_disk_inserted(int drv);
213 bool is_disk_inserted(); // current hdu
214 bool disk_ejected(int drv);
215 bool disk_ejected(); // current hdu
216 void is_disk_protected(int drv, bool value);
217 bool is_disk_protected(int drv);
218 uint8_t media_type(int drv);
219 void set_drive_type(int drv, uint8_t type);
220 uint8_t get_drive_type(int drv);
221 void set_drive_rpm(int drv, int rpm);
222 void set_drive_mfm(int drv, bool mfm);
223 bool raise_irq_when_media_changed;