;!
;!
;!
;!
;!
;!
;pozn:vstup musi mat format: cislo [enter] cislo [enter] cislo [enter] ...
;jednoducho na za poslednym cislom musis stuknut enter. chapes nie?
;!
;!
;!
;!
;!

;XXXXX XXXXX kr.XX  20XXX
;zadanie c.2

.MODEL SMALL
.stack 100h

DAT	SEGMENT
c0	DW 1
c1	DW 10
c2	DW 100		;konstanty
c3	DW 1000
c4	DW 10000
retaz	db 20 dup(?)
cisla	dw 20 dup(?)
pocetc	dw 0
numt 	dw (?)
desat	dw 10		;pouzita je desiatkova sustava
subor	db 'subor.txt',0
suborw	db 'write.txt',0
handl	dw (?)
buf	db (?)
DAT	ENDS

CODE 	SEGMENT
	ASSUME CS:CODE,DS:DAT

START:	MOV AX,SEG DAT     
	MOV DS,AX          
	CALL maz           	;maze obrazvoku

	mov dx,offset cisla
	mov di,dx
	mov ah,3dh	;otvorenie sub.
	mov dx,offset subor
	mov al,0
	int 21h
	mov word ptr handl,ax
s1:	call citajC
	cmp ax,0
	jz s1a
	mov dx,offset retaz
	call konvRnC
	mov [di],ax
	inc di
	inc di
	inc word ptr pocetc
	jmp s1

s1a:	mov ah,3eh	;zatvorenie suboru
	mov bx,handl
	int 21h
	

	mov si,offset cisla ;;triedenie
	mov bx,si
	add bx,pocetc
	add bx,pocetc
	mov di,si
	
s4:	mov ax,[di]
	cmp [si],ax
	js s3
	mov ax,[si]
	mov dx,[di]
	mov [si],dx
	mov [di],ax
s3:	inc di
	inc di
	cmp di,bx
	jb s4
	inc si
	inc si
	mov di,si
	cmp si,bx
	jb s4
	
	mov ah,3ch ;vytvorenie sub
	mov dx,offset suborw
	mov cx,0
	int 21h
	

	mov ah,3dh	;otvorenie pre zapis
	mov dx,offset suborw
	mov al,1
	int 21h
	mov word ptr handl,ax

s5:	mov dx,offset cisla	;zapis
	mov si,dx
	mov cx,pocetc
s2:	mov ax,[si]
	inc si
	inc si
	call vypisC
	call odriadkuj
	loop s2


	mov ah,3eh	;zatvorenie suboru
	mov bx,handl
	int 21h





	jmp koniec


citajC: mov dx,offset retaz
	mov si,dx
	mov cx,0
cit1:	call readFch
	cmp ax,0
	jz end1
	cmp byte ptr buf,13
	jz end1
	mov bl,buf
	mov [si],bl
	inc si
	inc cx
	jmp cit1
end1:	call readFch
	ret


;;;;citanie znaku zo suboru
readFch:push cx
	mov ah,3fh
	mov bx,handl
	mov dx,offset buf
	mov cx,1
	int 21h
	pop cx
	ret	

;;;;zapisovanie znaku do suboru
writeFch:push cx
	push bx
	push ax
	mov ah,40h
	mov bx,handl
	mov buf,dl
	mov dx,offset buf
	mov cx,1
	int 21h
	pop ax
	pop bx
	pop cx
	ret	


;;;;;konvertuje retazec na cislo. (retazec v DX na cislo AX)	retazec ma dlzku CX
konvRnC:push si
	push di
	push cx
	mov word ptr numt,0	;nulovanie vysledku konverzie v pamati
	add dx,cx		
	dec dx                  ;
	mov si,dx 		;DX ukazuje na posledny znak v retazci (source)
	mov di,offset c0        ;index v konstantach
k1:	mov al,[si]
	cmp al,'-'              ;ak znak v retazci nie je '-'
	jz konvRnCz		;ak je tak je konverzia na konci, ale vysledok sa musi este previest na zaporne cislo
	sub al,30h              ;tak znak prevedie na BCD kod 
	cmp al,byte ptr desat
	jae konvRnCk
	mov ah,0
	mul word ptr [di]       ; a vynasobi ho prislusnou vahou (1,10,100,1000,....)
	cmp dx,0		;kontrola ci je cislo v rozsahu <-32768;32767>
	jnz mimoR ;vstup mimo rozsahu
	add word ptr numt,ax	;ak je tak sa tento medzi vysledok pripocita k celkovemu vysledku
	dec si
	inc di
	inc di			;presun vstupnych indexov
	loop k1			;dokial nie je spracovany cely retazec tak pokracuje dalsim znakom
	jmp konvRnCk
konvRnCz:neg word ptr numt	;cislo bude zaporne
konvRnCk:mov ax,word ptr numt	;zapis celkoveho vysledku do vystupneho reg. AX
xret:	pop cx
	pop di
	pop si
	ret		;navrat z konverzie
mimoR:	mov ax,0	;ak bolo zadane cislo prilis velke tak sa navrati hodnota 0
	jmp xret		;navrat z konverzie

;;;;podprogram vypisuje zapisuje cislo z AX do suboru
vypisC:	push dx
	push cx
	mov cx,0
	test ax,8000h	;znamienkovy test
	jz vypisC1
	neg ax
	mov dl,'-'	;ak je cislo zaporne tak sa vypise znak '-' a cislo sa prevedie na kladne
	push ax
	call writeFch
	pop ax
vypisC1:mov dx,0
	cmp ax,word ptr desat	;ak je cislo v AX mensie ako 10 to znamena ze v AX je najvyssia cifra a cislo sa uz nemusi delit desiatimi
	jb vypisC2			;preto skoci na ...
	div word ptr desat              ;deli desiatimi a zvysok teda najnizciu cifru
	push dx				;ulozi do zasobnika
	inc cx				;pocitadlo kolko cifier je ulozenych v zasobniku
	jmp vypisC1
vypisC2:add al,30h		;vypise najvyssiu cifru
	mov ah,2
	mov dl,al
	call writeFch
	cmp cx,0                ;ak v zasobniku nie su ziadne nizsie cifry tak skonci vypisovanie
	jz vypisC4
vypisC3:pop dx			;zobere cifru zo zasobnika,
	add dl,30h		;upravy ju na ASCII kod
	call writeFch
	loop vypisC3		;zmensi pocet cifier v zasobniku a ked uz tam ziadna nie je tak skonci vypisovanie
vypisC4:pop cx
	pop dx
	ret	

;;;;procedura vypisuje znak v al
;vypz:	mov dl,al
;	mov ah,2
;	int 21h
;	ret

;;;;caka na stlacenie lubovolnej klavesy
stlack:	MOV ah,07
	INT 21h            
maz:	MOV ax,600h		
	MOV bh,07h
	MOV cx,0
	MOV dx,184fh
	INT 10h			;zmaze obrazovku
	MOV ah,2
	MOV bh,0h
	MOV dx,0h
	INT 10h			;nastavy kurzor do laveho horneho rohu obr.
	RET

;;;;presunie kurzor v subore na dalsi riadok
odriadkuj: mov dl,13
	call writeFch
	mov dl,10
	call writeFch
	ret

koniec:	MOV AX, 4C00H      	;ukoncenie prg.
	INT 21H

CODE	ENDS
	END START