Читайте также:
|
|
Задания практической работы можно выполнять при наличии IBM-совместимой ПЭВМ, манипулятора "мышь", который включен в гнездо коммуникационного порта, и отсутствующего (заблокированного) драйвера "мышки". О выполнении этих требований нужно самостоятельно удостовериться, что в составе файлов autoexec.bat или config.sys отсутствуют или заблокированы ссылки на файлы gmouse.com (возможны другие названия).
Задание 1
Выполнить пpогpамму тестиpования мыши. Результаты записать в протоколе выполнения.
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <bios.h>
#ifndef MY_TYPE
#define MY_TYPE 1
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
#endif
#define F1 0x3B00
#define F2 0x3C00
#define F3 0x3D00
#define F4 0x3E00
#define F5 0x3F00
#define F6 0x4000
#define F7 0x4100
#define Escape 0x011B
#define Enter 0x1C0D
#define VERSION "1.3"
word baseport; /* Базовый адрес COM-порта */
word intnum; /* Номер его прерывания */
word port3FC=0xB;
#define MBSIZE 32
byte mbuffer[MBSIZE+1];
byte *mbhead=mbuffer,*mbtail=mbuffer;
void FIbyte(byte b)
{ byte *tmp=mbtail+1;
if(tmp>=mbuffer+MBSIZE) tmp=mbuffer;
if(tmp!=mbhead)
{ *mbtail=b;mbtail=tmp;
}
}
byte FObyte(void)
{ byte *tmp;
if((tmp=mbhead)==mbtail) return 0xFF;
if(++mbhead>=mbuffer+MBSIZE) mbhead=mbuffer;
return *tmp;
}
/* Обработчик аппаратного прерывания */
void interrupt newhrd(void)
{ /* Взять байт от мыши и поместить в очередь */
FIbyte(inportb(baseport));
/* Восстановить питание мыши */
outportb(baseport+4,port3FC);
/* Конец прерывания */
outport(0x20,0x20);
}
main(int argc,char **argv)
{ int i;
void interrupt (*oldint)(void);
byte intmask;
cprintf("Mouse tester V"VERSION", 2:5020/216.6\r\n");
if(argc<2)
{ cprintf("Syntax: moutest <port_number>\r\n"
"Keys: F1 - Clear screen\r\n"
" F2 - Microsoft mode\r\n"
" F3 - PC Mouse System mode\r\n"
" F4 - Custom values to ports xFB,xFC\r\n"
" F5 - 0xB -> to port xFC\r\n"
" F6 - 8 -> to port xFC\r\n"
" Enter - Send byte to mouse\r\n"
);
_exit(1);
}
_AX=0;__int__(0x33);
if(_AX==0xFFFF)
{ cprintf("Mouse driver present- remove and try again.\r\n");
_exit(3);
}
i=(*argv[1])-'0';
if(i<1 || i>2)
{ cprintf("Incorrect port number (only 1 or 2 need).\r\n");
_exit(2);
}
if(i==1)
{ baseport=0x3F8;
intnum=0xC;
intmask=0x10;
}else
{ baseport=0x2F8;
intnum=0xB;
intmask=0x8;
}
/* Установить обработчик аппаратного прерывания */
oldint=getvect(intnum);
setvect(intnum,newhrd);
/* Проинициализировать PIC 8259-1 */
i=inportb(0x21)&~intmask;
delay(1);
outportb(0x21,(byte)i);
delay(1);
/* Проверить наличие порта в адресном пространстве */
if(inportb(baseport+1)&0xF8)
{ cprintf("Error - No port present?\r\n");
_exit(4);
}
/* Ставим параметры порта */
outportb(baseport+3,0x80);
outport(baseport,0x60); /* 1200 */
delay(1);
outportb(baseport+3,2); /* N71 (L..ppsbb) */
delay(1);
outportb(baseport+1,0);
delay(1);
outportb(baseport+4,1); /* Set DTR, /RTS for power */
/* На всякий случай */
delay(100);
/* Установить DTR, RTS, OUT для питания мыши */
outportb(baseport+4,port3FC);
/* Прерывание только по приему байтов */
outportb(baseport+1,1);
clrscr();
redr:
while(mbhead!=mbtail)
cprintf("%02X ",FObyte());
in:
if(!bioskey(1)) goto redr;
switch(bioskey(0))
{ case Escape: goto quit;
case F1: clrscr();
cprintf("F2·MS mode (N71), F3·PC mode (N81), F4·custom mode, F5·0xB, F6·8\r\n");
break;
case F2: outportb(baseport+3,2); /* (L..ppsbb) */
break;
case F3: outportb(baseport+3,3); /* (L..ppsbb) */
break;
case F4: cprintf("\r\nEnter new xFC value, xFB value:");
cscanf("%x %x",&port3FC,&i);
outportb(baseport+3,i); /* (L..ppsbb) */
outportb(baseport+4,port3FC);
break;
case F5: port3FC=0xB;outportb(baseport+4,port3FC);
break;
case F6: port3FC=0x8;outportb(baseport+4,port3FC);
break;
case Enter: cprintf("Send byte: ");
cscanf("%x",&i);outportb(baseport,i);cprintf("\r\n");
break;
}
goto redr;
quit:
/* Запретить прерывания от порта */
outportb(baseport+1,0);
/* Запретить обработку прерывания в контроллере */
outportb(0x21,inportb(0x21)|intmask);
/* Вернуть вектор на место */
setvect(intnum,oldint);
return 0;
}
Задание
Исполнить программу, которая инициализирует мышь, делает видимым курсор мыши и "прячет" курсор после нажатия на любую клавишу:
#include <stdio.h>
#include <conio.h>
#include "sysp.h"
void main() {
int botm;
// Инициализируем мышь, определяем количество клавиш
if(!ms_init(&botm)) {
printf("\nМышь не установлена");
exit(-1);
}
printf("\nУстановлена мышь: ");
switch (botm) {
case 2:
printf("двухклавишная"); break;
case 3:
printf("трехклавишная, системы Mouse Systems");
break;
case 0:
default:
printf("неизвестной системы"); break;
}
// Включаем курсор и ожидаем нажатия на клавишу
printf("\n\nКурсор мыши включен, "
"для выключения нажмите любую клавишу");
ms_on();
getch();
// Выключаем курсор
ms_off();
printf("\nКурсор выключен, "
"для завершения нажмите любую клавишу");
getch();
Задание 3
Исполнить программу, которая запрашивает номер видеорежима, устанавливает его и динамически отображает координаты курсора и состояние клавиш мыши. После завершения работы программа восстанавливает первоначальный видеорежим:
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include "sysp.h"
union REGS reg;
void main() {
int botm, i;
MOUSE_STATE state;
unsigned old_videomode, new_videomode;
char buf[20], *bufptr;
// Определяем текущий видеорежим
reg.x.ax = 0x0f00;
int86(0x10, ®, ®);
old_videomode = reg.h.al;
// Устанавливаем новый видеорежим:
// Устанавливаем максимально допустимую длину строки
buf[0] = 10;
printf("\nВведите десятичный номер видеорежима: ");
bufptr = cgets(buf);
// Преобразуем введенное число к формату int
new_videomode = atoi(bufptr);
reg.h.ah = 0;
reg.h.al = new_videomode;
int86(0x10, ®, ®);
// Инициализируем мышь, определяем количество клавиш
if(!ms_init(&botm)) {
printf("\nМышь не установлена");
exit(-1);
}
printf("\nУстановлена мышь: ");
switch (botm) {
case 2:
printf("двухклавишная"); break;
case 3:
printf("трехклавишная, системы Mouse Systems");
break;
case 0:
default:
printf("неизвестной системы"); break;
}
printf("\n\nСостояние мыши:\n\n");
// Включаем курсор
ms_on();
while(!kbhit()) {
ms_query(&state);
printf("%2d x:%5d y:%5d",
state.bottoms,
state.x,
state.y);
for(i=0;i<18;i++) printf("\b");
}
getch();
ms_off();
reg.h.ah = 0;
reg.h.al = old_videomode;
int86(0x10, ®, ®);
}
Замечание: использование функции 03h - не самый лучший способ работы с мышью. Программа должна постоянно следить за координатами курсора или за состоянием клавиш. Это может привести к непроизводительным затратам процессорного времени на опрос состояния.
Задание 4
Исполнить программу, которая устанавливает курсор в левый верхний угол экрана:
#include <stdio.h>
#include <conio.h>
#include "sysp.h"
void main() {
int botm;
// Инициализируем мышь
if(!ms_init(&botm)) {
printf("\nМышь не установлена");
exit(-1);
}
// Включаем курсор и ожидаем нажатия на клавишу
printf("\n\nКурсор мыши включен, "
"для выключения нажмите любую клавишу");
ms_on();
// Устанавливаем курсор в левый верхний угол экрана
ms_setcr(0,0);
getch();
// Выключаем курсор
ms_off();
}
Задание 5
Исполнить программу, которая определяет и выводит на экран состояние мыши при нажатии и отпускании левой клавиши:
#include <dos.h>#include <stdio.h>#include <conio.h>#include "sysp.h" union REGS reg;void main() { int botm, i; MOUSE_STATE state; unsigned old_videomode, new_videomode; char buf[20], *bufptr; // Определяем текущий видеорежим reg.x.ax = 0x0f00; int86(0x10, ®, ®); old_videomode = reg.h.al; // Устанавливаем новый видеорежим: // Устанавливаем максимально допустимую длину строки buf[0] = 10; printf("\nВведите десятичный номер видеорежима: "); bufptr = cgets(buf); // Преобразуем введенное число к формату int new_videomode = atoi(bufptr); reg.h.ah = 0; reg.h.al = new_videomode; int86(0x10, ®, ®); // Инициализируем мышь, определяем количество клавиш if(!ms_init(&botm)) { printf("\nМышь не установлена"); exit(-1); } printf("\nУстановлена мышь: "); switch (botm) { case 2: printf("двухклавишная"); break; case 3: printf("трехклавишная, системы Mouse Systems"); break; case 0: default: printf("неизвестной системы"); break; } printf("\n\nСостояние мыши:\n\n"); // Включаем курсор ms_on(); while(!kbhit()) { // Определяем состояние мыши при нажатии на левую клавишу i = ms_querp(&state, 0); // Если были нажатия на левую клавишу, выводим состояние мыши if(i!= 0) { // Перед выводом на экран отключаем курсор, затем включаем его// снова. ms_off(); printf("Нажатие: %2d x:%5d y:%5d\n", state.bottoms, state.x, state.y); ms_on(); } // Выводим состояние при отпускании клавиши i = ms_querr(&state, 0); if(i!= 0) { ms_off(); printf("Отпускание: %2d x:%5d y:%5d\n\n", state.bottoms, state.x, state.y); ms_on(); } } getch(); ms_off(); reg.h.ah = 0; reg.h.al = old_videomode; int86(0x10, ®, ®); }Задание 6
Исполнить программу, которая ограничивает диапазон перемещений курсора мыши по экрану:
#include <stdio.h>
#include <conio.h>
#include "sysp.h"
void main() {
int botm;
// Инициализируем мышь
if(!ms_init(&botm)) {
printf("\nМышь не установлена");
exit(-1);
}
// Включаем курсор и ожидаем нажатия на клавишу
printf("\n\nКурсор мыши включен, для выключения"
" нажмите любую клавишу");
ms_on();
// Задаем границы, в которых должен перемещаться курсор
ms_rangx(20, 100);
ms_rangy(50, 100);
getch();
// Выключаем курсор
ms_off();
}
Задание 7
Исполнить программу, изменяющую форму курсора в графическом режиме:
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include "sysp.h"
union REGS reg;
char form[64] = {
// Массив маски по "И"
255,255, 255,255, 255,255, 255,255, 255,255,
255,255, 255,255, 255,255,
255,255, 255,255, 255,255, 255,255, 255,255,
255,255, 255,255, 255,255,
// Массив маски по "Исключающее ИЛИ"
127,254, 127,254, 127,254, 127,254, 127,254,
127,254, 127,254, 0,0,
0,0, 127,254, 127,254, 127,254, 127,254, 127,254,
127,254, 127,254,
};
void main() {
int botm, i;
MOUSE_STATE state;
unsigned old_videomode, new_videomode;
char buf[20], *bufptr;
// Определяем текущий видеорежим
reg.x.ax = 0x0f00;
int86(0x10, ®, ®);
old_videomode = reg.h.al;
// Устанавливаем новый видеорежим:
// Устанавливаем максимально допустимую длину строки
buf[0] = 10;
printf("\nВведите десятичный номер видеорежима: ");
bufptr = cgets(buf);
// Преобразуем введенное число к формату int
new_videomode = atoi(bufptr);
reg.h.ah = 0;
reg.h.al = new_videomode;
int86(0x10, ®, ®);
// Инициализируем мышь
if(!ms_init(&botm)) {
printf("\nМышь не установлена");
exit(-1);
}
// Задаем новую форму для курсора мыши
ms_gform(0,0, &form[0]);
// Включаем курсор
ms_on();
getch();
ms_off();
reg.h.ah = 0;
reg.h.al = old_videomode;
int86(0x10, ®, ®);
}
Задание 8
Дата добавления: 2015-12-07; просмотров: 82 | Нарушение авторских прав