MODEL SMALL
CODESEG
ORG 100H
NERMIN:
MOV AL,3                         ;ekran modu
INT 10H                          ;25x80 color moda alinarak ekran temizleniyor
MOV AH,1                         ;kursoru ekrandan 
MOV CX,0FF00H                    ;kaybediyoruz
INT 10H                          ;kesme

JMP BASS                         ;datalarin uzerinden atliyoruz
HARF DB ' +NERMIN+',0            ;cevrilecek karakter
YAZ  DB                          ;karakter icin degisken
KIL  DB 0,'        ',10,13,24H   ;basilacak dizi icin yer tahsisi
SAY DW 0
RAK DB
SAT DB
SUT DB
YAK DB 9,9,9,9,9,'Hre Productionø inc..   Assembly`98$'
BASS:   
        MOV SI,SAY               ;sayac dizideki harfleri takip ediyor
        MOV BX,OFFSET HARF       ;dizinin offset adresi
        MOV BL,BYTE PTR [BX+SI]  ;dizideki si sayacinin gosterdigi harf 
        MOV RAK,BL               ;aliniyor degiskene atiliyor
        CMP BL,0                 ;alinan karakter 0 ise dizi sonuna gelindi
        JE BIT                   ;programi bitir

        XOR BH,BH                ;bh i sifirla
        CALL POINT               ;procedure cagriliyor
        MOV SAT,0                ;satir 0
        ADD SUT,8                ;sutun 8
        INC SAY                  ;diger karakteri almak icin sayac arttiriliyor
        XOR AX,AX                ;klavyeden bir tus al
        INT 16H                  ;
        JMP BASS                 ;diger karakter icin yinele

BIT:    lea dx,yak               ;ekrana 
        mov ah,9                 ;programi benim yazdigima dair mesaji
        int 21h                  ;bas ve
        int 20h                  ;programdan cik

POINT PROC   
        
        MOV AX,0F000H            ;font tablosu segment adresi
        MOV ES,AX                ;ES ye ver
        MOV SI,7                 ;Font eni 8 adet (0 da dahil)
        XOR CX,CX                ;sayac olarak kullanilacak

@1:     MOV AX,8                 ;tablodan karakter dizisini bulmak icin 
        MOV BL,RAK               ;yukarida rak degiskenine harf atanmisti
        MUL BL                   ;carpim olayi
        ADD AX,CX                ;toplama olayi
        INC CX                   ;sayac arttiriliyor font boyu max.8
        ADD AX,0FA6EH            ;son olarak offset toplaniyor
        MOV BX,AX                ;bulunan adres BX e veriliyor
        XOR AX,AX                ;AX sifirlanip
        MOV AL,BYTE PTR ES:[BX]  ;AL ye bu adresteki bir byte okunuyor

@2:     PUSH AX                  ;AL okunan byte saklaniyor
        AND AL,1                 ;byte lar test ediliyor
        CMP AL,1                 ;eger 1 ise ekrana 
        JNE SIFIR                ;nokta basilmak uzere hazirlaniyor
        MOV YAZ,'°'              ;nokta
        JMP @                    ;degiskene atmak icin atla
SIFIR:  MOV YAZ,' '              ;eger 0 ise bosluk yerlestir
@:      MOV DL,YAZ               ;cift bellek bolgesi kullanilamayacagindan
        MOV BYTE PTR OFFSET KIL[SI+1],DL ;karakteri DL ye verip yazilacak
        DEC SI                   ;katar dizisi hazirlaniyor 
        POP AX                   ;ilk okunan byte geri aliniyor
        XOR AH,AH                ;bolum islemi yapilacak cop byte lar
        XOR BX,BX                ;bolen ve bolunen uzerinde sifirlaniyor
        MOV BL,2                 ;ikiye bolunecek
        DIV BL                   ;AX teki deger BL deki degere bolunuyor
        
        CMP SI,-1                ;SI font enini takip eden pointer
        JNE @2                   ;eger 0 ise donguden cikiliyor
                                 ;aksi halde atla @2
        ADD SAT,1                ;satiri bir arttir
        
        CALL BAS                 ;hazirlanan dizi basiliyor
        CMP CX,8                 ;CX font boyunu takip ediyor
        JNE @1                   ;Eger 8 degilse devam aksi halde cik
        
        RET                      ;procedureden cik
POINT ENDP

BAS:    CALL TAB                 ;locate proceduresi
OI:     PUSH AX                  ;Hazirlanan diziyi basan procedure
        PUSH DX                  ;kullanilacak registerler saklaniyor
        MOV SI,7                 ;SI font eni tekrar icin ilk degerine
        MOV AH,9                 ;kavusuyor.
        LEA DX,KIL               ;hazirlanan dizi 
        INT 21H                  ;ekranan basiliyor.
        POP DX                   ;degisen registerler 
        POP AX                   ;aliniyor
RET                              ;cagrildigin yere geri don

TAB:    PUSH AX                  ;kursoru
        PUSH DX                  ;sat ve sut degiskenlerinde lokasyona
        MOV AH,02                ;alir
        MOV DH,SAT
        MOV DL,SUT
        INT 10H
        POP DX
        POP AX
       
RET                              ;procedure den cik
END NERMIN
