/* SYSP.H - include-файл для примеров, приведенных в книге */



/**
*.Name      FP_MAKE
*
*.Title     Макро для составления FAR-указателя
*
*.Descr     Макро составляет FAR-указатель, пользуясь
*           значениями сегмента и смещения
*
*.Params    FP_MAKE(seg,off)
*              seg - сегмент;
*              off - смещение
*
*.Return    FAR-указатель seg:off
**/


#define FP_MAKE(seg,off) ((void far *)                         \
					((((unsigned long) (unsigned)(seg)) << 16L) |   \
					((unsigned long) (unsigned) (off))))


/* Структура векторной таблицы связи DOS */

#pragma pack(1)

typedef struct _CVT_ {
	unsigned mcb_seg;
	void far *dev_cb;
	void far *file_tab;
	void far *clock_dr;
	void far *con_dr;
	unsigned max_btbl;
	void far *disk_buf;
	void far *drv_info;
	void far *fcb_tabl;
	unsigned fcb_size;
	unsigned char num_bdev;
	unsigned char lastdriv;
} CVT;


/* Блок управления памятью MCB */

typedef struct _MCB_ {
	unsigned char type;
	unsigned owner;
	unsigned size;
	char reserve[11];
} MCB;

/* Префикс программного сегмента PSP */

typedef struct _PSP_ {
	unsigned char int20h[2];
	unsigned mem_top;
	unsigned char reserv1;
	unsigned char call_dsp[5];
	void far *term_adr;
	void far *cbrk_adr;
	void far *crit_err;
	unsigned parn_psp;
	unsigned char file_tab[20];
	unsigned env_seg;
	void far *ss_sp;
	unsigned max_open;
	void far *file_tba;
	unsigned char reserv2[24];
	unsigned char disp[3];
	unsigned char reserv3[9];
	unsigned char fcb1[16];
	unsigned char fcb2[20];
	unsigned char p_size;
	unsigned char parm[127];
} PSP;


/* Блок управления устройством DOS */

typedef struct _DDCB_ {
	unsigned char drv_num;
	unsigned char drv_numd;
	unsigned sec_size;
	unsigned char clu_size;
	unsigned char clu_base;
	unsigned boot_siz;
	unsigned char fat_num;
	unsigned max_dir;
	unsigned data_sec;
	unsigned hi_clust;
	unsigned char fat_size;
	char reserv1;
	unsigned root_sec;
	void far *drv_addr;
	unsigned char media;
	unsigned char acc_flag;
	struct _DDCB_ far *next;
	unsigned reserv2;
	unsigned built;
} DDCB;

/* Управляющий блок DOS для файлов */

typedef struct _DFCB_ {
	unsigned handl_num;
	unsigned char access_mode;
	unsigned reserv1;
	unsigned dev_info;
	void far *driver;
	unsigned first_clu;
	unsigned time;
	unsigned date;
	unsigned long fl_size;
	unsigned long offset;
	unsigned reserv2;
	unsigned reserv7;
	unsigned reserv3;
	char reserv4;
	char filename[11];
	char reserv5[6];
	unsigned ownr_psp;
	unsigned reserv6;
	unsigned last_clu;
	char reserv8[4];
} DFCB;

/* Таблица файлов DOS */

typedef struct _DFT_ {
	struct _DFT_ far *next;
	unsigned file_count;
	DFCB dfcb;
} DFT;


/* Управляющий блок дискового буфера BCB */

typedef struct _BCB_ {
	struct _BCB_ far *next;
	unsigned char drive;
	unsigned char flag;
	unsigned sect_num;
	unsigned reserv1;
	DDCB far *ddcb;
	unsigned reserv2;
} BCB;

/* Информация о диске */

typedef struct _DINFO_ {
	char path[64];
	unsigned reserv1;
	unsigned reserv2;
	unsigned char reserv3;
	DDCB far *ddcb;
	unsigned cdir_clu;
	unsigned reserv4;
	unsigned reserv5;
	unsigned reserv6;
	unsigned char reserv7[7];
} DINFO;


/* Заголовок EXE-программы */

typedef struct _EXE_HDR_ {
	unsigned signature;
	unsigned part_pag;
	unsigned file_size;
	unsigned rel_item;
	unsigned hdr_size;
	unsigned min_mem;
	unsigned max_mem;
	unsigned ss_reg;
	unsigned sp_reg;
	unsigned chk_summ;
	unsigned ip_reg;
	unsigned cs_reg;
	unsigned relt_off;
	unsigned overlay;
} EXE_HDR;


/* таблица расположения сегментов EXE-программы */

typedef struct _RELOC_TAB_ {
	unsigned offset;
	unsigned segment;
} RELOC_TAB;


/* конфигурация дисковой подсистемы */

typedef struct _DISK_CONFIG_ {
	int  n_floppy;
	int  n_hard;
	int  t_floppy1;
	int  t_floppy2;
	int  t_hard1;
	int  t_hard2;
} DISK_CONFIG;


/* таблица параметров дискеты */

typedef struct _DPT_ {
	unsigned char srt_hut;
	unsigned char dma_hlt;
	unsigned char motor_w;
	unsigned char sec_size;
	unsigned char eot;
	unsigned char gap_rw;
	unsigned char dtl;
	unsigned char gap_f;
	unsigned char fill_char;
	unsigned char hst;
	unsigned char mot_start;
} DPT;

/* таблица параметров диска */

typedef struct _HDPT_ {
	unsigned max_cyl;
	unsigned char max_head;
	unsigned srwcc;
	unsigned swpc;
	unsigned char max_ecc;
	unsigned char dstopt;
	unsigned char st_del;
	unsigned char fm_del;
	unsigned char chk_del;
	unsigned char reserve[4];
} HDPT;

/* Элемент таблицы разделов */

typedef struct _PART_ENTRY_ {
	unsigned char flag;
	unsigned char beg_head;
	unsigned beg_sec_cyl;
	unsigned char sys;
	unsigned char end_head;
	unsigned end_sec_cyl;
	unsigned long rel_sec;
	unsigned long size;
} PART_ENTRY;

/* Главная загрузочная запись */

typedef struct _MBOOT_ {
	char boot_prg[0x1be];
	PART_ENTRY part_table[4];
	unsigned char signature[2];
} MBOOT;

/* Расширенный блок параметров BIOS */

typedef struct _EBPB_ {
	unsigned sectsize;
	char clustsize;
	unsigned ressecs;
	char fatcnt;
	unsigned rootsize;
	unsigned totsecs;
	char media;
	unsigned fatsize;
	unsigned seccnt;
	unsigned headcnt;
	unsigned hiddensec_low;
	unsigned hiddensec_hi;
	unsigned long drvsecs;
} EBPB;

/* Загрузочная запись для MS-DOS 4.01 */

typedef struct _BOOT_ {
	char jmp[3];
	char oem[8];
	EBPB bpb;
	char drive;
	char reserved;
	char signature;
	unsigned volser_lo;
	unsigned volser_hi;
	char label[11];
	char fat_format[8];
	char boot_code[450];

} BOOT;

/* Время последнего обновления файла */

typedef struct _FTIME_ {
	unsigned sec : 5, min : 6, hour : 5;
} FTIME;

/* Дата последнего обновления файла */

typedef struct _FDATE_ {
	unsigned day : 5, month : 4, year : 7;
} FDATE;

/* Дескриптор файла в каталоге */

typedef struct _FITEM_ {
	char name[8];
	char ext[3];
	char attr;
	char reserved[10];
	FTIME time;
	FDATE date;
	unsigned cluster_nu;
	unsigned long size;
} FITEM;

/* Формат трека для GENERIC IOCTL */

typedef struct _TRK_LY_ {
	unsigned no;
	unsigned size;
} TRK_LY;

/* Параметры устройства для GENERIC IOCTL */

typedef struct _DPB_ {

	char spec;
	char devtype;
	unsigned devattr;
	unsigned numofcyl;
	char media_type;

	EBPB bpb;
	char reserved[6];

	unsigned trkcnt;
	TRK_LY trk[100];

} DPB;

/* Параметры для форматирования функцией GENERIC IOCTL */

typedef struct _DPB_FORMAT_ {

	char spec;
	unsigned head;
	unsigned track;

} DPB_FORMAT;


/* Параметры для чтения/записи функцией GENERIC IOCTL */

typedef struct _DPB_WR_ {

	char spec;
	unsigned head;
	unsigned track;
	unsigned sector;
	unsigned sectcnt;
	void _far *buffer;

} DPB_WR;

/* Идентификатор BIOS */

typedef struct _BIOS_ID_ {

	char date[8];
	unsigned reserve;
	char pc_type;

} BIOS_ID;



#pragma pack()



void far *get_cvt(void); /* получить адрес векторной таблицы связи */
CVT  far *get_mcvt(void); /* получить адрес векторной таблицы связи */

MCB  far *get_fmcb(CVT far *); /* получить адрес первого MCB */
MCB  far *get_nmcb(MCB far *); /* получить адрес следующего MCB */

DDCB  far *get_fddcb(CVT far *); /* получить адрес первого DDCB */
DDCB  far *get_nddcb(DDCB far *); /* получить адрес следующего DDCB */
DDCB  far *get_ddcb(unsigned char); /* получить адрес DDCB для диска */

DFT  far *get_fdft(CVT far *); /* получить адрес первой DFT */
DFT  far *get_ndft(DFT far *); /* получить адрес следующей DFT */

BCB  far *get_fbcb(CVT far *); /* получить адрес первого BCB */
BCB  far *get_nbcb(BCB far *); /* получить адрес следующего BCB */

int get_exeh(EXE_HDR *,RELOC_TAB **, FILE *); /* прочитать заголовок EXE */

char unsigned pc_model(void); /* получить модель компьютера */
void disk_cfg(DISK_CONFIG*);  /* определить конфигурацию
											дисковой подсистемы */
DPT _far *get_dpt(void);      /* получить адрес DPT  */
HDPT _far *get_hdp1(void);      /* получить адрес первой HDPT  */
HDPT _far *get_hdp2(void);      /* получить адрес второй HDPT  */


BIOS_ID _far *getbiosi(void);   /* получить адрес идентификатора BIOS */
