          ***Ukazka prace s makrom****


clrscr macro                ;makro, ktore volam z programu
  call _clrscr              ;procedura na vymazanie obrazovky
endm                        ;koniec makra
gotoxy macro x,y            ;makro volane z programu
  mov dl,x                  ;presum x-ovej sur do registra
  mov dh,y                  ;presun y-ovej sur do registra
  call _gotoxy              ;volanie procedury
endm                        ;koniec makra
write macro s               ;makro volane z programu
  mov dx,offset s           ;presum adresy vypisovaneho textu do registra dx
  call _write               ;volanie procedury na vypis
endm                        ;koniec makra

zas segment stack           ;deklaracia zasobnikoveho segmentu
  dw 100 dup (?)            ;alokovanie 200B, ktore sa neinicializiju
zas ends                    ;koniec zasobnikoveho segmentu
data segment                ;deklaracia datoveho segmentu

max db 100                  ;deklaracia premennej max=100
pocet db 0
vstup db 100 dup (?)        ;deklaracia premennej vstup s alokovanim 100B neinicializovanych
vystup db 100 dup (?)       ;deklaracia premennej vystup s alokovanim 100B neinicializovanych
 textA db '1. Vypis retazca na obrazovku$'            ;symbolicke konstanty reprezentujuce texty
 textB db '2. Poradove cislo zadaneho znaku$'
 textC db '3. Invertovat retazec$'
 textD db '4. Pocet slov v zadanom retazci$'
 textE db '5. Najvacsi znak v zadanom retazci$'
 textG db '6. KONIEC$'
 textH db 'Zadaj retazec (max 100 znakov)$'
 textJ db 'Prva pozicia znaku je: $'
 textL db 'Najvacsi znak: $'
 textM db 'Znak sa v retazci nenachadza!$'
 textN db 'Znak je v retazci na pozicii: $'
 textO db 'Pocet slov v retazci je: $'
 textP db 'Martin OLSIAK, A/5 $'
data ends                   ;koniec datoveho segmentu


code segment                ;zaciatok kodoveho segmentu
assume cs:code,ds:data,ss:zas ;direktivy pre prekladac - pouzitie, kodoveho,datoveho a zasobnikoveho segmentu
start:mov ax,seg data       ;presun segmentovej adresy datoveho segmentu do ax
      mov ds,ax             ;presun adresy z ax do ds
      clrscr                ;vymazanie obrazovky a nastavenie textoveho modu
      gotoxy 15h,04h        ;nastavienie kurzora na x=15h,y=04h
      write textH           ;vypisanie prislusneho retazca - textH
      gotoxy 15h,05h        ;nastavenie kurzora
      mov dx,offset max     ;presun adresy max do registra dx
      mov ah,0ah            ;presun cisla obsluhy do registra ah - nacitanie retazca
      int 21h               ;volanie prerusenia
mnu:  clrscr
      gotoxy 10h,07h
      write textA
      gotoxy 10h,08h
      write textB
      gotoxy 10h,09h
      write textC
      gotoxy 10h,0ah
      write textD
      gotoxy 10h,0bh
      write textE
      gotoxy 10h,0ch
      write textG
      
      mov ah,01h            ;nacitanie znaku
      int 21h               ;volanie prerusenia - funkcie dosu
      cmp al,31h            ;porovnanie obsahu premennej al s 31h = klavesa 1
      jnz next2             ;ak sa cisla rovnaju - nevykona sa - podmieneny skok
      clrscr
      gotoxy 15h,05h
      mov bl,byte ptr [pocet] ;do bl sa vlozi hodnota z adresy pocet
      xor bh,bh                     ;vynulovanie bh
      mov byte ptr [vstup+bx],'$'   ;retazec ukonci znakom '$' - kvoli vypisu
      write vstup
      mov ah,01h            ;nacitanie znaku
      int 21h
      jmp mnu               ;skace sa do menu
next2:cmp al,32h            ;al sa porovnava s 32h - klavesa 2
      jnz next3             ;aj sa aj nerovna 32 - skoci sa na navestie next3
      clrscr
      gotoxy 15h,05h
     
      mov ah,01h            ;nacitanie ascii znaku bude ulozeny v al
      int 21h
      xor bx,bx             ;vynulovanie registra bx
repet:cmp al,byte ptr [vstup+bx] ;porovnanie hodnoty registra al - (nacitany znak)s bytovou hodnotou na adrese [vstup+bx]
      jz found              ;ak je zhoda tak skoci na navestie found
      inc bx                ;inkrementuje bx
      cmp byte ptr [pocet],bl ;porovnanie hodnoty registra s hodnotou ulozenou na adrese pocet - ci uz nie je koniec retazca
      jnz repet             ;ak nie je koniec retazca, tak skoci na repet
      gotoxy 15h,06h        
      write textM           ;vypise oznamenie o nenajdeni znaku v retazci
      mov ah,01h            ;nacitanie znaku - pocka na stlacenie klavesy
      int 21h
      jmp mnu               ;koniec vykonaneho prikazu na hladanie pozicie znaku (ak znak nebol najdeny)  - skace sa spat do menu
found:gotoxy 15h,06h        ;sem sa skoci ak program najde zadany znak
      write textN
      inc bx                ;inkrementacia registra bx
      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 zvisok v ah
      mov dx,ax
      add dl,30h            ;k hodnote v registry 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            ;presun cisla obsluhy na vypisanie znaku
      add dl,30h
      int 21h
      mov ah,01h            ;nacitanie klavesy - pocka na stlacenie klavesy            
      int 21h
      jmp mnu               ;koniec prikazu na vypisanie pozicie znaku(ak bol najdeny) - skok spat do menu
next3:cmp al,33h            ;poravnanie obsahu registra s 33h - prikaz 3
      jnz next4             ;ak sa nerovna 34h skoci a na navestie next5
      clrscr
      gotoxy 15h,05h
      mov dx,offset vstup   ;presun adresy premennej vstup do registra dx
      xor ch,ch             ;vynulovanie registra ch
      mov cl,[pocet]        ;presun hodnoty na adrese pocet do registra cl
      xor bx,bx
again:mov si,cx             ;hodnota v registry cx sa vlozi do indexoveho registra si
      mov dl,byte ptr [vstup+si-1] ;do dl sa vlozi znak na adrese vstup+si-1 -dolar nemenime
      mov byte ptr [vystup+bx],dl  ;na adresu vystup+bx sa vlozi znak v dl
      inc bx
      loop again            ; dekrementuje se cx a skoci sa na navestie again
      mov byte ptr [vystup+bx],'$' ;prida sa na koniec $, aby sa to dalo vypisat
      write vystup          
      mov ah,01h            ;pocka na stlacenie klavesy
      int 21h
      jmp mnu               ;skok do menu

next4:
      cmp al,34h            ;hodnota v al sa porovnala s 34h
      jnz next5             ;ak sa nerovna, skace sa na navestie next5
      clrscr
      gotoxy 15h,05h
      write textO
      mov cl,byte ptr [pocet] ;do cl sa vlozi hodnota na adrese pocet - pocet znakov v retazci
      xor ch,ch               ;vynulovanie registrov ch,si,bl
      xor si,si
      xor bl,bl
repet2:
      cmp byte ptr [vstup+si],' ' ;znak na adrese vstup+si sa porovna s '0'
      jl prip                 ;skace sa, ak je mensi
      cmp byte ptr [vstup+si],' ' ;znak na adrese vstup+si sa porovna s '9'
      jg prip                 ;skace sa, ak je vacsi

      inc bl
prip: inc si                  ;si sa inkrementne vzdy, v bl je pocet medzier
      loop repet2
      mov ax,bx               
      mov bl,0Ah              ;do bl sa vlozi 10d
      div bl
      mov dx,ax
      mov ah,02h              ;do ah sa vlozi cislo obsluhy na vypisanie znaku, ktoreho ascii je v dl
      int 21h
      mov dl,dh
      add dl,30h
      add dx,1
      int 21h
      mov ah,01h              ;do ah sa vlozi cislo obsluhy na nacitanie znaku
      int 21h 
      jmp mnu                 ;skok do menu

next5:
      cmp al,35h              ;hodnata v al sa porovna s 35h
      jnz next6               ;ak sa nerovna, skace sa na next6

      clrscr
      gotoxy 15h,05h
      write textL
      xor si,si
      xor al,al
      xor ah,ah

      mov al,byte ptr [vstup+si]
      mov ah,byte ptr [vstup+si+1]

repet3:
        cmp ah,'$'     ;test konca retazca
        jz vypis       ;ak ano skok na vypis
        cmp al,ah      ;porovnanie al a ah
        jl repet4      ;ak je al mensie ako ah skoc na repet4
        cmp al,ah
        jg repet5      ;ak je al vecsie ako ah skoc na repet5

repet4:
        inc si
        mov al,ah      
        mov ah,byte ptr [vstup+si+1] ;do ah prirad nasl. znak
        jmp repet3                   ;skoc na repet3

repet5:
        inc si
        mov ah, byte ptr [vstup+si+1] ;do dh prirad nasl.znak
        jmp repet3                    ;skoc na repet3

vypis:
      mov dl, al                  ;vypis znaku
      mov ah, 02h	
      int 21h
      mov ah, 01h
      int 21h
      jmp mnu
next6:
      cmp al,36h              ;hodnata v al sa porovna s 35h
      jnz next7               ;ak sa nerovna, skace sa na next6
      mov ax,4c00h            ;koniec programu - korektny navrat do dosu
      int 21h
next7:jmp mnu                 ;ak nebola stalcena klavesa 1-7 skace sa do menu

_clrscr proc near             ;deklaracia procedury _clrscr - vymazanie obrazovky
  mov ax,0003h                ;do ax sa vlozi parametre grafickeho modu 80x25
  int 10h
  mov dx,offset textP         ;do dx sa presunie adresa offsetova textu textP
  mov ah,09h                  ;do ah -> cislo obsluhy na vypisanie retazca
  int 21h
  ret                         ;navrat k miestu, odkial bola procedura volana
_clrscr endp                  ;koniec procedury

_gotoxy proc near             ;deklaracia procedury _gotoxy -nastavenie kurzora na zadane suradnice
  mov ax,0200h                ;do ax sa vlozi cislo obsluhy na nastavenie kurzora
  int 10h
  ret                         ;navrat k miestu, odkial bola procedura volana
_gotoxy endp                  ;koniec procedury

_write proc near              ;deklaracia procedury _write - vypis retazca
  mov ah,09h                  ;do ah sa vlozi cislo obsluhy na vypisanie retazca
  int 21h
  ret                         ;navrat k miestu, odkial bola procedura volana
_write endp                   ;koniec 

code ends                     ;koniec kodoveho segmentu
end start


    ;program je funkcny, nevyhodou je ze pocitanie slov je realizovane
    ;pocitanim medzier a nieje dalej osetrovany
