
	;Nacita retazec a najde v nom pocet cislic,malych pismen,velkych
	;pismen a ostatnych znakov.
	;Vypise retazec (podla zelania uzivatela)povodne alebo obratene
	;Vypise aj konvertovany retazec (velke na male a male na velke)
	;0-9......30h-39h
	;A-Z......41h-5ah
	;a-z......61h-7ah
;------------------------------------------------------------------------

.model small

data	segment
retaz	db 80
pocet	db 0
txr	db 80 dup(?)
kon	db 13			;znak CR
	db 10			;znak LF
	db '$'			;znak konca retazca
pc	db 0			;pocet cislic
pmp	db 0			;pocet malych pismen
pvp	db 0			;pocet velkych pismen
poz	db 0			;pocet ostatnych znakov
txpc1	db 'Pocet cislic : '
txpc2	db 30h
txpc3	db 30h,13,10,'$'

txpvp1	db 'Pocet velkych pismen : '
txpvp2	db 30h
txpvp3	db 30h,13,10,'$'

txpmp1	db 'Pocet malych pismen : '
txpmp2	db 30h
txpmp3	db 30h,13,10,'$'

txpoz1	db 'Pocet ostatnych znakov : '
txpoz2	db 30h
txpoz3	db 30h,13,10,'$'

text	db 'Zadaj retazec : $'

otaz1	db 'Chces vypisat obrateny retazec ?(A/N) $'
otaz2	db 10,13,'Chces vypisat povodny retazec ?(A/N) $'
text_kon db 'Konvertovany retazec : $'
data	ends

;------------------------------------------------------------------------
code	segment

	assume cs:code,ds:data

start:	mov ax,seg data
	mov ds,ax

	mov dx,offset text	;vypis hlasky 'Zadaj retazec : '
	mov ah,09h
	int 21h
	mov dx,offset kon	;skok na dalsi riadok
	mov ah,09h
	int 21h

	mov dx,offset retaz
	mov ah,0ah		;func. sys. na citanie znakov z klavesnice
	int 21h 		;nacitanie retazca

	mov dx,offset kon	;skok o dva riadky
	mov ah,09h
	int 21h 		;1. riadok
	int 21h 		;2. riadok

	xor si,si		;vynulovanie indexoveho registra
	xor cx,cx		;vynulovanie cx
	mov cl,pocet		;do cl pocet nacitanych cislic
	mov si,cx		;si ukazuje na koniec retazca
	mov txr[si],10
	mov txr[si+1],13
	mov txr[si+2],'$'	;doplnenie na konci retazca(10,13,'$')

	xor bx,bx		;vynulovanie bx
	mov bl,pocet
	mov cx,bx		;v cx je pocet znakov v retazci
	xor si,si


p_c:	cmp txr[si],2fh 	;skuska znaku cislic
	jbe p_oz		;ak vysledok je mensi alebo rovny 0
	cmp txr[si],3ah
	jnb p_vp		;ak vysledok je vacsi alebo rovny 0
	inc pc
	jmp dalej
p_vp:	cmp txr[si],40h 	;skuska znaku velkych pismen
	jbe p_oz		;ak vysledok je mensi alebo rovny 0
	cmp txr[si],5bh
	jnb p_mp		;ak vysledok je vacsi alebo rovny 0
	inc pvp 		;zvacsi sa p_vp o 1
	jmp dalej
p_mp:	cmp txr[si],60h 	;skuska znaku malych pismen
	jbe p_oz		;ak vysledok je mensi alebo rovny 0
	cmp txr[si],7bh
	jnb p_oz		;ak vysledok je vacsi alebo rovny 0
	inc pmp 		;zvacsi sa p_mp o 1
	jmp dalej
p_oz:	inc poz 		;ak nic tak sa zvacsi poz o 1
dalej:
	inc si			;index sa zvacsi o 1
	dec cx			;pocet znakov sa decrementuje
	jnz p_c 		;ak cx nie je 0 tak skok na p_c

konv1:	cmp pc,0
	jz konv2		;ak pocet cislic je 0 tak skoc na konv2
	xor ax,ax		;vynulovanie ax registra
	mov al,pc		;do al sa vlozi pocet cislic
	mov bl,10		;do bl sa vlozi 10
	div bl			;al=ax div bl,ah=ax mod bl
	add al,30h		;k cifre desiatok sa pricita ascii hodnota 0
	add ah,30h		;k cifre jednotiek sa pricita acsii hodnota 0
	mov txpc2,al		;ascii hodnota 10-kovej cislice
	mov txpc3,ah		;ascii hodnota 1-kovej cislice

konv2:	cmp pvp,0		;to iste ako v konv1 ale s poctom velkych pismen
	jz konv3
	xor ax,ax
	mov al,pvp
	mov bl,10
	div bl
	add al,30h
	add ah,30h
	mov txpvp2,al
	mov txpvp3,ah

konv3:	cmp pmp,0		;to iste ako v konv1 ale s poctom malych pism.
	jz konv4
	xor ax,ax
	mov al,pmp
	mov bl,10
	div bl
	add al,30h
	add ah,30h
	mov txpmp2,al
	mov txpmp3,ah

konv4:	cmp poz,0		;to iste ako v konv1 ale s poctom ostatnych zn.
	jz vypis
	xor ax,ax
	mov al,poz
	mov bl,10
	div bl
	add al,30h
	add ah,30h
	mov txpoz2,al
	mov txpoz3,ah

vypis:	mov dx,offset txpc1	;offset textu o pocte cislic
	mov ah,09h
	int 21h 		;vypis textu o pocte cislic
	mov dx,offset txpvp1	;offset textu o pocte velkych pismen
	mov ah,09h
	int 21h 		;vypis textu o pocte velkych pismen
	mov dx,offset txpmp1	;offset textu o pocte malych pismen
	mov ah,09h
	int 21h 		;vypis textu o pocte malych pismen
	mov dx,offset txpoz1	;offset textu o pocte ostatnych znakov
	mov ah,09h
	int 21h 		;vypis textu o pocte ostatnych znakov

otazky: mov dx,offset kon
	mov ah,09h
	int 21h 		;vynechanie jedneho riadku

	mov dx,offset otaz1
	mov ah,09h
	int 21h 		;vypisanie 1. otazky na obrazovku

	mov ah,01h
	int 21h 		;nacitanie jedneho znaku z klavesnice

	cmp al,'A'
	jz obratene		;ak bolo stlacene 'A' tak vypis
	cmp al,'a'
	jz obratene		;ak bolo stlacene 'a' tak vypis

ot2:	mov dx,offset otaz2
	mov ah,09h
	int 21h 		;vypisanie 2. otazky na obrazovku

	mov ah,01h
	int 21h 		;nacitanie 1 znaku z klavesnice

	cmp al,'A'
	jz povodne		;ak bolo stlacene 'A' tak vypis
	cmp al,'a'
	jz povodne		;ak bolo stlacene 'a' tak vypis
	jmp koniec		;ak nechce ani jednu volbu tak koniec

obratene:
	mov dx,offset kon
	mov ah,09h
	int 21h 		;skok na novy riadok
	xor bx,bx		;vynulovanie bx
	mov bl,pocet		;do bl sa vlozi pocet znakov v retazci
	mov si,bx
	add si,(-1)		;v si je pocet znakov -1
vyp:	mov dx,offset txr[si]
	mov ah,02h
	int 21h 		;vypis jedneho znaku na adrese text[si]
	dec si			;zmensenie si o 1
	jns vyp 		;pokial je si vacsie alebo rovne nule
	jmp ot2 		;potom skok na dalsiu otazku


povodne:
	mov dx,offset kon
	mov ah,09h
	int 21h
	mov dx,offset txr
	mov ah,09h
	int 21h 		;vypis povodneho retazca

	xor bx,bx		;zaciatok konverzie
	mov bx,0
	mov si,bx
	mov dx,offset text_kon
	mov ah,09h
	int 21h

konvert:
	cmp txr[si],40h
	jbe go
	cmp txr[si],5bh
	jnb male_pism
	add txr[si],20h
	jmp go

male_pism:
	cmp txr[si],60h
	jbe go
	cmp txr[si],7bh
	jnb go
	sub txr[si],20h

go:
	mov dl,txr[si]
	mov ah,02h
	int 21h
	inc si
	xor bx,bx
	mov bl,pocet

	cmp si,bx
	jbe konvert


koniec: mov dx,offset kon
	mov ah,09h
	int 21h

	mov ah,4ch
	int 21h

code	ends
        end start