// // 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;