OSDN Git Service

[General] Convert sourcecode's CRLF format: DOS(WINDOWS) to Unix, to apply patches...
[csp-qt/common_source_project-fm7.git] / source / src / vm / disk.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2006.09.16-
6
7         [ d88 image handler ]
8 */
9
10 #ifndef _DISK_H_
11 #define _DISK_H_
12
13 #include "vm.h"
14 #include "../emu.h"
15
16 #if defined(_USE_AGAR) || defined(_USE_SDL)
17 #include "agar_main.h"
18 #endif
19
20 // d88 media type
21 #define MEDIA_TYPE_2D   0x00
22 #define MEDIA_TYPE_2DD  0x10
23 #define MEDIA_TYPE_2HD  0x20
24 #define MEDIA_TYPE_144  0x30
25 #define MEDIA_TYPE_UNK  0xff
26
27 #define DRIVE_TYPE_2D   MEDIA_TYPE_2D
28 #define DRIVE_TYPE_2DD  MEDIA_TYPE_2DD
29 #define DRIVE_TYPE_2HD  MEDIA_TYPE_2HD
30 #define DRIVE_TYPE_144  MEDIA_TYPE_144
31 #define DRIVE_TYPE_UNK  MEDIA_TYPE_UNK
32
33 // d88 constant
34 #define DISK_BUFFER_SIZE        0x180000        // 1.5MB
35 #define TRACK_BUFFER_SIZE       0x8000          // 32KB
36
37 // teledisk decoder constant
38 #define STRING_BUFFER_SIZE      4096
39 #define LOOKAHEAD_BUFFER_SIZE   60
40 #define THRESHOLD               2
41 #define N_CHAR                  (256 - THRESHOLD + LOOKAHEAD_BUFFER_SIZE)
42 #define TABLE_SIZE              (N_CHAR * 2 - 1)
43 #define ROOT_POSITION           (TABLE_SIZE - 1)
44 #define MAX_FREQ                0x8000
45
46 class FILEIO;
47
48 class DISK
49 {
50 private:
51         FILEIO* fi;
52         uint8 buffer[DISK_BUFFER_SIZE];
53         _TCHAR orig_path[_MAX_PATH];
54         _TCHAR dest_path[_MAX_PATH];
55         _TCHAR temp_path[_MAX_PATH];
56         int file_size;
57         int file_offset;
58         uint32 crc32;
59         bool temporary;
60         uint8 fdi_header[4096];
61         
62         bool check_media_type();
63         
64         // teledisk image decoder (td0)
65         bool teledisk_to_d88();
66         int next_word();
67         int get_bit();
68         int get_byte();
69         void start_huff();
70         void reconst();
71         void update(int c);
72         short decode_char();
73         short decode_position();
74         void init_decode();
75         int decode(uint8 *buf, int len);
76         
77         // imagedisk image decoder (imd)
78         bool imagedisk_to_d88();
79         
80         // cpdread image decoder (dsk)
81         bool cpdread_to_d88(int extended);
82         
83         // standard image decoder (fdi/tfd/2d/sf7)
84         bool standard_to_d88(int type, int ncyl, int nside, int nsec, int size);
85         
86         uint8 text_buf[STRING_BUFFER_SIZE + LOOKAHEAD_BUFFER_SIZE - 1];
87         uint16 ptr;
88         uint16 bufcnt, bufndx, bufpos;
89         uint16 ibufcnt,ibufndx;
90         uint8 inbuf[512];
91         uint16 freq[TABLE_SIZE + 1];
92         short prnt[TABLE_SIZE + N_CHAR];
93         short son[TABLE_SIZE];
94         uint16 getbuf;
95         uint8 getlen;
96         
97         struct td_hdr_t {
98                 char sig[3];
99                 uint8 unknown;
100                 uint8 ver;
101                 uint8 dens;
102                 uint8 type;
103                 uint8 flag;
104                 uint8 dos;
105                 uint8 sides;
106                 uint16 crc;
107         };
108         struct td_cmt_t {
109                 uint16 crc;
110                 uint16 len;
111                 uint8 ymd[3];
112                 uint8 hms[3];
113         };
114         struct td_trk_t {
115                 uint8 nsec, trk, head;
116                 uint8 crc;
117         };
118         struct td_sct_t {
119                 uint8 c, h, r, n;
120                 uint8 ctrl, crc;
121         };
122         struct imd_trk_t {
123                 uint8 mode;
124                 uint8 cyl;
125                 uint8 head;
126                 uint8 nsec;
127                 uint8 size;
128         };
129         struct d88_hdr_t {
130                 char title[17];
131                 uint8 rsrv[9];
132                 uint8 protect;
133                 uint8 type;
134                 uint32 size;
135                 uint32 trkptr[164];
136         };
137         struct d88_sct_t {
138                 uint8 c, h, r, n;
139                 uint16 nsec;
140                 uint8 dens, del, stat;
141                 uint8 rsrv[5];
142                 uint16 size;
143         };
144 public:
145         DISK();
146         ~DISK();
147         
148         void open(_TCHAR path[], int offset);
149         void close();
150         bool get_track(int trk, int side);
151         bool make_track(int trk, int side);
152         bool get_sector(int trk, int side, int index);
153         
154         int get_rpm();
155         int get_track_size();
156         double get_usec_per_bytes(int bytes);
157         
158         bool inserted;
159         bool ejected;
160         bool write_protected;
161         bool changed;
162         uint8 media_type;
163         bool is_standard_image;
164         bool is_fdi_image;
165         bool is_alpha;
166         
167         // track
168         uint8 track[TRACK_BUFFER_SIZE];
169         int sector_num;
170         int data_size_shift;
171         bool too_many_sectors;
172         bool no_skew;
173         
174         int sync_position[256];
175         int id_position[256];
176         int data_position[256];
177         
178         // sector
179         uint8* sector;
180         int sector_size;
181         uint8 id[6];
182         uint8 density;
183         uint8 deleted;
184         uint8 status;
185         
186         // drive
187         uint8 drive_type;
188         int drive_rpm;
189         bool drive_mfm;
190         
191         // state
192         void save_state(FILEIO* state_fio);
193         bool load_state(FILEIO* state_fio);
194 };
195
196 #endif
197