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
29 class UPD765A : public DEVICE
33 outputs_t outputs_irq;
34 outputs_t outputs_drq;
35 outputs_t outputs_hdu;
36 outputs_t outputs_index;
45 int next_trans_position;
50 uint8 hdu, hdue, id[4], eot, gpl, dtl;
53 uint8 status, seekstat, command;
56 bool no_dma_mode, motor_on;
57 #ifdef UPD765A_DMA_MODE
60 bool irq_masked, drq_masked;
66 int phase_id, drq_id, lost_id, result7_id, seek_id[4];
72 uint32 prev_drq_clock;
74 int get_cur_position(int drv);
75 double get_usec_to_exec_phase();
78 void set_irq(bool val);
79 void set_drq(bool val);
80 void set_hdu(uint8 val);
84 void shift_to_cmd(int length);
86 void shift_to_read(int length);
87 void shift_to_write(int length);
88 void shift_to_scan(int length);
89 void shift_to_result(int length);
90 void shift_to_result7();
91 void shift_to_result7_event();
94 void process_cmd(int cmd);
95 void cmd_sence_devstat();
96 void cmd_sence_intstat();
97 uint8 get_devstat(int drv);
100 void seek(int drv, int trk);
101 void seek_event(int drv);
102 void cmd_read_data();
103 void cmd_write_data();
105 void cmd_read_diagnostic();
106 void read_data(bool deleted, bool scan);
107 void write_data(bool deleted);
108 void read_diagnostic();
109 uint32 read_sector();
110 uint32 write_sector(bool deleted);
112 uint32 check_cond(bool write);
113 void get_sector_params();
121 #if defined(_USE_AGAR) || defined(_USE_SDL) || defined(_USE_QT)
122 uint8 __min(uint8 x, uint8 y) {
126 uint8 __max(uint8 x, uint8 y) {
133 UPD765A(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
135 init_output_signals(&outputs_irq);
136 init_output_signals(&outputs_drq);
137 init_output_signals(&outputs_hdu);
138 init_output_signals(&outputs_index);
139 raise_irq_when_media_changed = false;
147 void write_io8(uint32 addr, uint32 data);
148 uint32 read_io8(uint32 addr);
149 void write_dma_io8(uint32 addr, uint32 data);
150 uint32 read_dma_io8(uint32 addr);
151 void write_signal(int id, uint32 data, uint32 mask);
152 uint32 read_signal(int ch);
153 void event_callback(int event_id, int err);
154 void save_state(FILEIO* state_fio);
155 bool load_state(FILEIO* state_fio);
158 void set_context_irq(DEVICE* device, int id, uint32 mask)
160 register_output_signal(&outputs_irq, device, id, mask);
162 void set_context_drq(DEVICE* device, int id, uint32 mask)
164 register_output_signal(&outputs_drq, device, id, mask);
166 void set_context_hdu(DEVICE* device, int id, uint32 mask)
168 register_output_signal(&outputs_hdu, device, id, mask);
170 void set_context_index(DEVICE* device, int id, uint32 mask)
172 register_output_signal(&outputs_index, device, id, mask);
174 DISK* get_disk_handler(int drv)
178 void open_disk(int drv, _TCHAR path[], int bank);
179 void close_disk(int drv);
180 bool disk_inserted(int drv);
181 bool disk_inserted(); // current hdu
182 bool disk_ejected(int drv);
183 bool disk_ejected(); // current hdu
184 uint8 media_type(int drv);
185 void set_drive_type(int drv, uint8 type);
186 uint8 get_drive_type(int drv);
187 void set_drive_rpm(int drv, int rpm);
188 void set_drive_mfm(int drv, bool mfm);
189 bool raise_irq_when_media_changed;
190 void write_protect_fd(int drive, bool flag) {
191 if((drive >= 4) || (drive < 0)) return;
192 disk[drive]->write_protected = flag;
194 bool is_write_protect_fd(int drive) {
195 if((drive >= 4) || (drive < 0)) return true; // Protected
196 return disk[drive]->write_protected;