Rabu, 29 Juni 2016

Contoh 27 (Coding) dan Gambarnya

#include <stdlib.h>
#include "screen.cpp"
#include "keyboard.cpp"
#include "mouse.cpp"
int main(void)
{
Screen *layar = new Screen();
Keyboard *tombol = new Keyboard(layar);
Mouse *tikus = new Mouse();
UCHAR str[5];
USHORT x, y;
layar->setMode(0x03); layar->setCursorPos(4, 14);
tombol->hideCursor();
if (tikus->getState() == MOUSE_NOT_READY)
{
layar->writeString("Mouse tidak siap! Tekan ENTER ...");
tombol->getString(str, 0);
}
tikus->showMouse();
layar->writeString("Klik A, B atau C");
layar->setCursorPos(5, 14);
layar->writeString("[A] Huruf A");
layar->setCursorPos(6, 14);
layar->writeString("[B] Huruf B");
layar->setCursorPos(7, 14);
layar->writeString("[C] Selesasi");
while (TRUE)
{
layar->setCursorPos(9, 14);
if (tikus->getClickMode() == MOUSE_LEFT_CLICK)
{
x = tikus->getX() / 8; /* Periksa posisi horizontal */
y = tikus->getY() / 8; /* Periksa posisi vertikal */
if ((x == 15) && (y == 5))

layar->writeString("Anda memilih A!");
if ((x == 15) && (y == 6))
layar->writeString("Anda memilih B!");
if ((x == 15) && (y == 7)) break;
}
}
delete layar; delete tombol; delete tikus;
return EXIT_SUCCESS;
}


Gambarnya Sebagai Berikut : 


Contoh Mouse.cpp (Coding)

#define MOUSE_INT 0x33 /* Interupsi mouse */
#define MOUSE_READY 0xff /* Mouse siap digunakan */
#define MOUSE_NOT_READY 0x00 /* Mouse tidak siap */

#define MOUSE_SUCCESS 0x1f /* Bisa dinonaktifkan */
#define MOUSE_FAILURE 0xff /* Tak bisa dinonaktifkan */
#define MOUSE_LEFT_CLICK 0x01 /* Klik tombol kiri */
#define MOUSE_RIGHT_CLICK 0x02 /* Klik tombol kanan */
#define MOUSE_LEFT_BUTTON 0x00 /* Pilih tombol kiri */
#define MOUSE_RIGHT_BUTTON 0x01 /* Pilih tombol kanan */
#define UCHAR unsigned char
#define USHORT unsigned short int
class Mouse
{
private:
UCHAR button; /* Banyaknya tombol mouse */
UCHAR isReady; /* Status mouse siap/tidak */
UCHAR clickMode; /* Klik kiri atau klik kanan */
USHORT x, y; /* Posisi koordinat mouse */
/* Mengetahui posisi koordinat pointer mouse */
void getMousePos(void);
public:
Mouse(void); /* Konstruktor default */
~Mouse(void); /* Destruktor default */
UCHAR getState(void); /* Mouse siap/tidak siap */
UCHAR getNumButton(void); /* Cek jumlah tombol mouse */
UCHAR disableMouse(void); /* Nonaktifkan driver mouse */
void enableMouse(void); /* Aktifkan driver mouse */
/* Mendeteksi penekanan tombol mouse */
USHORT getButtonClick(UCHAR btn, USHORT maxclick);
/* Mendeteksi pelepasan tombol mouse */
USHORT getButtonRelease(UCHAR btn, USHORT maxrel);
/* Mengetahui klik kiri atau klik kanan setelah */
/* fungsi getMousePos dijalankan */
UCHAR getClickMode(void);
USHORT getX(void); /* Posisi horizontal mouse */
USHORT getY(void); /* Posisi vertikal mouse */
void hideMouse(void); /* Menyembunyikan pointer */
void showMouse(void); /* Menampilkan pointer */
/* Memindahkan pointer mouse di posisi tertentu */
void setMousePos(USHORT row, USHORT col);
/* Membatasi posisi koordinat mouse di layar */
void setMouseRegion(USHORT y1, USHORT x1,
USHORT y2, USHORT x2);
};
Mouse::Mouse(void)
{

UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Deteksi mouse dan drivernya */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
this->isReady = state;
this->button = button;
return;
}
Mouse::~Mouse(void)
{
return;
}
UCHAR Mouse::getState(void)
{
return this->isReady;
}
UCHAR Mouse::getNumButton(void)
{
return this->button;
}
UCHAR Mouse::disableMouse(void)
{
UCHAR state;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x1f; /* Register AL = 0x1f */
asm int MOUSE_INT; /* Nonaktifkan driver mouse */
asm mov state, al; /* Salin register AL ke state */
return state;
}
void Mouse::enableMouse(void)
{
asm mov ax, 0x0020; /* AH = 0, AL = 0x20 */
asm int MOUSE_INT; /* Aktifkan driver mouse */
return;
}
USHORT Mouse::getButtonClick(UCHAR btn, USHORT maxclick)
{
USHORT click, nclick, x, y;
click = nclick = x = y = 0;
while (nclick < maxclick)
{

asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x05; /* Register AL = 5, AX = 5 */
asm mov bh, 0x00; /* Register BH = 0 */
asm mov bl, btn; /* BL = tombol yang dipilih */
asm int MOUSE_INT; /* Deteksi status klik tombol */
asm mov click, bx; /* Banyaknya penekanan tombol */
asm mov x, cx; /* Posisi horizontal mouse */
asm mov y, dx; /* Posisi vertikal mouse */
nclick += click;
}
this->y = y; this->x = x;
return click;
}
USHORT Mouse::getButtonRelease(UCHAR btn, USHORT maxrel)
{
USHORT rel, nrel, x, y;
rel = nrel = x = y = 0;
while (nrel < maxrel)
{
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x06; /* Register AL = 6, AX = 6 */
asm mov bh, 0x00; /* Register BH = 0 */
asm mov bl, btn; /* BL = tombol yang dipilih */
asm int MOUSE_INT; /* Deteksi pelepasan tombol */
asm mov rel, bx; /* Banyaknya pelepasan tombol */
asm mov x, cx; /* Posisi horizontal mouse */
asm mov y, dx; /* Posisi vertikal mouse */
nrel += rel;
}
this->y = y; this->x = x;
return rel;
}
void Mouse::getMousePos(void)
{
USHORT x, y;
UCHAR cmode;
asm mov ax, 0x0003; /* AH = 0, AL = 3, AX = 3 */
asm int MOUSE_INT; /* Deteksi posisi mouse */
asm mov x, cx; /* Posisi horizontal mouse */
asm mov y, dx; /* Posisi vertikal mouse */
asm mov cmode, bl; /* Tombol yang diklik */
this->y = y; this->x = x;
this->clickMode = cmode;

return;
}
UCHAR Mouse::getClickMode(void)
{
this->getMousePos();
return this->clickMode;
}
USHORT Mouse::getX(void)
{
return this->x;
}
USHORT Mouse::getY(void)
{
return this->y;
}
void Mouse::hideMouse(void)
{
asm mov ax, 0x0002; /* AH = 0, AL = 2, AX = 2 */
asm int MOUSE_INT; /* Sembunyikan pointer mouse */
return;
}
void Mouse::setMousePos(USHORT row, USHORT col)
{
asm mov ax, 0x0004; /* AH = 0, AL = 4, AX = 4 */
asm mov cx, col; /* Posisi horizontal mouse */
asm mov dx, row; /* Posisi vertikal mouse */
asm int MOUSE_INT; /* Pindahkan pointer mouse */
return;
}
void Mouse::setMouseRegion(USHORT y1, USHORT x1,
USHORT y2, USHORT x2)
{
asm mov ax, 0x0007; /* Register AX = 7 */
asm mov cx, x1; /* CX = batas horizontal minimal */
asm mov dx, x2; /* DX = batas horizontal maksimal */
asm int MOUSE_INT; /* Batasi posisi horizontal mouse */
asm mov ax, 0x0008; /* Register AX = 8 */
asm mov cx, y1; /* CX = batas vertikal minimal */
asm mov dx, y2; /* DX = batas vertikal maksimal */
asm int MOUSE_INT; /* Batasi posisi vertikal mouse */
return;
}
void Mouse::showMouse(void)
{
asm mov ax, 0x0001; /* AH = 0, AL = 1, AX = 1 */

asm int MOUSE_INT; /* Tampilkan pointer mouse */
return;
}



Penjelasannya : 


Setelah membuat pustaka class untuk operasi mouse, berikut ini akan diberikan contoh cara menggunakan pustaka class mouse.cpp. Objek yang harus diinstansiasikan dari pustaka class mouse.cpp adalah objek Mouse. Program berikut ini adalah program untuk mendeteksi pilihan yang ditampilkan dilayar. Pada layar monitor akan ditampilkan pilihan A, B, dan C. Jika pengguna mengklik A atau B maka muncul pesan bahwa pengguna telah memilih A atau B. Tetapi jika pengguna mengklik C maka program akan dihentikan

Contoh 26 (Coding) dan Gambarnya

#include <stdlib.h>
#include "screen.cpp"
#include "keyboard.cpp"
#define MOUSE_INT 0x33 /* Interupsi mouse */
#define MOUSE_LEFT_BUTTON 0x00 /* Pilihan tombol kiri */
#define MOUSE_RIGHT_BUTTON 0x01 /* Pilihan tombol kanan */
#define USHORT unsigned short int
UCHAR detectMouse(UCHAR *btn);
USHORT getButtonRelease(UCHAR btn, USHORT *row,
USHORT *col, USHORT maxrel);
void showMouse(void);
int main(void)
{

Screen *layar = new Screen();
Keyboard *tombol = new Keyboard(layar);
USHORT jumlah, baris, kolom;
UCHAR status, button, str[5];
status = detectMouse(&button);
layar->setMode(0x03); layar->setCursorPos(4, 14);
showMouse();
if (!status)
{
layar->writeString("Mouse tidak siap! Tekan ENTER ...");
tombol->getString(str, 0);
delete layar; delete tombol;
exit(EXIT_FAILURE);
}
layar->writeString("Lepas tombol kanan 5x untuk berhenti");
tombol->hideCursor();
jumlah = getButtonRelease(MOUSE_RIGHT_BUTTON,
&baris, &kolom, 5);
delete tombol; delete layar;
return EXIT_SUCCESS;
}
UCHAR detectMouse(UCHAR *btn)
{
UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Laksanakan interupsi 0x33 */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
*btn = button;
return state;
}
USHORT getButtonRelease(UCHAR btn, USHORT *row,
USHORT *col, USHORT maxrel)
{
USHORT rel, nrel, x, y;
rel = nrel = x = y = 0;
while (nrel < maxrel)
{
asm mov ah, 0x00;
asm mov al, 0x06;
asm mov bh, 0x00;
asm mov bl, btn;

asm int MOUSE_INT;
asm mov rel, bx;
asm mov x, cx;
asm mov y, dx;
nrel += rel;
}
*row = y; *col = x;
return rel;
}
void showMouse(void)
{
asm mov ax, 0x00001;
asm int MOUSE_INT;
return;
}


Gambarnya Sebagai Berikut : 



Penjelasannya : 


Fungsi getButtonRelease pada program contoh26.cpp digunakan untuk mendeteksi pelepasan tombol sebanyak beberapa kali. Parameter btn yang bertipe unsigned character digunakan untuk menentukan tombol mouse (tombol kiri atau kanan) yang akan dibatasi pelepasannya. Parameter col dan row bertipe unsigned integer yang dikirimkan secara referensi digunakan untuk mengetahui posisi baris dan kolom pointer mouse ketika tombol mouse terakhir kali dilepas. Parameter maxclick bertipe unsigned integer digunakan untuk menentukan banyak pelepasan tombol mouse.

Contoh 25 (Coding) dan Gambarnya

#include <stdlib.h>
#include "screen.cpp"
#include "keyboard.cpp"
#define MOUSE_INT 0x33 /* Nomor interupsi mouse */
#define MOUSE_LEFT_BUTTON 0x00 /* Pilihan tombol kiri */
#define MOUSE_RIGHT_BUTTON 0x01 /* Pilihan tombol kanan */
#define USHORT unsigned short int
UCHAR detectMouse(UCHAR *btn);
USHORT getButtonClick(UCHAR btn, USHORT *row,
USHORT *col, USHORT maxclick);
void showMouse(void);

int main(void)
{
Screen *layar = new Screen();
Keyboard *tombol = new Keyboard(layar);
USHORT jumlah, baris, kolom;
UCHAR status, button, str[5];
status = detectMouse(&button);
layar->setMode(0x03); layar->setCursorPos(4, 14);
showMouse();
if (!status)
{
layar->writeString("Mouse tidak siap! Tekan ENTER ...");
tombol->getString(str, 0);
delete layar; delete tombol;
exit(EXIT_FAILURE);
}
layar->writeString("Klik kiri 5 kali untuk berhenti");
tombol->hideCursor();
jumlah = getButtonClick(MOUSE_LEFT_BUTTON,
&baris, &kolom, 5);
delete tombol; delete layar;
return EXIT_SUCCESS;
}
UCHAR detectMouse(UCHAR *btn)
{
UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Laksanakan interupsi 0x33 */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
*btn = button;
return state;
}
USHORT getButtonClick(UCHAR btn, USHORT *row,
USHORT *col, USHORT maxclick)
{
USHORT click, nclick, x, y;
click = nclick = x = y = 0;
while (nclick < maxclick)
{
asm mov ah, 0x00; /* Register AH = 0 */

asm mov al, 0x05; /* Register AL = 0, AH:AL = AX = 0 */
asm mov bh, 0x00; /* Register BH = 0 */
asm mov bl, btn; /* Register BL = tombol yang dipilih */
asm int MOUSE_INT; /* Lakukan interupsi 0x33 */
asm mov click, bx; /* Salin nilai di BX ke click */
asm mov x, cx; /* Posisi kolom terakhir */
asm mov y, dx; /* Posisi baris terakhir */
nclick += click;
}
*row = y; *col = x;
return nclick;
}
void showMouse(void)
{
asm mov ax, 0x00001; /* AH = 0, AL = 1, AX = 1 */
asm int MOUSE_INT; /* Tampilkan pointer mouse */
return;
}


Gambarnya Sebagai Berikut : 



Penjelasannya :


Fungsi getButtonClick pada program contoh25.cpp digunakan untuk mendeteksi penekanan tombol sebanyak beberapa kali. Parameter btn yang bertipe unsigned character digunakan untuk menentukan tombol mouse (tombol kiri atau kanan) yang akan dibatasi penekanannya. Parameter col dan row bertipe unsigned integer yang dikirimkan secara referensi digunakan untuk mengetahui posisi baris dan kolom pointer mouse ketika tombol mouse terakhir kali ditekan. Parameter maxclick bertipe unsigned integer digunakan untuk menentukan banyak penekanan tombol mouse.

Contoh 24 (Coding) dan Gambarnya

#include <stdlib.h>
#include "screen.cpp"
#include "keyboard.cpp"
#define MOUSE_INT 0x33
#define MOUSE_LEFT_CLICK 0x01
#define USHORT unsigned short int

UCHAR detectMouse(UCHAR *btn);
void getMousePos(USHORT *row, USHORT *col, UCHAR *btn);
void showMouse(void);
int main(void)
{
Screen *layar = new Screen();
Keyboard *tuts = new Keyboard(layar);
USHORT baris, kolom;
UCHAR status, button, str[5];
status = detectMouse(&button);
layar->setMode(0x03);
layar->setCursorPos(4, 14);
tuts->hideCursor();
if (!status)
{
layar->writeString("Mouse tidak siap! Tekan ENTER ...");
tuts->getString(str, 0);
delete tuts; delete layar;
exit(EXIT_FAILURE);
}
layar->writeString("Deteksi Koordinat Pointer Mouse");
layar->setCursorPos(6, 14);
layar->writeString("X:");
layar->setCursorPos(7, 14);
layar->writeString("Y:");
layar->setCursorPos(9, 14);
layar->writeString("Klik kanan untuk berhenti");
showMouse();
while (TRUE)
{
/* Periksa koordinat dan penekanan tombol mouse */
getMousePos(&baris, &kolom, &button);
baris /= 8; kolom /= 8; /* kolom dan baris dibagi 8 */
gcvt((double) kolom, 2, str);
layar->setCursorPos(6, 17); layar->writeString(” ”);
layar->setCursorPos(6, 17); layar->writeString(str);
gcvt((double) baris, 2, str);
layar->setCursorPos(7, 17); layar->writeString(” ”);
layar->setCursorPos(7, 17); layar->writeString(str);
if (button == MOUSE_RIGHT_CLICK) break;
}
delete tuts; delete layar;
return EXIT_SUCCESS;
}

UCHAR detectMouse(UCHAR *btn)
{
UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Laksanakan interupsi 0x33 */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
*btn = button;
return state;
}
void getMousePos(USHORT *row, USHORT *col, UCHAR *btn)
{
USHORT x, y;
UCHAR button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x03; /* Register AL = 0, AH:AL = AX = 0 */
asm int MOUSE_INT; /* Lakukan interupsi 0x33 */
asm mov x, cx; /* Salin CX ke x, posisi horizontal */
asm mov y, dx; /* Salin DX ke y, posisi vertikal */
asm mov button, bl; /* Status penekanan tombol */
*row = y; *col = x; *btn = button;
return;
}
void showMouse(void)
{
asm mov ah, 0x00;
asm mov al, 0x01;
asm int MOUSE_INT;
return;
}


Gambarnya Sebagai Berikut :



Penjelasannya : 


Pada program contoh24.cpp fungsi yang digunakan untuk membatasi koodinat posisi mouse adalah fungsi setMouseRegion. Fungsi setMouseRegion menerima empat parameter bertipe unsigned integer yang dikirimkan secara nilai. Parameter y1 dan y2 digunakan untuk menentukan batas vertikal, sedangkan parameter x1 dan x2 digunakan untuk menentukan batas horizontal.

Contoh 23 (Coding) dan Gambarnya

#include <stdlib.h>
#include <time.h> /* Prototype fungsi randomize dan rand */
#include "screen.cpp"
#include "keyboard.cpp"
#define MOUSE_INT 0x33
#define MOUSE_LEFT_CLICK 0x01
#define USHORT unsigned short int
UCHAR detectMouse(UCHAR *btn);
void getMousePos(USHORT *row, USHORT *col, UCHAR *btn);
void setMousePos(USHORT row, USHORT col);
void showMouse(void);
int main(void)
{
Screen *layar = new Screen();
Keyboard *tombol = new Keyboard(layar);
USHORT baris, kolom;
UCHAR status, button, str[5];
status = detectMouse(&button);
layar->setMode(0x03);
layar->setCursorPos(4, 14);
tombol->hideCursor();
if (!status)
{
layar->writeString("Mouse tidak siap! Tekan ENTER ...");
tombol->getString(str, 0);
delete tombol; delete layar;
exit(EXIT_FAILURE);
}
layar->writeString("Klik kiri untuk berhenti.");
showMouse(); /* Tampilkan pointer mouse */

randomize(); /* Inisialisasi angka random */
while (TRUE)
{
baris = rand() % 480;
kolom = rand() % 640;
setMousePos(baris, kolom);
getMousePos(&baris, &kolom, &button);
if (button == MOUSE_LEFT_CLICK) break;
}
delete tombol; delete layar;
return EXIT_SUCCESS;
}
UCHAR detectMouse(UCHAR *btn)
{
UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Laksanakan interupsi 0x33 */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
*btn = button;
return state;
}
void getMousePos(USHORT *row, USHORT *col, UCHAR *btn)
{
USHORT x, y;
UCHAR button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x03; /* Register AL = 3, AH:AL = AX = 3 */
asm int MOUSE_INT; /* Lakukan interupsi 0x33 */
asm mov x, cx; /* Salin nilai register CX ke x */
asm mov y, dx; /* Salin nilai register DX ke y */
asm mov button, bl; /* Salin nilai reg. DL ke button */
*row = y; *col = x;
*btn = button;
return;
}
void setMousePos(USHORT row, USHORT col)
{
asm mov ax, 0x0004; /* Register AX = 4 */
asm mov cx, col; /* Salin nilai col ke register CX */
asm mov dx, row; /* Salin nilai row ke register DX */
asm int MOUSE_INT; /* Pindahkan posisi pointer mouse */
return;

}
void showMouse(void)
{
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x01; /* Register AL = 1, AH:AL = AX = 1 */
asm int MOUSE_INT; /* Tampilkan pointer mouse */
return;
}


Gambarnya Sebagai Berikut :



Penjelasannya : 


Fungsi setMousePos pada program contoh23.cpp diatas digunakan untuk memindahkan pointer mouse. Fungsi setMousePos menerima parameter row dan col yang bertipe unsigned integer yang dikrimkan secara nilai. Parameter row digunakan untuk menentukan posisi vertikal pointer mouse, sedangkan parameter col digunakan untuk menentukan posisi horizontal mouse. Program contoh23.cpp baru berhenti ketika pengguna menekan tombol kiri mouse.

Contoh 22 (Coding) dan Gambarnya

#include <stdlib.h>
#include "keyboard.cpp"
#include "screen.cpp"
#define MOUSE_INT 0x33
#define MOUSE_RIGHT_CLICK 0x02
#define USHORT unsigned short int

UCHAR detectMouse(UCHAR *btn);
void getMousePos(USHORT *row, USHORT *col, UCHAR *btn);
void showMouse(void);
int main(void)
{
Screen *layar = new Screen();
Keyboard *tuts = new Keyboard(layar);
USHORT baris, kolom;
UCHAR status, button, str[5];
status = detectMouse(&button);
layar->setMode(0x03);
layar->setCursorPos(4, 14);
tuts->hideCursor();
if (!status)
{
layar->writeString("Mouse tidak siap! Tekan ENTER ...");
tuts->getString(str, 0);
delete tuts; delete layar;
exit(EXIT_FAILURE);
}
layar->writeString("Deteksi Koordinat Pointer Mouse");
layar->setCursorPos(6, 14);
layar->writeString("X:");
layar->setCursorPos(7, 14);
layar->writeString("Y:");
layar->setCursorPos(9, 14);
layar->writeString("Klik kanan untuk berhenti");
showMouse();
while (TRUE)
{
/* Periksa koordinat dan penekanan tombol mouse */
getMousePos(&baris, &kolom, &button);
baris /= 8; kolom /= 8; /* kolom dan baris dibagi 8 */
gcvt((double) kolom, 2, str);
layar->setCursorPos(6, 17); layar->writeString(” ”);
layar->setCursorPos(6, 17); layar->writeString(str);
gcvt((double) baris, 2, str);
layar->setCursorPos(7, 17); layar->writeString(” ”);
layar->setCursorPos(7, 17); layar->writeString(str);
if (button == MOUSE_RIGHT_CLICK) break;
}
delete tuts; delete layar;
return EXIT_SUCCESS;
}

UCHAR detectMouse(UCHAR *btn)
{
UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Laksanakan interupsi 0x33 */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
*btn = button;
return state;
}
void getMousePos(USHORT *row, USHORT *col, UCHAR *btn)
{
USHORT x, y;
UCHAR button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x03; /* Register AL = 0, AH:AL = AX = 0 */
asm int MOUSE_INT; /* Lakukan interupsi 0x33 */
asm mov x, cx; /* Salin CX ke x, posisi horizontal */
asm mov y, dx; /* Salin DX ke y, posisi vertikal */
asm mov button, bl; /* Status penekanan tombol */
*row = y; *col = x; *btn = button;
return;
}
void showMouse(void)
{
asm mov ah, 0x00;
asm mov al, 0x01;
asm int MOUSE_INT;
return;
}


Gambarnya Sebagai Berikut :














Penjelasannya ; 


Pada program contoh22.cpp, fungsi getMousePos menerima tiga parameter, yaitu row, col dan btn yang dikirimkan secara referensi. Parameter row dan col yang bertipe unsigned integer digunakan untuk menyimpan posisi baris dan kolom pointer mouse, sedangkan parameter btn yang bertipe unsigned character digunakan untuk mengetahui apakah tombol kiri atau kanan ditekan. Perhatikanlah baris 49! Pada baris 49, variabel baris dan kolom dibagi dengan 8 setelah fungsi getMousePos dijalankan karena nilai baris yang dikembalikan akan berkisar dari 0 s.d 479 dan nilai kolom yang dikembalikan berkisar antara 0 s.d 639. Berikut ini adalah alur program contoh22.cpp: 
  1.  Deteksi mouse. Jika mouse tidak siap digunakan maka program dihentikan.
  2. Jika mouse siap digunakan maka lakukan perulangan terus-menerus untuk memeriksa koordinat pointer mouse.
  3. Tampilkan posisi baris dan kolom pointer mouse.P
  4. Periksa apakah tombol kanan mouse diklik. Jika tombol kanan mouse diklik maka hentikan perulangan dan program selesai.



Contoh 21 (Coding) dan Gambarnya

#include <dos.h>
#include <stdlib.h>
#include "screen.cpp"
#define MOUSE_INT 0x33
UCHAR detectMouse(UCHAR *btn);
void showMouse(void);
void enableMouse(void);
UCHAR disableMouse(void);
int main (void)
{
Screen *layar = new Screen();
UCHAR state, btn;
layar->setMode(0x03);
layar->setCursorPos(4, 14);

state = detectMouse(&btn);
if (state)
{
layar->writeString("Mouse siap digunakan.");
layar->setCursorPos(6, 14);
layar->writeString("Driver mouse dinonaktifkan.");
showMouse(); disableMouse();
delay(7000);
layar->setCursorPos(6, 14);
layar->writeString("Driver mouse diaktifkan kembali.");
enableMouse();
}
else
{
layar->writeString("Mouse tidak siap.");
}
delay(5000);
delete layar; return EXIT_SUCCESS;
}
UCHAR detectMouse(UCHAR *btn)
{
UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Laksanakan interupsi 0x33 */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
*btn = button;
return state;
}
void showMouse(void)
{
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x01; /* Register AL = 1, AH:AL = AX = 1 */
asm int MOUSE_INT; /* Tampilkan pointer mouse */
return;
}
void enableMouse(void)
{
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x20; /* Register AL = 0x20, AX = 0x0020 */
asm int MOUSE_INT; /* Aktifkan driver mouse */
return;
}

UCHAR disableMouse(void)
{
UCHAR state;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x1f; /* Register AL = 0x1f, AX = 0x001f */
asm int MOUSE_INT; /* Non-aktifkan driver mouse */
asm mov state, al; /* Salin isi AL ke state */
return state;

}

Gambarnya Sebagai Berikut :



Penjelasannya :


Pada program contoh21.cpp diatas, fungsi enableMouse digunakan untuk mengaktifkan driver mouse dan fungsi disableMouse digunakan untuk menonaktifkan driver mouse. Perbedaan fungsi enableMouse dengan fungsi disableMouse yang telah dibuat adalah fungsi disableMouse mengembalikan nilai unsigned character yang menunjukan apakah interupsi berhasil dilakukan atau gagal, sedangkan fungsi enable Mouse tidak mengembalikan nilai apapun.

Contoh 20 (Coding) dan Gambarnya

#include <dos.h>
#include <stdlib.h>
#include "screen.cpp"
#define MOUSE_INT 0x33
UCHAR detectMouse(UCHAR *btn);
void showMouse(void);
void hideMouse(void);
int main (void)
{
Screen *layar = new Screen();
UCHAR state, btn;
layar->setMode(0x03);
layar->setCursorPos(4, 14);

state = detectMouse(&btn);
if (state)
{
layar->writeString("Mouse siap digunakan.");
layar->setCursorPos(6, 14);
layar->writeString("Pointer mouse ditampilkan.");
showMouse(); delay(7000);
layar->setCursorPos(6, 14);
layar->writeString("Pointer mouse disembunyikan.");
hideMouse();
}
else
{
layar->writeString("Mouse tidak siap.");
}
delay(5000);
delete layar; return EXIT_SUCCESS;
}
UCHAR detectMouse(UCHAR *btn)
{
UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Laksanakan interupsi 0x33 */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
*btn = button;
return state;
}
void showMouse(void)
{
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x01; /* Register AL = 1, AH:AL = AX = 1 */
asm int MOUSE_INT; /* Tampilkan mouse */
return;
}
void hideMouse(void)
{
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x02; /* Register AL = 2, AH:AL = AX = 2 */
asm int MOUSE_INT; /* Sembunyikan mouse */
return;
}


Gambarnya Sebagai Berikut : 



Penjelasannya :


Program contoh20.cpp menambahkan satu fungsi baru, yaitu fungsi hideMouse 58 untuk menyembunyikan pointer mouse. Alur program contoh 20.cpp adalah sebagai berikut: 
  1. Deteksi mouse, jika mouse tidak siap digunakan maka pesan bahwa mouse tidak siap digunakan ditampilkan. Kemudian program berhenti secara otomatis setelah jeda lima detik.
  2. Jika mouse terdeteksi, maka pointer mouse akan ditampilkan. Setelah jeda selama tujuh detik pointer mouse akan disembunyikan. Setelah itu program berhenti secara otomatis setelah jeda lima detik.

Contoh 19 (Coding) dan Gambarnya

#include <dos.h>
#include <stdlib.h>
#include "screen.cpp"
#define MOUSE_INT 0x33
UCHAR detectMouse(UCHAR *btn);
void showMouse(void);
int main (void)
{
Screen *layar = new Screen();
UCHAR state, btn;
layar->setMode(0x03);
layar->setCursorPos(4, 14);
state = detectMouse(&btn);
if (state)
{
layar->writeString("Mouse siap digunakan.");
showMouse();
}
else
{
layar->writeString("Mouse tidak siap.");

}
delay(5000);
delete layar; return EXIT_SUCCESS;
}
UCHAR detectMouse(UCHAR *btn)
{
UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Laksanakan interupsi 0x33 */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
*btn = button;
return state;
}
void showMouse(void)
{
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x01; /* Register AL = 0, AX = 0 */
asm int MOUSE_INT; /* Lakukan interupsi */
return;
}


Gambarnya Sebagai Berikut : 


Penjelasannya :


Program contoh19.cpp ketika dijalankan akan mendeteksi mouse. Jika mouse siap digunakan maka pointer mouse akan dimunculkan menggunakan fungsi showMouse, tetapi jika mouse tidak terdeteksi maka akan ditampilkan pesan bahwa mouse tidak bisa digunakan. Agar pointer mouse dapat ditampilkan, program contoh19.cpp harus dijalankan dalam mode full screen, caranya adalah dengan menekan tombol kombinasi ALT+Enter. Program akan berhenti secara otomatis setelah lima detik. Setelah bisa menampilkan pointer mouse, program

Contoh 18 (Coding) dan Gambarnya

#include <stdlib.h>
#include "screen.cpp"
#include "keyboard.cpp"
#define MOUSE_INT 0x33 /* Nomor interupsi mouse */
UCHAR detectMouse(UCHAR *btn);
int main(void)
{
Screen *layar = new Screen();
Keyboard *tombol = new Keyboard(layar);
UCHAR str[5];
UCHAR status, button;
/* Panggil fungsi deteksi mouse */
status = detectMouse(&button);
layar->setMode(0x03);
layar->setCursorPos(5, 14);
layar->writeString("Deteksi Mouse");
layar->setCursorPos(7, 14);
layar->writeString("Status:");
layar->setCursorPos(8, 14);
layar->writeString("Tombol:");
layar->setCursorPos(7, 22);
if (status)
layar->writeString("Siap digunakan");
else
layar->writeString("Tidak terinstal");
layar->setCursorPos(8, 22);
layar->writeChar(button | 0x30);
tombol->getString(str, 0);
delete layar;
delete tombol;
return EXIT_SUCCESS;
}
UCHAR detectMouse(UCHAR *btn)
{
UCHAR state, button;
asm mov ah, 0x00; /* Register AH = 0 */
asm mov al, 0x00; /* Register AL = 0, AH:AL = 0:0 */
asm int MOUSE_INT; /* Laksanakan interupsi 0x33 */
asm mov state, al; /* Salin nilai AL ke state */
asm mov button, bl; /* Salin nilai BL ke button */
*btn = button;
return state;
}


Gambarnya Sebagai Berikut :


Penjelasannya :


Fungsi detectMouse pada contoh18.cpp menerima sebuah parameter yang 55 dikirimkan secara referensi, yaitu btn. Setelah fungsi detectMouse dijalankan maka parameter btn berisi nilai yang menunjukan jumlah tombol mouse. Fungsi detectMouse akan mengembalikan nilai lebih dari 0 jika mouse dan drivernya terinstal dengan benar dan akan mengembalikan nilai 0 jika mouse atau drivernya tidak terinstal.

Contoh 17 (Coding) dan Gambarnya

#include <math.h>
#include <stdlib.h>
#include "screen.cpp"
#include "keyboard.cpp"
int main(void)
{
Screen *layar = new Screen();
Keyboard *tombol = new Keyboard(layar);
unsigned long int v, i, r;
UCHAR *str, str2[16];
layar->setMode(0x03);
layar->setCursorPos(5, 14);
layar->writeString("Menghitung Beda Potensial");
layar->setCursorPos(7, 14);
layar->writeString("Besar arus (ampere) =");
layar->setCursorPos(7, 38);
str = tombol->getString(str2, 10);
i = atoi(str);
layar->setCursorPos(8, 14);
layar->writeString("Besar tahanan (ohm) =");
layar->setCursorPos(8, 38);
str = tombol->getString(str2, 10);
r = atoi(str);
v = i * r;
gcvt(v, 10, str2);
layar->setCursorPos(9, 14);
layar->writeString("Beda potensial (volt) =");
layar->setCursorPos(9, 38);
layar->writeString(str2);
layar->setCursorPos(11, 14);
layar->writeString("Tekan SHIFT ...");
tombol->hideCursor();
while (TRUE)
{
if ((tombol->getKeyState(STATE_RSHIFT)) ||
(tombol->getKeyState(STATE_LSHIFT)))
break;
}
delete layar; delete tombol;
return EXIT_SUCCESS;
}


Gambarnya Sebagai Berikut :



Penjelasannya : 
Penjelasannya :

Untuk mempraktekkan cara menggunakan class Keyboard, berikut ini akan diberikan contoh program. Program berikut ini adalah program sederhana untuk menghitung besar beda potensial dengan mengalikan besar tahanan dengan besar arus listrik. Pengguna hanya harus memasukan nilai kuat arus listrik dan besar tahanan. Simpan project contoh17.ide dan kode program contoh17.cpp berikut ini pada direktori yang sama dengan file screen.cpp dan keyboard.cpp

Contoh Keyboard.cpp (Coding)

#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 STATE_RSHIFT 0x01 /* Status Shift Kanan */
#define STATE_LSHIFT 0x02 /* Status Shift Kiri */
#define STATE_CTRL 0x04 /* Status CTRL */
#define STATE_ALT 0x08 /* Status ALT */
#define STATE_SCROLL 0x10 /* Status Scroll Lock */
#define STATE_NUM 0x20 /* Status Num Lock */
#define STATE_CAPS 0x40 /* Status Caps Lock */
#define STATE_INS 0x80 /* Status INS */
#define NULL 0 /* ASCII 0 */
#define TRUE 1
class Keyboard
{
private:
Screen *screen;
public:
Keyboard(Screen *scr); /* Konstruktor default */
~Keyboard(void); /* Destruktor default */
UCHAR getKey(void);
UCHAR getSpecialKey(void);
UCHAR *getString(UCHAR *str, UCHAR max);
UCHAR *getPwdString(UCHAR *pwd, UCHAR max);
UCHAR getKeyState(UCHAR key);
void hideCursor(void);
void showCursor(void);
};
Keyboard::Keyboard(Screen *scr)
{
this->screen = scr;
return;
}
Keyboard::~Keyboard(void)
{
return;
}
UCHAR Keyboard::getKey(void)

{
UCHAR key;
asm mov ah, 0x00; /* Register AH = 0 */
asm int KEY_INT; /* Lakukan interupsi */
asm mov key, al; /* Salin nilai register AH ke key */
return key;
}
UCHAR Keyboard::getSpecialKey(void)
{
UCHAR key;
asm mov ah, 0x00; /* Register AH = 0 */
asm int KEY_INT; /* Lakukan interupsi 16 heksadesimal */
asm mov key, ah; /* Salin nilai di AH ke variabel key */
return key;
}
UCHAR *Keyboard::getString(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))
{
this->screen->getCursorPos(&y, &x);
this->screen->setCursorPos(y, --x);
this->screen->writeChar(KEY_SPACE);
*(str + i) = NULL; i--;
}
if ((key >= 32) && (key <= 126) && (i < max))
{
this->screen->getCursorPos(&y, &x);
this->screen->writeChar(key);
this->screen->setCursorPos(y, ++x);
*(str + i) = key; i++;
}
if ((key == KEY_TAB) && (i < max))
{
this->screen->getCursorPos(&y, &x);
this->screen->writeChar(KEY_SPACE);
this->screen->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 *Keyboard::getPwdString(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))
{
this->screen->getCursorPos(&y, &x);
this->screen->setCursorPos(y, --x);
this->screen->writeChar(KEY_SPACE);
*(pwd + i) = NULL; i--;
}
if ((key >= 32) && (key <= 126) && (i < max))
{
this->screen->getCursorPos(&y, &x);
this->screen->writeChar('*');
this->screen->setCursorPos(y, ++x);
*(pwd + i) = key; i++;
}
if ((key == KEY_TAB) && (i < max))
{
this->screen->getCursorPos(&y, &x);
this->screen->writeChar('*');
this->screen->setCursorPos(y, ++x);
*(pwd + i) = KEY_TAB; i++;
}
if (key == KEY_RETURN)
{

*(pwd + i) = NULL;
break;
}
if (i == max) *(pwd + i) = NULL;
}
return pwd;
}
UCHAR Keyboard::getKeyState(UCHAR key)
{
UCHAR state;
asm mov ah, 0x02; /* Register AH = 2 */
asm int KEY_INT; /* Lakukan interupsi 16 heksadesimal */
asm and al, key; /* AND-kan register AL sesuai tombol */
asm mov state, al; /* Salin nilai register AL ke state */
return state;
}
void Keyboard::hideCursor(void)
{
asm mov ah, 0x01;
asm mov ch, 0x20;
asm mov cl, 0x00;
asm int VIDEO_INT;
return;
}
void Keyboard::showCursor(void)
{
asm mov ah, 0x01;
asm mov ch, 0x06;
asm mov cl, 0x07;
asm int VIDEO_INT;
return;
}






Contoh 16 (Coding) dan Gambarnya

#include <math.h> /* Deklarasi prototype atof */
#include <stdlib.h> /* Deklarasi prototype gcvt */
#include "screen.cpp" /* Fungsi anggota writeString */
#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();
double luas, keliling, jari2;
UCHAR *str, str2[16];
layar->setMode(0x03);
layar->setCursorPos(5, 10);
layar->writeString("Luas dan Keliling Lingkaran");
layar->setCursorPos(6, 10);
layar->writeString("---------------------------");
layar->setCursorPos(8, 10);
layar->writeString("Panjang jari-jari =");

layar->setCursorPos(8, 30);
/* Input jari-jari ke dalam variabel str */
str = getString(layar, str, 15);
/* Ubah str menjadi numerik double lalu simpan di jari2 */
jari2 = atof(str);
/* Hitung luas dan keliling lingkaran */
luas = M_PI * pow(jari2, 2);
keliling = 2 * M_PI * jari2;
layar->setCursorPos(9, 10);
layar->writeString("Luas =");
layar->setCursorPos(9, 30);
/* Ubah menjadi string, maks. angka 10 digit */
gcvt(luas, 10, str2);
layar->writeString(str2);
layar->setCursorPos(10, 10);
layar->writeString("Keliling =");
layar->setCursorPos(10, 30);
/* Ubah menjadi string, maks. angka 10 digit */
gcvt(keliling, 10, str2);
layar->writeString(str2);
layar->setCursorPos(12, 10);
layar->writeString("Tekan ENTER ...");
getString(layar, str2, 0);
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;
}


Gambarnya Sebagai Berikut : 



Penjelasannya : 


Perhatikanlah baris 35 pada program contoh16.cpp! Pada baris tersebut, nilai str yang sebelumnya dimasukkan menggunakan fungsi getString diubah menjadi nilai numerik yang sesungguhnya lalu disimpan dalam variabel jari2. Kemudian perhatikan baris 46. Pada baris 46 tertulis gcvt(luas, 10, str). Maksudnya adalah nilai dari variabel luas akan diubah menjadi representasi stringnya yang disimpan pada variabel str. Banyak karakter yang dapat ditampung adalah 10 karakter. Demikian juga yang dilakukan pada baris 54.

Contoh 15 (Coding) dan Gambarnya

#include <stdlib.h>
#include "screen.cpp"
#define KEY_INT 0x16
#define KEY_ESC 0x1b
#define STATE_RSHIFT 0x01
#define STATE_LSHIFT 0x02
#define STATE_CTRL 0x04
#define STATE_ALT 0x08
#define STATE_SCROLL 0x10
#define STATE_NUM 0x20
#define STATE_CAPS 0x40
#define STATE_INS 0x80
#define TRUE 1
UCHAR getKeyState(UCHAR key);
int main(void)
{
Screen *layar = new Screen();
UCHAR tombol;
layar->setMode(0x03);
layar->setCursorPos(4, 14);
layar->writeString("SHIFT KANAN :");
layar->setCursorPos(5, 14);
layar->writeString("SHIFT KIRI :");
layar->setCursorPos(6, 14);
layar->writeString("CTRL :");
layar->setCursorPos(7, 14);
layar->writeString("ALT :");
layar->setCursorPos(8, 14);
layar->writeString("SCROLL LOCK :");
layar->setCursorPos(9, 14);

layar->writeString("NUM LOCK :");
layar->setCursorPos(10, 14);
layar->writeString("CAPS LOCK :");
layar->setCursorPos(11, 14);
layar->writeString("INS - Hentikan Program");
while (TRUE)
{
asm mov ah, 0x01; /* Menyembunyikan kursor */
asm mov ch, 0x20; /* Register CX = 2000 heksadesimal */
asm mov cl, 0x00;
asm int 0x10; /* BIOS Video Interupt Service 1 */
layar->setCursorPos(4, 30);
if (getKeyState(STATE_RSHIFT))
layar->writeString("DITEKAN");
else
layar->writeString("DILEPAS");
layar->setCursorPos(5, 30);
if (getKeyState(STATE_LSHIFT))
layar->writeString("DITEKAN");
else
layar->writeString("DILEPAS");
layar->setCursorPos(6, 30);
if (getKeyState(STATE_CTRL))
layar->writeString("DITEKAN");
else
layar->writeString("DILEPAS");
layar->setCursorPos(7, 30);
if (getKeyState(STATE_ALT))
layar->writeString("DITEKAN");
else
layar->writeString("DILEPAS");
layar->setCursorPos(8, 30);
if (getKeyState(STATE_SCROLL))
layar->writeString("ON ");
else
layar->writeString("OFF");
layar->setCursorPos(9, 30);
if (getKeyState(STATE_NUM))
layar->writeString("ON ");
else
layar->writeString("OFF");
layar->setCursorPos(10, 30);

if (getKeyState(STATE_CAPS))
layar->writeString("ON ");
else
layar->writeString("OFF");
layar->setCursorPos(11, 14);
if (getKeyState(STATE_INS)) break;
}
delete layar;
return EXIT_SUCCESS;
}
UCHAR getKeyState(UCHAR key)
{
UCHAR state;
asm mov ah, 0x02; /* Register AH = 2 */
asm int KEY_INT; /* Lakukan interupsi 16 heksadesimal */
asm and al, key; /* AND-kan register AL sesuai tombol */
asm mov state, al; /* Salin nilai register AL ke state */
return state;
}


Gambarnya Sebagai Berikut :



Penjelasannya :


Pada program contoh15.cpp, fungsi getKeyState adalah fungsi yang digunakan untuk mengetahui status tombol. Perhatikanlah baris 7 sampai baris 14! Pada baris ketujuh sampai keempat belas dideklarasikan konstanta STATE_RSHIFT dan STATE_INS. Konstanta-konstanta ini digunakan untuk mengetahui status penekanan tombol Shift kanan sampai tombol Ins. Konstanta-konstanta inilah yang dikirimkan sebagai parameter pada fungsi getKeyState. Pada baris 114, setelah interupsi dijalankan nilai register AL di-AND-kan dengan nilai yang dikirimkan parameter fungsi getKeyState. Sebagai contoh, untuk mengetahui status tombol Shift kanan sedang ditekan atau dilepas, ditentukan dari nilai bit pertama pada register AL. Untuk mengetahui apakah nilai bit pertama 1 atau 0, maka nilai pada register AL harus di-AND-kan dengan nilai 0x01 atau 00000001 binari atau nilai konstanta STATE_RSHIFT. Kemudian nilai register AL yang telah di-AND-kan dijadikan nilai kembali fungsi getKeyState.


Kamis, 23 Juni 2016

Contoh 14 (Coding) dan Gambarnya

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


Gambarnya Sebagai Berikut :



Penjelasannya :


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.

Contoh 13 (Coding) dan Gambarnya

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


Gambarnya Sebagai Berikut :



Penjelasannya :


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.

Contoh 12 (Coding) dan Gambarnya

#include <stdlib.h>
#include "screen.cpp"
#define KEY_INT 0x16 /* Nomor interupsi keyboard */
#define KEY_F1 0x3b /* Kode scan tombol F1 */
#define KEY_F2 0x3C /* Kode scan tombol F2 */
#define KEY_F3 0x3d /* Kode scan tombol F3 */
#define KEY_F4 0x3e /* Kode scan tombol F4 */
#define TRUE 1
UCHAR getSpecialKey(void);
int main(void)
{
Screen *layar = new Screen();
UCHAR tombol;
layar->setMode(0x03);
layar->setCursorPos(5, 9);
layar->writeString("Tekan F1, F2, F3");
layar->setCursorPos(6, 9);
layar->writeString("Tekan F4 untuk berhenti");
layar->setCursorPos(8, 9);
while (TRUE)
{
tombol = getSpecialKey(); // Periksa tombol yang ditekan
layar->setCursorPos(8, 9);
switch (tombol)
{
case KEY_F1 :
layar->writeString("Tombol F1 ditekan");
break;
case KEY_F2 :
layar->writeString("Tombol F2 ditekan");
break;
case KEY_F3 :
layar->writeString("Tombol F3 ditekan");
break;
case KEY_F4 :
delete layar;
return EXIT_SUCCESS;
default :
layar->writeString("Tombol lain ");
break;
}
}
}
UCHAR getSpecialKey(void)
{
UCHAR key;

asm mov ah, 0x00; /* Register AH = 0 */
asm int KEY_INT; /* Lakukan interupsi 16 heksadesimal */
asm mov key, ah; /* Salin nilai di AH ke variabel key */
return key;
}


Gambarnya Sebagai Berikut :



Penjelasannya : 


Pada kode program contoh12.cpp fungsi getSpecialKey adalah fungsi yang digunakan untuk mendeteksi penekanan tombol-tombol khusus. Perhatikanlah pada baris kelima sampai baris kedelapan, karena setiap tombol khusus memiliki kode tersendiri maka pada baris kelima sampai kedelapan dideklarasikan konstanta untuk tombol F1 sampai F4. Kode scan untuk tombol F1 adalah 3b heksadesimal, F2 adalah 3c heksadesimal, dan seterusnya. Bandingkanlah kode program contoh11.cpp dengan kode program contoh12.cpp pada fungsi getKey dan getSpecialKey. Pada fungsi getKey nilai yang dijadikan sebagai nilai
kembali fungsi (return value) adalah nilai yang tersimpan di register AL, sedangkan pada fungsi getSpecialKey nilai yang dikembalikan adalah nilai yang tersimpan di register AL.

Contoh 11 (Coding) dan Gambarnya

#include <stdlib.h>
#include "screen.cpp
#define KEY_INT 0x16 /* Nomor interupsi keyboard */
UCHAR getKey(void);
int main(void)
{
Screen *layar = new Screen();
UCHAR karakter;
layar->setMode(0x03);
layar->setCursorPos(4, 14);
layar->writeString("Input satu karakter:");
layar->setCursorPos(4, 34);
karakter = getKey();
layar->setCursorPos(5, 14);
layar->writeString("Karakter yang anda ketik adalah");
layar->setCursorPos(5, 46);
layar->writeChar(karakter);
layar->setCursorPos(6, 14);
layar->writeString("Tekan sembarang tombol ...");
getKey();
delete layar;
return EXIT_SUCCESS;
}
UCHAR getKey(void)
{
UCHAR key;
asm mov ah, 0x00; /* Register AH = 0 */
asm int KEY_INT; /* Lakukan interupsi */
asm mov key, al; /* Salin nilai register AH ke key */
return key;
}


Gambarnya Sebagai Berikut :



Pnjelasannya : 


  • Pada kode program contoh11.cpp fungsi getKey adalah fungsi yang digunakan untuk input satu karakter. Fungsi getKey tidak memerlukan parameter dan mengembalikan nilai bertipe unsigned character (didefinisikan dalam file screen.cpp sebagi UCHAR). Nilai yang dikembalikan oleh fungsi ini adalah karakter yang diketikan pada tombol keyboard. Fungsi ini sama dengan fungsi standar getch.
  • Setelah mempelajari cara memasukan satu karakter, maka langkah berikutnya adalah mempelajari cara mendeteksi penekanan tombol-tombol extended. Project contoh12.ide berikut ini memberikan contoh cara mendeteksi penekanan tombol F1, F2, F3, dan F4. Simpan kode program

Contoh 10 (Coding) dan Gambarnya

#include <dos.h>
#include <stdlib.h>
#include "screen.cpp" // Header screen.cpp
int main(void)
{
UCHAR i, j;
Screen *layar = new Screen();
layar->setAttribute(0x9f);
layar->setActivePage(0);
layar->writeString("Halaman pertama");
layar->setAttribute(0xcf);
layar->setActivePage(1);
layar->writeString("Halaman ke dua");
for (i = 1; i < 11; i++)
{
j = i % 2;
layar->setVisualPage(j);
delay(3000);
}
delete layar;
return EXIT_SUCCESS;
}



Gambarnya Sebagai Berikut :



Penjelasannya :

Ketika program diatas dijalankan maka muncul tulisan “Halaman pertama” dan “Halaman ke dua” secara bergantian dengan jeda waktu selama tiga detik. Tulisan ”Halaman pertama” ditampilkan pada halaman 0 sedangkan “Halaman ke dua” pada halaman 1.

Contoh Screen.cpp (Coding)

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





Postingan Lebih Baru Postingan Lama Beranda

Diberdayakan oleh Blogger.

Facebook

Popular Posts

Formulir Kontak

Nama

Email *

Pesan *

Subscribe Here

Ad Home

Random Posts

Recent Posts

Recent

Header Ads

Popular Posts

Flickr

Newsletter

Subscribe Our Newsletter

Enter your email address below to subscribe to our newsletter.

Ad Banner

About Us

Random Posts

Popular Posts

 

Followers

 

Social Share Icons

Templates by Nano Yulianto | CSS3 by David Walsh | Powered by {N}Code & Blogger