Предмет:
Тип роботи:
Контрольна робота
К-сть сторінок:
23
Мова:
Українська
}
INT $16
end;
{///////////////////////////////////////////////////////////////////////////
Помiстити символ [тa скан-код] в буфер клавiатури
якщо буфер переповнений то процедура повертає 1, iнакше 0
////////////////////////////////////////////////////////////////////////////}
function put_key(key:byte;scan:byte):byte;assembler;
asm
MOV AX,$0500 {Встановити номер функцii 05 та пiдфункцii 00 }
MOV CH,SCAN {Помiстити скан-код в CH }
MOV CL,KEY {Помiстити ASCII код в CL }
INT $16
end;
{///////////////////////////////////////////////////////////////////////////
Процедура виводу статусу клавiатури
///////////////////////////////////////////////////////////////////////////}
procedure print_key_info;
begin
write('Натиснена клавiша: ');
if (status and $0F)<>0
then
begin
if (status and RIGHT)<>0 then write('<RightShift>');
if (status and LEFT )<>0 then write('<LeftShift>' );
if (status and CTRL )<>0 then write('<Ctrl>' );
if (status and ALT )<>0 then write('<Alt>');
end;
{ надрукувати символ клавiши, якщо вiн не керуючий }
if key<>0 then
begin
writeln(' Cкан-код ', scan_code,' Hex: ',HexToStr(Scan_Code));
end
else
begin
writeln(' Розширений ACSII код ',scan_code*255,' Hex: ',
HexToStr(Scan_Code),HexToStr(key));
end;
end;
{//////////////////////////////////////////////////////////////////////////
Пiдпрограма розшифровки скан коду
//////////////////////////////////////////////////////////////////////////}
procedure Convert_Scan_key_to_key;
begin
key:=byte(Scan_Key and $0FF);
scan_code:=(scan_Key Shr 8) and $0FF;
end;
{//////////////////////////////////////////////////////////////////////////
Пiдпрограма демонстрацii роботи з клавiатурою через BIOS
//////////////////////////////////////////////////////////////////////////}
procedure int16_demo;
var i:integer;
begin
writeln('Використання функцiй BIOS intl6h.');
writeln('Чекаємо на натиснення клавiшi:');
wait_key;
status:=get_status;
scan_Key:=get_key;
Convert_Scan_key_to_key;
print_key_info;
writeln;
writeln('Змiна швидкостi автоповороту та часу затримки:');
writeln('Найбiльша швидкiсть та мiнiмальна затримка.');
writeln('Утримуйте клавiшу до 50 автоповторiв:');
set_rate_delay(0, 0);
for i:=0 to 50 do
begin
scan_Key:=get_key;
status:=get_status;
Convert_Scan_key_to_key;
print_key_info;
end;
writeln('Почистимо буфер клавiатури.');
delay(500);
Key_clear_buffer;
Writeln('Найменьша швидкiсть та максимальна затримка.');
Writeln('Утримуйте клавiшу до 20 автоповторiв: ');
set_rate_delay($1F, 3);
for i:=0 to 20 do
begin
scan_Key:=get_key;
status:=get_status;
Convert_Scan_key_to_key;
print_key_info;
end;
writeln('Oчистимо буфер клавiатури');
delay(1000);
Key_clear_buffer;
key_default;
writeln('Помiстимо символ "G" в буфер клавiатури');
i:=put_key(ord('G'),0);
if i=0 then writeln('Буфер переповнений')
else
begin
writeln('.. та зчитаємо його:');
while keypressed do
write(readkey);
end;
end;
{//////////////////////////////////////////////////////////////////////////
Демострацiя функцiї MS DOS
//////////////////////////////////////////////////////////////////////////}
function input_string:string;
var p:PAstring;
len:byte;
i :byte;
t:string;
begin
{ // // вiдвести пам'ять пiд рядок //}
t:='';
new(P);
(P^)[0]:=254;
{ перший байт - max можлива довжина вводу 254}
asm
SUB BX,BX
MOV DX,WORD PTR P
MOV AX,WORD PTR P+2
PUSH DS
MOV DS,AX
MOV AX,$0A00
INT 21H
POP DS
end;
{ довжина реально введеного рядка }
len:=P^[1];
for i:=0 to Len-1 do
t:=t+char(p^[i+2]);
dispose(P);
input_string:=T;
end;
{//////////////////////////////////////////////////////////////////////////
Демонстрацiя функцiй DOS.
//////////////////////////////////////////////////////////////////////////}
procedure dos_func_demo;
var T:string;
begin
writeln('Демонстрацiя функцiй DOS ');
writeln('Введiть рядок (до 254 символiв). Завершення - ENTER:');
t:=input_string;
writeln('Bведений рядок:',T);
end;
{//////////////////////////////////////////////////////////////////////////
Демонстрацiя функцiй BP.
//////////////////////////////////////////////////////////////////////////}
procedure BP_func_demo;
begin
writeln('Bикористання функцiй BP');
writeln('Чекаємо на натиснення клавiшi:');
Repeat until keypressed;
key := ord(ReadKey);
if key=0
then Scan_Code:= ord(ReadKey)
else Scan_Code:= 0;
print_key_info;
end;
{/////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////}
procedure define_machine_type;
var Ibm_type:byte absolute $F000:$FFFE;
begin
{визначити тип PC: XT/AT }
if ibm_type = $FC
then machine:=AT
else Machine:=No_At;
end;
{//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////}
begin
{ визначити тип PC XT/AT }
define_machine_type;
{ апаратно - залежнi функцiї працюють лише на АТ! }
if machine=AT
then
begin
writeln('Програмування контролера клавiатури...');
port_io_demo;
end;
Machine:=No_AT;
writeln('Демонстрацiя функцiй BIOS int 16 ');
int16_demo;
writeln('Демонстрацiя функцiй MS DOS');
dos_func_demo;
writeln('Демонстрацiя функцiй BP');
BP_func_demo;
end.