- •Лабораторная работа Изучение принципа работы и принципов связи с пэвм манипулятора "мышка"
- •1. Краткие сведения из истории изобретения
- •2. Механическая и оптическая мыши
- •Модели компьютерных мышей и их характеристики
- •Драйверы мыши
- •Функции прерывания 33h
- •Использование прерываний мыши в Паскале
- •Очистка мыши от пыли и грязи. Устранение элементарных неисправностей
- •Практическая работа
- •Задание 1
- •Задание
- •Задание 3
- •Задание 4
- •Задание 5
- •Задание 6
- •Задание 7
- •Задание 8 обнаружение наличия реакции "мышки" на движения
- •Задание 3
- •Задание 4 инициализация комуникационного порта
- •Задание 5
Практическая работа
Задания практической работы можно выполнять при наличии 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;
}