;
;					EJEMPLO 1.9
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación
;
;Convierte el valor binario presente en posición 0x10 en BCD. El resultado se deposita 
;en las variables Buffer_H y Buffer_L.
		
		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos

Binario		equ	0x10		;Valor binario inicial
Buffer_H	equ	0x11		;Parte alta del resultado
Buffer_L	equ	0x12		;Parte baja del resultado
Temp_1		equ	0x13		;Registro temporal

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

Inicio	        movf	Binario,W	;Carga el valor binario inicial
		clrf 	Buffer_L
                clrf 	Buffer_H	;Inicia registros de trabajo
                                     
BIN_BCD_1       addlw 	0xf6          	;Resta 10 mediante suma de complemento a 2.
                btfss 	STATUS,C       	;Hay Carry?
                goto 	BIN_BCD_3       ;NO.
                movwf 	Temp_1         	;SI.Guardar en registro temporal.
                incf 	Buffer_L,F      ;Incrementar byte bajo, guardarlo y enviar...
                movf 	Buffer_L,W      ;..copia al ==> W...
                xorlw 	b'00001010'    	;..0Ah xor W. 
                btfss 	STATUS,Z       	;Buffer_L es igual a 10 ??
                goto 	BIN_BCD_2       ;NO.
                clrf 	Buffer_L        ;SI. Poner Buffer_L a 0
                incf 	Buffer_H,F      ;Incrementar Buffer_H
BIN_BCD_2       movf 	Temp_1,W        ;Recuperar el dato.
                goto 	BIN_BCD_1       ;Continuar la operación.

BIN_BCD_3       addlw 	H'0A'          	;TEMPO + 0Ah
                swapf 	Buffer_L,F     	;<3:0> <==> <7:4> y ==> Buffer_L
                iorwf 	Buffer_L,F     	;W OR Buffer_L ==> Buffer_L

Stop		nop	   		;Poner breakpoint de parada
		nop

		end			;Fin del programa fuente
