	PROCESSOR		16F876
	#INCLUDE		<P16F876.INC>
	
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF

HRS_H	EQU		0X20
HRS_L	EQU		0X21
MIN_H	EQU		0X22
MIN_L	EQU		0X23
SEC_H	EQU		0X24
SEC_L	EQU		0X25
HRTOT	EQU		0X26
UPDREG	EQU		0X27
CNTR	EQU		0X28
BYTEC	EQU		0X29
DPDATA	EQU		0X2A
DPTR	EQU		0X2B
OFFSET	EQU		0X2C
COLCNT	EQU		0X2D
BANKC	EQU		0X2E
NUMID	EQU		0X2F

#DEFINE	SETSCL	0X00
#DEFINE	SETSCH	0X01
#DEFINE	SETMNL	0X02
#DEFINE	SETMNH	0X03
#DEFINE	SETHRL	0X04
#DEFINE	SETHRH	0X05
#DEFINE	RSET	PORTB, 0X04
#DEFINE	DORC	PORTB, 0X05
#DEFINE	SDAT	PORTB, 0X06
#DEFINE	SCLK	PORTB, 0X07

#DEFINE HRC0	0X01
#DEFINE	HRC1	0X0C
#DEFINE	MNC0	0X1E
#DEFINE	MNC1	0X2A
#DEFINE	SCC0	0X3C
#DEFINE SCC1	0X48

	ORG		0X0000
	
		CLRF	PCLATH
		GOTO	INIT

	ORG		0X0004

		BCF		PIR1, CCP1IF
		MOVLW	0X01
		XORWF	UPDREG, 1
		BTFSC	PORTC, 0X04
		GOTO	$+4
		MOVLW	0X3F
		MOVWF	UPDREG
		GOTO	USR1
		BTFSC	PORTC, 0X05
		GOTO	$+4
		MOVLW	0X3F
		MOVWF	UPDREG
		GOTO	USR2
		BTFSS	UPDREG, SETSCL
		RETFIE
		INCF	SEC_L, 1
		MOVLW	0X0A
		XORWF	SEC_L, 0
		BTFSS	STATUS, Z
		GOTO	SCL
		CLRF	SEC_L
		INCF	SEC_H, 1
		BSF		UPDREG, SETSCH
		MOVLW	0X06
		XORWF	SEC_H, 0
		BTFSS	STATUS, Z
		GOTO	SCH
		CLRF	SEC_H
USR1	INCF	MIN_L, 1
		BSF		UPDREG, SETMNL
		MOVLW	0X0A
		XORWF	MIN_L, 0
		BTFSS	STATUS, Z
		GOTO	MNL
		CLRF	MIN_L
		INCF	MIN_H, 1
		BSF		UPDREG, SETMNH
		MOVLW	0X06
		XORWF	MIN_H, 0
		BTFSS	STATUS, Z
		GOTO	MNH
		CLRF	MIN_H
USR2	INCF	HRS_L, 1
		INCF	HRTOT, 1
		BSF		UPDREG, SETHRL
		MOVLW	0X0A
		XORWF	HRS_L, 0
		BTFSC	STATUS, Z
		CLRF	HRS_L
		BTFSS	STATUS, Z
		GOTO	CHKDAY
		INCF	HRS_H, 1
		BSF		UPDREG, SETHRH
CHKDAY	MOVLW	0X18
		XORWF	HRTOT, 0
		BTFSS	STATUS, Z
		GOTO	HRH
		CLRF	HRS_L
		CLRF	HRS_H
		CLRF	HRTOT
		BSF		UPDREG, SETHRH
HRH		BTFSS	UPDREG, SETHRH
		GOTO	HRL
		MOVLW	HRS_H
		CALL	GETPTR
		MOVLW	HRC0
		CALL	DPWRT
HRL		BTFSS	UPDREG, SETHRL
		GOTO	MNH
		MOVLW	HRS_L
		CALL	GETPTR
		MOVLW	HRC1
		CALL	DPWRT
MNH		BTFSS	UPDREG, SETMNH
		GOTO	MNL
		MOVLW	MIN_H
		CALL	GETPTR
		MOVLW	MNC0
		CALL	DPWRT
MNL		BTFSS	UPDREG, SETMNL
		GOTO	SCH
		MOVLW	MIN_L
		CALL	GETPTR
		MOVLW	MNC1
		CALL	DPWRT
SCH		BTFSS	UPDREG, SETSCH
		GOTO	SCL
		MOVLW	SEC_H
		CALL	GETPTR
		MOVLW	SCC0
		CALL	DPWRT
SCL		BTFSS	UPDREG, SETSCL
		GOTO	ACK
		MOVLW	SEC_L
		CALL	GETPTR
		MOVLW	SCC1
		CALL	DPWRT
ACK		MOVLW	0X01
		ANDWF	UPDREG, 1
		BSF		DORC
		CLRW
		CALL	SEND
		RETFIE
		
DPWRT	MOVWF	NUMID
		MOVLW	0X41
		MOVWF	BANKC
NXLN	INCF	BANKC, 1
		MOVF	BANKC, 0
		XORLW	0X45
		BTFSC	STATUS, Z
		RETURN
		MOVF	BANKC, 0
		CALL	SEND
		MOVF	NUMID, 0
		IORLW	0x80
		CALL	SEND
		MOVLW	0X0A
		MOVWF	COLCNT
		DECF	OFFSET, 1
LNADJ	INCF	OFFSET, 1
		CALL	GETCOL
		CLRF	PCLATH
		BSF		DORC
		CALL	SEND
		DECFSZ	COLCNT, 1
		GOTO	LNADJ
		INCF	OFFSET, 1
		GOTO	NXLN
		
SEND	MOVWF	DPDATA
		MOVLW	0X08
		MOVWF	BYTEC
NEXT	BCF		STATUS, C
		RLF		DPDATA, 1
		BTFSS	STATUS,C
		BCF		SDAT
		BTFSC	STATUS,C
		BSF		SDAT
		BSF		SCLK
		BCF		SCLK
		DECFSZ	BYTEC,1
		GOTO	NEXT
		BCF		SDAT
		BCF		DORC
		RETURN

GETPTR	MOVWF	FSR					; CNTR-ben visszaadja a
		MOVLW	0X01				; PCLATH-ba írandó két LSB-t,
		MOVWF	CNTR				; DPTR-ben pedig az offsetet
		MOVLW	0X06
		SUBWF	INDF, 0
		BTFSC	STATUS, C
		INCF	CNTR, 1
PTROK	CLRF	DPTR
		MOVF	INDF, 0
		BTFSC	STATUS, Z
		GOTO	MLP
		MOVWF	DPTR
		MOVLW	0X06
		SUBWF	DPTR, 0
		BTFSC	STATUS, C
		MOVWF	DPTR
		CLRW
MLP		MOVF	DPTR, 1
		BTFSC	STATUS, Z
		GOTO	OK
		ADDLW	0X25
		DECF	DPTR, 1
		GOTO	MLP
OK		MOVWF	OFFSET
		RETURN

INIT	BCF		STATUS, RP0
		BCF		STATUS, RP1
		CLRF	TMR1L				; reset-nél TMR1 nem nullázódik,
		CLRF	TMR1H				; programból gondoskodunk róla
		CLRF	PORTB
		CLRF	PORTA
		CLRF	PORTC
		BSF		STATUS, RP0
		MOVLW	0X0F
		MOVWF	TRISB
		BSF		PIE1, CCP1IE
		BCF		STATUS, RP0
		MOVLW	0X05				; az idő 23:59:59-ről indul,
		MOVWF	SEC_H				; így az első interruptnál
		MOVWF	MIN_H				; 00:00:00-ba csordul, ami
		MOVLW	0X09				; automatikusan frissíti a
		MOVWF	MIN_L				; kijelző minden számjegyét
		MOVWF	SEC_L
		MOVLW	0X03
		MOVWF	HRS_L
		MOVLW	0X02
		MOVWF	HRS_H
		MOVLW	0X17
		MOVWF	HRTOT
		CLRF	UPDREG
		CALL	DPINIT		
		MOVLW	0XF4				; F4
		MOVWF	CCPR1H
		MOVLW	0X24				; 24
		MOVWF	CCPR1L
		MOVLW	0X31
		MOVWF	T1CON
		MOVLW	0X0B
		MOVWF	CCP1CON		
		BSF		INTCON, PEIE
		BSF		INTCON, GIE
		NOP
		GOTO	$-1

;------- EGYSZERŰ SZÁMLÁLGATÓS KÉSLELTETÉS -------
; időzítőt nem használunk, az megmarad az időmérésnek
;
DELAY	CLRF	CNTR
		CLRF	BYTEC
		DECFSZ	CNTR,1
		GOTO	$-1
		DECFSZ	BYTEC,1
		GOTO	$-3
		DECFSZ	CNTR,1
		GOTO	$-1
		DECFSZ	BYTEC,1
		GOTO	$-3
		RETURN					; vissza ~0.4 másodperc után

;------- CNTR megadja a karaktercsoport helyét (0...5 közötti vagy
; nem), ezt beírjuk a címtartomány felső byte-jába
; a már kiszámított OFFSET pedig az adott számjegy elhelyezkedését
; mondja meg, ez lesz az ugrócím alsó byte-ja
;
GETCOL	MOVF	CNTR, 0
		MOVWF	PCLATH
		MOVF	OFFSET, 0
		MOVWF	PCL				; ekkor ugrik PCLATH:PCL-re

;------- UGRÓTÁBLA A SZÁMOK MEGJELENÍTÉSÉHEZ -------
;
; 0...5 között a 0x100-as, 6..9 között a 0x200-as programcímtől
; helyezkednek el a kijelzőbe küldendő byte-ok. Karakterenként
; 30 byte (10 képpont szélesség, 3 bankon keresztül), és az adott
; számjegy * 0x25 + offset = első bank, első byte kezdőcíme
;
; nulla
	ORG		0X0100
		RETLW	0XFC
		RETLW	0XFA
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0XFA
		RETLW	0XFC
		RETLW	0XE7
		RETLW	0XC3
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0XC3
		RETLW	0XE7
		RETLW	0X3F
		RETLW	0X5F
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X5F
		RETLW	0X3F
; egy
	ORG		0X0125
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0XF8
		RETLW	0XFC
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0XC3
		RETLW	0XE7
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X1F
		RETLW	0X3F
; kettő
	ORG		0X014A
		RETLW	0X00
		RETLW	0X02
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0XFA
		RETLW	0XFC
		RETLW	0XE0
		RETLW	0XD8
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X1B
		RETLW	0X07
		RETLW	0X3F
		RETLW	0X5F
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X40
		RETLW	0X00
; három
	ORG		0X016F
		RETLW	0X02
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0XFA
		RETLW	0XFC
		RETLW	0X00
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0XDB
		RETLW	0XE7
		RETLW	0X00
		RETLW	0X40
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X5F
		RETLW	0X3F
; négy
	ORG		0X0194
		RETLW	0XFC
		RETLW	0XF8
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0XF8
		RETLW	0XFC
		RETLW	0X07
		RETLW	0X1B
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0XDB
		RETLW	0XE7
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X1F
		RETLW	0X3F
; öt
	ORG		0X01B9
		RETLW	0XFC
		RETLW	0XFA
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X02
		RETLW	0X00
		RETLW	0X07
		RETLW	0X1B
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0XD8
		RETLW	0XE0
		RETLW	0X00
		RETLW	0X40
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X5F
		RETLW	0X3F
; hat
	ORG		0X0200
		RETLW	0XFC
		RETLW	0XFA
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X02
		RETLW	0X00
		RETLW	0XE7
		RETLW	0XDB
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0XD8
		RETLW	0XE0
		RETLW	0X3F
		RETLW	0X5F
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X5F
		RETLW	0X3F
; hét
	ORG		0X0225
		RETLW	0X00
		RETLW	0X02
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0XFA
		RETLW	0XFC
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0XC3
		RETLW	0XE7
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X00
		RETLW	0X1F
		RETLW	0X3F
; nyolc
	ORG		0X024A
		RETLW	0XFC
		RETLW	0XFA
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0XFA
		RETLW	0XFC
		RETLW	0XE7
		RETLW	0XDB
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0XDB
		RETLW	0XE7
		RETLW	0X3F
		RETLW	0X5F
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X5F
		RETLW	0X3F
; kilenc
	ORG		0X026F
		RETLW	0XFC
		RETLW	0XFA
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0X06
		RETLW	0XFA
		RETLW	0XFC
		RETLW	0X07
		RETLW	0X1B
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0X18
		RETLW	0XDB
		RETLW	0XE7
		RETLW	0X00
		RETLW	0X40
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X60
		RETLW	0X5F
		RETLW	0X3F
;------- UGRÓTÁBLA VÉGE -------

;------- KIJELZŐ INICIALIZÁLÓ RUTIN, EGYSZER HÍVÓDIK MEG -------
; paraméterei nincsenek; kijelző RESET vonala 0-ban van (aktív)
;
	ORG		0X0294
DPINIT	CALL	DELAY			; reset-idő biztosítása
		BSF		RSET			; kilépés reset módból, majd
		CALL	DELAY			; rövid késleltetés (éledésre)
		CALL	DELAY
		MOVLW	0X21			; extended utasításkészlet
		CALL	SEND
		MOVLW	0X13			; 1/48 multiplexelés
		CALL	SEND
		MOVLW	0XCA			; Vop beállítása
		CALL	SEND
		MOVLW	0X06			; 2. hőmérsékleti jellemzők beállítása
		CALL	SEND
		MOVLW	0X20			; normál utasításkészlet
		CALL	SEND
		MOVLW	0X0C			; normál üzemmód
		CALL	SEND
		MOVLW	0X06			; 6 bankon végig törlés, vagyis a
		MOVWF	BANKC			; kijelző RAM-celláinak nullázása,
BNKUP	MOVF	BANKC,0			; mivel véletlenszerű értékekkel
		SUBLW	0X06			; inicializálódnak
		IORLW	0X40			; bankszám + 0x40 = bankcím
		CALL	SEND
		MOVLW	0X80			; minden bankban 0. oszlopnál kezd
		CALL	SEND
		MOVLW	0X54			; 84 oszlop minden bankban
		MOVWF	CNTR
		CLRW					; üres byte a RAM-ok törlésére
		BSF		DORC			; adatküldés jelzése
		CALL	SEND			; kiléptető rutin hívása
		DECFSZ	CNTR,1			; ha még nincs meg a 84 oszlop,
		GOTO	$-4				; folytatja (kijelző magától lép)
		DECFSZ	BANKC,1			; egyébként felkészül bankváltásra,
		GOTO	BNKUP			; és végrehajtja
		MOVLW	0X09			; minden szegmens bekapcsolva
		CALL	SEND
		CALL	DELAY			; hagyjuk, hogy megjelenhessen
		CALL	DELAY
		CALL	DELAY
		MOVLW	0X0C			; normál üzemmód
		CALL	SEND
		MOVLW	0X43			; a harmadik banknál kezdünk
		CALL	SEND
		MOVLW	0X98			; a 24. oszlopnál
		CALL	SEND
		BSF		DORC
		MOVLW	0X42			; kettőspont adatainak küldése
		CALL	SEND
		BSF		DORC
		MOVLW	0XE7
		CALL	SEND
		BSF		DORC
		MOVLW	0XE7
		CALL	SEND
		BSF		DORC
		MOVLW	0X42
		CALL	SEND
		MOVLW	0XB6			; az 54. oszloptól másik kettőspont
		CALL	SEND
		BSF		DORC
		MOVLW	0X42
		CALL	SEND
		BSF		DORC
		MOVLW	0XE7
		CALL	SEND
		BSF		DORC
		MOVLW	0XE7
		CALL	SEND
		BSF		DORC
		MOVLW	0X42
		CALL	SEND
		RETURN					; init kész, visszatérés

		END
