.model   small
.stack   100H

DATA1    SEGMENT
 MENUT   DB        10,10,13,'Menu:'
         DB        10,13,'1 - Vypis zadane retazce'
         DB        10,13,'2 - Porovnat nacitane retazce'
         DB        10,13,'3 - Hladnie podretazca'
         DB        10,13,'4 - Koniec'
 RIADOK  DB        10,13,'$'

 INFT01  DB        10,10,13,'Stlac lubovolny klaves$'

 TEXT1A  DB        10,13,'Zadaj prvy retazec : $'
 TEXT1B  DB        10,13,'Zadaj druhy retazec: $'
 TEXT1C  DB        10,13,'Prvy retazec : $'
 TEXT1D  DB        10,13,'Druhy retazec: $'

 TEXT2A  DB        10,13,'Nacitane retazce su rovnake$'
 TEXT2B  DB        10,13,'Nacitane retazce nie su rovnakej dlzky$'
 TEXT2C  DB        10,13,'Nacitane retazce nie su rovnake$'
 
 NASIEL  DB        0
 TEXT3A  DB        10,13,'Zadaj hladany subretazec: $'
 TEXT3B  DB        10,13,'Zadany subretazec je dlhsi ako oba retazce$'
 TEXT3C  DB        10,13,'Hladany subretazec sa nenachazda ani v jednom retazci$'
 TEXT3D  DB        10,13,'Hladany subretazec sa nachazda v oboch retazcoch$'
 TEXT3E  DB        10,13,'Hladany subretazec sa nachazda v prvom retazci$'
 TEXT3F  DB        10,13,'Hladany subretazec sa nachazda v druhom retazci$'

 S1MAX   DB        20            ;prvy retazec
 S1READ  DB        0
 S1LOAD  DB        21 dup('$')

 SBMAX   DB        20            ;podretazec
 SBREAD  DB        0
 SBLOAD  DB        21 dup('$')
DATA1    ENDS

DATA2    SEGMENT
 S2MAX   DB        20            ;druhy retazec
 S2READ  DB        0
 S2LOAD  DB        21 dup('$')
DATA2    ENDS

CODE     SEGMENT
         assume DS:DATA1, ES:DATA2, CS:CODE

START:   mov AX, seg DATA1             ;nastavenie code segmentu do DS
         mov DS, AX
         mov AX, seg DATA2             ;nastavenie code segmentu do DS
         mov ES, AX

         call CLRSCR

;--nacitavani vstupnych retazcov--
         lea DX, TEXT1A
         mov AH, 09H
         int 21H
         lea DX, S1MAX     ;nacitanie prveho retazca
         mov AH, 0aH
         int 21H
         lea DX, TEXT1B
         mov AH, 09H
         int 21H
         push DS
         mov AX, ES
         mov DS, AX
         lea DX, S2MAX     ;nacitanie druheho retazca
         mov AH, 0aH
         int 21H
         pop DS

;--vypisanie menu--
MENU:    call CLRSCR
         lea DX, MENUT
         mov AH, 09H
         int 21H

;--nacitani volby menu--
VOLBA:   mov AH, 07H
         int 21H
         cmp AL, '1'
         jz  VOLBA1
         cmp AL, '2'
         jz  VOLBA2
         cmp AL, '3'
         jz  VOLBA3
         cmp AL, '4'
         jz  VOLBA4
         jmp VOLBA

VOLBA1:  jmp M1
VOLBA2:  jmp M2
VOLBA3:  jmp M3
VOLBA4:  jmp KONEC

;--vypisanie nacitanych retazcov--
M1:      lea DX, TEXT1C         ;uvedenie
         mov AH, 09H
         int 21H
         lea DX, S1LOAD         ;prvy retazec
         mov AH, 09H
         int 21H
         lea DX, TEXT1D         ;uvedenie
         mov AH, 09H
         int 21H
         push DS
         mov AX, ES
         mov DS, AX
         lea DX, S2LOAD         ;druhy retazec
         mov AH, 09H
         int 21H
         pop DS
         call ANY_KEY
         jmp MENU

;--porovnavanie retazcov--
M2:      mov AL, S1READ           ;velkost prveho retazca
         mov AH, S2READ           ;velkost druheho retazca
         cmp Al, AH               ;porovnanie velkosti retazcov
         jnz M1E1                 ;ak nie su rovnakej dlzky

         lea SI, S1LOAD           ;prvy retazec
         lea DI, S2LOAD           ;druhy retazec
         xor CX, CX
         mov CL, AL               ;velkost retazcov

 DALSI1: cmpsb                    ;porovnanie retazcov
         jnz  M1E2                ;ak niektore znaky niesu rovnake
         loop    DALSI1           ;pokial CX!=0

         lea DX, TEXT2A    ;rovnake
         mov AH, 09H
         int 21H
         jmp M1END
 M1E1:   lea DX, TEXT2B    ;rozdielna velkost
         mov AH, 09H
         int 21H
         jmp M1END
 M1E2:   lea DX, TEXT2C    ;rozdielne retazce
         mov AH, 09H
         int 21H
         jmp M1END

M1END:   call ANY_KEY
         jmp MENU

;--hladanie podretazca--
M3:      lea DX, TEXT3A
         mov AH, 09H
         int 21H
         lea DX, SBMAX     ;nacitanie podretazca
         mov AH, 0aH
         int 21H

         mov CH, 0                     ;0-OK, 1-prvy je mensi, 2-druhy je mensi, 3-oba su mensie
         mov AL, S1READ                ;velkost prveho retazca
         mov AH, S2READ                ;velkost druheho retazca
         mov CL, SBREAD                ;velkost podretazca
         cmp Al, CL                    ;porovnanie velkosti subr. a ret1.
         jge GOON1
         add CH, 1
 GOON1:  cmp AH, CL                    ;porovnanie velkosti subr. a ret2.
         jge GOON2
         add CH, 2
 GOON2:  cmp CH, 3
         jz  M3E1

         cmp CH, 0
         jz  OBE                       ;bude sa porovnavat s oboma
         cmp CH, 1
         jz  DRUHY                     ;bude sa porovnavat iba s druhym
         cmp CH, 2
         jz  PRVY                      ;bude sa porovnavat iba s prvym

 OBE:   lea SI, S1LOAD
        lea DI, SBLOAD
        mov BH, S1READ
        mov BL, SBREAD
        call NAJDI1                    ;DX==1 ak nasiel ; DX==0 ak nenasiel
        mov NASIEL, DL                 ;ak nasiel v prvom tak NASIEL=1
        lea SI, S2LOAD
        mov BH, S2READ
        mov BL, SBREAD
        call NAJDI2
        add NASIEL, DL                 ;ak nasiel v druhom tak pripocta 2
        add NASIEL, DL
        jmp VYSLEDOK
 PRVY:  lea SI, S1LOAD
        lea DI, SBLOAD
        mov BH, S1READ
        mov BL, SBREAD
        call NAJDI1
        mov NASIEL, DL
        jmp VYSLEDOK
 DRUHY: lea SI, S2LOAD
        lea DI, SBLOAD
        mov BH, S1READ
        mov BL, SBREAD
        call NAJDI2
        add NASIEL, DL
        add NASIEL, DL
        jmp VYSLEDOK

 M3E1:   lea DX, TEXT3B    ;rozdielna velkost
         mov AH, 09H
         int 21H
         jmp M3END

 VYSLEDOK: mov DL, NASIEL
           cmp DL, 1
           jz  M3NASIEL1
           cmp DL, 2
           jz  M3NASIEL2
           cmp DL, 3
           jz  M3NASIELO
 
           xor DX, DX
 
 M3NENASIEL: lea DX, TEXT3C
             jmp M3VYPIS 
 M3NASIEL1:  lea DX, TEXT3E
             jmp M3VYPIS
 M3NASIEL2:  lea DX, TEXT3F
             jmp M3VYPIS
 M3NASIELO:  lea DX, TEXT3D
             jz M3VYPIS

 M3VYPIS:  mov AH, 09H
           int 21H
 
M3END:   call ANY_KEY
         jmp MENU


;--zmazanie obrazovky--
CLRSCR   PROC			 			
         mov AH,6                      ;nastavenie registrov
         mov CH,0
         mov CL,0
         mov DH,25
         mov DL,80
         mov AL,0
         mov BH,07h                    ;farba (0-pozadie; 2-text) 
         int 10h                       ;zmazanie obrazovky
         mov AH,2                      ;nastavenie kurzoru
         mov DH,0
         mov DL,0
         mov BH,0
         int 10h                       ;kurzor na (0,0)
         ret
CLRSCR   ENDP

;--cakaj na stlacenie lubovolnej klavesy--
ANY_KEY PROC
        lea DX, INFT01          ;stlac lub.klavesu
        mov AH, 09H
        int 21H
        mov AH, 07H
        int 21H
        ret
ANY_KEY ENDP

;--najdi podretazec v retazci--
NAJDI1   PROC
         xor CX, CX
         mov CL, BH                    ;pocet ciklov slucky1 bude tolko aky je dlhy retacec
         sub CL, BL                    ; ale zmenseny o dlzku podretazca + 1
         add CL, 1
         xor DX, DX
 SLUC11: push CX                       ;zalohovanie stavu pre slucku1
         push DI
         push SI

         xor CX, CX
         mov CL, BL
 SLUC12: mov AL, [DI]               ;slucka2 je porovnavanie podretazca s castou retazca
         mov AH, [SI]
         cmp AH, AL
         jz  OK12
         mov DL, 0                     ;do DX dame 0 ak su znaky rozne
         jmp NOK12
 OK12:   add DL, 1                     ;do DL dame 1 ak su znaky rovnake
 NOK12:  inc DI
         inc SI
         loop SLUC12

         cmp DL, BL                     ;ak v slucke2 nasiel podretazec tak DL==BL
         jz  NASIEL13

         pop SI                        ;obnovenie stavu pre slucku1
         pop DI
         pop CX
         inc SI
         loop SLUC11

         jmp NENASIEL1                 ;ak sa program dostane az sem ta nenasiel podretazec

 NASIEL13:    pop SI
              pop DI
              pop CX
              mov DL, 1
              jmp ENDOFNAJDI1 
 NENASIEL1:   mov DL,0
 ENDOFNAJDI1: ret
NAJDI1   ENDP

;--najdi podretazec v retazci--
NAJDI2   PROC
         xor CX, CX
         mov CL, BH                    ;pocet ciklov slucky1 bude tolko aky je dlhy retacec
         sub CL, BL                    ; ale zmenseny o dlzku podretazca + 1
         add CL, 1
         xor DX, DX
 SLUC21: push CX                       ;zalohovanie stavu pre slucku1
         push DI
         push SI

         xor CX, CX
         mov CL, BL
 SLUC22: mov AL, [DI]               ;slucka2 je porovnavanie podretazca s castou retazca
         mov AH, [ES:SI]
         cmp AH, AL
         jz  OK22
         mov DL, 0                     ;do DX dame 0 ak su znaky rozne
         jmp NOK22
 OK22:   add DL, 1                     ;do DL dame 1 ak su znaky rovnake
 NOK22:  inc DI
         inc SI
         loop SLUC22

         cmp DL, BL                     ;ak v slucke2 nasiel podretazec tak DL==BL
         jz  NASIEL23

         pop SI                        ;obnovenie stavu pre slucku1
         pop DI
         pop CX
         inc SI
         loop SLUC21

         jmp NENASIEL2                 ;ak sa program dostane az sem ta nenasiel podretazec

 NASIEL23:    pop SI
              pop DI
              pop CX
              mov DL, 1
              jmp ENDOFNAJDI2
 NENASIEL2:   mov DL,0
 ENDOFNAJDI2: ret
NAJDI2   ENDP


;--konec programu--
KONEC:   mov AX, 4C00H
         int 21H
CODE     ENDS
         END       START