Rabu, 22 Juni 2016

pertemuan 7

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). 
berikut ini akan  contoh bagaimana menerapkan ide tersebut menggunakan teknik inline assembly. 
Project ini akan menggunakan pustaka class screen.cpp 
kode program screen.cpp
#define UCHAR unsigned char
#define VIDEO_INT 0x10

class Screen
{
private:
UCHAR mode, row, col;
UCHAR rownum, colnum;
UCHAR active_page, visual_page;
UCHAR attribute;

public:
Screen(void); // Konstruktor default
Screen(UCHAR mode);

~Screen(void); // Destruktor default

void setMode(UCHAR mode);
UCHAR getMode(void);

void setCursorPos(UCHAR y, UCHAR x);
void getCursorPos(UCHAR *y, UCHAR *x);

void writeChar(UCHAR letter);
void writeString(UCHAR *str);

void setAttribute(UCHAR attr);
UCHAR getCharAttr(UCHAR *attr);

void setActivePage(UCHAR page);
UCHAR getActivePage(void);

void setVisualPage(UCHAR page);
UCHAR getVisualPage(void);

void cls(void);
}; // Akhir prototype class Screen

Screen::Screen(void) // Konstruktor default.
{ // Menset layar pada
UCHAR mode; // mode 25 baris dan
// 80 kolom, warna huruf
this->row = 0; // abu-abu dan latar
this->col = 0; // hitam, 16 warna.

this->mode = mode = 0x03;

this->rownum = 25;
this->colnum = 80;

this->active_page = 0;
this->visual_page = 0;

this->attribute = 7;

asm mov ah, 0x00;
asm mov al, mode;
asm or al, 0x80;
asm int VIDEO_INT;

return;
}
Screen::Screen(UCHAR mode) // Konstruktur
{ // dengan
this->setMode(mode); // parameter mode
// layar.
return;
}

Screen::~Screen(void) // Destruktor default.
{ // Tidak melakukan
return; // apapun.
}

void Screen::setMode(UCHAR mode) // Memilih
{ // mode
this->mode = mode; // layar.

this->active_page = 0;
this->visual_page = 0;

this->rownum = 25;

switch (mode) // Menentukan banyak kolom
{ // berdasarkan nomor mode.
case 0x00 :
case 0x01 : this->colnum = 40;
break;
case 0x02 :
case 0x03 :
case 0x07 : this->colnum = 80;
break;

default : this->colnum = 0;
break;
}

asm mov ah, 0x00;
asm mov al, mode;
asm or al, 0x80;
asm int VIDEO_INT;

return;
}

UCHAR Screen::getMode(void) // Mengetahui
{ // mode layar.
return this->mode;
}

void Screen::setCursorPos(UCHAR y, UCHAR x)
{
UCHAR page = this->active_page;

if ((y > this->rownum) ||
(x > this->colnum))
y = x = 0;

this->row = y; // Menentukan posisi
this->col = x; // kursor.

asm mov ah, 0x02;
asm mov bh, page;
asm mov dh, y;
asm mov dl, x;
asm int VIDEO_INT;

return;
}

void Screen::getCursorPos(UCHAR *y, UCHAR *x)
{
*y = this->row; // Mengetahui posisi
*x = this->col; // kursor.

return;
}

void Screen::writeChar(UCHAR letter)
{
UCHAR page = this->active_page;
UCHAR attr = this->attribute;

asm mov ah, 0x09; // Menuliskan satu
asm mov al, letter; // karakter dan
asm mov bh, page; // atributnya
asm mov bl, attr;
asm mov ch, 0x00;
asm mov cl, 0x01;
asm int VIDEO_INT;

return;
}

void Screen::writeString(UCHAR *str)
{
for (; *str != '\0'; str++)
{
if (this->col > this->colnum)
{
this->row++; // Mencetak rangkaian
this->col = 0; // karakter (string).
}

this->setCursorPos(this->row,
++this->col);
this->writeChar(*str);
}

return;
}

void Screen::setAttribute(UCHAR attr)
{
this->attribute = attr; // Mengubah warna
// huruf dan warna
return; // latar.
}

UCHAR Screen::getCharAttr(UCHAR *attr)
{
UCHAR page = this->active_page;
UCHAR letter, attribute;

asm mov ah, 0x08; // Mengetahui
asm mov bh, page; // karakter dan
asm int VIDEO_INT; // atributnya pada
asm mov attribute, ah; // posisi kursor.
asm mov letter, al;

this->attribute = *attr = attribute;

return letter;
}

void Screen::setActivePage(UCHAR page)
{
this->active_page = page; // Menentukan
// halaman aktif.
return;
}

UCHAR Screen::getActivePage(void)
{ // Mengetahui
return this->active_page; // halaman aktif.
}

void Screen::setVisualPage(UCHAR page)
{
if (page > 7) page = 0;

this->visual_page = page;

asm mov ah, 0x05; // Menentukan halaman
asm mov al, page; // yang ditampilkan.
asm int VIDEO_INT;

return;
}

UCHAR Screen::getVisualPage(void)
{ // Mengetahui
return this->visual_page; // halaman yang
} // ditampilkan.

void Screen::cls(void)
{ // Membersihkan
UCHAR mode = this->mode; // tampilan layar
// serta
this->row = 0; // memposisikan
this->col = 0; // kursor di 0, 0.

asm mov ah, 0x00;
asm mov al, mode;
asm int VIDEO_INT;

return;
}
 dan berikut kode program contoh projectnya:
#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->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;
}
berikut hasil outputnya :
 Pada program contoh diatas, 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.
 membuat  string berupa 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 contoh ini pada direktori yang sama dengan file screen.cpp.
 

kode program :
#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;

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

hasil outputnya adalah :

Fungsi getPwdString pada program contoh.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.
 

0 komentar:

Posting Komentar

http://www.resepkuekeringku.com/2014/11/resep-donat-empuk-ala-dunkin-donut.html http://www.resepkuekeringku.com/2015/03/resep-kue-cubit-coklat-enak-dan-sederhana.html http://www.resepkuekeringku.com/2014/10/resep-donat-kentang-empuk-lembut-dan-enak.html http://www.resepkuekeringku.com/2014/07/resep-es-krim-goreng-coklat-kriuk-mudah-dan-sederhana-dengan-saus-strawberry.html http://www.resepkuekeringku.com/2014/06/resep-kue-es-krim-goreng-enak-dan-mudah.html http://www.resepkuekeringku.com/2014/09/resep-bolu-karamel-panggang-sarang-semut-lembut.html