; original File = C:\tmp\Downloads\uChip\DisAsm\4 csöves nixie program 16F84.hex

	ifdef __16F84A
   		processor 16F84A
		#include <P16F84A.INC>
		__config _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC ; 0x3FF9
	endif

	ifdef __16F628
		processor 16F628
		#include <P16F628.INC>
		__config _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _LVP_OFF & _BODEN_OFF ; 0x3FF9
	endif
	ifdef __16F628A
		processor 16F628A
		#include <P16F628A.INC>
		__config _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _LVP_OFF & _BODEN_OFF ; 0x3FF9
	endif

;   __idlocs 0xF0, 0xF0, 0xF0, 0xF0


; RAM-Variable
	cblock 0x20
HOUR10
HOUR1
MINUTE10
MINUTE1

DIGIT_INDEX
DISLPAY_COUNTER
FLAGS
SUBSEC_COUNTER
SEC_COUNTER

W_SAVE
STATUS_SAVE
	endc

; Program

    Org 0x0000			;   Reset-Vector
    GOTO LADR_0x006E

    Org 0x0004			;   Interrupt-Vector		5ms
    MOVWF	W_SAVE
    SWAPF	STATUS,W
    MOVWF	STATUS_SAVE
    DECFSZ	DISLPAY_COUNTER,F
    GOTO	LADR_0x0011
    MOVLW	0x01           ;   b'00000001'  d'001'
    MOVWF	DISLPAY_COUNTER
    CALL	LADR_0x0033
    BCF		FLAGS,3
    MOVLW	0x07           ;   b'00000111'  d'007'
    ANDWF	PORTB,W        ; !!Bank!! PORTB - TRISB
    BTFSS	STATUS,Z
    BSF		FLAGS,3			; Key pressed -> Set mode
LADR_0x0011
    DECFSZ	SUBSEC_COUNTER,F
    GOTO	LADR_0x001B
    MOVLW	0xC8           ;   b'11001000'  d'200'
    MOVWF	SUBSEC_COUNTER
    BSF		FLAGS,1			; Once per second
    DECFSZ	SEC_COUNTER,F
    GOTO	LADR_0x001B
    MOVLW	0x3C           ;   b'00111100'  d'060'  "<"
    MOVWF	SEC_COUNTER
    BSF		FLAGS,2			; Once per minute
LADR_0x001B
    BCF		INTCON,T0IF
    SWAPF	STATUS_SAVE,W
    MOVWF	STATUS
    SWAPF	W_SAVE,F
    SWAPF	W_SAVE,W
    RETFIE

LADR_0x0021
    ADDWF	PCL,F          ; !!Program-Counter-Modification
    RETLW	0x00           ;   b'00000000'  d'000'
    RETLW	0x01           ;   b'00000001'  d'001'
    RETLW	0x02           ;   b'00000010'  d'002'
    RETLW	0x04           ;   b'00000100'  d'004'
    RETLW	0x08           ;   b'00001000'  d'008'
LADR_0x0027
    ADDWF	 PCL,F          ; !!Program-Counter-Modification
;							; BCD (DCBA) -> BCD(CBDA) -> NIXIE(0123456789_) -> NIXIE(0158946732_)
    RETLW	0x30           ;   b'00110000'  d'048'
    RETLW	0x20           ;   b'00100000'  d'032'
    RETLW	0x00           ;   b'00000000'  d'000'
    RETLW	0x10           ;   b'00010000'  d'016'
    RETLW	0x40           ;   b'01000000'  d'064'
    RETLW	0xD0           ;   b'11010000'  d'208'
    RETLW	0x90           ;   b'10010000'  d'144'
    RETLW	0x80           ;   b'10000000'  d'128'
    RETLW	0x50           ;   b'01010000'  d'080'
    RETLW	0xC0           ;   b'11000000'  d'192'
    RETLW	0xF0           ;   b'11110000'  d'240'

LADR_0x0033
    MOVF	DIGIT_INDEX,W
    CALL	LADR_0x0021		; Digit number -> Mask
    MOVWF	PORTA          ; Select digit
    DECF	DIGIT_INDEX,W
    ADDLW	HOUR10
    MOVWF	FSR				; Digit address in FSR
    MOVF	INDF,W
    CALL	LADR_0x0027		; Data to NIXIE code
    MOVWF	PORTB          ; Celect Cathode
    DECFSZ	DIGIT_INDEX,F
    GOTO	LADR_0x0041		; Loop for 4 digits
    BSF		DIGIT_INDEX, 2
LADR_0x0041
    RETURN

LADR_0x0042					; Inc minutes
    INCF	MINUTE1,F
    MOVLW	0x0A           ;   b'00001010'  d'010'
    SUBWF	MINUTE1,W
    BTFSS	STATUS,Z
    GOTO	LADR_0x0061
    CLRF	MINUTE1
    INCF	MINUTE10,F
    MOVLW	0x06           ;   b'00000110'  d'006'
    SUBWF	MINUTE10,W
    BTFSS	STATUS,Z
    GOTO	LADR_0x0061
    CLRF	MINUTE10

LADR_0x004E					; Inc houres
    INCF	HOUR1,F
    MOVLW	0x0A           ;   b'00001010'  d'010'
    SUBWF	HOUR1,W
    BTFSS	STATUS,Z
    GOTO	LADR_0x0055
    CLRF	HOUR1
    INCF	HOUR10,F
LADR_0x0055
    MOVLW	0x02           ;   b'00000010'  d'002'
    SUBWF	HOUR10,W
    BTFSS	STATUS,Z
    GOTO	LADR_0x0061
    MOVLW	0x04           ;   b'00000100'  d'004'
    SUBWF	HOUR1,W
    BTFSS	STATUS,Z
    GOTO	LADR_0x0061
    CLRF	HOUR10
    CLRF	HOUR1
; Quartz frequency compensation ??
;    MOVLW	0x0A           ;   b'00001010'  d'010'
;    ADDWF	SEC_COUNTER,W

LADR_0x0061
    BCF		FLAGS,2
    RETURN

LADR_0x0063
;    MOVLW	0x02           ;   b'00000010'  d'002'
;    ANDWF	PORTB,W        ; !!Bank!! PORTB - TRISB
;    BTFSC	STATUS,Z
	btfsc	PORTB, 1
    CALL	LADR_0x004E		; Inc houres
;    MOVLW	0x01           ;   b'00000001'  d'001'
;    ANDWF	PORTB,W        ; !!Bank!! PORTB - TRISB
;    BTFSC	STATUS,Z
	btfsc	PORTB, 0
    CALL	LADR_0x0042		; Inc minutes
LADR_0x006B					; Wait for key release
    BTFSC	FLAGS,3
    GOTO	LADR_0x006B
    RETURN

LADR_0x006E					; Initialization
	ifdef	CMCON
		movlw	0x07		; Turn off comparators
		movwf	CMCON
	endif
    CLRF	PORTA           ; !!Bank!! PORTA - TRISA
    CLRF	PORTB           ; !!Bank!! PORTB - TRISB
    BSF		STATUS,RP0       ; !!Bank Register-Bank(0/1)-Select
    MOVLW	0x10           ;   b'00010000'  d'016'
    MOVWF	TRISA	         ; !!Bank!! PORTA - TRISA
    MOVLW	0x03           ;   b'00000011'  d'003'
    MOVWF	TRISB          ; !!Bank!! PORTB - TRISB
    BCF		STATUS,RP0       ; !!Bank Register-Bank(0/1)-Select
    CLRF	TMR0            ; !!Bank!! TMR0 - OPTION_REG
    BCF		INTCON,T0IF
    BSF		INTCON,T0IE
    BSF		STATUS,RP0       ; !!Bank Register-Bank(0/1)-Select
    MOVLW	0xD3           ;   b'11010011'  d'211'
    MOVWF	OPTION_REG     ; !!Bank!! TMR0 - OPTION_REG
    BCF		STATUS,RP0       ; !!Bank Register-Bank(0/1)-Select
    CLRF	TMR0            ; !!Bank!! TMR0 - OPTION_REG
    CLRF	HOUR10
    CLRF	HOUR1
    CLRF	MINUTE10
    CLRF	MINUTE1
    CLRF	FLAGS
    MOVLW	0x04           ;   b'00000100'  d'004'
    MOVWF	DIGIT_INDEX
    MOVLW	0xC8           ;   b'11001000'  d'200'
    MOVWF	SUBSEC_COUNTER
    MOVLW	0x3C           ;   b'00111100'  d'060'  "<"
    MOVWF	SEC_COUNTER
    BSF		INTCON,GIE
LADR_0x008A
    BTFSC	FLAGS,2
    CALL	LADR_0x0042	; Inc Minutes
    BTFSC	FLAGS,3
    CALL	LADR_0x0063	; Inc houres
    GOTO	LADR_0x008A

    End
