|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
4: All Rights Reserved
5:
6: Module Name:
7:
8: mt1strc.h
9:
10: Abstract:
11:
12: Revision History:
13:
14:
15: --*/
16:
17: #pragma pack(1)
18:
19: //
20: // Tape Drive Status
21: // returned from Report Drive Status command.
22: //
23:
24: struct DriveStatus {
25: UBYTE Ready:1; // drive ready
26: UBYTE Error:1; // error detected
27: UBYTE CartPresent:1; // cartridge present
28: UBYTE WriteProtect:1; // cartridge write protected
29: UBYTE NewCart:1; // new cartridge
30: UBYTE Referenced:1; // cartridge referenced
31: UBYTE BOT:1; // at physical beginning of tape
32: UBYTE EOT:1; // at physical end of tape
33: };
34:
35:
36: //
37: // CMS Status
38: // returned from Report CMS Status command.
39: //
40:
41: struct CmsStatus {
42: UBYTE NoBurst:1; // no burst seek if 1
43: UBYTE CmsMode:1; // cms mode if 1
44: UBYTE Threshold:1; // Threshold load if 1
45: UBYTE DriveType:1; // qic40=1, qic80=0
46: UBYTE BurstOnly:1; // Burst only gain set if 1
47: UBYTE Pegasus:1; // If Pegasus tape 1, else 0
48: UBYTE Eagle:1; // Eagle
49: UBYTE Reserved2:1; // not defined
50: };
51:
52: //
53: // Tape Drive Configuration
54: // returned from Report Drive Configuration command.
55: //
56:
57: struct DriveConfiguration {
58: UBYTE Reserved:3; // reserved (response = 0)
59: UBYTE XferRate:2; // Transfer Rate = 00 250 Kbps
60: // 01 Reserved
61: // 10 500 Kbps
62: // 11 Reserved
63: UBYTE Reserved1:1;
64: UBYTE XL_Tape:1; // extra length tape detected
65: UBYTE QIC80:1; // QIC-80 mode
66: };
67:
68:
69: //
70: // Tape Drive Error Status
71: // returned from Report Error Code command.
72: //
73:
74: struct DriveError {
75: UWORD Error:8; // error code
76: UWORD Command:8; // associated command
77: };
78:
79: struct TapeFormatLgth {
80: UWORD Format:4; /* Format of the tape */
81: UWORD Length:4; /* Length of the tape */
82: };
83:
84:
85: //
86: // Tape Drive Parameters
87: //
88:
89: struct DriveParameters {
90: UCHAR Flavor; // CMS or ALIEN
91: UCHAR Version; // Firmware Version
92: UCHAR DriveType; // QIC-40 or QIC-80
93: UCHAR SeekMode; // seek mode supported by the drive
94: SHORT DriveSelect; // current drive identifier
95: CHAR Mode; // drive mode (Primary, Format, Verify)
96: USHORT ArchiveNativeMode; // Archive Native Mode Data
97: struct DriveStatus Status; // last read tape drive status byte
98: };
99:
100: typedef struct DriveParameters DRIVE_PARAMETERS;
101:
102: //
103: // Tape Parameters
104: //
105:
106: struct TapeParameters {
107: CHAR TapeType; // QIC40/QIC80 SHORT/LONG
108: SHORT FsectSeg; // floppy sectors per segment
109: SHORT SegFtrack; // segments per floppy track
110: UWORD FsectFtrack; // floppy sectors per floppy track
111: UWORD RwGapLength; // write gap length
112: USHORT NumTtrack; // number of tape tracks
113: SHORT FtrackFside; // floppy tracks per floppy side
114: USHORT SegTtrack; // segments per tape track
115: ULONG FsectFside; // floppy sectors per floppy side
116: ULONG LogSectors; // number of logical sectors on a tape
117: ULONG FsectTtrack; // floppy sectors per tape track
118: USHORT TapeFormatCode; // the tape format code
119: USHORT FormattableSegs; // the number of formattable segments
120: QIC_TIME TimeOut[3]; // time_out for the QIC-117 commands
121: // time_out[0] = logical_slow, time_out[1] = logical_fast,
122: // time[2] = physical.
123: };
124:
125: typedef struct TapeParameters TAPE_PARAMETERS;
126:
127: //
128: // Drive Select Parameters
129: // These are select/deselect bytes used to select and deselect the tape
130: // drive.
131: //
132:
133: struct DriveSelect {
134: CHAR Selected; // drive selected flag.
135: UBYTE DeselectByte; // bits to make drive select line inactive
136: UBYTE SelectByte; // bits to make drive select line active
137: };
138:
139: typedef struct DriveSelect DRIVE_SELECT;
140:
141: //
142: // Transfer Rate Parameters
143: //
144:
145: struct TransferRate {
146: UBYTE XferRate; // current transfer rate (SLOW or FAST)
147: UBYTE MaxRate; // maximum transfer rate (SLOW or FAST)
148: UBYTE TapeSlow; // Program tape drive slow (250 or 500 Kbps)
149: UBYTE TapeFast; // Program tape drive fast (500 or 1000 Kbps)
150: UBYTE FDC_Slow; // Program FDC slow (250 or 500 Kbps)
151: UBYTE FDC_Fast; // Program FDC fast (500 or 1000 Kbps)
152: UBYTE SRT_Slow; // FDC step rate for slow xfer rate
153: UBYTE SRT_Fast; // FDC step rate for fast xfer rate
154: };
155:
156: typedef struct TransferRate TRANSFER_RATE;
157:
158: //
159: // Tape Position Parameters
160: //
161:
162: struct TapePosition {
163: CHAR LogFwd; // indicates that the driver thinks that
164: // the tape is going logical forward
165: SHORT C_Segment; // current tape block, (floppy track)
166: SHORT C_Track; // current physical track
167: SHORT D_Segment; // desired tape segment, (floppy track)
168: SHORT D_Track; // desired physical tape track
169: };
170:
171: typedef struct TapePosition TAPE_POSITION;
172:
173:
174: //
175: // Commands to the Floppy Controller. FDC commands and the corresponding
176: // driver structures are listed below.
177: //
178: // FDC Command Command Struct Response Struct
179: // ----------- -------------- ---------------
180: // Read Data rdv_command stat
181: // Read Deleted Data N/A N/A
182: // Write Data rdv_command stat
183: // Write Deleted Data rdv_command stat
184: // Read a Track N/A N/A
185: // Verify (82077) N/A N/A
186: // Version (82077) version_cmd N/A
187: // Read ID read_id_cmd stat
188: // Format a Track format_cmd stat
189: // Scan Equal (765) N/A N/A
190: // Scan Low or Equal (765) N/A N/A
191: // Scan High or Equal (765) N/A N/A
192: // Recalibrate N/A N/A
193: // Sense Interrupt Status sns_int_cmd fdc_result
194: // Specify specify_cmd N/A
195: // Sense Drive Status sns_stat_cmd stat
196: // Seek seek_cmd N/A
197: // Configure (82077) config_cmd N/A
198: // Relative Seek (82077) N/A N/A
199: // Dump Registers (82077) N/A N/A
200: // Perpendicular Mode (82077) N/A N/A
201: // Invalid invalid_cmd N/A
202: //
203:
204:
205: struct rdv_command {
206: UBYTE command; // command UBYTE
207: UBYTE drive; // drive specifier
208: UBYTE C; // cylinder number
209: UBYTE H; // head address
210: UBYTE R; // record (sector number)
211: UBYTE N; // number of UBYTEs per sector
212: UBYTE EOT; // end of track
213: UBYTE GPL; // gap length
214: UBYTE DTL; // data length
215: };
216:
217: typedef struct rdv_command RDV_COMMAND;
218:
219: struct read_id_cmd {
220: UBYTE command; // command byte
221: UBYTE drive; // drive specifier
222: };
223:
224: struct format_cmd {
225: UBYTE command; // command byte
226: UBYTE drive; // drive specifier
227: UBYTE N; // number of bytes per sector
228: UBYTE SC; // sectors per track (segment)
229: UBYTE GPL; // gap length
230: UBYTE D; // format filler byte
231: };
232:
233: typedef struct format_cmd FORMAT_CMD;
234:
235: struct sns_int_cmd {
236: UBYTE command; // command byte
237: };
238:
239: struct version_cmd {
240: UBYTE command; // command byte
241: };
242:
243: struct national_cmd {
244: UBYTE command; // command byte
245: };
246:
247: struct specify_cmd {
248: UBYTE command; // command byte
249: UBYTE SRT_HUT; // step rate time (bits 7-4)
250: // head unload time bits (3-0)
251: UBYTE HLT_ND; // head load time (bits 7-1)
252: // non-DMA mode flag (bit 0)
253: };
254:
255: struct sns_stat_cmd {
256: UBYTE command; // command byte
257: UBYTE drive; // drive specifier
258: };
259:
260: struct recalibrate_cmd {
261: UBYTE command; // command byte
262: UBYTE drive; // drive specifier
263: };
264:
265: struct seek_cmd {
266: UBYTE cmd; // command byte
267: UBYTE drive; // drive specifier
268: UBYTE NCN; // new cylinder number
269: };
270:
271: struct config_cmd {
272: UBYTE cmd; // command byte
273: UBYTE czero; // null byte
274: UWORD FIFOTHR:4; // FIFO threshold
275: UWORD POLL:1; // Disable polling of drives
276: UWORD EFIFO:1; // Enable FIFO
277: UWORD EIS:1; // Enable implied seek
278: UWORD reserved:1; // reserved
279: UWORD PRETRK:8; // Pre-compensation start track number
280: };
281:
282: struct invalid_cmd {
283: UBYTE command; // command byte
284: };
285:
286: struct _FDC_STATUS {
287: UBYTE ST0; // status register 0
288: UBYTE ST1; // status register 1
289: UBYTE ST2; // status register 2
290: UBYTE C; // cylinder number
291: UBYTE H; // head address
292: UBYTE R; // record (sector number)
293: UBYTE N; // number of bytes per sector
294: };
295:
296: typedef struct _FDC_STATUS FDC_STATUS;
297:
298:
299: struct fdc_result {
300: UBYTE ST0; // status register 0
301: UBYTE PCN; // present cylinder number
302: };
303:
304: //
305: // FDC Sector Header Data used for formatting
306: //
307:
308: union format_header {
309: struct {
310: UBYTE C; // cylinder number
311: UBYTE H; // head address
312: UBYTE R; // record (sector number)
313: UBYTE N; // bytes per sector
314: } hdr_struct;
315: ULONG hdr_all;
316: };
317:
318: // This command is only valid on the 82078 Enhanced controller
319:
320: struct part_id_cmd {
321: UBYTE command;
322: };
323:
324: union drvspec {
325: struct {
326: UBYTE drive_density:2;
327: UBYTE data_rate_table:2;
328: UBYTE precomp:1;
329: UBYTE floppy_select:2;
330: UBYTE reserved:1;
331: } spec;
332: struct {
333: UBYTE reserved:6;
334: UBYTE no_report:1;
335: UBYTE cmd_done:1;
336: } spec_end;
337: UBYTE spec_all;
338: };
339:
340: typedef union drvspec DrvSpec;
341:
342: // This command is only valid on the 82078 Enhanced controller
343:
344: struct drive_specification {
345: UBYTE command;
346: DrvSpec drive[5];
347: };
348:
349: struct drive_specification_status {
350: DrvSpec drive[4];
351: };
352:
353: typedef struct drive_specification_status DrvSpecStatus;
354:
355: struct PerpMode {
356: UBYTE command;
357: UBYTE wgate:1;
358: UBYTE gap:1;
359: UBYTE drive_select:4;
360: UBYTE reserved:1;
361: UBYTE over_write:1;
362: };
363:
364: // This command is only valid on the 82078 64 pin Enhanced controller
365:
366: struct SaveCmd {
367: UBYTE command;
368: };
369:
370: struct SaveResult {
371: UBYTE reserved1:7;
372: UBYTE clk48:1;
373: UBYTE reserved2;
374: UBYTE reserved3;
375: UBYTE reserved4;
376: UBYTE reserved5;
377: UBYTE reserved6;
378: UBYTE reserved7;
379: UBYTE reserved8;
380: UBYTE reserved9;
381: UBYTE reserved10;
382: UBYTE reserved11;
383: UBYTE reserved12;
384: UBYTE reserved13;
385: UBYTE reserved14;
386: UBYTE reserved15;
387: UBYTE reserved16;
388: };
389:
390:
391: struct FormatParameters {
392: SHORT Segments; // tape track segment counter
393: UCHAR Cylinder; // floppy cylinder number
394: UCHAR Head; // floppy head number
395: UCHAR Sector; // floppy sector number
396: PMDL MdlAddress; // Memory desciptor list for format data
397: UBYTE NCN; // new cylinder number
398: ULONG *HdrPtr; // pointer to sector id data for format
399: STATUS retval; // Format status
400: };
401:
402: typedef struct FormatParameters FMT_PARAMETERS;
403:
404: #pragma pack()
405:
406:
407:
408: //
409: // Structure for the miscellaneous drive information
410: //
411:
412: struct MiscDriveInfo {
413: CHAR DriveType; // Drive_type: QIC40 or QIC80
414: UCHAR ROM_Version; // ROM Version of the drive's firmware
415: CHAR InfoExists; // Indicates the existance of the drive train info
416: UCHAR SerialNumber[4]; // Four byte array used for the drive serial number
417: UCHAR ManDate[2]; // Two byte field used for the date of manufacture
418: CHAR Oem[20]; // Twenty byte field used for the OEM name
419: };
420:
421: typedef struct MiscDriveInfo MISC_DRIVE_INFO;
422:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.