Subject : mouze... Author : pOiSOn Email : poisone@usa.net Irc : irc.ada.net.tr / #scene.tr #manowar #atheist ICQ : 6795916 LastUpdate : 30 mart 99 Note : mouse cikti mertlik bozuldu.. !.. selams.. gelelim pc'lerin en dengesiz cihazlarindan biri olan mouse.. hemen nie yaw ? dersiniz simdi.. multitasking ozelligi olmayan bir cihaza mouse uydurmak cok zor oldu galiba.. multitasking yetenegi ozelligi olan sistemlerde mouse gibi aktif cihazlarin yonetimi kolaydir fakat pc'lerde bu is biraz karisik.. bu ise bi goz atmis olanlar varsa bunun neresi zor die dusunebilirler.. vga13 modu veya text modlar altinda mouse'u kullanmak kesmelerle halledilebilecek bir is fakat is vesa modlarina gelince isler biraz karisiyor :).. sirf bunu yapabilmek icin mouse driver'i yazdigimi bilirim.. neyse isimize bakalim.. 1. nasi kullanilir bu mouse ? mouse'u kullanabilmek icin..basta kesmelerin nasil kullanilacagina dair bilgiiniz olmali.. o ne gibi bi soru aklinizda varsa dogru kesmeleri anlatan yaziya.. simdik..mouse mantigi ekrandaki bir kalem gibi dusunebilirsiniz.. fakat bu mouse'u standart olarak kullanirken bir arabirimi kullanirsiniz.. bu arabirimin icinde mouse'u ekranda gosterme, koordinatlarini alma, sinirlar belirleme gibi ozellikler var.. baslamak icin ilk once mouse'un ekranda gozukmesini saglayan kesmeyi cagirirsiniz.. sonra devamli olarak mouse koordinatlarini ve tus durumunu okumaniz gerekli (multi tasking olayi demistimya hani :) ) bir tusa basildigi veya bir alanin icine girdiginde islerinizi yapmaya baslarsiniz.. fakat mouse ile ugrasan bi cok kisinin basina dert olan bi durum var ekrana cizim yaparken mouse'un uzerinede cizimin denk gelmesi ve mouse hareket ettirildiginde yerinde bir dikdortgen birakmasi.. bunu engellemek icin her ekrana cizim yapmadan once mouse'u saklamaniz ve cizimi bitirdikten sonra mouse'u tekrar gorunur yapmak en iyi yoldur.. bu biraz yavas oluyor diyor iseniz sadece mouse'un bulundugu yere cizim yaparken gizleyin mouse'u.. sanirim konu anlasildi.. 2. biraz teknik olarik.. text ekran uzerinde calisan bisi yapak diyelim...programin genel yapisi.. void main() { while(inp(0x60) != 1) { ShowMouse(); while( !GetMouseButton(1) ); HideMouse(); GotoXY(GetMouseX(),GetMouseY()); putc('*'); } } boyle bisi yazdiginizda ekran koordinatlarinda bir problem goreceksiniz.. nedeni ise mouse koordinatlarinin her zaman 640x200 olmasi.. bu sayilari ekrana gore tekrar scale (turkcesini bulamadim,ayarlama gibi bisi..) etmeniz gerekli.. yani.. bizim ekran 80x25 buna gore.. oranti yapalim.. 80 640 X mx --------- X = (mx * 80) / 640 = (mx / 8) 25 200 Y my --------- Y = (my * 25) / 200 = (my / 8) GotoXY( GetMouseX() / 8 , GetMouseY() / 8 ); yazmamiz lazim.. daha hizli bi yontemle yazarsak.. GotoXY( GetMouseX() >> 3 , GetMouseY() >> 3 ); ayni problemler grafik ekranlar icinde gecerli.. mouse koordinatini ekrana gore tekrar ayarlamaniz gerekli.. void main() { while(inp(0x60) != 1) { ShowMouse(); while( !GetMouseButton(1) ); HideMouse(); putpixel(GetMouseX() * SCREEN_SCALE,GetMouseY() * SCREEN_SCALE,14,VGA); } } aslinda bu is boyle yapilmaz ama anlasilmasi icin boyle yazdim.. neysem genel mantik anlasildi galiba.. simdi burda iki onemli nokta var ekrana cizim yaparken mouse'u saklanamiz gerekli.. ikincisi ise mouse aktif bir cihazdir ve butona basildiktan sonra mouse'un koordinatlarinin degisebilecegini hesaba katin.. anlasilmayan bisi varsa konunun basina gidin ve tekrar okuyun.. yok anladim derseniz devam.. simdi mouse interruptlarinin nasil kullanilacagini anlatayim.. zaten bi kac tane var, basit olmasi icin c altinda yazicam.. eger bisiler ogrenmek ve vicdan azabi cekmemek istiyorsaniz bunlari birde kendi elinizle yazin yok bana komaz derseniz biyrin copy paste.. ilk once mouse driver'i yuklumu onu kontrol etmemiz lazim .. e tabi buna bi fonksiyon biyrin.. // bunlar global her yerde kullanicaz kiscasi.. union REGS inregs, outregs; int MouseX,MouseY; int MouseLeft,MouseRight; // yap bakalim bi test mouse driver'i kurulumu degilmi diye.. int TestMouse() { inregs.w.ax = 0; int386 (0x33, &inregs, &outregs); return (outregs.w.ax == 0xFFFF); } // bi ok sekli cikarda bakalim nasi bisi.. void ShowMouseCursor() { inregs.w.ax = 0x1; int386 (0x33, &inregs, &outregs); } // bumu mouse dedikleri ??.. yok vazgectim guzel degilmis.. istemez kaybet.. void HideMouseCursor() { inregs.w.ax = 0x2; int386 (0x33, &inregs, &outregs); } // nerde napar bu mouse ? void GetMouseCoord() { inregs.w.ax = 0x3; int386 (0x33, &inregs, &outregs); MouseX = outregs.w.cx; MouseY = outregs.w.dx; MouseLeft = (outregs.w.bx & 1 ) == 1; MouseRight = (outregs.w.bx & 2 ) == 2; } // yok oyle kafana gore gezmek gel soyle hizaya.. void SetMouseCoord() { inregs.w.cx = MouseX; inregs.w.dx = MouseY; inregs.w.ax = 0x4; int386 (0x33, &inregs, &outregs); } isimizi gorecek fonksiyonlari yazdik..geri kalan mouseun koordinatlarini ve tus durumuna bakarak is goreceksiniz.. bundan sonra hayat kolay, herkes mutlu zannetmeyin :).. asil sorun showmouse fonksiyonu text,vga13 gibi standart modlarda calismasi.. vesa moda gectiginizde mouse corsorunu goremez siniz.. bu yuzden hazirlanan programlarda bir kernel gibi modul yapip mouse koordinatlarina devamli olarak mouse cursor'u cizmeniz gibi yontemler bulmaniz gerekli.. aslinda bunun icin mouse driverlari kolayliklar saglarlar, mesela mouse cursorunu cizebilmeniz icin size bir kesme veriyorlar fakat ben korumali mod altinda problemlerle karsilastigim icin bunlari kullanmanizi tavsiye etmiyorum..hadi kolay gele..