Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование видеоадаптеров CGA, EGA и VGA

© Александр Фролов, Григорий Фролов
Том 3, М.: Диалог-МИФИ, 1992, 287 стр.

[Назад] [Содеожание] [Дальше]

Включаемый файл "SYSP.H"

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

// Состояние мыши

typedef struct _MOUSE_STATE_ {

   unsigned bottoms;
   unsigned x;
   unsigned y;

} MOUSE_STATE;

typedef struct _SYSTIMER_ {

   char hour;
   char min;
   char sec;
   unsigned year;
   char month;
   char day;
   char daylight_savings;

} SYSTIMER;

#pragma pack()



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

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

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

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

/* получить адрес первого DDCB */
DDCB  far *get_fddcb(CVT far *); 

/* получить адрес следующего DDCB */
DDCB  far *get_nddcb(DDCB far *); 

/* получить адрес DDCB для диска */
DDCB  far *get_ddcb(unsigned char); 

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

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

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

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

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

/* получить модель компьютера */
char unsigned pc_model(void); 

/* определить конфигурацию дисковой подсистемы */
void disk_cfg(DISK_CONFIG*);  

/* получить адрес DPT  */
DPT _far *get_dpt(void);   

/* получить адрес первой HDPT  */
HDPT _far *get_hdp1(void);      

/* получить адрес второй HDPT  */
HDPT _far *get_hdp2(void);      

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


int   ms_init(int *);               // Инициализация мыши
void  ms_on(void);                  // Включение курсора
void  ms_off(void);                 // Выключение курсора
void  ms_setcr(int, int);           // Установка курсора
int   ms_querp(MOUSE_STATE *, int); // Определение состояния
                      // мыши при нажатии на
                      // клавишу


// Задать диапазон перемещений курсора по горизонтали
void  ms_rangx(int xmin, int xmax); 

// Задать диапазон перемещений курсора по вертикали
void  ms_rangy(int ymin, int ymax); 

// определение формы курсора в графическом режиме
void  ms_gform(int xt, int yt, char _far *form); 

 // определение формы курсора в текстовом режиме
void ms_tform(int type, int mask1, int mask2);  

// определение относительного перемещения в миках
MOUSE_STATE *ms_querm(MOUSE_STATE *state);  

// установка драйвера событий
void ms_seth(int mask, void (far *hand)());  

// Системные часы реального времени

#define RTC_GET_TIME    2
#define RTC_SET_TIME    3
#define RTC_GET_DATE    4
#define RTC_SET_DATE    5
#define RTC_SET_ALARM   6
#define RTC_CLEAR_ALARM 7

// работа с часами реального времени
int timer(char, SYSTIMER *); 

// формирование задержки по таймеру
void tm_delay(int); 

// формирование тона заданнной длительности с использованием
// таймера
void tm_sound(int, int); 

// инициализация генератора случайных чисел
void rnd_set(int);   

// получение случайного числа
int rnd_get(void);   


typedef struct _AUX_MODE_ {

   union {

      struct {
         unsigned char  len : 2, // длина символа
            stop         : 1, // число стоп-битов
            parity       : 2, // контроль четности
            stuck_parity : 1, // фиксация четности
            en_break_ctl : 1, // установка перерыва
            dlab         : 1; // загрузка регистра
                        // делителя
      } ctl_word;

      char ctl;

   } ctl_aux;

   unsigned long baud;     // скорость передачи данных

} AUX_MODE;

// инициализация асинхронного адаптера
int aux_init(AUX_MODE *, int, int); 

// определение режима асинхронного адаптера
void aux_stat(AUX_MODE *, int); 

// вывод символа в асинхронный адаптер
void aux_outp(char, int);  

// ввод символа из асинхронного адаптера
char aux_inp(int); 

// Прототипы функций для работы с дополнительной
// памятью.

int ems_init(void);
int ems_stat(void);
int ems_fram(unsigned *);
int ems_page(unsigned *, unsigned *);
int ems_open(int, int *);
int ems_clos(int *);
int ems_map(int, int, int);
int ems_ver(char *);
[Назад] [Содеожание] [Дальше]