;************************************************   4. ZADANIE  -   SPRACOVANIE  POLA  ZNAKOV   *********************************************
;-------------------------------------------------------------------------------------------------------------------------------------------------
;Zadanie programu: Napiste program, ktory nacita z klavesnice retazec maximalne 90 znakov . Potom f) nacita znak a zisti pocet jeho vyskytov v retazci.
;-------------------------------------------------------------------------------------------------------------------------------------------------
;Meno: Michal Vajíček
;2.bc, telekomunikacie
;rok: 2008
;-------------------------------------------------------------------------------------------------------------------------------------------------
clrscr	MACRO					              ;definicia makra na mazanie obrazovky
	mov ax,0003h               		              ;do ax sa vlozi parametre grafickeho modu 80x25
  	int 10h					              ;prerusenie na vykonanie instrukcie 
  	endm		                                      ;ukoncenie makra clrscr

vypis	MACRO text				              ;makro na vypis textu
	mov dx, offset text			              ;relativna adresa TEXT sa ulozi do DX
	mov ah,9			                      ;funkcia na vypis retazca 
	int 21h					              ;DOS-ovske prerusenie na vykonanie funkcie 9
        endm                                                  ;koniec makra


gotoxy  MACRO x,y                                             ;macro nastavi kurzor na zvolenu poziciu
	mov bh,0                                              ;video stranka (standardne 0)
	mov dh,x                                              ;do dh vlozi poziciu riadku
        mov dl,cl                                             ;do dl sa vlozi cl, ktore budeme v cykle zmnesovat(pozicia stlpca)
        mov ah,02h                                            ;funkcia na nastavenie kurzora na poziciu        	
	int 10h                                               ;ROMIOS prerusenie video sluzby
        endm                                                  ;koniec makra 
		
;-------------------------------------------------------------------------------------------------------------------------------------------------
data       segment                                            ;zaciatok datoveho segmentu
vstup      db 90                                              ;bude sa citat 90 znakov
pocet      db 0                                               ;tu sa ulozi ich skutocny pocet
vystup     db 90 dup(?)                                       ;miesto pre vysledok+13,10,$

textA db ' zadaj nenulovy retazec: $'                         ;deklaracia retazca textA na vypis textu
textB db ' zadaj znak: $'                                     ;deklaracia retazca textB na vypis textu
textC db ' zadany znak sa v retazci nachadza :$'              ;deklaracia retazca textC na vypis textu
data       ends                                               ;koniec datoveho segmentu

;-------------------------------------------------------------------------------------------------------------------------------------------------

code      segment                                             ;zaciatok kodoveho segmnetu
       assume cs:code, ds:data                                ;direktivy pre prekladac - pouzitie kodoveho a datoveho segmentu

start:                                                        ;cyklus start                
      clrscr	                                              ;volanie makra na vymazanie obrazovky
      mov ax,seg data                                         ;do AX vloz adresu segmentu DATA
      mov ds,ax                                               ;segmentovu adresu presun do DS               
testy:vypis texta                                             ;cyklus testy na osetrenie zadania nuloveho retazca
      mov ah,0ah                                              ;sluzba pre vstup retazca z klavesnice
      mov dx,offset vstup                                     ;do dx vloz nacitany retazec
      int 21h 	                                              
      cmp pocet,0                                             ;porovna dlzku reatzca s nulou
      jz testy                                                ;ak sa rovnaju cyklus ide od navestia testy

      gotoxy 4,1                                              ;volanie makra na nastavenie kurzora
      vypis textb                                             ;volanie makra na vypis textu
      mov ah,01h                                              ;nacitanie ascii znaku bude ulozeny v al
      int 21h	
      xor cx,cx                                               ;nulovanie pocitadla
      mov cl,pocet                                            ;pocet znakov do cl
      xor si,si                                               ;nulovanie poradia znaku
      xor bx,bx	                                              ;nulovanie pocitadla vyskytu znaku

      call vypocet                                            ;volanie procedury vypocet 
      mov ax,4c00h                                            ;funkcia ukoncenia programu  
      int 21h
;-------------------------------------------------------------------------------------------------------------------------------------------------        
vypocet proc near                                             ;procedura na vypocet opakovani znaku   
       cyklus: cmp al,vystup[si]                              ;cyklus na prechadzanie retazcom ;porovnava zadany znak postupne so znakmi v ratazci  
               jz skok                                        ;ak sa rovnaju ide sa od navestia skok
	       jnz pokracovanie                               ;ak sa nerovnaju ide sa od navestia pokracovanie
       skok:   inc bx                                         ;inkrementacia pocitadla vyskytov znaku bx
               jmp pokracovanie                               ;skok na navestie pokracovanie 

       pokracovanie:inc si                                    ;inkrementacia poradia poznaku
                    loop cyklus                               ;skok na navestie cyklus
       gotoxy 6,1                                             ;volanie makra na nastavenie kurzora 
       vypis textc                                            ;volanie makra na vypis textu
       mov ax,bx                                              ;presun hodnoty z registra bx do registra ax
       mov bl,0Ah                                             ;do bl sa vlozi cislo 10d
       div bl                                                 ;hodnota v ax sa deli hodnotou bl a vysledok sa ulozi v al a zvysok v ah
       mov dx,ax                                              ;presun hodnoty z registra ax do registra dx
       add dl,30h                                             ;k hodnote v registri dl sa pripocita 30h aby sme ziskali ascii cisla v dl
       mov ah,02h                                             ;do ah sa vlozi cislo obsluhy na vypisanie znaku ktoreho ascii hodnota je v dl
       int 21h               
       mov dl,dh                                              ;do dl sa vlozi hodnota z dh a postup sa opakuje
       mov ah,02h                                             ;cislo obsluhy na vypisanie znaku
       add dl,30h                                             ;pripocitaj k dl 30h (0)
       int 21h
       mov ah,01h                                             ;nacitanie klavesy - pocka na stlacenie klavesy            
       int 21h
       ret                                                    ;navrat k miestu odkial bola procedura volana
vypocet endp                                                  ;koniec procedury
;-------------------------------------------------------------------------------------------------------------------------------------------------   
code  ends
 end start
;-------------------------------------------------------------------------------------------------------------------------------------------------   
;Program je funkcny a bol vypracovany v prostredi MsDOS za pouzitia ;kompilatora TASM (v. 2.02) a TLINK (v. 3.01).
;v programe su vyuzite tri makra(gotoxy - nastavenie kurzora, clrscr - vymazanie obrazovky, vypis - na vypisanie textu)
;vyuzil som proceduru vypocet na vypocet poctu opakovani znaku 
;bol pouzity cyklus cyklus v procedure vypocet na prechadzanie retazcom a porovnavanie zadaneho znaku so znakmi retazca
;bol pouzity cyklus testy na osetrenie zadania nuloveho retazca