Rabu, 26 April 2017

CONTOH 10.CPP

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.
     Untuk menjalankan Contoh 10.cpp yang harus dilakukan pertama kali masukan codingan screen.cpp yaitu dengan buka borland file→new→text edit,tidak usah di running,langsung di save saja ke folder BIN di local disk C. Setelah itu lalu masukan coding Contoh 10.cpp dengan cara file→new→project

Contoh 10.cpp:

#include <dos.h>
 #include <stdlib.h>
 #include "screen.cpp" // Header screen.cpp

 int main(void)
 {
 UCHAR i, j;
 Screen *layar = new Screen();

 layar->setAttribute(0x2f);//huruf putih latar hijau
 layar->setActivePage(1);
 layar->writeString("DODY FAIZAL");
 layar->setAttribute(0xe5);//huruf ungu latar kuning
 layar->setActivePage(0);
 layar->writeString("TEKNIK KOMPUTER");

 for (i = 1; i < 11; i++)
 {
 j = i % 2;
 layar->setVisualPage(j);
 delay(3000);
 }
delete layar;
 return EXIT_SUCCESS;
 }









Ketika program diatas dijalankan maka muncul tulisan “DODY FAIZAL” dan “TEKNIK KOMPUTER” secara bergantian dengan jeda waktu selama tiga detik. Tulisan ”DODY FAIZAL” ditampilkan pada halaman 1 sedangkan “TEKNIK KOMPUTER” pada halaman 1.

CONTOH SCREEN.CPP

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

            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.


CONTOH 09.CPP

B. ASCII Extended Character Set
ASCII Extended Character Set (set karakter ASCII perluasan) adalah karakter ASCII dengan kode atau nomor urut 128 sampai dengan 255 desimal. Umumnya set karakter perluasan ini digunakan agar tampilan program yang berbasis teks menjadi lebih menarik karena dapat digunakan untuk menampilkan bingkai, tabel, simbol-simbol khusus dalam aksara Yunani (seperti alphabetagamma dan seterusnya) dan simbol-simbol khusus matematika (seperti integral, akar kuadrat dan pangkat dua). Gambar-gambar berikut ini menampilkan nomor urut serta karakter ASCII reguler dan perluasan.
Berikut ini adalah contoh program yang sangat sederhana untuk membuat sebuah bingkai. Program ini akan menggunakan fungsi writeChar, writeString, setCursorPos yang telah dibuat pada program sebelumnya.

Contoh 09.cpp:

#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>

#define VIDEO_INT 0x10
#define UCHAR unsigned char

void setMode(UCHAR mode);
void getCursorPos(UCHAR *y, UCHAR *x);
void setCursorPos(UCHAR y, UCHAR x);
void writeChar(UCHAR letter, UCHAR attr);
void writeString(UCHAR *str, UCHAR attr);

int main(void)
{
UCHAR baris, kolom;
UCHAR pilih;

setMode(3);
setCursorPos(4, 4); writeChar(213, 0x17);
setCursorPos(4, 74); writeChar(184, 0x17);
setCursorPos(20, 4); writeChar(192, 0x17);
setCursorPos(20, 74); writeChar(217, 0x17);

for (baris = 5; baris < 20; baris++)
{
setCursorPos(baris, 4); writeChar(179, 0x17);
setCursorPos(baris, 74); writeChar(179, 0x17);
}

for (kolom = 5; kolom < 74; kolom++)
{
setCursorPos(4, kolom); writeChar(205, 0x17);
setCursorPos(20, kolom); writeChar(196, 0x17);
}

setCursorPos(4, 5); writeChar(181, 0x17);
setCursorPos(4, 6);
writeString("TEKOM BSI PEMUDA", 0x1e);//warna kuning
setCursorPos(4, 22); writeChar(198, 0x17);

for (baris = 5; baris < 20; baris++)
{
for (kolom = 5; kolom < 74; kolom++)
{
setCursorPos(baris, kolom);
writeChar(0x20, 0x1e);
}
}

setCursorPos(12, 25);
writeString("Akhiri program (Y/T)? [ ]", 0x1f); //warna putih

for (;;)
{
setCursorPos(12, 49);
pilih = getch();

writeChar(pilih, 0x1e);

if ((pilih == 'Y') || (pilih == 'y'))
break;
}

return EXIT_SUCCESS;
}

void setMode(UCHAR mode) // Mengubah mode
{ // tampilan layar
asm mov ah, 0x00; // Register AH = 0
asm mov al, mode; // Register AL = mode
asm int VIDEO_INT // Lakukan interupsi

return;
}

void getCursorPos(UCHAR *y, UCHAR *x) // Baca posisi
{ // kursor
UCHAR row, col;

asm mov ah, 0x03; // Register AH = 3 heksadesimal
asm mov bh, 0x00; // Register BH = 0 heksadesimal
asm int VIDEO_INT; // Lakukan interupsi
asm mov row, dh; // Salin register DH ke row
asm mov col, dl; // Salin register DL ke col

*y = row; *x = col; // Salin row ke y, col ke x

return;
}

void setCursorPos(UCHAR y, UCHAR x) // Memindahkan
{ // Posisi kursor
asm mov ah, 0x02; // Register AH = 3 heksadesimal
asm mov bh, 0x00; // Register BH = 0 heksadesimal
asm mov dh, y; // Register DH = letak baris
asm mov dl, x; // Register DL = letak kolom
asm int VIDEO_INT; // Lakukan interupsi

return;
}

void writeChar(UCHAR letter, UCHAR attr) // Mencetak
{ // huruf
asm mov ah, 0x09; // Register AH = 9 heksadesimal
asm mov al, letter; // Register AL = hurufnya
asm mov bh, 0x00; // Register BH = 0 heksadesimal
asm mov bl, attr; // Register BL = warna huruf
asm mov ch, 0x00; // Register CH dan CL menentukan
asm mov cl, 0x01; // banyak pencetakan
asm int VIDEO_INT; // Lakukan interupsi

return;
}

void writeString(UCHAR *str, UCHAR attr) // Mencetak
{ // string
UCHAR x, y;

getCursorPos(&y, &x); // Simpan posisi kursor

for (; *str != '\0'; str++) // Loop sampai ditemukan
{ // NULL
if (x > 79)
{ // Jika sudah sampai kolom
y++; x = 0; // ke-80, pindah baris dan
} // pindah ke kolom ke-1

setCursorPos(y, x++); // Pindahkan posisi kursor
writeChar(*str, attr); // Cetak per karakter
}

return;
}





CONTOH 08.CPP

A. Membaca Karakter pada Posisi Kursor

Pada sub bab sebelumnya sudah dipelajari bagaimana cara menampilkan karakter dan string pada posisi kursor tertentu di layar. Pada sub bab ini akan dipelajari cara mengetahui nilai karakter dan warna karakter yang sudah tercetak dilayar. Seperti telah kita ketahui sebelumnya bahwa layar monitor pada mode teks normal terdiri dari suatu baris dan kolom. Dengan mengarahkan kursor pada baris dan kolom tertentu, dapat kita ketahui karakter/huruf yang tercetak dan warna dari karakter/huruf tersebut.
Nomor interupsi yang digunakan untuk mengetahui karakter dan warna karakter pada posisi tertentu adalah interupsi 10 heksadesimal servis 8 heksadesimal. Berikut ini adalah prosedur untuk menjalankan interupsi tersebut:
: Register AH harus bernilai 8 heksadesimal.
: Register BH berisi nomor halaman tampilan, halaman pertama nilainya 0.

Setelah interupsi dijalankan maka register AH akan berisi nilai warna dari karakter dan register AL akan berisi karakter/huruf yang ditampilkan. Berikut ini adalah contoh sederhana untuk membaca karakter pada posisi tertentu dilayar. Untuk menyederhanakan kode program, contoh berikut akan menggunakan fungsi standar gotoxy, textcolor, textbackground, cprintf dan int86. Simpan contoh program berikut ini dengan nama project contoh08.ide dan file kode program contoh08.cpp.

Contoh 08.cpp:

#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>

#define VIDEO_INT 0x10 // Nomor interupsi video
#define UCHAR unsigned char // Tipe data UCHAR

UCHAR getCharAttr(UCHAR *attr);

int main(void)
{
UCHAR huruf, warna;

clrscr(); // Bersihkan layar
gotoxy(10, 5); textcolor(25); // Warna karakter biru
textbackground(10); // Warna dasar karakter hijau
cprintf(" DODY FAIZAL "); // Cetak string
gotoxy(13, 5); // Pindah posisi kursor

huruf = getCharAttr(&warna); // Baca nilai karakter
// dan atributnya
gotoxy(1, 7);
printf("Karakter pada baris 5 kolom 13: %c\n", huruf);
printf("Warna\\atribut dari karakter : %#x\n", warna);
getch();

return EXIT_SUCCESS;
}

UCHAR getCharAttr(UCHAR *attr) // Fungsi untuk membaca
{ // karakter dan atributnya
union REGS in, out; // pada posisi kursor

in.h.ah = 0x08; // AH = 8 heksadesimal
in.h.bh = 0x00; // BH = 0, halaman layar
int86(VIDEO_INT, &in, &out); // Lakukan interupsi

*attr = out.h.ah; // Salin nilai AH di attr

return out.h.al; // Kembalikan nilai AL
}


Pada program diatas, fungsi yang dibuat untuk membaca karakter dan warna atributnya adalah fungsi getCharAttr. Fungsi ini mengirimkan parameter dengan tipe data unsigned character secara acuan. Setelah fungsi tersebut dijalankan, parameter attr berisi nilai warna atribut dari karakter sedangkan fungsi getCharAttr sendiri mengembalikan nilai karakter yang dibaca.


CONTOH 07.CPP

Fungsi writeChar digunakan untuk menampilkan karakter, fungsi ini mengirimkan parameter letter dan attr secara nilai. Parameter letter berisi karakter yang akan ditampilkan sedangkan parameter attr menentukan atribut karakter (warna karakter dan warna dasar). Fungsi ini tidak mengubah posisi kursor, oleh karena itu sesudah pemanggilan fungsi, untuk memindahkan posisi kursor digunakan fungsi setCursorPos.

Contoh 07.cpp:

#include <conio.h>
#include <dos.h>
#include <stdlib.h>

#define VIDEO_INT 0x10
#define UCHAR unsigned char

void getCursorPos(UCHAR *y, UCHAR *x);
void setCursorPos(UCHAR y, UCHAR x);
void writeChar(UCHAR letter, UCHAR attr);
void writeString(UCHAR *str, UCHAR attr);

int main(void)
{
UCHAR baris, kolom;

getCursorPos(&baris, &kolom); // Baca posisi kursor
writeChar('>', 0x1f); // Cetak karakter >
setCursorPos(baris, ++kolom); // Pindahkan kursor

writeString(" DODY FAIZAL ", 0x9f); //Warna Dasar Biru
getCursorPos(&baris, &kolom);
setCursorPos(baris, ++kolom);

writeChar('<', 0x1f); // Cetak karakter <
setCursorPos(baris, ++kolom); // Pindahkan kursor
getch();

return EXIT_SUCCESS;
}

void getCursorPos(UCHAR *y, UCHAR *x) // Baca posisi
{ // kursor
UCHAR row, col;

asm mov ah, 0x03; // Register AH = 3 heksadesimal
asm mov bh, 0x00; // Register BH = 0 heksadesimal
asm int VIDEO_INT; // Lakukan interupsi
asm mov row, dh; // Salin register DH ke row
asm mov col, dl; // Salin register DL ke col

*y = row; *x = col; // Salin row ke y, col ke x

return;
}

void setCursorPos(UCHAR y, UCHAR x) // Memindahkan
{ // Posisi kursor
asm mov ah, 0x02; // Register AH = 3 heksadesimal
asm mov bh, 0x00; // Register BH = 0 heksadesimal
asm mov dh, y; // Register DH = letak baris
asm mov dl, x; // Register DL = letak kolom
asm int VIDEO_INT; // Lakukan interupsi

return;
}

void writeChar(UCHAR letter, UCHAR attr) // Mencetak
{ // huruf
asm mov ah, 0x09; // Register AH = 9 heksadesimal
asm mov al, letter; // Register AL = hurufnya
asm mov bh, 0x00; // Register BH = 0 heksadesimal
asm mov bl, attr; // Register BL = warna huruf
asm mov ch, 0x00; // Register CH dan CL menentukan
asm mov cl, 0x01; // banyak pencetakan
asm int VIDEO_INT; // Lakukan interupsi

return;
}

void writeString(UCHAR *str, UCHAR attr) // Mencetak
{ // string
UCHAR x, y;

getCursorPos(&y, &x); // Simpan posisi kursor

for (; *str != '\0'; str++) // Loop sampai ditemukan
{ // NULL
if (x > 79)
{ // Jika sudah sampai kolom
y++; x = 0; // ke-80, pindah baris dan
} // pindah ke kolom ke-1

setCursorPos(y, x++); // Pindahkan posisi kursor
writeChar(*str, attr); // Cetak per karakter
}

return;
}


Program contoh07.cpp merupakan pengembangan dari program contoh06.cpp. Pada
program contoh07.cpp terdapat fungsi writeString, fungsi ini menggunakan parameter str dan
attr. Parameter str dikirimkan secara acuan dan berisi rangkaian karakter (string) yang akan
dicetak. Sedangkan parameter attr dikirimkan secara nilai untuk menentukan warna string saat
ditampilkan. Fungsi writeString memanggil fungsi writeChar untuk mencetak rangkaian
karakternya satu per satu.


CONTOH 06.CPP

A. Menampilkan Karakter dan Memindahkan Posisi Kursor

Program contoh01.cpp dan dan contoh02.cpp pada bab 1 merupakan contoh program untuk menampilkan karakter/huruf pada layar monitor. Pada sub bab ini akan dibahas cara menampilkan karakter menggunakan interupsi 10 heksadesimal servis 09 heksadesimal secara lebih mendalam. Untuk lebih jelasnya, berikut ini adalah prosedur untuk menjalankan interupsi 10 heksadesimal servis 09 heksadesimal:
Register AH berisi nilai 9 heksadesimal.
: Register AL berisi kode ASCII dari huruf/karakter yang akan dicetak.
: Register BH berisi halaman layar, halaman pertama nilainya 0.
: Register BL berisi nilai warna huruf/karakter (warna asal adalah 7).
: Register CH dan CL menentukan banyaknya karakter pada AL akan dicetak.

Jika cuma 1 huruf, maka CH = 0 dan CL = 1.
Permasalahan mencetak karakter menggunakan interupsi 10 heksadesimal servis 09 heksadesimal adalah setelah karakter ditampilkan dilayar, posisi kursor tidak berpindah ke kolom berikutnya. Akibatnya adalah ketika karakter berikutnya akan ditampilkan maka karakter yang sebelumnya akan tertimpa dengan karakter yang baru. Solusi untuk mengatasi permasalahan ini adalah sebelum karakter ditampilkan kita harus mengetahui posisi kursor, kemudian mencetak karakter tersebut dan mengubah posisi kursor setelah karakter dicetak. Untuk melakukan hal tersebut maka kita harus tahu cara mengetahui posisi kursor dan cara memindahkan posisi kursor.

Untuk mengetahui posisi kursor dapat menggunakan interupsi 10 heksadesimal servis 03 heksadesimal. Berikut ini adalah prosedur untuk menjalakan interupsi 10 heksadesimal servis 03 heksadesimal:

: Register AH harus bernilai 3 heksadesimal.
: Register BH berisi nomor halaman tampilan, halaman pertama nilainya 0.

Setelah interupsi dilakukan maka register DH berisi nomor baris dan register DL berisi nomor kolom. Sedangkan untuk memindahkan posisi kursor adalah dengan menggunakan interupsi 10 heksadesimal servis 02 heksadesimal. Berikut ini adalah prosedurnya:

: Register AH harus bernilai 2 heksadesimal.
: Register BH berisi nomor halaman tampilan, halaman pertama nilainya 0.
: Register DH berisi nomor baris (dimulai dari 0 sampai 24).
: Register DL berisi nomor kolom (dimulai dari 0 sampai batas akhir dikurangi 1).

Berikut ini adalah contoh program untuk menampilkan huruf D,O,D dan Y dengan warna dasar biru dan warna huruf putih. Simpan project berikut ini dengan nama file contoh06.ide dan nama file kode program.
Contoh 06.cpp:

#include <conio.h>
#include <dos.h>
#include <stdlib.h>

#define VIDEO_INT 0x10
#define UCHAR unsigned char

void getCursorPos(UCHAR *y, UCHAR *x);
void setCursorPos(UCHAR y, UCHAR x);
void writeChar(UCHAR letter, UCHAR attr);

int main(void)
{
UCHAR baris, kolom;

getCursorPos(&baris, &kolom); // Baca posisi kursur
writeChar('D', 0x1f); // Cetak huruf D
setCursorPos(baris, ++kolom); // Pindahkan kursor
writeChar('O', 0x1f); // Cetak huruf O
setCursorPos(baris, ++kolom); // Pindahkan kursor
writeChar('D', 0x1f); // Cetak huruf D
setCursorPos(baris, ++kolom); // Pindahkan kursor
writeChar('Y', 0x1f); // Cetak huruf Y
setCursorPos(baris, ++kolom); // Pindahkan kursor
getch();

return EXIT_SUCCESS;
}

void getCursorPos(UCHAR *y, UCHAR *x) // Baca posisi
{ // kursor
UCHAR row, col;

asm mov ah, 0x03; // Register AH = 3 heksadesimal
asm mov bh, 0x00; // Register BH = 0 heksadesimal
asm int VIDEO_INT; // Lakukan interupsi
asm mov row, dh; // Salin register DH ke row
asm mov col, dl; // Salin register DL ke col

*y = row; *x = col; // Salin row ke y, col ke x

return;
}

void setCursorPos(UCHAR y, UCHAR x) // Memindahkan
{ // Posisi kursor
asm mov ah, 0x02; // Register AH = 3 heksadesimal
asm mov bh, 0x00; // Register BH = 0 heksadesimal
asm mov dh, y; // Register DH = letak baris
asm mov dl, x; // Register DL = letak kolom
asm int VIDEO_INT; // Lakukan interupsi

return;
}

void writeChar(UCHAR letter, UCHAR attr) // Mencetak
{ // huruf
asm mov ah, 0x09; // Register AH = 9 heksadesimal
asm mov al, letter; // Register AL = hurufnya
asm mov bh, 0x00; // Register BH = 0 heksadesimal
asm mov bl, attr; // Register BL = warna huruf biru
asm mov ch, 0x00; // Register CH dan CL menentukan
asm mov cl, 0x01; // banyak pencetakan
asm int VIDEO_INT; // Lakukan interupsi

return;
}


Program diatas terdiri dari empat fungsi, yaitu fungsi main, getCursorPos, setCursorPos dan writeChar. Fungsi getCursorPos berguna untuk mengetahui posisi kursor, fungsi ini mengirimkan parameter y dan x secara acuan. Setelah pemanggilan fungsi, parameter x menyimpan posisi kolom kursor sedangkan parameter y menyimpan posisi baris kursor. Fungsi setCursorPos digunakan untuk memindahkan posisi kursor, fungsi ini mengirimkan parameter y dan x secara nilai. Parameter y digunakan untuk menentukan posisi baris sedangkan parameter x untuk menentukan posisi kolom kursor. Fungsi getCursorPos hampir mirip dengan fungsi wherex dan wherey milik Borland C++ atau Turbo Pascal, sedangkan fungsi setCursorPos hampir mirip dengan fungsi gotoxy.
Fungsi writeChar digunakan untuk menampilkan karakter, fungsi ini mengirimkan parameter letter dan attr secara nilai. Parameter letter berisi karakter yang akan ditampilkan sedangkan parameter attr menentukan atribut karakter (warna karakter dan warna dasar). Fungsi ini tidak mengubah posisi kursor, oleh karena itu sesudah pemanggilan fungsi, untuk memindahkan posisi kursor digunakan fungsi setCursorPos.
Program diatas terdiri dari empat fungsi, yaitu fungsi main, getCursorPos, setCursorPos dan writeChar. Fungsi getCursorPos berguna untuk mengetahui posisi kursor, fungsi ini mengirimkan parameter y dan x secara acuan. Setelah pemanggilan fungsi, parameter x menyimpan posisi kolom kursor sedangkan parameter y menyimpan posisi baris kursor. Fungsi setCursorPos digunakan untuk memindahkan posisi kursor, fungsi ini mengirimkan parameter y dan x secara nilai. Parameter y digunakan untuk menentukan posisi baris sedangkan parameter x untuk menentukan posisi kolom kursor. Fungsi getCursorPos hampir mirip dengan fungsi wherex dan wherey milik Borland C++ atau Turbo Pascal, sedangkan fungsi setCursorPos hampir mirip dengan fungsi gotoxy.


Template by:

Free Blog Templates