        PROCESSOR       17C42

;CABLE BOX PROJECT
;(C) 2003 SPIKE TSASMALI
;
;PROGRAM WRITTEN FOR PIC 17C42 PROCESSOR

;CLOCK SPEED 4MHz

INDR0		EQU		0x00	;IND ADDR 0
FSR0		EQU		0x01	;FSR 0
PCLO		EQU		0x02	;PC LO
PCHI		EQU		0x03	;PC HI
ALUSTA          EQU     	0x04    ;ALU STATUS REGISTERS
RTCSTA          EQU    		0x05    ;ONE OF THE MANY STATUS REGISTERS
CPUSTA          EQU     	0x06    ;CPU STATUS REGISTER
INTSTA          EQU     	0x07    ;INTERRUPT STATUS REGISTER
W               EQU     	0x0A   	;W REGISTER
RTCC		EQU		0x0B	;TMR0 LOW REGISTER
TBLPTRL		EQU		0x0D	;TABLE POINTER LOW
TBLPTRH		EQU		0x0E	;TABLE POINTER HIGH
BSR             EQU     	0x0F  	;BANK SELECT REGISTER

PORTA           EQU     	0x10    ;PORT A IN BANK 0
DDRC		EQU     	0x10    ;DIRECTION PORT C IN BANK 1

DDRB            EQU     	0x11    ;DIRECTION PORT B IN BANK 0
PORTC           EQU     	0x11    ;PORT C IN BANK 1

PORTB           EQU     	0x12    ;PORT B IN BANK 0
DDRD            EQU     	0x12    ;DIRECTION PORT D IN BANK 1

PORTD           EQU     	0x13    ;PORT D IN BANK 1

DDRE            EQU     	0x14    ;DIRECTION PORT E IN BANK 1

PORTE           EQU     	0x15    ;PORT E IN BANK 1

PIR             EQU     	0x16   	;PER INT REQ REG IN BANK 1

PIE             EQU     	0x17   	;PER INT ENA REG IN BANK 1


PRODL		EQU		0x18	;PRODUCT LOW

PRODH		EQU		0x19	;PRODUCT HIGH

BSAV		EQU		0x1A	;BSR SAVE
WSAV		EQU		0x1B	;W SAVE

	CBLOCK	0x20

	FLAGS		;STATUS FLAGS REGISTER
	EEPROM		;I2C Bit buffer
	DATAI		;Stored data input register
	DEBREG		;DEBOUNCE TIMER REGISTER
	MCTR		;MULTIPLY COUNTER
	MULCND		;MULTIPLICAND
	MULPLR		;MULTIPLIER	

	DB1		;DIVIDER BYTE 1 FOR TUNER
	DB2		;DIVIDER BYTE 2 FOR TUNER
	CB		;CONTROL BYTE FOR TUNER
	BB		;BAND SWITCH BYTE FOR TUNER	

	TXBUF		;TX buffer
	RXBUF		;RX buffer
	COUNT		;Bit counter
	
	CHANNEL		;CHANNEL REGISTER
	PREVCHAN	;PREVIOUS CHANNEL REGISTER
	R1REG		;RANGE TEST LOW REGISTER
	R2REG		;RANGE TEST HIGH REGISTER
	TEST		;RANGE TEST SUBJECT REGISTER	
	BASEL		;BASE FREQ LOW REGISTER
	BASEH		;BASE FREQ HIGH REGISTER

	ID1    		;ID LSB BIT COUNTER
	ID2     	;ID MSB BIT COUNTER
	COM1    	;COMMAND TRUE BIT COUNTER
	COM2    	;COMMAND COMP BIT COUNTER
	CCODE1     	;ID LOW BYTE INPUT REG
	CCODE2     	;ID HIGH BYTE INPUT REG
	TRUECOM    	;COMMAND TRUE INPUT REG
	COMPCOM   	;COMMAND COMP INPUT REG
	TEMP		;TEMPORARY COMMAND PROCESS REGISTER
	DIG1		;FIRST DIGIT OF CHANNEL INPUT
	DIG2		;SECOND DIGIT OF CHANNEL INPUT

	BUF1		;SEGMENT FLAG BITS
	BUF2		
	BUF3		
	BUF4		
	BUF5		
	BUF6	
	BUF7
	BUF8	
	HOURS		;HOURS TIMER REG
	MINS		;MINS TIMER REG
	SECS		;SECS TIMER REG
	HT		;HOURS TENS BUFFER
	HU		;HOURS UNITS BUFFER
	MT		;MINS TENS BUFFER
	MU		;MINS UNITS BUFFER
	ST		;SECS TENS BUFFER
	SU		;SECS UNITS BUFFER
	CT		;CHANNEL TENS BUFFER
	CU		;CHANNEL UNITS BUFFER
	TIMEBASE	;TIMEBASE REGISTER
	DTEMP		;TEMP REGISTER

	ENDC

C1		EQU		0x39		;CLEAR SCREEN LOOP COUNTER
C2		EQU		0x3A		;CLEAR SCREEN LOOP COUNTER

#DEFINE		DO      	EEPROM,6 	; EEPROM OUTPUT BUFFER BIT
#DEFINE		DI      	EEPROM,7 	; EEPROM INPUT BUFFER BIT

#DEFINE		T1224		PORTA,0		;12/24 SET
#DEFINE		MSET		PORTA,1		;MINUTES SET
#DEFINE		HSET		PORTA,2		;SET TIME

#DEFINE		STR1		PORTC,7		;LATCH CLOCK 1
#DEFINE		STR2		PORTC,6		;LATCH CLOCK 2
#DEFINE		STR3		PORTC,5		;LATCH CLOCK 3
#DEFINE		STR4		PORTC,4		;LATCH CLOCK 4
#DEFINE		STR5		PORTC,3		;LATCH CLOCK 5
#DEFINE		STR6		PORTC,2		;LATCH CLOCK 6 
#DEFINE		STR7		PORTC,1		;LATCH CLOCK 7
#DEFINE		STR8		PORTC,0

#DEFINE		BUS		PORTD		;DATA BUS

#DEFINE		INTF		INTSTA,4	;EXT INT FLAG

#DEFINE		GLINTD		CPUSTA,4	;GLOBAL INT DIS BIT

#DEFINE		DRV10		BUF1,7		;SEGMENT FLAGS
#DEFINE		DRV11		BUF1,6
#DEFINE		DRV12		BUF1,5
#DEFINE		DRV13		BUF1,4
#DEFINE		DRV14		BUF1,3
#DEFINE		DRV15		BUF1,2
#DEFINE		DRV16		BUF1,1
#DEFINE		DRV17		BUF1,0

#DEFINE		DRV18		BUF2,7
#DEFINE		DRV19		BUF2,6
#DEFINE		DRV20		BUF2,5
#DEFINE		DRV21		BUF2,4
#DEFINE		DRV22		BUF2,3
#DEFINE		DRV23		BUF2,2
#DEFINE		DRV24		BUF2,1
#DEFINE		DRV25		BUF2,0

#DEFINE		DRV26		BUF3,7
#DEFINE		DRV27		BUF3,6
#DEFINE		DRV28		BUF3,5
#DEFINE		DRV29		BUF3,4
#DEFINE		DRV30		BUF3,3
#DEFINE		DRV31		BUF3,2
#DEFINE		DRV32		BUF3,1
#DEFINE		DRV33		BUF3,0

#DEFINE		DRV34		BUF4,7
#DEFINE		DRV35		BUF4,6
#DEFINE		DRV36		BUF4,5
#DEFINE		DRV37		BUF4,4
#DEFINE		DRV38		BUF4,3
#DEFINE		DRV39		BUF4,2
#DEFINE		DRV40		BUF4,1
#DEFINE		DRV41		BUF4,0

#DEFINE		DRV42		BUF5,7
#DEFINE		DRV43		BUF5,6
#DEFINE		DRV44		BUF5,5
#DEFINE		DRV45		BUF5,4
#DEFINE		DRV46		BUF5,3
#DEFINE		DRV47		BUF5,2
#DEFINE		DRV48		BUF5,1
#DEFINE		DRV49		BUF5,0

#DEFINE		DRV50		BUF6,7
#DEFINE		DRV51		BUF6,6
#DEFINE		DRV52		BUF6,5
#DEFINE		DRV53		BUF6,4
#DEFINE		DRV54		BUF6,3
#DEFINE		DRV55		BUF6,2
#DEFINE		DRV56		BUF6,1
#DEFINE		DRV57		BUF6,0

#DEFINE		DRV58		BUF7,7
#DEFINE		DRV59		BUF7,6
#DEFINE		DRV60		BUF7,5
#DEFINE		DRV61		BUF7,4
#DEFINE		DRV62		BUF7,3
#DEFINE		DRV63		BUF7,2
#DEFINE		DRV64		BUF7,1
#DEFINE		DRV65		BUF7,0

#DEFINE		DRV66		BUF8,7
#DEFINE		DRV67		BUF8,6
#DEFINE		DRV68		BUF8,5
#DEFINE		DRV69		BUF8,4
#DEFINE		DRV70		BUF8,3
#DEFINE		DRV71		BUF8,2
#DEFINE		DRV72		BUF8,1
#DEFINE		DRV73		BUF8,0

#DEFINE		INRANGE		FLAGS,0		;IN RANGE FLAG
#DEFINE		FIRSTDIG	FLAGS,1		;FIRST DIGIT FLAG
#DEFINE		AMPM		FLAGS,2		;AM/PM BIT
#DEFINE		PWRFLAG		FLAGS,3		;POWER ON/OFF FLAG

;*****************************************************************************

;TRANSPOSABLE SEGMENT DEFINE TABLE
;
;SEGMENT NAME IS DEFINED IN LEFT COLUMN, DESIRED DRIVE FOR THAT
;PARTICULAR SEGMENT NAME IS DEFINED IN RIGHT COLUMN.
;EXAMPLE:  THE SEGMENT FOR HOURS DIGIT "0" IS SEGHT0 AND 
;DRIVES OUTPUT DRV10.
;
;THIS TABLE CAN BE CHANGED TO SUIT ANY NIXIE TUBE AND LAYOUT.

;*****************************************************************************

  ;TEN HOURS DIGIT

#DEFINE		SEGHT1		DRV11
#DEFINE		SEGHT2		DRV10

  ;HOURS UNITS DIGIT

#DEFINE		SEGHU0		DRV19
#DEFINE		SEGHU1		DRV17
#DEFINE		SEGHU2		DRV16
#DEFINE		SEGHU3		DRV15
#DEFINE		SEGHU4		DRV13
#DEFINE		SEGHU5		DRV12
#DEFINE		SEGHU6		DRV14
#DEFINE		SEGHU7		DRV18
#DEFINE		SEGHU8		DRV21
#DEFINE		SEGHU9		DRV20

  ;MINS TENS DIGIT

#DEFINE		SEGMT0		DRV27
#DEFINE		SEGMT1		DRV26
#DEFINE		SEGMT2		DRV25
#DEFINE		SEGMT3		DRV24
#DEFINE		SEGMT4		DRV23
#DEFINE		SEGMT5		DRV22

  ;MINS UNITS DIGIT

#DEFINE		SEGMU0		DRV37
#DEFINE		SEGMU1		DRV35
#DEFINE		SEGMU2		DRV33
#DEFINE		SEGMU3		DRV32
#DEFINE		SEGMU4		DRV29
#DEFINE		SEGMU5		DRV28
#DEFINE		SEGMU6		DRV30
#DEFINE		SEGMU7		DRV36
#DEFINE		SEGMU8		DRV31
#DEFINE		SEGMU9		DRV34

  ;SECS TENS DIGIT

#DEFINE		SEGST0		DRV45
#DEFINE		SEGST1		DRV44
#DEFINE		SEGST2		DRV43
#DEFINE		SEGST3		DRV42
#DEFINE		SEGST4		DRV41
#DEFINE		SEGST5		DRV39

  ;SECS UNITS DIGIT

#DEFINE		SEGSU0		DRV53
#DEFINE		SEGSU1		DRV51
#DEFINE		SEGSU2		DRV50
#DEFINE		SEGSU3		DRV48
#DEFINE		SEGSU4		DRV40
#DEFINE		SEGSU5		DRV46
#DEFINE		SEGSU6		DRV38
#DEFINE		SEGSU7		DRV52
#DEFINE		SEGSU8		DRV55
#DEFINE		SEGSU9		DRV54

  ;CHANNEL TENS DIGIT

#DEFINE		SEGCT0		DRV61
#DEFINE		SEGCT1		DRV59
#DEFINE		SEGCT2		DRV58
#DEFINE		SEGCT3		DRV57
#DEFINE		SEGCT4		DRV49
#DEFINE		SEGCT5		DRV56
#DEFINE		SEGCT6		DRV47
#DEFINE		SEGCT7		DRV60
#DEFINE		SEGCT8		DRV63
#DEFINE		SEGCT9		DRV62

  ;CHANNEL UNITS DIGIT

#DEFINE		SEGCU0		DRV70
#DEFINE		SEGCU1		DRV66
#DEFINE		SEGCU2		DRV65
#DEFINE		SEGCU3		DRV64
#DEFINE		SEGCU4		DRV67
#DEFINE		SEGCU5		DRV68
#DEFINE		SEGCU6		DRV69
#DEFINE		SEGCU7		DRV73
#DEFINE		SEGCU8		DRV72
#DEFINE		SEGCU9		DRV71

#DEFINE		C		ALUSTA,0	;CARRY BIT
#DEFINE		Z		ALUSTA,2	;PIC ZERO BIT

#DEFINE		ISIG		PORTA,1		;IR DATA INPUT

#DEFINE		PWR		PORTB,7		;POWER SWITCH CONTROL OUTPUT

#DEFINE		SCL		PORTE,0         ;PORTE,0 , serial clock
#DEFINE		SDA		PORTE,1         ;PORTE,1 , data in/out

DEBTIME         EQU             255     ;DEBOUNCE TIME
FREQUENCY	EQU		120	;60Hz (USE 100 FOR 50Hz)

VHFLO		EQU		04	;LOW VHF BAND
VHFHI		EQU		02	;HIGH VHF BAND
UHF		EQU		01	;UHF BAND
STEPRATE	EQU		0192	;CHANNEL STEP RATE

;*****************************************************************************

;DEFINE MACROS 

;*****************************************************************************

BANK0   MACRO
        MOVLB   00
        ENDM

BANK1   MACRO
        MOVLB   01
        ENDM

BANK2   MACRO
        MOVLB   02
        ENDM

BANK3   MACRO
        MOVLB   03
        ENDM

;*****************************************************************************
	
	ORG	0x00

	GOTO	STARTP		;START

;*****************************************************************************

;INTERRUPT SERVICE ROUTINE

;*****************************************************************************

	ORG	0x08
	
	MOVFP	BSR,BSAV
	MOVFP	W,WSAV		;SAVE REGS

	DECFSZ	TIMEBASE,1	;ONE SECOND YET?
	GOTO    EXINT		;EXIT INTERRUPT AND WAIT

	MOVLW	FREQUENCY
	MOVWF	TIMEBASE	;RESTORE TIMEBASE

	INCF	SECS,1  	;INCREMENT SECONDS REG
	MOVFP	SECS,W		;TEST FOR OVERFLOW
	XORLW	60
	BTFSS	Z		;SKIP IF OVERFLOW
	GOTO	EXINT

	CLRF	SECS,1		;RESET TO ZERO

	INCF	MINS,1		;INCREMENT MINUTES REG
	MOVFP	MINS,W		;TEST FOR OVERFLOW
	XORLW	60	
	BTFSS	Z
	GOTO	EXINT		
	
	CLRF	MINS,1		;SET TO ZERO

	INCF	HOURS,1		;INCREMENT HOURS REG
	
HOUR24	MOVFP	HOURS,W
	XORLW	24
	BTFSS	Z
	GOTO	EXINT		;NOT OVERFLOWED
	
	CLRF	HOURS,1		;SET TO ZERO HOURS
	
EXINT	CALL	UPDISP		;UPDATE DISPLAY

	MOVFP	BSAV,BSR
	MOVFP	WSAV,W		;RESTORE

	BCF	INTF		;RESET INTERRUPT BIT
	RETFIE			;RETURN FROM INTERRUPT

;*****************************************************************************

;INITIALIZE SYSTEM 

;*****************************************************************************

STARTP	BANK0                           ;BANK0

        MOVLW   B'01111111'
	MOVWF	PORTB
        MOVWF   DDRB                    ;DATA DIRECTION PORT B
        
        BANK1
	MOVLW	B'11111111'
	MOVWF	PORTC
        MOVLW   B'00000000'             
        MOVWF   DDRC                    ;DATA DIRECTION PORT C

	MOVLW	B'11111111'
	MOVWF	PORTD
        MOVLW   B'00000000'
        MOVWF   DDRD                    ;DATA DIRECTION PORT D

        MOVLW   B'00000111'
        MOVWF   DDRE                   	;DATA DIRECTION PORT E

	BANK0

	BCF	PWR		;OFF TV

	MOVLW	B'01101110'
	MOVWF	RTCSTA		;SET UP RTCC (TMR0)

	CLRF	DATAI,1		;CLEAR I2C DATA INPUT BUFFER
	CLRF	FLAGS,1		;CLEAR STATUS FLAGS
	
	CLRF	ID1,1
	CLRF	ID2,1
	CLRF	CCODE1,1
	CLRF	CCODE2,1
	CLRF	TRUECOM,1
	CLRF	COMPCOM,1	;CLEAR ALL IR REGISTERS

	CLRF	HOURS,1		;CLEAR TIMERS
	CLRF	MINS,1
	CLRF	SECS,1			
	MOVLW	02
	MOVWF	CHANNEL
	BCF	AMPM		;OFF AM/PM INDICATOR
	
	CALL	UPDISP		;UPDATE DISPLAY STATUS

	MOVLW	FREQUENCY	
	MOVWF	TIMEBASE	;PRE-SET TIMEBASE

   ;INITIALIZE INTERRUPT SYSTEM
	
	MOVLW	B'00000001'
	MOVWF	INTSTA		;ENABLE EXT INT'S

	BCF	GLINTD		;ON INTERRUPTS

;*****************************************************************************

;INITIALIZE TUNER

;*****************************************************************************

	MOVLW	0x48
	MOVWF	DB1
	MOVLW	0x16
	MOVWF	DB2
	MOVLW	B'10001010'
	MOVWF	CB
	MOVLW	VHFLO
	MOVWF	BB
	CALL	TUNUPD

	MOVLW	02
	MOVWF	CHANNEL		;INITIATE AT LOWEST CHANNEL
	MOVWF	PREVCHAN
	CALL	TUNESTD		;TUNE THE TV...

;*****************************************************************************

;MAIN PROGRAM

;*****************************************************************************

RESCAN	BANK0
	
	CLRWDT			;WATCHDOG

	BTFSS	ISIG
	GOTO	IDEC		;IR INPUT?
	
	BTFSS	PORTB,0		;POWER SWITCH -- IF OPEN, CHANNEL
	GOTO	CPSW		;CLOSED -- TIME SET	

	BTFSS	PORTB,2		;UP CHANNEL
	GOTO	UHB

	BTFSS	PORTB,1		;DOWN CHANNEL
	GOTO	DHB

	GOTO	RESCAN

CPSW	CALL	DEBOUNCER
	BTFSC	PORTB,0
	GOTO	CPSW

	BCF	PWRFLAG		;CLEAR POWER FLAG

RESCAN2	BTFSC	PORTB,0		;POWER SWITCH
	GOTO	POWERSW		;DO THE POWER THING

	BTFSS	PORTB,2		;HOUR SET
	GOTO	SETHOUR

	BTFSS	PORTB,1		;MINUTE SET
	GOTO	SETMIN

	GOTO	RESCAN2		;SCAN AGAIN...

SETHOUR	INCF	HOURS,1		;INCREMENT THE HOURS...
	MOVFP	HOURS,W		;CHECK FOR OVERFLOW
	XORLW	24
	BTFSS	Z
	GOTO    EXHRS		;EXIT HERE
	CLRF	HOURS,1		;SET TO ZERO HOURS
EXHRS	BSF	PWRFLAG		;SET NOT TO TURN OFF POWER
WSH	CALL	DEBOUNCER
	BTFSS	PORTB,2
	GOTO	WSH
	GOTO	RESCAN2		;GO BACK AND SCAN AGAIN

SETMIN	INCF	MINS,1
	MOVFP	MINS,W		;TEST FOR OVERFLOW
	XORLW	60	
	BTFSS	Z
	GOTO    EXMIN		;EXIT HERE...
	CLRF	MINS,1		;SET TO ZERO
EXMIN	BSF	PWRFLAG		;SET NOT TO TURN OFF POWER
WSM	CALL	DEBOUNCER
	BTFSS	PORTB,1
	GOTO	WSM
	GOTO	RESCAN2		;GO BACK AND SCAN AGAIN

POWERSW	BTFSS	PWRFLAG		;IS FLAG SET? IF NOT OFF SET
	BTG	PORTB,7		;TOGGLE POWER
	BCF	PWRFLAG		;RESET FLAG
WSP	CALL	DEBOUNCER
	BTFSS	PORTB,0
	GOTO	WSP
	GOTO	RESCAN		;EXIT FROM 2ND RESCAN HERE

UHB	CALL	DEBOUNCER
	BTFSS	PORTB,2
	GOTO	UHB

UHBIR	MOVFP	CHANNEL,W
	MOVWF	PREVCHAN	;SAVE OLD CHANNEL
	INCF	CHANNEL,1	;INCREMENT CHANNEL
	
	MOVLW	070
	XORWF	CHANNEL,0
	BTFSC	Z
	GOTO	ROLLSTD		;IF CHANNEL 70, THEN ROLL TO CHANNEL 2
	CALL	TUNESTD		;TUNE THE TV
	GOTO	RESCAN		;SCAN AGAIN

ROLLSTD	MOVLW	02
	MOVWF	CHANNEL		;RESTORE CHANNEL
	CALL	TUNESTD
	GOTO	RESCAN		;SCAN AGAIN

DHB	CALL	DEBOUNCER
	BTFSS	PORTB,1
	GOTO	DHB
	
DHBIR	MOVFP	CHANNEL,W
	MOVWF	PREVCHAN	;SAVE OLD CHANNEL
	DECF	CHANNEL,1	;DECREMENT CHANNEL

	MOVLW	01
	XORWF	CHANNEL,0
	BTFSC	Z
	GOTO	UNDSTD		;ROLL UNDER TO CHANNEL 69
	CALL	TUNESTD
	GOTO	RESCAN		;SCAN AGAIN

UNDSTD	MOVLW	069
	MOVWF	CHANNEL		;RESTORE CHANNEL 
	CALL	TUNESTD
	GOTO	RESCAN		;SCAN AGAIN

;*****************************************************************************

;TUNE STANDARD BROADCAST SUBROUTINE

;*****************************************************************************

TUNESTD	MOVFP	CHANNEL,W
	MOVWF	TEST
	CALL	RANGEVL		;TEST FOR RANGE IN VHFLO
	BTFSC	INRANGE
	GOTO	TVL		;VHF LOW

	MOVFP	CHANNEL,W
	MOVWF	TEST
	CALL	RANGEVH		;TEST FOR RANGE IN VHFHI
	BTFSC	INRANGE
	GOTO	TVH		;VHF HI

	MOVFP	CHANNEL,W
	MOVWF	TEST
	CALL	RANGEUHF	;TEST FOR RANGE IN UHF
	BTFSC	INRANGE
	GOTO	UHFT		;UHF

	RETURN			;SOME KIND OF ERROR HAS OCCURRED...

TVL	MOVLW	STEPRATE	;CALCULATE OFFSET
	MOVWF	MULCND
	MOVFP	CHANNEL,W
	MOVWF	MULPLR
	CALL	MULX	

	MOVLW	0x0B
	MOVWF	BASEH		;HIGH BASE 

	MOVLW	0x16
	MOVWF	BASEL
	CALL	ADDFREQ		;ADD TO FIND ACTUAL DIVIDER FREQ

	MOVLW	B'10001010'	;CONTROL BYTE FOR TUNER
	MOVWF	CB
	MOVLW	VHFLO		;SET TO VHFLO BAND
	MOVWF	BB
	CALL	TUNUPD
	RETURN		

TVH	MOVLW	STEPRATE	;CALCULATE OFFSET
	MOVWF	MULCND
	MOVFP	CHANNEL,W
	MOVWF	MULPLR
	CALL	MULX	

	MOVLW	0x16
	MOVWF	BASEH		;HIGH BASE 

	MOVLW	0x56
	MOVWF	BASEL
	CALL	ADDFREQ		;ADD TO FIND ACTUAL DIVIDER FREQ

	MOVLW	B'10001010'	;CONTROL BYTE FOR TUNER
	MOVWF	CB
	MOVLW	VHFHI		;SET TO VHFHI BAND
	MOVWF	BB
	CALL	TUNUPD
	RETURN		

UHFT	MOVLW	STEPRATE	;CALCULATE OFFSET
	MOVWF	MULCND
	MOVFP	CHANNEL,W
	MOVWF	MULPLR
	CALL	MULX	

	MOVLW	0x36
	MOVWF	BASEH		;HIGH BASE 

	MOVLW	0x16
	MOVWF	BASEL
	CALL	ADDFREQ		;ADD TO FIND ACTUAL DIVIDER FREQ

	MOVLW	B'10001010'	;CONTROL BYTE FOR TUNER
	MOVWF	CB
	MOVLW	UHF		;SET TO UHF BAND
	MOVWF	BB
	CALL	TUNUPD
	RETURN		

;*****************************************************************************

;DEBOUNCE TIMER SUBROUTINE 

;*****************************************************************************

DEBOUNCER
        MOVLW   DEBTIME
        MOVWF   DEBREG
DLOOP   CLRWDT		;WATCHDOG CLEAR DURING TIMING LOOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DECFSZ  DEBREG,1        ;TIMING LOOP
        GOTO    DLOOP

        RETURN
;*****************************************************************************

;MULTIPLY ROUTINE

;*****************************************************************************

MULX    CLRF 	PRODH,1
	CLRF    PRODL,1
	BCF	C
MLOOP	MOVFP   MULCND,W
	    	
	ADDWF	PRODL,1

	BTFSC	C
	INCF	PRODH,1

	DECFSZ	MULPLR,1
	GOTO	MLOOP

	RETURN

;*****************************************************************************

;IR DECODER ROUTINE -- NEC VERSION 003 PROTOCOL USED

;*****************************************************************************

  ;DETECT START CONDITION -- SEEK A 9mS PULSE WIDTH        

IDEC    CLRF    RTCC,1          ;CLEAR RTCC TIMER
	CLRWDT			;START WITH FRESH WDT FOR THIS ROUTINE
	BANK0
        MOVLW   08
        MOVWF   ID1             ;INITIALIZE BIT COUNTERS
        MOVWF   ID2
        MOVWF   COM1
        MOVWF   COM2            

ST1     BTFSS   ISIG            ;WAIT FOR IR SIGNAL TO GO HIGH
        GOTO    ST1

        MOVFP   RTCC,W          ;GET RTCC VALUE
        CLRF    RTCC,1          ;CLEAR AND RESET RTCC FOR NEXT TEST
        MOVWF   TEST            ;SAVE IN TEST REGISTER

        CALL    RANGE9          ;CHECK IF IN 9mS RANGE                
        
        BTFSS   INRANGE  	;IF IN RANGE, CONTINUE
        GOTO    ERIR            ;OTHERWISE, EXIT AND RETURN

  ;9mS PULSE WIDTH PASSED

ST2     BTFSC   ISIG            ;WAIT FOR IR PULSE TO GO LOW
        GOTO    ST2

        MOVFP   RTCC,W          ;GET RTCC VALUE
        CLRF    RTCC,1          ;CLEAR AND RESET FOR NEXT TEST
        MOVWF   TEST            ;SAVE IN TEST REGISTER

        CALL    RANGE45         ;CHECK TO SEE IF IN 4.5mS RANGE

        BTFSS   INRANGE         ;IF IN RANGE, CONTINUE
        GOTO    ERIR            ;OTHERWISE, EXIT AND RETURN
  
  ;4.5mS TIME PERIOD PASSED -- START CONDITION DETECTED

  ;LOAD FIRST EIGHT BITS OF ID CODE

BHWT    RRNCF   CCODE1,1        ;ALIGN BITS
B1WT    BTFSS   ISIG            ;MEASURE PULSE --
        GOTO    B1WT

BLWT    BTFSC   ISIG            ;PULSE IS FROM BEGINNING TO BEGINNING
        GOTO    BLWT

        MOVFP   RTCC,W          ;GET RTCC VALUE
        CLRF    RTCC,1          ;CLEAR AND RESET FOR NEXT TEST
        MOVWF   TEST            ;SAVE IN TEST REGISTER

        CALL    RANGELOW        ;CHECK IF BIT IS LOW
        
        BTFSS   INRANGE         ;SET BIT LOW
        GOTO    BHITEST         ;CHECK IF BIT IS HIGH
        BCF     CCODE1,7        ;BIT LOW
        GOTO    NXTC1           ;DO NEXT BIT
BHITEST CALL    RANGEHI         ;CHECK IF BIT IS HIGH
        BTFSS   INRANGE         ;SET BIT HIGH
        GOTO    ERIR            ;ERROR
        BSF     CCODE1,7        ;BIT HIGH
NXTC1   DECFSZ  ID1,1           ;LOOP THROUGH 8 BITS
        GOTO    BHWT            ;LOOP

  ;LOAD LAST EIGHT BITS OF ID CODE

GHWT    RRNCF   CCODE2,1        ;ALIGN BITS
G1WT    BTFSS   ISIG            ;MEASURE PULSE --
        GOTO    G1WT

GLWT    BTFSC   ISIG            ;PULSE IS FROM BEGINNING TO BEGINNING
        GOTO    GLWT

        MOVFP   RTCC,W          ;GET RTCC VALUE
        CLRF    RTCC,1          ;CLEAR AND RESET FOR NEXT TEST
        MOVWF   TEST            ;SAVE IN TEST REGISTER

        CALL    RANGELOW        ;CHECK IF BIT IS LOW
        
        BTFSS   INRANGE         ;SET BIT LOW
        GOTO    GHITEST         ;CHECK IF BIT IS HIGH
        BCF     CCODE2,7        ;BIT LOW
        GOTO    NXTC2           ;DO NEXT BIT
GHITEST CALL    RANGEHI         ;CHECK IF BIT IS HIGH
        BTFSS   INRANGE         ;SET BIT HIGH
        GOTO    ERIR            ;ERROR
        BSF     CCODE2,7        ;BIT HIGH
NXTC2   DECFSZ  ID2,1           ;LOOP THROUGH 8 BITS
        GOTO    GHWT            ;LOOP

  ;LOAD TRUE COMMAND CODE

CTHWT   RRNCF   TRUECOM,1       ;ALIGN BITS
CT1T    BTFSS   ISIG            ;MEASURE PULSE --
        GOTO    CT1T

CTLWT   BTFSC   ISIG            ;PULSE IS FROM BEGINNING TO BEGINNING
        GOTO    CTLWT

        MOVFP   RTCC,W          ;GET RTCC VALUE
        CLRF    RTCC,1          ;CLEAR AND RESET FOR NEXT TEST
        MOVWF   TEST            ;SAVE IN TEST REGISTER

        CALL    RANGELOW        ;CHECK IF BIT IS LOW
        
        BTFSS   INRANGE         ;SET BIT LOW
        GOTO    CTHITEST        ;CHECK IF BIT IS HIGH
        BCF     TRUECOM,7       ;BIT LOW
        GOTO    NXTTC           ;DO NEXT BIT
CTHITEST 
        CALL    RANGEHI         ;CHECK IF BIT IS HIGH
        BTFSS   INRANGE         ;SET BIT HIGH
        GOTO    ERIR            ;ERROR
        BSF     TRUECOM,7       ;BIT HIGH
NXTTC   DECFSZ  COM1,1          ;LOOP THROUGH 8 BITS
        GOTO    CTHWT           ;LOOP

  ;LOAD COMPLIMENTARY COMMAND CODE

CCHWT   RRNCF   COMPCOM,1       ;ALIGN BITS
CC1T    BTFSS   ISIG            ;MEASURE PULSE --
        GOTO    CC1T

CCLWT   BTFSC   ISIG            ;PULSE IS FROM BEGINNING TO BEGINNING
        GOTO    CCLWT

        MOVFP   RTCC,W          ;GET RTCC VALUE
        CLRF    RTCC,1          ;CLEAR AND RESET FOR NEXT TEST
        MOVWF   TEST            ;SAVE IN TEST REGISTER

        CALL    RANGELOW        ;CHECK IF BIT IS LOW
        
        BTFSS   INRANGE         ;SET BIT LOW
        GOTO    CCHITEST        ;CHECK IF BIT IS HIGH
        BCF     COMPCOM,7       ;BIT LOW
        GOTO    NXTCC           ;DO NEXT BIT
CCHITEST 
        CALL    RANGEHI         ;CHECK IF BIT IS HIGH
        BTFSS   INRANGE         ;SET BIT HIGH
        GOTO    ERIR            ;ERROR
        BSF     COMPCOM,7       ;BIT HIGH
NXTCC   DECFSZ  COM2,1          ;LOOP THROUGH 8 BITS
        GOTO    CCHWT           ;LOOP

  ;COMMAND INTERPRETER

  ;CHECK FOR VALID DATA

        MOVFP   TRUECOM,W       ;GET TRUE COMMAND 
        XORLW   B'11111111'     ;INVERSE POLARITY
        XORWF   COMPCOM,0       ;PLAY AGAINST COMPLIMENTARY
        BTFSS   Z               ;SKIP IF GOOD
        GOTO    ERIR            ;COMMAND DATA CORRUPTED -- EXIT

	MOVLW	0x1A
	XORWF	TRUECOM,0
	BTFSC	Z
	GOTO	PCHAN		;PREVIOUS CHANNEL

	BTFSC	TRUECOM,4	;IS THIS NUMERICAL DATA?
	GOTO	NUMIN		;NUMBER INPUT...

	MOVLW	0x00
	XORWF	TRUECOM,0
	BTFSC	Z
	GOTO	UHBIR		;CHANNEL UP

	MOVLW	0x01
	XORWF	TRUECOM,0
	BTFSC	Z
	GOTO	DHBIR		;CHANNEL DOWN

	MOVLW	0x02
	XORWF	TRUECOM,0
	BTFSC	Z
	GOTO	VUP		;VOLUME UP

	MOVLW	0x03
	XORWF	TRUECOM,0
	BTFSC	Z
	GOTO	VDOWN		;VOLUME DOWN

	MOVLW	0x09
	XORWF	TRUECOM,0
	BTFSC	Z
	GOTO	MUTE		;MUTE	

	MOVLW	0x08
	XORWF	TRUECOM,0
	BTFSC	Z
	GOTO	PWRSW		;POWER SWITCH

ERIR	BCF	GLINTD		;ON INT'S
	GOTO	RESCAN		;ERROR -- THIS COMMAND NOT PROCESSED

  ;PREVIOUS CHANNEL 

PCHAN	MOVFP	PREVCHAN,W
	MOVWF	TEMP		;SAVE IN TEMP REG
	MOVFP	CHANNEL,W
	MOVWF	PREVCHAN	;SWAP THESE TWO REGISTERS
	MOVFP	TEMP,W
	MOVWF	CHANNEL
	CALL	TUNESTD		;UPDATE TUNER
	GOTO	ERIR		;RETURN TO SCANNING...

  ;NUMERICAL INPUT

NUMIN	BTFSC	FIRSTDIG	;IS THIS FIRST OR SECOND DIGIT?
	GOTO	SECDIG
	MOVFP	TRUECOM,W
	ANDLW	B'00001111'	;MASK OUT COMMAND DATA
	MOVWF	DIG1		;SAVE IN DIGIT 1
	BSF	FIRSTDIG	;SET FIRST DIGIT BIT
	GOTO	ERIR		;EXIT FOR NOW...
SECDIG	MOVFP	TRUECOM,W
	ANDLW	B'00001111'	;MASK OUT COMMAND DATA
	MOVWF	DIG2		;SAVE THIS DIGIT
	BCF	FIRSTDIG	;RESET FIRST DIGIT FLAG

	MOVFP	CHANNEL,W
	MOVWF	PREVCHAN	;SAVE PREVIOUS CHANNEL
	
	MOVLW	10		;CALCULATE OFFSET
	MOVWF	MULCND
	MOVFP	DIG1,W
	MOVWF	MULPLR
	CALL	MULX

	MOVFP	DIG2,W
	ADDWF	PRODL,0		;FINALIZE CONVERSION
	
	MOVWF	TEST		;TEST FOR BEING IN TUNING RANGE
	CALL	RANGE269
	BTFSS	INRANGE
	GOTO	ERIR		;IGNORE IF OUT OF RANGE
	MOVFP	TEST,W
	MOVWF	CHANNEL		;SET CHANNEL DATA
	CALL	TUNESTD
	GOTO	ERIR

PWRSW	BANK0
	BTG	PWR		;TOGGLE POWER SWITCH
	GOTO	ERIR

VUP
VDOWN
MUTE	GOTO	ERIR		;PROCESS THESE LATER....

;*****************************************************************************

;RANGE TEST SUBROUTINE

;*****************************************************************************

  ; VLOW IS 2-6
  ; VHI IS 7-13
  ; UHF IS 14-69
  
RANGEVL MOVLW   02             
        MOVWF   R1REG
        MOVLW   06
        MOVWF   R2REG           
        GOTO    RANRAM        

RANGEVH	MOVLW   07
        MOVWF   R1REG
        MOVLW   013
        MOVWF   R2REG
        GOTO    RANRAM

RANGEUHF
        MOVLW   014
        MOVWF   R1REG
        MOVLW   069
        MOVWF   R2REG
	GOTO	RANRAM

RANGE9  MOVLW   050             
        MOVWF   R1REG
        MOVLW   075
        MOVWF   R2REG           
        GOTO    RANRAM        

RANGE45
        MOVLW   031
        MOVWF   R1REG
        MOVLW   035
        MOVWF   R2REG
        GOTO    RANRAM

RANGEHI MOVLW   014
        MOVWF   R1REG
        MOVLW   018
        MOVWF   R2REG
        GOTO    RANRAM

RANGELOW
        MOVLW   06
        MOVWF   R1REG
        MOVLW   010
        MOVWF   R2REG
	GOTO	RANRAM

RANGE269
        MOVLW   02
        MOVWF   R1REG
        MOVLW   069
        MOVWF   R2REG
	GOTO	RANRAM

  ;RANGE MATHBOX ROUTINE

RANRAM  MOVFP   R1REG,W         ;GET LOW RANGE VALUE

        SUBWF   TEST,0          ;CHECK TO SEE IF DATA IN "TEST" IS GREATER
                                ;THAN OR EQUAL TO LOW RANGE VALUE

        BTFSS   C               ;IF CARRY BIT IS SET, THE VALUE HAS TO BE
                                ;GREATER OR EQUAL TO.
        GOTO    NO9             ;LESS THAN -- OUT OF RANGE

        MOVFP   TEST,W
        SUBWF   R2REG,0         ;DO SUBTRACTION

        BTFSS   C               ;IF CARRY BIT IS SET, THE VALUE HAS TO BE
                                ;LESS THAN OR EQUAL TO THE RANGE VALUE.

        GOTO    NO9             ;GREATER THAN -- OUT OF RANGE

        BSF     INRANGE         ;SET IN RANGE BIT

        RETURN
NO9     BCF     INRANGE         ;CLEAR RANGE BIT
        RETURN

;*****************************************************************************

;ADD FREQUENCY COMPONENTS SUBROUTINE

;*****************************************************************************

ADDFREQ	MOVFP	PRODL,W
	ADDWF	BASEL,0
	MOVWF	DB2
	MOVFP	PRODH,W
	ADDWFC	BASEH,0
	MOVWF	DB1
	RETURN

;*****************************************************************************

;I2C COMMUNICATION ROUTINES

;*****************************************************************************
                                    
;-----------------------------------------------------------------------------

;START bus communication routine

;-----------------------------------------------------------------------------

;       input   : none
;       output  : initialize bus communication

;-----------------------------------------------------------------------------

;Generate START bit (SCL is high while SDA goes from high to low transition)
;and check status of the serial clock.

BSTART	BANK1
	MOVLW   B'11111100'	; Put SCL, SDA line in output state
	MOVWF   DDRE

	BSF     SDA             ;make sure sda is high

	BSF     SCL          	; Set clock high
	
	BCF     SDA          	; SDA goes low during SCL high
	NOP                     ; Timing adjustment
	NOP
	NOP
	BCF     SCL          	; Start clock train
	RETURN

;-----------------------------------------------------------------------------

;STOP bus communication routine

;-----------------------------------------------------------------------------

;       Input   :       None
;       Output  :       Bus communication, STOP condition

;-----------------------------------------------------------------------------

;Generate STOP bit (SDA goes from low to high during SCL high state)
;and check bus conditions.

BSTOP	BANK1
	MOVLW   B'11111100'	; Put SCL, SDA line in output state
	MOVWF	DDRE

	BCF     SDA          	; Return SDA to low
	BSF     SCL          	; Set SCL high
	nop
	nop
	nop
	
	BSF     SDA          	; SDA goes from low to high during SCL high
	
	RETURN

;-----------------------------------------------------------------------------

;Serial data send from PIC to serial EEPROM, bit-by-bit subroutine

;-----------------------------------------------------------------------------

;       Input   :       None
;       Output  :       To (DI) of serial EEPROM device

;-----------------------------------------------------------------------------

BITIN	BANK1
	MOVLW   B'11111110'     ; Force SDA line as input
	MOVWF	DDRE
	BSF     SDA          	; Set SDA for input
	BCF     DI
	BSF     SCL          	; Clock high
	MOVLW   1
	BTFSC   SCL          	; Skip if SCL  is high
	GOTO    BIT1

BIT1	BTFSC   SDA          	; Read SDA pin
	BSF     DI       	; DI = 1
	NOP                     ; Delay
	BCF     SCL          	; Return SCL to low    
BRK1 
	RETLW   0

;-----------------------------------------------------------------------------

;Serial data receive from serial EEPROM to PIC, bit-by-bit subroutine

;-----------------------------------------------------------------------------

;       Input   :       EEPROM file
;       Output  :       From (DO) of serial EEPROM device to PIC

;-----------------------------------------------------------------------------

BITOUT	BANK1
	MOVLW   B'11111100'	; Set SDA, SCL as outputs
	MOVWF	DDRE
	BTFSS   DO
	GOTO    BIT0
	BSF     SDA          	; Output bit 0
	GOTO    CLK1
	

BIT0	BCF     SDA          	; Output bit 0
	NOP                     ; Delay
	NOP
	NOP

CLK1	BSF     SCL
	
BIT2	NOP
	NOP
	BCF   	SCL          	; Return SCL to low
	RETURN

;-----------------------------------------------------------------------------

;TRANSMIT DATA subroutine

;-----------------------------------------------------------------------------

;       Input   :       TXBUF
;       Output  :       Data X'mitted to EEPROM device

;-----------------------------------------------------------------------------

TX	MOVLW   08
	MOVWF   COUNT

TXLP	BCF     DO       	; Shift data bit out.
	BTFSC   TXBUF,7         ; If shifted bit = 0, data bit = 0
	BSF     DO       	; Otherwise data bit = 1
	CALL    BITOUT          ; Serial data out
	RLCF    TXBUF,1         ; Rotate TXBUF left
	BTFSS	C               ; f(6) ---> f(7)
	BCF     TXBUF,0         ; f(7) ---> carry
	BTFSC   C               ; carry ---> f(0)
	BSF     TXBUF,0
	DECFSZ  COUNT,1         ; 8 bits done?
	GOTO    TXLP            ; No.
	CALL    BITIN           ; Read acknowledge bit

	RETURN

;-----------------------------------------------------------------------------

;UPDATE TUNER ROUTINE

;-----------------------------------------------------------------------------

TUNUPD	
	MOVLW   0xC2            ;SLAVE ADDRESS FOR TUNER
	MOVWF   TXBUF           ;to TX buffer
	CALL    BSTART          ;Generate START bit
	CALL    TX              ;Output SLAVE address

	MOVFP   DB1,W           ;Get DIVIDER BYTE 1 DATA
	MOVWF   TXBUF           ;into buffer
	CALL    TX              ;Output DIVIDER BYTE 1 DATA

	MOVFP   DB2,W           ;GET DIVIDER BYTE 2 DATA 
	MOVWF   TXBUF           ;into buffer
	CALL    TX              ;Output DIVIDER BYTE 2 DATA

	MOVFP   CB,W            ;GET CONTROL BYTE 
	MOVWF   TXBUF           ;into buffer
	CALL    TX              ;Output CONTROL BYTE 

	MOVFP   BB,W            ;GET BAND SW BYTE 
	MOVWF   TXBUF           ;into buffer
	CALL    TX              ;Output BAND SW BYTE 

	CALL    BSTOP           ;Generate STOP bit
	RETURN

;*****************************************************************************

;SET NIXIE TUBE DRIVES ROUTINE (LONG)

;BEGIN BY CLEARING ALL SEGMENT FLAG BITS (BUFFERS).

;NEXT CONVERT HEX COUNTER DIGITS TO DECIMAL AND SPLIT THE
;PACKED BCD INTO SEPARATE DIGITS.

;USING CALCULATED BRANCHES, SELECT THE APPROPRIATE OUTPUT
;DRIVE FLAG BIT BY CALLING A SUBROUTINE CONTAINING THE 
;INSTRUCTIONS CORRESPONDING TO THE DESIRED SEGMENT.
;These subroutines can be altered to fit different types of
;tubes, from 7-segment outputs (where more than one "drive" is
;turned on per "digit", to Nixie tubes where only ONE drive
;is turned on per digit.

;AFTER SEGMENTS HAVE BEEN SELECTED, OUTPUT THE DATA TO THE 
;74LS374 LATCHES.

;*****************************************************************************

	ORG	0x300

UPDISP	CLRF	BUF1,1		;CLEAR ALL BUFFER BITS
	CLRF	BUF2,1
	CLRF	BUF3,1
	CLRF	BUF4,1
	CLRF	BUF5,1
	CLRF	BUF6,1
	CLRF	BUF7,1
	CLRF	BUF8,1

  ;CONVERT AND BUST PACKED BCD BITS INTO INDIVIDUAL 
  ;UNITS AND MASK OUT THE HIGH NIBBLE

	MOVFP	HOURS,W
	CALL	DCONVERT	;CONVERT TO DECIMAL
	MOVWF	HT		;HOURS TENS
	MOVWF	HU		;HOURS UNITS
	MOVFP	MINS,W
	CALL	DCONVERT	;CONVERT TO DECIMAL
	MOVWF	MT		;MINUTES TENS
	MOVWF	MU		;MINUTES UNITS
	MOVFP	SECS,W
	CALL	DCONVERT	;CONVERT TO DECIMAL
	MOVWF	ST		;SECONDS TENS
	MOVWF	SU		;SECONDS UNITS
	MOVFP	CHANNEL,W	
	CALL	DCONVERT
	MOVWF	CT		;CHANNEL TENS
	MOVWF	CU		;CHANNEL UNITS
	
	SWAPF	HT,1		;RE-ARRANGE BITS
	SWAPF	MT,1
	SWAPF	ST,1
	SWAPF	CT,1	

	MOVLW	B'00001111'	;MASK OUT HIGH NIBBLE
	ANDWF	HT,1
	ANDWF	HU,1
	ANDWF	MT,1
	ANDWF	MU,1
	ANDWF	ST,1
	ANDWF	SU,1
	ANDWF	CT,1
	ANDWF	CU,1

  ;SELECT HOURS TENS DRIVE OUTPUT

	MOVLW	HIGH PCHHT
	MOVWF	PCHI
	TSTFSZ	HT		;ZERO!
	GOTO	DO10S
	GOTO	HUD		;ZERO, BLANK IT!!

DO10S	BCF	C		;CLEAR CARRY BIT
	RLNCF	HT,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PCLO,1		;CALCULATED BRANCH...
	NOP			;0
	NOP			;1
PCHHT	CALL	SETHT1		;2 SET SEGMENT 1
	GOTO	HUD		;3
	CALL	SETHT2		;4 SET SEGMENT 2
	GOTO	HUD		;5
	NOP			;6 BUFFER SPACE

  ;SELECT HOURS UNITS DRIVE OUTPUT

HUD	BCF	C		;CLEAR CARRY BIT
	RLNCF	HU,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PCLO,1		;CALCULATED BRANCH...
	CALL	SETHU0		;0 SET SEGMENT 0
	GOTO	MTD		;1
	CALL	SETHU1		;2 SET SEGMENT 1
	GOTO	MTD		;3
	CALL	SETHU2		;4 SET SEGMENT 2
	GOTO	MTD		;5
	CALL	SETHU3		;6 SET SEGMENT 3
	GOTO	MTD		;7
	CALL	SETHU4		;8 SET SEGMENT 4
	GOTO	MTD		;9
	CALL	SETHU5		;10 SET SEGMENT 5
	GOTO	MTD		;11
	CALL	SETHU6		;12 SET SEGMENT 6
	GOTO	MTD		;13
	CALL	SETHU7		;14 SET SEGMENT 7
	GOTO	MTD		;15
	CALL	SETHU8		;16 SET SEGMENT 8
	GOTO	MTD		;17
	CALL	SETHU9		;18 SET SEGMENT 9
	GOTO	MTD		;19
	NOP			;20

  ;SELECT MINS TENS DRIVE OUTPUT

MTD	BCF	C		;CLEAR CARRY BIT
	RLNCF	MT,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PCLO,1		;CALCULATED BRANCH...
	CALL	SETMT0		;0 SET SEGMENT 0
	GOTO	MUD		;1
	CALL	SETMT1		;2 SET SEGMENT 1
	GOTO	MUD		;3
	CALL	SETMT2		;4 SET SEGMENT 2
	GOTO	MUD		;5
	CALL	SETMT3		;6 SET SEGMENT 3
	GOTO	MUD		;7
	CALL	SETMT4		;8 SET SEGMENT 4
	GOTO	MUD		;9
	CALL	SETMT5		;10 SET SEGMENT 5
	GOTO	MUD		;11
	NOP			;20

  ;SELECT MINS UNITS DRIVE OUTPUT

MUD	BCF	C		;CLEAR CARRY BIT
	RLNCF	MU,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PCLO,1		;CALCULATED BRANCH...
	CALL	SETMU0		;0 SET SEGMENT 0
	GOTO	STD		;1
	CALL	SETMU1		;2 SET SEGMENT 1
	GOTO	STD		;3
	CALL	SETMU2		;4 SET SEGMENT 2
	GOTO	STD		;5
	CALL	SETMU3		;6 SET SEGMENT 3
	GOTO	STD		;7
	CALL	SETMU4		;8 SET SEGMENT 4
	GOTO	STD		;9
	CALL	SETMU5		;10 SET SEGMENT 5
	GOTO	STD		;11
	CALL	SETMU6		;12 SET SEGMENT 6
	GOTO	STD		;13
	CALL	SETMU7		;14 SET SEGMENT 7
	GOTO	STD		;15
	CALL	SETMU8		;16 SET SEGMENT 8
	GOTO	STD		;17
	CALL	SETMU9		;18 SET SEGMENT 9
	GOTO	STD		;19
	NOP			;20

  ;SELECT SECS TENS DRIVE OUTPUT

STD	BCF	C		;CLEAR CARRY BIT
	RLNCF	ST,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PCLO,1		;CALCULATED BRANCH...
	CALL	SETST0		;0 SET SEGMENT 0
	GOTO	SUD		;1
	CALL	SETST1		;2 SET SEGMENT 1
	GOTO	SUD		;3
	CALL	SETST2		;4 SET SEGMENT 2
	GOTO	SUD		;5
	CALL	SETST3		;6 SET SEGMENT 3
	GOTO	SUD		;7
	CALL	SETST4		;8 SET SEGMENT 4
	GOTO	SUD		;9
	CALL	SETST5		;10 SET SEGMENT 5
	GOTO	SUD		;11
	NOP			;20

;SELECT SECS UNITS DRIVE OUTPUT

SUD	BCF	C		;CLEAR CARRY BIT
	RLNCF	SU,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PCLO,1		;CALCULATED BRANCH...
	CALL	SETSU0		;0 SET SEGMENT 0
	GOTO	CTD 		;1
	CALL	SETSU1		;2 SET SEGMENT 1
	GOTO	CTD  		;3
	CALL	SETSU2		;4 SET SEGMENT 2
	GOTO	CTD  		;5
	CALL	SETSU3		;6 SET SEGMENT 3
	GOTO	CTD  		;7
	CALL	SETSU4		;8 SET SEGMENT 4
	GOTO	CTD  		;9
	CALL	SETSU5		;10 SET SEGMENT 5
	GOTO	CTD  		;11
	CALL	SETSU6		;12 SET SEGMENT 6
	GOTO	CTD  		;13
	CALL	SETSU7		;14 SET SEGMENT 7
	GOTO	CTD		;15
	CALL	SETSU8		;16 SET SEGMENT 8
	GOTO	CTD		;17
	CALL	SETSU9		;18 SET SEGMENT 9
	GOTO	CTD		;19
	NOP			;20

  ;SELECT CHANNEL TENS DRIVE OUTPUT

CTD	BCF	C		;CLEAR CARRY BIT
	RLNCF	CT,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PCLO,1		;CALCULATED BRANCH...
	CALL	SETCT0		;0 SET SEGMENT 0
	GOTO	CUD		;1
	CALL	SETCT1		;2 SET SEGMENT 1
	GOTO	CUD		;3
	CALL	SETCT2		;4 SET SEGMENT 2
	GOTO	CUD		;5
	CALL	SETCT3		;6 SET SEGMENT 3
	GOTO	CUD		;7
	CALL	SETCT4		;8 SET SEGMENT 4
	GOTO	CUD		;9
	CALL	SETCT5		;10 SET SEGMENT 5
	GOTO	CUD		;11
	CALL	SETCT6		;12
	GOTO	CUD
	NOP			;20

  ;SELECT CHANNEL UNITS DRIVE OUTPUT

CUD	BCF	C		;CLEAR CARRY BIT
	RLNCF	CU,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PCLO,1		;CALCULATED BRANCH...
	CALL	SETCU0		;0 SET SEGMENT 0
	GOTO	UPPORT		;1
	CALL	SETCU1		;2 SET SEGMENT 1
	GOTO	UPPORT		;3
	CALL	SETCU2		;4 SET SEGMENT 2
	GOTO	UPPORT		;5
	CALL	SETCU3		;6 SET SEGMENT 3
	GOTO	UPPORT		;7
	CALL	SETCU4		;8 SET SEGMENT 4
	GOTO	UPPORT		;9
	CALL	SETCU5		;10 SET SEGMENT 5
	GOTO	UPPORT		;11
	CALL	SETCU6		;12 SET SEGMENT 6
	GOTO	UPPORT		;13
	CALL	SETCU7		;14 SET SEGMENT 7
	GOTO	UPPORT		;15
	CALL	SETCU8		;16 SET SEGMENT 8
	GOTO	UPPORT		;17
	CALL	SETCU9		;18 SET SEGMENT 9
	GOTO	UPPORT		;19
	NOP			;20

	
UPPORT	BANK1
	MOVFP	BUF1,BUS	;OUTPUT DATA TO BUS AND LATCH
	BCF	STR1		;STROBE
	NOP
	BSF	STR1

	MOVFP	BUF2,BUS
	BCF	STR2		;STROBE
	NOP
	BSF	STR2

	MOVFP	BUF3,BUS
	BCF	STR3		;STROBE
	NOP
	BSF	STR3

	MOVFP	BUF4,BUS
	BCF	STR4		;STROBE
	NOP
	BSF	STR4

	MOVFP	BUF5,BUS
	BCF	STR5		;STROBE
	NOP
	BSF	STR5
	
	MOVFP	BUF6,BUS
	BCF	STR6		;STROBE
	NOP
	BSF	STR6

	MOVFP	BUF7,BUS
	BCF	STR7		;STROBE
	NOP
	BSF	STR7
	
	MOVFP	BUF8,BUS
	BCF	STR8
	NOP
	BSF	STR8

	RETURN

;*****************************************************************************

;SELECT SEGMENT DRIVE ROUTINES

;*****************************************************************************

  ;HOURS TENS

SETHT1	BSF	SEGHT1		;Example of these routines:
	RETURN			;SETHT1 will set the flag bit
				;SEGHT1.  SEGHT1 represents the
SETHT2	BSF	SEGHT2		;segment HOURS TENS #1.  Since
	RETURN			;Nixie tubes have single segments
				;per digit, only one instruction
  ;HOURS UNITS			;is used per segment select.
				
SETHU0	BSF	SEGHU0		;It is possible to use multiple
	RETURN			;drives for 7-segment displays.
				;An example of this would be
SETHU1	BSF	SEGHU1		;SETHT1  BSF	SEGHTA
	RETURN			;	 BSF	SEGHTB
				;where SEGHTA represents Segment A
SETHU2	BSF	SEGHU2		;on the HOURS TENS display digit
	RETURN			;and SEGHTB represents Segment B
				;on the HOURS TENS display digit.
SETHU3  BSF	SEGHU3	
	RETURN			;The user will then define the actual
				;drive output for each label in
SETHU4	BSF	SEGHU4		;the DEFINE table at the beginning
	RETURN			;of the program.  In our example, lets
				;say we want to hook up the HOURS TENS
SETHU5	BSF	SEGHU5		;segment A to Drive 10 and B to Drive 11.
	RETURN			;The lines #DEFINE  SEGHTA	DRV10
				; and      #DEFINE  SEGHTB	DRV11
SETHU6  BSF	SEGHU6		;would appear in the DEFINE table under
				;the category, "TRANSPOSABLE DEFINITIONS".
	RETURN

SETHU7	BSF	SEGHU7
	RETURN

SETHU8	BSF	SEGHU8
	RETURN

SETHU9	BSF	SEGHU9
	RETURN

  ;MINS TENS

SETMT0	BSF	SEGMT0
	RETURN
	
SETMT1	BSF	SEGMT1
	RETURN

SETMT2	BSF	SEGMT2
	RETURN

SETMT3	BSF	SEGMT3
	RETURN

SETMT4	BSF	SEGMT4
	RETURN

SETMT5	BSF	SEGMT5
	RETURN

  ;MINS UNITS

SETMU0	BSF	SEGMU0
	RETURN
	
SETMU1	BSF	SEGMU1
	RETURN

SETMU2	BSF	SEGMU2
	RETURN

SETMU3	BSF	SEGMU3
	RETURN

SETMU4	BSF	SEGMU4
	RETURN

SETMU5	BSF	SEGMU5
	RETURN

SETMU6	BSF	SEGMU6
	RETURN

SETMU7	BSF	SEGMU7
	RETURN

SETMU8	BSF	SEGMU8
	RETURN

SETMU9	BSF	SEGMU9
	RETURN

  ;SECS TENS

SETST0	BSF	SEGST0
	RETURN
	
SETST1	BSF	SEGST1
	RETURN

SETST2	BSF	SEGST2
	RETURN

SETST3	BSF	SEGST3
	RETURN

SETST4	BSF	SEGST4
	RETURN

SETST5	BSF	SEGST5
	RETURN

  ;SECS UNITS

SETSU0	BSF	SEGSU0
	RETURN
	
SETSU1	BSF	SEGSU1
	RETURN

SETSU2	BSF	SEGSU2
	RETURN

SETSU3	BSF	SEGSU3
	RETURN

SETSU4	BSF	SEGSU4
	RETURN

SETSU5	BSF	SEGSU5
	RETURN

SETSU6	BSF	SEGSU6
	RETURN

SETSU7	BSF	SEGSU7
	RETURN

SETSU8	BSF	SEGSU8
	RETURN

SETSU9	BSF	SEGSU9
	RETURN

  ;CHANNEL TENS

SETCT0	BSF	SEGCT0
	RETURN
	
SETCT1	BSF	SEGCT1
	RETURN

SETCT2	BSF	SEGCT2
	RETURN

SETCT3	BSF	SEGCT3
	RETURN

SETCT4	BSF	SEGCT4
	RETURN

SETCT5	BSF	SEGCT5
	RETURN

SETCT6	BSF	SEGCT6
	RETURN

  ;CHANNEL UNITS

SETCU0	BSF	SEGCU0
	RETURN
	
SETCU1	BSF	SEGCU1
	RETURN

SETCU2	BSF	SEGCU2
	RETURN

SETCU3	BSF	SEGCU3
	RETURN

SETCU4	BSF	SEGCU4
	RETURN

SETCU5	BSF	SEGCU5
	RETURN

SETCU6	BSF	SEGCU6
	RETURN

SETCU7	BSF	SEGCU7
	RETURN

SETCU8	BSF	SEGCU8
	RETURN

SETCU9	BSF	SEGCU9
	RETURN

;******************************************************************

;HEX TO DECIMAL LOOKUP TABLE

;******************************************************************

	ORG	0x700

DCONVERT
	MOVWF	DTEMP
	MOVLW	HIGH DCONVERT
	MOVWF	PCHI		;SETUP BRANCH
	MOVFP	DTEMP,W		;GET DATA
	ADDWF	PCLO,1

	RETLW	0x00
	RETLW	0x01
	RETLW	0x02
	RETLW	0x03
	RETLW	0x04
	RETLW	0x05
	RETLW	0x06
	RETLW	0x07
	RETLW	0x08
	RETLW	0x09
	RETLW	0x10
	RETLW	0x11
	RETLW	0x12
	RETLW	0x13
	RETLW	0x14
	RETLW	0x15
	RETLW	0x16
	RETLW	0x17
	RETLW	0x18
	RETLW	0x19
	RETLW	0x20
	RETLW	0x21
	RETLW	0x22
	RETLW	0x23
	RETLW	0x24
	RETLW	0x25
	RETLW	0x26
	RETLW	0x27
	RETLW	0x28
	RETLW	0x29
	RETLW	0x30
	RETLW	0x31
	RETLW	0x32
	RETLW	0x33
	RETLW	0x34
	RETLW	0x35
	RETLW	0x36
	RETLW	0x37
	RETLW	0x38
	RETLW	0x39
	RETLW	0x40
	RETLW	0x41
	RETLW	0x42
	RETLW	0x43
	RETLW	0x44
	RETLW	0x45
	RETLW	0x46
	RETLW	0x47
	RETLW	0x48
	RETLW	0x49
	RETLW	0x50
	RETLW	0x51
	RETLW	0x52
	RETLW	0x53
	RETLW	0x54
	RETLW	0x55
	RETLW	0x56
	RETLW	0x57
	RETLW	0x58
	RETLW	0x59
	RETLW	0x60
	RETLW	0x61
	RETLW	0x62
	RETLW	0x63
	RETLW	0x64
	RETLW	0x65
	RETLW	0x66
	RETLW	0x67
	RETLW	0x68
	RETLW	0x69
	RETLW	0x70

	END


	
