;UNIVERSAL NIXIE CLOCK
;(C) 2001 SPIKE TSASMALI, LUPINE SYSTEMS
;PIC 16C62A
;NIXIE BOX PROJECT -- WANG NIXIE TUBES

;PIC REGISTERS

INDR            EQU     00              ;IND ADDR REG
TMR0            EQU     01              ;TIMER0
PC              EQU     02              ;PROGRAM COUNTER
STATUS          EQU     03              ;STATUS REG
FSR             EQU     04              ;FILE SEL REG
PORTA           EQU     05              ;PORT A
PORTB           EQU     06              ;PORT B
PORTC           EQU     07              ;PORT C
PCHI            EQU     0x0A            ;PC HI LATCH
INTCON          EQU     0x0B            ;INT CONTROL REG
PIR1            EQU     0x0C            ;PER INT CONT REG
TMR1L           EQU     0x0E            ;TIMER 1 LOW
TMR1H           EQU     0x0F            ;TIMER 1 HIGH
T1CON           EQU     0x10            ;TIMER 1 CONT REG

OPTN            EQU     0x81            ;OPTION REGISTER
TRISA           EQU     0x85            ;PORT A DIRECTION
TRISB           EQU     0x86            ;PORT B DIRECTION
TRISC           EQU     0x87            ;PORT C DIRECTION
PIE1            EQU     0x8C            ;PERIP INT ENA REG

;USER-DEFINED REGISTERS

BUF1		EQU	0x20		;SEGMENT FLAG BITS
BUF2		EQU	0x21
BUF3		EQU	0x22
BUF4		EQU	0x23
BUF5		EQU	0x24
BUF6		EQU	0x25
BUF7		EQU	0x26
HOURS		EQU	0x27		;HOURS TIMER REG
MINS		EQU	0x28		;MINS TIMER REG
SECS		EQU	0x29		;SECS TIMER REG
HT		EQU	0x2A		;HOURS TENS BUFFER
HU		EQU	0x2B		;HOURS UNITS BUFFER
MT		EQU	0x2C		;MINS TENS BUFFER
MU		EQU	0x2D		;MINS UNITS BUFFER
ST		EQU	0x2E		;SECS TENS BUFFER
SU		EQU	0x2F		;SECS UNITS BUFFER
TIMEBASE	EQU	0x30		;TIMEBASE REGISTER
FLAGS		EQU	0x31		;FLAGS REG
TEMP		EQU	0x32		;TEMP REGISTER

;SINGLE BIT DEFINITIONS

#DEFINE         CARRY           STATUS,0
#DEFINE         Z               STATUS,2
#DEFINE         RP0             STATUS,5

#DEFINE		T1224		PORTA,0		;12/24 SET
#DEFINE		MSET		PORTA,1		;MINUTES SET
#DEFINE		HSET		PORTA,2		;SET TIME

#DEFINE		STR1		PORTB,1		;LATCH CLOCK 1
#DEFINE		STR2		PORTB,2		;LATCH CLOCK 2
#DEFINE		STR3		PORTB,3		;LATCH CLOCK 3
#DEFINE		STR4		PORTB,4		;LATCH CLOCK 4
#DEFINE		STR5		PORTB,5		;LATCH CLOCK 5
#DEFINE		STR6		PORTB,6		;LATCH CLOCK 6 
#DEFINE		STR7		PORTB,7		;LATCH CLOCK 7

#DEFINE		BUS		PORTC		;DATA BUS

#DEFINE		INTF		INTCON,1	;EXT INT FLAG

#DEFINE		DRV10		BUF1,0		;SEGMENT FLAGS
#DEFINE		DRV11		BUF1,1
#DEFINE		DRV12		BUF1,2
#DEFINE		DRV13		BUF1,3
#DEFINE		DRV14		BUF1,4
#DEFINE		DRV15		BUF1,5
#DEFINE		DRV16		BUF1,6
#DEFINE		DRV17		BUF1,7

#DEFINE		DRV18		BUF2,0
#DEFINE		DRV19		BUF2,1
#DEFINE		DRV20		BUF2,2
#DEFINE		DRV21		BUF2,3
#DEFINE		DRV22		BUF2,4
#DEFINE		DRV23		BUF2,5
#DEFINE		DRV24		BUF2,6
#DEFINE		DRV25		BUF2,7

#DEFINE		DRV26		BUF3,0
#DEFINE		DRV27		BUF3,1
#DEFINE		DRV28		BUF3,2
#DEFINE		DRV29		BUF3,3
#DEFINE		DRV30		BUF3,4
#DEFINE		DRV31		BUF3,5
#DEFINE		DRV32		BUF3,6
#DEFINE		DRV33		BUF3,7

#DEFINE		DRV34		BUF4,0
#DEFINE		DRV35		BUF4,1
#DEFINE		DRV36		BUF4,2
#DEFINE		DRV37		BUF4,3
#DEFINE		DRV38		BUF4,4
#DEFINE		DRV39		BUF4,5
#DEFINE		DRV40		BUF4,6
#DEFINE		DRV41		BUF4,7

#DEFINE		DRV42		BUF5,0
#DEFINE		DRV43		BUF5,1
#DEFINE		DRV44		BUF5,2
#DEFINE		DRV45		BUF5,3
#DEFINE		DRV46		BUF5,4
#DEFINE		DRV47		BUF5,5
#DEFINE		DRV48		BUF5,6
#DEFINE		DRV49		BUF5,7

#DEFINE		DRV50		BUF6,0
#DEFINE		DRV51		BUF6,1
#DEFINE		DRV52		BUF6,2
#DEFINE		DRV53		BUF6,3
#DEFINE		DRV54		BUF6,4
#DEFINE		DRV55		BUF6,5
#DEFINE		DRV56		BUF6,6
#DEFINE		DRV57		BUF6,7

#DEFINE		DRV58		BUF7,0
#DEFINE		DRV59		BUF7,1
#DEFINE		DRV60		BUF7,2
#DEFINE		DRV61		BUF7,3
#DEFINE		DRV62		BUF7,4
#DEFINE		DRV63		BUF7,5
#DEFINE		DRV64		BUF7,6
#DEFINE		DRV65		BUF7,7

#DEFINE		AMPM		FLAGS,0	

;*****************************************************************************

;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		SEGHT0		DRV15
#DEFINE		SEGHT1		DRV24
#DEFINE		SEGHT2		DRV20

  ;HOURS UNITS DIGIT

#DEFINE		SEGHU0		DRV27
#DEFINE		SEGHU1		DRV30
#DEFINE		SEGHU2		DRV26
#DEFINE		SEGHU3		DRV22
#DEFINE		SEGHU4		DRV28
#DEFINE		SEGHU5		DRV32
#DEFINE		SEGHU6		DRV25
#DEFINE		SEGHU7		DRV29
#DEFINE		SEGHU8		DRV31
#DEFINE		SEGHU9		DRV23

  ;MINS TENS DIGIT

#DEFINE		SEGMT0		DRV35
#DEFINE		SEGMT1		DRV37
#DEFINE		SEGMT2		DRV34
#DEFINE		SEGMT3		DRV33
#DEFINE		SEGMT4		DRV36
#DEFINE		SEGMT5		DRV38

  ;MINS UNITS DIGIT

#DEFINE		SEGMU0		DRV43
#DEFINE		SEGMU1		DRV46
#DEFINE		SEGMU2		DRV42
#DEFINE		SEGMU3		DRV39
#DEFINE		SEGMU4		DRV44
#DEFINE		SEGMU5		DRV48
#DEFINE		SEGMU6		DRV41
#DEFINE		SEGMU7		DRV45
#DEFINE		SEGMU8		DRV47
#DEFINE		SEGMU9		DRV40

  ;SECS TENS DIGIT

#DEFINE		SEGST0		DRV51
#DEFINE		SEGST1		DRV53
#DEFINE		SEGST2		DRV50
#DEFINE		SEGST3		DRV49
#DEFINE		SEGST4		DRV52
#DEFINE		SEGST5		DRV54

  ;SECS UNITS DIGIT

#DEFINE		SEGSU0		DRV60
#DEFINE		SEGSU1		DRV63
#DEFINE		SEGSU2		DRV59
#DEFINE		SEGSU3		DRV55
#DEFINE		SEGSU4		DRV61
#DEFINE		SEGSU5		DRV64
#DEFINE		SEGSU6		DRV58
#DEFINE		SEGSU7		DRV57
#DEFINE		SEGSU8		DRV62
#DEFINE		SEGSU9		DRV56

#DEFINE		SEGAMPM		DRV65

  ;TIMEBASE FREQUENCY

FREQUENCY	EQU	120	;60Hz (USE 100 FOR 50Hz)

;*****************************************************************************

;MACROS

;*****************************************************************************

BANK0   MACRO
        BCF     RP0
        ENDM

BANK1   MACRO
        BSF     RP0
        ENDM

;*****************************************************************************

	GOTO	START		;START

;*****************************************************************************

;INTERRUPT SERVICE ROUTINE

;*****************************************************************************

	ORG	0x04

	DECFSZ	TIMEBASE,1	;ONE SECOND YET?
	GOTO    EXINT		;EXIT INTERRUPT AND WAIT

	MOVLW	FREQUENCY
	MOVWF	TIMEBASE	;RESTORE TIMEBASE

	INCF	SECS,1  	;INCREMENT SECONDS REG
	MOVF	SECS,0		;TEST FOR OVERFLOW
	XORLW	60
	BTFSS	Z		;SKIP IF OVERFLOW
	GOTO	SETSCAN		;SET SWITCH SCAN

	CLRF	SECS		;RESET TO ZERO

	INCF	MINS,1		;INCREMENT MINUTES REG
	MOVF	MINS,0		;TEST FOR OVERFLOW
	XORLW	60	
	BTFSS	Z
	GOTO	SETSCAN		;SET SWITCH SCAN
	
	CLRF	MINS		;SET TO ZERO

	INCF	HOURS,1		;INCREMENT HOURS REG
	BTFSS	T1224		;12 OR 24 HOUR ??
	GOTO	HOUR24

  ;12 HOUR OVERFLOW TEST

	MOVF	HOURS,0		;GET HOURS
	XORLW	13
	BTFSS	Z
	GOTO	SETSCAN		;NOT OVERFLOWED

	MOVLW	01
	MOVWF	HOURS		;SET HOURS TO 1

	BTFSS	AMPM		;IS AM/PM INDICATOR SET?
	GOTO	AP0
	BCF	AMPM		;CLEAR IT...
	GOTO	SETSCAN
AP0	BSF	AMPM		;SET IT...
	GOTO	SETSCAN

HOUR24	MOVF	HOURS,0
	XORLW	24
	BTFSS	Z
	GOTO	SETSCAN		;NOT OVERFLOWED
	
	CLRF	HOURS		;SET TO ZERO HOURS
	
SETSCAN	
	BTFSS	HSET		;CHECK FOR HOURS SET BUTTON
	GOTO 	SETHOURS
	BTFSS	MSET		;CHECK FOR MIN SET BUTTON
	GOTO	SETMINS
	
	GOTO    EXINT		;EXIT FROM INTERRUPT HERE

SETMINS	INCF	MINS,1		;INCREMENT MINUTES REG
	MOVF	MINS,0		;TEST FOR OVERFLOW
	XORLW	60	
	BTFSS	Z
	GOTO    EXINT		;EXIT HERE...
	CLRF	MINS		;SET TO ZERO
	GOTO    EXINT		;EXIT HERE...

SETHOURS
	INCF	HOURS,1		;INCREMENT HOURS REG
	BTFSS	T1224		;12 OR 24 HOUR ??
	GOTO	HOUR24S

  ;12 HOUR OVERFLOW TEST

	MOVF	HOURS,0		;GET HOURS
	XORLW	13
	BTFSS	Z
	GOTO    EXINT		;EXIT HERE

	MOVLW	01
	MOVWF	HOURS		;SET HOURS TO 1

	BTFSS	AMPM		;IS AM/PM INDICATOR SET?
	GOTO	AP0S
	BCF	AMPM		;CLEAR IT...
	GOTO    EXINT		;EXIT HERE...
AP0S	BSF	AMPM		;SET IT...
	GOTO    EXINT		;EXIT HERE...

HOUR24S	MOVF	HOURS,0		;CHECK FOR OVERFLOW
	XORLW	24
	BTFSS	Z
	GOTO    EXINT		;EXIT HERE
	CLRF	HOURS		;SET TO ZERO HOURS
	GOTO    EXINT		;EXIT HERE...

EXINT	CALL	UPDISP		;UPDATE DISPLAY

TBSYNC	BTFSS	PORTB,0		;IS TIMEBASE STILL LOW?
	GOTO	TBSYNC		;WAIT FOR RISING EDGE OF TIMEBASE

	BCF	INTF		;RESET INTERRUPT BIT
	RETFIE			;RETURN FROM INTERRUPT

;*****************************************************************************

;BEGIN PROGRAM INITIALIZE PIC

;*****************************************************************************

START	MOVLW	B'11111111'
	MOVWF	PORTB		;PRE-SET PORTB

	BANK1
	MOVLW	B'00111111'
	MOVWF	TRISA		;DIR PORT A

	MOVLW	B'00000001'
	MOVWF	TRISB		;DIR PORT B

	MOVLW	B'00000000'
	MOVWF	TRISC		;DIR PORT C

	MOVLW	B'10111111'
	MOVWF	OPTN		;INT EDGE LOW
	BANK0
	
	CLRF	HOURS		;CLEAR TIMERS
	CLRF	MINS
	CLRF	SECS			

	BCF	AMPM		;OFF AM/PM INDICATOR
	MOVLW	12		;PRE-SET HOURS
	BTFSC	T1224		;12 OR 24?
	MOVWF	HOURS

	CALL	UPDISP		;UPDATE DISPLAY STATUS

	MOVLW	FREQUENCY	
	MOVWF	TIMEBASE	;PRE-SET TIMEBASE

   ;INITIALIZE INTERRUPT SYSTEM
	
	MOVLW	B'10010000'
	MOVWF	INTCON		;ENABLE EXT INT'S

;*****************************************************************************

;MAIN PROGRAM -- INSERT USER PROGRAM HERE!

;*****************************************************************************

RUN	GOTO	RUN		;RUN PROGRAM (NO USER PROGRAM!)

;*****************************************************************************

;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	0x200

UPDISP	CLRF	BUF1		;CLEAR ALL BUFFER BITS
	CLRF	BUF2
	CLRF	BUF3
	CLRF	BUF4
	CLRF	BUF5
	CLRF	BUF6
	CLRF	BUF7

  ;CONVERT AND BUST PACKED BCD BITS INTO INDIVIDUAL 
  ;UNITS AND MASK OUT THE HIGH NIBBLE

	MOVF	HOURS,0
	CALL	DCONVERT	;CONVERT TO DECIMAL
	MOVWF	HT		;HOURS TENS
	MOVWF	HU		;HOURS UNITS
	MOVF	MINS,0
	CALL	DCONVERT	;CONVERT TO DECIMAL
	MOVWF	MT		;MINUTES TENS
	MOVWF	MU		;MINUTES UNITS
	MOVF	SECS,0
	CALL	DCONVERT	;CONVERT TO DECIMAL
	MOVWF	ST		;SECONDS TENS
	MOVWF	SU		;SECONDS UNITS
	
	SWAPF	HT,1		;RE-ARRANGE BITS
	SWAPF	MT,1
	SWAPF	ST,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

  ;SET THE AMPM INDICATOR FLAG BIT

	BCF	SEGAMPM
	BTFSC	AMPM
	BSF	SEGAMPM		;SET AM/PM INDICATOR

  ;SELECT HOURS TENS DRIVE OUTPUT

	MOVLW	HIGH PCHHT
	MOVWF	PCHI
	MOVF	HT,0		;GET HOURS TENS
	BTFSC	Z
	GOTO	HUD		;ZERO, BLANK IT!!

	BCF	CARRY		;CLEAR CARRY BIT
	RLF	HT,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PC,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	CARRY		;CLEAR CARRY BIT
	RLF	HU,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PC,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	CARRY		;CLEAR CARRY BIT
	RLF	MT,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PC,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	CARRY		;CLEAR CARRY BIT
	RLF	MU,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PC,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	CARRY		;CLEAR CARRY BIT
	RLF	ST,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PC,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	CARRY		;CLEAR CARRY BIT
	RLF	SU,0		;MULTIPLY DIGIT BY TWO
	ADDWF	PC,1		;CALCULATED BRANCH...
	CALL	SETSU0		;0 SET SEGMENT 0
	GOTO	UPPORT 		;1
	CALL	SETSU1		;2 SET SEGMENT 1
	GOTO	UPPORT  	;3
	CALL	SETSU2		;4 SET SEGMENT 2
	GOTO	UPPORT  	;5
	CALL	SETSU3		;6 SET SEGMENT 3
	GOTO	UPPORT  	;7
	CALL	SETSU4		;8 SET SEGMENT 4
	GOTO	UPPORT  	;9
	CALL	SETSU5		;10 SET SEGMENT 5
	GOTO	UPPORT  	;11
	CALL	SETSU6		;12 SET SEGMENT 6
	GOTO	UPPORT  	;13
	CALL	SETSU7		;14 SET SEGMENT 7
	GOTO	UPPORT		;15
	CALL	SETSU8		;16 SET SEGMENT 8
	GOTO	UPPORT		;17
	CALL	SETSU9		;18 SET SEGMENT 9
	GOTO	UPPORT		;19
	NOP			;20
	
UPPORT	MOVF	BUF1,0		;OUTPUT DATA TO BUS AND LATCH
	MOVWF	BUS		;DATA ON BUS
	BCF	STR1		;STROBE
	NOP
	BSF	STR1

	MOVF	BUF2,0
	MOVWF	BUS		;DATA ON BUS
	BCF	STR2		;STROBE
	NOP
	BSF	STR2

	MOVF	BUF3,0
	MOVWF	BUS		;DATA ON BUS
	BCF	STR3		;STROBE
	NOP
	BSF	STR3

	MOVF	BUF4,0
	MOVWF	BUS		;DATA ON BUS
	BCF	STR4		;STROBE
	NOP
	BSF	STR4

	MOVF	BUF5,0
	MOVWF	BUS		;DATA ON BUS
	BCF	STR5		;STROBE
	NOP
	BSF	STR5
	
	MOVF	BUF6,0
	MOVWF	BUS		;DATA ON BUS
	BCF	STR6		;STROBE
	NOP
	BSF	STR6

	MOVF	BUF7,0
	MOVWF	BUS		;DATA ON BUS
	BCF	STR7		;STROBE
	NOP
	BSF	STR7
	
	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

;******************************************************************

;HEX TO DECIMAL LOOKUP TABLE

;******************************************************************

	ORG	0x400

DCONVERT
	MOVWF	TEMP		;SAVE IN TEMP REG
	MOVLW	0x3D		;CHECK FOR OUT OF RANGE
	SUBWF	TEMP,0
	BTFSC	CARRY
	RETLW	00		;DATA IS NO GOOD
DCO	MOVLW	HIGH DCONVERT
	MOVWF	PCHI		;SETUP BRANCH
	MOVF	TEMP,0		;GET DATA
	ADDWF	PC,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


	END
