.model small
       .stack 100h             ; Urcuje velkost zasobniku

 ;      .386                    ; Podpora procesora 386

       .data                   ; definicia datoveho segmentu

ERROR1	DB	  10,13,'Nepodarilo sa otvorit(vytvorit) subor$'
ERROR2	DB	  10,13,'Nepodarilo sa nacitat data$'
ERROR3	DB	  10,13,'Nepodarilo sa zatvorit subor$'
ERROR4	DB	  10,13,'cislo mimo rozsahu<-32768 ; 32767>$'
OK1	DB	  10,13,'otvorenie suboru: OK',10,13,'$'
OK	DB	  10,13,'subor je zavrety, vsetko prebehlo OK$'

handler	dw	0
subor   db 'pokus.txt',0        ; Nazov suboru
chyba   db 'Chyba pri praci so suborom !',13,10,'$'
text1 	DB	  10,13,10,13,'Prebieha usporiadanie...',10,13,'$'
text2 	DB	  10,13,'Suma parnych zapornych cisel: $'
text3	DB	  10,13,'Nacitanie a konverzia prebehla v poriadku.$' 
T_sort	db	10,13,'Sort Ukonceny.$'

FILEI  DB        'IN.TXT',0
FILEO  DB        'OUT.TXT',0

POCET 	DB	0,0

LDATA   DB        255 DUP('$')
SDATA	DB	255 DUP(0)

to_print DW	0
number 	db 	7,0,7 dup(0)
dlzka	dw	0
pc	db	0
pom	db	0
pom2	dw	0
swap	db	0
data1	db	0
data2	db	0
	.code                   ; definicia kodoveho segmentu

openf:	mov	ah, 3dh
	mov	dx, offset subor
	mov	al, 2
	int 	21h
	mov	handler,ax
	mov	dx, offset ok1
	mov	ah,09h
	int	21h
	jnc	loaddata
	mov	dx, offset error1
	mov	ah,09h
	int	21h
	jmp 	koniec

loaddata:			;inak je handler v AX ale budem ho potrebovat pri zatvarani suboru
	mov	bx, handler
	;mov	bx, ax
	mov	ah, 3fh		;pre nacitavanie
	mov	dx, offset Ldata
	mov	cx, 200		;maximalny pocet znakov
	int	21h
	
	
	jnc	closef
	mov	dx, offset error2
	mov	ah, 09h
	int	21h
	jmp	koniec

closef:
	mov	bx, handler
	mov	ah, 3eh		;zavretie vstupneho suboru
	int	21h
;	jnc	cenvertbin
;	jnc	loaddata
	mov	dx, offset Ldata
	mov	ah,09h
	int	21h
	
	mov	dx, offset OK
	mov	ah,09h
	int	21h
	call	rdnumber

;	jmp	koniec

;-prevod cisla z retazca do cisla v dvojkovom doplnkovom kode-	
rdnumber proc			;vstupny v BX, vystup AX, znamienko CH, nacital som cislo CL=1 inak CL=0
	mov	bx, offset LDATA

read_again:
	xor	cx,cx
	xor	dx,dx
	xor	ax,ax

analyze:
	mov	dl,[bx]
	cmp	dl,47		;je to cislo
	ja	analyze1

	jmp	bad

analyze1:
	cmp	dl,57		;je to cislo
	jna	positive	;cislo je kladne(ja vacsie)

bad:	
	cmp	cl,1		;presvedcim sa ci som uz spracovcal cele cislo
	jz	endstr
				;v ax ucelene cislo
				;v ch znamienko

	cmp	byte ptr[bx],'-';je to znamienko
	jz	set_sign	
				;nieje to znamienko
	cmp	byte ptr[bx],0	;kontrola konce retazca
	jz	endstr

	cmp	dlzka,0
	jnz	next1
;	call 	rd_done
;	call	koniec
	ret

next1:	xor	cx,cx
	inc 	bx
	dec	dlzka
	jmp	analyze

set_sign:
	mov	ch,1		;ak '-' => cl <- 1
	inc	bx		;posun
	dec	dlzka
	jmp	analyze		;pokracovat v retazci
	
positive:
	mov	cl,1
	mov	dl,10		;10-tkou sa bude nasobit
	mul	dx		;AX <= AX * 10
	mov	dl,[bx]		;nacitanie znaku
	sub	dl,30h		;z ASCII znaku sa dostane cislo
	add	ax,dx		;pripocitanie
	inc	bx		;posun
	dec	dlzka
	jmp	analyze		;pokracovanie v analyze 

endstr:
	cmp	cl,1		;je to ucelene cislo ?
	jz	range		;ak ano pokracuj dalej
	call	sort		;**********************************************prechod k sortovaniu
;	ret
range:	cmp	ch,1		;ak je cislo zaporne
	jz	mns
	cmp	ax,99		;max. klad. cislo
	ja	err_r		;nespravny rozsah => koniec

	jmp	save_num
mns:	
	cmp	ax,99		;max. zapor. cislo
	ja	err_r		;nespravny rozsah => koniec

save_num:
	push 	bx		; bx -> stack
	
	mov	bx,offset POCET
	mov	dh,[bx]	
	inc	bx
	mov	dl,[bx]
	mov	bx,offset LDATA
	add	bx,dx
	cmp	ch,1		;je to zaporne cislo
	jnz	pos_num		;ak je tak do doplnku
	not	ax		;negacia
	inc	ax		;ax = ax+1
pos_num:
;	mov	[bx],ah		;*bx<- ah
;	inc	bx
	mov	[bx],al		;*bx<- al {..,[ah][al],[ah][al],..}
	add	dx,1		;2
	mov	bx,offset pocet
	mov	[bx],dh
	inc	bx
	mov	[bx],dl
	pop	bx		;bx <- stack
	inc	pc		;pocet cisel
	jmp	read_again
err_r:
	mov	dx, offset ERROR4
	mov	ah,9
	int	21h
	jmp 	koniec		;koniec programu
rdnumber 	endp
;Koniec procedury konverzie cisiel 







;--------Triedenie vzostupne cisel v doplnkovom kode----
sort	proc	
	xor	ax,ax
	xor	bx,bx
	xor	cx,cx
	xor	dx,dx
	mov	al,pc			;pc - Pocet Cisel
vn2:	mov	cl,pc
vn1:	mov	dl,pc
	mov	si,offset ldata-1
	add	si,cx
	mov	bx,[si]
	mov	dx,bx
	and	dx,8080h
	cmp	dx,8080h
	jz	zaporne
	cmp	dx,0
	jz	kladne
	cmp	dx,8000h
	jz	horne_zap
	cmp	dx,80h
	jz	dolne_zap

zaporne:cmp	bh,bl
	jnb	dalej
	mov	swap,bh
	mov	bh,bl
	mov	bl,swap
	jmp 	dalej
kladne: cmp	bh,bl
	jnb	dalej
	mov	swap,bh
	mov	bh,bl
	mov	bl,swap
	jmp	dalej
horne_zap:
	mov	swap,bh
	mov	bh,bl
	mov	bl,swap
dolne_zap:

	mov	[si],bl
	inc	si
	mov	[si],bh
;	sub	ldata,cl
	
dalej:	loop	vn1
	dec	ax
	cmp	ax,0
	jnz	vn2

	mov	ah,09h
	mov	dx,offset T_sort
	int	21h


	ret
sort	endp







Start:
       mov ax,@data
       mov ds,ax

       mov dx,offset subor
       jmp openf

convertbin:			;prevod cisla z dec -> bin
	call	rdnumber
	





koniec:	mov	ax,4c00h	;ukoncenie programu
	int 	21h

end start	









