Mengetahui
Status Tombol On/Off
Pada keyboard ada tombol-tombol yang memiliki
dua keadaan (on atau off) seperti
Caps Lock, Num Lock,
Scroll Lock, serta tombol yang memiliki status tekan (pressed/ditekan
atau release/dilepas)
seperti Alt, Ctrl, Ins, dan Shift. BIOS pada PC menyediakan interupsi 16
heksadesimal servis 2
untuk mengetahui status tombol-tombol tersebut. Berikut ini adalah
prosedur untuk menjalankan
interupsi 16 heksadesimal servis 2.
ÿ Register
AH harus bernilai 2 heksadesimal.
ÿ Jalankan
interupsi 16 heksadesimal.
Setelah interupsi
dijalankan, register AL akan berisi nilai BIOS keyboard flag dengan
ketentuan sebagai berikut:
8 Jika bit
0 bernilai 1 berarti tombol Shift kanan dilepas.
8 Jika bit
1 bernilai 1 berarti tombol Shift kiri dilepas.
8 Jika bit
2 bernilai 1 berarti tombol Ctrl dilepas.
8 Jika bit
3 bernilai 1 berarti tombol Alt dilepas.
8 Jika bit
4 bernilai 1 berarti tombol Scroll Lock on.
8 Jika bit
5 bernilai 1 berarti tombol Num Lock On.
8 Jika bit
6 bernilai 1 berarti tombol Caps Lock on.
8 Jika bit
7 bernilai 1 berarti tombol Ins aktif.
Berikut ini adalah contoh program untuk
mengetahui cara menggunakan interupsi 16
heksadesimal servis 2.
Simpan project ini dengan nama contoh15.ide pada direktori yang sama
dengan file screen.cpp.
CONTOH SCREEN CPP.15
#include <stdlib.h>
#include "screen.cpp"
#define KEY_INT 0x16
#define KEY_ESC 0x1b
#define STATE_RSHIFT 0x01
#define STATE_LSHIFT 0x02
#define STATE_CTRL 0x04
#define STATE_ALT 0x08
#define STATE_SCROLL 0x10
#define STATE_NUM 0x20
#define STATE_CAPS 0x40
#define STATE_INS 0x80
#define TRUE 1
UCHAR getKeyState(UCHAR key);
int main(void)
{
Screen *layar = new Screen();
UCHAR tombol;
layar->setAttribute(0xC);//huruf
warna light merah
layar->setMode(0x03);
layar->setCursorPos(4, 14);
layar->writeString("SHIFT
KANAN :");
layar->setCursorPos(5, 14);
layar->writeString("SHIFT
KIRI :");
layar->setAttribute(0xE);//huruf
warna light yellow
layar->setCursorPos(6, 14);
layar->writeString("CTRL :");
layar->setCursorPos(7, 14);
layar->writeString("ALT :");
layar->setCursorPos(8, 14);
layar->writeString("SCROLL
LOCK :");
layar->setCursorPos(9, 14);
layar->setAttribute(0xA);//huruf
warna light green
layar->writeString("NUM
LOCK :");
layar->setAttribute(0xA);//huruf
warna merah
layar->setCursorPos(10, 14);
layar->writeString("CAPS
LOCK :");
layar->setCursorPos(11, 14);
layar->setAttribute(0x7);//huruf
warna putih
layar->writeString("INS -
Hentikan Program");
while (TRUE)
{
asm mov ah, 0x01; /* Menyembunyikan kursor */
asm mov ch, 0x20; /* Register CX = 2000 heksadesimal */
asm mov cl, 0x00;
asm int 0x10; /* BIOS Video Interupt Service 1 */
layar->setCursorPos(4, 30);
layar->setAttribute(0xC);//huruf
warna light merah
if (getKeyState(STATE_RSHIFT))
layar->writeString("DITEKAN");
else
layar->writeString("DILEPAS");
layar->setCursorPos(5, 30);
if (getKeyState(STATE_LSHIFT))
layar->writeString("DITEKAN");
else
layar->writeString("DILEPAS");
layar->setCursorPos(6, 30);
layar->setAttribute(0xE);//huruf
warna light yellow
if (getKeyState(STATE_CTRL))
layar->writeString("DITEKAN");
else
layar->writeString("DILEPAS");
layar->setCursorPos(7, 30);
if (getKeyState(STATE_ALT))
layar->writeString("DITEKAN");
else
layar->writeString("DILEPAS");
layar->setCursorPos(8, 30);
if (getKeyState(STATE_SCROLL))
layar->writeString("ON
");
else
layar->writeString("OFF");
layar->setCursorPos(9, 30);
layar->setAttribute(0xA);//huruf
warna light green
if (getKeyState(STATE_NUM))
layar->writeString("ON
");
else
layar->writeString("OFF");
layar->setCursorPos(10, 30);
if (getKeyState(STATE_CAPS))
layar->writeString("ON
");
else
layar->writeString("OFF");
layar->setCursorPos(11, 14);
if (getKeyState(STATE_INS)) break;
}
delete layar;
return EXIT_SUCCESS;
}
UCHAR getKeyState(UCHAR key)
{
UCHAR state;
asm mov ah, 0x02; /* Register AH = 2 */
asm int KEY_INT; /* Lakukan interupsi 16 heksadesimal */
asm and al, key; /* AND-kan register AL sesuai tombol */
asm mov state, al; /* Salin nilai register AL ke state */
return state;
}
Pada program
contoh15.cpp, fungsi getKeyState adalah fungsi yang digunakan untuk mengetahui
status tombol. Perhatikanlah baris 7 sampai baris 14! Pada baris ketujuh sampai
keempat belas dideklarasikan konstanta STATE_RSHIFT dan STATE_INS.
Konstantakonstanta ini digunakan untuk mengetahui status penekanan tombol Shift
kanan sampai tombol Ins.
Konstanta-konstanta inilah
yang dikirimkan sebagai parameter pada
fungsi getKeyState. Pada baris 114, setelah interupsi dijalankan nilai register
AL di-AND-kan dengan nilai yang dikirimkan parameter fungsi getKeyState.
Sebagai contoh, untuk mengetahui status tombol Shift kanan sedang ditekan atau
dilepas, ditentukan dari nilai bit pertama pada register AL. Untuk mengetahui
apakah nilai bit pertama 1 atau 0, maka nilai pada register AL harus di-ANDkan dengan
nilai 0x01 atau 00000001 binari atau nilai konstanta STATE_RSHIFT. Kemudian nilai
register AL yang telah di-AND-kan dijadikan nilai kembali fungsi getKeyState.





