;
;					EJEMPLO 1.8
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación
;
;Este ejemplo realiza el producto de dos números de 8 bits generando un resultado de
;16 bits.

;El programa emplea la misma mecánica que al hacer un producto sobre el papel.
;Hay que destacar que el programa se ejecuta siempre en el mismo intervalo de tiempo,
;sean cuales fueren los operandos.
		
		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos

		cblock	0x10		;Inicio de definición de variables
	
		Multiplicando		;Variable para el multiplicando
		Multiplicador		;Variable para el multiplicador
		Resultado_H		;Parte alta del resultado
		Resultado_L		;Parte baja del resultado
		Estatus_Temp		;Reg. de estado temporal
		Contador		;Variable con número de veces a operar

		endc			;Fin de definiciones

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

Inicio		clrf	Resultado_H
		clrf	Resultado_L	;Pone a 0000 el resultado inicial
		movlw	0x08
		movwf	Contador	;Inicia el contador con 8		
		bcf	STATUS,C	;Borra el carry

Bucle		movf	Multiplicando,W	;Carga el multiplicando
		btfsc	Multiplicador,0	;Es 1 el bit de menos peso del multiplicador ??
		addwf	Resultado_H,F	;Si, se suma el multiplicando

		rrf	Resultado_H,F
		rrf	Resultado_L,F	;Desplazamiento a la derecha del resultado

;Rota a la derecha el multiplicador sin que se modifique el flag Carry

Rota_sin_Carry	movf	STATUS,W
		movwf	Estatus_Temp	;Salva temporalmente el carry
		rrf	Multiplicador,F	;Desplaza a la derecha el multiplicador		
		movf	Estatus_Temp,W
		movwf	STATUS		;Recupera el carry original

		decfsz	Contador,F	;Repite el bucle 8 veces
		goto	Bucle

Stop		nop			;Poner breakpoint de parada
		nop

		end			;Fin del programa fuente
