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

       

Включаемый файл "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 *);


Содержание раздела