Subject : watcom c.. Author : pOiSOn Email : poisone@usa.net Irc : irc.ada.net.tr / #scene.tr #manowar #atheist ICQ : 6795916 LastUpdate : 15.05.1999 (ikibine bi kala..) Note : ne desem bos... 1. selam,hurmet,saygi..vs.. watcom ne die soracaklara hemen cevabi verelim.. watcom bir c derleyici ayni turbo c gibi.. ancak derleme ve optimizasyon acisindan cok iyi bir derleyici.. ayrica en onemli ozlliklerinden biriside korumali modda calismasi. bunun manasi turbo c'de kullanabileceginiz 640kb hafizayi 4gb'a kadar kullanabilmek demek.. buna ek olarak disk uzerinde virtual memory kullanmak gibi ozelliklerde var.. aslinda bu tur hafiza yonetimi watcom tarafindan degil extender'lar tarafindan kontrol ediliyor.. cogul konusuyorum cunku watcom istediginiz memory extender'i secmenize izin veriyor.. (ne gusell!!) ve watcom'un en hayran oldugum taraflarindan biri degisik isletim sistemleri icin exe uretebiliyor.. mesela dos'ta yazdiginiz bir programi OS/2 veya linux (ELF) icin derleyebiliyor..bunun secimide derleyici parametresi veya linker'de belirtilebiliyor.. 2. memory extender ??? memory extender programinizdaki hafiza yonetimini ele alir.. bunun manasi eger hafizadan 100kb hafiza istediginizde bu extender'a gonderilir ve extender hafizayi ayirip size verir.. bazi yazilarda buna dpmi server denildigini de gordugumu soyleyim.. ayrica bu extender'larin diger gorevi islemciyi korumali moda gecirmek ve diger kesme vs. islemleri kontrol etmektir.. 2.1 mesela.. memory extender'lara hemen iki ornek vereyim.. bunlardan ilki watcom ile gelen dos4g extender'i.. bu extender commercial (yani parali) ve digerlerine gore daha ciddi bir extender.. eski dos oyunlari baslarken cokca gormussunuz dur zaten bu extender'in ismini..bu extender ile bir pack programi da geliyor bununla exe dosyayi sikistirmaniz mumkun..boylece exe dosyayi yaklasik %60 oraninda kucultmus olursunuz.. ikinci bi extender ise pmodew.. bu extender free yani bedava.. ustelik dos4g gibi extender'i ayri bir dosya degil, exe'nin icine gomulu.. ayrica pmodew ile birlikte pmwlite adli exe compressor program da geliyor.. artibi ozellik olarak dos4g'ye gore daha hizli calisiyor ancak bu extender ile bazi problemler yasayabilirsiniz.. benim tavsiyem yazdiginiz programlari dog4g ile derleyin.. son dagitim versiyonlarinda extender olarak pmodew kullanin.. 2.2 extender'i nasil degistirebilirim.. extender secimi normalde link edilirken stub denilen ufak bir cekirdegin programin basina eklenmesi ile yapiliyor.. peki bunu nasil degistirebilirim derseniz wlink programina derlerken SYSTEM=$extender$ parametresini gecmeniz gerekli.. bunu yapmaninda daha kolay yolu makefile icinde belirtmeniz.. bunu en iyi yapanlardan biri ise mm adli makefile maker utility'i.. bu util'i inette nerde bulabileceginizi ise yazinin sonuna notlar kismina biraktim.. simdilik extender konusunu geciyorum.. 3. watcom'da daha neler war ?? watcom'da ozellik baya bi fazla.. en son asm komutlarini destekliyor.. en son diyorum cunku asm'yi pentis,486 gibi islemcilere ayirmak bana sacma geliyor.. en son derken en son olay mmx komutlarini isleyebildigini soyleyebilirim.. bi ozellik ise sadece asm komutlari ile makrolar yazabiliyorsunuz.. ve bu hiz istenilen yerlerde cok ise yarayan bir ozellik..mesela bir virtual page (gorsel ekran)'i normal ekrana cizen flip rutinini call etmek cok sacma geliyor bana.. bunun yerine bunu macro olarak yazmak daha mantikli.. ne dedigimi anlamadiysaniz acele etmeyin.. bilmiyom pek isinize yararmi.. watcom windows exeleri ve mfc classlari icinde destek veriyor.. 4. daha daha.. normal c islemlerini zaten yaparsiniz.. ben size simdi bi kac ipucu vereyim.. bir defa turbo c gibi real modda calisan derleyicilerdeki segment ve offset mantigini unutun.. artik tek bir pointer ile 4gb icinde rahatca gezebilirsiniz.. nasil mi ? char * point; dediginizde point icin 4 byte'lik bir dword degisken kullanilir ve bu 4 byte'a tahmin edin en buyuk hangi sayi yazilabilir ??.. simdi bir hesaplayalim.. 0xFF FF FF FF = 4.294.967.295 yapuur.. buda demektirki bu pointer ile 4gb hafizada dolasmak mumkun.. real modda unsigned int'e yazabileceginiz en buyuk deger 65535 buda 64k yani bir segmenttir.. 5. ufaktan asm .. artik watcom'u duzgun olarak kullanabiliyor olmaniz lazim..ve artik size hiz lazim.. ornek olarak asagidaki rutini asm altinda yazmamiz gerekli diyelim.. void flip(char * source,char * dest) { unsigned int count; for(count=0;count<0xFFFF;count++) *(dest++) = *(source++); } aslinda watcom boyle bir rutini genellikle sizinkindan daha hizli calisacak sekilde derler -;)- ama biz genede asm altinda yazalim ki gonlumuz raat olsun.. olay su.. once bir predefine yapiyoruz.. ardindan makromuzu.. void flip(char * source,char * dest); #pragma aux flip= \ "mov ecx,16000" \ "rep movsd" \ modify [esi edi ecx] \ parm [esi] [edi]; #pragma aux'dan sonra fonksiyon adini yaziyorsunuz, sonrasinda asm komutlarini tirnaklar icinde yaziyorsunuz.. ben hem duzgun hemde anlasilir olmasi icin satir sonlarina \ karakteri koyarak yaziyorum.. \ karakteri compiler'a satirin bitmedigini bir sonraki satirin devami oldugunu anlatir.. modify ise yazdiginiz makro icinde degistirdiginiz register'lari belirtiyorsunuz ki compiler **gerekirse** bunlari saklasin die.. parm ile fonksiyon cagrilirken paremetrelerin hangi registerlara koyulacagini belirtirsiniz.. yani macro calismaya basladiginda parametreler isteginiz registry'lara yuklenmis gelir.. bunun optimizasyonu ne kadar arttirdigi konusunda umarim bi kac fikriniz vardir.. unutmamaniz gereken bisi var pragma ile yazdiginiz rutinler macro olarak kullanilir.. bu ne demek yani bir fonksiyon gibi call edilmezler cagirmak yerine kod tekrar yazilir.. bir ornek veriim... --- for vs. donguler -- --- call putpixel -- (call edilir..) --- flip kodu -- (call edilmiyor direk macro kodu yazilir) --- next -- pekala macro degilde fonksiyon olsun istiyosunuz.. o zaman... void setrgb(byte color,byte r,byte g,byte b) { _asm { mov ax,3c8h mov dx,ax mov al,color out dx,al inc dx mov al,r out dx,al mov al,g out dx,al mov al,b out dx,al } } bu sekilde halledebilirsiniz.. 7. walla aklima baska bisi gelmiyo.. gelirse yazarim... sindilik bu kadar... ... minicik tipler.. #pragma off (check_stack) kodun basina bunu yazarsaniz watcom her proc'a girdiginde stack kontrolu yapmak aptalligindan vazgecer....(ha lazım derseniz onu bilmem..) #pragma inline bunu yapmazsaniz pragma komutlari calismaz.. (help'de oyle yaziyo..) ... unutmayacaklariniz.... watcom 32 bittir yani int tipi 32 bittir.. 16 bit kullanmak icin short'u kullanin. watcom korumali modda calisir.. size ait olmayan hafizaya okur/yazarsaniz programiniz gocer ve page fault hatası ile dos'a düşersiniz.. (gerci bu dpmi server'ina bagli, bazilari aldirmiyo bazisi hiieaa!! diyo..) watcom'un editoru yooookkkk... :) eger illa editor ariyorsaniz dn die bi file manager var.. editor olayi cok iyi.. tavsie ederim.. nasil bulurum derseniz altavista'da "Dos Navigator" aratin bulur.. make file maker dediydik.. biyrin.. : http://www.nuri.net/~sylca