Rabu, 03 Mei 2017

CONTOH SCREEN CPP.15

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.

CONTOH SCREEN CPP.14

Memasukan String Berupa Kata Sandi

  Pada aplikasi-aplikasi tertentu yang membutuhkan autentikasi seperti nama
pengguna dan kata sandi, biasanya saat memasukan kata sandi akan ditampilkan karakter
asteriks (*) sebagai ganti karakter yang diketikan. Hal ini dimaksudkan agar orang lain yang
tidak berhak tidak bisa mencuri lihat kata sandi atau password yang sedang dimasukan.

Untuk membuat input password seperti yang telah dijelaskan diatas, kita dapat
memodifikasi fungsi getString pada program contoh13.cpp. Project contoh14.ide berikut ini
adalah contoh penerapan ide untuk memasukan password. Project ini akan menggunakan
pustaka class screen.cpp, jadi simpanlah kode program contoh14.cpp pada direktori yang
sama dengan file screen.cpp.

CONTOH SCREEN CPP.14

#include <stdlib.h>
#include "screen.cpp"

#define KEY_INT        0x16   /* Nomor interupsi keyboard */
#define KEY_BACKSPACE  0x08   /* Tombol Backspace         */
#define KEY_RETURN     0x0d   /* Tombol Enter             */
#define KEY_TAB        0x09   /* Tombol Tab               */
#define KEY_SPACE      0x20   /* Tombol spasi             */

#define NULL           0x00   /* ASCII 0                  */
#define TRUE           1

UCHAR *getString(Screen *scr, UCHAR *str, UCHAR max);
UCHAR *getPwdString(Screen *scr, UCHAR *pwd, UCHAR max);

int main(void)
{
Screen *layar = new Screen();
UCHAR *nama, nama2[16];
UCHAR *sandi, sandi2[21];
UCHAR kar = '*';

layar->setMode(0x03);
layar->setCursorPos(5, 9);
layar->writeString("Username:");
layar->setCursorPos(5, 19);

/* Memasukan username */
layar->setAttribute(0x9);//huruf warna light blue
nama = getString(layar, nama2, 15);

layar->setAttribute(0xC);//huruf warna light red
layar->setCursorPos(6, 9);
layar->writeString("Password:");
layar->setCursorPos(6, 19);

/* Memasukan password */
sandi = getPwdString(layar, sandi2, 20);

layar->setAttribute(0x9);//huruf warna light blue
layar->setCursorPos(8, 9);
layar->writeString("Selamat datang");
layar->setCursorPos(8, 24);
layar->writeString(nama);
layar->setCursorPos(9, 9);
layar->writeString("Password Anda adalah");
layar->setCursorPos(9, 30);
layar->writeString(sandi);

/* getKey */
asm mov ah, 0x00;
asm int KEY_INT;

delete layar; return EXIT_SUCCESS;
}

UCHAR *getString(Screen *scr, UCHAR *str, UCHAR max)
{
UCHAR key, i, x, y;

key = i = 0;

while (TRUE)
{
asm mov ah, 0x00;
asm int KEY_INT;
asm mov key, al;

if ((key == KEY_BACKSPACE) && (i > 0))
{
scr->getCursorPos(&y, &x);
scr->setCursorPos(y, --x);
scr->writeChar(KEY_SPACE);

*(str + i) = NULL; i--;
}

if ((key >= 32) && (key <= 126) && (i < max))
{
scr->getCursorPos(&y, &x);
scr->writeChar(key);
scr->setCursorPos(y, ++x);

*(str + i) = key; i++;
}

if ((key == KEY_TAB) && (i < max))
{
scr->getCursorPos(&y, &x);
scr->writeChar(KEY_SPACE);
scr->setCursorPos(y, ++x);

*(str + i) = KEY_SPACE; i++;
}

if (key == KEY_RETURN)
{
*(str + i) = NULL;
break;
}

if (i == max) *(str + i) = NULL;
}

return str;
}

UCHAR *getPwdString(Screen *scr, UCHAR *pwd, UCHAR max)
{
UCHAR key, i, x, y;

key = i = 0;

while (TRUE)
{
asm mov ah, 0x00;
asm int KEY_INT;
asm mov key, al;

if ((key == KEY_BACKSPACE) && (i > 0))
{
scr->getCursorPos(&y, &x);
scr->setCursorPos(y, --x);
scr->writeChar(KEY_SPACE);

*(pwd + i) = NULL; i--;
}

if ((key >= 32) && (key <= 126) && (i < max))
{
scr->getCursorPos(&y, &x);
scr->writeChar('*');
scr->setCursorPos(y, ++x);

*(pwd + i) = key; i++;
}

if ((key == KEY_TAB) && (i < max))
{
scr->getCursorPos(&y, &x);
scr->writeChar('*');
scr->setCursorPos(y, ++x);

*(pwd + i) = KEY_TAB; i++;
}

if (key == KEY_RETURN)
{
*(pwd + i) = NULL;
break;
}

if (i == max) *(pwd + i) = NULL;
}

return pwd;
}  




  Fungsi getPwdString pada program contoh14.cpp diatas adalah fungsi yang
digunakan untuk memasukan string password. Perhatikanlah pada baris 129 dan 138! Pada
baris 129 ketika ada karakter alphanumerik dan simbol yang diketikan maka yang akan
35
ditampilkan adalah sebuah asteriks, demikian juga ketika tombol tab yang ditekan. Perbedaan
lain antara fungsi getString dan getPwdString adalah karakter tab akan tetap disimpan sebagai

tab (ASCII 9) bukan sebagai spasi.

CONTOH SCREEN CPP.13

Memasukan String Menggunakan Keyboard

Setelah memahami cara memasukan satu karakter melalui keyboard, maka pada sub
bab ini akan dipelajari cara memasukan string menggunakan keyboard. Fungsi getKey dan
getSpecialKey langsung mengembalikan nilai dari tombol yang ditekan tanpa menunggu
penekanan tombol ENTER dan tidak menggeser posisi kursor ke sebelah kanan. Pada fungsi
untuk memasukan rangkaian karakter berikut ini akan digunakan pustaka class screen.cpp
untuk mengetahui letak kursor, memindahkan posisi kursor dan mencetak karakter.

Beberapa hal lain yang harus diperhatikan pada fungsi untuk memasukan string
adalah sebagai berikut:

1. Tombol-tombol khusus seperti Esc, F1 s.d F12, Fn, CTRL, ALT, Page Up, Page Down,
tombol tanda panah, Home, End, Ins, Del dan Break tidak dapat ditampilkan dan tidak
dapat digunakan.
2. Tombol backspace akan menghapus satu karakter disebelah kiri, jika karakter pertama
sudah terhapus maka tombol tidak berfungsi.
3. Karakter yang bisa dimasukan adalah karakter alphanumerik, simbol-simbol dan spasi.
Karakter tab akan dianggap sebagai spasi.
4. Jumlah karakter yang dapat dimasukan harus dibatasi. Tombol ENTER tidak akan
disimpan dan digunakan sebagai tanda bahwa string telah selesai dimasukan.
5. String pada bahasa pemrograman C/C++ adalah rangkaian karakter dalam bentuk
ASCIIZ (ASCII plus Zero atau null terminated string).

Setelah memahami ide dasar memasukan rangkaian karakter, project contoh13.ide
berikut ini akan memberikan contoh bagaimana menerapkan ide tersebut menggunakan teknik
inline assembly. Project ini akan menggunakan pustaka class screen.cpp, jadi simpanlah kode
program contoh13.cpp pada direktori yang sama dengan screen.cpp.
CONTOH SCREEN CPP.13

#include <stdlib.h>
#include "screen.cpp"

#define KEY_INT        0x16   /* Nomor interupsi keyboard */
#define KEY_BACKSPACE  0x08   /* Tombol Backspace         */
#define KEY_RETURN     0x0d   /* Tombol Enter             */
#define KEY_TAB        0x09   /* Tombol Tab               */
#define KEY_SPACE      0x20   /* Tombol spasi             */

#define NULL           0x00   /* ASCII 0                  */
#define TRUE           1

UCHAR *getString(Screen *scr, UCHAR *str, UCHAR max);

int main(void)
{
Screen *layar = new Screen();
UCHAR str1[30];
UCHAR *str2;

layar->setMode(0x03);
layar->setAttribute(0x7C);//huruf warna merah latar putih
layar->setCursorPos(5, 9);
layar->writeString("Ketikan sebuah string:");
layar->setCursorPos(5, 32);

str2 = getString(layar, str1, 25);

layar->setCursorPos(6, 9);
layar->setAttribute(0x9);//huruf warna biru
layar->writeString("String yang Anda ketikan adalah");
layar->setCursorPos(6, 41);

layar->writeString(str1);

/* getKey */
asm mov ah, 0x00;
asm int KEY_INT;

delete layar; return EXIT_SUCCESS;
}

UCHAR *getString(Screen *scr, UCHAR *str, UCHAR max)
{
UCHAR key = 0;
UCHAR i, x, y;

i = 0;

while (TRUE)
{
asm mov ah, 0x00;
asm int KEY_INT;
asm mov key, al;

if ((key == KEY_BACKSPACE) && (i > 0))
{
scr->getCursorPos(&y, &x);
scr->setCursorPos(y, --x);
scr->writeChar(KEY_SPACE);

*(str + i) = NULL; i--;
}

if ((key >= 32) && (key <= 126) && (i < max))
{
scr->getCursorPos(&y, &x);
scr->writeChar(key);
scr->setCursorPos(y, ++x);

*(str + i) = key; i++;
}

if ((key == KEY_TAB) && (i < max))
{
scr->getCursorPos(&y, &x);
scr->writeChar(KEY_SPACE);
scr->setCursorPos(y, ++x);

*(str + i) = KEY_SPACE; i++;
}

if (key == KEY_RETURN)
{
*(str + i) = NULL;
break;
}

if (i == max) *(str + i) = NULL;
}

return str;
}





  Pada program contoh13.cpp, fungsi yang digunakan untuk memasukan string adalah
fungsi getString. Fungsi getString menerima tiga parameter, yaitu scr dengan tipe data Screen
yang dikirimkan secara referensi, str dengan tipe data unsigned character yang dikirimkan
secara referensi dan parameter max dengan tipe data unsigned character yang dikirimkan
secara nilai. Parameter scr digunakan untuk mengetahui posisi kursor dan memindahkan posisi
kursor pada mode layar yang digunakan serta menampilkan karakter yang diketikan melalui
keyboard. Parameter str adalah pointer karakter yang digunakan untuk menunjukan alamat
memori dimana karakter-karakter yang dimasukan melalui keyboard disimpan dalam memori.
Sedangkan parameter max digunakan untuk menentukan banyaknya karakter yang bisa
dimasukan.


Template by:

Free Blog Templates