2 Skelton for retropc emulator
\r
5 Author : Takeda.Toshiya
\r
18 #define SIG_UPD765A_RESET 0
\r
19 #define SIG_UPD765A_TC 1
\r
20 #define SIG_UPD765A_MOTOR 2
\r
21 #define SIG_UPD765A_MOTOR_NEG 3
\r
22 #define SIG_UPD765A_DRVSEL 4
\r
23 #define SIG_UPD765A_IRQ_MASK 5
\r
24 #define SIG_UPD765A_DRQ_MASK 6
\r
25 #define SIG_UPD765A_FREADY 7
\r
29 class UPD765A : public DEVICE
\r
33 outputs_t outputs_irq;
\r
34 outputs_t outputs_drq;
\r
35 outputs_t outputs_hdu;
\r
36 outputs_t outputs_index;
\r
45 int next_trans_position;
\r
50 uint8 hdu, hdue, id[4], eot, gpl, dtl;
\r
52 int phase, prevphase;
\r
53 uint8 status, seekstat, command;
\r
56 bool no_dma_mode, motor_on;
\r
57 #ifdef UPD765A_DMA_MODE
\r
60 bool irq_masked, drq_masked;
\r
63 uint8 buffer[0x8000];
\r
66 int phase_id, drq_id, lost_id, result7_id, seek_id[4];
\r
72 uint32 prev_drq_clock;
\r
74 int get_cur_position(int drv);
\r
75 double get_usec_to_exec_phase();
\r
78 void set_irq(bool val);
\r
79 void set_drq(bool val);
\r
80 void set_hdu(uint8 val);
\r
83 void shift_to_idle();
\r
84 void shift_to_cmd(int length);
\r
85 void shift_to_exec();
\r
86 void shift_to_read(int length);
\r
87 void shift_to_write(int length);
\r
88 void shift_to_scan(int length);
\r
89 void shift_to_result(int length);
\r
90 void shift_to_result7();
\r
91 void shift_to_result7_event();
\r
94 void process_cmd(int cmd);
\r
95 void cmd_sence_devstat();
\r
96 void cmd_sence_intstat();
\r
97 uint8 get_devstat(int drv);
\r
100 void seek(int drv, int trk);
\r
101 void seek_event(int drv);
\r
102 void cmd_read_data();
\r
103 void cmd_write_data();
\r
105 void cmd_read_diagnostic();
\r
106 void read_data(bool deleted, bool scan);
\r
107 void write_data(bool deleted);
\r
108 void read_diagnostic();
\r
109 uint32 read_sector();
\r
110 uint32 write_sector(bool deleted);
\r
112 uint32 check_cond(bool write);
\r
113 void get_sector_params();
\r
115 void cmd_read_id();
\r
116 void cmd_write_id();
\r
119 void cmd_specify();
\r
120 void cmd_invalid();
\r
121 #if defined(_USE_AGAR) || defined(_USE_SDL)
\r
122 uint8 __min(uint8 x, uint8 y) {
\r
123 if(x > y) return y;
\r
126 uint8 __max(uint8 x, uint8 y) {
\r
127 if(x < y) return y;
\r
133 UPD765A(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
\r
135 init_output_signals(&outputs_irq);
\r
136 init_output_signals(&outputs_drq);
\r
137 init_output_signals(&outputs_hdu);
\r
138 init_output_signals(&outputs_index);
\r
139 raise_irq_when_media_changed = false;
\r
143 // common functions
\r
147 void write_io8(uint32 addr, uint32 data);
\r
148 uint32 read_io8(uint32 addr);
\r
149 void write_dma_io8(uint32 addr, uint32 data);
\r
150 uint32 read_dma_io8(uint32 addr);
\r
151 void write_signal(int id, uint32 data, uint32 mask);
\r
152 uint32 read_signal(int ch);
\r
153 void event_callback(int event_id, int err);
\r
154 void save_state(FILEIO* state_fio);
\r
155 bool load_state(FILEIO* state_fio);
\r
158 void set_context_irq(DEVICE* device, int id, uint32 mask)
\r
160 register_output_signal(&outputs_irq, device, id, mask);
\r
162 void set_context_drq(DEVICE* device, int id, uint32 mask)
\r
164 register_output_signal(&outputs_drq, device, id, mask);
\r
166 void set_context_hdu(DEVICE* device, int id, uint32 mask)
\r
168 register_output_signal(&outputs_hdu, device, id, mask);
\r
170 void set_context_index(DEVICE* device, int id, uint32 mask)
\r
172 register_output_signal(&outputs_index, device, id, mask);
\r
174 DISK* get_disk_handler(int drv)
\r
178 void open_disk(int drv, _TCHAR path[], int offset);
\r
179 void close_disk(int drv);
\r
180 bool disk_inserted(int drv);
\r
181 bool disk_inserted(); // current hdu
\r
182 bool disk_ejected(int drv);
\r
183 bool disk_ejected(); // current hdu
\r
184 uint8 media_type(int drv);
\r
185 void set_drive_type(int drv, uint8 type);
\r
186 uint8 get_drive_type(int drv);
\r
187 void set_drive_rpm(int drv, int rpm);
\r
188 void set_drive_mfm(int drv, bool mfm);
\r
189 bool raise_irq_when_media_changed;
\r