;V šk.roku 2005/2006 budú hodnotené dve zadania, spolu maximálne  30 bodov.
;Na cviceni sa piše test za max.15 bodov.
;Zápočet dostane ten, kto dosiahne aspoň 20 bodov za obe zadania a test. 
;Pri programovani budeme vyžadovať znalosť ladiacich prostriedkov.

;ZADANIE č.1
;Napíšte program, ktorý najskor načíta z klávesnice retazec dlzky max.100 znakov a z daneho menu vykona tu cinnost, ktora je v ponuke. 
;Po vykonaní a) alebo b) alebo d) program znovu vypise dane menu. 


;a)vykonanie jednej ulohy
;b)nacitanie noveho retazca
;c)ukoncenie programu
;d)vypisanie usporiadaneho retazca

;Ponuka uloh:
;10- nacita znak a zisti pocet jeho vyskytov v retazci


ZAS     SEGMENT STACK           	;direktiva pre assembler - zaciatok
                                	;                 zasobnikoveho segmentu
        DW      64 DUP(?)       	;definicia 64-och slov
ZAS     ENDS                    	;koniec zasobnikoveho segmentu
;----------------------------------------------------------------------------
DATA    SEGMENT                 	;zaciatok datoveho segmentu

VSTUP 	DB	100
POCET	DB	0
STRING	DB	100 DUP (?)
NEWLINE DB	10,13,'$'
	
REQUEST DB	10,13,'Zadaj znak:$'
MESSA1  DB	10,13,'Pocet vyskytov znaku v retazci:$'

MENU    DB      'MENU:'         	;definicia retazca
	DB	0AH, 0DH,'a) vykonanie ulohy'
	DB	0AH, 0DH,'b) nacitanie noveho retazca'
 	DB	0AH, 0DH,'c) ukoncenie programu'
        DB	0AH, 0DH,'d) vypisanie usporiadaneho retazca'
	DB	0AH, 0DH,'e) vypisanie zadaneho retazca'
	DB	0AH, 0DH,'$'
DATA    ENDS                    	;koniec datoveho segmentu
;----------------------------------------------------------------------------
CODE    SEGMENT                 	;zaciatok kodoveho segmentu
        ASSUME  CS:CODE, DS:DATA, SS:ZAS        ;direktiva oznamuje
                                	;            assembleru pouzite segmenty
READSTR: MOV AX, SEG DATA        	;do AX vloz adresu segmentu DATA
         MOV DS, AX              	;segmentovu adresu presun do DS

	 MOV DX, OFFSET NEWLINE
	 MOV AH,9
	 INT 21H

	 MOV DX, OFFSET VSTUP
	 MOV AH,10
	 INT 21H
	 ADD DX,2
	 JMP PONUKA

NORMVYP: MOV DX, OFFSET NEWLINE
	 MOV AH,9
	 INT 21H

	 MOV	AX, SEG DATA				; priprava cyklu pre vypisanie retazca:
	 MOV	DS, AX
	 MOV	DX, [OFFSET POCET]			; pocet nacitanych znakov => CX (kvoli cyklu)
	 MOV	SI, DX
	 MOV	CL, [SI]
	 MOV	CH, 0
	 MOV	DX, OFFSET STRING			; nastavenie registrov na citanie znakov z pamate
	 MOV	SI, DX

LUUP:	 MOV	DL, [SI]				; vypis RETAZCA (cyklus)
	 INC	SI
	 MOV	AH, 02H
	 INT	21H					; samotny vypis (volanie sluzby)
	 LOOP	LUUP
	 JMP	PONUKA

FUNCT:  MOV DX, OFFSET REQUEST
	MOV AH,9
	INT 21H

	MOV AH,1           ; volba znaku ano alebo nie (a/n)
      	INT 21H
	
	 MOV	DX, [OFFSET POCET]			; pocet nacitanych znakov => CX (kvoli cyklu)
	 MOV	SI, DX
	 MOV	CL, [SI]
	 MOV	CH, 0
	 MOV	DX, OFFSET STRING			; nastavenie registrov na citanie znakov z pamate
	 MOV	SI, DX

LUUP2:	 MOV	DL, [SI]				; vypis RETAZCA (cyklus)
	 INC	SI
	 CMP	AL,DL
	 JE	INCREAS				
	 LOOP	LUUP2
INCREAS: INC CH
	 LOOP 	LUUP2

	 MOV DX,CH
	 MOV AH,9
	 INT 21H
	 JMP	PONUKA

PONUKA:  MOV DX, OFFSET NEWLINE
	 MOV AH,9
	 INT 21H

	MOV DX, OFFSET MENU    		;do DX vloz posunutie retazca v datovom segmente,                        
        MOV AH, 09H             	;funkcia na vypis retazca (write string)
        INT 21H                 	;DOS-ovske prerusenie na vykonanie funkcie 9

	MOV AH,1           ; volba znaku ano alebo nie (a/n)
      	INT 21H
	CMP AL,'a'
	JZ FUNCT 
     	CMP AL,'b'
      	JZ READSTR
      	CMP AL,'c'         ; moze byt aj A/N
      	JZ KONIEC   
	CMP AL,'e'
	JZ NORMVYP
	JMP PONUKA


KONIEC: MOV AX, 4C00H           	;funkcia ukoncenie programu
        INT 21H                 	;prerusenie na vykonanie ukoncenia programu
CODE    ENDS                    	;koniec kodoveho segmentu
        END     READSTR           	;koniec suboru - pre assembler
                                	; program bude spusteny od navestia START
