OSDN Git Service

73e90d1c8cf3086b314a5fdc3da4f6018bf01dc0
[csp-qt/common_source_project-fm7.git] / source / src / vm / t3444a.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2015.09.03-
6
7         [ T3444A / T3444M ]
8 */
9
10 #ifndef _T3444A_H_ 
11 #define _T3444A_H_
12
13 #include "vm.h"
14 #include "../emu.h"
15 #include "device.h"
16
17 #define SIG_T3444A_DRIVE        0
18 #define SIG_T3444A_TND          1
19 #define SIG_T3444A_MOTOR        2
20
21 // for reading signal
22 #define SIG_T3444A_DRDY         4
23 #define SIG_T3444A_CRDY         5
24 #define SIG_T3444A_RQM          6
25
26 #ifdef HAS_T3444M
27 #define SECTORS_IN_TRACK        16
28 #else
29 #define SECTORS_IN_TRACK        26
30 #endif
31
32 class DISK;
33 class NOISE;
34
35 class T3444A : public DEVICE
36 {
37 private:
38         // output signals
39         outputs_t outputs_rqm;
40         
41         // drive noise
42         NOISE* d_noise_seek;
43         NOISE* d_noise_head_down;
44         NOISE* d_noise_head_up;
45         
46         // drive info
47         struct {
48                 int track;
49                 int index;
50                 bool access;
51                 bool head_load;
52                 // timing
53                 int cur_position;
54                 int next_trans_position;
55                 int bytes_before_2nd_rqm;
56                 int next_sync_position;
57                 uint32_t prev_clock;
58         } fdc[4];
59         DISK* disk[4];
60         
61         // register
62         uint8_t status;
63         uint8_t cmdreg;
64         uint8_t trkreg;
65         uint8_t secreg;
66         uint8_t datareg;
67         uint8_t drvreg;
68         uint8_t sidereg;
69         bool timerflag;
70         uint8_t sector_id[SECTORS_IN_TRACK * 4];
71         
72         // event
73         int register_id[5];
74         
75         void cancel_my_event(int event);
76         void register_my_event(int event, double usec);
77         void register_seek_event();
78         void register_rqm_event(int bytes);
79         void register_lost_event(int bytes);
80         
81         // status
82         bool now_search;
83         int seektrk;
84         bool rqm;
85         bool tnd;
86         bool motor_on;
87         
88         // timing
89         uint32_t prev_rqm_clock;
90         
91         int get_cur_position();
92         double get_usec_to_start_trans();
93         double get_usec_to_next_trans_pos();
94         double get_usec_to_detect_index_hole(int count);
95         
96         // image handler
97         uint8_t search_sector();
98         
99         // command
100         void process_cmd();
101         void cmd_seek_zero();
102         void cmd_seek();
103         void cmd_read_write();
104         void cmd_write_id();
105         void cmd_sence();
106         void update_head_flag(int drv, bool head_load);
107         
108         // rqm
109         void set_rqm(bool val);
110         
111 public:
112         T3444A(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
113         {
114                 initialize_output_signals(&outputs_rqm);
115                 d_noise_seek = NULL;
116                 d_noise_head_down = NULL;
117                 d_noise_head_up = NULL;
118                 tnd = true;
119                 motor_on = false;
120                 set_device_name(_T("T3444A FDC"));
121         }
122         ~T3444A() {}
123         
124         // common functions
125         void initialize();
126         void release();
127         void reset();
128         void write_io8(uint32_t addr, uint32_t data);
129         uint32_t read_io8(uint32_t addr);
130         void write_dma_io8(uint32_t addr, uint32_t data);
131         uint32_t read_dma_io8(uint32_t addr);
132         void write_signal(int id, uint32_t data, uint32_t mask);
133         uint32_t read_signal(int ch);
134         void event_callback(int event_id, int err);
135         void update_config();
136         void save_state(FILEIO* state_fio);
137         bool load_state(FILEIO* state_fio);
138         
139         // unique functions
140         void set_context_rqm(DEVICE* device, int id, uint32_t mask)
141         {
142                 register_output_signal(&outputs_rqm, device, id, mask);
143         }
144         void set_context_noise_seek(NOISE* device)
145         {
146                 d_noise_seek = device;
147         }
148         NOISE* get_context_noise_seek()
149         {
150                 return d_noise_seek;
151         }
152         void set_context_noise_head_down(NOISE* device)
153         {
154                 d_noise_head_down = device;
155         }
156         NOISE* get_context_noise_head_down()
157         {
158                 return d_noise_head_down;
159         }
160         void set_context_noise_head_up(NOISE* device)
161         {
162                 d_noise_head_up = device;
163         }
164         NOISE* get_context_noise_head_up()
165         {
166                 return d_noise_head_up;
167         }
168         DISK* get_disk_handler(int drv)
169         {
170                 return disk[drv];
171         }
172         void open_disk(int drv, const _TCHAR* file_path, int bank);
173         void close_disk(int drv);
174         bool is_disk_inserted(int drv);
175         void is_disk_protected(int drv, bool value);
176         bool is_disk_protected(int drv);
177         void set_drive_type(int drv, uint8_t type);
178         uint8_t get_drive_type(int drv);
179         void set_drive_rpm(int drv, int rpm);
180         void set_drive_mfm(int drv, bool mfm);
181 };
182
183 #endif