  Ŀ
  Ŀ
                                                                          
                         Disk ve Disketler                                
                                                                          
  ٳ
                                                     Semih Hazar            
  




                            DSK BLMLER

                                   

 Ŀ
   Boot Sector (Al Sektr)                                             
 

 Disketlerin ilk sektrne, sabit disklerin her disk blmnn (partition) ilk
 sektrne Boot Sector denir.

   o Disketlerde         0.yzn 0.izinin 1.sektrnde,
   o Sabit disklerde     1.yzn 0.izinin 1.sektrnde

     Boot Sektr bulabilirsiniz.

 Bu sektrde disk(et) hakknda bilgiler ve diski boot etmek iin
 gerekli kod bulunur. imdi boot sektrde bulunan disk(et) parametrelerine
 bakalm:

 ͻ
 Adres  Boy      A                  k      l      a      m      a       
 ͹
  00h  03h   Boot sektrn ilem grecek ilk kodu. Bundan sonra gelen   
             baytlar data olduundan genellikle jmp xx ( EB ?? 90 )     
             kodu ile asl al programna geer.                     
   
  03h  08h   Oem ID. Genellikle disk(et)i formatlayan programn imzas. 
   
  0Bh  02h   Sektr bana den byte sysi. (Genellikle 512 byte)      
   
  0Dh  02h   Cluster bana den sektr says.                        
   
  0Eh  01h   letim sistemi iin ayrlm zel sektr says.          
   
  10h  01h   Fat (Faile Allocation Table) kopya says. (Aaya bakn) 
   
  11h  02h   Ana dizin iin maximum dosya says.                       
   
  13h  02h   Toplam sektr says. *                                    
   
  15h  01h   Medya tanmlayc bayt.                                    
             F8h : Sabit Disk.                                          
             FEh : 5.25" 160 kilobyte'lk disket.                       
             FFh : 5.25" 320 kilobyte'lk disket.                       
             FCh : 5.25" 180 kilobyte'lk disket.                       
             FDh : 5.25" 360 kilobyte'lk disket.                       
             F9h : 5.25" 1220 kilobyte'lk disket.                      
                   3.5" 720 kilobyte'lk disket.                        
             F0h : 3.5" 1440 kilobyte'lk disket.                       
                   3.5" 2880 kilobyte'lk disket.                       
   
  16h  02h   FAT bana den sektr says.                            
   
  18h  02h   z bana den sektr says.                             
   
  1Ah  02h   Yz says.                                                
   
  1Ch  04h   zel , sakl sektr says.                                
   
  20h  04h   En byk sektr says. *                                  
   
  24h  01h   Fiziksel src numaras.                                  
   
  27h  04h   Disk(et) in seri numaras.                                 
   
  2Bh  0Bh   Disk(et) etiketi.                                          
   
  36h  08h   Fat tipi. ( FAT12 = 12 bitlik FAT, FAT16 = 16 bitlik FAT ) 
   
  * 13h adresindeki toplam sektr saysn belirten word disketler iin   
    ( Daha dorusu toplam sektor says 1 word gemeyen deerler iin)   
    20h adresindeki toplam sektr saysn belirten DoubleWord ise daha   
    byk deerler iin kullanlr.                                       
    Kullanlmayan adreste 0 deeri bulunur                                
 ͼ

 Gelelim boot programna: Eer disk(et)te sistem ykl ise bu boot program
 disk(et)in 2. cluster'ndaki IO.SYS dosyasn ileme sokar.
 Ama eer bu disket bir sistem disketi deilse ok tandk bir mesaj ile
 bizden bir sistem disketi takmamaz ister.

 Aada rnek bir program listesi var. Bu program A: srcsndeki diskete
 yeni bir boot program kopyalar. Bu bir rnek olduu iin hata kontrlol
 vb. yoktur.

  ornek1.asm Ŀ
 .model  tiny                                                              
 .code                                                                     
 org     100h                                                              
 main:   mov  ax,0201h         ; Int 13h 'n 2.fonksiyonu=okuma,1 sektr.  
         mov  bx,offset buffer ; es:bx=bilginin tanaca buffer adresi.  
         mov  cx,0001h         ; 0.track,1.sector=boot sector.             
         mov  dx,0000h         ; 0.yz,0.src=a:                         
         int  13h              ;                                           
         cmp  ah,0             ; hata kodu=0 ise hataYok                   
         jz   hataYok          ;                                           
         cmp  ah,06h           ; disket deiiklii nedeni ile okunamyorsa
         jz   Dene             ; tekrar dene..                             
         mov  ah,4ch           ; program bitir.                           
         int  21h                                                          
 HataYok:mov  si,offset buffer+0bh                                         
         mov  di,offset dInfo  ; Oem Id 'den sonraki disket                
         mov  cx,52            ; parametrelerini yeni boot programna      
         rep  movsb            ; kopyala.                                  
         mov  ax,0301          ; Int 13h 'n 2.fonksiyonu=yazma,1 sektr.  
         mov  bx,offset BootPr ; es:bx=yazlacak bilginin buffer adresi.   
         mov  cx,0001h         ; 0.track,1.sector=boot sector.             
         mov  dx,0000h         ; 0.yz,0.src=a:                         
         int  13h              ;                                           
         mov  ah,4ch                                                       
         int  21h                                                          
 Dene:   mov  ax,0201h         ; Int 13h 'n 2.fonksiyonu=okuma,1 sektr.  
         mov  bx,offset buffer ; es:bx=bilginin tanaca buffer adresi.  
         mov  cx,0001h         ; 0.track,1.sector=boot sector.             
         mov  dx,0000h         ; 0.yz,0.src=a:                         
         int  13h              ;                                           
         cmp  ah,0                                                         
         jz   HataYok                                                      
         mov  ah,4ch                                                       
         int  21h                                                          
 Buffer  db   512 dup(0)                                                   
                                                                           
 BootBeg label Word                                                        
 BootPr  proc near                                                         
         jmp  short Bbegin                                                 
         db   90h                                                          
         db   'PCW - Ps'       ; Oem Id                                    
 dInfo   db   52 dup(0)        ; Disket parametreleri.                     
 bBegin: mov  si,mesaj                                                     
         push cs                                                           
         pop  ds                                                           
         call yaz              ; Mesaj yazdr.                            
         xor  ax,ax            ; Tu bekle.                                
         int  16h                                                          
         int  19h              ; Resetle.                                  
 yaz:    lodsb                                                             
         cmp  al,0                                                         
         jz   yBitti                                                       
         mov  ah,0eh                                                       
         xor  bh,bh                                                        
         int  10h                                                          
         jmp  yaz                                                          
 yBitti: ret                                                               
                                                                           
 Mesaj   equ ( $ - BootBeg ) + 7c00h                                       
         db   13,10,'PC World/Trkiye < Programlama Sanat >'              
         db   13,10,'rnek program no : 1'                                 
         db   13,10,'Bu bir sistem disketi deildir.'                      
         db   13,10,'Ltfen bir sistem disketi takp bir tua basnz.'    
         db   13,10,13,10,9,9,' Semih Hazar ',9,9,13,10,0                  
         db   512 - 2 - ( $ - BootBeg ) dup (0)                            
         db   055h,0aah        ; Boot Sektrn bittiini belirten word.    
 BootPr  endp                                                              
 end     main                                                              
 

 Yukardaki listede geen "Mesaj   equ ( $ - BootBeg ) + 7c00h"
 deimine aklk getirelim:

 o Bilgisayar alp hafza vb testleri yaplp Int 19h arldnda
   ilk nce bios 'da belisrtilen "bootable" yani bilgisayar aan srcnn
   boot sektrn okur ve hafzann 0000:7c000 adresine kopyalayp CS ve IP
   yi 0000:7c00 adresini gsterecek ekilde ayarlar. Yani yukardaki programda
   BootBeg adresi 7c000 olacaktr.



                                     


Ŀ
  Directory (Fihrist)                                                       


 Dosyalarn isimlerini, boylarn, zniteliklerini, tarihlerini, saatlerini
 ve balang cluster'larnn depoland alandr. Bu alan 32'er baytlk
 gruplar halinde bulunmaktadr.

 Her 32 bayt'lk alann ierii aadaki gibidir :

 Ŀ
  lk Onbir bayt dosya ismi. (8 karakter dosya ad, 3 karakter uzants)   
 Ĵ
  Bundan sonra znitelik (attribute) bayt vardr.                         
      1                                                                    
      2 6 3 1                                                              
      8 4 2 6 8 4 2 1                                                      
     Ŀ                                                     
     00000000                                                     
                                                          
             > ReadOnly   - Yalnz okunabilir dosya.       
            > Hidden     - Sakl dosya.                   
           > System     - Sistem dosyas.                
          > VolumeID   - Disk(et) etiketi.              
         > Directory  - Dizin.                         
        > Archive    - Normal ariv dosyas.          
       > Kullanlmyor.                              
      > Kullanlmyor.                              
 Ĵ
  Buradaki 10 bayt kullanlmyor.                                          
 Ĵ
  ki bayt dosyann zaman.                                                
 Ĵ
  ki bayt dosyann tarihi.                                                
 Ĵ
  ki bayt dosyann datalarnn yerletirilmi olduu LK cluster numaras.
  dosyann hangi cluster'larda devam ettii ya da bittii FAT'da           
  iaretlenir. ( Aaya bakn )                                           
 Ĵ
  Drt bayt dosyann boyu.                                                 
 


                                 


Ŀ
  FAT, File Allocation Table (Dosya Yerleim Tablosu)                       


 Yukarda bahsettiim gibi dosyalarn balang cluster' Directory alannda
 belirtilir. Dosyann hangi cluster'larda devam ettii ise FAT'da belirtilir.
 Burada vereceim rnekler FAT16 tipi ile belirtilen 16 bitlik
 FAT'lar iin geerlidir.

 Ŀ
 FAT'in ilk bayt medya tanmlayc iin ayrlmtr.              
 (Boot sektrdeki aklamaya bakn)                                
 Ĵ
 Bundan sonra FF FF FF gelmektedir. FAT'n baladn belirtir.   
 

  Dosya silinmeden nce ͻ
                                                                          
          ͻ                     
              D  i  r  e  c  t  o  r  y                                 
          ͹                     
           DENEME.TXT  008500 byte  clus# 0002     >Ŀ              
          ĺ                    
    < DENEME.BAK  000450 byte  clus# 0004                         
         ͼ                    
                                                                        
                                                                        
                                                                        
         ͻ                    
                File  Allocation  Table                               
         ͹                    
           N O    Word ve bu word 'n aklamas                     
         ĺ                    
           02h   0003h ( Bu 02 nolu fat girii , <              
                       dosya nc cluster 'da                       
                       devam ediyor.)            >Ŀ              
         ĺ                    
           03h   0005h ( Dosya 05 nolu cluster   <              
                       da devam ediyor.)         >Ŀ              
         ĺ                    
    >  04h   ffffh ( Dosya sonu )                                
          ĺ                    
            05h   ffffh ( Dosya sonu )            <              
          ͼ                     
                                                                          
  Cluster #2, #3, #5'e DENEME.TXT dosyasnn datalar ,                   
  Cluster #4'e DENEME.BAK dosyasnn datalar yerletirilir.              
                                                                          
 ͼ
  Dosya silindikten sonra ͻ
                                                                          
          ͻ                     
              D  i  r  e  c  t  o  r  y                                 
          ͹                     
           ENEME.TXT  008500 byte  clus# 0002                          
          ĺ                     
           ENEME.BAK  000450 byte  clus# 0004                          
          ͼ                     
                                                                          
                                                                          
                                                                          
          ͻ                     
                 File  Allocation  Table                                
          ͹                     
            N O    Word ve bu word 'n aklamas                      
          ĺ                     
            02h   0000h ( Kullanlabilir )                             
          ĺ                     
            03h   0000h ( Kullanlabilir )                             
          ĺ                     
            04h   0000h ( Kullanlabilir )                             
          ĺ                     
            05h   0000h ( Kullanlabilir )                             
          ͼ                     
                                                                          
  Dosya silindiinde sadece ad ve FAT deiir, yani dosyalarn kulland 
  data alan deimez. Bu yzden silinen dosyalar kurtarlabilir.         
                                                                          
 ͼ

 Bylece hem FAT'n nasl kullanldna hem de Del komutunun nasl
 altna gz atm olduk.

 Bir dosya yaratlmak istendiinde ilk nce bo (kullanlabilir) FAT alan
 aranr. Bulunduunda directory'ye dosya ad vb gibi bilgiler yazlr,
 balang cluster' olarak da ilk kullanlabilir FAT alannin numaras
 yazlr. Daha sonra dosyann kanc cluster(lar)da devam ettii yada
 bittii FAT'e ilenir. En son olarak dosyann ierii data alanna
 yazlr.


                                  



                             DSK LEMLER


 Disk ile ilgili ilemlerden bahsettikten sonra disk(et)ten veri okuma
 ve veri yazdrma iin kullanlan Int 13h 'n da parametrelerini ve
 kullanln aadaki tabloda bulabilirsiniz.

 Ŀ
  Int 13h Fonksiyon 02h = Veri okuma                                      
 Ĵ
  Giri  :  ah = 02h                                                      
            al = Okunacak sektr says. *                                
         es:bx = Verilerin aktarlaca buffer adresi.                    
            cx = Sektr ve iz numaras. **                                
            dh = Yz no.                                                  
            dl = Fiziksel src numaras.                                
  k  :  Carry flag 1 ise ah = Hata kodu. ***                         
                   aksi halde ah = 0                                      
 

 Ŀ
  Int 13h Fonksiyon 03h = Veri okuma                                      
 Ĵ
  Giri  :  ah = 03h                                                      
            al = Yazdrlacak sektr says. *                            
         es:bx = Yazdrlacak burrefn adresi.                            
            cx = Sektr ve iz numaras. **                                
            dh = Yz no.                                                  
            dl = Fiziksel src numaras.                                
  k  :  Carry flag 1 ise ah = Hata kodu. ***                         
                   aksi halde ah = 0                                      
 
  * :  Okunan / yazlan btn sektrler ayn yz ve iz zerinde olmas
       gerekir. Yani 18 sektr/iz 'lik bir diskette rneklerdeki gibi bir
       okuma / yazma YAPILAMAZ !

      Ŀ
       mov ah,02     mov ah,2    
       mov al,20     mov al,15   
       mov bx,200h   mov bx,200h 
       mov ch,0      mov ch,0    
       mov cl,1      mov cl,10   
       mov dx,0      mov dx,0    
       int 13h       int 13h     
                                 
      
                           
  Ŀ    Ŀ
  0. iz , 1.sektrden      0. iz , 10.sektrden  
  itibaren 20 sektr       itibaren 15 sektr    
  oku.                     oku.                  
    

 ** :  Ŀ
          ͻ
       >  00000000  00000000 
           ͹
               CH       CL     
            T r a c k s  Sectors

       CH'n tamam ve CL'nin son iki biti iz says iin,
       CL'nin geri kalan bit'leri ise sektr numaras iin ayrlmtr.
       z numaras 255'ten kk olduu zaman CL'yi kullanmaya gerek yoktur.
       z ve sektr numaralarn AX'e aktarmak iin aadaki assembly
       rutinlerini kullanabilirsiniz.

       Ŀ
       GetTrack  proc near    
                 mov  al,ch   
                 xor  ch,ch   
                 shr  cl,6    
                 mov  ah,cl   
                 ret          
       GetTrack  endp         
                              
       GetSector proc near    
                 shl  cl,2    
                 shr  cl,2    
                 mov  al,cl   
                 xor  ah,ah   
       GetSector endp         
       


*** :  Aada en ok lzm olabilecek hata kodlar verilmitir:

 Ŀ
    00h       Hata Yok                                      
    01h       Geersiz komut.                               
    03h       Yazma koruma hatas.                          
    04h       Sektr bulunamad.                            
    80h       Src hazr deil.                           
    cch       Yazma hatas ( Sabit diskler iin)            
 


                            


 Sorularnz, sorunlarnz, nerileriniz ve yeni kurduumuz gruba
 (Prizma) katlmak isteyenler iin adresim:


             Semih Hazar

             Muhittin Mah Fsunolu Paa Cad.
             Yuvam 2-B Yap Koop.  No: 43/15
             orlu / Tekirda