;// =================================================================
;//
;//  64x16 DOT MATRIX CLOCK FIRMWARE 16F84 VERSION
;//
;//    (c)masa-u 2005.12.07
;//    http://www.mbin.jp/~masa-u/
;//
;//    Device: PIC16F84
;//    OSC:    12.800000 MHz
;//    Asm:    MPASM
;//
;// =================================================================

			include		p16f84a.inc
			
			LIST		P=pic16f84a
			
;//**** device configuration

			__config	_HS_OSC & _WDT_OFF & _PWRTE_OFF
			
;//**** pin assignments

;			RA0 -> LED LATCH
;			RA1 -> LED CLK
;			RA2 -> LED DATA H
;			RA3 -> LED DATA V
;			RA4 -> NC

A_LEDLAT	equ			0		;// LED LATCH
A_LEDCLK	equ			1		;// LED DATA CLOCK
A_LEDDH		equ			2		;// LED HORIZONTAL DATA (64 bits)
A_LEDDV		equ			3		;// LED VERTICAL DATA (16 bits)
A_TRIS		equ			0x00

;			RB0 <- BTN 0
;			RB1 <- BTN 1
;			RB2 <- BTN 2
;			RB3 <- BTN 3
;			RB4 -> NC
;			RB5 -> NC
;			RB6 -> NC
;			RB7 -> NC

B_BTN0		equ			0
B_BTN1		equ			1
B_BTN2		equ			2
B_BTN3		equ			3
B_TRIS		equ			0x0F



;//---- reserve F's (for direct access)

clk_hh		equ			0x10
clk_hl		equ			0x11
clk_mh		equ			0x12
clk_ml		equ			0x13
clk_sh		equ			0x14
clk_sl		equ			0x15
clk_sqtr	equ			0x16
clk_tik0	equ			0x17
clk_tik1	equ			0x18

scany		equ			0x20
scanx		equ			0x21

hdata		equ			0x22
dmask		equ			0x23		;// data mask for interlaced display

btn0to		equ			0x24
btn1to		equ			0x25
btn2to		equ			0x26
btn3to		equ			0x27

dispmode	equ			0x28

dtmp1		equ			0x2E
dtmp0		equ			0x2F
arg0		equ			0x30
arg1		equ			0x31
savedW		equ			0x32
savedStat	equ			0x33

;//---- vector initialize

			org			0
_RESET_		goto		_Main
			org			4
			goto		_Intr
		

;//==========================================================================
;//==========================================================================
;//			MAIN PROGRAM
;//==========================================================================

;//==== main program

			org			8
_Main		call		_Init		;// initialize

			movlw		0x01
			movwf		clk_tik1
			clrf		clk_tik0
			clrf		clk_sl
			clrf		clk_sh
			clrf		clk_ml
			clrf		clk_mh
			clrf		clk_hl
			clrf		clk_hh
			clrf		dmask
			clrf		dispmode

			clrf		btn0to
			clrf		btn1to
			clrf		btn2to
			
			clrf		scanx
			clrf		scany
			clrf		PORTA
			
MAINLP		bsf			PORTA, A_LEDLAT
			clrf		scanx

			;// ------------------------- display start
			btfss		dispmode, 0
			goto		I_DISP_NORM

I_DISP_SEC	btfss		scany, 3
			goto		I_DISP_QSEC

I_DISP_SEC_N
			clrf		arg0
			call		_Write1
			movf		clk_sl, W
			call		_DO_DISP_1DIGIT_S
			movf		clk_sh, W
			call		_DO_DISP_1DIGIT_S
			clrf		arg0
			call		_Write1
			goto		E_DISP_SEC

I_DISP_QSEC
			clrf		arg0
			call		_Write2

			movf		clk_sqtr, W
			btfsc		clk_sl, 0
			addlw		4
			call		_SHIFT_SQTR
			movwf		dtmp1

			call		_FONT_SQTR
			movwf		arg0

			movf		dtmp1, f
			btfsc		STATUS, Z
			goto		EL_DISP_QSEC

L_DISP_QSEC	rrf			arg0, W
			andlw		0x7F
			movwf		arg0
			decfsz		dtmp1, f
			goto		L_DISP_QSEC
EL_DISP_QSEC
			call		_Write8
			clrf		arg0
			call		_Write2
E_DISP_SEC
					
I_DISP_NORM	clrf		arg0
			btfss		dispmode, 0
			call		_Write2			;// write 2 dots blank in HM mode

			movf		clk_ml, W
			call		_DO_DISP_1DIGIT
			movf		clk_mh, W
			call		_DO_DISP_1DIGIT

			call		_FONT_COLON
			andwf		dmask, W
			movwf		arg0
			call		_Write4
			btfss		dispmode, 0
			call		_Write2

			movf		clk_hl, W
			call		_DO_DISP_1DIGIT
			movf		clk_hh, W
			btfsc		STATUS, Z
			movlw		0x0A
			call		_DO_DISP_1DIGIT
			
E_DISP		;// ------------------------- display end
			
			bcf			PORTA, A_LEDLAT
			nop
			bsf			PORTA, A_LEDLAT
			
			incf		scany, f
			movlw		0x0F
			andwf		scany, f
			btfss		STATUS, Z
			comf		dmask, f
			
			;// process buttons
I_BTN0		btfsc		PORTB, B_BTN0	;// btn0 -> increment hour
			clrf		btn0to
			incf		btn0to, f
			btfss		STATUS, Z
			goto		E_BTN0
			call		_Inc_Hour
			call		_Zero_Sec
E_BTN0

I_BTN1		btfsc		PORTB, B_BTN1	;// btn1 -> increment minute
			clrf		btn1to
			incf		btn1to, f
			btfss		STATUS, Z
			goto		E_BTN1
			call		_Inc_Min
			call		_Zero_Sec
E_BTN1

I_BTN2		btfss		PORTB, B_BTN2	;// btn2 -> reset seconds
			call		_Zero_Sec

I_BTN3		movf		btn3to, W		;// btn3 -> change display mode
			btfss		STATUS, Z
			goto		I_BTN3_INH
			btfsc		PORTB, B_BTN3
			goto		E_BTN3
			movlw		1
			xorwf		dispmode, f
			comf		btn3to, f
I_BTN3_INH	decf		btn3to, f
E_BTN3

			goto		MAINLP
			


_DO_DISP_1DIGIT	;// send 1-digit worth of data to led
			;// W -> digit to send
			movwf		dtmp0
			call		_FONT_DIGIT_1	;// right-part of digit
			andwf		dmask, W
			movwf		arg0
			call		_Write8
			
			movf		dtmp0, W
			call		_FONT_DIGIT_0	;// left-part of digit
			andwf		dmask, W
			movwf		arg0
			call		_Write4
			btfss		dispmode, 0		;// dispmode 1 -> 12 dots
			call		_Write2			;// dispmode 0 -> 14 dots
			return

_DO_DISP_1DIGIT_S	;// send 1-digit worth of data to led, small
			;// W -> digit to send
			call		_FONT_DIGIT_SMALL	;// get small digit
			andwf		dmask, W
			movwf		arg0
			call		_Write5
			return


;//----	initializer
_Init		clrf		PORTA
			clrf		PORTB
					
			;// --- go to bank 1
			bsf			STATUS, RP0
			
			;// set input-output flag
			movlw		A_TRIS
			movwf		TRISA
			movlw		B_TRIS
			movwf		TRISB
			
			;// --- back to bank 0
			bcf			STATUS, RP0
			
			;// ==================================
			;// --- go to bank 1
			bsf			STATUS, RP0
			
			bcf			OPTION_REG, NOT_RBPU	;// PORTB weak pull-up
			bcf			OPTION_REG, T0CS	;// fOSC/4 clock
			bsf			OPTION_REG, PSA		;// No prescaler
			bcf			OPTION_REG, PS2
			bcf			OPTION_REG, PS1
			bsf			OPTION_REG, PS0		;// 1:4 prescaler
			
			;// --- back to bank 0
			bcf			STATUS, RP0
			
			bcf			INTCON, T0IF
			bsf			INTCON, T0IE
			bsf			INTCON, GIE
			
			return


;//==========================================================================
;//			INTERRUPTS
;//==========================================================================

_Intr		;// save registers
			movwf		savedW
			swapf		STATUS, W
			movwf		savedStat

			bcf			INTCON, T0IF
						
			;// decrement tick low-order
			decf		clk_tik0, f
			btfss		STATUS, Z
			goto		E_INTR
			
			;// decrement tick high-order
			decf		clk_tik1, f
			btfss		STATUS, Z
			goto		E_INTR
			
			;// 1 second elapsed, restore tick (0x0C35)
			call		_Rst_Tick
			
			;// increment quarter of second
			call		_Inc_Sec_Qtr

			;// restore registers
E_INTR		swapf		savedStat, W
			movwf		STATUS
			swapf		savedW, f
			swapf		savedW, W
						
			retfie
			
			
;//==========================================================================
;//			OTHER FUNCTIONS
;//==========================================================================


_Rst_Tick	;// restore tick (0x0C35 -> 0x0D 0x35)
			movlw		0x0D
			movwf		clk_tik1
			movlw		0x35
			movwf		clk_tik0
			return

_Zero_Sec	;// reset second counter
			call		_Rst_Tick
			clrf		clk_sqtr
			clrf		clk_sl
			clrf		clk_sh
			return
			
_Inc_Sec_Qtr ;// increment quarter of second
			incf		clk_sqtr, f
			movlw		0x04
			xorwf		clk_sqtr, W
			btfss		STATUS, Z
			return

			clrf		clk_sqtr
			goto		_Inc_Sec

_Inc_Sec	;// increment second 1's
			incf		clk_sl, f
			movlw		0x0A
			xorwf		clk_sl, W
			btfss		STATUS, Z
			return
			
			clrf		clk_sl
			
			;// increment second 10's
			incf		clk_sh, f
			movlw		0x06
			xorwf		clk_sh, W
			btfss		STATUS, Z
			return
			
			clrf		clk_sh
			goto		_Inc_Min
			
_Inc_Min	;// increment minute 1's
			incf		clk_ml, f
			movlw		0x0A
			xorwf		clk_ml, W
			btfss		STATUS, Z
			return
			
			clrf		clk_ml
			
			;// increment second 10's
			incf		clk_mh, f
			movlw		0x06
			xorwf		clk_mh, W
			btfss		STATUS, Z
			return
			
			clrf		clk_mh
			goto		_Inc_Hour
			
_Inc_Hour	;// increment hour
			incf		clk_hl, f
			movlw		0x0A
			xorwf		clk_hl, W
			btfss		STATUS, Z
			goto		I_CLK_HL_CHK24
			
			clrf		clk_hl
			incf		clk_hh
			return
			
I_CLK_HL_CHK24
			movlw		0x04
			xorwf		clk_hl, W
			btfss		STATUS, Z
			return
			movlw		0x02
			xorwf		clk_hh, W
			btfss		STATUS, Z
			return
			
			clrf		clk_hh
			clrf		clk_hl
			return
			

			;// write n dots to led
			;// arg0 -> data		
_Write8		call		_Write1
_Write7		call		_Write1
_Write6		call		_Write1
_Write5		call		_Write1
_Write4		call		_Write1
_Write3		call		_Write1
_Write2		call		_Write1
			call		_Write1
			return

						
_Write1		;// write 1 dot to led
			;// arg0 <-> data
			bcf			PORTA, A_LEDDH
			btfsc		arg0, 0
			bsf			PORTA, A_LEDDH
			
			bcf			PORTA, A_LEDDV
			movlw		0x0F
			andwf		scanx, W
			xorwf		scany, W
			btfsc		STATUS, Z
			bsf			PORTA, A_LEDDV
			
			rrf			arg0, f
			incf		scanx, f
			
			bsf			PORTA, A_LEDCLK
			nop
			bcf			PORTA, A_LEDCLK
			return
			
			
;//==========================================================================
;//			FONT DATA FUNCTION
;//==========================================================================

org 0x100

_FONT_DIGIT_0  ;// return font of a digit (W), part 0
	movwf  arg0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  arg0, W
	addwf  PCL, f
	goto  _FONT_0_0
	goto  _FONT_1_0
	goto  _FONT_2_0
	goto  _FONT_3_0
	goto  _FONT_4_0
	goto  _FONT_5_0
	goto  _FONT_6_0
	goto  _FONT_7_0
	goto  _FONT_8_0
	goto  _FONT_9_0
	goto  _FONT___0
	goto  _FONT___0
	goto  _FONT___0
	goto  _FONT___0
	goto  _FONT___0
	goto  _FONT___0

_FONT_0_0  ;// return font of 0, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000001'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000001'

_FONT_1_0  ;// return font of 1, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000001'
	retlw  b'00000001'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'

_FONT_2_0  ;// return font of 2, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000001'
	retlw  b'00000011'
	retlw  b'00000111'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000001'
	retlw  b'00000011'
	retlw  b'00000111'
	retlw  b'00000111'
	retlw  b'00000111'

_FONT_3_0  ;// return font of 3, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000001'
	retlw  b'00000011'
	retlw  b'00000111'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000111'
	retlw  b'00000011'
	retlw  b'00000001'

_FONT_4_0  ;// return font of 4, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000001'
	retlw  b'00000001'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000111'
	retlw  b'00000111'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'

_FONT_5_0  ;// return font of 5, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000111'
	retlw  b'00000011'
	retlw  b'00000001'

_FONT_6_0  ;// return font of 6, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000001'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000111'
	retlw  b'00000111'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000001'

_FONT_7_0  ;// return font of 7, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000111'
	retlw  b'00000111'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'

_FONT_8_0  ;// return font of 8, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000001'
	retlw  b'00000011'
	retlw  b'00000111'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000011'
	retlw  b'00000001'
	retlw  b'00000011'
	retlw  b'00000111'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000111'
	retlw  b'00000011'
	retlw  b'00000001'

_FONT_9_0  ;// return font of 9, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000001'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000001'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000011'
	retlw  b'00000011'
	retlw  b'00000001'

_FONT___0  ;// return font of _, part 0
	movlw  1
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'


org 0x200

_FONT_DIGIT_1  ;// return font of a digit (W), part 1
	movwf  arg0
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  arg0, W
	addwf  PCL, f
	goto  _FONT_0_1
	goto  _FONT_1_1
	goto  _FONT_2_1
	goto  _FONT_3_1
	goto  _FONT_4_1
	goto  _FONT_5_1
	goto  _FONT_6_1
	goto  _FONT_7_1
	goto  _FONT_8_1
	goto  _FONT_9_1
	goto  _FONT___1
	goto  _FONT___1
	goto  _FONT___1
	goto  _FONT___1
	goto  _FONT___1
	goto  _FONT___1

_FONT_0_1  ;// return font of 0, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'11111000'
	retlw  b'11111100'
	retlw  b'00001100'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001100'
	retlw  b'11111100'
	retlw  b'11111000'

_FONT_1_1  ;// return font of 1, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00110000'
	retlw  b'01110000'
	retlw  b'11110000'
	retlw  b'11110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'

_FONT_2_1  ;// return font of 2, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'11111000'
	retlw  b'11111100'
	retlw  b'00001110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001110'
	retlw  b'00011100'
	retlw  b'01111000'
	retlw  b'11110000'
	retlw  b'11000000'
	retlw  b'10000000'
	retlw  b'00000000'
	retlw  b'11111110'
	retlw  b'11111110'

_FONT_3_1  ;// return font of 3, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'11111000'
	retlw  b'11111100'
	retlw  b'00001110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001100'
	retlw  b'01111000'
	retlw  b'01111100'
	retlw  b'00001110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001110'
	retlw  b'11111100'
	retlw  b'11111000'

_FONT_4_1  ;// return font of 4, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00111000'
	retlw  b'01111000'
	retlw  b'11011000'
	retlw  b'11011000'
	retlw  b'10011000'
	retlw  b'10011000'
	retlw  b'00011000'
	retlw  b'00011000'
	retlw  b'00011000'
	retlw  b'00011000'
	retlw  b'11111110'
	retlw  b'11111110'
	retlw  b'00011000'
	retlw  b'00011000'
	retlw  b'00011000'
	retlw  b'00011000'

_FONT_5_1  ;// return font of 5, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'11111100'
	retlw  b'11111100'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'11111000'
	retlw  b'11111100'
	retlw  b'00001110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001110'
	retlw  b'11111100'
	retlw  b'11111000'

_FONT_6_1  ;// return font of 6, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'11111000'
	retlw  b'11111100'
	retlw  b'00001100'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'11111000'
	retlw  b'11111100'
	retlw  b'00001100'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001100'
	retlw  b'11111100'
	retlw  b'11111000'

_FONT_7_1  ;// return font of 7, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'11111110'
	retlw  b'11111110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001100'
	retlw  b'00001100'
	retlw  b'00011000'
	retlw  b'00011000'
	retlw  b'00011000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'00110000'
	retlw  b'01100000'
	retlw  b'01100000'
	retlw  b'01100000'
	retlw  b'01100000'

_FONT_8_1  ;// return font of 8, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'11111000'
	retlw  b'11111100'
	retlw  b'00001110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001100'
	retlw  b'11111000'
	retlw  b'11111100'
	retlw  b'00001110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001110'
	retlw  b'11111100'
	retlw  b'11111000'

_FONT_9_1  ;// return font of 9, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'11111000'
	retlw  b'11111100'
	retlw  b'00001100'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001110'
	retlw  b'11111110'
	retlw  b'11110110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00000110'
	retlw  b'00001100'
	retlw  b'11111100'
	retlw  b'11111000'

_FONT___1  ;// return font of _, part 1
	movlw  2
	movwf  PCLATH
	movlw  0x0F
	andwf  scany, W
	addwf  PCL, f
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'
	retlw  b'00000000'

org		0x300
_FONT_COLON	;// return font of colon
	movlw	3
	movwf	PCLATH
	movlw	0x0F
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000110'
	retlw	b'00000110'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000110'
	retlw	b'00000110'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'

_FONT_APOSTROPHE	;// return font of apostrophe
	movlw	3
	movwf	PCLATH
	movlw	0x0F
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00000110'
	retlw	b'00000110'
	retlw	b'00000010'
	retlw	b'00000100'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'
	retlw	b'00000000'


;// ======================================

_FONT_DIGIT_SMALL  ;// return font of a digit (W), small
	movwf  arg0
	movlw  3
	movwf  PCLATH
	movlw  0x0F
	andwf  arg0, W
	addwf  PCL, f
	goto  _FONT_0_S
	goto  _FONT_1_S
	goto  _FONT_2_S
	goto  _FONT_3_S
	goto  _FONT_4_S
	goto  _FONT_5_S
	goto  _FONT_6_S
	goto  _FONT_7_S
	goto  _FONT_8_S
	goto  _FONT_9_S
	retlw	0
	retlw	0
	retlw	0
	retlw	0
	retlw	0
	retlw	0

_FONT_0_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00001111'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001111'

_FONT_1_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'

_FONT_2_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00001111'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00001111'
	retlw	b'00001000'
	retlw	b'00001000'
	retlw	b'00001000'
	retlw	b'00001111'

_FONT_3_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00001111'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00001111'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00001111'

_FONT_4_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001111'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'

_FONT_5_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00001111'
	retlw	b'00001000'
	retlw	b'00001000'
	retlw	b'00001111'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00001111'

_FONT_6_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00001000'
	retlw	b'00001000'
	retlw	b'00001000'
	retlw	b'00001111'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001111'

_FONT_7_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00001111'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'

_FONT_8_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00001111'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001111'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001111'

_FONT_9_S
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	scany, W
	addwf	PCL, f
	retlw	b'00001111'
	retlw	b'00001001'
	retlw	b'00001001'
	retlw	b'00001111'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'
	retlw	b'00000001'


_FONT_SQTR  ;// return quarter-of-second pendulum font
	movlw  3
	movwf  PCLATH
	movlw  0x07
	andwf  scany, W
	addwf  PCL, f
	retlw	b'00000000'
	retlw	b'01110000'
	retlw	b'01110000'
	retlw	b'01110000'
	retlw	b'01110000'
	retlw	b'01110000'
	retlw	b'00000000'
	retlw	b'00000000'
	
_SHIFT_SQTR	;// return number of shifts to show current 1/4s
	movwf	arg0
	movlw	3
	movwf	PCLATH
	movlw	0x07
	andwf	arg0, W
	addwf	PCL, f
	retlw	3
	retlw	4
	retlw	4
	retlw	3
	retlw	1
	retlw	0
	retlw	0
	retlw	1



;//==========================================================================
;//			END
;//==========================================================================

			end
