Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. D триггеры, работающие по фронту.
  2. I. ВНЕАУДИТОРНАЯ САМОСТОЯТЕЛЬНАЯ РАБОТА СТУДЕНТОВ
  3. I. ВНЕАУДИТОРНАЯ САМОСТОЯТЕЛЬНАЯ РАБОТА СТУДЕНТОВ
  4. I. ВНЕАУДИТОРНАЯ САМОСТОЯТЕЛЬНАЯ РАБОТА СТУДЕНТОВ
  5. I. ВНЕАУДИТОРНАЯ САМОСТОЯТЕЛЬНАЯ РАБОТА СТУДЕНТОВ
  6. I. ВНЕАУДИТОРНАЯ САМОСТОЯТЕЛЬНАЯ РАБОТА СТУДЕНТОВ
  7. I. ВНЕАУДИТОРНАЯ САМОСТОЯТЕЛЬНАЯ РАБОТА СТУДЕНТОВ

 

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

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, &reg, &reg);

 

// Инициализируем мышь, определяем количество клавиш

 

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, &reg, &reg);

 

}

 

 

Замечание: использование функции 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, &reg, &reg); 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, &reg, &reg); // Инициализируем мышь, определяем количество клавиш 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, &reg, &reg); }

Задание 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, &reg, &reg);

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, &reg, &reg);

 

// Инициализируем мышь

 

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, &reg, &reg);

}

 

 

Задание 8


Дата добавления: 2015-12-07; просмотров: 82 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.044 сек.)