summaryrefslogtreecommitdiffstats
path: root/private/mvdm/v86/scaffold/i386/xbiosdsk.h
blob: ecfa6540bbad811b6eff0a52304f225fd4a2f3ab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
//
// This code is temporary.  When Insignia supplies rom support, it should
// be removed.
//

/* x86 v1.0
 *
 * XBIOSDSK.H
 * Guest ROM BIOS disk emulation
 *
 * History
 * Created 20-Oct-90 by Jeff Parsons
 *         17-Apr-91 Trimmed by Dave Hastings for use in temp. softpc
 *
 * COPYRIGHT NOTICE
 * This source file may not be distributed, modified or incorporated into
 * another product without prior approval from the author, Jeff Parsons.
 * This file may be copied to designated servers and machines authorized to
 * access those servers, but that does not imply any form of approval.
 */


#define MAX_FD                  2       // # supported floppy drives
#define MAX_HD                  2       // # supported hard disk drives
#define MAX_DRIVES              (MAX_FD+MAX_HD)

#define DRIVE_FD0               0x00    // first floppy disk drive #
#define DRIVE_FD1               0x01    //
#define DRIVE_HD0               0x80    // first hard disk drive #
#define DRIVE_HD1               0x81    //


/* Drive types for QUERYDRVPARMS
 */
#define DRVTYPE_360KB           1
#define DRVTYPE_1200KB          2
#define DRVTYPE_720KB           3
#define DRVTYPE_1440KB          4


/* BIOS disk functions
 */
#define DSKFUNC_DISKRESET       0x00
#define DSKFUNC_DISKSTATUS      0x01
#define DSKFUNC_READSECTORS     0x02
#define DSKFUNC_WRITESECTORS    0x03
#define DSKFUNC_VERIFYSECTORS   0x04
#define DSKFUNC_FORMATTRACK     0x05
#define DSKFUNC_QUERYDRVPARMS   0x08
#define DSKFUNC_QUERYDASDTYPE   0x15
#define DSKFUNC_QUERYCHANGE     0x16
#define DSKFUNC_SETDISKTYPE     0x17
#define DSKFUNC_SETMEDIATYPE    0x18


/* BIOS disk status codes
 */
#define DSKSTAT_SUCCESS         0x00    // successful completion
#define DSKSTAT_BADCMD          0x01    // bad command
#define DSKSTAT_BADADDRMARK     0x02    // address mark not found
#define DSKSTAT_WRITEPROTECT    0x03    // write on write-protected disk
#define DSKSTAT_RECNOTFOUND     0x04    // sector not found
#define DSKSTAT_BADRESET        0x05    // reset failed (HD)
#define DSKSTAT_MEDIACHANGE     0x06    // media changed
#define DSKSTAT_INITFAIL        0x07    // parm. act. failed (HD)
#define DSKSTAT_BADDMA          0x08    // DMA overrun
#define DSKSTAT_DMABOUNDARY     0x09    // DMA across 64K boundary
#define DSKSTAT_BADSECTOR       0x0A    // bad sector detected (HD)
#define DSKSTAT_BADTRACK        0x0B    // bad track detected (HD)
#define DSKSTAT_BADMEDIATYPE    0x0C    // unsupported track (HD)
#define DSKSTAT_BADFMTSECNUM    0x0D    // bad # of sectors on format (HD)
#define DSKSTAT_ADDRMARKDET     0x0E    // ctrl data addr mark detected (HD
#define DSKSTAT_DMAARBERR       0x0F    // DMA arbitration error (HD)
#define DSKSTAT_BADCRCECC       0x10    // bad CRC/ECC
#define DSKSTAT_DATACORRECT     0x11    // data ECC corrected
#define DSKSTAT_BADCNTLR        0x20    // controller failure
#define DSKSTAT_BADSEEK         0x40    // seek failed
#define DSKSTAT_TIMEOUT         0x80    // time out
#define DSKSTAT_DRVNOTREADY     0xAA    // drive not ready (HD)
#define DSKSTAT_UNDEFERR        0xBB    // undefined error (HD)
#define DSKSTAT_WRITEFAULT      0xCC    // write fault (HD)
#define DSKSTAT_STATUSERROR     0xE0    // status register error (HD)
#define DSKSTAT_SENSEFAIL       0xFF    // sense operation failed (HD)


/* BIOS Data Area disk locations
 */
#define DSKDATA_SEEKSTATUS      0x43E   // drive recal. status      (1 byte)
#define DSKDATA_MOTORSTATUS     0x43F   // motor status             (1 byte)
#define DSKDATA_MOTORCOUNT      0x440   // time-out count for motor (1 byte)
#define DSKDATA_DISKETTESTATUS  0x441   // return code status       (1 byte)
#define DSKDATA_NECSTATUS       0x442   // controller status bytes  (7 bytes)

#define DSKDATA_DISKSTATUS1     0x474   // return code status       (1 byte)


/* Floppy Diskette Parameter Table
 * (pointed by vector BIOSINT_FDSKPARMS (1Eh))
 */
typedef struct fdp_s {
    BYTE bSpecify1;                     // step-rate, head-unload
    BYTE bSpecify2;                     // head-load, DMA mode
    BYTE bMotorOff;                     // motor-off delay
    BYTE bSectorSize;                   // bytes/sec (0=128,1=256,2=512,3=1024)
    BYTE nLastSector;                   // (or think of it as # sectors/track)
    BYTE lenGapRW;                      //
    BYTE lenData;                       //
    BYTE lenGapFormat;                  //
    BYTE bFormatData;                   // format initialization byte
    BYTE bSettle;                       // head settle time
    BYTE bMotorOn;                      // motor start-up time
} FDP;
typedef FDP *PFDP;                      // pointer to diskette parameter table


/* Hard Disk Parameter Table
 */
typedef struct hdp_s {
    USHORT usMaxCylinders;              // maximum number of cylinders
    BYTE   bMaxHeads;                   // maximum number of heads
    USHORT usReserve1;                  // reserved (not used)
    USHORT usWritePrecompCyl;           // starting write precompensation cyl.
    BYTE   bMaxECCDataBurstLen;         // maximum ECC data burst length
    BYTE   bControl;                    // control byte
    BYTE   abReserve2[3];               // reserved (not used)
    USHORT usLandingZone;               // landing zone for head parking
    BYTE   bSectorsPerTrack;            // number of sectors per track
    BYTE   bReserve3;                   // reserved for future use
} HDP;
typedef HDP *PHDP;                      // pointer to hard disk parameter table


/* Hard Disk Parameter Table control byte bit definitions
 */
#define HDPCTRL_DISABLERETRY    0xC0    // disable retries
#define HDPCTRL_EXCEED8HEADS    0x08    // more than 8 heads


/* Boot sector structures (more DOS-defined than BIOS-defined however -JTP)
 */
#define PARTITION_ACTIVE        0x80    // status values

#define PARTITION_12BITFAT      1       // type valus
#define PARTITION_16BITFAT      4
#define PARTITION_LARGEFAT      6

typedef struct mbr_s {                  // Master Boot Record
    BYTE    boot_code[0x1BE];
    BYTE    partition_status;
    BYTE    starting_head;
    USHORT  starting_sec_cyl;
    BYTE    partition_type;
    BYTE    ending_head;
    USHORT  ending_sec_cyl;
    ULONG   starting_abs_sector;
    ULONG   total_sectors;
} MBR;
typedef MBR *PMBR;

typedef struct bpb_s {                  // BIOS Parameter Block (from sysbloks.h)
    BYTE    boot_code[0x0B];
    USHORT  bytes_per_sector;           // sector size
    BYTE    sectors_per_cluster;        // sectors per allocation unit
    USHORT  reserved_sectors;           // number of reserved sectors
    BYTE    nbr_fats;                   // number of fats
    USHORT  root_entries;               // number of directory entries
    USHORT  total_sectors;              // number of sectors
    BYTE    media_type;                 // fatid byte
    USHORT  sectors_per_fat;            // sectors in a copy of the FAT
    USHORT  sectors_per_track;          // number of sectors per track
    USHORT  number_of_heads;            // number of heads
    ULONG   hidden_sectors;             // number of hidden sectors
    ULONG   large_total_sectors;        // large total sectors
    BYTE    reserved[6];                // 6 reserved bytes
} BPB;
typedef BPB *PBPB;


/* Virtual disk mapping info
 *
 * VIRTDISK is the header of a virtual disk file.  Following the header
 * is an optional track table, and TRACKINFO is the format of each entry
 * in that table.  The track table is only present if the last two
 * fields in the header (nsecTrack and nbSector) are zero, indicating a
 * non-homogeneous disk structure.
 *
 * Currently, a max of 4 DRIVEMAP structures are supported.  The first two
 * entries are for physical drives 0 and 1 (specified in the command-line
 * options as drives A: and B:), and subsequent entries are for physical
 * hard drives 0x80 and up (specified as drives C: and up).  Each DRIVEMAP
 * describes the remapping that should occur, if any, and for virtual disk
 * files, it also contains the virtual disk file header (which is read in
 * during initialization).
 *
 * When a request comes in for one of those drives, we check the flags in
 * corresponding DRIVEMAP structure.  If no flags are set, no remapping
 * or virtualization occurs (drive behaves normally).  This is the default.
 * If the drive is disabled (eg, "A:=*"), then all requests are returned
 * with an error.  If the drive is remapped to another physical drive (eg,
 * "A:=B:") then the request is routed to the mapped drive.  Finally, if
 * the drive is remapped to a virtual disk file, the appropriate file I/O
 * is performed.
 *
 * NOTE: Contrary to comments above, access to physical drives is not
 * currently supported, so mapping to a virtual drive is all you can do
 * right now.... (24-Nov-90 JTP)
 */

#define VDFLAGS_WRITEPROTECT    0x01    // virtual disk is "write-protected"

typedef struct virtdisk_s {
    BYTE    fbVirt;                     // flags
    BYTE    nHeads;                     // # heads
    USHORT  nCyls;                      // # cylinders
    USHORT  nsecTrack;                  // # sectors per track
    USHORT  nbSector;                   // # bytes per sector
} VIRTDISK;
typedef VIRTDISK *PVIRTDISK;

typedef struct trackinfo_s {
    USHORT  nsecTrack;                  // # sectors per track
    USHORT  nbSector;                   // # bytes per sector
    ULONG   offVirtDisk;                // offset within virtual disk file
} TRACKINFO;
typedef TRACKINFO *PTRACKINFO;

#define DMFLAGS_VIRTUAL         0x01    // physical remapped to virtual
#define DMFLAGS_DISABLED        0x02    // physical remapped to disabled
#define DMFLAGS_PHYSICAL        0x04    // physical remapped to physical
#define DMFLAGS_LOGICAL         0x08    // physical remapped to logical

typedef struct drivemap_s {
    BYTE    fbMap;                      // flags
    BYTE    iPhysical;                  // # of remapped drive, if any
    FILE    *hfVirtDisk;                // handle to virtual disk, if any
    VIRTDISK vdInfo;                    // virtual disk info, if any
   #ifdef LOGICAL_DRIVE_SUPPORT
    ULONG   nsecHidden;                 // from BPB, if any (logical disks only)
    BYTE    type;                       // disk type, if any (logical disks only)
   #endif
} DRIVEMAP;
typedef DRIVEMAP *PDRIVEMAP;