Программирование видеоадаптеров 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 *); |