; BRANCH_1.ASM
;
; Reads inputs RA.4, RA.3 and RA.2.  Based on value, the program branches
; to one of eight points.
;
; At each of these point a different thing is performed on LEDs on the 
; lower four bits of PORTB.
;
; Peter H. Anderson, MSU, Feb 16, '98  (Not checked)
;

	LIST p=16c84	
#include <c:\mplab\p16c84.inc>
	__CONFIG 11h

#define BASE 0CH

LOOP1	EQU BASE+0
LOOP2	EQU BASE+1
N_MSECS	EQU BASE+2

INDEX	EQU BASE+3

	ORG 000H

	BSF STATUS, RP0		; switch to bank 1 and

				; make Portb outputs

	CLRF TRISB		; 0 indicates an output

				; now PORTA
	BCF TRISA, 0		; make lower two bits of Porta outputs
	BCF TRISA, 1		;

	BSF TRISA, 2		; make bits 4, 3 and 2 inputs
	BSF TRISA, 3
	BSF TRISA, 4 

	BCF STATUS, RP0		; back to data bank 0

TOP:
	MOVF 	PORTA, W	; fetch from PORTA
	MOVWF	INDEX
	RRF	INDEX, F	
	RRF	INDEX, F
	MOVLW	07H
	ANDWF	INDEX, W	; INDEX is now RA.4, RA.3, RA.2

	ADDWF	PCL, F		; this is the equiv of Basic Stamp BRANCH
	GOTO	PLACE_0
	GOTO	PLACE_1
	GOTO	PLACE_2
	GOTO	PLACE_3
	GOTO	PLACE_4
	GOTO	PLACE_5
	GOTO	PLACE_6
	GOTO	PLACE_7
	
PLACE_0:
	CLRF	PORTB		; turn all LEDs off
	GOTO 	TOP

PLACE_1:
	MOVLW	01H
	MOVWF	PORTB
	GOTO	TOP		; turn on LED.0

PLACE_2:
	MOVLW	02H
	MOVWF	PORTB
	GOTO	TOP		; turn on LED.1

PLACE_3:
	MOVLW	04H
	MOVWF	PORTB
	GOTO	TOP		; turn on LED.2

PLACE_4:
	MOVLW	08H
	MOVWF	PORTB
	GOTO	TOP		; turn on LED.3

PLACE_5:
	MOVLW	.100		; flash LED.0
	MOVWF	N_MSECS
	BSF	PORTB, 0
	CALL 	DELAY
	BCF	PORTB, 0
	CALL	DELAY
	GOTO 	TOP

PLACE_6:
	MOVLW	.200		; alternately flash LED.1 and LED.0
	MOVWF	N_MSECS
	BCF	PORTB, 1
	BSF	PORTB, 0
	CALL	DELAY
	BSF	PORTB, 1
	BCF	PORTB, 0
	CALL	DELAY
	GOTO 	TOP

PLACE_7:			; alternately flash LED.3 and LED.2
	MOVLW	.200
	MOVWF	N_MSECS
	BCF	PORTB, 3
	BSF	PORTB, 2
	CALL	DELAY
	BSF	PORTB, 3
	BCF	PORTB, 2
	CALL	DELAY
	GOTO 	TOP


DELAY:	; delays N_MSECS
	; note that N_MSECS is set in main

	MOVF	N_MSECS, W	
	MOVWF	LOOP1		; LOOP1 = N_MSECS
OUTTER:
	MOVLW	.110	; close to 1.0 msec delay when set to .110
	MOVWF 	LOOP2
INNER:
	NOP
	NOP
	DECFSZ	LOOP2, F
	GOTO INNER
	DECFSZ 	LOOP1, F
	GOTO OUTTER
	RETURN

	END