Rev 798 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 798 | Rev 800 | ||
---|---|---|---|
Line 2... | Line 2... | ||
2 | 2 | ||
3 | const int Z80FQ = 3500000; // todo: #define as (conf.frame*conf.intfq) |
3 | const int Z80FQ = 3500000; // todo: #define as (conf.frame*conf.intfq) |
4 | const int FDD_RPS = 5; // rotation speed |
4 | const int FDD_RPS = 5; // rotation speed |
5 | 5 | ||
6 | const int MAX_TRACK_LEN = 6250; |
6 | const int MAX_TRACK_LEN = 6250; |
- | 7 | constexpr unsigned MAX_SEC_DATA_LEN = 6144U; |
|
7 | const int MAX_CYLS = 86; // don't load images with so many tracks |
8 | const int MAX_CYLS = 86; // don't load images with so many tracks |
8 | const int MAX_PHYS_CYL = 86; // don't seek over it |
9 | const int MAX_PHYS_CYL = 86; // don't seek over it |
9 | const int MAX_SEC = 256; |
10 | const int MAX_SEC = 256; |
10 | 11 | ||
11 | struct SECHDR |
- | |
12 | { |
- | |
13 | unsigned char c,s,n,l; |
- | |
14 | unsigned short crc; // CRC чруюыютър ёхъЄюЁр |
- | |
15 | - | ||
16 | // Їыруш crc чюэ√ рфЁхёр ш фрээ√ї: |
- | |
17 | // ╧Ёш ЇюЁьрЄшЁютрэшш: |
- | |
18 | // 0 - ухэхЁшЁєхЄё яЁртшы№эюх чэрўхэшх crc |
- | |
19 | // 1 - чряшё№ crc шч crc(фы рфЁхёр)/crcd(фы фрээ√ї) |
- | |
20 | // 2 - ю°шсюўэ√щ crc (ухэхЁшЁєхЄё шэтхЁёшхщ яЁртшы№эюую crc)) |
- | |
21 | // ╧Ёш ўЄхэшш (ЇєэъЎш seek єёЄрэртыштрхЄ яюы c1 ш c2): |
- | |
22 | // 0 - ЁрёёўшЄрээюх crc эх ёютярфрхЄ ё єърчрээ√ь т чруюыютъх (тючтЁр∙рхЄё crc error) |
- | |
23 | // 1 - ЁрёёўшЄрээюх crc ёютярфрхЄ ё єърчрээ√ь т чруюыютъх |
- | |
24 | unsigned char c1, c2; |
- | |
25 | u8 *data; // ╙ърчрЄхы№ эр фрээ√х ёхъЄюЁр тэєЄЁш ЄЁ¤ър |
- | |
26 | u8 *id; // ╙ърчрЄхы№ эр чруюыютюъ ёхъЄюЁр тэєЄЁш ЄЁ¤ър |
- | |
27 | u8 *wp; // ╙ърчрЄхы№ эр сшЄютє■ ърЁЄє ёсющэ√ї срщЄют ёхъЄюЁр тэєЄЁш ЄЁ¤ър (шёяюы№чєхЄё Єюы№ъю яЁш чруЁєчъх) |
- | |
28 | unsigned wp_start; // ═юьхЁ яхЁтюую сшЄр т ърЁЄх ёсющэ√ї срщЄют (юЄэюёшЄхы№эю эрўрыр ЄЁ¤ър) фы фрээюую ёхъЄюЁр |
- | |
29 | unsigned datlen; // ╨рчьхЁ ёхъЄюЁр т срщЄрї |
- | |
30 | unsigned crcd; // used to load specific CRC from FDI-file |
- | |
31 | }; |
- | |
32 | - | ||
33 | enum SEEK_MODE { JUST_SEEK = 0, LOAD_SECTORS = 1 }; |
- | |
34 | - | ||
35 | static inline bool test_bit(const u8 *data, unsigned bit) |
- | |
36 | { |
- | |
37 | return (data[bit >> 3] & (1U << (bit & 7))) != 0; |
- | |
38 | } |
- | |
39 | - | ||
40 | static inline void set_bit(u8 *data, unsigned bit) |
- | |
41 | { |
- | |
42 | data[bit >> 3] |= (1U << (bit & 7)); |
- | |
43 | } |
- | |
44 | - | ||
45 | static inline void clr_bit(u8 *data, unsigned bit) |
- | |
46 | { |
- | |
47 | data[bit >> 3] &= ~(1U << (bit & 7)); |
- | |
48 | } |
- | |
49 | - | ||
50 | - | ||
51 | struct TRKCACHE |
- | |
52 | { |
- | |
53 | // cached track position |
- | |
54 | struct FDD *drive; |
- | |
55 | unsigned cyl, side; |
- | |
56 | - | ||
57 | // generic track data |
- | |
58 | unsigned trklen; |
- | |
59 | // pointer to data inside UDI |
- | |
60 | u8 *trkd; // фрээ√х (ьюцхЄ с√Є№ NULL, хёыш ЄЁ¤ъ схч фрээ√ї) |
- | |
61 | u8 *trki; // сшЄютр ърЁЄр ёшэїЁюшьяєы№ёют |
- | |
62 | u8 *trkwp; // сшЄютр ърЁЄр ёсющэ√ї срщЄют |
- | |
63 | unsigned ts_byte; // cpu.t per byte |
- | |
64 | SEEK_MODE sf; // flag: is sectors filled |
- | |
65 | unsigned s; // no. of sectors |
- | |
66 | - | ||
67 | // sectors on track |
- | |
68 | SECHDR hdr[MAX_SEC]; |
- | |
69 | - | ||
70 | void set_i(unsigned pos) { set_bit(trki, pos); } |
- | |
71 | void clr_i(unsigned pos) { clr_bit(trki, pos); } |
- | |
72 | bool test_i(unsigned pos) { return test_bit(trki, pos); } |
- | |
73 | - | ||
74 | void set_wp(unsigned pos) { set_bit(trkwp, pos); } |
- | |
75 | bool test_wp(unsigned pos) { return test_bit(trkwp, pos); } |
- | |
76 | - | ||
77 | void write(unsigned pos, unsigned char byte, u8 index) |
- | |
78 | { |
- | |
79 | if(!trkd) |
- | |
80 | return; |
- | |
81 | - | ||
82 | trkd[pos] = byte; |
- | |
83 | if (index) |
- | |
84 | set_i(pos); |
- | |
85 | else |
- | |
86 | clr_i(pos); |
- | |
87 | } |
- | |
88 | - | ||
89 | void seek(FDD *d, unsigned cyl, unsigned side, SEEK_MODE fs); |
- | |
90 | void format(); // before use, call seek(d,c,s,JUST_SEEK), set s and hdr[] |
- | |
91 | unsigned write_sector(unsigned sec, unsigned char *data); // call seek(d,c,s,LOAD_SECTORS) |
- | |
92 | const SECHDR *get_sector(unsigned sec) const; // before use, call fill(d,c,s,LOAD_SECTORS) |
- | |
93 | - | ||
94 | void dump(); |
- | |
95 | void clear() |
- | |
96 | { |
- | |
97 | drive = nullptr; |
- | |
98 | trkd = nullptr; |
- | |
99 | ts_byte = Z80FQ/(MAX_TRACK_LEN * FDD_RPS); |
- | |
100 | } |
- | |
101 | TRKCACHE() { clear(); } |
- | |
102 | }; |
- | |
103 | - | ||
104 | - | ||
105 | struct FDD |
- | |
106 | { |
- | |
107 | u8 Id; |
- | |
108 | // drive data |
- | |
109 | - | ||
110 | __int64 motor; // 0 - not spinning, >0 - time when it'll stop |
- | |
111 | unsigned char track; // head position |
- | |
112 | - | ||
113 | // disk data |
- | |
114 | - | ||
115 | unsigned char *rawdata; // used in VirtualAlloc/VirtualFree |
- | |
116 | unsigned rawsize; |
- | |
117 | - | ||
118 | // ═рўры№эюх ўшёыю фюЁюцхъ (яЁш чруЁєчъх юсЁрчр шыш яЁш ёючфрэшш яєёЄюую фшёър), ьюцхЄ с√Є№ єтхышўхэю фю MAX_CYLS |
- | |
119 | // яєЄхь ЇюЁрЄшЁютрэш фюяюыэшЄхы№э√ї фюЁюцхъ єЄшышЄрьш Єшяр ADS ш яюфюсэ√ї |
- | |
120 | unsigned cyls; |
- | |
121 | unsigned sides; |
- | |
122 | unsigned trklen[MAX_CYLS][2]; |
- | |
123 | u8 *trkd[MAX_CYLS][2]; // фрээ√х |
- | |
124 | u8 *trki[MAX_CYLS][2]; // сшЄют√х ърЁЄ√ ёшэїЁюшьяєы№ёют |
- | |
125 | u8 *trkwp[MAX_CYLS][2]; // сшЄют√х ърЁЄ√ ёсющэ√ї срщЄют |
- | |
126 | unsigned char optype; // bits: 0-not modified, 1-write sector, 2-format track |
- | |
127 | unsigned char snaptype; |
- | |
128 | - | ||
129 | TRKCACHE t; // used in read/write image |
- | |
130 | char name[0x200]; |
- | |
131 | char dsc[0x200]; |
- | |
132 | - | ||
133 | char test(); |
- | |
134 | void free(); |
- | |
135 | int index(); |
- | |
136 | - | ||
137 | void format_trd(unsigned CylCnt); // ╚ёяюы№чєхЄё Єюы№ъю фы wldr_trd |
- | |
138 | void emptydisk(unsigned FreeSecCnt); // ╚ёяюы№чєхЄё Єюы№ъю фы wldr_trd |
- | |
139 | int addfile(unsigned char *hdr, unsigned char *data); // ╚ёяюы№чєхЄё Єюы№ъю фы wldr_trd |
- | |
140 | void addboot(); // ╚ёяюы№чєхЄё Єюы№ъю фы wldr_trd |
- | |
141 | - | ||
142 | void newdisk(unsigned cyls, unsigned sides); |
- | |
143 | - | ||
144 | int read(unsigned char snType); |
- | |
145 | - | ||
146 | int read_scl(); |
- | |
147 | int read_hob(); |
- | |
148 | int read_trd(); |
- | |
149 | int write_trd(FILE *ff); |
- | |
150 | int read_fdi(); |
- | |
151 | int write_fdi(FILE *ff); |
- | |
152 | int read_td0(); |
- | |
153 | int write_td0(FILE *ff); |
- | |
154 | int read_udi(); |
- | |
155 | int write_udi(FILE *ff); |
- | |
156 | - | ||
157 | void format_isd(); |
- | |
158 | int read_isd(); |
- | |
159 | int write_isd(FILE *ff); |
- | |
160 | - | ||
161 | void format_pro(); |
- | |
162 | int read_pro(); |
- | |
163 | int write_pro(FILE *ff); |
- | |
164 | - | ||
165 | ~FDD() { free(); } |
- | |
166 | }; |
- | |
167 | - | ||
168 | - | ||
169 | struct WD1793 |
12 | struct WD1793 |
170 | { |
13 | { |
171 | enum WDSTATE |
14 | enum WDSTATE |
172 | { |
15 | { |
173 | S_IDLE = 0, |
16 | S_IDLE = 0, |
Line 199... | Line 42... | ||
199 | }; |
42 | }; |
200 | 43 | ||
201 | __int64 next, time; |
44 | __int64 next, time; |
202 | __int64 idx_tmo; |
45 | __int64 idx_tmo; |
203 | 46 | ||
204 | FDD *seldrive; |
47 | struct FDD *seldrive; |
205 | unsigned tshift; |
48 | unsigned tshift; |
206 | 49 | ||
207 | WDSTATE state, state2; |
50 | WDSTATE state, state2; |
208 | 51 | ||
209 | unsigned char cmd; |
52 | unsigned char cmd; |
Line 285... | Line 128... | ||
285 | void load(); |
128 | void load(); |
286 | void getindex(); |
129 | void getindex(); |
287 | void trdos_traps(); |
130 | void trdos_traps(); |
288 | 131 | ||
289 | // TRKCACHE trkcache; |
132 | // TRKCACHE trkcache; |
290 | FDD fdd[4]; |
- | |
291 | 133 | ||
292 | bool EjectPending; |
134 | bool EjectPending; |
293 | void Eject(unsigned Drive); |
135 | void Eject(unsigned Drive); |
294 | 136 | ||
295 | WD1793() |
137 | WD1793(); |
296 | { |
- | |
297 | for(unsigned i = 0; i < 4; i++) // [vv] ─ы єфюсёЄтр юЄырфъш |
- | |
298 | fdd[i].Id = u8(i); |
- | |
299 | seldrive = &fdd[0]; |
- | |
300 | idx_cnt = 0; |
- | |
301 | idx_tmo = LLONG_MAX; |
- | |
302 | sign_status = 0; |
- | |
303 | tshift = 0; |
- | |
304 | EjectPending = false; |
- | |
305 | } |
- | |
306 | }; |
138 | }; |