Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЫШЬ_1.doc
Скачиваний:
22
Добавлен:
24.08.2019
Размер:
501.76 Кб
Скачать

Практическая работа

Задания практической работы можно выполнять при наличии 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;

}