Kamis, 23 Juni 2016

pertemuan 6

A.    Interupsi BIOS untuk Input Melalui Keyboard

Keyboard atau papan ketik merupakan alat input utama pada sebuah PC. Umumnya seseorang yang sedang mempelajari bahasa pemrograman C/C++ akan memanfaatkan fungsi-fungsi standar seperti scanf, getch, getchar, getche, gets dan cin untuk bisa melakukan input melalui keyboard, maka pada bab ini akan dipelajari bagaimana fungsi-fungsi tersebut bekerja.
BIOS menyediakan sebuah nomor interupsi khusus yang digunakan untuk melakukan input melalui keyboard, yaitu interupsi 16 heksadesimal. Operasi-operasi pada keyboard dapat ditentukan melalui nomor service yang disimpan pada register AH.

B.     Memasukan Satu Karakter dan Mendeteksi Penekanan Tombol Extended

Interupsi 16 heksadesimal servis 0 heksadesimal adalah nomor interupsi yang dapat digunakan untuk melakukan input satu karakter melalui keyboard. Fungsi standar getch, getchar, dan getche memanfaatkan interupsi ini. Berikut ini adalah prosedur yang harus dilakukan untuk melakukan interupsi 16 heksadesimal servis 0 heksadesimal:
 Register AH harus bernilai 0.
 Jalankan interupsi 16 heksadesimal.
Setelah Interupsi dijalankan maka:
 Register AH akan berisi dengan kode scan papan ketik.
 Register AL berisi kode ASCII dari karakter yang diketikan atau bernilai 0 jika tombol keyboard yang ditekan adalah tombol extended.

Dari penjelasan diatas, ada beberapa hal lagi yang harus lebih diperjelas. Karakter yang diketikan melalui keyboard tidak akan ditampilkan pada layar monitor dan posisi kursor tidak akan berpindah. Tombol keyboard yang diketikan dapat diketahui nilainya pada register AL, jika register AL bernilai nol, maka dapat disimpulkan bahwa tombol keyboard yang ditekan adalah tombol extended (tombol-tombol khusus).
Tombol extended atau tombol khusus adalah tombol yang disediakan untuk maksud-maksud tertentu dari sebuah program. Contoh tombol-tombol khusus adalah tombol CTRL, ALT, SHIFT, INS, F1, F2 dan sebagainya. Untuk mengetahui tombol khusus apa yang ditekan ketika register AL bernilai nol, dapat diketahui dari nilai yang disimpan pada register AH. Nilai pada register AH adalah keyboard scan code yang memberitahukan tombol khusus apa yang ditekan.
Berikut ini adalah contoh program yang menunjukan cara melakukan input satu karakter menggunakan interupsi 16 heksadesimal servis 0 yang ditulis dengan teknik inline assembly dan memanfaatkan pustaka class screen.cpp yang telah dibuat pada bab sebelumnya. Buatlah sebuah project seperti yang dilakukan pada bab-bab sebelumnya, simpan project tersebut dengan nama file contoh11.ide dengan file kode program contoh11.cpp pada direktori yang sama dengan file screen.cpp
Contoh 11:
#include <stdlib.h>
#include "screen.cpp"

 #define KEY_INT 0x16 /* Nomor interupsi keyboard */

 UCHAR getKey(void);

 int main(void)
 {
 Screen *layar = new Screen();
 UCHAR karakter;

 layar->setMode(0x03);
 layar->setCursorPos(4, 14);
 layar->writeString("Input satu karakter:");
 layar->setCursorPos(4, 34);

 karakter = getKey();

 layar->setCursorPos(5, 14);
 layar->writeString("Karakter yang anda ketik adalah");
 layar->setCursorPos(5, 46);
 layar->writeChar(karakter);
 layar->setCursorPos(6, 14);
 layar->writeString("Tekan sembarang tombol ...");



Pada kode program contoh11.cpp fungsi getKey adalah fungsi yang digunakan untuk input satu karakter. Fungsi getKey tidak memerlukan parameter dan mengembalikan nilai bertipe unsigned character (didefinisikan dalam file screen.cpp sebagi UCHAR). Nilai yang dikembalikan oleh fungsi ini adalah karakter yang diketikan pada tombol keyboard. Fungsi ini sama dengan fungsi standar getch.
Setelah mempelajari cara memasukan satu karakter, maka langkah berikutnya adalah mempelajari cara mendeteksi penekanan tombol-tombol extended. Project contoh12.ide berikut ini memberikan contoh cara mendeteksi penekanan tombol F1, F2, F3, dan F4.
Contoh 12:
 #include <stdlib.h>
 #include "screen.cpp"

 #define KEY_INT 0x16 /* Nomor interupsi keyboard */
 #define KEY_F1 0x3b /* Kode scan tombol F1 */
 #define KEY_F2 0x3C /* Kode scan tombol F2 */
 #define KEY_F3 0x3d /* Kode scan tombol F3 */
 #define KEY_F4 0x3e /* Kode scan tombol F4 */

 #define TRUE 1

 UCHAR getSpecialKey(void);

 int main(void)
 {
 Screen *layar = new Screen();
 UCHAR tombol;

 layar->setMode(0x03);
 layar->setCursorPos(5, 9);
 layar->writeString("Tekan F1, F2, F3");
 layar->setCursorPos(6, 9);
 layar->writeString("Tekan F4 untuk berhenti");
 layar->setCursorPos(8, 9);




            Pada kode program contoh12.cpp fungsi getSpecialKey adalah fungsi yang digunakan untuk mendeteksi penekanan tombol-tombol khusus. Perhatikanlah pada baris kelima sampai baris kedelapan, karena setiap tombol khusus memiliki kode tersendiri maka pada baris kelima sampai kedelapan dideklarasikan konstanta untuk tombol F1 sampai F4. Kode scan untuk tombol F1 adalah 3b heksadesimal, F2 adalah 3c heksadesimal, dan seterusnya. Bandingkanlah kode program contoh11.cpp dengan kode program contoh12.cpp pada fungsi getKey dan getSpecialKey. Pada fungsi getKey nilai yang dijadikan sebagai nilai kembali fungsi (return value) adalah nilai yang tersimpan di register AL, sedangkan pada fungsi getSpecialKey nilai yang dikembalikan adalah nilai yang tersimpan di register AL.

Tidak ada komentar:

Posting Komentar