;Zadanie c. 1
;meno: Tomas Chmel
;kruzok B 09

 .model small
 .stack 100h


DATA     SEGMENT

 TEXT1   DB        10,13,'Zadaj text: $'
 TEXT2   DB        10,13,'Zadany retazec: $'
 MENUT   DB        10,13,10,13,'MENU:$'
 MENUT1  DB        10,13,'1-Vypise zadany retazec na obrazovku$'
 MENUT2  DB        10,13,'2-Vypise poradove cislo prveho znaku nacitaneho z klavesnice$'
 ZADZNAK DB        10,13,'Zadaj znak: $'
 PORZNAK DB        10,13,'Poradove cislo zadaneho znaku: $'
 NONZNAK DB        10,13,'Zadany znak sa nenasiel$'
 MENUT3  DB        10,13,'3-Vypise retazec v obratenom poradi$'
 INVERZ  DB        10,13,'Inverz: $'
 MENUT4  DB        10,13,'4-Vypise pocet cislic v retazci$'
 POCETC  DB        10,13,'Pocet cislic je: $'
 MENUT5  DB        10,13,'5-Male pismena konvertuje na velke$'
 MNAV    DB        10,13,'a->A: $'
 MENUT6  DB        10,13,'6-Velke pismena konvertuje na male$'
 VNAM    DB        10,13,'A->a: $'
 MENUT7  DB        10,13,'7-Koniec programu$'
 RIADOK  DB        10,13,'$'

 MAXT    DB        100
 DLZKA   DB        0
 TEXT    DB        101 DUP('$')

 WTEXT   DB        101 DUP('$')
       
DATA     ENDS

CODE     SEGMENT
         ASSUME    CS:CODE, DS:DATA

START:   mov AX, SEG DATA
         mov DS, AX

         mov DX, OFFSET TEXT1     ;zadaj retazec
         mov AH, 09H
         int 21H

         mov DX, OFFSET MAXT      ;nacitanie retazca do pamate
         mov AH, 0AH
         int 21H

MENU:    mov DX, OFFSET MENUT     ;menu
         mov AH, 09H
         int 21H
         mov DX, OFFSET MENUT1    ;menu-1
         mov AH, 09H
         int 21H
         mov DX, OFFSET MENUT2    ;menu-2
         mov AH, 09H
         int 21H
         mov DX, OFFSET MENUT3    ;menu-3
         mov AH, 09H
         int 21H
         mov DX, OFFSET MENUT4    ;menu-4
         mov AH, 09H
         int 21H
         mov DX, OFFSET MENUT5    ;menu-5
         mov AH, 09H
         int 21H
         mov DX, OFFSET MENUT6    ;menu-6
         mov AH, 09H
         int 21H
         mov DX, OFFSET MENUT7    ;menu-7
         mov AH, 09H
         int 21H
         mov DX, OFFSET RIADOK            ;novy riadok
         mov AH, 09H
         int 21H

VYBER:   mov AH, 08H              ;nacitani znaku, pre vyber z menu
         int 21H
         cmp AL, '1'              ;menu1
         jz  ME1
         cmp AL, '2'              ;menu2
         jz  ME2
         cmp AL, '3'              ;menu3
         jz  ME3
         cmp AL, '4'              ;menu4
         jz  ME4
         cmp AL, '5'              ;menu5
         jz  ME5
         cmp AL, '6'              ;menu6
         jz  ME6
         cmp AL, '7'              ;menu7
         jz  KONECMENU
         jmp VYBER

ME1: jmp M1
ME2: jmp M2
ME3: jmp M3
ME4: jmp M4
ME5: jmp M5
ME6: jmp M6
KONECMENU: jmp KONEC

M1:      mov DX, OFFSET TEXT2     ;Zadany retazec:
         mov AH, 09H
         int 21H
         mov DX, OFFSET TEXT      ;vypise nacitany retazec
         mov AH, 09H
         int 21H
         mov DX, OFFSET RIADOK    ;novy riadok
         mov AH, 09H
         int 21H
         mov AH, 08H              ;pockanie na stlacenie klavesy
         int 21H
         jmp MENU                 ;navrat do menu

M2:      mov DX, OFFSET ZADZNAK
         mov AH, 09H
         int 21H
         mov AH, 01H              ;nacitanie znaku
         int 21H
         mov SI, OFFSET TEXT      ;skumany zadany retazec
         mov CH, 0
         mov CL, [DLZKA]
         mov BH, 0                ;nulove poradove cislo
 DALSI:  inc BH
         mov AH, [SI]
         cmp AH, AL               ;porovnavanie
         jz  NASIEL
         inc SI
         loop DALSI
 NENAS:  mov DX, OFFSET NONZNAK   ;znak nebol najdeny
         mov AH, 09H
         int 21H
         mov AH, 08H              ;pockanie na stlacenie klavesy
         int 21H
         jmp MENU
 NASIEL: mov DX, OFFSET PORZNAK   ;uvodny vypis
         mov AH, 09H
         int 21H
         mov CH, BH
         mov CL, 0                ;zatial nula dasiatok
 ESTEZ:  cmp CH, 10               ;porovnanie poradia s desiatkou
         jg  DESATZ               ;ak je vecsi ako 10 tak >DASATZ
         jmp UZNIEZ               ;pocet jednotiek je mensi ako 10
 DESATZ: add CL, 1                ;do desiatok prida o jednu viac
         sub CH, 10               ;z jednotiek odoberie
         jmp ESTEZ                ;dalsie porovnanie pokial pocet jednotiek nieje mensi ako 10
 UZNIEZ: add CL, 30H              ;prevod cisla na znak
         add CH, 30H              ;prevod cisla na znak
         mov DL, CL               ;vypis poradoveho cisla-desiatky
         mov AH, 02H
         int 21H
         mov DL, CH               ;vypis poradoveho cisla-jednotky
         mov AH, 02H
         int 21H
         mov AH, 08H              ;pockanie na stlacenie klavesy
         int 21H
         jmp MENU

M3:      mov SI, OFFSET TEXT      ;zalohovanie adresi povodneho retazca
         mov BX, OFFSET WTEXT     ;zalohovanie adresi zmeneneho retazca
         mov CH, 0                ;preistotu vynulujeme
         mov CL, [DLZKA]          ;dlzka retazca na ciklus
 POSUN:  inc SI                   ;posunutie sa na koniec povodneho retazca
         loop POSUN
         mov CL, [DLZKA]          ;dlzka retazca na ciklus
 DALSIO: mov AL, [SI]             ;nacitanie znaku
         mov [BX], AL             ;zapisanie znaku
         inc BX                   ;posun v zmenenom retazci
         dec SI                   ;posun v povodnom retazci
         loop DALSIO              ;ciklus
         mov AL, [SI]             ;nacitanie posledneho znaku
         mov [BX], AL             ;zapisanie posledneho znaku
         inc BX
         mov AL, '$'
         mov [BX],AL              ;ukoncenie retazca
         mov DX, OFFSET INVERZ    ;uvodny vypis
         mov AH, 09H
         int 21H
         mov DX, OFFSET WTEXT     ;vypis zmeneneho textu
         mov AH, 09H
         int 21H
         mov AH, 08H              ;pockanie na stlacenie klavesy
         int 21H
         jmp MENU                 ;navrat do menu

M4:      mov BX, OFFSET TEXT      ;zalohovanie adresi povodneho retazca
         mov CH, 0
         mov CL, [DLZKA]          ;dlzka retazca
         mov AH, 0                ;nulovanie poctu cislic v retazci
 DALSIC: mov AL, [BX]             ;nacitanie znaku z retazca
         cmp AL, 2fH              ;kontrola spodnej hranice cisiel
         jng DALEJC               ;ak znak neni cislo
         cmp AL, 40H              ;kontrola hornej hranice cisiel
         jnl DALEJC               ;ak znak neni cislo
         inc AH                   ;ak bol znak cislo tak inkremntuj ich pocet
 DALEJC: inc BX                   ;pohyb v retazci
         loop DALSIC
         mov CH, AH
         mov CL, 0                ;zatial nula dasiatok
 ESTEC:  cmp CH, 10               ;porovnanie poradia s desiatkou
         jg  DESATC               ;ak je vecsi ako 10 tak >DASATC
         jmp UZNIEC               ;pocet jednotiek je mensi ako 10
 DESATC: add CL, 1                ;do desiatok prida o jednu viac
         sub CH, 10               ;z jednotiek odoberie
         jmp ESTEC                ;dalsie porovnanie pokial pocet jednotiek nieje mensi ako 10
 UZNIEC: add CL, 30H              ;prevod cisla na znak
         add CH, 30H              ;prevod cisla na znak
         mov DX, OFFSET POCETC    ;uvodny vypis
         mov AH, 09H
         int 21H
         mov DL, CL               ;vypis poradoveho cisla-desiatky
         mov AH, 02H
         int 21H
         mov DL, CH               ;vypis poradoveho cisla-jednotky
         mov AH, 02H
         int 21H
         mov AH, 08H              ;pockanie na stlacenie klavesy
         int 21H    
         jmp MENU

M5:      mov SI, OFFSET TEXT      ;zalohovanie adresi povodneho retazca
         mov BX, OFFSET WTEXT     ;zalohovanie adresi zmeneneho retazca
         mov CL, [DLZKA]          ;dlzka retazca
 DALSIM: mov AL, [SI]             ;nacitanie povodneho znaku
         cmp AL, 60H              ;porovnanie s dolnou hranicou malych pismen
         jng DALEJM                
         cmp AL, 7BH              ;porovnanie s hornou hranicou malych pismen
         jnl DALEJM
         sub AL, 32               ;zmena maleho na velke
 DALEJM: mov [BX], AL             ;kopirovanie znaku do zmeneneho retazca
         inc SI                   ;pohyb po povodnom retazci
         inc BX                   ;pohyb po zmenenom retazci
         loop DALSIM              ;cyklus pokial neprideme na koniec retazca
         mov AL, '$'
         mov [BX],AL              ;ukoncenie retazca
         mov DX, OFFSET MNAV      ;uvodny vypis
         mov AH, 09H
         int 21H
         mov DX, OFFSET WTEXT     ;vypis zmeneneho textu
         mov AH, 09H
         int 21H
         mov AH, 08H              ;pockanie na stlacenie klavesy
         int 21H
         jmp MENU                 ;navrat do menu

M6:      mov SI, OFFSET TEXT      ;zalohovanie adresi povodneho retazca
         mov BX, OFFSET WTEXT     ;zalohovanie adresi zmeneneho retazca
         mov CL, [DLZKA]          ;dlzka retazca
 DALSIV: mov AL, [SI]             ;nacitanie povodneho znaku
         cmp AL, 40H              ;porovnanie s dolnou hranicou malych pismen
         jng DALEJV
         cmp AL, 5BH              ;porovnanie s hornou hranicou malych pismen
         jnl DALEJV
         add AL, 32               ;zmena maleho na velke
 DALEJV: mov [BX], AL             ;kopirovanie znaku do zmeneneho retazca
         inc SI                   ;pohyb po povodnom retazci
         inc BX                   ;pohyb po zmenenom retazci
         loop DALSIV              ;cyklus pokial neprideme na koniec retazca
         mov AL, '$'              
         mov [BX],AL              ;ukoncenie retazca
         mov DX, OFFSET VNAM      ;uvodny vypis
         mov AH, 09H
         int 21H
         mov DX, OFFSET WTEXT     ;vypis zmeneneho textu
         mov AH, 09H
         int 21H
         mov AH, 08H              ;pockanie na stlacenie klavesy
         int 21H
         jmp MENU                 ;navrat do menu

KONEC:   mov AX,4C00H
         int 21H
CODE     ENDS
         END       START