;*****************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