; THIS PROGRAM IS THE CONTROL FOR THE ; 2 LINE AUTOMATED ATTENDANT AND IS TARGETED ; FOR AN 8749 RUNNING AT 10.00 MHZ. ; ACAII.ASM BY BILL HEIDEMAN ; VERSION 1.0 APRIL 2,1988 ;***************************************** ; ; DECLEARED VARIABLES ; BUFSIZ EQU 12 ;DIGIT BUFFER SIZE BSYLIM EQU 4 ;BUSY CALL LIMIT ; ;***************************************** ; DECLARED DATA ;******************************************* ; THESE VALUES MUST STAY TOGETHER ANSDLY EQU 32 ;ANSWER MONITOR DELAYS (2) CADDLY EQU 34 ;CALL PROGRESS MONITOR DELAY (2) DILDLY EQU 36 ;DIALING DELAY ;******************************************* DSPOT EQU 37 ;DISPLAY OUTPUT (4) SWTLST EQU 41 ;LAST SWITCH READ VALUE SWTOLD EQU 42 ;OLD SWITCH COMMAND DSPCNT EQU 43 ;DISPLAY BYTE CNTR ;******************************************* ; THESE MUST STAY TOGETHER RPHAS EQU 44 ;RING PHASE CNTR (2) BSYCNT EQU 46 ;BUSY CALL CNTR (2) ANSPHS EQU 48 ;ANSWER PHASE (2) BUFPTR EQU 50 ;BUFFER PNTRS (2) ;**************************************** CAPTUR EQU 52 ;CAPTURE CADENCE CONTROL (2) ; D3-D0=PHASE ; D5-D4=(SPARE) ; D6=RING ; D7=BUSY CADDEB EQU 54 ;DEBN CALL PROGRESS DATA (2) HANGUP EQU 56 ;HANG-UP REQUEST FLGS RECDAT EQU 57 ;VOICE SET-UP DATA (2) ; D1-D0=PHASE ; D3-D2=PHRASE NUMBER ; D5-D4=SPEED ; D6=STOP FLAG ; D7=RECORD FLAG SWTCHG EQU 59 ;SWITCH CHANGED BITS SWITCH EQU 60 ;RAW SWITCH DATA SWTDEB EQU 61 ;DEBOUNCED SWITCH VALUE SWTDCD EQU 62 ;DECODED SWITCH VALUE ; D0=OFF ; D1=RECORD ; D2=ANSWER ; D3=(SPARE) ; D4=BUSY MESSAGE ; D5=HOLD MESSAGE ; D6=ANSWER MESSAGE RPLTMR EQU 63 ;REPLAY MESSAGE TIMER DILPHS EQU 64 ;AUTO DIALER PHASE ; D3-D0=PHASE ; D4=SPARE ; D5=AUTO DIAL ; D6=DIAL POKED NUMBER ; D7=UPPER LINE BUSOT EQU 65 ;BUS OUTPUT SAVER MATPTR EQU 66 ;MATRIX POINTER TONON EQU 67 ;202P READ FLAGS ; D0=L1 ON ; D1=L2 ON ;******************************************* ; THESE MUST STAY TOGETHER BUFR1 EQU 68 ;DIALING BUFFER FOR L1 (13) RPLPHS EQU 81 ;REPLAY ALL PHASING ; D3-D0=PHASE ; SEND MSG,WAIT FOR BUSY ; WAIT FOR DONE,PAUSE ; D5-D4=MSG NUMBER DUM32 EQU 82 ;DUMMY 32 SEC DISP (2) BUFR2 EQU 84 ;DIALING BUFFER FOR L2 (13) ;******************************************** REMOTE EQU 97 ;REMOTE MODE PHASING ; D1-D0=PHASE ; D7-D2=TIMER ;******************************************** ; THESE VALUES MUST STAY TOGETHER CLSTTL EQU 98 ;TOTAL CALL ANSWERED (2) CLSL1 EQU 100 ;TOTAL CALLS ON LINE 1 (2) CLSL2 EQU 102 ;TOTAL CALLS ON LINE 2 (2) ;******************************************** RECTIM EQU 104 ;RECORDING TIME BCD (2) VCRCTM EQU 106 ;VOICE RECORD TIMER VOCMD EQU 107 ;VOICE MONITOR COMMAND (2) ; D0=PLAY LAST ; D1=DAY 5 MSG ; D2=DAY 3 MSG ; D3=NIGHT MSG ; D4=PLAY ALL ; D5=STOP ; D6=PLAY/REC ; D7=REMOTE RECLST EQU 109 ;LAST CHANNEL RECORDED ;*************************************** ; THESE MUST STAY TOGETHER STKPTR EQU 110 ;STACK POINTER (2) STACK EQU 112 ;CALL PROGRESS STACK (2X8) ;*************************************** ;F0 LOOP CNTR ;F1 FLASH DISPLAY ;R7 RECDED RECORDED MESSAGES ;R7' ACC SAVE ;R6' TIMER COUNTER TMCT0 ;THIS IS THE MAIN RESTART FROM POWER-UP ORG 000H MAIN: MOV R2,#112 CLR A MOV R0,#10H ;CLEAR ALL RAM JMP MAIN1 ;THIS ROUTINE IS THE REAL TIME CLOCK. ;IT IS CALLED EVERY 2 MSEC FROM AN ;INTERNAL TIMER. ORG 007H TMR: SEL RB1 MOV R7,A ;SAVE STATUS MOV A,#0D8H ;RESET TIMER TO 2 MSEC MOV T,A STRT T CALL RGDT ;DO RING DETECT INC R6 ;INCR TIMER MOV A,R6 ANL A,#0FH JNZ TMR2 ;IF NOT 32 MSEC CALL DLYS ;DO MONITOR DELAYS CALL SWDB ;DO SWITCH DEBN CALL CADR ;DO CADENCE READ MOV A,R6 ANL A,#3FH JNZ TMR2 ;IF NOT 128 MSEC CALL VCTM ;DO VOICE TIMER TMR2: MOV A,R7 RETR ;THIS IS THE MAIN LINE ROUTINE FROM WHICH ALL ;NON TIME CRITICAL ROUTINES ARE CALLED. MAIN1: MOV @R0,A ;CLEAR DATA INC R0 DJNZ R2,MAIN1 OUTL BUS,A ;TURN OFF DISPLAY CPL A OUTL P1,A ;INITIALIZE P1 CALL VCRES ;DO VOICE RESET MOV A,#3CH OUTL P2,A ;INITIALIZE P2 MOV R0,#VCRCTM MOV @R0,#0FFH ;STOP TIMER MOV R0,#DUM32 MOV A,#32H ;SET DUMMY DISP MOV @R0,A STRT T EN TCNTI MAIN2: CALL DSOT ;DO DISPLAY OUTPUT CALL CADN ;DO CADENCE MONITOR CALL ATDL ;DO AUTO DIALER CALL TONR ;DO 202P READ CALL VCCT ;DO VOICE CONTROL CALL SWMN ;DO SWITCH MONITOR CALL DSMN ;DO DISPLAY MONITOR CALL ANSW ;DO ANSWER MONITOR CALL VCMN ;DO VOICE MONITOR CALL RMTE ;DO REMOTE PROGRAMMING MOV A,T ADD A,#2 JC MAIN2 ;IF TIMER ALMOST UP CALL HNGP ;DO HANG-UP JMP MAIN2 ;THIS ROUTINE READS THE H LINES AND DETERMINES ;IF A LINE IS RINGING OR NOT. IT IS CALLED ;EVERY 2 MSEC. 0=IDLE, 64=RING. RGDT: MOV R1,#RPHAS MOV R5,#1 ;SET BIT PNTR CLR F0 ;CLEAR LOOP MARK RGDT1: IN A,P1 ANL A,R5 JNZ RGDT3 ;IF H LINE UP MOV A,@R1 JB6 RGDT2 ;IF COUNTER=RING INC A MOV @R1,A ;INCR COUNTER JB6 RGDT2 ;IF COUNTER=RING INC A ;DOUBLE INCR MOV @R1,A RGDT2: INC R1 INC R5 ;SET UP NEXT LINE CPL F0 JF0 RGDT1 ;LOOP IF NOT DONE RET RGDT3: MOV A,@R1 JZ RGDT2 ;IF COUNTER IDLE DEC A MOV @R1,A ;DECR COUNTER JMP RGDT2 ;THIS ROUTINE HANDLES THE REMOTE PROGRAMMING WHEN ;THE REMOTE WORD IS SET. IT IS CALLED FROM MAIN. ;1=ON RMTE: MOV R1,#REMOTE MOV A,@R1 JZ RMTE5 ;IF REMOTE OFF ANL A,#0FCH JZ RMTE4 ;IF TIMER UP MOV A,@R1 ANL A,#3 ;MASK TIMER DEC A JZ RMTE7 ;IF PHASE=1 DEC A JZ RMTE6 ;IF=2 ;*********** 3 ************** MOV R0,#TONON MOV A,@R0 JB1 RMTE3 ;IF TONE IS ON RMTE1: CLR A MOV R0,#BUFPTR+1 MOV @R0,A ;CLEAR POINTER RMTE2: MOV R0,#BUSOT MOV @R0,A ;UPDATE BUS OUTL BUS,A ANL P2,#0DFH ;ENABLE DIALER RET RMTE3: MOV A,@R1 ORL A,#0FCH ;RESET TIMER MOV @R1,A MOV R0,#BUFR2 MOV A,@R0 ADD A,#8 ;ADD TABLE OFFSET MOVP3 A,@A ;READ TABLE JMP RMTE2 RMTE4: MOV R0,#HANGUP MOV @R0,#2 ;SET HANG-UP MOV @R1,#0 ;CLEAR REMOTE ORL P2,#20H ;DROP DIALER MOV R0,#RPHAS+1 MOV @R0,#0 ;SET LONG IDLE RMTE5: RET ;************ 2 **************** RMTE6: MOV R0,#TONON MOV A,@R0 JB1 RMTEA ;IF TONE ON INC @R1 JMP RMTE1 ;INCR PHASE RMTEA: MOV A,@R1 ORL A,#0FCH ;RESET TIMER MOV @R1,A MOV A,#11H ;SET "#" JMP RMTE2 ;************* 1 ************** RMTE7: MOV R0,#BUFPTR+1 MOV A,@R0 XRL A,#4 JNZ RMTE5 ;IF CODE CHAR NOT IN MOV R0,#BUFR2+1 MOV A,@R0 ;GET DIGIT XRL A,#4 JNZ RMTE4 ;IF CODE<>DIGIT INC R0 MOV A,@R0 XRL A,#2 JNZ RMTE4 ;IF CODE<>DIGIT INC R0 MOV A,@R0 XRL A,#0CH JNZ RMTE4 ;IF NOT "#" INC @R1 ;INCR PHASE ORL P2,#2 ;HOOK UP DIALER RET ;THIS ROUTINE WRITES THE VALUE IN THE ACC ;TO AL THE DISPLAY DIGITS. IT IS CALLED ;FROM DSMN (MAIN). DSWR: MOV R2,#4 MOV R0,#DSPOT DSWR1: MOV @R0,A ;WRITE DIGIT INC R0 DJNZ R2,DSWR1 DSWR2: RET ;THIS ROUTINE CHECKS THE STATUS OF THE AUTO ;DIALING AND RETURNS A NON ZERO VALUE IF ;BUSY. IT IS CALLED FROM ANSW (MAIN). DLCK: MOV R0,#DILPHS MOV A,@R0 MOV R0,#DILDLY ORL A,@R0 RET ;THIS ROUTINE OUTPUTS THE DISPLAY DATA TO ;THE 4 DIGIT DISPLAY. IT IS CALLED FROM ;MAIN. DSOT: MOV R0,#DILPHS MOV A,@R0 MOV R0,#REMOTE ORL A,@R0 JNZ DSWR2 ;IF AUTO DIALER ON MOV R1,#DSPCNT MOV A,@R1 ADD A,#DSPOT MOV R0,A ;FORM DATA PNTR MOV A,@R0 ;GET DISP DATA MOV R2,A MOV A,@R1 INC A ;FORM DIGIT SELECT MOV R3,A MOV A,#8 DSOT2: RL A DJNZ R3,DSOT2 ;FORM BIT MOV R3,A ;SAVE SELECT ORL A,R2 ;OR IN DATA OUTL BUS,A ;WRITE TO DISPLAY MOV R0,#BUSOT MOV @R0,A ;UPDATE BUS SAVER SEL RB1 MOV A,R6 ;SYNC DISP TO TIME SEL RB0 RR A ANL A,#3 MOV @R1,A ;WRITE DIGIT SELECT MOV R0,#SWITCH MOV A,R3 SWAP A ;GET SELECT JNT1 DSOT3 ;IF SWITCH SET CPL A ANL A,@R0 ;CLEAR BIT MOV @R0,A ;WRITE RESULT RET DSOT3: ORL A,@R0 ;SET BIT MOV @R0,A RET ;THIS ROUTINE TAKES CARE OF THE MONITOR ;DELAY TIMERS. IF THEY ARE NOT 0, THEY ;ARE DECR TO 0. IT IS CALLED EVERY 32 MSEC. DLYS: MOV R0,#ANSDLY MOV R2,#5 DLYS1: MOV A,@R0 JZ DLYS2 ;IF TIMER=0 DEC A MOV @R0,A ;DECR TIMER DLYS2: INC R0 DJNZ R2,DLYS1 ;DO REST RET ;THIS ROUTINE IS THE INTERFACE TO THE VOICE ;CHIP. IT IS CALLED FROM MAIN. VCCT: MOV R1,#RECDAT CLR F0 VCCT1: MOV A,@R1 ANL A,#3 JZ VCCT4 ;IF VOICE OFF DEC A JZ VCCT7 ;IF=1 PHRASE DEC A JZ VCCT6 ;IF=2 SPEED MOV A,@R1 JB6 VCCT8 ;IF STOP SET ANL A,#80H ;GET REC/PLAY VCCT2: OUTL BUS,A ;WRITE DATA MOV A,R1 XRL A,#RECDAT JNZ VCCT5 ;IF VOICE 2 ANL P2,#0F7H ;STROBE /WR1 VCCT3: NOP NOP NOP ;WAIT FOR COMMAND ORL P2,#0CH ;RESET /WR'S MOV R0,#BUSOT MOV A,@R0 OUTL BUS,A ;RESTORE BUS MOV A,@R1 DEC A MOV @R1,A ;DECR PHASE ANL A,#3 JNZ VCCT4 ;IF NOT OVER FLOW MOV A,#0FCH ANL A,@R1 ;RESET PHASE MOV @R1,A VCCT4: INC R1 CPL F0 JF0 VCCT1 ;IF NOT DONE RET VCCT5: ANL P2,#0FBH ;STROBE /WR2 JMP VCCT3 ;************* SPEED ************* VCCT6: MOV A,#53H ;SET SPEED JMP VCCT2 ;************* PHASE ************* VCCT7: MOV A,@R1 RR A RR A ANL A,#3 ;GET PHRASE NUM ORL A,#60H ;SET CODE JMP VCCT2 ;************ STOP ************** VCCT8: MOV A,@R1 ANL A,#0FDH ;SET PHASE 1 MOV @R1,A MOV A,#20H ;SET STOP JMP VCCT2 ;THIS ROUTINE DEBOUNCES THE FRONT PANEL ;SWITCHES. IT IS CALLED EVERY 32 MSEC ;FROM THE REAL TIME CLOCK. SWDB: MOV R0,#SWITCH MOV R1,#SWTLST MOV A,@R0 XRL A,@R1 JZ SWDB1 ;IF OLD=NEW MOV A,@R0 MOV @R1,A ;UPDATE OLD RET SWDB1: MOV A,@R0 ;GET RAW DATA INC R0 MOV @R0,A ;UPDATE VALUE RET ;THIS ROUTINE INCREMENTS A 2 BYTE BCD NUMBER ;AS SET IN R0. IT IS REENTERANT. INCB: MOV A,@R0 ADD A,#1 DA A MOV @R0,A ;INCR LSB JNC INCB1 ;IF NO OVERFLOW INC R0 MOV A,@R0 ADD A,#1 DA A MOV @R0,A INCB1: RET ;THIS ROUTINE CLEARS THE DATA AS POINTER TO ;BY ACC AND R5. DATCL: ADD A,R5 MOV R0,A MOV @R0,#0 ;CLEAR DATA RET ;THIS ROUTINE SETS UP THE VOICE COMMAND POINTER ;AS SET BY R5. VCSET: MOV A,R5 ADD A,#VOCMD MOV R0,A RET ;THIS ROUTINE READS THE ANSWER DELAY VALUE ;IT IS CALLED FROM ANSWR (MAIN). DELRD: MOV A,R5 ADD A,#ANSDLY MOV R0,A MOV A,@R0 ;READ DELAY RET ;THIS IS AN EXTENSION OF THE ANSWER ROUTINE ;WHICH HANDLES INCREMENTING THE STATS. ANSJJ: CALL DELRD MOV @R0,#64 ;SET 2 SEC DELAY MOV A,R5 RL A ADD A,#CLSL1 MOV R0,A ;SET UP LINE POINTER CALL INCB ;INCR LINE COUNT MOV R0,#CLSTTL CALL INCB ;INCR TOTAL COUNT JMP ANSWI ;THIS ROUTINE TAKES CARE OF HANGING UP ;A LINE. IT IS CALLED FROM MAIN. HNGP: MOV R1,#HANGUP MOV A,@R1 JZ HNGP4 ;IF NO HANG-UPS MOV R3,#1 MOV R5,#0 ;HAS BYTE CNTR JB0 HNGP0 ;IF LINE1 HANG-UP SET INC R3 ;SET LINE 2 BIT INC R5 HNGP0: MOV A,R5 JNZ HNGP1 ;IF LINE 2 ANL P2,#0DFH ;DISC LINE 1 JMP HNGP2 HNGP1: ANL P2,#7FH ;DISC LINE 2 HNGP2: MOV A,R5 ADD A,#RPHAS MOV R0,A MOV R2,#4 HNGP3: MOV @R0,#0 ;CLEAR DATA INC R0 INC R0 DJNZ R2,HNGP3 ;DO REST MOV A,R3 CPL A ANL A,@R1 ;CLEAR HANG-UP MOV @R1,A HNGP4: RET ;THIS ROUTINE READS THE END OF SPEECH STATUS ;FROM THE VOICE CHIPS AS SELECTED BY R5. ;IT IS CALL FROM SEVERAL MAIN ROUTINES. VCRD: MOV A,R5 ADD A,#RECDAT MOV R0,A MOV A,@R0 ANL A,#3 JNZ VCRD3 ;IF COMMAND ON VCRD0: MOV A,R5 JZ VCRD2 ;IF LINE 1 IN A,P1 JB2 VCRD1 ;IF LINE 2 EOS CLR A ;SET NO EOS VCRD1: RET VCRD2: IN A,P1 JB3 VCRD1 ;IF LINE 1 EOS VCRD3: CLR A RET ;SET NO EOS ;THIS ROUTINE PLACES THE R2 VALUE INTO THE ;SELECTED DIALING BUFFER AND ADDS E.O.F. FKDL: MOV A,R5 SWAP A ADD A,#BUFR1 ;FORM BUFFER PNTR MOV R0,A MOV A,R2 MOV @R0,A ;WRITE DATA INC R0 MOV @R0,#0FFH ;SET E.O.F. RET ;THIS ROUTINE READS THE DEBOUNCED SWITCHES ;AND ACTS ON ANY CHANGE IN STATUS. IT IS ;CALLED FROM MAIN. ;R6=SWITCH R5=CHANGE R4=DECODE SWMN: MOV R0,#SWTDEB MOV A,@R0 MOV R6,A ;SAVE DEBN SWITCH MOV R1,#SWTOLD XRL A,@R1 JZ SWMN4 ;IF NEW=OLD MOV R0,#SWTCHG MOV @R0,A MOV R5,A ;SAVE CHANGES CLR F1 ;CLEAR FLASH MOV A,R6 MOV @R1,A ;UPDATE OLD RR A ANL A,#7 ;FORMAT DATA MOVP3 A,@A ;READ TABLE MOV R4,A ;SAVE DECODE MOV R0,#SWTDCD MOV @R0,A JB0 SWMN8 ;IF UNIT OFF JB2 SWMN4 ;IF ANSWER CLR F1 ;CLEAR DUMMY 1'S MOV A,R6 CPL A JB0 SWMN5 ;IF SW3 ON MOV A,R5 CPL A JB0 SWMN4 ;IF NO SW3 CHANGE MOV A,#60H ;SET STOP REC SWMN3: MOV R0,#VOCMD MOV @R0,A ;WRITE TO VOICE 1 INC R0 MOV @R0,A ;WRITE TO VOCIE 2 SWMN4: RET SWMN5: MOV A,R4 ;GET DECODE SWAP A RL A ANL A,#0FH ;FORM DATA ORL A,#40H JMP SWMN3 ;FORM RECORD WORD SWMN8: MOV A,R6 JB0 SWMN9 ;IF S3 OFF MOV R0,#RPLPHS MOV @R0,#0 ;CLEAR REPLAY PHASE MOV A,#10H ;SET PLAY ALL JMP SWMN3 SWMN9: MOV A,#20H ;SET OFF JMP SWMN3 ;THIS ROUTINE DECREMENTS A NON-ZERO ;BCD NUMBER. IT IS CALLED FROM VCTM ;(REAL TIME). BCDD: MOV A,@R0 JZ BCDD1 ;IF ALREADY 0 ADD A,#99H DA A ;DO DECR MOV @R0,A BCDD1: RET ;THIS ROUTINE READS THE TONE DATA FRON THE 202P'S. ;IT IS CALLED FROM MAIN. TONR: MOV R1,#TONON MOV R6,#0 ;SET BYTE PNTR MOV R5,#1 ;SET BIT PNTR IN A,P1 JB4 TONR3 ;IF DATA1 ON MOV A,@R1 ANL A,#0FEH MOV @R1,A ;CLEAR WAS ON 1 TONR1: INC R5 INC R6 IN A,P1 JB5 TONR2 ;IF DATA2 ON MOV A,@R1 ANL A,#0FDH MOV @R1,A ;CLEAR WAS ON 2 RET TONR2: CALL TNUP ;DO TONE UPDATE RET TONR3: CALL TNUP ;DO TONE UPDATE JMP TONR1 ;THIS ROUTINE UPDATES THE DIGIT BUFFERS IF ;THE WAS ON FLAG IS NOT SET. IT IS CALLED FROM ;TONR (MAIN). TNUP: MOV A,@R1 ANL A,R5 JNZ TNUP2 ;IF WAS ON SET MOV R0,#DILPHS MOV A,@R0 JZ TNUP0 ;IF PHASE=0 RL A ANL A,#1 INC A ANL A,R5 JNZ TNUP2 ;IF AUTO DIAL ON TNUP0: MOV A,@R1 ORL A,R5 MOV @R1,A ;SET WAS ON STOP TCNT MOVX A,@R1 ;TRI-STATE BUS ORL P2,#1 ;ENABLE 202PS INS A,BUS MOV R2,A ;SAVE 202P DATA ANL P2,#0FEH ;DISABLE 202PS MOV R0,#BUSOT MOV A,@R0 OUTL BUS,A ;RESTORE BUS STRT T MOV A,R6 JNZ TNUP1 ;IF UPPER SET MOV A,R2 SWAP A MOV R2,A ;ADJUST DATA TNUP1: MOV A,R6 ADD A,#BUFPTR MOV R0,A MOV A,@R0 ;READ BUFFER PNTR XRL A,#BUFSIZ JZ TNUP2 ;IF OVER FLOW MOV A,R6 SWAP A ;MULT BY 16 ADD A,#BUFR1 ADD A,@R0 ;FORM POINTER INC @R0 ;INCR OLD POINTER MOV R0,A MOV A,R2 ANL A,#0FH MOV @R0,A ;WRITE TO BUFFER INC R0 MOV @R0,#0FFH ;SET EOF TNUP2: RET ;THIS ROUTINE CONNECTS THE PROPER LINE TO ;THE CORRECT VOICE CHIP AS SELECTED BY R5. ;IT IS CALLED FROM ANSW (MAIN). LNCN: MOV A,R5 JNZ LNCN1 ;IF LINE 2 ORL P2,#40H ;CONNECT LINE 1 RET LNCN1: ORL P2,#80H ;CONNECT LINE 2 RET ;THIS ROUTINE DIS-CONNECTS THE PROPER LINE TO ;THE CORRECT VOICE CHIP AS SELECTED BY R5. ;IT IS CALLED FROM ANSW (MAIN). LNDS: MOV A,R5 JNZ LNDS1 ;IF LINE 2 ANL P2,#0DFH ;DISCONNECT LINE 1 RET LNDS1: ANL P2,#7FH ;DISCONNECT LINE 2 RET ;THIS ROUTINE CHECKS THE STACK IN R0 FOR ;A BUSY CADENCE. IT IS CALLED FROM CADN ;(MAIN). CDCK: MOV A,R5 ADD A,#STKPTR MOV R0,A MOV A,@R0 MOV R2,A ;SET LOOP CNTR MOV A,R5 SWAP A RR A ADD A,#STACK MOV R0,A MOV R6,#4 ;SET ACCEPT COUNT CDCK1: MOV A,@R0 ANL A,#7FH ADD A,R4 JC CDCK4 ;IF > MAX MOV A,@R0 ANL A,#7FH ADD A,R3 JNC CDCK4 ;IF < MIN DJNZ R6,CDCK2 ;IF ACCEPT <> 0 MOV A,#0FFH ;SET BUSY RET CDCK2: INC R0 MOV A,R5 SWAP A RR A ADD A,#STACK+8 XRL A,R0 JNZ CDCK3 ;IF NO OVERFLOW MOV A,R5 SWAP A RR A ADD A,#STACK MOV R0,A CDCK3: DJNZ R2,CDCK1 ;IF LOOP <>0 CLR A RET ;CLEAR BUSY CDCK4: MOV R6,#4 ;RESET ACCEPT JMP CDCK2 ;THIS TABLE IS THE DECODING FOR THE FRONT ;PANEL SWITCHES. ORG 300H SWTTBL: DB 01H ;OLD 3 DB 01H ;3 DB 44H ;5 DB 42H ;7 DB 14H ;9 DB 12H ;B DB 24H ;D DB 22H ;F ;THIS IS THE TABLE FOR CNVERTING THE 202P ;OUTPUTS TO R/C FORMAT FOR THE 25910 DIALER. RCTBL: DB 00H ;0 DB 81H ;1 DB 41H ;2 DB 21H ;3 DB 82H ;4 DB 42H ;5 DB 22H ;6 DB 84H ;7 DB 44H ;8 DB 24H ;9 DB 48H ;0 DB 88H ;* DB 11H ;# ;THIS ROUTINE CONTROLS THE DATA TO BE ;DISPLAYED. IT IS CALLED FROM MAIN. DSMN: MOV R0,#DSPCNT MOV A,@R0 JNZ DSMN4 ;IF DISP UPDATING MOV R1,#SWTDCD JF1 DSMNB ;IF DISPLAY FLASH DSMN1: MOV R0,#SWTDEB MOV A,@R1 JB0 DSMNA ;IF MODE=OFF JB1 DSMND ;IF REC MOV A,@R0 ;GET SWTDEB JB0 DSMN5 ;IF S3=OFF MOV A,@R1 JB4 DSMN8 ;IF DAY 5 JB5 DSMN7 ;IF DAY 3 MOV R0,#CLSL2 ;DISPLAY LINE 2 CALLS D