;
;					ESEMPIO 1.9
;
;				Autore: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Esempio per simulazione
;
;Converti il valore binario presente in posizione 0x10 in BCD. Il risultato va depositato 
;nelle variabili Buffer_H e Buffer_L.
		
		List	p=16F84		;Tipo di processore
		include	"P16F84.INC"	;Definizioni di registri interni

Binario		equ	0x10		;Valore binario iniziale
Buffer_H	equ	0x11		;Parte alta del risultato
Buffer_L	equ	0x12		;Parte bassa del risultato
Temp_1		equ	0x13		;Registro temporale

		org	0x00		;Vettore di Reset
		goto	Inizio

		org	0x05		;Salva il vettore di interrupt

Inizio	        movf	Binario,W	;Carica il valore binario iniziale
		clrf 	Buffer_L
                clrf 	Buffer_H	;Attiva registri di lavoro
                                     
BIN_BCD_1       addlw 	0xf6          	;Sottrai 10 mediante somma di complemento a 2.
                btfss 	STATUS,C       	;C'è Carry?
                goto 	BIN_BCD_3       ;NO.
                movwf 	Temp_1         	;SI.Conservare nel registro temporale.
                incf 	Buffer_L,F      ;Aumentare byte basso, conservarlo e inviare...
                movf 	Buffer_L,W      ;..copia al ==> W...
                xorlw 	b'00001010'    	;..0Ah xor W. 
                btfss 	STATUS,Z       	;Buffer_L è uguale a 10 ??
                goto 	BIN_BCD_2       ;NO.
                clrf 	Buffer_L        ;SI. Metti Buffer_L a 0
                incf 	Buffer_H,F      ;Incrementare Buffer_H
BIN_BCD_2       movf 	Temp_1,W        ;Recuperare il dato.
                goto 	BIN_BCD_1       ;Continuare l'operazione.

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	   		;Metti breakpoint d'arresto
		nop

		end			;Fine del programma principale
