; ZONA DE DATOS ***************************************************

LIST P=16F84A			;Procesador
INCLUDE <P16F84A.INC>	;Cabecera con los operandos empleados aquí
ERRORLEVEL -302, -205, -203

; ZONA DE VARIABLES ***********************************************

CBLOCK 0x0C				;Zona de memoria de usuario en RAM
	aux
	dato
	contador_4
ENDC


; ZONA DE CÓDIGO **************************************************

	org 0x00
	goto configurar_entradas
	org 0x05
	goto configurar_entradas

configurar_entradas		;si el valor es 0 entonces es salida si el valor es 1 es entrada
	bsf STATUS, RP0		;accedemos al banco 1 para configurar PORTA y PORTB
	movlw 0x1F
	movwf TRISB			;las patillas desde RB0 a RB4 quedan configuradas como entrada
	movlw 0xFC
	movwf TRISA			;las patillas RA0 y RA1 son salida
	bcf STATUS, RP0		;regresamos al banco 0
	
;el protocolo que usa el ordenador establece que el dato a enviar
;es 0x1X, donde X es un valor cualesquiera por lo que siempre tendré 
;como palabra el bit número 5 como 1 cuando se mande un dato
;y el bit 5 valdrá 0 cuando el ordenador no mande nada (el bit número
;5 del puerto paralelo).
inicio
	bcf PORTA, 0		;no se envia información alguna
	btfss PORTB, 4		;hasta que no entre un 1 en la patilla del PORTB regreso a este punto
	goto inicio
	
principal
; hay que conectar la patilla RB2 a la patilla busy (la número 11) del puerto paralelo 
; del emisor para retener el dato que se está enviando y no mande el próximo dato.
	bsf PORTA, 0		;Aviso a receptor que allá voy
	bcf PORTA, 1
	movfw PORTB
	movwf dato
	movlw 0x10
	subwf dato, 1
	bcf PORTA, 0		;el receptor ya está listo para la recepción de datos
		
;el PORTA lee la entrada al completo por lo que necesito un contador para saber el numero de entradas que me quedan por leer
	movlw 4	
	movwf contador_4
;aquí entramos en la parte principal del programa que consiste en 
;copiar cada dato del PORTA y mandarlo a la patilla emisora
envio_datos
	rrf dato, 1
	btfss STATUS, C
	bcf PORTA, 1
	btfsc STATUS, C
	bsf PORTA, 1
	call demora_200µs
	decfsz contador_4, 1
	goto envio_datos
	   
	bcf PORTA, 0		;apago la emisión de la patilla emisora por si estubiera activada
	bsf PORTA, 1		;una vez testeadas las entradas y enviado el dato esperamos a que el emisor mande el dato siguiente
	call demora_200µs	;este también es para sincronismo
	goto inicio

; RUTINAS DE RETARDO **********************************************
demora_200µs
	movlw     .48       ; 1 set numero de repeticion 
	goto PLoop
demora_100µs
	movlw     .23       ; 1 set numero de repeticion 
	nop
	nop
PLoop
    movwf     aux	    ; 1 |
PLoop0  
	nop              ; 1 clear watchdog
    decfsz    aux, 1 	; 1 + (1) es el tiempo 0  ?
    goto      PLoop0    ; 2 no, loop
	nop              ; 1 ciclo delay
return		            ; 2+2 Fin.
; FIN DE RUTINAS DE RETARDo ***************************************
end
