; 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
LRAM_0x0C
LRAM_0x0D
LRAM_0x0E
LRAM_0x0F
LRAM_0x10
LRAM_0x11
LRAM_0x13
LRAM_0x14
LRAM_0x15
LRAM_0x16
LRAM_0x17
	endc

; Program

    Org 0x0000

;   Reset-Vector
    GOTO LADR_0x006E

    Org 0x0004
;   Interrupt-Vector
    MOVWF LRAM_0x16
    SWAPF STATUS,W
    MOVWF LRAM_0x17
    DECFSZ LRAM_0x11,F
    GOTO LADR_0x0011
    MOVLW 0x01           ;   b'00000001'  d'001'
    MOVWF LRAM_0x11
    CALL LADR_0x0033
    BCF LRAM_0x13,3
    MOVLW 0x07           ;   b'00000111'  d'007'
    ANDWF PORTB,W        ; !!Bank!! PORTB - TRISB
    BTFSS STATUS,Z
    BSF LRAM_0x13,3
LADR_0x0011
    DECFSZ LRAM_0x14,F
    GOTO LADR_0x001B
    MOVLW 0xC8           ;   b'11001000'  d'200'
    MOVWF LRAM_0x14
    BSF LRAM_0x13,1
    DECFSZ LRAM_0x15,F
    GOTO LADR_0x001B
    MOVLW 0x3C           ;   b'00111100'  d'060'  "<"
    MOVWF LRAM_0x15
    BSF LRAM_0x13,2
LADR_0x001B
    SWAPF LRAM_0x17,W
    MOVWF STATUS
    SWAPF LRAM_0x16,F
    SWAPF LRAM_0x16,W
    BCF INTCON,T0IF
    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 -> CBDA -> 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	LRAM_0x10,W
    CALL	LADR_0x0021		; Digit number -> Mask
    MOVWF	PORTA          ; Select digit
    MOVLW	LRAM_0x0C - 1
    MOVWF	FSR
    MOVF	LRAM_0x10,W
    ADDWF	FSR,F			; Digit address in FSR
    MOVF	INDF,W
    CALL	LADR_0x0027		; Data to NIXIE code
    MOVWF	PORTB          ; Celect Cathode
    DECFSZ	LRAM_0x10,F
    GOTO	LADR_0x0041		; Loop for 4 digits
    BSF		LRAM_0x10,2
LADR_0x0041
    RETURN

LADR_0x0042					; Inc minutes
    INCF	LRAM_0x0F,F
    MOVLW	0x0A           ;   b'00001010'  d'010'
    SUBWF	LRAM_0x0F,W
    BTFSS	STATUS,Z
    GOTO	LADR_0x0061
    CLRF	LRAM_0x0F
    INCF	LRAM_0x0E,F
    MOVLW	0x06           ;   b'00000110'  d'006'
    SUBWF	LRAM_0x0E,W
    BTFSS	STATUS,Z
    GOTO	LADR_0x0061
    CLRF	LRAM_0x0E

LADR_0x004E					; Inc houres
    INCF LRAM_0x0D,F
    MOVLW 0x0A           ;   b'00001010'  d'010'
    SUBWF LRAM_0x0D,W
    BTFSS STATUS,Z
    GOTO LADR_0x0055
    CLRF LRAM_0x0D
    INCF LRAM_0x0C,F
LADR_0x0055
    MOVLW 0x02           ;   b'00000010'  d'002'
    SUBWF LRAM_0x0C,W
    BTFSS STATUS,Z
    GOTO LADR_0x0061
    MOVLW 0x04           ;   b'00000100'  d'004'
    SUBWF LRAM_0x0D,W
    BTFSS STATUS,Z
    GOTO LADR_0x0061
    CLRF LRAM_0x0C
    CLRF LRAM_0x0D
    MOVLW 0x0A           ;   b'00001010'  d'010'
    ADDWF LRAM_0x15,W
LADR_0x0061
    BCF LRAM_0x13,2
    RETURN

LADR_0x0063
    MOVLW 0x02           ;   b'00000010'  d'002'
    ANDWF PORTB,W        ; !!Bank!! PORTB - TRISB
    BTFSC STATUS,Z
    CALL LADR_0x004E	; Inc houres
    MOVLW 0x01           ;   b'00000001'  d'001'
    ANDWF PORTB,W        ; !!Bank!! PORTB - TRISB
    BTFSC STATUS,Z
    CALL LADR_0x0042	; Inc minutes
LADR_0x006B
    BTFSC LRAM_0x13,3
    GOTO LADR_0x006B
    RETURN

LADR_0x006E					; Initialization
	ifdef	CMCON
		movlw	0x07
		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,GIE
    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 LRAM_0x0C
    CLRF LRAM_0x0D
    CLRF LRAM_0x0E
    CLRF LRAM_0x0F
    CLRF LRAM_0x13
    MOVLW 0x04           ;   b'00000100'  d'004'
    MOVWF LRAM_0x10
    MOVLW 0xC8           ;   b'11001000'  d'200'
    MOVWF LRAM_0x14
    MOVLW 0x3C           ;   b'00111100'  d'060'  "<"
    MOVWF LRAM_0x15
LADR_0x008A
    BTFSC LRAM_0x13,2
    CALL LADR_0x0042	; Inc Minutes
    BTFSC LRAM_0x13,3
    CALL LADR_0x0063	; Inc houres
    GOTO LADR_0x008A

    End
