OSDN Git Service

[VM][STATE] Apply new state framework to some devices a lot (excepts some devices...
[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         void decl_state_fdc(int ch);
118 public:
119         T3444A(VM* 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         void decl_state();
147         void save_state(FILEIO* state_fio);
148         bool load_state(FILEIO* state_fio);
149         
150         // unique functions
151         void set_context_rqm(DEVICE* device, int id, uint32_t mask)
152         {
153                 register_output_signal(&outputs_rqm, device, id, mask);
154         }
155         void set_context_noise_seek(NOISE* device)
156         {
157                 d_noise_seek = device;
158         }
159         NOISE* get_context_noise_seek()
160         {
161                 return d_noise_seek;
162         }
163         void set_context_noise_head_down(NOISE* device)
164         {
165                 d_noise_head_down = device;
166         }
167         NOISE* get_context_noise_head_down()
168         {
169                 return d_noise_head_down;
170         }
171         void set_context_noise_head_up(NOISE* device)
172         {
173                 d_noise_head_up = device;
174         }
175         NOISE* get_context_noise_head_up()
176         {
177                 return d_noise_head_up;
178         }
179         DISK* get_disk_handler(int drv)
180         {
181                 return disk[drv];
182         }
183         void open_disk(int drv, const _TCHAR* file_path, int bank);
184         void close_disk(int drv);
185         bool is_disk_inserted(int drv);
186         void is_disk_protected(int drv, bool value);
187         bool is_disk_protected(int drv);
188         void set_drive_type(int drv, uint8_t type);
189         uint8_t get_drive_type(int drv);
190         void set_drive_rpm(int drv, int rpm);
191         void set_drive_mfm(int drv, bool mfm);
192 };
193
194 #endif