OSDN Git Service

[GENERAL][BUILD] Merge upstream 2015-07-31.
[csp-qt/common_source_project-fm7.git] / source / src / vm / disk.h
1 /*\r
2         Skelton for retropc emulator\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2006.09.16-\r
6 \r
7         [ d88 image handler ]\r
8 */\r
9 \r
10 #ifndef _DISK_H_\r
11 #define _DISK_H_\r
12 \r
13 #include "vm.h"\r
14 #include "../emu.h"\r
15 \r
16 // d88 media type\r
17 #define MEDIA_TYPE_2D   0x00\r
18 #define MEDIA_TYPE_2DD  0x10\r
19 #define MEDIA_TYPE_2HD  0x20\r
20 #define MEDIA_TYPE_144  0x30\r
21 #define MEDIA_TYPE_UNK  0xff\r
22 \r
23 #define DRIVE_TYPE_2D   MEDIA_TYPE_2D\r
24 #define DRIVE_TYPE_2DD  MEDIA_TYPE_2DD\r
25 #define DRIVE_TYPE_2HD  MEDIA_TYPE_2HD\r
26 #define DRIVE_TYPE_144  MEDIA_TYPE_144\r
27 #define DRIVE_TYPE_UNK  MEDIA_TYPE_UNK\r
28 \r
29 #define SPECIAL_DISK_X1_ALPHA   1\r
30 #define SPECIAL_DISK_X1_BATTEN  2\r
31 \r
32 // d88 constant\r
33 #define DISK_BUFFER_SIZE        0x380000        // 3.5MB\r
34 #define TRACK_BUFFER_SIZE       0x080000        // 0.5MB\r
35 \r
36 // teledisk decoder constant\r
37 #define STRING_BUFFER_SIZE      4096\r
38 #define LOOKAHEAD_BUFFER_SIZE   60\r
39 #define THRESHOLD               2\r
40 #define N_CHAR                  (256 - THRESHOLD + LOOKAHEAD_BUFFER_SIZE)\r
41 #define TABLE_SIZE              (N_CHAR * 2 - 1)\r
42 #define ROOT_POSITION           (TABLE_SIZE - 1)\r
43 #define MAX_FREQ                0x8000\r
44 \r
45 class FILEIO;\r
46 \r
47 class DISK\r
48 {\r
49 protected:\r
50         EMU* emu;\r
51 private:\r
52         FILEIO* fi;\r
53         uint8 buffer[DISK_BUFFER_SIZE + TRACK_BUFFER_SIZE];\r
54         _TCHAR orig_path[_MAX_PATH];\r
55         _TCHAR dest_path[_MAX_PATH];\r
56         _TCHAR temp_path[_MAX_PATH];\r
57         pair file_size;\r
58         int file_bank;\r
59         uint32 crc32;\r
60         bool trim_required;\r
61         bool temporary;\r
62         uint8 fdi_header[4096];\r
63         \r
64         void set_sector_info(uint8 *t);\r
65         void trim_buffer();\r
66         \r
67         // teledisk image decoder (td0)\r
68         bool teledisk_to_d88();\r
69         int next_word();\r
70         int get_bit();\r
71         int get_byte();\r
72         void start_huff();\r
73         void reconst();\r
74         void update(int c);\r
75         short decode_char();\r
76         short decode_position();\r
77         void init_decode();\r
78         int decode(uint8 *buf, int len);\r
79         \r
80         // imagedisk image decoder (imd)\r
81         bool imagedisk_to_d88();\r
82         \r
83         // cpdread image decoder (dsk)\r
84         bool cpdread_to_d88(int extended);\r
85         \r
86         // standard image decoder (fdi/tfd/2d/sf7)\r
87         bool standard_to_d88(int type, int ncyl, int nside, int nsec, int size);\r
88         \r
89         uint8 text_buf[STRING_BUFFER_SIZE + LOOKAHEAD_BUFFER_SIZE - 1];\r
90         uint16 ptr;\r
91         uint16 bufcnt, bufndx, bufpos;\r
92         uint16 ibufcnt,ibufndx;\r
93         uint8 inbuf[512];\r
94         uint16 freq[TABLE_SIZE + 1];\r
95         short prnt[TABLE_SIZE + N_CHAR];\r
96         short son[TABLE_SIZE];\r
97         uint16 getbuf;\r
98         uint8 getlen;\r
99         \r
100         typedef struct {\r
101                 char sig[3];\r
102                 uint8 unknown;\r
103                 uint8 ver;\r
104                 uint8 dens;\r
105                 uint8 type;\r
106                 uint8 flag;\r
107                 uint8 dos;\r
108                 uint8 sides;\r
109                 uint16 crc;\r
110         } td_hdr_t;\r
111         typedef struct {\r
112                 uint16 crc;\r
113                 uint16 len;\r
114                 uint8 ymd[3];\r
115                 uint8 hms[3];\r
116         } td_cmt_t;\r
117         typedef struct {\r
118                 uint8 nsec, trk, head;\r
119                 uint8 crc;\r
120         } td_trk_t;\r
121         typedef struct {\r
122                 uint8 c, h, r, n;\r
123                 uint8 ctrl, crc;\r
124         } td_sct_t;\r
125         typedef struct {\r
126                 uint8 mode;\r
127                 uint8 cyl;\r
128                 uint8 head;\r
129                 uint8 nsec;\r
130                 uint8 size;\r
131         } imd_trk_t;\r
132         typedef struct {\r
133                 char title[17];\r
134                 uint8 rsrv[9];\r
135                 uint8 protect;\r
136                 uint8 type;\r
137                 uint32 size;\r
138                 uint32 trkptr[164];\r
139         } d88_hdr_t;\r
140         typedef struct {\r
141                 uint8 c, h, r, n;\r
142                 uint16 nsec;\r
143                 uint8 dens, del, stat;\r
144                 uint8 rsrv[5];\r
145                 uint16 size;\r
146         } d88_sct_t;\r
147 public:\r
148         DISK(EMU* parent_emu) : emu(parent_emu)\r
149         {\r
150                 inserted = ejected = write_protected = changed = false;\r
151                 file_size.d = 0;\r
152                 sector_size.sd = sector_num.sd = 0;\r
153                 sector = NULL;\r
154                 drive_type = DRIVE_TYPE_UNK;\r
155                 drive_rpm = 0;\r
156                 drive_mfm = true;\r
157                 static int num = 0;\r
158                 drive_num = num++;\r
159         }\r
160         ~DISK()\r
161         {\r
162                 if(inserted) {\r
163                         close();\r
164                 }\r
165         }\r
166         \r
167         void open(_TCHAR path[], int bank);\r
168         void close();\r
169         bool get_track(int trk, int side);\r
170         bool make_track(int trk, int side);\r
171         bool get_sector(int trk, int side, int index);\r
172         void set_deleted(bool value);\r
173         void set_crc_error(bool value);\r
174         \r
175         bool format_track(int trk, int side);\r
176         void insert_sector(uint8 c, uint8 h, uint8 r, uint8 n, bool deleted, bool crc_error, uint8 fill_data, int length);\r
177         void sync_buffer();\r
178         \r
179         int get_rpm();\r
180         int get_track_size();\r
181         double get_usec_per_bytes(int bytes);\r
182         bool check_media_type();\r
183         \r
184         bool inserted;\r
185         bool ejected;\r
186         bool write_protected;\r
187         bool changed;\r
188         uint8 media_type;\r
189         bool is_standard_image;\r
190         bool is_fdi_image;\r
191         int is_special_disk;\r
192         \r
193         // track\r
194         uint8 track[TRACK_BUFFER_SIZE];\r
195         pair sector_num;\r
196         bool invalid_format;\r
197         bool no_skew;\r
198         int cur_track, cur_side;\r
199         \r
200         int sync_position[256];\r
201         int id_position[256];\r
202         int data_position[256];\r
203         \r
204         // sector\r
205         uint8* sector;\r
206         pair sector_size;\r
207         uint8 id[6];\r
208         uint8 density;\r
209         bool deleted;\r
210         bool crc_error;\r
211         \r
212         // drive\r
213         uint8 drive_type;\r
214         int drive_rpm;\r
215         bool drive_mfm;\r
216         int drive_num;\r
217         bool ignore_crc()\r
218         {\r
219                 if(drive_num < array_length(config.ignore_crc)) {\r
220                         return config.ignore_crc[drive_num];\r
221                 }\r
222                 return false;\r
223         }\r
224         \r
225         // state\r
226         void save_state(FILEIO* state_fio);\r
227         bool load_state(FILEIO* state_fio);\r
228 };\r
229 \r
230 #endif\r
231 \r