MODEL SMALL
CODESEG
ORG 100H
NERMIN:
        MOV AH,4AH     ; memory program boyutu kadar kucultuluyor
        MOV BX,25      ; paragraf olarak program boyutu
        INT 21H        ; kesme

        MOV AH,48H     ; memoryden 4096 byte lik yer talep ediyoruz
        MOV BX,256     ; paragraf olarak byte adeti
        INT 21H        ; kesme

        XOR SI,SI      ;
        XOR DI,DI      ;
        
        PUSH AX        ; verilen memory segment adresi
        PUSH AX        ; verilen memory segment adresi
        POP ES         ; ES e esitleniyor
        MOV AX,0B800H  ; ekran segment adresi
        PUSH AX        ; sakla
        PUSH AX        ; sakla
        POP DS         ; DS ye esitle
        MOV CX,2000    ; 2000 word tasi
        CLD            ; bastan sona dogru
        REP MOVSW      ; tasi
        
        POP ES         ; saklanan ekran adresini
        PUSH ES        ; ES e esitliyoruz
        XOR SI,SI      ; pointer sifirlaniyor
        
@1:     CMP BYTE PTR ES:[SI],20H  ; gosterilen yer kontrol ediliyor
        JE @2                     ; eger bosluk ise atla
        CMP BYTE PTR ES:[SI],0FDH ; arttirilan karakter 255 ten
        JNA @3                    ; buyuk degilse normal arttir
        MOV BYTE PTR ES:[SI],'A'  ; buyuk ise oraya A karakterini yaz
@3:     INC BYTE PTR ES:[SI]      ; ve bir arttir
        
@2:     ADD SI,2                  ; B800h offset pointerini 2 ileri al
        CMP SI,4000               ; ekranin hepsi
        JNE @                     ; arttirilmadiysa atla
        XOR SI,SI                 ; tamam ise tekrar basa don SI=0

@:      IN AL,60H                 ; klavye statusunu kontrol et
        CMP AL,1DH                ; ctrl tusuna
        JNE @1                    ; basilmadiysa devam et
        
        XOR SI,SI                 ; aksi halde buradayiz ve 
        XOR DI,DI                 ; pointerler sifirlaniyor
        
        POP ES                    ; yukarida saklanan 0b800 adresi aliniyor
        POP DS                    ; yukarida saklanan memory adresi aliniyor
        MOV CX,2000               ; daha once saklanan ekran tekrar
        CLD                       ; ayni metodla yerlestiriliyor
        REP MOVSW                 ; bitene kadar devam et
        
        PUSH DS                   ; acilan memory adresi stack a atilip 
        POP ES                    ; ES e esitleniyor
        MOV AH,49H                ; acilan memory bologu 
        INT 21H                   ; geri iade ediliyor
        INT 20H                   ; programi terket
        
END NERMIN
