A. Membuat Class untuk Operasi Layar pada Modus Teks
Setelah memahami cara menggunakan fungsi int86 atau teknik inline
assembly untuk melakukan operasi pada layar monitor, maka kita dapat
membuat sebuah class tersendiri untuk melakukan operasi pada layar monitor.
Class yang akan kita buat akan mengenkapsulasi fungsi-fungsi setMode, getMode,
writeChar, writeString, setCursorPos, getCursorPos dan getCharAttr. Namun, agar
class yang dibuat dalam proses eksekusi program (runtime) bekerja lebih
optimal maka semua fungsi anggota (method) yang pada pembahasan
sebelumnya dibuat menggunakan fungsi standar int86, kali ini akan ditulis ulang
menggunakan teknik inline assembly.
Dalam
pembuatan class dapat dilakukan tanpa membuat project terlebih dahulu, jadi
cukup dilakukan dengan memilih menu File kemudian pilih
submenu New lalu pilih Text Edit dari IDE
Borland C++ 5.02. Class yang akan dibuat bernama Screen dan simpan kode program
berikut ini dengan nama screen.cpp.
screen.cpp:
/*
screen.cpp
Class library untuk operasi layar monitor.
Hak Cipta Pebi Yudha K.
April 2009
Disusun sebagai contoh program
Modul Praktikum Pemrograman C++ Lanjutan
AMIK BSI - Jakarta
*/
#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
screen.cpp
Class library untuk operasi layar monitor.
Hak Cipta Pebi Yudha K.
April 2009
Disusun sebagai contoh program
Modul Praktikum Pemrograman C++ Lanjutan
AMIK BSI - Jakarta
*/
#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;
}
// 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;
}
Kode program screen.cpp diatas bukanlah suatu program untuk dikompilasi dan
dijalankan, namun sebuah pustaka class (class library) yang fungsinya
hampir sama dengan penggunaan file header (.h). Pada kode program screen.cpp
terdapat beberapa fungsi anggota dari class Screen yang sebelumnya tidak
dibahas, yaitu setAttribute, setActivePage, getActivePage, setVisualPage,
getVisualPage dan cls.
Fungsi anggota setAttribute digunakan untuk menentukan warna
huruf dan warna latar (background color). Fungsi ini mengirimkan
parameter bertipe unsigned character yang menunjukan warna huruf dan latar yang
akan ditampilkan. Sedangkan untuk menentukan halaman halaman aktif digunakan fungsi
setActivePage. Apa maksudnya halaman aktif? Halaman aktif adalah halaman memori
video dimana proses operasi pada layar dilakukan, seperti memindahkan posisi
kursor, menampilkan karakter, membersihkan layar dan sebagainya.
Pada mode layar teks 80 baris 25 kolom terdapat delapan halaman
memori video (halaman layar), yaitu halaman 0 sampai dengan halaman 7. Fungsi
setActivePage digunakan untuk memilih nomor halaman tersebut dengan cara
mengirimkan angka 0, 1, 2 sampai dengan 7 sebagai parameter. Umumnya pada saat
pertama kali dijalankan program akan menggunakan halaman layar pertama (halaman
0) sebagai halaman visual (halaman dimana output program ditampilkan). Untuk
mengetahui nomor halaman aktif digunakan fungsi anggota getActivePage yang
mengembalikan nomor halaman aktif yang sedang digunakan.
Selain fungsi setActivePage dan getActivePage untuk menangani
nomor halaman layar, class Screen juga memiliki fungsi anggota untuk mengatur
halaman visual. Apa maksudnya halaman visual? Halaman visual adalah nomor
halaman dimana output program ditampilkan dan dapat terlihat oleh pengguna.
Lalu apakah perbedaan antara halaman aktif dengan halaman visual? Suatu program
dapat saja menyembunyikan proses penampilan output dengan cara menuliskan
karakter-karakter pada halaman layar pertama (halaman 0) tetapi halaman visual
yang ditampilkan adalah halaman kedua (halaman 1). Karakter-karakter 28
yang
dituliskan pada halaman 0 tersebut tidak akan benar-benar muncul dilayar
monitor sampai pengguna memrogram untuk memilih halaman 0 sebagai halaman
visual. Jika tidak, maka halaman 1 tetap akan ditampilkan walaupun halaman 1
kosong. Untuk memilih halaman visual digunakan fungsi setVisualPage dan untuk
mengetahui nomor halaman yang sedang dijadikan halaman visual digunakan fungsi
getVisualPage.
0 komentar:
Posting Komentar