;Program Yazm.: CIWATAĝ   -   Hre Productionĝ
;Program Tarih .: 27-5-1998
;Acklama.: Program bellege yerlesip F12 tusu ile 320x200 grafik ekrani
;           yakalayip aktif dizine kopyalar. 
;Program ikinci cagrilisinda bellekte yukluyse bellekten cikar.       
;Dosyalari gormek icin dosya adina parametre olarak girilmesi yeterlidir..
model small                      ; model tanimi
codeseg                          ;segment tanimi
org 100h                         ;baslangic cs:ip
reyhan:jmp tsr                   ;program baslangici atla tsr
foku dw 32000                    ;Dosyadan ilk okunacak adet
soku dw 32768                    ;dosyadan ikinci okunacak adet
fyaz dw 15616                    ;ilk yazilacak adet /2 
syaz dw 16384                    ;ikinci yazilacak adet /2
resim dw                         ;acilacak bufferin segment adresi icin
eski dd                          ;eski kesme adresi icin
dosno dw                         ;acilan dosyanin handle icin
ebas proc                        ;ekrana dosyayi basan procedure
        mov ax,0a000h            ;grafik ekran baslangic segment adresi
        mov es,ax                ;movsw ile DS:SI dan ES:SI ya tasima 
        mov ds,resim             ;DS ye resim in bulundugu segment veriliyor
        rep movsw                ;ES ye tasinacak olan yerin segmenti
        ret                      ;tasima yapilip procedureden cagrilan yere
ebas endp                        ;donuluyor
oku proc                         ;Dosyadan buffer e veri okuyan procedure
        mov ah,3fh               ;Dosya ac fonksiyonu
        mov bx,dosno             ;dosya handle nosu
        mov ds,resim             ;verilerin depolanacagi segment adres
        mov dx,0                 ;verilerin depolanacagi offset adres baslangici
        int 21h                  ;kesme
        jnc rey                  ;eger hata yoksa git rey
        jmp hata2                ;hata ya git
rey:    ret                      ;procedureyi terket
oku endp                         ;procedure bitisi
dosya db 'hre-1',0               ;Acilacak ilk dosya adi
say db 0                         ;Kayit edilen dosya sayisi icin degisken
    db ' adet dosya kaydedildi..',10,13
    db 'Program bellekten atld..',10,13
    db 'Dosya adn parametre olarak verin',10,13
mes db 'Hre Productionĝ inc..$'  ;mesajlar ve
con db 9                         ;ikinci yukleme kontrolu icin degisken
sta:    sti                      ;hafizada kalici kisim baslangici int.set
        pushf                    ;flaglari sakla
        call cs:eski             ;eski kesmeyi cagir
                                 ;donuste popf yi verdi call komutu
        push ax                  ;tum registerleri sakliyoruz
        push bx
        push cx
        push dx
        push si
        push di
        push ds
        push es
        push bp
        push ss
        pushf                    ;flaglarida
        
        in al,60h                ;klavye portundan veri al
        cmp al,58h               ;alinan veri F12 
        jne bit                  ;degilse bit

        mov ax,40h               ;ekranin o anki modu 0040:0049 ta bulun
        mov es,ax                ;dugu icin 
        
        cmp byte ptr es:[49h],13h;ES ye segment adres verilip 49h taki veriyi
        jne hata                 ;al 13. mod degilse hata ver. 320x200 

        push cs                  ;code segmenti  
        pop es                   ;es ye esitle
        push cs                  ;code segmenti  
        pop ds                   ;ds ye esitle
        
        mov ax,1017h             ;o anki gecerli palet aliniyor
        mov bx,0                 ;baslangic renk 0
        mov cx,256               ;renk adeti
        mov dx,offset palet      ;okunan paletin konacagi buffer
        int 10h                  ;kesme

re:     mov ah,3ch               ;dosya ac
        mov dx,offset dosya      ;dosya adi
        mov cx,1                 ;read only modunda
        int 21h                  ;kesme
        jnc f                    ;hata yoksa git f
        cmp byte ptr [dosya+4],'9';buraya gelindiyse dosya acilamadi
        je  hata                 ;dosya demekki daha once acilmis
        inc byte ptr [dosya+4]   ;dosya adi degistirilip tekrar deneniyor
        jmp re                   ;degilse tekrar tekrar eger 9. dosya ise
                                 ;hata ver. read-only acmamin nedeni buydu
f:      xchg bx,ax               ;acilan dosyanin handle nosu 
        
        mov ah,40h               ;okunan paleti 
        mov dx,offset palet      ;dosyaya yaz
        mov cx,768               ;yazilacak byte adeti 256*3
        int 21h                  ;kesme
        
        mov ax,0a000h            ;ekrandaki goruntuyu bu satirlarda
        mov ds,ax                ;acilan dosyaya yaziyoruz
        mov ah,40h               ;yazilacak bilgi segment adresi DS de
        mov dx,0                 ;offset adresi DX te ve 0
        mov cx,64000             ;yazilacak byte adeti 320x200
        int 21h                  ;kesme
        
        inc byte ptr [say]       ;dosya yazildi sayac bir arttiriliyor 
        
        mov ah,3eh               ;dosyayi kapat
        int 21h                  ;kesme
        jmp bit                  ;atla bit

hata:   mov ah,0eh               ;hata durumunda 
        mov al,7                 ;burada beep sesi ile islem 
        int 10h                  ;bitiriliyor

bit:    popf                     ;saklana flaglari al
        pop ss                   ;saklanan registerleri al
        pop bp
        pop es
        pop ds
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        retf 2                   ;kesmeden cik
palet db 768 dup(?)              ;palet verisinin bulunacagi buffer 256*3=768
hata1: lea dx,yok                ;verilen dosya bulunamadiysa 
       mov ah,9                  ;burada mesaj basilip cikiliyor
       int 21h                   ;kesme
       int 20h                   ;programi terket
hata2: lea dx,myo                ;memory yetersiz ise
       mov ah,9                  ;mesaj ver ve
       int 21h                   ;programdan cik
       int 20h                   
tsr:                             ;programi yukleyen kisim
      mov al,es:[80h]            ;eger parametre verildiyse
      cmp al,0                   ;yani 0 degilse
      jne @6                     ;git @6
      jmp yuk                    ;verilmediyse git yuk
      xor bx,bx                  ;bx sayac olarak kullanilacak
@6:   mov al,byte ptr [82h+bx]   ;verilen parametrenin sonunda 13 enter
      inc bx                     ;bulunuyor
      cmp al,13                  ;bunu bulup yerine 0 yaziyoruz
      jne @6                     ;tekrar
      mov byte ptr [82h+bx-1],0  ;0 i yaz. dosya adinin 0 ile bitmesi gerekiyor
      
      mov ah,3dh                 ;verilen dosyayi ac
      mov dx,82h                 ;dosya adinin bulundugu offset adres
      mov al,0                   ;okuma modunda ac
      int 21h                    ;kesme
      jc hata1                   ;hata varsa git
      mov dosno,ax               ;dosya handle i aliyoruz
      
      mov ah,4ah                 ;memory deki alan kisitlaniyor
      mov bx,100                 ;program uz.+256+2/16
      int 21h                    ;kucultme islemi tamam
      jc hata2                   ;hata varsa git
      
      mov ah,48h                 ;memory isteminde bulnacagiz
      mov bx,2050                ;32768 bytelik yer istiyoruz
      int 21h                    ;kesme
      jc hata2                   ;hata varsa git
      mov resim,ax               ;verilen memory segment adresi

        mov cx,foku              ;32000 bytelik veri okunup
        call oku                 ;resim bufferine yaziliyor
        
        mov ax,13h               ;ekran modu 320x200 13 e aliniyor
        int 10h                  ;kesme
        
        push cs                  ;ds yi
        pop ds                   ;cs ye esitle
        
        mov ax,1012h             ;dosyanin ilk 768 byte i palet verisini
        mov cx,256               ;barindiriyordu. Bunu alip tekrar 
        mov bx,0                 ;palet belirliyoruz. 256 adet renk baslangic
        mov es,resim             ;renk 0 palet bilgisinin bulundugu segment 
        mov dx,0                 ;alan resim offset alan 0
        int 10h                  ;kesme palet ayarlandi..
        
        mov cx,fyaz              ;dosyanin ilk 768 i paletti. Bundan sonrasi
        mov si,768               ;resim verisi 32000 okumustuk 32000-768=31232
        mov di,0                 ;veri kaldi. ikser yazacagimiz icin 31232/2=15616
        call ebas                ;bunu cx e verip yazilacak veri baslangici 768 den
                                 ;sonra basliyor ve ekrana basiyoruz.
        mov cx,soku              ;dosyada kalan 32768 byte bunu cx e verip
        call oku                 ;bunu da okuyoruz
        
        mov cx,syaz              ;okunani yine ikiser ikiser yazacagimiz icin 16384
        mov si,0                 ;sayisini cx e verip alinacak verilerin bulundugu 
        mov di,31232             ;adresi si ya 0 yazilacak offset adresi di ya 31232
        call ebas                ;verip ekranin diger yarisina kalan kisim basiliyor

        xor ax,ax                ;ekran da resim duruyor ve biz herhangi bir
        int 16h                  ;tusun aktif olup olmadigini kontrol ediyoruz
        mov ax,3                 ;eger basildiysa ekran 25x80 text e gecip
        int 10h                  ;programi terkediyoruz.
        
        mov ah,49h               ;terketmeden once actigimiz yeri
        mov es,resim             ;geri veriyoruz yoksa cannot load command.com
        int 21h                  ;system halted..
        
        
        int 20h                  ;programi terket
        

yuk:    mov ax,351ch             ;1ch kesme adresini oku
        int 21h                  ;kesme
        mov al,byte ptr [bx-1]   ;bizim program daha once yuklenmismi
        cmp al,con               ;degilse
        jne yukle                ;yukle

     push ds                     ;yuklendiyse geri yukle yapiyoruz
     mov ax,es                   ;cs ds esitle
     mov ds,ax                   ;
     sub bx,114                  ;kac resim kaydedildigini sayactan 
     add byte ptr es:[bx],30h    ;alip desimale cevirip
     mov dx,bx                   ;bunu ekrana basiyoruz
     mov ah,9                    ;basilacak mesajin offset adresi
     int 21h                     ;kesme
     pop ds                      ;geri al 
     
     lds dx,es:[eski]            ;eski kesme adresi degiskenden alinip 
     mov ax,251ch                ;yerine yaziliyor.
     int 21h                     ;kesme
     push es                     ;sakla
     mov ax,es:[2ch]             ;tsr kisimin segmen adresini al
     mov es,ax                   ;programimiz burada bellekten siliniyor
     mov ah,49h                  ;yeri bosalt
     int 21h                     ;kesme
     pop es                      ;geri al
     mov ah,49h                  ;environment alaninida bosalt
     int 21h                     ;kesme
     
     int 20h                     ;programi terket
yukle:     
     mov ax,351ch                ;1ch kesme adresini oku
     int 21h                     ;kesme
     cli                         ;clear interruption flag
     lea si,eski                 ;okunan adresi degiskene at 
     mov [si],bx                 ;offset adresi
     mov [si+2],es               ;segment adresi
     mov ax,251ch                ;bizim programin baslangic adresini oraya
     lea dx,sta                  ;yaz
     int 21h                     ;kesme
     mov ah,9                    ;yuklendi mesajini ver
     lea dx,ok                   ;mesaj adresi
     int 21h                     ;kesme
     lea dx,tsr                  ;yukleme kisim adresini verip
     int 27h                     ;bellege yukleniyoruz..
yok db 'Dosya bulunamad..$'
myo db 'Memory hatas..$'
ok db 'F12 320x200 grafik capture..',10,13
   db 'Hre productionĝ inc.. CIWATAĝ$'
end reyhan     
