; THIS PROGRAM IS THE CONTROL FOR THE ; 2 LINE AUTOMATED ATTENDANT AND IS TARGETED ; FOR AN 8749 RUNNING AT 10.00 MHZ. ; ACA2.ASM BY BILL HEIDEMAN ; VERSION 2.0 JANUARY 25,1988 ;***************************************** ; ; DECLEARED VARIABLES ; BUFSIZ EQU 13 ;DIGIT BUFFER SIZE BSYLIM EQU 4 ;BUSY CALL LIMIT ; ;***************************************** ; DECLARED DATA TMCT0 EQU 32 ;TIMER COUNTER 0 MATRIX EQU 33 ;CROSS POINT MATRIX (4) DSPOT EQU 37 ;DISPLAY OUTPUT (4) SWTLST EQU 41 ;LAST SWITCH READ VALUE DSPCNT EQU 42 ;DISPLAY BYTE CNTR HVAL EQU 43 ;RAW H LINE VALUE ;******************************************* 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) ;**************************************** ;SPARE 52 (2) CAPTUR EQU 54 ;CPATURE CADENCE CONTROL ; D3-D0=PHASE ; D4=LINE 1 ; D5=LINE 2 ; D6=RING ; D7=BUSY M98DEB EQU 55 ;DEBN M98 DATA 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 CADPHS EQU 63 ;CALL PROGRESS PHASE 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 ;******************************************* BUFR1 EQU 68 ;DIALING BUFFER FOR L1 (14) DUM32 EQU 82 ;DUMMY 32 SEC DISP (2) BUFR2 EQU 84 ;DIALING BUFFER FOR L2 (14) ;******************************************** ;******************************************** ; 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 VALUES MUST STAY TOGETHER ANSDLY EQU 110 ;ANSWER MONITOR DELAYS (2) CADDLY EQU 112 ;CALL PROGRESS MONITOR DELAY DILDLY EQU 113 ;DIALING DELAY ;******************************************* SWTOLD EQU 114 ;OLD SWITCH COMMAND ;*************************************** STKPTR EQU 115 ;STACK POINTER STACK EQU 116 ;CALL PROGRESS STACK (8) ;*************************************** ;SPARE 124 RPLPHS EQU 125 ;REPLAY ALL PHASING ; D3-D0=PHASE ; SEND MSG,WAIT FOR BUSY ; WAIT FOR DONE,PAUSE ; D5-D4=MSG NUMBER REMOTE EQU 126 ;REMOTE MODE PHASING ; D1-D0=PHASE ; D7-D2=TIMER RPLTMR EQU 127 ;REPLAY MESSAGE TIMER ;F0 LOOP CNTR ;F1 FLASH DISPLAY ;R7 RECDED RECORDED MESSAGES ;R7' ACC SAVE ;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 MOV R0,#TMCT0 INC @R0 ;INCR TIMER MOV A,@R0 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 R0,#TMCT0 MOV A,@R0 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 MOV A,#2CH OUTL P2,A ;INITIALIZE P2 CALL VCRES ;DO VOICE RESET MOV A,#0E0H OUTL P1,A ;INITIALIZE P1 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 HLIN ;DO H LINE INPUT 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,#6 JC MAIN3 ;IF TIMER ALMOST UP CALL MXCN ;DO MATRIX CONNECT CALL HNGP ;DO HANG-UP MAIN3: 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 BYTE CNTR CLR F0 ;CLEAR LOOP MARK RGDT1: MOV R0,#HVAL MOV A,@R0 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 MOV R5,#8 ;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 P1,#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,#8 ;SET HANG-UP MOV @R1,#0 ;CLEAR REMOTE ORL P1,#20H ;DROP DIALER MOV R0,#RPHAS+1 MOV @R0,#0 ;SET RONG 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,#81H ;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 MOV R0,#MATRIX+3 MOV @R0,#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 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 MOV R0,#TMCT0 MOV A,@R0 ;SYNC DISP TO TIME 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 DSOT4: 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,#4 DLYS1: MOV A,@R0 JZ DLYS2 ;IF TIMER=0 DEC A MOV @R0,A ;DECR TIMER DLYS2: INC R0 DJNZ R2,DLYS1 ;DO REST DLYS3: RET ;THIS ROUTINE WRITE THE DATA OUT TO THE CROSS ;POINT MATRIX. IT IS CALLED FROM MAIN. MXCN: MOV R1,#MATPTR MOV A,@R1 RR A RR A ANL A,#7 ;MASK BYTE ADD A,#MATRIX MOV R0,A MOV A,@R0 ;READ MATRIX MOV R5,A ;SAVE MOV A,@R1 ;READ CNTR ANL A,#0FH MOV R3,A MOV R4,#4 MXCN1: ANL P2,#7FH ;CLEAR DATA MOV A,R5 RRC A MOV R5,A JNC MXCN2 ;IF DATA=0 ORL P2,#80H ;SET DATA MXCN2: IN A,P1 ANL A,#0F0H ;CLEAR OLD COUNT ORL A,R3 ;SET ADDR ORL A,#0C0H ;SET INPUTS OUTL P1,A ORL P2,#1 ANL P2,#0FEH ;PULSE LOWER INC @R1 ;INCR BIT CNTR INC R3 ;INCR ADDR DJNZ R4,MXCN1 ;IF NOT ALL BITS MOV A,@R1 XRL A,#16 JZ MXCN4 ;LIMIT POINTER RET MXCN4: MOV @R1,A RET ;THIS ROUTINE READS IN THE RAW H LINE DATA ;TO HVAL. IT IS CALLED FROM MAIN. HLIN: MOV R2,#80H ;SET BIT MASK MOV R3,#0 ;CLEAR RESULT MOV R4,#8 ;SET LOOP CNTR HLIN1: DEC R4 IN A,P1 ANL A,#0F0H ;MASK OLD COUNT ORL A,R4 ;OR IN NEW ORL A,#0C0H ;SET INPUTS OUTL P1,A ;WRITE OUT INC R4 JNT0 HLIN2 ;IF T0=0 MOV A,R2 ;SET BIT ORL A,R3 MOV R3,A ;SAVE RESULT HLIN2: MOV A,R2 RR A MOV R2,A ;ROTATE MASK DJNZ R4,HLIN1 ;LOOP IF NOT DONE MOV R0,#HVAL MOV A,R3 MOV @R0,A ;UPDATE HVAL RET ;THIS ROUTINE WRITES THE VALUE IN THE ACC ;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,#0FBH ;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,#0F7H ;STROBE /WR2 JMP VCCT3 VCCT6: MOV A,#53H ;SET SPEED JMP VCCT2 VCCT7: MOV A,@R1 RR A RR A ANL A,#3 ;GET PHRASE NUM ORL A,#60H ;SET CODE JMP VCCT2 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 FORMS THE MATRIX POINTER. IT IS ;CALLED FROM ANSW (MAIN). MATP: MOV A,R5 MOV R0,#MATRIX JZ MATP1 ;IF LOWER LINE MOV R0,#MATRIX+3 ;SET UPPER MATP1: 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 HNGP2 ;IF LINE1 HANG-UP SET MOV R3,#8 ;SET LINE 2 BIT INC R5 HNGP2: MOV A,R5 RL A ORL A,R5 ;MAKE 1 A 3 ADD A,#MATRIX MOV R0,A MOV @R0,#0 ;DISC LINE 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 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 SWMN2: 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,P2 JB5 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 JB7 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 P1,#10H ;ENA L2 202P ORL P2,#40H ;ENA L1 202P INS A,BUS MOV R2,A ;SAVE 202P DATA ANL P1,#0EFH ;DISABLE 202'S ANL P2,#0BFH 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 RL A ORL A,R5 ;FORM POINTER INC A MOV @R0,A ;SET CORRECT VOICE RET ;THIS ROUTINE DISCONNECTS THE AUTO DIALER ;AND RECONNECTS THE VOICE PATH OF THE ;LINE SELECTED @R1 D7. ;IT IS CALLED FROM ATDL (MAIN); ADDC: MOV R0,#MATRIX MOV A,@R1 JB7 ADDC1 ;IF UPPER LINE MOV @R0,#1 ;SET LOWER LINE RET ADDC1: MOV R0,#MATRIX+3 MOV @R0,#4 ;SET UPPER LINE RET ;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 11H ;1 DB 21H ;2 DB 41H ;3 DB 12H ;4 DB 22H ;5 DB 42H ;6 DB 14H ;7 DB 24H ;8 DB 44H ;9 DB 28H ;0 DB 18H ;* DB 81H ;# ;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 ;I,#77 ;SET 2.5 SEC JMP ANSWI ANSWY: MOV @R1,#0 ;CLEAR PHASE MOV R0,#REMOTE MOV @R0,#0FDH ;SET REMOTE PHASE MOV R0,#HANGUP MOV @R0,#1 ;HANGUP LINE 1 JMP ANSW2 ;************* 2 **************** ANSWZ: MOV R0,#TONON MOV A,R5 INC A ;FORM MASK ANL A,@R0 JNZ ANSWI ;IF TONE ON CALL DELRD JNZ ANSBB ;IF DELAY ON CALL VCSET ;SET UP VOICE MOV @R0,#2 ;SEND MSG 1 JMP ANSWI ;************ 1 ****************** ANSAA: CALL DELRD JNZ ANSBB ;IF DELAY ON MOV @R0,#32 ;SET 1 SEC DELAY CALL MATP CALL LNCN ;DO LINE CONNECT INC @R1 ;INCR PHASE ANSBB: JMP ANSW2 ;*********** 0 ************* ANSDD: MOV A,R5 ADD A,#RPHAS MOV R0,A MOV A,@R0 ;READ RING TIME CPL A JB6 ANSBB ;IF RING NOT ON MOV R0,#SWTDCD MOV A,@R0 CPL A JB2 ANSBB ;IF NOT IN ANSWER MODE JMP ANSJJ ;DO STATS ;THIS IS THE VERSON IDENTIFIER ORG 7FFH DB 20H END