OSDN Git Service

f0d3a0f4971a3933723280abcc5870b619f164cb
[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[26 * 4]; // SECTORS_IN_TRACK
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
92         int _max_drive;
93         int _sectors_in_track;
94         bool _has_t3444m;
95         bool _fdc_debug_log;
96         
97         int get_cur_position();
98         double get_usec_to_start_trans();
99         double get_usec_to_next_trans_pos();
100         double get_usec_to_detect_index_hole(int count);
101         
102         // image handler
103         uint8_t search_sector();
104         
105         // command
106         void process_cmd();
107         void cmd_seek_zero();
108         void cmd_seek();
109         void cmd_read_write();
110         void cmd_write_id();
111         void cmd_sence();
112         void update_head_flag(int drv, bool head_load);
113         
114         // rqm
115         void set_rqm(bool val);
116
117         bool process_state_fdc(int ch, FILEIO* state_fio, bool loading);
118 public:
119         T3444A(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
120         {
121                 initialize_output_signals(&outputs_rqm);
122                 d_noise_seek = NULL;
123                 d_noise_head_down = NULL;
124                 d_noise_head_up = NULL;
125                 tnd = true;
126                 motor_on = false;
127                 _max_drive = 4;
128                 _sectors_in_track = 26;
129                 _has_t3444m = _fdc_debug_log = false;
130                 set_device_name(_T("T3444A FDC"));
131         }
132         ~T3444A() {}
133         
134         // common functions
135         void initialize();
136         void release();
137         void reset();
138         void write_io8(uint32_t addr, uint32_t data);
139         uint32_t read_io8(uint32_t addr);
140         void write_dma_io8(uint32_t addr, uint32_t data);
141         uint32_t read_dma_io8(uint32_t addr);
142         void write_signal(int id, uint32_t data, uint32_t mask);
143         uint32_t read_signal(int ch);
144         void event_callback(int event_id, int err);
145         void update_config();
146         bool process_state(FILEIO* state_fio, bool loading);
147         
148         // unique functions
149         void set_context_rqm(DEVICE* device, int id, uint32_t mask)
150         {
151                 register_output_signal(&outputs_rqm, device, id, mask);
152         }
153         void set_context_noise_seek(NOISE* device)
154         {
155                 d_noise_seek = device;
156         }
157         NOISE* get_context_noise_seek()
158         {
159                 return d_noise_seek;
160         }
161         void set_context_noise_head_down(NOISE* device)
162         {
163                 d_noise_head_down = device;
164         }
165         NOISE* get_context_noise_head_down()
166         {
167                 return d_noise_head_down;
168         }
169         void set_context_noise_head_up(NOISE* device)
170         {
171                 d_noise_head_up = device;
172         }
173         NOISE* get_context_noise_head_up()
174         {
175                 return d_noise_head_up;
176         }
177         DISK* get_disk_handler(int drv)
178         {
179                 return disk[drv];
180         }
181         void open_disk(int drv, const _TCHAR* file_path, int bank);
182         void close_disk(int drv);
183         bool is_disk_inserted(int drv);
184         void is_disk_protected(int drv, bool value);
185         bool is_disk_protected(int drv);
186         void set_drive_type(int drv, uint8_t type);
187         uint8_t get_drive_type(int drv);
188         void set_drive_rpm(int drv, int rpm);
189         void set_drive_mfm(int drv, bool mfm);
190 };
191
192 #endif