diff options
Diffstat (limited to 'private/mvdm/v86/scaffold/i386/xbiosdsk.h')
-rw-r--r-- | private/mvdm/v86/scaffold/i386/xbiosdsk.h | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/private/mvdm/v86/scaffold/i386/xbiosdsk.h b/private/mvdm/v86/scaffold/i386/xbiosdsk.h new file mode 100644 index 000000000..ecfa6540b --- /dev/null +++ b/private/mvdm/v86/scaffold/i386/xbiosdsk.h @@ -0,0 +1,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; + + |