Senin, 01 Mei 2017

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
1:  /*  
2:  screen.cpp  
3:  Class library untuk operasi layar monitor.  
4:  Hak Cipta Pebi Yudha K.  
5:  April 2009  
6:    
7:  Disusun sebagai contoh program  
8:  Modul Praktikum Pemrograman C++ Lanjutan  
9:  AMIK BSI - Jakarta  
10:  */  
11:    
12:  #define UCHAR unsigned char  
13:  #define VIDEO_INT 0x10  
14:    
15:  class Screen  
16:  {  
17:       private:  
18:       UCHAR mode, row, col;  
19:       UCHAR rownum, colnum;  
20:       UCHAR active_page, visual_page;  
21:       UCHAR attribute;  
22:    
23:       public:  
24:       Screen(void); // Konstruktor default  
25:       Screen(UCHAR mode);  
26:    
27:       ~Screen(void); // Destruktor default  
28:    
29:       void setMode(UCHAR mode);  
30:       UCHAR getMode(void);  
31:    
32:       void setCursorPos(UCHAR y, UCHAR x);  
33:       void getCursorPos(UCHAR *y, UCHAR *x);  
34:    
35:       void writeChar(UCHAR letter);  
36:       void writeString(UCHAR *str);  
37:    
38:       void setAttribute(UCHAR attr);  
39:       UCHAR getCharAttr(UCHAR *attr);  
40:    
41:       void setActivePage(UCHAR page);  
42:       UCHAR getActivePage(void);  
43:    
44:       void setVisualPage(UCHAR page);  
45:       UCHAR getVisualPage(void);  
46:    
47:       void cls(void);  
48:  }; // Akhir prototype class Screen  
49:    
50:  Screen::Screen(void) // Konstruktor default.  
51:  { // Menset layar pada  
52:       UCHAR mode; // mode 25 baris dan  
53:       // 80 kolom, warna huruf  
54:       this->row = 0; // abu-abu dan latar  
55:       this->col = 0; // hitam, 16 warna.  
56:    
57:       this->mode = mode = 0x03;  
58:    
59:       this->rownum = 25;  
60:       this->colnum = 80;  
61:    
62:       this->active_page = 0;  
63:       this->visual_page = 0;  
64:    
65:       this->attribute = 7;  
66:    
67:       asm mov ah, 0x00;  
68:       asm mov al, mode;  
69:       asm or al, 0x80;  
70:       asm int VIDEO_INT;  
71:    
72:       return;  
73:  }  
74:    
75:  Screen::Screen(UCHAR mode) // Konstruktur  
76:  { // dengan  
77:       this->setMode(mode); // parameter mode  
78:       // layar.  
79:       return;  
80:  }  
81:    
82:  Screen::~Screen(void) // Destruktor default.  
83:  { // Tidak melakukan  
84:       return; // apapun.  
85:  }  
86:    
87:  void Screen::setMode(UCHAR mode) // Memilih  
88:  { // mode  
89:       this->mode = mode; // layar.  
90:    
91:       this->active_page = 0;  
92:       this->visual_page = 0;  
93:    
94:       this->rownum = 25;  
95:    
96:       switch (mode) // Menentukan banyak kolom  
97:       { // berdasarkan nomor mode.  
98:            case 0x00 :  
99:            case 0x01 : this->colnum = 40;  
100:            break;  
101:            case 0x02 :  
102:            case 0x03 :  
103:            case 0x07 : this->colnum = 80;  
104:            break;  
105:    
106:            default : this->colnum = 0;  
107:            break;  
108:       }  
109:    
110:       asm mov ah, 0x00;  
111:       asm mov al, mode;  
112:       asm or al, 0x80;  
113:       asm int VIDEO_INT;  
114:    
115:       return;  
116:  }  
117:    
118:  UCHAR Screen::getMode(void) // Mengetahui  
119:  { // mode layar.  
120:       return this->mode;  
121:  }  
122:    
123:  void Screen::setCursorPos(UCHAR y, UCHAR x)  
124:  {  
125:       UCHAR page = this->active_page;  
126:    
127:       if ((y > this->rownum) || (x > this->colnum))  
128:         y = x = 0;  
129:    
130:       this->row = y; // Menentukan posisi  
131:       this->col = x; // kursor.  
132:    
133:       asm mov ah, 0x02;  
134:       asm mov bh, page;  
135:       asm mov dh, y;  
136:       asm mov dl, x;  
137:       asm int VIDEO_INT;  
138:    
139:       return;  
140:  }  
141:    
142:  void Screen::getCursorPos(UCHAR *y, UCHAR *x)  
143:  {  
144:       *y = this->row; // Mengetahui posisi  
145:       *x = this->col; // kursor.  
146:    
147:       return;  
148:  }  
149:    
150:  void Screen::writeChar(UCHAR letter)  
151:  {  
152:       UCHAR page = this->active_page;  
153:       UCHAR attr = this->attribute;  
154:    
155:       asm mov ah, 0x09; // Menuliskan satu  
156:       asm mov al, letter; // karakter dan  
157:       asm mov bh, page; // atributnya  
158:       asm mov bl, attr;  
159:       asm mov ch, 0x00;  
160:       asm mov cl, 0x01;  
161:       asm int VIDEO_INT;  
162:    
163:       return;  
164:  }  
165:    
166:  void Screen::writeString(UCHAR *str)  
167:  {  
168:       for (; *str != '\0'; str++)  
169:       {  
170:            if (this->col > this->colnum)  
171:            {  
172:                 this->row++; // Mencetak rangkaian  
173:                 this->col = 0; // karakter (string).  
174:            }  
175:    
176:            this->setCursorPos(this->row,  
177:            ++this->col);  
178:            this->writeChar(*str);  
179:       }  
180:    
181:       return;  
182:  }  
183:    
184:  void Screen::setAttribute(UCHAR attr)  
185:  {  
186:       this->attribute = attr; // Mengubah warna  
187:       // huruf dan warna  
188:       return; // latar.  
189:  }  
190:    
191:  UCHAR Screen::getCharAttr(UCHAR *attr)  
192:  {  
193:       UCHAR page = this->active_page;  
194:       UCHAR letter, attribute;  
195:    
196:       asm mov ah, 0x08; // Mengetahui  
197:       asm mov bh, page; // karakter dan  
198:       asm int VIDEO_INT; // atributnya pada  
199:       asm mov attribute, ah; // posisi kursor.  
200:       asm mov letter, al;  
201:    
202:       this->attribute = *attr = attribute;  
203:    
204:       return letter;  
205:  }  
206:    
207:  void Screen::setActivePage(UCHAR page)  
208:  {  
209:       this->active_page = page; // Menentukan  
210:       // halaman aktif.  
211:       return;  
212:  }  
213:    
214:  UCHAR Screen::getActivePage(void)  
215:  { // Mengetahui  
216:       return this->active_page; // halaman aktif.  
217:  }  
218:    
219:  void Screen::setVisualPage(UCHAR page)  
220:  {  
221:       if (page > 7) page = 0;  
222:    
223:       this->visual_page = page;  
224:    
225:       asm mov ah, 0x05; // Menentukan halaman  
226:       asm mov al, page; // yang ditampilkan.  
227:       asm int VIDEO_INT;  
228:    
229:       return;  
230:  }  
231:    
232:  UCHAR Screen::getVisualPage(void)  
233:  { // Mengetahui  
234:       return this->visual_page; // halaman yang  
235:  } // ditampilkan.  
236:    
237:  void Screen::cls(void)  
238:  { // Membersihkan  
239:       UCHAR mode = this->mode; // tampilan layar  
240:       // serta  
241:       this->row = 0; // memposisikan  
242:       this->col = 0; // kursor di 0, 0.  
243:    
244:       asm mov ah, 0x00;  
245:       asm mov al, mode;  
246:       asm int VIDEO_INT;  
247:    
248:       return;  
249:  }  

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

Kegunaan fungsi anggota cls sendiri dapat diketahui dari namanya, yaitu untuk membersihkan tampilan layar (clear screen) dan memposisikan kursor pada baris 0 kolom 0 (baris pertama kolom pertama). Project contoh10.ide berikut ini adalah demonstrasi penggunaan pustaka screen.cpp. Maksud dari programnya adalah untuk memberikan contoh penggunaan fungsi anggota setActivePage dan setVisualPage yang merupakan fungsi anggota dari objek Screen. Agar project contoh10.ide ini berjalan maka salinlah file screen.cpp dalam direktori yang sama tempat Anda menyimpan project.

contoh10.cpp
1:  #include <dos.h>  
2:  #include <stdlib.h>  
3:  #include "screen.cpp" // Header screen.cpp  
4:    
5:  int main(void)  
6:  {  
7:       UCHAR i, j;  
8:       Screen *layar = new Screen();  
9:    
10:       layar->setAttribute(0x9f);  
11:       layar->setActivePage(0);  
12:       layar->writeString("YOHANA BASUKI");  
13:       layar->setAttribute(0xcf);  
14:       layar->setActivePage(1);  
15:       layar->writeString("TEKNIK KOMPUTER");  
16:    
17:       for (i = 1; i < 11; i++)  
18:       {  
19:            j = i % 2;  
20:            layar->setVisualPage(j);  
21:            delay(3000);  
22:       }  
23:    
24:       delete layar;  
25:       return EXIT_SUCCESS;  
26:  }  

Hasil:



Tidak ada komentar:

Posting Komentar