Subject : Vesa Programming.. Author : pOiSOn Email : poisone@usa.net Irc : irc.ada.net.tr / #scene.tr #manowar #atheist ICQ : 6795916 LastUpdate : 15 mayis 99 Note : DOS hicbir zaman olmez! (windoze sucks!) ! bi sELam dAA bi kac gun once benim icin cok buyuk bir problem olan vesa programlamasi konusundaki problem her ekran kartinin 32 veya 24 bit gibi modlari destekleme mesi idi.. buna en kolay cozum univbe fakat univbe'de bu konularda her zaman yeterli olmuyor.. yani is size kaliyor.. bunu nasil yaparim derseniz programin acilista hangi modu kullanilacagini sormasidir.. hemen oha demeyin cok kolay :) 1. nasi yapiyoz.. bi defa ekrana cizilecek her seyi virtual page'e 32 bit cizeceksiniz.. ekrana cizilecek her seyi bitirdikten sonra cizimi ekrana aktarirken ekran moduna gore cevrim yapacaksiniz.. yanie... while(inp(0x60) != 1) { for (s1=0; s1 < 320 ; s1++) for(s2=0; s2 < 200 ; s2++) { ColR = s1; ColG = s2; ColB = s1 + s2; putpixel(s1,s2,page1); } switch (screen_depth) { case 4: vFlip32(page3,vLFB); break; case 3: vFlip24(page3,vLFB); break; case 2: vFlip16(page3,vLFB); break; case 1: vFlip8(page3,vLFB); break; }; } [][][][] burda ek olarak anlatmak istediim bisi var.. simdi bazi kimseler burda switch'i gorunce heaaa!! switch kullaannnmiiisss!! die cigliklar atabilir.. optimizasyon acisindan switch if'den daha kullanisli haldedir.. eger watcom'un optimizasyon opsiyonlarini acarsaniz switch ifadesi icerisinde bir pointer dizisi yaratilir ve screen_depth index'ine gore dizi icerisinde- ki pointer cagrilir.. mesela flipper_pointers[3] elamani icerisinde vFlip24'un adresi saklanir.. watcom sadece flipper_pointers[screen_depth] pointer'ini cagirir.. goruldugu uzere switch ifadesi haywan gibi herhangi bir karsilastirma felam yapilmadan optimize ediliyor..[way bea! :)] [][][][] olay boyle olucak.. putpixel her durumda 32 bit calisiyor.. simdi modlar konusunda biraz bilgi vereyim.. 32 bit .. 32 bitte her pixel icin 4 byte kullanirlir.. her renk icin 1 byte harcanir.. bu durumda renk icin 3 byte yetiyor.. peki 4. byte ? oda alpha olarak anilir ve kullanilmaz[yalan!].. simdilik 0 olarak yazin.. duzeni ise ARGB seklinde bir dword (double word = quad byte ) olarak yazabilirsiniz.. 24 bit.. 24 bit, 32 bit ile ayni sadece alpha byte'i yok.. byte duzeni RGB seklinde.. 16 bit.. 16 bit, ise biraz daha karmasik bi duzen... 5,6,5 bit olarak RGB duzeninde.. 8 bitten 5 ve 6'ya cevrim yaparken en dusuk bitleri ihmal edeceksiniz 2. cevrim olayi.. 32 ve 24 biti yapmak cok kolay.. bunlari anlatmaya gerek yok zaten yaparsiniz.. sanirim sizin icin asil problem 16 bitte.. bende onu anlatiim.. aslinda kod vermeyi istemiyom ama fazla da ugrasmayin isterim.. daha aciklamaya gerek yok galiba.. void vFlip16(vVirtualPage * where,unsigned char * to) { _asm { mov esi,where // ilk ayarlar.. mov edi,to mov ecx,SCREEN_WORDLEN // opengraph'da byte uzunlugu / 2 flip16loop: lodsd // eax = 0RGB shr al,3 // blue yu 5 bite dusur mov bl,ah // greeni al and bl,1ch // green'in alt uc bitini al shl bl,3 // green'i alt bitlerini yuksek bitlere al or bl,al // blue ile birlestir.. shr eax,8 // ax = RG shr al,5 // green'i uc bite dusur and ah,0xf8 // red'in son uc bitini dusur or ah,al // green ile birlestir mov al,bl // green&blue degerini al stosw // word kaydet.. (16 bitya)... loop flip16loop } }