; Programa PARAM2.ASM que escribe un mensaje en pantalla
; en funcion del parametro que se le pasa en la
; linea de comandos
;	Ej: c:\param 3
;	ASI PSP+80h = ( 2 caracteres:blanco + '3')
;	PSP+81h = blanco, PSP+82h = '3'
;
; retocat per kerni a partir de la informació del PSP
; i ara si que funciona (sa de reeduir d'un el copmptador de
; misatges i anar amb compte amb la longitud



	NAME	Param
;
; Macro per INT 21h
DosCall	MACRO 	Serv
	MOV	AH,Serv
	INT	21h
ENDM
;
; Macro para inicializar ES apuntando al segmento data
InitES	MACRO
		MOV	AX,data
		MOV 	ES,AX
	; establece direccionamiento segmento de datos
		ASSUME ES:data
ENDM
;
; Macro para inicializar DS apuntando al segmento data
InitDS	MACRO
		MOV	AX,data
		MOV	DS,AX
	; establece direccionamiento segmento de datos
		ASSUME DS:data
ENDM
;
pila	SEGMENT para stack 'STACK'
		DB	128 DUP(0)
pila	ENDS
;
data	SEGMENT word public 'DATA'
	; definiciones de datos
	msg_long DB 40 		;longitud del mensaje	
	num	DB	0
	long	DB      0
	msg_vec DB "Debes dividir un gran problema en dos.  "
		DB "La programacion del 8086 es divertida.  " 
		DB "El BASIC era mas sencillo, claro!       " 
		DB "El PSP es muy util, lo ves ahora?       "
		DB "Con paciencia se puede programar todo.  "
		DB "Ultimo mensaje del dia.                 "
	NMSG 	= 6 ;numero de mensajes
	msg_err	DB "Error: parametro no valido                        "
data	ENDS
;
;
;
;
code	SEGMENT byte public 'CODE'
	ASSUME CS:code
main	PROC	far
	;
	; Prólogo estándar del programa
	;
	InitDS
	; Instrucciones de código
	; Mover area de parametros desde el PSP hasta nuestro
	; segmento de datos
		mov di,80h		;posem a long i cx la longitud
		mov al,byte ptr es:[di]	;dels parametres entrats
		mov long,al		;que estan en es:[80h]
		mov cl,es:[di]
		mov ch,0
	; El primer carácter debe ser un espacio en blanco
	; El segundo carácter debe ser el numero de mensaje escogido
		add di,2		;anem a buskr el num. i el posem
		mov al,byte ptr es:[di]	;a num (esta en es:[82h])
		mov num,al
	; Comprobación de validez de los datos y conversión
	; a valor numérico
		MOV	AX,0
		CMP 	long,2 ; num de car 2?
		JNZ 	error ;si no es =2 saltar a error
	;	mov	al,byte ptr es:[di] (tambe es pot fer aixi)(es encara va b)
		MOV	AL,num ;
		SUB	AL,'0' ;convers. de ASCII a num
		JC	error ;error si no es un numero
		CMP	AL,NMSG ; AL=num de mensajes
		JA 	error ;si es mayor que el numero de mensajes
	;seleccionar mensaje
		MOV 	BX,OFFSET msg_vec ;dir. del 1er mens.
		sub	al,1
		MUL	msg_long ;AX=AL*msg_long
		ADD 	BX,AX ;desplazamos puntero BX segun el mnsj.
		CALL	Escribe
	;
		DosCall	4Ch ;Retorno al DOS
		RET
	error:
		MOV	BX,OFFSET msg_err
		CALL Escribe
		DosCall	4Ch ;Retorno al DOS
	;
		RET
	;
main	ENDP
;
;
; Procedimiento para escribir en pantalla el mensaje apuntado porBX
; de longitud msg_long
;
Escribe	PROC near
		MOV	CH,0
		MOV	CL,msg_long ;num de caract. a escribir
	;
	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 (slto.lin.)
		CALL	Escribe_Car
	;
		RET
Escribe	ENDP
;
;
;Procedimiento para escribir en pantalla el caractes 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