; Programa P3, fet amb unes hores a partir de PARAM2.ASM 
; que ordena els caracters escrits en pantalla
; #####################practik 3######################
	NAME	Param
;
; Macro per INT 21h
DosCall	MACRO 	Serv
	MOV	AH,Serv
	INT	21h
ENDM
;
; Macro para inicializar DS apuntando al segmento data
InitDS	MACRO
		MOV	AX,data
		MOV	DS,AX
		ASSUME DS:data
ENDM
;
pila	SEGMENT para stack 'STACK'
		DB	56 DUP(0)
pila	ENDS
;
data	SEGMENT word public 'DATA'
data	ENDS
;
code	SEGMENT byte public 'CODE'
	ASSUME CS:code
main	PROC	far
		InitDS
		mov di,80h	;posem a cx la longitud
		mov cl,es:[di]	;dels parametres entrats
		mov ch,0	;que esta en es:[80h]
	; Algorisme d'ordenació		
		dec cx
		mov si,cx
        grp2:
		mov di,0081h
		dec si
		mov cx,si
        grp1:
		inc di		
		mov al,byte ptr es:[di]
		mov bl,byte ptr es:[di]+1
		cmp al,bl
		ja smod
		jbe nmod
	smod:	
		mov byte ptr es:[di],bl
		mov byte ptr es:[di]+1,al
	nmod:	
		loop grp1
		mov cx,si
		loop grp2
	; Tenim els nombres ordenats
	; Ara treiem els caracters per pantalla
		mov ax,es
                mov ds,ax
		mov bx,81h	
		CALL	Escribe
	
		mov al,20h	
		call Escribe_Car
		mov bx,0080h
		mov al,[bx]
		add al,2Fh
; ojo falte implementar un cinversor a ascii (prac2) (intastr)
		call Escribe_Car



		DosCall	4Ch ;Retorno al DOS
main	ENDP
;
Escribe	PROC near
		mov 	di,0080h
		mov	cx,[di]
		mov	ch,0
	Escr1:
		MOV	AL,[BX] ;AL=caracter actual
		CALL	Escribe_Car ;escribe un caracter
		INC	BX
		LOOP	Escr1 ;siguiente caract.
	;
		MOV	AL,13 ;caracter de retorno
		CALL	Escribe_Car
		MOV	AL,10 ;caracter de LF linefeed
		CALL	Escribe_Car
	;
		RET
Escribe	ENDP
;
;
;Procedimiento para escribir en pantalla el caracter en AL:
;
Escribe_Car	PROC near
		PUSH	BX ;salva registro BX
		MOV	BX,0
		MOV	AH,14 ;servicio 14 = escritura
		INT	10h ;interrupcion BIOS de pantalla
		POP	BX
	;
		RET
Escribe_Car	ENDP
;
code	ENDS
	END	main
