; ********************************************************************************
; SORGENTE    
; PROGRAMMA DI BENDINI CLAUDIO
; ADVANCED iDEA MECHANICS
; MICROCONTROLLORE PIC 16F877A
; A.S. 2013-2014
; IST. SUP. " S. D'ARZO "
; LINGUAGGIO DI PROGRAMMAZIONE : ASSEMBLER
; NOME SORGENTE : CARRY_BORROW.asm
; **********************************************************************AiM*******
;DEFINIZIONE DEI PIN DEL MICROCONTROLLORE
;
; INGRESSI:						USCITE:
; RA0 : SOMMA	(2)			RA0 : (2)					
; RA1 : SOTTRAZIONE	(3)			RA1 : (3)
; RA2 :	(4)					RA2 : (4)
; RA3 :	(5)					RA3 : CARRY/BORRO		(5)
; RA4 :	(6)					RA4 : DCARRY/DBOWWO	(6)
; RA5 :	(7)					RA5 : FLAG Z			(7)
; RB0 :	(33)					RB0 : VALUE (33)
; RB1 :	(34)					RB1 : VALUE (34)
; RB2 :	(35)					RB2 : VALUE (35)
; RB3 :	(36)					RB3 : VALUE (36)
; RB4 :	(37)					RB4 : VALUE (37)
; RB5 :	(38)					RB5 : VALUE (38)
; RB6 :	(39)					RB6 : VALUE (39)
; RB7 :	(40)					RB7 : VALUE (40)
; RC0 : VALUE (15)				RC0 : (15)
; RC1 : VALUE (16)				RC1 : (16)
; RC2 : VALUE (17)				RC2 : (17)
; RC3 : VALUE (18)				RC3 : (18)
; RC4 : VALUE (23)				RC4 : (23)
; RC5 : VALUE (24)				RC5 : (24)
; RC6 : VALUE (25)				RC6 : (25)
; RC7 : VALUE (26)				RC7 : (26)
; RD0 : VALUE (19)				RD0 : (19)
; RD1 : VALUE (20)				RD1 : (20)
; RD2 : VALUE (21)				RD2 : (21)
; RD3 : VALUE (22)				RD3 : (22)
; RD4 : VALUE (27)				RD4 : (27)
; RD5 : VALUE (28)				RD5 : (28)
; RD6 : VALUE (29)				RD6 : (29)
; RD7 : VALUE (30)				RD7 : (30)
; RE0 :	(8)					RE0 : (8)
; RE1 :	(9)					RE1 : (9)
; RE2 :	(10)					RE2 :(10)
;
;--------------------------------------------------------------------------------------------------------
; N.B. TRA PARENTESI SONO INDICATI I PIN DEL PACKAGING DIP DEL uC
;--------------------------------------------------------------------------------------------------------
;
; DIRETTIVE:
;
		#INCLUDE	"p16F877A.inc"
		LIST	P=16F877A,	F=INHX8M
		__CONFIG 0X3FBA 
;
; LISTA DELLE EQU:
;
DLY1	EQU 20H	; DEFINISCO QUESTE LOCAZIONI DI MEMORIA
DLY2	EQU 21H	; CHE USERO' COME CONTAORI NEL 
DLY3	EQU 22H 	; RITARDO

;---------------------------------------------------------------------------------
;
;
		ORG	00		; INDIRIZZO INIZIO PROGRAMMA
 		GOTO	MAIN	; SALTA SUBROUTINE INTERRUPT
		ORG	04		; INDIRIZZO SUBROUTINE INTERRUPT
		;
		;
		;
		RETFIE		; RITORNA AL PUNTO DOVE L'INTERRUPT E' STATO CHIAMATO
;

;					----------------------------------------
MAIN:					; PROGRAMMA PRINCIPALE|
;					----------------------------------------------------------------------------------
SETUP:				; SUBROUTINE ADIBITA ALLA CONFIGURAZIONE INIZIALE|
;					----------------------------------------------------------------------------------
	BCF		STATUS,6	; VADO AL BANCO 1
	BSF		STATUS,5	; "
	MOVLW	0XFF		; IMPOSTO COME INGRESSI PORT C E D
	MOVWF	TRISC	; "
	MOVWF	TRISD	; "
	BCF		TRISE,4	; DISABILITO LA PSP MODE
	CLRF		TRISB	; IMPOSTO COME USCITA IL PORTB
	MOVLW	0X03		; IMPOSTO COME INGRESSI E USCITE IL PORTA
	MOVWF	TRISA	; "
	MOVLW	0X3F		; IMPOSTO ADCON1 PER INGRESSI DIGITALI
	MOVWF	ADCON1	; "
	BCF		STATUS,5	; TORNO AL BANCO 0
	CLRF		PORTB	; RESETTO IL PORTB
	MOVLW	0XFF		; CARICO I CONTATORI
	MOVWF	DLY1		; "
	MOVWF	DLY2		; "
	MOVLW	0X09		; "
	MOVWF	DLY3		; "
;					-----------------------------------------------
CHECK:				; LABEL DI ATTESA DI COMANDO|
;					-----------------------------------------------
	BTFSC	PORTA,0	; CONTROLLO LA RICHIESTA DI SOMMA
	GOTO	SUM		; VADO ALLA SOMMA
	BTFSC	PORTA,1	; CONTROLLO LA RICHIESTA DI DIFFERENZA
	GOTO	DIFF		; VADO ALLA DIFFERENZA
	GOTO	CHECK	; RIPETO LA LABEL
;					---------------------------
SUM:					; LABEL DI SOMMA|
;					---------------------------
	BTFSC	PORTA,0	; ATTESA DI RILASCIO DEL PULSANTE
	GOTO	SUM		; RITORNO PER L'ATTESA
	BCF		STATUS,0	; RESETTO IL CARRY
	BCF		STATUS,1	; RESETTO IL DCARRY
	BCF		STATUS,2	; RESETTO IL FALG Z
	BCF		PORTA,3	; RESETTO IL FLAG CARRY
	BCF		PORTA,4	; RESETTO IL FLAG DCARRY
	BCF		PORTA,5	; RESETTO IL FLAG DEL FALG Z
	CLRF		PORTB	; PULISCO IL REGISTRO DI RISULTATO
	MOVF	PORTD,0	; CARICO IL VALORE DEL PORTD
	ADDWF	PORTC,0	; ADDIZIONO IL CONT.DI "W" ( PORTD ) A "C" E TENGO IL RISULTATO IN "W"	
	MOVWF	PORTB	; METTO IL RISULTATO NEL PORTB
	BTFSC	STATUS,0	;  CONTROLLO IL CARRY
	BSF		PORTA,3	; SETTO IL FLAG CARRY
	BTFSC	STATUS,1	; CONTROLLO IL DCARRY
	BSF		PORTA,4	; SETTO IL FLAG DCARRY
	BTFSC	STATUS,2	; CONTROLLO IL FLAG Z
	BSF		PORTA,5	; SETTO IL FLAG DI FALG Z
	GOTO	CHECK	; RITORNO ALL'ATTESA
;					----------------------------------
DIFF:					; LABEL DI DIFFERENZA|
;					----------------------------------
	BTFSC	PORTA,1	; ATTESA DI RILASCIO DEL PULSANTE
	GOTO	DIFF		; RITORNO PER L'ATTESA
	BSF		STATUS,0	; RESETTO IL BORROW
	BSF		STATUS,1	; RESETTO IL DBORROW
	BCF		STATUS,2	; RESETTO IL FALG Z
	BSF		PORTA,3	; RESETTO IL FLAG BORROW
	BSF		PORTA,4	; RESETTO IL FLAG DBORROW
	BCF		PORTA,5	; RESETTO IL FLAG DEL FALG Z
	CLRF		PORTB	; PULISCO IL REGISTRO DI RISULTATO
	MOVF	PORTD,0	; CARICO IL VALORE DEL PORTD
	SUBWF	PORTC,0	; SOTTRAGGO IL CONT. DI "W" ( PORTD ) A "C" E TENGO I LRISULTATO IN "W"	
	MOVWF	PORTB	; METTO IL RISULTATO NEL PORTB
	BTFSS	STATUS,0	; CONTROLLO IL BORROW
	BSF		PORTA,3	; SETTO IL FLAG BORROW
	BTFSS	STATUS,1	; CONTROLLO IL DBORROW
	BSF		PORTA,4	; SETTO IL FLAG DBORROW
	BTFSC	STATUS,2	; CONTROLLO IL FLAG Z
	BSF		PORTA,5	; SETTO IL FLAG DI FALG Z
	GOTO	CHECK	; RITORNO ALL'ATTESA
;
	DELAY:					; LABEL DI RITARDO 1°ORDINE
		DECFSZ	DLY1			; DECREMENTO DI UNO DLY1
		GOTO	DELAY		; RITORNO ALL'INIZIO
		GOTO	DELAY2		; SE A 0 DLY SALTA A DLY2
;
	DELAY2:					; LABEL DI RIATRDO 2°ORDINE
		MOVLW	0XFF			; RICARICO IL PRIMO CONTATORE
		MOVWF	DLY1			; "
		DECFSZ	DLY2			; DECREMENTO DI UNO DLY2
		GOTO	DELAY			; RITORNO A DELAY
		GOTO	DELAY3		; MI DIRIGO AL TERZO TIMER
;
	DELAY3:					; LABEL DI RITARDO 3°ORDINE
		MOVLW	0XFF			; RICARICO IL SECONDO CONTATORE
		MOVWF	DLY2			; "
		DECFSZ	DLY3			; DECREMENTO DI UNO IL 3 CONTATORE
		GOTO	DELAY		; RITORNO AL DELAY PRINCIPALE
		MOVLW	0X09			; RICARICO IL 3 TIMER
		MOVWF	DLY3			; "
		RETURN				; RITORNO AL PROGRAMMA
;	
;-----------------------------------------------------------------------------------------------------------------------------------------------------
		END				; DIRETTIVA CHE INDICA IL TERMINE DEL PROG
