Предмет:
Тип роботи:
Контрольна робота
К-сть сторінок:
23
Мова:
Українська
стану свiтлодiодiв }
send_to_kbd($ED);
{ Маскуємо непотрбнi бiти }
Tmp:=AByte and $03;
{ Посилаемо стан бiтiв клавiатури }
send_to_kbd(Abyte);
{ Змiнюємо бiти 4-6 в областi даних клавiатури BIOS 0:417h }
bios_key_flag:=(bios_key_flag and No_lites) or (Tmp Shl 4);
end;
{////////////////////////////////////////////////////////////////////////////
Очистити буфер клавiатури (працює на всiх PC)
///////////////////////////////////////////////////////////////////////////}
procedure Key_clear_buffer;
{ покажчики голови та хвоста буфера клавiатури}
var buf_begin:word absolute $0:$41A;
buf_end :word absolute $0:$41C;
begin
{ Встановлюемо буфер на початок буфера BIOS
buf_begin := $041E;
buf_end := $041F; }
end;
{////////////////////////////////////////////////////////////////////////////
Демо пiдпрограма роботи з контролером
////////////////////////////////////////////////////////////////////////////}
procedure port_io_demo;
const lamps:array [0..5] of byte =(1, 3, 2, 6, 4, 5);
var i:integer;
begin
key_reset;
key_default;
writeln;
writeln('Бiжучi вогнi на iндикаторах.');
for i:=0 to 5 do
begin
Key_lights(lamps[i]);
delay(500);
end;
for i:=5 downto 0 do
begin
Key_lights(lamps[i]);
delay(500);
end;
Key_lights(0);
delay(500);
writeln('Виключимо клавiатуру на 10 секунд ........................ ');
Writeln('Ввiд клавiш не сприймається навiть для резидентних програм ');
Key_disable;
delay(10000);
Writeln('Включимо клавiатуру ');
Key_enable;
Key_clear_buffer;
if keypressed then writeln('Is pressed!');
writeln('Встановимо параметри по замовчуванню.');
key_default;
end; {///////////////////////////////////////////////////////////////////////
Демонстрацiя функцiй BIOS intl6h
////////////////////////////////////////////////////////////////////////////}
{////////////////////////////////////////////////////////////////////////////
Чекати натиснення клавiшi
////////////////////////////////////////////////////////////////////////////}
procedure wait_key;assembler;
asm
@1:MOV AH,Machine
SUB AL,AL
OR AH,$01 {Встановити номер пiдфункцii для XT - 01 для AT - 011 }
INT $16 {Викликати переривання }
JNZ @1 {Якщо флаг ZF = 0 то символ прийнятий з клавiатури }
{Iнакше перейти на початок пiдпрограми }
end;
{////////////////////////////////////////////////////////////////////////////
Отримати клавiшу та скан-код
////////////////////////////////////////////////////////////////////////////}
function get_key:word;assembler;
asm
MOV AH,Machine {Встановити номер пiдфункцii для XT - 00 для AT - 010 }
SUB AL,AL
INT $16 {Викликати переривання }
end;
{///////////////////////////////////////////////////////////////////////////
Отримати статус клавiш-модифiкаторiв
///////////////////////////////////////////////////////////////////////////}
function get_status:word;assembler;
asm
MOV AH,Machine
SUB AL,AL
OR AH,$02 {Встановити номер функцii для XT - 02 для AT - 012 }
INT $16 {Викликати переривання }
CMP Machine,$10
JZ @2 {Якщо комп'ютер - не AT то старший байт недiйсний }
SUB AH,AH
@2:
end;
{////////////////////////////////////////////////////////////////////////////
Встановити швидкiсть автоповторiв(rate) та затримку
nри утримання наступної клвiшi (delay)
////////////////////////////////////////////////////////////////////////////}
procedure set_rate_delay(rate:byte;delay:byte);assembler;
asm
MOV AX,$0305 {Встановити номер функцii 03 та пiдфункцii 05 }
MOV BL,rate {Встановити перiод повтору }
MOV BH,delay {Встановити затримку перед повтором