TITLE    Program arka planda mouse tuslarini kullanarak klavyeyi
TITLE    aktif veya pasif hale getiriyor..     CIWATAø    6-2-98
MODEL SMALL                     ;kullanilacak memory tipi
CODESEG                         ;code segment baslangici
ORG 100H                        ;baslangic adres
KOL:JMP TSR                     ;yukleme kismina atla
MESAJ   DB 'Keyboard off',0
MESA    DB 'Keyboard  on',0 
MES     DB 'Program removed..$'
CIK     DB 'This program requires Mouse..$' 
LOP     DB ' Right button keyboard off',10,13,
        DB 'Right Left button keyboard on',10,13,
        DB 'Written by CIWATAø \r\ Hre Productionø$'  
ESKI    DD                      ;eski interrupt adresi saklamak icin degisken
CON     DB                      ;geri yuklemeyi gerceklestirmek icin degisken
PRO PROC                        ;memoryde calisacak programin baslangici
        STI                     ;interruptlar
        PUSH AX                 ;tum registerleri sakla
        PUSH BX
        PUSH CX
        PUSH DX
        PUSH ES
        PUSH SI
        PUSH DS
        PUSH DI
        PUSH BP
        MOV AX,3                ;mouse tus ve koordinat bilgilerini al
        INT 33H                 ;mouse kesmesi
        PUSH CS                 ;code segmentini 
        POP DS                  ;data segmentine esitle
        CMP BX,3                ;cift tusa basilirsa
        JE  OPEN                ;sicra open
        CMP BX,2                ;sag tusa basilmaz ise
        JNE BIT                 ;sicra program bitisine
        SUB BX,BX               ;ekran sayfasi 0
        MOV AH,3                ;kursor pozisyonlarini al
        INT 10H                 ;ekran kesmesi
        PUSH DX                 ;pozisyonlari sakla
        MOV AH,2                ;kursoru pozisyonla
        MOV DX,0067             ;satir ve sutun 
        INT 10H                 ;ekran kesmesi
        MOV AH,0EH              ;ekrana karakter bas ve kursoru bir ileri al
        MOV SI,OFFSET MESAJ     ;basilacak karakter katari offset adresi
@1:     MOV AL,BYTE PTR [SI]    ;basilacak ilk harfi al 'AL' ye ver
        INC SI                  ;ikinci harfin yerini bul
        INT 10H                 ;ekran kesmesi
        CMP AL,0                ;karakter katarinin sonunda 0 var 
        JNE @1                  ;0 ile karsilasirsan donguden cik
        MOV AL,0F0H             ;Klavyeyi aktif hale getir
        MOV DX,60H              ;klavye portu
        OUT DX,AL               ;porta veriyi gonder
        JMP KUR                 ;isimiz bitti. Sicra kur
OPEN:   SUB BX,BX               ;ekran sayfasi 0
        MOV AH,3                ;kursor pozisyonlarini al
        INT 10H                 ;ekran kesmesi
        PUSH DX                 ;pozisyonlari sakla
        MOV AH,2                ;kursoru pozisyonla
        MOV DX,0067             ;satir ve sutun 
        INT 10H                 ;ekran kesmesi
        MOV AH,0EH              ;ekrana karakter bas ve kursoru bir ileri al
        MOV SI,OFFSET MESA      ;basilacak karakter katari offset adresi
@2:     MOV AL,BYTE PTR [SI]    ;basilacak ilk harfi al 'AL' ye ver
        INC SI                  ;ikinci harfin yerini bul
        CMP AL,0                ;karakter katarinin sonunda 0 var 
        INT 10H                 ;ekran kesmesi
        JNE @2                  ;0 ile karsilasirsan donguden cik
        MOV AL,0F6H             ;Klavyeyi pasif hale getir
        MOV DX,60H              ;klavye portu
        OUT DX,AL               ;porta veriyi gonder
        MOV AX,305H             ;klavye tus tekrar hizini maximum yapiyoruz
        SUB BX,BX               ;yoksa bekleme suresi maximumda kaliyor
        INT 16H                 ;klavye kesmesi
KUR:    MOV AH,2                ;saklanan kursor pozisyonlari geri alinip
        POP DX                  ;kursor oraya konumlandiriliyor.
        INT 10H                 ;ekran kesmesi
BIT:    POP BP                  ;program basinda saklanan tum registerler
        POP DI                  ;geri aliniyor
        POP DS
        POP SI
        POP ES
        POP DX
        POP CX
        POP BX
        POP AX
        JMP CS:[ESKI]         ;Bizim isimiz bitti. Eski kesmeye yol veriyoruz
        RETF 2                
PRO ENDP                        ;procedure bitisi
TSR:    SUB AX,AX               ;mouse bulunup bulunmadigini kontrol ediyoruz
        INT 33H                 ;mouse kesmesi
        CMP AX,0                ;eger mouse
        JNE DEV                 ;varsa sicra dev 
        PUSH CS                 ;code segmentini 
        POP DS                  ;data segmentine esitle
        MOV AH,9                ;ekrana mouse yok mesajini
        LEA DX,CIK              ;gonder 
        INT 21H                 ;DOS kesmesi
        MOV AH,4CH              ;programi terket
        INT 21H                 ;DOS kesmesi
DEV:    MOV AX,3508H            ;yerlesecegimiz 08h kesmesinin adresini
        INT 21H                 ;buluyoruz
        MOV AL,BYTE PTR [BX-1]  ;bu adresin bir gerisinde bizim degiskenimiz
        CMP AL,CON              ;varmi diye kontrol ediyoruz
        JNE YUKLE               ;eger yoksa sicra programi yukle
        PUSH ES                 ;lazim olacak sakliyoruz
        LDS DX,ES:[ESKI]        ;degiskendeki eski 08h kesme adresini 
        MOV AX,2508H            ;eski yerine yaziyoruz 
        INT 21H                 ;DOS kesmesi
        MOV AX,ES:[2CH]         ;bizim programin kapladigi alanlarin
        MOV ES,AX               ;adreslerini belirtip oralari terk 
        MOV AH,49H              ;ediyoruz..
        INT 21H                 ;DOS kesmesi
        POP ES                  ;saklanan ES yi al
        MOV AH,49H              ;Programin bulundugu blogu bosaltip
        INT 21H                 ;memory den cikiyoruz..
        PUSH CS                 ;code segmentini 
        POP DS                  ;data segmentine esitle
        MOV AH,9                ;ekrana geri yukleme mesajini gonder
        LEA DX,MES              ;ve programi terket
        INT 21H                 ;DOS kesmesi
        MOV AH,4CH              ;programi terk ediyoruz..
        INT 21H                 ;DOS kesmesi
YUKLE:  LEA SI,ESKI             ;08h kesme adresini bu degiskene saklayacagiz
        MOV [SI],BX             ;offset adresini sakla
        MOV [SI+2],ES           ;segment adresini sakla
        LEA DX,PRO              ;oraya bizim programin offset ve segment adres
        MOV AX,2508H            ;lerini yaziyoruz
        INT 21H                 ;DOS kesmesi
        MOV AH,9                ;ekrana programin yuklendigine dair mesaj 
        LEA DX,LOP              ;gonder
        INT 21H                 ;DOS kesmesi
        LEA DX,TSR              ;hafizada kalacak kisim adresi
        INT 27H                 ;memorye yerles
END KOL                         ;program bitti..
