;*****************Part 1*****************
; by: Eng'r Roland Michael A. dela Peña *
;****************************************
	LIST            P=16F84
	ERRORLEVEL      -302
	#INCLUDE P16F84.INC

;************************************************************
; REGISTER DEFINITIONS
;************************************************************
	CBLOCK	0CH
		ACCUM	; SUBSTITUTE REGISTER FOR W (DURING INTERRUPT)
		CNUM	; CALL NUMBER (ONES)
		CNUMT	; CALL NUMBER (TENS)
		CNUMH	; CALL NUMBER (HUNDREDS)
		DSEC	; ONES FOR SECONDS (DURATION)
		SEC	; ONES FOR SECONDS (RTC)
		DSECT	; TENS FOR SECONDS (DURATION)
		SECT	; TENS FOR SECONDS (RTC)
		DMIN	; ONES FOR MINUTES (DURATION)
		MIN	; ONES FOR MINUTES (RTC)
		DMINT	; TENS FOR MINUTES (DURATION)
		MINT	; TENS FOR MINUTES (RTC)
		DHOUR	; ONES FOR HOURS (DURATION)
		HOUR	; ONES FOR HOURS (RTC)
		DHOURT	; TENS FOR HOURS (DURATION)
		HOURT	; TENS FOR HOURS (RTC)
		DAY	; ONES FOR DAYS (RTC)
		DAYT	; TENS FOR DAYS (RTC)
		DSEC1	; ONES FOR SECONDS (DISPLAY)
		DSECT1	; TENS FOR SECONDS (DISPLAY)
		DMIN1	; ONES FOR MINUTES (DISPLAY)
		DMINT1	; TENS FOR MINUTES (DISPLAY)
		DHOUR1	; ONES FOR HOURS (DISPLAY)
		DHOURT1	; TENS FOR HOURS (DISPLAY)
		DAY1	; ONES FOR DAYS (DISPLAY)
		DAYT1	; TENS FOR DAYS (DISPLAY)
		TEL1	; 1ST DIALED # BUFFER
		TEL2	; 2ND DIALED # BUFFER
		TEL3	; 3RD DIALED # BUFFER
		TEL4	; 4TH DIALED # BUFFER
		TEL5	; 5TH DIALED # BUFFER
		TEL6	; 6TH DIALED # BUFFER
		TEL7	; 7TH DIALED # BUFFER
		TEL8	; 8TH DIALED # BUFFER
		TEL9	; 9TH DIALED # BUFFER
		TEL10	; 10TH DIALED # BUFFER
		TEL11	; 11TH DIALED # BUFFER
		TELE1	; 1ST DIALED # BUFFER (DISPLAY)
		TELE2	; 2ND DIALED # BUFFER (DISPLAY)
		TELE3	; 3RD DIALED # BUFFER (DISPLAY)
		TELE4	; 4TH DIALED # BUFFER (DISPLAY)
		TELE5	; 5TH DIALED # BUFFER (DISPLAY)
		TELE6	; 6TH DIALED # BUFFER (DISPLAY)
		TELE7	; 7TH DIALED # BUFFER (DISPLAY)
		TELE8	; 8TH DIALED # BUFFER (DISPLAY)
		TELE9	; 9TH DIALED # BUFFER (DISPLAY)
		TELE10	; 10TH DIALED # BUFFER (DISPLAY)
		TELE11	; 11TH DIALED # BUFFER (DISPLAY)
		DISVAR	; VARIABLE REGISTER (DISPLAY)
		CNTVAR	; VARIABLE REGISTER (COUNTER FOR HIGHER ADDRESS)
		LOVAR	; LOWER ADDRESS COUNTER FOR SAVING ADDRESS
		ROLAND	; VARIABLE REGISTER (DTMF)
		MICHAEL	; VARIABLE REGISTER (DTMF)
		POGI	; DTMF INTERRUPT REGISTER
		BOSCO	; CALL NUMBER INTERRUPT REGISTER 
		CMODE	; INDICATOR FOR MODE
		CMODE1	; INDICATOR FOR CLOCK IF NEEDED TO BE DISPLAYED
		CSHIFT1	; INDICATOR FOR SHIFT @ MODE1
		CSHIFT2	; INDICATOR FOR SHIFT @ MODE2
		EEPROM 	; BIT BUFFER
		ADDR	; LOWER ADDRESS COUNTER
		DATAI	; DATA INPUT REGISTER
		DATAO	; DATA OUTPUT REGISTER
		TXBUF	; TRANSMIT BUFFER
		COUNT	; BIT COUNTER
		LOOP	; DELAY LOOP COUNTER
		LOOPS	; DELAY LOOP COUNTER
		LOOPS2	; DELAY LOOP COUNTER
	ENDC
;************************************************************
; BIT DEFINITIONS
;************************************************************
	D1	EQU	0 ; DTMF'S D1
	D2	EQU	1 ; DTMF'S D2
	D4	EQU	2 ; DTMF'S D4
	D8	EQU	3 ; DTMF'S D8
	COMP	EQU	4 ; COMPARATOR BIT
	RING	EQU	4 ; RINGBACK TONE BIT
	BUSY	EQU	5 ; BUSY TONE BIT
	CLK	EQU	2 ; DISPLAY'S CLOCK
	DAT	EQU	3 ; DISPLAY'S DATA
	BSY	EQU	1 ; DISPLAY'S BUSY
	DI	EQU	7 ; EEPROM INPUT BIT
	DO 	EQU	6 ; EEPROM OUTPUT BIT
	SDATA 	EQU	7 ; SERIAL EE DATA LINE 
	SCLK 	EQU	6 ; SERIAL EE CLOCK LINE
;************************************************************************
;THIS PART INITIALIZES THE PORTS AND OTHER PHERIPERALS IN MICROCONTROLLER
;************************************************************************
	ORG 	0000h 		; SET POWER ON RESET VECTOR.
	CLRF	CMODE1
	CLRF	CNTVAR
	CALL CLEAR2		; CLEARS ALL THE UNITS IN DURATION.	
	GOTO INIT
	ORG 	0004h 		; SET INTERRUPT VECTOR.
	GOTO TIME
	ORG	0005h
INIT
	CLRF	ADDR		; RESETTING THE SELECTED REGISTERS.
	CLRF	LOVAR
	CLRF	SEC
	CLRF	SECT
	CLRF	MIN
	CLRF	MINT
	MOVLW	d'2'
	MOVWF	HOUR
	MOVLW	d'1'
	MOVWF	HOURT
	CLRF	DAYT
	MOVLW	d'1'
	MOVWF	DAY
	CLRF	CNUM
	CLRF	CNUMT
	CLRF	CNUMH
	CLRF	POGI

	BSF 	STATUS,RP0	; SET BANK = 1.
        BCF	OPTION_REG,7	; ENABLE BUILT-IN PULL-UP RESISTORS.
	MOVLW	b'00011111'	; SET RA0,RA1,RA2,RA3,RA4 TO INPUT.
	MOVWF	TRISA	
       	MOVLW 	b'00110011'	; SET RB1,RB2,RB5,RB6,RB7 TO OUTPUT
        MOVWF   TRISB           ; AND RB0,RB3,RB4 TO INPUT.	
        BCF 	STATUS,RP0	; SET BANK = 0.

	CALL READ_1		; READ THE DATA TO RESTORE ADDRESS FOR SAVING.
	CALL READ1		; READ THE DATA TO RESTORE PREVIOUS ADDRESSES.
	MOVLW	d'2'
	ADDWF	LOVAR
	MOVLW	d'254'			
	XORWF	LOVAR,0		
	BTFSC	STATUS,2
	CLRF	LOVAR
	CALL SAVE1		; SAVE THE ADDRESS FOR SAVING.
	CALL SAVE		; SAVE THE ADDRESSES FOR RESTORING.
;**************************************************************
; ENABLING THE INTERRUPT AT RB0/INT PIN
;**************************************************************
	BCF	INTCON,1	; SET RB0 INTERRUPT TO DID NOT OCCUR.
	BSF	INTCON,4	; SET RB0/INT AS INTERRUPT.
        BSF	INTCON,GIE	; RB0/INT IS NOW READY FOR INTERRUPT.
;****************************************************************
; THIS IS THE START OF THE PREVIOUS CALL MONITORING PROGRAM
;****************************************************************
START
	CALL CLEAR3		; ERASE THE DATA STORED IN SRAM.
	CLRF	CMODE		; RESET MODE INDICATOR.	
	CLRF	CSHIFT1		; RESET SHIFT @ MODE1 INDICATOR.
	MOVLW	d'1'
	MOVWF	CSHIFT2		; RESET SHIFT @ MODE2 INDICATOR.
	BTFSC	PORTA,COMP	; IS ON-HOOK DETECTED?
	GOTO START
INITCALL
	CALL DTMF1		; IS DTMF DETECTED?
	CALL MODE		; YES, THEN CHECK IF MODE IS TO BE EXECUTED.
;****************************************************************
; THIS PART STORE THE DIALED #S IN SRAM
;****************************************************************
INITCALL1
	CALL CONVERT
	MOVFW	ROLAND
	MOVWF	TEL1		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL2		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL3		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL4		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL5		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL6		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL7		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL8		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL9		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL10		; STORE THE DIALED # IN SRAM.
	CALL INITCALL_1
	MOVWF	TEL11		; STORE THE DIALED # IN SRAM.
	CALL UNPRESS
	CALL DTMF
HOOK1		
	BTFSC	PORTA,COMP	; IS ON-HOOK DETECTED?
	GOTO START		; YES.
	GOTO HOOK1		; NO.
INITCALL_1
	CALL UNPRESS
	CALL DTMF
	CALL CONVERT
	MOVFW	ROLAND
	RETURN
;****************************************************************
; THIS PART CHECKS THE STATUS OF THE CALL
;****************************************************************
RINGING
	BCF	POGI,0
	CALL HOOK		; DETECT IF ON-HOOK DETECTED DURING RINGING.
;	CALL BUSYTONE
;	CALL RINGBACK		; WAIT UNTIL THE RINGBACK TONE STOPS.
	MOVLW	d'13'		; WAIT 5 SEC FOR ANOTHER RINGBACK TONE.
	MOVWF	LOOP
	CALL RINGING2
	CALL WAIT1
	CALL CLEAR2		; CALLED PARTY ANSWERED THEN TIMER STARTS.
	CALL RINGING1
DISPDUR0
	CLRF	CMODE1
	CALL DISPDUR1
	MOVFW	DAYT
	CALL DISP1
	MOVFW	DAY
	CALL DISP1
	MOVFW	DHOURT
	CALL DISP1
	MOVFW	DHOUR
	CALL DISP1
	MOVFW	DMINT
	CALL DISP1
	MOVFW	DMIN
	CALL DISP1
	MOVFW	DSECT
	CALL DISP1
	MOVFW	DSEC
	CALL DISP1	
RINGFIN
	BTFSC	PORTA,COMP	; IS ON-HOOK DETECTED?
	GOTO RINGING3		; YES.
	BTFSC	CMODE1,0
	GOTO DISPDUR0
	CALL LONG		; NO.
	GOTO RINGFIN
RINGING1
	BTFSS	BOSCO,0
	CALL MODE_1
	BCF	BOSCO,0
	INCF	CNUM		; INCREMENT CALL NUMBER.
	MOVLW	d'10'
	XORWF	CNUM,0		
	BTFSS	STATUS,2	
	RETURN			; THE CALL WAS FINISHED.
	CLRF	CNUM
	INCF	CNUMT
	MOVLW	d'10'
	XORWF	CNUMT,0		
	BTFSS	STATUS,2		
	RETURN			; THE CALL WAS FINISHED.
	CLRF	CNUMT
	INCF	CNUMH
	MOVLW	d'10'
	XORWF	CNUMH,0		
	BTFSC	STATUS,2	
	CLRF	CNUMH
	RETURN			; THE CALL WAS FINISHED.
RINGING2
	MOVLW	d'250'
	MOVWF	LOOPS
	CALL WAIT
	DECFSZ	LOOP
	GOTO RINGING2
	RETLW	d'0'		; 5 SECONDS WAS FINISHED.
RINGING3
	CALL STORE		; RECORD THE CALL INFOS IN EEPROM.
	GOTO START
BUSYTONE
	BTFSC	PORTB,BUSY	; IS BUSY TONE DETECTED AFTER 10 RINGS?
	BTFSC	PORTB,RING	; IS RINGBACK TONE DETECTED?
	RETURN
	GOTO BUSYTONE2	
BUSYTONE1
	BTFSS	PORTB,BUSY	; IS BUSY TONE DETECTED AFTER 10 RINGS?
	RETLW	d'0'		; NOPE.
	BTFSC	PORTB,RING	; IS RINGBACK TONE DETECTED?
	GOTO RINGING
BUSYTONE2
	MOVLW	d'255'
	MOVWF	LOOP
	CALL RINGING2
	GOTO HOOK1
RINGBACK
	BTFSC	PORTB,RING	; IS RINGBACK TONE DETECTED?
	GOTO RINGING		; YES.
	BTFSC	POGI,0		; IS RINGBACK TONE DETECTED?
	GOTO RINGING		; YES.
	RETURN
HOOK
	BTFSC	PORTA,COMP	; IS ON-HOOK DETECTED?
	GOTO START		; YES, CLEAR THE DISPLAY.
	RETURN			; NO.
LONG
	MOVLW	d'2'		
	XORWF	DHOURT,0
	BTFSS	STATUS,2	; IS 20 HOURS IS OVER?
	RETLW	d'0'		; NO.
	MOVLW	d'4'		; 20 HOURS WAS OVER.
	XORWF	DHOUR,0
	BTFSS	STATUS,2	; IS 24 HOURS IS OVER?
	RETLW	d'0'
	CALL STORE		
	CALL CLEAR2		; START ANOTHER SET.
	GOTO RINGFIN
;*************************************************************
; DELAY ROUTINE
; THIS ROUTINE TAKES THE VALUE IN ‘LOOPS’
; AND MULTIPLIES IT TIMES 1 MILLISECOND TO
; DETERMINE DELAY TIME
;*************************************************************
WAIT
	MOVLW	d'250'		; TIMING ADJUSTMENT VARIABLE.
	MOVWF	LOOPS2
TOP
	CALL RINGBACK
	CALL HOOK	 			
	DECFSZ 	LOOPS2 		; INNER LOOPS COMPLETE?
	GOTO TOP		; NO, GO AGAIN.
	DECFSZ	LOOPS 		; OUTER LOOPS COMPLETE?
	GOTO WAIT 		; NO, GO AGAIN.
	RETLW 	d'0' 		; YES, RETURN FROM SUB.
WAIT1
	MOVLW	d'250'		; TIMING ADJUSTMENT VARIABLE.
	MOVWF	LOOPS2
TOP1
	CALL BUSYTONE		; SIT AND WAIT.
	CALL HOOK	 			
	DECFSZ 	LOOPS2 		; INNER LOOPS COMPLETE?
	GOTO TOP1		; NO, GO AGAIN.
	DECFSZ	LOOPS 		; OUTER LOOPS COMPLETE?
	GOTO WAIT1 		; NO, GO AGAIN.
	RETLW 	d'0' 		; YES, RETURN FROM SUB.
;**************************************************************
; CLEARING THE SELECTED REGISTER
;**************************************************************
CLEAR2
	MOVLW	d'5'		; ADD 5 SEC TO DURATION BECAUSE OF THE 5 SEC DELAY.
	MOVWF	DSEC
	CLRF	DSECT
	CLRF	DMIN
	CLRF	DMINT
	CLRF	DHOUR
	CLRF	DHOURT
	RETLW	d'0'		; RESET THE DURATION.
CLEAR3
	MOVLW	d'10'		; SET THEM AS BLANK.
	MOVWF	TEL1
	MOVWF	TEL2
	MOVWF	TEL3
	MOVWF	TEL4
	MOVWF	TEL5
	MOVWF	TEL6
	MOVWF	TEL7
	MOVWF	TEL8
	MOVWF	TEL9
	MOVWF	TEL10
	MOVWF	TEL11
	RETLW	d'0'
;****************************************************************
; THIS SUB ROUTINE DISPLAY THE PREVIOUS DIALED #S 
; RECORDED IN EEPROM
;****************************************************************
DISPCALL
	MOVLW	d'15'
	CALL DISP1		; SEND COMMAND FOR DISPLAY CALL.
	MOVFW	CNUMH
	CALL DISP1
	MOVFW	CNUMT
	CALL DISP1
	MOVFW	CNUM
	CALL DISP1
	MOVFW	TELE1
	CALL DISP1
	MOVFW	TELE2
	CALL DISP1
	MOVFW	TELE3
	CALL DISP1
	MOVFW	TELE4
	CALL DISP1
	MOVFW	TELE5
	CALL DISP1
	MOVFW	TELE6
	CALL DISP1
	MOVFW	TELE7
	CALL DISP1
	MOVFW	TELE8
	CALL DISP1
	MOVFW	TELE9
	CALL DISP1
	MOVFW	TELE10
	CALL DISP1
	MOVFW	TELE11
	GOTO DISP1
;****************************************************************
; THIS SUB ROUTINE DISPLAY THE DURATION & DATE OF PREVIOUS CALLS
;****************************************************************
DISPDUR
	CALL DISPDUR1
	MOVFW	DAYT1
	CALL DISP1
	MOVFW	DAY1
	CALL DISP1
	MOVFW	DHOURT1
	CALL DISP1
	MOVFW	DHOUR1
	CALL DISP1
	MOVFW	DMINT1
	CALL DISP1
	MOVFW	DMIN1
	CALL DISP1
	MOVFW	DSECT1
	CALL DISP1
	MOVFW	DSEC1
	GOTO DISP1
DISPDUR1
	MOVLW	d'16'
	CALL DISP1		; SEND COMMAND FOR DISPLAY DUARATION.
	MOVFW	CNUMH
	CALL DISP1
	MOVFW	CNUMT
	CALL DISP1
	MOVFW	CNUM
	GOTO DISP1
;****************************************************************
; THIS ROUTINE DISPLAYS THE CLOCK
;****************************************************************
F3
	CALL DISP1
DISPCLOCK
	CALL CONFIRM1		; CONFIRM IF THE MAX IS 3. 
	MOVFW	DAYT
	CALL DISP1

	CALL CONFIRM2		; CONFIRM IF THE MAX DAY IS 31. 
	MOVFW	DAY
	CALL DISP1

	CALL CONFIRM3		; CONFIRM IF THE MAX IS 2. 
	MOVFW	HOURT
	CALL DISP1

	CALL CONFIRM4		; CONFIRM IF THE MAX HOUR IS 24. 
	MOVFW	HOUR
	CALL DISP1

	CALL CONFIRM5		; CONFIRM IF THE MAX IS 6. 
	MOVFW	MINT
	CALL DISP1

	MOVFW	MIN
	CALL DISP1

	MOVFW	SECT
	CALL DISP1

	MOVFW	SEC
DISP1
	MOVWF	DISVAR
;****************************************************************
; THIS PART INITIATE THE DATA TO BE DISPLAYED ON LCD
;****************************************************************
TRANS	
	BSF	PORTB,CLK	; FOR CLOCK PULSE.
TRANS1
	BTFSS	PORTB,BSY	; CHECK IF NEXT BIT IS READY TO BE SENT.
	GOTO TRANS1
	BCF	PORTB,CLK		
	MOVLW	d'8'
	MOVWF	COUNT		; SET # OF BITS TO 8.
DISPLAY	
	RRF	DISVAR		; ROTATE RIGHT TXBUF THROUGH CARRY OF STATUS FLAG.
	BTFSC	STATUS,0	; IS LEAST SIGNIFICANT BIT OF DISVAR = 0?
	BSF	PORTB,DAT	; NO, SET DATA HIGH.
	BTFSS	STATUS,0	; IS LEAST SIGNIFICANT BIT OF DISVAR = 0?
	BCF	PORTB,DAT	; YES, SET DATA LOW.
	BSF	PORTB,CLK	; FOR CLOCK PULSE.
DISPLAY1
	BTFSC	PORTB,BSY	; CHECK IF NEXT BIT IS READY TO BE SENT.
	GOTO DISPLAY1
	BCF	PORTB,CLK	
	DECFSZ	COUNT		; DECREMENT BIT COUNT.
	GOTO DISPLAY
DISPLAY2
	BTFSC	PORTB,BSY	; CHECK IF NEXT DATA ARE READY TO BE SENT.
	GOTO DISPLAY2
	RETLW 	d'0'

CONFIRM1
	MOVLW	d'3'			
	SUBWF	DAYT,0
	BTFSS	STATUS,1	; IS THE TENS (DAY) EXCEED 3?
	RETLW	d'0'		; NO.
	MOVLW	d'3'		; YES, SET IT ONLY TO MAXIMUM OF 3.
	MOVWF	DAYT
	RETLW	d'0'
CONFIRM2
	XORWF	DAYT,0
	BTFSS	STATUS,2	; IS THE TENS (DAY) EQUAL TO 0?
	GOTO THREE		; NO.
	MOVLW	d'0'		; YES.
	XORWF	DAY,0
	BTFSS	STATUS,2	; IS THE ONES (DAY) EQUAL TO 0?
	RETLW	d'0'		; NO.
	MOVLW	d'1'		; YES, SET IT TO 1 (BECAUSE THERE'S NO 0 DAY).
	MOVWF	DAY
	RETLW	d'0'
THREE
	MOVLW	d'3'		
	XORWF	DAYT,0
	BTFSS	STATUS,2	; IS THE TENS (DAY) EQUAL TO 3?
	RETLW	d'0'		; NO.
	MOVLW	d'1'		; YES.
	SUBWF	DAY,0
	BTFSS	STATUS,1	; IS THE ONES (DAY) EXCEED TO 1? 
	RETLW	d'0'		; NO.
	MOVLW	d'1'		; YES, SET IT TO 1 (BECAUSE THE MAXIMUM DAY
	MOVWF	DAY		; IN A MONTH IS ONLY 31).
	RETLW	d'0'
CONFIRM3
	MOVLW	d'2'
	SUBWF	HOURT,0
	BTFSS	STATUS,1	; IS THE TENS (HOUR) EXCEED TO 2?
	RETLW	d'0'		; NO.
	MOVLW	d'2'		; YES, SET IT TO MAXIMUM OF 2 ONLY.
	MOVWF	HOURT
	RETLW	d'0'
CONFIRM4
	MOVLW	d'2'
	XORWF	HOURT,0
	BTFSS	STATUS,2	; IS THE TENS (HOUR) EQUAL TO 2?
	RETLW	d'0'		; NO.
	MOVLW	d'3'		; YES. 
	SUBWF	HOUR,0		
	BTFSS	STATUS,1	; IS ONES (HOUR) EXCEED TO 3?
	RETLW	d'0'		; NO.
	MOVLW	d'3'
	MOVWF	HOUR		; YES, SET IT TO MAXIMUM OF 3 ONLY.	
	RETLW	d'0'
CONFIRM5
	MOVLW	d'6'
	SUBWF	MINT,0
	BTFSS	STATUS,1	; IS TENS (MIN) EXCEED TO 6?
	RETLW	d'0'		; NO.
	MOVLW	d'5'
	MOVWF	MINT		; YES, SET IT TO 0 (BECAUSE THERE'S ONLY 60
	RETLW	d'0'		; MINUTES IN ONE DAY).
;****************************************************************
; INDICATOR FOR FLASHING THE SELECTED FIGURE
;****************************************************************
FLASH1
	CLRF	CMODE1
	MOVLW	b'11111110'
	CALL F3
FLASH_1
	BTFSC	CMODE1,0
	GOTO FLASH1
	CALL F1
	BTFSC	STATUS,2	
	GOTO FLASH_1
	CALL F2	
	MOVWF	DAYT
	GOTO FLASH1
FLASH2
	CLRF	CMODE1
	MOVLW	b'11111101'
	CALL F3
FLASH_2
	BTFSC	CMODE1,0
	GOTO FLASH2
	CALL F1
	BTFSC	STATUS,2	
	GOTO FLASH_2
	CALL F2	
	MOVWF	DAY
	GOTO FLASH2
FLASH3
	CLRF	CMODE1
	MOVLW	b'11111011'
	CALL F3
FLASH_3
	BTFSC	CMODE1,0
	GOTO FLASH3
	CALL F1
	BTFSC	STATUS,2	
	GOTO FLASH_3
	CALL F2
	MOVWF	HOURT	
	GOTO FLASH3
FLASH4
	CLRF	CMODE1
	MOVLW	b'11110111'
	CALL F3
FLASH_4
	BTFSC	CMODE1,0
	GOTO FLASH4
	CALL F1
	BTFSC	STATUS,2	
	GOTO FLASH_4
	CALL F2	
	MOVWF	HOUR
	GOTO FLASH4
FLASH5
	CLRF	CMODE1
	MOVLW	b'11101111'
	CALL F3
FLASH_5
	BTFSC	CMODE1,0
	GOTO FLASH5
	CALL F1
	BTFSC	STATUS,2	
	GOTO FLASH_5
	CALL F2	
	MOVWF	MINT
	GOTO FLASH5
FLASH6
	CLRF	CMODE1
	MOVLW	b'11011111'
	CALL F3
FLASH_6
	BTFSC	CMODE1,0
	GOTO FLASH6
	CALL F1
	BTFSC	STATUS,2	
	GOTO FLASH_6
	CALL F2	
	MOVWF	MIN
	GOTO FLASH6
F1
	CALL HOOK		; CHECK IF OFF-HOOK WAS DETECTED.
	GOTO DTMF4
F2
	CALL MODE		; DETECT IF MODE IS EXECUTED.
	CALL MODE2		; DETECT IF SHIFT IS EXECUTED.
	CALL CONVERT		; CHANGE THE SELECTED CLOCK FIGURE.
	CALL UNPRESS		
	MOVFW	ROLAND
	RETURN	
;****************************************************************
; THIS DETERMINES IF THE MODE WAS EXECUTED
;****************************************************************
MODE
	MOVLW	d'11'			
	XORWF	ROLAND,0		
	BTFSS	STATUS,2	; IS "*" WAS PRESSED?
	RETLW	d'0'		; NO.
	CALL UNPRESS		; YES.
	COMF	CMODE		; TOGGLE TO SELECT MODE.
;****************************************************************
; THIS ROUTINE SETS THE RTC IF CMODE,7 IS SET
;****************************************************************
CLOCKSET
	BTFSC	CMODE,7		; CHECK IF WHAT MODE IS TO BE EXECUTED.
	GOTO MODE1		; DISPLAY DIALED #S STORED IN EEPROM.
	GOTO BLINK		; DISPLAY CLOCK TO BE SET.
;****************************************************************
; THIS ROUTINE DISPLAY THE DIALED #S STORED IN EEPROM
;**************************************************************
MODE1
	CALL MODE_1
	CALL DISPCALL		; DISPLAY THEM NOW.
OPTION1
	CALL DTMF1
	CALL MODE		; CHECK IF MODE IS TO BE EXECUTED. 
	CALL SHIFT		; CHECK IF SHIFT IS TO BE EXECUTED. 
	CALL FWD		; CHECK IF FWD IS TO BE EXECUTED. 
	CALL BACK		; CHECK IF BACK IS TO BE EXECUTED. 
	GOTO OPTION1		; TRY AGAIN.
MODE_1
	CALL READ1		; READ THE LATEST CALL INFOS RECORDED.
	MOVLW	d'21'		; SET THE FIRST LOWER ADDRESS OF CALL INFO
	SUBWF	ADDR		; TO BE READ.
	GOTO READ		; READ THE LATEST CALL INFOS

	END




    Source: geocities.com/ece23314/prog

               ( geocities.com/ece23314)