Files
templates/LABV10.CPP
2024-09-10 22:24:24 +03:00

77 lines
2.5 KiB
C++
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// "Обмен IBM PC с клавиатурой"
// Labv10
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <bios.h>
#define Port8042 0x60
long far * pTime=(long far*)0x46C; // Указатель на счетчик тиков
// Определим указатели начала и конца буфера
int far * pHeadPtr=(int far *)0x41A; // Указатель на указатель головы буф.кл.
int far * pTailPtr=(int far *)0x41C; // Указатель на указатель хвоста буф.кл.
unsigned char far * pBuf;
void main()
{
// 3адание N1.
clrscr();
cout << "\n 3адание N1:\n";
cout << "\n Нажимайте клавиши для получения кодов!";
cout << "\n Пробел - идем дальше.\n";
char cScan,cAsci;
int iAdres;
do
{
// Загрузить пару регистров, например ds:si значением 0x40:0x1A
asm{
push ds //
push si // Сохранили регистры
push di //
mov ax,0x40 //
mov ds,ax // Загрузили сегмент
mov si,0x1A // и указатели на голову
mov di,0x1C // и на хвост
}
wait_kbd:
asm{
mov ax,[si] // Сравниваем указатели -
cmp ax,[di] // т.е. ждем нажатия
je wait_kbd
// Загрузить регистр di значением 0x1C
// Сравнить указатели
// Прочитать указатель
mov si,[si]
}
iAdres=_SI;
// Прочитать значение из буфера
asm mov ax,[si]
// Теперь _AL и _AH содержат скан-код и ASCII-код
asm pop di
asm pop si
asm pop ds
cScan=_AH;
cAsci=_AL;
printf("Адрес = %x Скан = %d ASCII = %d \n",iAdres,cScan,cAsci);
} while(getch() != 32);
cout << "\n Конец первого задания. Press any key...\n";
getch();
delay(1000);
asm in al,0x60
cScan=0; // ??????
printf(" Скан = %x \n",cScan);
// goto met;
//
}
// Задание
// 1 Разберите представленную программу
// Определите отличие ASCII кодов: основных и служебных клавиш
// 2 Напишите мини программу циклического чтения скан кодов из порта 60
// Определите отличие скан кодов: нажатия и отпускания клавиши