Rabu, 29 Juni 2016

Pertemuan 7

A.    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.

contoh13.cpp:
#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 */ 35

 #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->setCursorPos(5, 9);
 layar->writeString("Ketikan sebuah string:");
 layar->setCursorPos(5, 32);

 str2 = getString(layar, str1, 25);

 layar->setCursorPos(6, 9);
 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.

B.     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.

contoh14
#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 */
 nama = getString(layar, nama2, 15);

 layar->setCursorPos(6, 9);
 layar->writeString("Password:");
 layar->setCursorPos(6, 19);

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

 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; 38


 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++;


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 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.



Tidak ada komentar:

Posting Komentar