;
;					ESEMPIO 1.8
;
;				Autore: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Esempio per simulazione
;
;Questo esempio realizza il prodotto di due numeri di 8 bits generando un risultato di
;16 bits.

;Il programma impiega lo stesso meccanismo di realizzazione di un prodotto su carta.
;Si noti che il programma viene eseguito sempre nello stesso intervallo di tempo,
;qualunque siano gli operandi.
		
		List	p=16F84		;Tipo di processore
		include	"P16F84.INC"	;Definizioni di registri interni

		cblock	0x10		;Inizio di definizione di variabili
	
		Moltiplicando		;Variabile per il moltiplicando
		Moltiplicatore		;Variabile per il moltiplicatore
		Risultato_H		;Parte alta del risultato
		Risultato_L		;Parte bassa del risultato
		Estatus_Temp		;Reg. di stato temporale
		Contatore		;Variabile con numero di volte per eseguire operazioni

		endc			;Fine delle definizioni

		org	0x00		;Vettore di Reset
		goto	Inizio

		org	0x05		;Salva il vettore di interrupt

Inizio		clrf	Risultato_H
		clrf	Risultato_L	;Metti a 0000 il risultato iniziale
		movlw	0x08
		movwf	Contatore	;Avvia il contatore con 8		
		bcf	STATUS,C	;Cancella il carry

Loop		movf	Moltiplicando,W	;Carica il moltiplicando
		btfsc	Moltiplicatore,0	;E' 1 il bit di minor peso del moltiplicatore ??
		addwf	Risultato_H,F	;Sė, si somma il moltiplicando

		rrf	Risultato_H,F
		rrf	Risultato_L,F	;Spostamento a destra del risultato

;Ruota a destra il moltiplicatore senza che si modifichi il flag Carry

Ruota_sen_Carry	movf	STATUS,W
		movwf	Estatus_Temp	;Salva provvisoriamente il carry
		rrf	Moltiplicatore,F	;Sposta a destra il moltiplicatore		
		movf	Estatus_Temp,W
		movwf	STATUS		;Recupera il carry originale

		decfsz	Contatore,F	;Ripeti il loop 8 volte
		goto	Loop

Stop		nop			;Metti breakpoint d'arresto
		nop

		end			;Fine del programma principale
