home *** CD-ROM | disk | FTP | other *** search
- /***
- *diskio.h - definitions/declarations for direct disk I/O
- *
- * Copyright (c) 1991-1994, Gregg Jennings. All wrongs reserved.
- *
- *Purpose:
- * For use with the diskio() and diskerror() functions
- * [ANSI/System V]
- *
- *******************************************************************************/
-
- #ifndef DISKIO_HEADER
- #define DISKIO_HEADER
-
- #ifndef GENERAL_H
- #include "general.h"
- #endif
-
- /* function prototypes */
-
- extern word sectortocluster(dword sector);
- extern dword logicalsector(word track, word sector, word head);
- extern dword clustertosector(word cluster);
- extern word clustersector(dword sector);
- extern dword logicalsector(word track, word sector, word head);
-
- extern int diskio(int command, long arg, unsigned char *buffer);
-
- extern unsigned long ncluster(int);
- extern void dumpsector(void);
- extern int exterror(void);
-
- /* diskio() command values */
-
- #define DISK_INIT 0x001 /* initialize all globals */
- #define DISK_SHOW 0x002 /* display selected sector */
- #define DISK_SET 0x004 /* set */
- #define DISK_INC 0x008 /* increment */
- #define DISK_READ 0x010 /* read */
- #define DISK_WRITE 0x020 /* write */
- #define DISK_SAVE 0x040 /* store selected sector */
- #define DISK_REST 0x080 /* restore sector */
-
- /* diskio() return values */
-
- #define DISK_OK 0 /* no errors */
- /*#define DISK_CORRUPT (-4) /* boot record corrupt */
- /*#define DISK_BOUNDS (-7) /* logical sector value out of bounds */
- /*#define DISK_MEM_ERR (-8) /* not enough memory */
-
- #define DISK_NREADY 2
-
- /* MACRO examples */
-
- #define logdisk(d) (diskio(DISK_INIT,(long)d,sec_buf))
- #define rootsector() (diskio(DISK_SET,(long)dir_sector,sec_buf))
- #define bootsector() (diskio(DISK_SET,0L,sec_buf))
- #define fatsector() (diskio(DISK_SET,(long)reserved_secs,sec_buf))
- #define lastsector() (diskio(DISK_SET,(long)(num_sectors-1),sec_buf))
- #define savesector() (diskio(DISK_SAVE,0L,sec_buf))
- #define restoresector() (diskio(DISK_REST,0L,sec_buf))
- #define readsector() (diskio(DISK_READ,-1L,sec_buf))
- #define readsec(sec) (diskio(DISK_READ,(long)sec,sec_buf))
- #define writesector() (diskio(DISK_WRITE,-1L,sec_buf))
- #define nextsector() (diskio(DISK_INC,1L,sec_buf))
- #define backsector() (diskio(DISK_INC,-1L,sec_buf))
- #define movesector(n) (diskio(DISK_INC,(long)n,sec_buf))
- #define setsector(n) (diskio(DISK_SET,(long)n,sec_buf))
- #define setphysical(t,s,h) (diskio(DISK_SET,(long)logicalsector(t,s,h),sec_buf))
- #define setcluster(n) (diskio(DISK_SET,(long)(clustertosector(n)),sec_buf))
- #define nextcluster() (diskio(DISK_SET,(long)ncluster(1),sec_buf))
- #define backcluster() (diskio(DISK_SET,(long)ncluster(-1),sec_buf))
- #define nexttrack() \
- (diskio(DISK_SET,\
- (long)logicalsector(((track==max_track)?(0):(track+1)),\
- sector,head),sec_buf))
- #define backtrack() \
- (diskio(DISK_SET,\
- (long)logicalsector(((track==0)?(max_track):(track-1)),\
- sector,head),sec_buf))
- #define nexthead() \
- (diskio(DISK_SET,\
- (long)logicalsector(track,sector,\
- ((head==max_head-1) ? (0) : (head+1)) ),sec_buf))
- #define backhead() \
- (diskio(DISK_SET,\
- (long)logicalsector(track,sector,\
- ((head==0) ? (max_head-1) : (head-1)) ),sec_buf))
-
-
- /* globals for constant drive values */
-
- /* physical values */
-
- extern unsigned long drive_size; /* drive size in bytes */
- extern unsigned int sec_size; /* sector size, usually 512 bytes */
- extern unsigned int max_head; /* maximum disk head number */
- extern unsigned int max_sector; /* maximum sector number */
- extern unsigned int max_track; /* maximum track number */
- extern unsigned long hidden_secs; /* number of hidden sectors on a hard drive */
- extern unsigned int reserved_secs; /* number of hidden sectors on a hard drive */
-
- /* logical values */
-
- extern unsigned long num_sectors; /* total number of sectors */
- extern unsigned num_clusters; /* maximum cluster no. */
- extern unsigned int data_sector; /* first data sector */
- extern unsigned int dir_sector; /* start of root directory */
- extern unsigned int dir_sectors; /* number of sectors of root */
- extern unsigned int cluster_size; /* cluster size in bytes */
- extern unsigned int sec_size; /* sector size, usually 512 bytes */
- extern unsigned int secs_cluster; /* sectors per cluster */
- extern unsigned int secs_fat; /* sectors per FAT */
- extern unsigned int num_fats; /* number of FATs */
- extern unsigned int dir_entries; /* number of directory entries */
- extern unsigned int max_drive; /* maximum drive number */
- extern int fat_size; /* 12 or 16 */
- extern char format[]; /* name of format */
- extern char volume[]; /* volume label */
- extern char fatsize[]; /* FAT size, DOS 4+ */
- extern unsigned char *sec_buf;
- extern unsigned avail_clusters;
-
- /* globals for variable drive values */
-
- extern unsigned long log_sector; /* logical sector no. */
- extern unsigned int disk; /* drive number 0+ */
- extern unsigned int head; /* physical head no. 0-max_head */
- extern unsigned int track; /* physical track no. 0-max_track */
- extern unsigned int sector; /* physical sector number 1-max_sector */
-
- extern int diskio_error;
-
- #endif
-