   Ŀ
Ŀ
  
                                                                            
                             TSR Programlar                                 
                                                                            
  Kaan Aslan  

   



  Merhaba, naslsnz? Havalar ne kadar scak deil mi? Sular sizde de
  akmyodur herhalde... Evet havadan, sudan da bahsettiimize gre konuya
  girebiliriz artk.

  Memory resident programlar hakknda nce unu sylemeliyim. Bu programlar
  ok, ama ok dikkatli yazmalsnz! nk, en ufak bir hata yaparsanz
  "memory resident" deil de "memory resildent" (yani bellii rezil eden
  programlar) olurlar ve ondan sonra ekeceiniz var mazallah!... (Ben de
  kendime gre espri yapyorum ite; ama itiraf edin bu scak gnler de iyi de
  gidiyor...) Biraz ciddileerek konuya gerekten girelim...

  Yazlarm takip edenler bilirler, daha nce de bellekte kalan programlarla
  ilgili bir makale yazmtm. Bellekte kalan programlar yazmann zor olan
  taraf, programn bellekte kalabilmesi deil. Bellekte kaldktan sonra
  birtakm iler yapabilmesi. DOS'ta bir prosesi sonlandran birka tane kesme
  var. Bu kesmelerden bir blm bellei boaltarak, bir blm de bellei
  boaltmadan prosesi sonlandryorlar.

  Bellei boaltarak prosesi sonlandran kesmeler:

   
   [1] Int 20H
   
       Bu kesmeyi eski programlar kullanrlard, imdi tavsiye edilmiyor.
       CS yazmacnn, PSP'yi gstermesi gerekir.

   
   [2] Int 21H, Function:00H
   
       Bu da kendi iinde INT 20H ' aryor. Programclar bunu da tercih
       etmiyorlar.

   
   [3] Int 21H,  Function: 4CH
   
       En fazla tercih edilen fonksiyon budur. C'deki exit() fonksiyonu da
       temel olarak bu kesmeyi err.


  Bellei boaltmadan prosesi sonlandran kesmeler:

   Bellekte kalan programlardan bu ekilde kmak gerekir. Yani, bir programn
   bellekte kalabilmesi iin yalnzca k kesmesinin deitirilmesi yeter.
   Bu kesmelere ve bu kesmeler kullanlarak bellekte kalan programlara TSR
   (terminate and stay resident) de denmektedir.

   
   [1] Int 27H
   
       Bu kesme uyumluluk problemi yznden tercih edilmez.

   
   [2] Int 21H, Function: 31H
   
       TSR programlarn kulland kesme budur. AH: 31H, AL: DOS'a dn
       deeri, DX ise bellekte kalacak paragraf miktarn gstermektedir. Bu
       kesme, DOS altnda alan C derleyicilerinde keep fonksiyonu biiminde
       ktphanelerde bulunmaktadr: keep fonksiyonun prototipi yle:

            void keep (void status, int size);

       status; DOS'a dn deerini, size ise bellekte kalacak paragraf
       saysn gstermektedir (1 paragraf = 16 byte). Demek ki, C'de bir
       programdan exit(a) ile deil de keep(a, n) ile karsak program
       bellekte kalyor.

  TSR programlarn TSR programlar yapan, kontrol gerektiinde ele
  almasdr. Kontroln nasl ele alndn anlamak iin, bir kesme geldiinde
  mikroilemcinin davrann incelememiz gerekiyor. Bir kesme geldiinde
  (yani INT komutu), mikroilemci INT komutunun iinde u ilemleri yapar:

         1  PUSHF        (Bayrakler yna)
         2  CLI, CLT     (Interrupt ve Trap Flag temizlenir.
         3  PUSH CS      (CS yna)
         4  PUSH IP      (sonraki komutun adresi yna )
         5  Kesme numaras 4 ile arplr, kesme vektrnden, kesmenin
             balang adresi CS ve IP yazmalarna alnr.

  Burada bizim iin en nemli nokta bir kesme gelince gidilecek yerin kesme
  vektrnden alnddr. Kesme vektr nerede midir? Bellein tam tepesinde,
  yani 00000H da. Uzunluu mu ne kadardr? Yahu ne ok soru soruyorsunuz!...
  (aka tabii.. Sorun, sormazsanz renemezsiniz ki!..)
  Uzunluu 256 * 4 = 1024 byte'tr. nk toplam 256 kesme var ve herbiri 4
  byte adrese sahip (2 byte CS ve 2 byte IP). Bir de aklnza u soru
  gelebilir, siz sormadan ben soraym; kesme vektrn kim oluturuyor?
  letim sistemi (DOS) tabii, baka kim olabilir?...

  Bir kesmeden dn IRET ile yaplmaldr. nk IRET

             POP IP
             POP CS
             POPF

  ile geri dner.

  stediimiz bir kesmenin adresini kesme vektrnden alan ve kesme vektrne
  istediimiz bir adresi yerletiren iki tane DOS kesmesi var, bunlar:

            INT 21H, Function: 35H  Get interrupt vector
            INT 21H, Function: 25H  Set inbterrupt vector

  Bu kesmelerin de C ktphanelerinde fonksiyonlatrlm halleri var:

         void interrupt (*getvect(int intno)) (void);
         void setvect(int intno, void interrupt (*) (void));

  getvect fonksiyonunun geri dn deeri, geri dn deeri void interrupt,
  parametresi void olan bir fonksiyon gstericisidir. setvect ise parametre
  olarak byle bir fonksiyon gstericisi alr.

  Borland derleyicilerinde interrupt anahtar szc, fonksiyondan kn RET
  ya da RETF deil de IRET olmasn salar.

  Bu hazrlklardan sonra TSR programlar iin ok nemli olan birka kesme
  grelim:

  KONTROL ELE GERMEY SALAYAN DONANIM KESMELER

[1] 8H Timer

  Bu kesme saniyede 18.2 kere arlr. Temel olarak sistemin zamann
  deitirmek ve floppy motorunu durdurmak amacyla kullanlmaktadr. TSR
  programlarnn ou kendi adreslerini vektrde 8H yerine yazarlar ve
  bylece, periyodik olarak kendilerinin arlmasn salarlar. 8H kendi
  iinde bo bir kesme olan INT 1CH' armaktadr. Neden mi? TSR yazmaya
  alan vatandaa kolaylk olsun diye herhalde...

[2] 9H Keyboard

  Klavyede her tua bastmzda ve elimizi ektiimizde 9H kesmesi erlr.
  9H baslan tuun ASCII ve SCAN kodunu klavye tampon blgesine (keyboard
  buffer) yazar. Bu yazma ilemi yalnzca tua basldnda yaplr. Elimizi
  tutan ekince 9H arlr fakat tampona yazlmaz. zetle, bir tua
  bastmzda donanm yoluyla 9H arlr ve baslan tu tampona yazlr.
  Biz baslan tuu dorudan tampondan alabiliriz. Zaten 16H kesmesi ve dahi C
  fonksiyonlar bunlar hep tampondan almaktadr.

  Klavye tampon blgesi bellein 1050. byte'ndan balar. Tampon dngsel bir
  biimdedir. Tamponun ban BA GSTERC, sonunu da SON GSTERC
  tutmaktadr. 9H kesmesi BA GSTERC'nin gsterdii yere baslan karakterin
  ASCII ce SCAN kodunu yerletirir; SON gstericiyi 1 arttrr. Tampon
  blgesini zetlersek:

            1050-1051: BA GSTERC
            1052-1053: SON GSTERC
            1054-      TAMPON BLGES.


  TSR programlarnn ana fikri udur: 8H ya da 9H kesmesinin vektrden
  adresini kendi parogrammza ynlendirmek.

  Diskette verdiimiz 3 rnekte kullandmz fonksiyonlar ve deikenler iin
  biraz aklama yapalm:


- void _writes(int row, int col, char *str)

  Ekranda belli bir satr ve stundan balayarak bir stringi yazmak iin
  kullanlmaktadr. String dorudan ekran belleine yazlyor.


- long far *tick  = (long far *tick) 0x0040006c;

  Timer tick blgesidir. Her 8h arldnda buradaki long int say 8h
  tarafndan bir arttrlr. Timer kesmesi saniyede 18.2 kere arlmaktadr.


- char far *vp = (char far *) 0xb8000000;

  Ekran belleinin balang adresini gsteriyor. Mono modda alyorsanz bu
  deeri 0xb0000000 yapmanz gerekir.


- int get_last_buffer(void)

  Klavye tamponu bosa 0 deerine, doluysa tampondaki karakterin ASCII ve SCAN
  koduna geri dnyor.


- void (far *reset) (void) = (void (far *) (void)) = 0xFFFF0000;

  arldnda reset ilemi yapacak olan fonksiyon gstericisidir. Reset
  durumunu hatrlayn:

           CS: FFFFH
           IP: 0000H


  SON SZ

  Bu aylk bu kadar. Bu arada dernee de bekleriz!
  Gelin, bir aymz iin...


              C ve Sistem Programclar Dernei

            TELEFON:
              (0212) 288 36 31 - (0212) 288 35 20

            ADRES:
              kinci Taoca Cad. Ouz Sok No:5/2
              Kat: 4
              Mecidiyeky / stanbul