;=============================================================================
;Pitagorica (Kit99) for WESLA
;Ver-1.00 2003/04/13	
;=============================================================================

	list p=16f873, st=OFF, x=OFF, n=0
	errorlevel -302
	#include <p16f873.inc>

	__CONFIG _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _WRT_ENABLE_ON & _HS_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF

;-----------------------------------------------------------------------------
;Constants

TEST_INPUT	EQU	0	;Port B Pin 0 input indicates download
EEPADDR		EQU	1h	;EEPROM ADDRESS
;-----------------------------------------------------------------------------
;Variables in bank0

		CBLOCK	0x20
		AddressH:	1	;flash program memory address high byte
		AddressL:	1	;flash program memory address low byte
		NumWords:	1	;number of words in line of hex file
		Checksum:	1	;byte to hold checksum of incoming data
		Counter:	1	;to count words being saved or programmed
		TestByte:	1	;byte to show reset vector code received
		HexByte:	1	;byte from 2 incoming ascii characters
		DataPointer:	1	;pointer to data in buffer
		DataArray:	0x10	;buffer for storing incoming data
		TEMP:		1   	;work
		temp:		1		
		LOOPC:		1  	;Loop count 
		DPDT:		1   	;LCD display data
		CNT1:		1   	;Timer counter
		CNT2:		1   
		CNT3:     	1   
		CNT4:     	1   	
		POINT:		1   
		HEXH:		1   	;Result HEX data H
		HEXL:		1   	;Result HEX data L
		DEGIT1:		1   	;Result BCD data
		DEGIT2:		1   	;Result BCD data
		DEGIT3:		1   	;Result BCD data
		DEGIT1d:	1   	;Result Decimal data
		DEGIT2d:	1   	;Result Decimal data
		DEGIT3d:	1   	;Result Decimal data
		P_SWITCH:	1	;PUSH Switch
		SKEW:		1	;SW skew
		sw_tim:		1	;Front SW interval timer
		sw_tim0:	1	;
		temp_99:	1	;Result R99 data
		temp_99T:	1	;Result R99 Timer
		temp_99L:	1	;Result R99 Timer
		TMR1H_DATA:	1	;Timer data
		TMR1L_DATA:	1	;Timer data
		LED_ONOF:	1	;LED ON Counter
		LED_ON:		1	;LED ON Status
		STA_SAVE:	1	;Save for INTERUPT job
		WR_SAVE:	1	;Save for INTERUPT job
		db_data:	1	;ADC result
		Beep_c1:	1	;Beep loop count
		Beep_c2:	1	;Beep loop count
		ENDC

;-----------------------------------------------------------------------------
;Macros to select the register bank
;Many bank changes can be optimised when only one STATUS bit changes

Bank0		MACRO			;macro to select data RAM bank 0
		bcf	STATUS,RP0
		bcf	STATUS,RP1
		ENDM

Bank1		MACRO			;macro to select data RAM bank 1
		bsf	STATUS,RP0
		bcf	STATUS,RP1
		ENDM

Bank2		MACRO			;macro to select data RAM bank 2
		bcf	STATUS,RP0
		bsf	STATUS,RP1
		ENDM

Bank3		MACRO			;macro to select data RAM bank 3
		bsf	STATUS,RP0
		bsf	STATUS,RP1
		ENDM
;******************************************************************************

;********************************
;  Jumping Vector
;********************************
        ORG     0
        goto    MAIN

        ORG     4
	goto	INTRPT


        ORG     08H
;************************************
INTRPT
	;**** save each register  *******
	MOVWF	WR_SAVE		;save wreg
	SWAPF	STATUS,W	;save status
	MOVWF	STA_SAVE

	MOVF	PIR1,W		;read flag
	MOVLW	0H 		;reset PIR1
	MOVWF	PIR1		;

;***********************************************
;	MOVF	RCREG,W		;get received data
;	MOVWF	TEMP		;save in buffer
;	call	TX232
	decfsz	LED_ONOF,F	;Timer for LED Display
	goto	intz
	clrf	LED_ON

intz	;**** register restore and return ****
	SWAPF	STA_SAVE,W	;get status
	MOVWF	STATUS
	SWAPF	WR_SAVE,F	;get wreg
	SWAPF	WR_SAVE,W	
	RETFIE
;******* INIT and Setting ***********************
MAIN

	Bank1		;Set Bank 1
	;*******INIT PORT A,B & C****************
	MOVLW	B'00001101'	;set port
	MOVWF	TRISA		;PORTA
	MOVLW	B'00000000' 	;set port
	MOVWF	TRISB		;PORTB
	MOVLW	B'00000000' 	;set port
	MOVWF	TRISC		;PORTC
	MOVLW	B'00000111' 	
	MOVWF	ADCON1		;AD Converter off 
	;*******Baud rate setting is below *****
	MOVLW	B'00000000'	;Set Async mode 
	MOVWF	TXSTA		;Set TX mode
	MOVLW	D'32'	 	;20MHz  9600bps	
	MOVWF	SPBRG		;Set BRG
	Bank0		;Set Bank 0
	MOVLW	090H		;Set Async mode 
	MOVLW	00H		;Set disable 
	MOVWF	RCSTA		;Set RX mode
	;******* AD CONVERTER*********************
	MOVLW	B'01000100' 	
	MOVWF	ADCON0		;AD Converter off
	;******* Timer 1 setting *********************
	MOVLW	B'00110001' 	
	MOVWF	T1CON		;Timer 1
	MOVLW	00H	
	MOVWF	TMR1L		;Timer L value
	MOVLW	00H
	MOVWF	TMR1H		;Timer H value
	;*******SET INTERUPT********************
	Bank1
	MOVLW	B'11000000'	;  
	MOVWF	INTCON		;Set INTCON
	MOVLW	B'00100001' 	;	
	MOVWF	PIE1		;Set PIE1
	Bank0
;	call	TEXT		;RS232C Ready
	;****** Restore EEPROM DATA ***********
	call	EEPROM_R	;Restere timer data
	movf	sw_tim,w	;Check limit	
	sublw	d'150'		
	BTFSC	STATUS,C	;no switch input?
	GOTO	start0		;ok
	MOVLW	d'99'		;Set New value 30
	MOVWF	sw_tim		;
	call	EEPROM_W	;save DATA
	;****** Find Timer1 data****
start0	movf	sw_tim,W	;original data	
	call	TMR1H_TABLE
	movwf	TMR1H_DATA
	movf	sw_tim,W	;original data	
	call	TMR1L_TABLE
	movwf	TMR1L_DATA
	call	led_set		;LED ON
	;***** INIT Others***********
	CLRF	SKEW
	INCF	SKEW,F
;---------Beep test-------------------------
test0	bsf	PORTC,2		;1.4KHz
	call	TIME100		;
	bcf	PORTC,2	
	call	TIME100		;
;	goto 	test0
	call	Beepj
	bsf	PORTC,2		;Buzzer
	nop
	bcf	PORTA,5		;Blue LED
	MOVLW	D'2'		
	MOVWF	temp		
bt_LP1
	call	TIME5M		;
	DECFSZ	temp,F
	goto	bt_LP1
	bcf	PORTA,5		;Blue LED
	nop
	bcf	PORTC,2		;Buzzer
;***** MAIN LOOP *****
MAINLP
	call	LED_XYout
;	call	GET_DB
;	call	LED_DBout
	goto	SENSE
	goto	MAINLP
;---------Beep job-------------------
Beepj	movlw	02H
	movwf	Beep_c2
Beepj0
	movlw	D'205'
	movwf	Beep_c1
Beepj1	bsf	PORTC,2		;1.4KHz
	call	TIME100		;
	bcf	PORTC,2	
	call	TIME100		;
	incfsz	Beep_c1,F	;
	goto 	Beepj1		;Loop 256 times
	decfsz	Beep_c2,F	;
	goto 	Beepj0		;Loop c2 times
	return
;************************************
; A/D subroutine with data in db_data
;*****  Start A/D channel *****
GET_DB
	BSF	ADCON0,GO	;start A/D
WAITdb	nop
	nop
;	BTFSC	ADCON0,GO
;	GOTO	WAITdb
;	call	TIME1M
	MOVF	ADRESH,W	;get A/D data
	MOVWF	db_data		;save
	return
;**** switch sense *****
SENSE
	COMF	PORTA,W		;switch input
	ANDLW	b'00001100'	;mask	
	MOVWF	P_SWITCH	;save
	BTFSS	STATUS,Z	;no switch input?
	GOTO	P_SWITCHIN	;to P_SWITCH process
	CLRF	SKEW		;allow next P_SWITCH
	INCF	SKEW,F
	GOTO	MAINLP
;***** chattering check *****
P_SWITCHIN
	DECFSZ	SKEW,F		;skew check
	GOTO	SKIP		;not sense
	CALL	TIME5M		;5msec skew
	COMF	PORTA,W		;re-input switch
	ANDLW	b'00001100'	;mask	
	SUBWF	P_SWITCH,W	;compare data
	BTFSS	STATUS,Z	;same?
	GOTO	MAINLP		;not same noise
	MOVLW	05H
	MOVWF	SKEW		;P_SWITCH interval skew
;**** separate to each switch  *****  
	MOVF	P_SWITCH,W		;reget switch data
	BTFSC	P_SWITCH,3		;Check UP ?
	GOTO	tim_up	;Yes		
	BTFSC	P_SWITCH,2		;Check DOWN ?
	GOTO	tim_dn	;Yes
	GOTO	MAINLP		;error
;-------Wait untill sw Off---------------------------------
tim_up	call	tim_up01
	COMF	PORTA,W		;switch input
	ANDLW	b'00001100'	;mask	
	MOVWF	P_SWITCH	;save
	BTFSC	P_SWITCH,3	;Check UP?
	goto	tim_up
	;---SW off------------------------
tim_up1	clrf	temp_99T
tim_up2	call	tim_up01
	DECFSZ	temp_99T,F	;skew check
	GOTO	tim_up2		;Loop
;----------------------------------------
	movf	temp_99,w	;Save Result DATA
	movwf	sw_tim		;Result
	clrf	temp_99T
	decf	temp_99T,F	;Set 0FFh
tim_up3	call	tim_up01
im_up4	movf	temp_99T,w	;Save Result DATA
	ANDLW	b'11110000'	;mask	
	BTFSS	STATUS,Z	;same?
	goto	tim_up6		;
	call	Beepj		;Buzzer ON/OFF
	movf	temp_99T,w	;Save Result DATA
	call	CONV_stop
	movwf	temp_99L	;Loop Result
tim_up5	call	LED_XYout
	DECFSZ	temp_99L,F	;skew check
	GOTO	tim_up5		;Loop
tim_up6	DECFSZ	temp_99T,F	;skew check
	GOTO	tim_up3		;Loop
	GOTO	MAINLP		;Return main loop
;---------------count up--------------------------
tim_up01
	call	LED_XYout
	incf	sw_tim,f
	movf	sw_tim,w	;Check limit	
	movwf	temp_99		;Save Result DATA
	sublw	d'99'		
	BTFSC	STATUS,C	;no switch input?
	return			;Return main loop
	MOVLW	d'0'		;Set New value 0
	MOVWF	sw_tim		;
	movwf	temp_99		;Save Result datadata
	call	LED_XYout
	return			;Return main loop
;---------------------------------------------------
tim_dn
	COMF	PORTA,W		;switch input
	ANDLW	b'00001100'	;mask	
	MOVWF	P_SWITCH	;save
	BTFSS	P_SWITCH,2	;Check DOWN ?
	GOTO	MAINLP		;Return main loop
	call	LED_XYR
	GOTO	tim_dn		;Yes

	;***** skip P_SWITCH process ***
SKIP
	CALL	TIME5M		;5msec x 48=0.2sec
	GOTO	MAINLP
	;***** LED ON process ***
led_go
	call	led_set		;LED ON
	GOTO	MAINLP
led_set

        swapf	TMR1H_DATA,W	;take Upper 4bit
	andlw	b'00001111'
	iorlw	b'00000011'
;	MOVLW	d'10'		;Set New value 10
	MOVWF	LED_ONOF	;
	bsf	LED_ON,1	;Display ON	
;	call	LED_XYout
	return
;***** Save and Restore for EEPROM ********************
EEPROM_R
	Bank2
	MOVLW	EEPADDR 	;Write address
	MOVWF 	EEADR 		;to read from
	Bank3
	BCF 	EECON1, EEPGD 	;Point to Data memory	
	BSF 	EECON1, RD 	;Start read operation
	Bank2
	MOVF 	EEDATA, W 	;W = EEDATA
	MOVWF	sw_tim		;
	Bank0
	return

EEPROM_W
	Bank3
	BTFSC 	EECON1, WR 	;Wait for
	GOTO 	$-1 		;write to finish
	Bank2
	MOVLW 	EEPADDR 	;Address to
	MOVWF	EEADR 		;write to
	MOVF 	sw_tim, W 	;Data to
	MOVWF 	EEDATA 		;write
	Bank3
	BCF 	EECON1, EEPGD 	;Point to Data memory
	BSF 	EECON1, WREN 	;Enable writes;Only disable interrupts
	BCF 	INTCON, GIE 	;if already enabled,;otherwise discard
	MOVLW	0x55		;Write 55h to
	MOVWF 	EECON2 		;EECON2
	MOVLW 	0xAA 		;Write AAh to
	MOVWF 	EECON2 		;EECON2
	BSF 	EECON1, WR 	;Start write operation;Only enable interrupts
	BSF 	INTCON, GIE 	;if using interrupts,;otherwise discard
	BCF 	EECON1, WREN 	;Disable writes
	Bank0
	return

;****** LED XY Matrix DATA out ***********************

E_beep	set	4
LED_XYR
	movf	sw_tim,w	;
	call	R99_TABLE	;find DATA
	call	CONV_DIG
	goto	LED_out
LED_XYout
;	btfss	LED_ON,1		;Check Display ON	
;	return
	MOVF	sw_tim,w
	call	CONV_BCD
LED_out	movf	DEGIT3d,W
	movwf	PORTB
	bsf	PORTC,5 ;3rd DEGIT ON
	call	TIME100
	bcf	PORTC,5	;Reset
	movf	DEGIT2d,W
	movwf	PORTB
	bsf	PORTC,4	;2nd DEGIT ON
	call	TIME100
	bcf	PORTC,4	;Reset
	movf	DEGIT1d,W
	movwf	PORTB
	bsf	PORTC,3	;1st DEGIT ON
	call	TIME100
	bcf	PORTC,3	;Reset
;	;****** Find Timer1 data****
;	movf	sw_tim,W	;original data	
;	call	TMR1H_TABLE
;	movwf	TMR1H_DATA
;	movf	sw_tim,W	;original data	
;	call	TMR1L_TABLE
;	movwf	TMR1L_DATA
	return
;****** LED DB DATA out ***********************
LED_DBout
	btfsc	LED_ON,1		;Check Display ON	
	return
	MOVF	db_data,w
	call	CONV_BCD
	call    LED_out
	return

;***** text data table MACRO**************************
tableM	macro
	local	ShowData
	movwf	temp
	movlw	HIGH ShowData
	movwf	PCLATH
	movlw	low ShowData
	addwf	temp,W
	btfsc	STATUS,C
	incf	PCLATH,F
	movwf	PCL
ShowData
	endm
;************ text send process  *****
TEXT
	CLRF	POINT		;reset table pointer
LPTEX
	MOVF	POINT,W		;get pointer offset
	ANDLW	01FH		;limit upper
	call	TABLE		;get text data
	ADDLW	0		;test zero?
	BTFSC	STATUS,Z	;end zero?
	return
	call	TX232		;send
	INCF	POINT,F		;pointer+1
	goto	LPTEX		
;***** text data table *****
TABLE
	tableM
	DT	"PIC RS232C ready",0DH,0AH,0,0,0,0,0,0
;***************************************
CONV_stop
	ANDLW	0FH	;0000XXXX
	tableM	
	dt	 D'1'   	;0
	dt	 D'250'		;1
	dt	 D'200'   	;2
	dt	 D'150'		;3
	dt	 D'125'   	;4
	dt	 D'100'		;5
	dt	 D'90'   	;6
	dt	 D'80'		;7
	dt	 D'70'   	;8
	dt	 D'60'		;9

	dt	 D'50'   	;10
	dt	 D'41'		;11
	dt	 D'32'   	;12
	dt	 D'23'		;13
	dt	 D'14'   	;14
	dt	 D'05'		;15
	dt	 D'04'   	;16
	dt	 D'03'		;17
	dt	 D'02'   	;18
	dt	 D'01'		;19
	;---------------------------------------
;*******Convert BIN data to DIG*****
CONV_DIG
	clrf	DEGIT1	;Clear to 0
	clrf	DEGIT2	;Clear to 0
	clrf	DEGIT3	;Clear to 0
	MOVWF	sw_tim0	
V_DIG0	MOVLW	d'100'	;100
	SUBWF	sw_tim0,w 
	btfss	STATUS,C
	goto	V_DIG1
	incf	DEGIT3,F
	MOVWF	sw_tim0	
	goto	V_DIG0
V_DIG1	MOVLW	d'10'	;10
	SUBWF	sw_tim0,w 
	btfss	STATUS,C
	goto	V_DIG2
	incf	DEGIT2,F
	MOVWF	sw_tim0	
	goto	V_DIG1
V_DIG2	MOVF	sw_tim0,W
	MOVWF	DEGIT1
	call	CONV_DIG00
	return
CONV_DIG00
	movf	DEGIT3,W
	btfss	STATUS,Z
	call	CONV_BCD0
	movwf	DEGIT3d
	movf	DEGIT2,W
	btfss	STATUS,Z
	call	CONV_BCD0
	movwf	DEGIT2d
	movf	DEGIT1,W
	call	CONV_BCD0
	movwf	DEGIT1d
	return
;*******Convert BIN data to BCD*****
CONV_BCD
	clrf	DEGIT1	;Clear to 0
	clrf	DEGIT2	;Clear to 0
	clrf	DEGIT3	;Clear to 0
	MOVWF	sw_tim0	
V_BCD0	MOVLW	d'100'	;100
	SUBWF	sw_tim0,w 
	btfss	STATUS,C
	goto	V_BCD1
	incf	DEGIT3,F
	MOVWF	sw_tim0	
	goto	V_BCD0
V_BCD1	MOVLW	d'10'	;10
	SUBWF	sw_tim0,w 
	btfss	STATUS,C
	goto	V_BCD2
	incf	DEGIT2,F
	MOVWF	sw_tim0	
	goto	V_BCD1
V_BCD2	MOVF	sw_tim0,W
	MOVWF	DEGIT1
	call	CONV_BCD00
	return
CONV_BCD00
	movf	DEGIT2,W
	call	CONV_BCD0
	movwf	DEGIT3d
	movlw	80H
;	call	CONV_BCD0
	movwf	DEGIT2d
	movf	DEGIT1,W
	call	CONV_BCD0
	movwf	DEGIT1d
	return
CONV_BCD0
	ANDLW	0FH	;0000XXXX
	tableM	
;***** LED 7 Segment FONT *************
		 ;GFEDCBA		
f7seg
;f7seg0	DT	b'00000000'	;Space
	DT	b'01111110'	;0
	DT	b'00001100'	;1
	DT	b'10110110'	;2
	DT	b'10011110'	;3
	DT	b'11001100'	;4
	DT	b'11011010'	;5
	DT	b'11111010'	;6
	DT	b'00001110'	;7
	DT	b'11111110'	;8
	DT	b'11001110'	;9
	DT	b'11101110'	;A
	DT	b'11111000'	;b
	DT	b'01110010'	;C
	DT	b'10111100'	;d
	DT	b'11110010'	;E
	DT	b'11100010'	;F
;*******Convert HEX data to ASCII*****
CONV_HEX
	MOVWF	HEXH	;Save W 
	call	CONV_HEX0
	MOVWF	HEXL	;Save ascii code L
	SWAPF	HEXH,W	;EQU Shift Right 4times
	call	CONV_HEX0
	MOVWF	HEXH	;Save ascii code H
	return
CONV_HEX0
	ANDLW	0FH	;0000XXXX
	tableM	
	DT	"0123456789ABCDEF"
;***************************************
	;Data for Tempo Generator  
R99_TABLE
	tableM	
	dt	 D'0'   	;0
	dt	 D'0'		;1
	dt	 D'0'   	;2
	dt	 D'0'		;3
	dt	 D'0'   	;4
	dt	 D'0'		;5
	dt	 D'0'   	;6
	dt	 D'0'		;7
	dt	 D'0'   	;8
	dt	 D'0'		;9

	dt	 D'00'   	;10
	dt	 D'01'		;11
	dt	 D'02'   	;12
	dt	 D'03'		;13
	dt	 D'04'   	;14
	dt	 D'05'		;15
	dt	 D'06'   	;16
	dt	 D'07'		;17
	dt	 D'08'   	;18
	dt	 D'09'		;19

	dt	 D'00'   	;20
	dt	 D'02'		;21
	dt	 D'04'   	;22
	dt	 D'06'		;23
	dt	 D'08'   	;24
	dt	 D'10'		;25
	dt	 D'12'   	;26
	dt	 D'14'		;27
	dt	 D'16'   	;28
	dt	 D'18'		;29

	dt	 D'00'   	;30
	dt	 D'03'		;31
	dt	 D'06'   	;32
	dt	 D'09'		;33
	dt	 D'12'   	;34
	dt	 D'15'		;35
	dt	 D'18'   	;36
	dt	 D'21'		;37
	dt	 D'24'   	;38
	dt	 D'27'		;39

	dt	 D'00'   	;40
	dt	 D'04'		;41
	dt	 D'08'   	;42
	dt	 D'12'		;43
	dt	 D'16'   	;44
	dt	 D'20'		;45
	dt	 D'24'   	;46
	dt	 D'28'		;47
	dt	 D'32'   	;48
	dt	 D'36'		;49

	dt	 D'00'   	;50
	dt	 D'05'		;51
	dt	 D'10'   	;52
	dt	 D'15'		;53
	dt	 D'20'   	;54
	dt	 D'25'		;55
	dt	 D'30'   	;56
	dt	 D'35'		;57
	dt	 D'40'   	;58
	dt	 D'45'		;59

	dt	 D'00'   	;60
	dt	 D'06'		;61
	dt	 D'12'   	;62
	dt	 D'18'		;63
	dt	 D'24'   	;64
	dt	 D'30'		;65
	dt	 D'36'   	;66
	dt	 D'42'		;67
	dt	 D'48'   	;68
	dt	 D'54'		;69

	dt	 D'00'   	;70
	dt	 D'07'		;71
	dt	 D'14'   	;72
	dt	 D'21'		;73
	dt	 D'28'   	;74
	dt	 D'35'		;75
	dt	 D'42'   	;76
	dt	 D'49'		;77
	dt	 D'56'   	;78
	dt	 D'63'		;79

	dt	 D'00'   	;80
	dt	 D'08'		;81
	dt	 D'16'   	;82
	dt	 D'24'		;83
	dt	 D'32'   	;84
	dt	 D'40'		;85
	dt	 D'48'   	;86
	dt	 D'56'		;87
	dt	 D'64'   	;88
	dt	 D'72'		;89

	dt	 D'00'   	;90
	dt	 D'09'		;91
	dt	 D'18'   	;92
	dt	 D'27'		;93
	dt	 D'36'   	;94
	dt	 D'45'		;95
	dt	 D'54'   	;96
	dt	 D'63'		;97
	dt	 D'72'   	;98
	dt	 D'81'		;99
;***************************************

;**********************************
; Transmit subroutine
; Data is setted in buffer.
;**********************************
TX232
	MOVWF	TEMP		;data save
	BSF	STATUS,RP0	;switch to Bank1
LPTX
	BTFSS	TXSTA,TRMT	;ready check
	goto	LPTX
	BCF	STATUS,RP0	;return to Bank0
	MOVF	TEMP,W		;get data
	MOVWF	TXREG		;start send
	return


;*********************************
;  Timer Routine(12.8MHz)
;	TIME10  :10usec
;	TIME100 :100usec
;	TIME1M  :1msec
;	TIME5M  :5msec
;*********************************

TIME100				;100usec
	MOVLW	D'18'		
	MOVWF	CNT1		
T_LP1	call	TIME10		;2+(26+3)*9-1=262		
	DECFSZ	CNT1,F
	goto	T_LP1
	return			;264*0.4=106usec(about)

TIME10				;10usec
	MOVLW	D'14' 		
	MOVWF	CNT2		
T_LP2	DECFSZ	CNT2,F		;2+3*7-1=22		
	goto	T_LP2		
	return			;22+2=24

TIME1M				;1msec(about)
	MOVLW	0AH
	MOVWF	CNT3
T_LP3	call	TIME100		;2+(266+3)*10-1=2691
	DECFSZ	CNT3,F
	goto	T_LP3
	return			;2692

TIME5M				;5msec(about)
	MOVLW	38H
	MOVWF	CNT4
T_LP4	call	TIME100		;2+(266+3)*56-1=15064
	DECFSZ	CNT4,F
	goto	T_LP4
	return			;15066
;******************************************************
;***************************************
	;Data for Tempo Generator  
TMR1H_TABLE
	tableM	
	dt	 0h		;0
	dt	 0h		;1
	dt	 0h		;2
	dt	 0h		;3
	dt	 0h		;4
	dt	 0h		;5
	dt	 0h		;6
	dt	 0h		;7
	dt	 0h		;8
	dt	 0h		;9

	dt	 0h		;10
	dt	 0h		;11
	dt	 0h		;12
	dt	 0h		;13
	dt	 0h		;14
	dt	 0h		;15
	dt	 0h		;16
	dt	 0h		;17
	dt	 0h		;18
	dt	 0h		;19

	dt	 0h		;20
	dt	 0h		;21
	dt	 0h		;22
	dt	 0h		;23
	dt	 0h		;24
	dt	 0h		;25
	dt	 0h		;26
	dt	 0h		;27
	dt	 0h		;28
	dt	 0h		;29

	dt	 000h	;    0	;30
	dt	 008h	; 2114	;31
	dt	 010h	; 4096	;32
	dt	 017h	; 5958	;33
	dt	 01Eh	; 7710	;34
	dt	 024h	; 9362	;35
	dt	 02Ah	;10923	;36
	dt	 030h	;12399	;37
	dt	 035h	;13797	;38
	dt	 03Bh	;15124	;39
                     
	dt	 040h	;16384	;40
	dt	 044h	;17583	;41
	dt	 049h	;18725	;42
	dt	 04Dh	;19813	;43
	dt	 051h	;20852	;44
	dt	 055h	;21845	;45
	dt	 059h	;22795	;46
	dt	 05Ch	;23705	;47
	dt	 060h	;24576	;48
	dt	 063h	;25412	;49
                     
	dt	 066h	;26214	;50
	dt	 069h	;26985	;51
	dt	 06Ch	;27727	;52
	dt	 06Fh	;28440	;53
	dt	 071h	;29127	;54
	dt	 074h	;29789	;55
	dt	 076h	;30427	;56
	dt	 079h	;31043	;57
	dt	 07Bh	;31638	;58
	dt	 07Dh	;32213	;59
                     
	dt	 080h	;32768	;60
	dt	 082h	;33305	;61
	dt	 084h	;33825	;62
	dt	 086h	;34328	;63
	dt	 088h	;34816	;64
	dt	 089h	;35289	;65
	dt	 08Bh	;35747	;66
	dt	 08Dh	;36192	;67
	dt	 08Fh	;36623	;68
	dt	 090h	;37042	;69
                     
	dt	 092h	;37449	;70
	dt	 093h	;37845	;71
	dt	 095h	;38229	;72
	dt	 096h	;38603	;73
	dt	 098h	;38967	;74
	dt	 099h	;39322	;75
	dt	 09Ah	;39667	;76
	dt	 09Ch	;40002	;77
	dt	 09Dh	;40330	;78
	dt	 09Eh	;40649	;79
                     
	dt	 0A0h	;40960	;80
	dt	 0A1h	;41263	;81
	dt	 0A2h	;41559	;82
	dt	 0A3h	;41848	;83
	dt	 0A4h	;42130	;84
	dt	 0A5h	;42406	;85
	dt	 0A6h	;42675	;86
	dt	 0A7h	;42937	;87
	dt	 0A8h	;43194	;88
	dt	 0A9h	;43445	;89
                     
	dt	 0AAh	;43691	;90
	dt	 0ABh	;43931	;91
	dt	 0ACh	;44166	;92
	dt	 0ADh	;44395	;93
	dt	 0AEh	;44620	;94
	dt	 0AFh	;44840	;95
	dt	 0B0h	;45056	;96
	dt	 0B0h	;45267	;97
	dt	 0B1h	;45474	;98
	dt	 0B2h	;45677	;99
                     
	dt	 0B3h	;45875	;100
	dt	 0B3h	;46070	;101
	dt	 0B4h	;46261	;102
	dt	 0B5h	;46448	;103
	dt	 0B6h	;46631	;104
	dt	 0B6h	;46811	;105
	dt	 0B7h	;46988	;106
	dt	 0B8h	;47161	;107
	dt	 0B8h	;47332	;108
	dt	 0B9h	;47499	;109
                     
	dt	 0BAh	;47663	;110
	dt	 0BAh	;47824	;111
	dt	 0BBh	;47982	;112
	dt	 0BCh	;48137	;113
	dt	 0BCh	;48290	;114
	dt	 0BDh	;48440	;115
	dt	 0BDh	;48587	;116
	dt	 0BEh	;48732	;117
	dt	 0BEh	;48874	;118
	dt	 0BFh	;49014	;119
                     
	dt	 0C0h	;49152	;120
	dt	 0C0h	;49287	;121
	dt	 0C1h	;49421	;122
	dt	 0C1h	;49552	;123
	dt	 0C2h	;49681	;124
	dt	 0C2h	;49807	;125
	dt	 0C3h	;49932	;126
	dt	 0C3h	;50055	;127
	dt	 0C4h	;50176	;128
	dt	 0C4h	;50295	;129
                     
	dt	 0C4h	;50412	;130
	dt	 0C5h	;50528	;131
	dt	 0C5h	;50641	;132
	dt	 0C6h	;50753	;133
	dt	 0C6h	;50864	;134
	dt	 0C7h	;50972	;135
	dt	 0C7h	;51080	;136
	dt	 0C7h	;51185	;137
	dt	 0C8h	;51289	;138
	dt	 0C8h	;51392	;139
                     
	dt	 0C9h	;51493	;140
	dt	 0C9h	;51592	;141
	dt	 0C9h	;51690	;142
	dt	 0CAh	;51787	;143
	dt	 0CAh	;51883	;144
	dt	 0CBh	;51977	;145
	dt	 0CBh	;52070	;146
	dt	 0CFh	;53013	;147
	dt	 0CCh	;52252	;148
	dt	 0CCh	;52341	;149
                     
	dt	 0CCh	;52429	;150
	dt	 0CDh	;52516	;151
	dt	 0CDh	;52601	;152
	dt	 0CDh	;52686	;153
	dt	 0CEh	;52769	;154
	dt	 0CEh	;52852	;155
	dt	 0CEh	;52933	;156
	dt	 0CFh	;53013	;157
	dt	 0CFh	;53092	;158
	dt	 0CFh	;53171	;159

TMR1L_TABLE
	tableM	
	dt	 0h		;0
	dt	 0h		;1
	dt	 0h		;2
	dt	 0h		;3
	dt	 0h		;4
	dt	 0h		;5
	dt	 0h		;6
	dt	 0h		;7
	dt	 0h		;8
	dt	 0h		;9

	dt	 0h		;10
	dt	 0h		;11
	dt	 0h		;12
	dt	 0h		;13
	dt	 0h		;14
	dt	 0h		;15
	dt	 0h		;16
	dt	 0h		;17
	dt	 0h		;18
	dt	 0h		;19

	dt	 0h		;20
	dt	 0h		;21
	dt	 0h		;22
	dt	 0h		;23
	dt	 0h		;24
	dt	 0h		;25
	dt	 0h		;26
	dt	 0h		;27
	dt	 0h		;28
	dt	 0h		;29

	dt	000h	;    0	;30
	dt	042h	; 2114	;31
	dt	000h	; 4096	;32
	dt	046h	; 5958	;33
	dt	01Eh	; 7710	;34
	dt	092h	; 9362	;35
	dt	0ABh	;10923	;36
	dt	06Fh	;12399	;37
	dt	0E5h	;13797	;38
	dt	014h	;15124	;39
                
	dt	000h	;16384	;40
	dt	0AFh	;17583	;41
	dt	025h	;18725	;42
	dt	065h	;19813	;43
	dt	074h	;20852	;44
	dt	055h	;21845	;45
	dt	00Bh	;22795	;46
	dt	099h	;23705	;47
	dt	000h	;24576	;48
	dt	044h	;25412	;49
                
	dt	066h	;26214	;50
	dt	069h	;26985	;51
	dt	04Fh	;27727	;52
	dt	018h	;28440	;53
	dt	0C7h	;29127	;54
	dt	05Dh	;29789	;55
	dt	0dbh	;30427	;56
	dt	043h	;31043	;57
	dt	096h	;31638	;58
	dt	0D5h	;32213	;59
                
	dt	000h	;32768	;60
	dt	019h	;33305	;61
	dt	021h	;33825	;62
	dt	018h	;34328	;63
	dt	000h	;34816	;64
	dt	0D9h	;35289	;65
	dt	0A3h	;35747	;66
	dt	060h	;36192	;67
	dt	00Fh	;36623	;68
	dt	0B2h	;37042	;69
                
	dt	049h	;37449	;70
	dt	0D5h	;37845	;71
	dt	055h	;38229	;72
	dt	0CBh	;38603	;73
	dt	037h	;38967	;74
	dt	09Ah	;39322	;75
	dt	0F3h	;39667	;76
	dt	042h	;40002	;77
	dt	08Ah	;40330	;78
	dt	0C9h	;40649	;79
                
	dt	000h	;40960	;80
	dt	02Fh	;41263	;81
	dt	057h	;41559	;82
	dt	078h	;41848	;83
	dt	092h	;42130	;84
	dt	0A6h	;42406	;85
	dt	0B3h	;42675	;86
	dt	0B9h	;42937	;87
	dt	0BAh	;43194	;88
	dt	0B5h	;43445	;89
                
	dt	0ABh	;43691	;90
	dt	09Bh	;43931	;91
	dt	086h	;44166	;92
	dt	06Bh	;44395	;93
	dt	04Ch	;44620	;94
	dt	028h	;44840	;95
	dt	000h	;45056	;96
	dt	0D3h	;45267	;97
	dt	0A2h	;45474	;98
	dt	06Dh	;45677	;99
                
	dt	033h	;45875	;100
	dt	0F6h	;46070	;101
	dt	0B5h	;46261	;102
	dt	070h	;46448	;103
	dt	027h	;46631	;104
	dt	0dbh	;46811	;105
	dt	08Ch	;46988	;106
	dt	039h	;47161	;107
	dt	0E4h	;47332	;108
	dt	08Bh	;47499	;109
                
	dt	02Fh	;47663	;110
	dt	0D0h	;47824	;111
	dt	06Eh	;47982	;112
	dt	009h	;48137	;113
	dt	0A2h	;48290	;114
	dt	038h	;48440	;115
	dt	0CBh	;48587	;116
	dt	05Ch	;48732	;117
	dt	0EAh	;48874	;118
	dt	076h	;49014	;119
                
	dt	000h	;49152	;120
	dt	087h	;49287	;121
	dt	00Dh	;49421	;122
	dt	090h	;49552	;123
	dt	011h	;49681	;124
	dt	08Fh	;49807	;125
	dt	00Ch	;49932	;126
	dt	087h	;50055	;127
	dt	000h	;50176	;128
	dt	077h	;50295	;129
                
	dt	0ECh	;50412	;130
	dt	060h	;50528	;131
	dt	0D1h	;50641	;132
	dt	041h	;50753	;133
	dt	0B0h	;50864	;134
	dt	01Ch	;50972	;135
	dt	088h	;51080	;136
	dt	0F1h	;51185	;137
	dt	059h	;51289	;138
	dt	0C0h	;51392	;139
                
	dt	025h	;51493	;140
	dt	088h	;51592	;141
	dt	0EAh	;51690	;142
	dt	04Bh	;51787	;143
	dt	0ABh	;51883	;144
	dt	009h	;51977	;145
	dt	066h	;52070	;146
	dt	015h	;53013	;147
	dt	01Ch	;52252	;148
	dt	075h	;52341	;149
                
	dt	0CDh	;52429	;150
	dt	024h	;52516	;151
	dt	079h	;52601	;152
	dt	0CEh	;52686	;153
	dt	021h	;52769	;154
	dt	074h	;52852	;155
	dt	0C5h	;52933	;156
	dt	015h	;53013	;157
	dt	064h	;53092	;158
	dt	0B3h	;53171	;159
;**********************************


	END
;******************************************************


