Rabu, 29 Juni 2016

Pertemuan 12

A.    Mengetahui Koordinat Pointer Mouse

Seperti halnya kursor keyboard yang ditampilkan di layar monitor, pointer mouse pun menempati koordinat tertentu di layar. Untuk mengetahui letak atau posisi koordinat pointer mouse dilayar dapat digunakan interupsi 33 heksadesimal servis 3. Berikut ini adalah prosedur untuk mengetahui koordinat pointer mouse.
 Register AH harus bernilai 0.
 Register AL harus bernilai 3 heksadesimal.
 Lakukan interupsi 33 heksadesimal.
Setelah interupsi dilaksanakan:
 Register CX menunjukkan posisi horizontal pointer mouse (sumbu X).
 Register DX menunjukkan posisi vertikal pointer mouse (sumbu Y).
 Register BX menunjukkan tombol mouse yang ditekan. Jika nilai register BX sama dengan 1
berarti tombol kiri mouse yang ditekan. Jika tombol kanan mouse yang ditekan, nilai register BX sama dengan 2.
 Posisi vertikal dan horizontal pointer mouse dimulai dari posisi 0.
Dari prosedur yang telah dijelaskan diatas, dapat disimpulkan bahwa interupsi 33 heksadesimal servis 3 selain dapat digunakan untuk mengetahui posisi koordinat pointer mouse, juga dapat digunakan untuk mengetahui status penekanan tombol mouse. Berikut ini adalah contoh program untuk mempraktekan interupsi 33 heksadesimal servis 3. Simpan project contoh22.ide berikut ini pada direktori yang sama dengan file screen.cpp dan keyboard.cpp serta pilihlah Floating Point atau Emulation di group box Math Support pada jendela New Target.
contoh22.cpp:
 #include <stdlib.h>
 #include "keyboard.cpp"
 #include "screen.cpp"

 #define MOUSE_INT 0x33
 #define MOUSE_RIGHT_CLICK 0x02

 #define USHORT unsigned short int 61


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



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.

4. Periksa apakah tombol kanan mouse diklik. Jika tombol kanan mouse diklik maka hentikan perulangan dan program selesai.

Tidak ada komentar:

Posting Komentar