; THIS PROGRAM IS THE CONTROL FOR THE ; PATH-FINDER AUTOMATIC LINE SWITCHING UNIT ; FOR AN 8749 RUNNING AT 3.57 MHZ. ; FAXDET.ASM BY BILL HEIDEMAN ; VERSION 1.0 JULY 7,1989 ; DECLARED DATA ;********* THESE VALUES MUST STAY TOGETHER ***** FAX EQU 32 ;FAX ENABLE MASK MODEM EQU 33 ;MODEM ENABLE PHN1 EQU 34 ;PHONE 1 ENABLE PHN2 EQU 35 ;PHONE 2 ENABLE PHN3 EQU 36 ;PHONE 3 ENABLE PHN4 EQU 37 ;PHONE 4 ENABLE PHN5 EQU 38 ;PHONE 5 ENABLE DEFALT EQU 39 ;DEFAULT BIT MASK (7) ORIGIN EQU 40 ;ORIGIN BIT MASK (8) DESTIN EQU 41 ;DESTINATION MASK (9) ;******************************************* BRSDBN EQU 42 ;RING BURST DEBN COUNTER TMR45 EQU 43 ;4.5 SECOND TIMER IN RING LNSCNT EQU 44 ;P17 ACTIVE COUNTS (2) RNGDLY EQU 46 ;RING DELAY IN RERING TONBUF EQU 47 ;INCOMING TONE BUFFER (8) ;SPARE 55 (2) ;************ THESE MUST STAY TOGETHER ********* SECD0 EQU 57 ;SECURITY CODE FAX (4) SECD1 EQU 61 ;MODEM (4) SECD2 EQU 65 ;PHONE 1 (4) SECD3 EQU 69 ;PHONE 2 (4) SECD4 EQU 73 ;PHONE 3 (4) SECD5 EQU 77 ;PHONE 4 (4) SECD6 EQU 81 ;PHONE 5 (4) SECD7 EQU 85 ;DOUBLE RING CODE (4) DFLT0 EQU 89 ;DEFAULT PHONE 1 (0 TO 6) DFLT1 EQU 90 ;DEFAULT PHONE 2 ORIG0 EQU 91 ;ORIGANATOR 1 ORIG1 EQU 92 ;ORIGANATOR 2 DEST0 EQU 93 ;CALL DESTINATION 1 DEST1 EQU 94 ;CALL DESTINATION 2 ;************************************************ ;SPARE 95 (24) BUFPTR EQU 119 ;TONE BUFFER POINTER RNGCNT EQU 120 ;INCOMING RING DELAY DIGIT EQU 121 ;LAST DIGIT ENTERED ;SPARE 122 DEFDLY EQU 123 ;DEFAULT RING DELAY SECURE EQU 124 ;SECURITY REQD FLAG DBLRNG EQU 125 ;DOUBLE RING FLAG LOGICL EQU 126 ;LOGICAL DEVICE SELECTION ;SPARE EQU 127 ;THESE ARE THE DECLARED FLAGS FILTIM EQU 0E0H ;INCOMING FREQ FILTER TIME INTRV EQU 0B0H ;TONE DETECT INTERVAL TIMER ; F0 GENERAL PURPOSE USED IN ANY ROUTINE ; F1 INBOUND FLAG ; R7 PROGRAMMING JUMPERS FROM POWER-UP ; D3-D0=P23-P20 ; D7-D4=P17-P14 ; STANDARD MODE (P22=0) ; P14=0 FAX=D2,MODEM=D3 ; P14=1 FAX=D3,MODEM=D2 ; P15=0 DEFAULT DELAY=3 ; P15=1 DEFAULT DELAY=10,NO ROLL ; P20=0 NO SECURITY REQUIRED ; P20=1 SECURITY REQUIRED ; P21=0 FAX=D2 ; P21=1 FAX=D3 ; P23=E.O.S. ; OPTIONAL MODES (P22=1) ; P21=0 RING DOWN ; P15,P14=RING COUNT ; P21=1 RADIO SHACK ;THIS IS THE MAIN RESTART FROM POWER-UP ORG 000H MAIN: DIS I DIS TCNTI MOV A,#1 OUTL BUS,A ;GRAB LINE MOV A,#0FFH OUTL P1,A ;SET TO INPUTS OUTL P2,A ;TURN OFF RING MOV R2,#112 CLR A MOV R0,#10H ;CLEAR ALL RAM MAIN0: MOV @R0,A INC R0 DJNZ R2,MAIN0 IN A,P1 ANL A,#0F0H ;GET P1 HIGH MOV R7,A IN A,P2 ANL A,#0FH ;GET P2 LOW ORL A,R7 MOV R7,A ;SAVE COMBINED MOV R2,#INTB1-300H MOV A,R7 JB2 MAIN1 ;IF RING DOWN JB4 MAIN1 ;IF P14=1 MOV R2,#INTB0-300H MAIN1: MOV R3,#7 MOV R0,#FAX MAIN2: MOV A,R2 MOVP3 A,@A ;READ SET UP MOV @R0,A ;WRITE TO BUFFER INC R0 INC R2 ;POINT TO NEXT DJNZ R3,MAIN2 MOV R0,#DEFDLY MOV @R0,#0AH ;SET DEFAULT RING DLY MOV A,R7 JB5 MAINA ;IF P15=1 MOV @R0,#3 ;SET LOWER DEFAULT MAINA: MOV R0,#DFLT0 MOV @R0,#2 ;SET PHONE 1 DEFAULT INC R0 MOV @R0,#2 MOV R0,#PHN1 MOV A,@R0 ;GET DEFAULT MASK MOV R0,#RNGCNT MOV @R0,#1 ;SET INCOMING RING DELAY MOV R0,#SECURE MOV A,R7 CPL A JB0 MAINB ;IF NO SECURITY MOV @R0,#0FFH ;SET SECURITY MAINB: MOV A,R7 JB2 MAIN8 ;IF OPTION MODE JB0 MAIN3 ;IF SECURITY MODE CALL FAXS ;SET UP FAX PORT MOV R0,#RNGDLY MOV @R0,#2 ;SET RING DELAY CALL RRNG ;DO FAX RERING XRL A,#7 JNZ MAIN7 ;IF FAX ANSWERED MAIN3: CALL IDLP ;CHECK FOR ACTIVITY JNZ MAIN5 ;IF OUTBOUND MOV R3,#0 MOV R4,#13 MAIN4: CALL WAIT DJNZ R4,MAIN4 ;IF NOT 1.6 SEC MOV A,#1 OUTL BUS,A ;GRAB LINE MOV R4,#2 MAINY: CALL WAIT ;PAUSE 250 MSEC DJNZ R4,MAINY CALL TONE ;SET TONE BURST IN A,P2 CPL A JB3 MAINX ;IF EOS MOV R4,#6 ;SET 750 MSEC MAINV: CALL WAIT DJNZ R4,MAINV ;WAIT MAINZ: JT0 MAIN6 ;IF CPC IN A,P2 JB3 MAINZ ;IF MSG ON MAINX: CALL LNMN ;DO LINE MONITOR JB6 MAIN6 ;IF CPC CALL ANSW ;DO ANSWER JNZ MAIN6 ;DO HANG-UP MAIN5: CALL ACTV ;DO ACTIVE LOOP MAIN6: CALL HNGP ;DO HANG-UP JMP MAIN3 MAIN7: CALL FAXS ;FIND LOGICAL MOV A,R5 MOV R2,A ;SET UP ORIGINS CALL ORST JMP MAIN5 MAIN8: JB1 MAIN9 ;IF RADIO SHACK CALL RGDN ;DO RING DOWN JMP MAIN MAIN9: CALL RDSK ;DO RADIO SHACK JMP MAIN ;THIS ROUTINE SENDS OUT THE BURST OF HIGH ;FREQUENCY FOR RINGING. IF THE LINE IS ;ANSWERED, THE PORT MASK IS RETURNED IN ;THE ACC. R4 MUST BE LOADED WITH THE BURST ;LENGTH IN 50 MSEC INCREMENTS. RNGB: MOV A,R5 ORL A,R6 ORL A,#1 ;GRAB LINE OUTL BUS,A MOV R3,#7CH ;SET 26 MSEC DELAY MOV R0,#BRSDBN MOV @R0,#0 ;CLEAR DEBN NUMBER RNGB1: ANL P2,#0DFH ;ENABLE RING ORL P2,#10H ;SET HV MOV R2,#6 RNGB2: DJNZ R2,RNGB2 ;WAIT 83 MMSEC ANL P2,#0EFH ;CLEAR HV MOV R2,#6 RNGB4: DJNZ R2,RNGB4 ;WAIT 83 MMSEC DJNZ R3,RNGB1 ;IF 25 MSEC NOT UP MOV R3,#10H ;RESET 26 MSEC DJNZ R4,RNGB8 ;IF TIME NOT UP CLR A ;SET NO ANSWER RET RNGB8: MOV R2,#118 ;SET 1 MSEC RNGB9: DJNZ R2,RNGB9 ANL P2,#0DFH ;ENABLE RING MOV R2,#118 RNGBA: DJNZ R2,RNGBA ;WAIT 1 MSEC DJNZ R3,RNGBB ;IF 25 MSEC NOT UP MOV A,R6 ORL A,R5 ORL A,#1 ;SET UP ALL RING OUTL BUS,A MOV R3,#7CH ;RESET 26 MSEC DELAY JT0 RNGBZ ;IF CPC JMP RNGB1 RNGBB: MOV R0,#BRSDBN ORL P1,#0FFH ;SET TO INPUT IN A,P1 ORL P2,#20H ;SET WARBLE JB7 RNGBC ;IF P17 ACTIVE MOV @R0,#0 ;CLEAR DEBN JMP RNGB8 RNGBC: INC @R0 ;INCR DEBN CNTR MOV A,@R0 JB1 RNGBD ;IF MAXED JMP RNGB8 RNGBD: MOV @R0,#0 ;RESET DEBN CNTR MOV A,R6 JF0 RNGBE ;IF UPPER NOW SET RNGBZ: MOV A,R5 RNGBE: RET ;THIS ROUTINE SETS UP THE DEFAULT RING MASK. ;IT IS CALLED FROM ANSW. DFST: MOV R0,#DEFDLY MOV A,@R0 ;SET UP DEFAULT DELAY MOV R0,#RNGDLY MOV @R0,A MOV R0,#DFLT0 MOV A,@R0 ;READ FIRST DEFAULT MOV R5,A ;SET LOGICAL INC R0 ;GET NEXT MOV A,@R0 MOV R6,A MOV R2,#7 ;SET DEFAULT LOGICAL RET ;THIS ROUTINE DETERMINES IF THE DEFAULT LINES ;HAVE ENTERED SECURITY CODES. IT IS CALLED ;FROM ANSW. CDCK: MOV R3,A ;SAVE SELECT XRL A,#7 JNZ CDCK2 ;IF NOT DEFAULT MOV R0,#DFLT0 MOV A,@R0 CALL CDCK0 ;DO FORMAT JNZ CDCK1 ;IF SECURITY CODE MOV R0,#DFLT1 MOV A,@R0 CDCK0: RL A RL A ;MULT BY 4 ADD A,#SECD0 MOV R0,A MOV A,@R0 CDCK1: RET CDCK2: MOV A,R3 ;GET LOGICAL JMP CDCK0 ;THIS ROUTINE IS THE IDLE LOOP WHERE THE ;INITIAL DECISION OF INBOUND OR OUTBOUND ;TAKES PLACE. IT RETURNS A 0 IN THE ACC ;IF OUTBOUND, AND A 0FFH IN INBOUND. ;IT IS CALLED FROM MAIN. ;NOTE THAT THERE IS NO OUTBOUND ON D6 (LIPCO). IDLP: CLR F1 ;CLEAR INBOUND MOV R4,#0 ;CLEAR RING COUNTER ANL P2,#0FH ;SET SCAN ENABLE MOV A,#0BEH OUTL BUS,A ;ENABLE ALL EXCEPT D6 MOV R3,#20 ;PAUSE 10 MSEC CALL WAIT ;PAUSE IDLP2: JNI IDLP7 ;IF NO RING MOV R6,#20H ;RESET RING DEBN CLR A OUTL BUS,A ;TURN OFF SCAN IDLP3: STOP TCNT MOV A,#0F1H ;SET 2 MSEC TIMER MOV T,A STRT T IDLP4: JNI IDLP6 ;IF NO RING MOV A,R6 ADD A,#20H ;INCR RING DEBN MOV R6,A JNC IDLP5 ;IF RING NOT MAX MOV R6,#0FFH ;SET COUNT TO MAX MOV A,R4 JB7 IDLP3 ;IF COUNTED INC A ORL A,#80H ;SET WAS COUNTED MOV R4,A ANL A,#7FH MOV R0,#RNGCNT XRL A,@R0 JNZ IDLP3 ;IF NOT ENOUGH RINGS CLR F1 CPL F1 ;SET INBOUND CLR A RET ;SET RING DETECT IDLP5: JTF IDLP3 ;IF 2 MSEC UP JMP IDLP5 IDLP6: MOV A,R6 ADD A,#0FFH ;DECR RING DEBN MOV R6,A JC IDLP5 ;IF NOT MIN MOV A,R4 ANL A,#7FH ;CLEAR WAS COUNTED MOV R4,A MOV A,#0BEH OUTL BUS,A MOV R3,#1 ;PAUSE .5 MSEC CALL WAIT ;PAUSE IDLP7: IN A,P1 CPL A JB7 IDLP2 ;IF P17 OFF MOV R5,#0 ;RESET P17 DEBN IDLP8: MOV R2,#118 IDLP9: DJNZ R2,IDLP9 ;WAIT 1 MSEC IN A,P1 CPL A JB7 IDLP2 ;IF P17 OFF JNI IDLPA ;IF RING OFF JMP IDLP2 IDLPA: MOV A,R5 INC A ;INCR P17 DEBN MOV R5,A JNZ IDLP8 ;IF P17 DEBN NOT MAX CALL BFTM ;DO BIT FORMAT JZ IDLP ;ERROR-NON FOUND OUTL BUS,A ;LEAVE OFF-HOOK LINE ON CALL ORUP ;DO ORIGIN UPDATE CALL ORST ;WRITE ORIGINS RET ;RETURN ENABLE MASK ;THIS ROUTINE SUCCESSIVELY TURNS OFF ENABLES UNTIL IT ;FINDS WHICH LINE IS REQUESTING, THE IT ENABLES ONLY ;THAT LINE. BFTM: MOV R3,#2 ;BIT PATTERN BFTM1: MOV A,R3 ORL A,#1 ;TURN ON LINE ANSWER OUTL BUS,A ;SET ENABLES MOV R2,#250 ;SET 2 MSEC BFTM2: DJNZ R2,BFTM2 ;WAIT 2 MSEC IN A,P1 JB7 BFTM3 ;IF ACTIVE MOV A,R3 CLR C RLC A MOV R3,A ;ADJUST ENABLES JNZ BFTM1 ;IF NOT ALL RET ;ERROR-NON FOUND BFTM3: MOV A,R3 RET ;ACC HAS PATTERN ;THIS ROUTINE CHECKS THE HOOK SWITCH FLASHES ;FOR TIMING AND COUNT. R3=TIMER (D7=UP) AND ;R4=COUNT. IT IS CALLED FROM ACTV. FLSH: MOV R3,#80H ;SET UP UP TIMER MOV R4,#0 ;CLEAR COUNT FLSH1: STOP TCNT MOV A,#181 ;SET TIMER TO 10 MSEC MOV T,A STRT T FLSH2: JTF FLSH3 ;IF TIME UP JMP FLSH2 FLSH3: MOV A,R7 JB2 FLSHC ;IF RADIO SHACK IN A,P1 JB7 FLSH5 ;IF P17 ACTIVE FLSHZ: MOV A,R3 JB7 FLSH4 ;IF P17 WAS ACTIVE INC R3 ;INCR DOWN TIME MOV A,R3 XRL A,#100 JNZ FLSH1 ;IF NOT 1 SEC CLR A RET ;SET HANG-UP FLSH4: MOV R3,#0 ;SET UP DOWN TIMER INC R4 ;INCR COUNT JMP FLSH1 FLSH5: IN A,P1 JB6 FLSHB ;IF DATA VALID MOV A,R3 JB7 FLSH8 ;IF P17 WAS 1 MOV R2,A ;SAVE MOV R3,#80H ;SET UP UP TIMER JF1 FLSH7 ;IF INBOUND MOV A,R2 ADD A,#0ECH JC FLSH1 ;IF >200 MSEC FLSH6: MOV R4,#0 ;RESET COUNT JMP FLSH1 FLSH7: MOV A,R2 ADD A,#0FEH JC FLSH1 ;IF >20 MSEC JMP FLSH6 FLSH8: INC R3 ;INCR UP CNTR MOV A,R3 XRL A,#228 JNZ FLSH1 ;IF NOT 1 SEC UP MOV A,R4 ADD A,#0FEH JC FLSH9 ;IF COUNT>1 FLSHB: MOV A,#1 ;SET LOOP RET FLSH9: DEC R4 DEC R4 ;FORMAT TO LOGICAL MOV A,R4 ADD A,#0F9H JNC FLSHA ;IF 3000 HZ JNC LNMNO ;IF <1000 HZ MOV A,T ADD A,#166 JNC LNMNI ;IF <1047 HZ MOV A,T ADD A,#156 JC LNMNI ;IF >1164 MOV A,R0 INC R0 ;INCR FAX DEBN COUNT XRL A,#4 JZ LNMNH ;IF FAX DEBN MOV R1,#0 ;RESET MODEM CNTR JMP LNMN1 LNMNH: MOV A,#0 ;SET FAX RET LNMNI: MOV R0,#0 ;RESET FAX COUNTER MOV A,R1 INC R1 XRL A,#24 JNZ LNMNP ;IF 2 SEC NOT UP MOV A,#1 ;SET MODEM RET LNMNO: MOV R0,#0 ;CLEAR MODEN CNTR MOV R1,#0 ;CLEAR FAX CNTR LNMNP: JMP LNMN1 ;RESUME LNMNS: MOV R1,#TONBUF ;IF DATA VALID LNMNT: MOV R2,A ;SAVE DATA MOV A,R1 XRL A,#TONBUF+6 JZ LNMNU ;IF BUFFER FULL MOV A,R2 ANL A,#0FH MOV R0,#DIGIT MOV @R0,A ;SAVE DIGIT MOV @R1,A ;WRITE DATA TO BUFF INC R1 MOV @R1,#0FFH ;SET EOF LNMNU: IN A,P1 JB6 LNMNU ;IF DV STILL = 1 MOV R5,#0 MOV R6,#0 ;SET 2 SECONDS LNMNX: JT0 LNMNY ;IF CPC IN A,P1 JB6 LNMNT ;IF DV=1 DJNZ R5,LNMNX DJNZ R6,LNMNX ;IF 2 SEC NOT UP MOV A,#80H ;SET DIGIT IN RET LNMNY: MOV A,#40H ;SET HANG-UP RET LNMNZ: MOV A,#10H ;SET OFF HOOK RET ;THIS IS THE TABLE FOR SETTING UP WHICH PORTS ;ARE ALLOCATED TO WHAT. IT IS READ IN INITILIZING. ORG 300H ;************** P14=1 ************** INTB1: DB 00001000B ;FAX DB 00000100B ;MODEM DB 00000010B ;PHONE 1 DB 00010000B ;PHONE 2 DB 00100000B ;PHONE 3 DB 01000000B ;PHONE 4 DB 10000000B ;PHONE 5 ;************** P14=0 ************** INTB0: DB 00000100B DB 00001000B DB 00000010B DB 00010000B DB 00100000B DB 01000000B DB 10000000B ;THIS TABLE IS THE LOGICAL DEVICE SELECTION ;FOR INCOMING CALLS. REQTBL: DB 1,1 ;POSITION 0 DB 2,2 ;1 DB 3,3 ;2 DB 4,4 ;3 DB 5,5 ;4 DB 6,6 ;5 DB 7,7 ;6 DB 0CH,0 ;7 DB 0CH,1 ;8 DB 0CH,2 ;9 DB 0CH,3 ;10 DB 0CH,4 ;11 DB 0CH,5 ;12 DB 0CH,6 ;13 DB 0CH,7 ;14 ;THIS TABLE IS THE DEVICE SELECT FOR THE ;LOGICAL ENTRY. TYPTBL: DB 0 ;FAX DB 1 ;MODEM DB 2 ;PHONE 1 DB 3 ;PHONE 2 DB 4 ;PHONE 3 DB 5 ;PHONE 4 DB 6 ;PHONE 5 DB 7 ;DEFAULT DB 0 ;FAX DB 1 ;MODEM DB 2 ;PHONE 1 DB 3 ;PHONE 2 DB 4 ;PHONE 3 DB 5 ;PHONE 4 DB 6 ;PHONE 5 ;THIS ROUTINE CONTROLS THE RERING OF THE ;LOGICAL PORTS IN R5 AND R6. IT IS CALLED ;FROM MAIN. RRNG: MOV A,R5 ADD A,#FAX MOV R0,A MOV A,@R0 ORL A,#80H ;SET DB7 MOV R5,A ;GET BIT PATTERN MOV A,R6 ADD A,#FAX MOV R0,A MOV A,@R0 ORL A,#80H ;SET DB7 MOV R6,A ;SET UPPER RRNG1: MOV R0,#DBLRNG MOV A,@R0 JNZ RRNG5 ;IF DOUBLE SET MOV R4,#20 ;SET 1 SEC CALL RNGB ;DO RING BURST JNZ RRNG4 ;IF LINE ANSWERED RRNG2: MOV R1,#TMR45 MOV @R1,#0B8H ;SET 4.5 SECS CALL LNMN ;DO RING PAUSE XRL A,#7 JNZ RRNG6 ;IF LINE ANSWERED JF1 RRNG3 ;IF INBOUND CALL ATCK ;CHECK IF RING DOWN JZ RRNG4 ;IF ORIG ON HOOK RRNG3: MOV R0,#RNGDLY MOV A,@R0 DEC A MOV @R0,A ;DECR DELAY JNZ RRNG1 CLR A ;SET NO ANSWER RRNG4: MOV R0,#DBLRNG MOV @R0,#0 ;CLEAR DOUBLE RING ANL P2,#0DFH ;RELEASE RING RET RRNG5: MOV R4,#7 ;SET 700 MSEC CALL RNGB JNZ RRNG4 ;IF LINE ANS MOV R1,#TMR45 MOV @R1,#28 ;SET 700 MSEC CALL LNMN XRL A,#7 JNZ RRNG6 ;IF LINE ANS MOV R4,#7 CALL RNGB ;DO SECOND BURST JNZ RRNG4 ;IF ANS JMP RRNG2 RRNG6: XRL A,#7 ;REVERT BACK RET ;THIS ROUTINE IS THE SCAN FOR VALID SECURITY ;CODE ENTRIES. IT IS CALLED FROM ANSW. SEQD: MOV R0,#SECD0 MOV R4,#32 CLR A SEQD0: ORL A,@R0 INC R0 ;OR ALL CODES DJNZ R4,SEQD0 JZ SEQD6 ;IF NO CODES ENTERED MOV R0,#TONBUF ;SET DATA PNTR MOV R4,#0 ;SET WHICH CHANNEL MOV R5,#0 ;RESET BYTE PNTR CLR F0 CPL F0 ;SET FIRST BYTE FLAG SEQD1: MOV A,R4 RL A RL A ;MULT BY 4 ADD A,R5 ADD A,#SECD0 MOV R1,A MOV A,@R1 ;READ TABLE JZ SEQD7 ;IF DONT CARE CLR F0 ;KILL FIRST DIGIT MOV A,@R0 ;READ BUFFER INC A JZ SEQD3 ;IF EOF DEC A XRL A,@R1 JNZ SEQD3 ;IF NO MATCH SEQD2: INC R0 ;INCR POINTERS INC R5 MOV A,R5 CPL A JB2 SEQD1 ;IF NOT ALL CODE MOV A,R4 XRL A,#7 JZ SEQD5 ;IF DBL RNG CODE MOV A,R4 CALL RSET ;SET UP LOGICALS RET ;SET WHICH CHANNEL SEQD3: MOV R5,#0 ;RESET BYTE PNTR CLR F0 CPL F0 ;SET FIRST BYTE FLG MOV R0,#TONBUF INC R4 MOV A,R4 XRL A,#8 JNZ SEQD1 ;IF NOT ALL CODES SEQD4: MOV A,#0FFH ;SET NONE FOUND RET SEQD5: MOV R0,#DBLRNG MOV @R0,#0FFH ;SET DOUBLE RING SEQD6: MOV A,#7 CALL RSET ;SET UP LOGICALS RET ;SET DEFAULT SEQD7: JF0 SEQD3 ;IF FIRST DIGIT JMP SEQD2 ;THIS ROUTINE IS THE HANG-UP SEQUENCE THAT ;CLEARS ALL THE FLAGS WHEN A CALL IS TERMINATED. ;IT IS CALLED FROM MAIN. HNGP: CLR A OUTL BUS,A ;DISC LINE MOV R0,#BUFPTR MOV @R0,A ;CLEAR BUFF PNTR MOV R0,#DBLRNG MOV @R0,A ;CLEAR DOUBLR RING MOV R0,#DESTIN MOV @R0,A ;CLEAR DESTINATIONS CLR F1 ;CLEAR INBOUND ANL P2,#0DFH ;ENABLE RING MOV R0,#ORIG0 MOV @R0,A ;CLEAR ORIGINS INC R0 MOV @R0,A RET ;THIS ROUTINE SETS UP THE LOGICAL DEVICE ;NUMBERS. RSET: MOV R2,A ;SAVE TEMP MOV R0,#LOGICL MOV @R0,A RET ;THIS ROUTINE TERMINATES A CALL AND DELAYS ;1.28 SECONDS BEFORE EXITING. TERM: MOV A,#80H OUTL BUS,A ;DISC ALL ANL P2,#0DFH ;DISC RING KILL MOV R4,#11 TERM1: CALL WAIT DJNZ R4,TERM1 CALL HNGP ;RESET BUS & VARIABLES RET ;THIS IS THE ANSWER LOOP FOR INBOUND CALLS. ;IT SEQUENCES THE CALL COMING IN. ANSW: CPL A ;ACC HAS LINE DETECT VAL JB7 ANSWB ;IF NOT A DIGIT MOV R0,#SECURE MOV A,@R0 JZ ANSWA ;IF NO SECUR REQ CALL SCIN JZ ANSW4 ;IF NO CODES IN CALL SEQD ;DO SECURITY DECODE INC A JZ ANSW0 ;IF NOT VALID CODE XRL A,#8 JZ ANSW4 ;IF DEFAULT JMP ANSW5 ANSW0: CALL REQD ;CHECK FOR COMMAND INC A JZ ANSW3 ;IF NOT A VALID DEVICE DEC A CALL CDCK JZ ANSW5 ;IF NO SECURITY ENTERED JMP ANSW3 ;DO HANG-UP ANSW1: XRL A,#7 JNZ ANSW3 ;IF NOT DEFAULT MOV R0,#DEFDLY MOV A,@R0 XRL A,#0AH JZ ANSW3 ;IF DEFAULT RING=10 MOV R0,#SECURE MOV A,@R0 JZ ANSW2 ;IF SECURITY NOT REQ CLR A CALL CDCK JNZ ANSW3 ;IF FAX HAS SECURE CODE ANSW2: CALL FAXS ANSWZ: CALL ORST ;SET ORIGINS CALL RRNG ;RERING FAX XRL A,#7 JNZ ANSW9 ;IF ANSWER ANSW3: MOV A,#0FFH RET ;SET HANG-UP ANSW4: CALL DFST ;SET UP DEFAULT ANSW5: CALL ORST ;SET ORIGINS MOV A,R2 CALL RSET ;SET UP LOGICAL XRL A,#7 JZ ANSW7 ;IF DEFAULT MOV R0,#RNGDLY MOV @R0,#5 ANSW7: CALL RRNG XRL A,#7 JNZ ANSW9 ;IF LINE ANSWERED MOV R0,#LOGICL MOV A,@R0 ADD A,#0FEH MOV A,@R0 JC ANSW1 ;IF NOT FAX OR MODEM MOV R0,#SECURE MOV A,@R0 JZ ANSW8 ;IF NO SECURITY REQ MOV A,#7 CALL CDCK JNZ ANSW3 ;IF DEFAULT SECURITY ANSW8: CALL DFST JMP ANSWZ ANSW9: CLR A RET ;SET ACTIVE ANSWA: CALL REQD INC A JNZ ANSW5 ;IF REQUEST FOUND JMP ANSW4 ANSWB: CPL A CALL RSET ;SET UP LOGICAL # MOV R0,#SECURE MOV A,@R0 JZ ANSWC ;IF NO SECURITY REQ CALL SCIN JZ ANSW4 ;IF NO CODES IN MOV A,R2 CALL CDCK JNZ ANSW3 ;IF SECURITY FOUND ANSWC: MOV A,R2 XRL A,#7 JZ ANSW4 ;IF DEFAULT SET JMP ANSW5 ;THIS ROUTINE DECODES THE SELECT DIGIT. IT ;IS CALLED FROM ANSW. REQD: MOV R0,#TONBUF MOV R4,#0 MOV R5,#REQTBL-300H CLR F0 ;SET BYTE PNTR REQD1: MOV A,@R0 ;READ DIGIT INC A JZ REQD4 ;IF EOF MOV A,R5 MOVP3 A,@A ;READ TABLE XRL A,@R0 JNZ REQD2 ;IF NO MATCH INC R0 ;INCR POINTERS INC R5 CPL F0 JF0 REQD1 ;IF NOT SECOND MOV A,R4 ;GET LOGICAL PNTR ADD A,#TYPTBL-300H MOVP3 A,@A ;READ TYPE TABLE CALL RSET ;SET UP LOGICALS RET REQD2: INC R5 ;INCR TABLE POINTER JF0 REQD3 ;IF SECOND BYTE INC R5 REQD3: MOV R0,#TONBUF ;RESET POINTERS CLR F0 INC R4 MOV A,R4 XRL A,#15 JNZ REQD1 ;IF NOT ALL REQD4: MOV A,#0FFH ;SET NONE FOUND RET ;THIS ROUTINE SETS UP THE DEFAULT PORTS. IT IS ;CALLED FROM PRGM. DFPT: MOV R0,#BUFPTR MOV A,@R0 ADD A,#0FEH MOV R0,#TONBUF+2 JZ DFPT3 ;IF PNTR=2 DEC A JZ DFPT1 ;IF=3 INC R0 ;PNTR=4 MOV A,@R0 DEC A ;FORMAT DIGIT CALL LIMT ;LIMIT VALUE MOV R0,#DFLT1 MOV @R0,A ;UPDATE SECOND RET DFPT1: MOV A,@R0 DEC A ;FORMAT FIRST DIGIT CALL LIMT ;LIMIT VALUE DFPT2: MOV R0,#DFLT0 MOV @R0,A ;WRITE BOTH INC R0 MOV @R0,A RET DFPT3: MOV A,#2 ;SET POWER-UP VALUE JMP DFPT2 ;THIS ROUTINE SETS UP THE PROPER LOGICAL PORT ;FOR THE FAX DEPENDING ON P21. FAXS: MOV R0,#RNGDLY MOV @R0,#5 ;SET RING DELAY MOV R3,#8 ;SET PORT MASK MOV A,R7 JB1 FAXS1 ;IF J5 INSTALLED MOV R3,#4 FAXS1: CLR A MOV R2,A ;CLEAR LOGICAL MOV R4,A ;CLEAR TABLE PNTR MOV A,R7 JB4 FAXS2 ;IF FIRST TABLE VALID MOV R4,#7 FAXS2: MOV A,R4 MOVP3 A,@A ;READ TABLE XRL A,R3 JZ FAXS3 ;IF TABLE=MASK INC R2 ;SET OTHER JACK FAXS3: MOV A,R2 MOV R5,A ;SET RERING LOGICALS MOV R6,A RET ;THIS ROUTINE FIXES THE TONE BUFFER IF IN THE ;PROGRAMMING MODE, AND ANOTHER "*" IS ENTERED. ;IT IS CALLED FROM PRGM. CMCK: MOV R0,#DIGIT MOV A,@R0 ;GET NEW DIGIT MOV R0,#TONBUF MOV @R0,A ;ADJUST BUFFER INC R0 MOV @R0,#0FFH ;SET EOF MOV R0,#BUFPTR MOV @R0,#1 ;RESET POINTER RET ;THIS IS THE ROUTINE FOR THE ACTIVE LOOP ;WHEN A LINE IS ON THE UNIT. ACTV: JF1 ACTV0 ;IF INBOUND JMP ACTVZ ACTV0: JT0 ACTV3 ;IF CPC ACTVZ: MOV R0,#ORIGIN ;GET ORIGINS MOV A,@R0 ACTV1: OUTL BUS,A ;DO NOT GRAB LINE ORL P1,#0FFH ;SET TO INPUT MOV R5,#118 ACTVA: DJNZ R5,ACTVA ;WAIT 1 MSEC ACTV2: IN A,P1 JB6 ACTV4 ;IF DIGIT IN JB7 ACTV2 ;IF P17 STILL ACTIVE MOV R0,#DESTIN MOV A,@R0 ANL A,#0CH JNZ ACTV3 ;IF FAX OR MODEM CALL FLSH ;DO HOOK FLASH DECODE JB0 ACTV2 ;IF LOOP SET JB1 ACTV6 ;IF XFER ACTV3: MOV A,#0FFH ;SET HANG-UP RET ACTV4: ANL A,#0FH MOV R2,A ;SAVE DATA MOV R0,#DIGIT MOV @R0,A ;SAVE DIGIT ACTV5: IN A,P1 JB6 ACTV5 ;IF DV STILL ON MOV R0,#BUFPTR MOV A,@R0 XRL A,#8 JZ ACTV2 ;IF BUFFER FULL MOV A,@R0 ADD A,#TONBUF INC @R0 ;INCR PNTR MOV R0,A ;SET NEXT MOV A,R2 MOV @R0,A ;WRITE DIGIT INC R0 MOV @R0,#0FFH ;SET EOF CALL COMD ;DO COMMAND DECODE MOV R5,A ;SAVE LOGICAL # JB7 ACTV2 ;NEED MORE DIGITS ACTV6: MOV A,R5 XRL A,#7 JZ ACTV9 ;IF DEFAULT SET MOV R0,#RNGDLY MOV @R0,#5 ;SET RING DELAY MOV A,R5 MOV R6,A ;SET TWO EQUAL ACTVB: MOV A,R5 MOV R0,#DEST0 MOV @R0,A ;SET FIRST DEST INC R0 MOV A,R6 MOV @R0,A ;SET SECOND ADD A,#FAX MOV R0,A MOV A,R5 ;FORM MASK ADD A,#FAX MOV R1,A MOV A,@R1 ORL A,@R0 MOV R0,#DESTIN MOV @R0,A ;SET DESTIN MASK ORL A,#1 ;GRAB LINE OUTL BUS,A CALL RRNG ;DO RERING XRL A,#7 JNZ ACTV8 ;IF DEST ANSW MOV R0,#ORIGIN MOV A,@R0 ORL A,#1 ;GRAB LINE OUTL BUS,A MOV R2,A ;SAVE ORIGS MOV R3,#118 ACTV7: DJNZ R3,ACTV7 ;WAIT 1 MSEC IN A,P1 JB7 ACTV8 ;IF ORIGANAL OFF HOOK MOV R0,#RNGDLY MOV @R0,#5 ;SET RING DELAY MOV R0,#ORIG0 MOV A,@R0 MOV R5,A ;SET LOGICAL #'S INC R0 MOV A,@R0 MOV R6,A MOV A,R2 CALL RRNG ;RERING ORIGANAL XRL A,#7 JZ ACTV3 ;IF NOT ANSWERED JMP ACTV ACTV8: MOV R0,#DESTIN MOV A,@R0 ANL A,#0CH JNZ ACTVC ;IF DEST=FAX,MOD CALL RQCK ;CHECK WHOS ON JMP ACTV1 ACTV9: MOV R0,#DEFDLY MOV A,@R0 MOV R0,#RNGDLY MOV @R0,A ;SET UP RING DELAY MOV R0,#DFLT0 MOV A,@R0 MOV R5,A ;SET UP DEFAULTS INC R0 MOV A,@R0 MOV R6,A JMP ACTVB ACTVC: MOV A,@R0 ;GET FAX,MOD DEST JMP ACTV1 ;THIS ROUTINE IS THE DECODER FOR THE ;COMMANDS RECEIVED IN THE ACTIVE LOOP. IT IS ;CALLED FROM ACTV. COMD: MOV R0,#TONBUF MOV A,@R0 XRL A,#0CH JZ COMDA ;IF XFER ON MOV A,@R0 XRL A,#0BH JZ COMD9 ;IF PROGRAM ON COMD4: MOV A,#80H ;RET MORE DIGITS REQ RET COMD9: JF1 COMD4 ;IF INBOUND CALL CALL PRGM ;DO PROGRAMMING JMP COMD4 COMDA: MOV R0,#TONBUF+1 MOV A,@R0 INC A JZ COMD4 ;IF NOT ENOUGH DIGITS DEC A XRL A,#0AH JNZ COMDD ;IF DIGIT<>0 COMDB: MOV A,#7 ;SET DEFAULT COMDC: MOV R0,#BUFPTR MOV @R0,#0 ;RESET BUFFER PNTR RET COMDD: MOV A,@R0 XRL A,#0BH JZ COMDE ;IF DIGIT="*" MOV A,@R0 ADD A,#0F9H JC COMDB ;IF > 6 ENTERED MOV A,@R0 DEC A JMP COMDC ;ACC HAS LOGICAL # COMDE: CALL CMCK ;ADJUST COMAND JMP COMD4 ;THIS ROUTINE LIMITS THE VALUE IN THE ACC ;BETWEEN 0 TO 6. IF A HIGHER NUMBER IS FOUND, ;IT IS CHANGES IT TO A "2". LIMT: MOV R0,A ;SAVE VALUE ADD A,#0F9H JNC LIMT1 ;IF VALUE O.K. MOV R0,#2 ;SET POWER-UP DEFAULT LIMT1: MOV A,R0 RET ;THIS ROUTINE UPDATES THE ORIGIN WORDS. IT ;IS CALLED FROM IDLP. ORUP: MOV R2,#0 ;SET RESULT MOV R3,A ;SAVE BIT PATTERN MOV R0,#FAX ORUP1: MOV A,@R0 XRL A,R3 JZ ORUP2 ;IF MATCH INC R2 INC R0 MOV A,R2 XRL A,#7 JNZ ORUP1 ;IF NOT ALL ; R2 HAS DEFAULT 7 ORUP2: RET ;THIS ROUTINE DOES THE SECURITY CODE ENTRY. ;IF CHANNEL SELECT > 7 THEN IT IS SET TO 1. IT IS ;CALLED FROM PRGM. SCST: MOV R0,#TONBUF+2 MOV A,@R0 ;READ WHICH CODE DEC A MOV R2,A ;SAVE ADD A,#0F8H MOV R0,#SECURE JNC SCST0 ;IF CHANNEL<9 MOV @R0,#0 ;KILL SECURITY REQ RET SCST0: MOV @R0,#0 ;CLEAR SECURITY REQ MOV A,R7 CPL A JB0 SCST1 ;IF NO SEC NEEDED MOV @R0,#0FFH SCST1: MOV A,R2 RL A RL A ;FORM TABLE PNTR SCST2: ADD A,#SECD0 MOV R2,A ;SAVE PNTR MOV R0,#BUFPTR MOV A,@R0 XRL A,#3 JNZ SCST4 ;IF MORE THAN 3 DIGITS MOV A,R2 MOV R0,A MOV R3,#4 SCST3: MOV @R0,#0 ;CLEAR ALL DIGITS INC R0 DJNZ R3,SCST3 RET SCST4: MOV A,@R0 ADD A,#0F8H ;IF TOO MANY DIGITS JC SCST5 MOV A,@R0 ADD A,#0FCH ;ADJUST TO 0 ADD A,R2 ;FORM TABLE DIGIT PNTR MOV R3,A ;SAVE MOV R0,#DIGIT MOV A,R3 MOV R1,A ;SET TABLE POINTER MOV A,@R0 MOV @R1,A ;DO WRITE SCST5: RET ;THIS ROUTINE IS THE REMOTE PROGRAMMING FOR ;THE UNIT. IT IS CALLED FROM COMD. PRGM: MOV R0,#DIGIT MOV A,@R0 XRL A,#0BH JZ PRGM1 ;IF "*" ENTERED MOV A,@R0 XRL A,#0CH JNZ PRGM2 ;IF NOT A "#" PRGM1: CALL CMCK ;DO COMMAND UPDATE RET PRGM2: MOV R0,#BUFPTR MOV A,@R0 ADD A,#0FEH JNC PRGM4 ;IF <2 DIGITS IN MOV R0,#TONBUF+1 MOV A,@R0 ;GET SECOND DIGIT DEC A JZ PRGMB ;IF DEFAULT RING DELAY DEC A JZ PRGM5 ;IF DEFAULT PORTS DEC A JZ SCST ;IF SECURITY CODES PRGM3: MOV R0,#BUFPTR MOV @R0,#0 ;RESET BUFFER POINTER PRGM4: RET PRGM5: JMP DFPT ;DO DEFAULT ;********* DEFAULT RING DELAY *********** PRGMB: MOV R0,#BUFPTR MOV A,@R0 XRL A,#3 JNZ PRGM4 ;IF NOT 3RD DIGIT MOV R0,#TONBUF+2 MOV A,@R0 MOV R0,#DEFDLY MOV @R0,A ;UPDATE DEFAULT DELAY JMP PRGM3 ;THIS ROUTINE PRODUCES A 1KHZ TONE WHEN THE ;LINE IS FIRST ANSWERED. IT IS CALLED FROM ;MAIN. TONE: MOV R4,#250 ;SET BURST TIME MOV R0,#SECURE MOV A,@R0 JZ TONE6 ;IF NO SECURITY TONE1: STOP TCNT ORL P2,#20H ;TURN ON TONE MOV A,#0FBH MOV T,A STRT T ;SET TIMER TO 745 HZ TONE2: JTF TONE3 ;IF TIME UP JNT0 TONE2 ;IF NO CPC MOV A,#0FFH ;SET HANG-UP RET TONE3: STOP TCNT ANL P2,#0DFH ;TURN OFF TONE DJNZ R4,TONE4 ;IF NOT 250 MSEC CLR A ;SET OK RET TONE4: MOV A,#0FBH MOV T,A STRT T ;SET TIMER TO 745 HZ TONE5: JTF TONE1 ;IF TIME UP JNT0 TONE5 ;IF NO CPC MOV A,#0FFH ;SET HANG-UP TONE6: RET ;THIS ROUTINE DETERMINES IF IN THE RING DOWN ;MODE, IF THE ORIGINATOR IS STILL OFF HOOK. ;ACC=0 MEANS RING DOWN AND ON HOOK. ATCK: MOV A,R7 ANL A,#6 XRL A,#4 JZ ATCK1 ;IF RING DOWN ATCK0: RET ATCK1: MOV R0,#ORIGIN MOV A,@R0 ORL A,#1 ;GRAB LINE OUTL BUS,A MOV R3,#20 ;WAIT 10 MSEC CALL WAIT IN A,P1 MOV R3,A ;SAVE ACTIVE STATUS MOV R0,#DESTIN MOV A,@R0 ORL A,#1 OUTL BUS,A ;RESET DESTINATION MOV A,R3 JB7 ATCK0 ;IF ORIGIN OFF HOOK CLR A ;SET TERMINATE ATCK2: RET ;THIS ROUTINE PAUSES .5 MSEC FOR EACH COUNT IN R3 WAIT: MOV R2,#40H WAIT1: DJNZ R2,WAIT1 MOV R2,#40H DJNZ R3,WAIT1 RET ;THIS IS THE LOOP FOR THE RING DOWN CIRCUIT ;SOFTWARE, IT IS AN EXTENTION OF MAIN. RGDN: CALL IDLP ;LOOK FOR ACTIVITY ANL A,#0AH JZ RGDN ;IF NOT D1 OR D3 MOV A,#2 MOV R0,#DESTIN MOV R5,A ;SET PHONE MOV R6,A MOV @R0,A ;SET PHONE DEST DEC R0 MOV @R0,#8 ;SET FAX ORIG JB3 RGDN4 ;IF D3 ON CLR A MOV R5,A ;SET FAX RERING MOV R6,A MOV @R0,#2 ;SET PHONE ORIG INC R0 MOV @R0,#8 ;SET FAX DEST RGDN4: MOV R0,#RNGCNT MOV A,@R0 MOV R0,#RNGDLY ;SET UP RING DELAY MOV @R0,A CALL RRNG ;RERING OTHER PORT XRL A,#7 MOV R4,A ;SAVE RESULT MOV R0,#ORIGIN MOV A,@R0 OUTL BUS,A ;SELECT ORIGIN MOV R3,#4 CALL WAIT ;DELAY 2 MSEC MOV A,R4 JZ RGDN5 ;IF NO ANSWER MOV A,#0AH OUTL BUS,A ;ENABLE BOTH RGDN5: IN A,P1 JB7 RGDN5 ;IF LINE STILL ACTIVE RGDNZ: CALL HNGP ;DO HANG-UP JMP RGDN ;THIS ROUTINE CHECKS TO SEE WHICH STATIONS ;ARE OFF HOOK. IT RETURNS THE BIT PATTERN ;IN THE ACC. RQCK: MOV R4,#2 ;BIT MASK MOV R5,#0 ;RESULT MOV R6,#7 ;LOOP CNTR RQCK1: MOV A,R4 ORL A,#1 ;GRAB LINE OUTL BUS,A MOV R3,#10 ;PAUSE 5 MSEC CALL WAIT IN A,P1 CPL A JB7 RQCK2 ;IF P17 OFF MOV A,R5 ORL A,R4 ;UPDATE RESULT MOV R5,A RQCK2: MOV A,R4 RL A MOV R4,A ;ROTATE MASK DJNZ R6,RQCK1 ;IF NOT ALL MOV A,R5 ;GET RESULT RET ;THIS ROUTINE CHECKS THE SECURITY CODES TO SEE ;IF ANY HAVE BEEN ENTERED. IT IS CALLED FROM ;ANSW. SCIN: MOV R0,#SECD0 MOV R4,#32 CLR A SCIN1: ORL A,@R0 ;OR IN NEXT INC R0 DJNZ R4,SCIN1 ;IF NOT ALL RET ;THIS ROUTINE IS THE SEQUENCING FOR THE RADIO ;SHACK VERSION. IT IS CALLED FROM MAIN. RDSKX: CALL HNGP RDSK: MOV A,#7EH OUTL BUS,A ;SET ALL ENABLES ORL P1,#0FFH ;SET TO INPUT CLR F0 ;CLEAR # RECVD FLG RDSK0: JT1 RDSK7 ;IF OUTBOUND JNI RDSK0 ;IF NO RING RDSK1: CLR A OUTL BUS,A ;CONNECT LINE TO PHONE CLR F1 CPL F1 ;SET INBOUND MOV R2,#46H ;SET 4.5 SECONDS RDSK2: CALL RGDT ;DO RING DETECT JT1 RDSKY ;IF LINE ANSWERED DJNZ R2,RDSK2 ;IF 4.5 SEC NOT UP RDSK3: CALL TERM ;DO HANG-UP JMP RDSK RDSKY: ORL P2,#20H ;LOAD FOR TOUCH TONES RDSK4: IN A,P1 JB6 RDSK5 ;IF DIGIT IN JT1 RDSK4 ;IF STILL ACTIVE CALL FLSH ;DO HOOK FLASH JZ RDSKX ;IF HANG-UP JB0 RDSK4 ;IF LOOP JMP RDSKZ ;DO XFER RDSK5: MOV R2,A ;SAVE DATA IN A,P1 JB6 RDSK5 ;IF DV STILL ON CALL DECD ;DECODE DATA JZ RDSK4 ;IF MORE DIGITS DEC A MOV R5,A MOV R6,A ;SET UP RERING RDSKZ: MOV R0,#RNGDLY MOV @R0,#5 MOV A,#81H OUTL BUS,A ;GRAB LINE MOV R3,#10 ;PAUSE CALL WAIT CALL RRNG ;RERING PORT XRL A,#7 JZ RDSK3 ;IF NO ANSWER ORL A,#80H ;DISC PHONE OUTL BUS,A ;SET ONLY STATION RDSK6: IN A,P1 JB7 RDSK6 ;IF STILL ACTIVE JMP RDSK3 RDSK7: JNI RDSK8 ;IF NO RING JMP RDSK1 RDSK8: IN A,P1 JB7 RDSKA ;IF P17 ACTIVE CLR A ;CONNECT PHONE OUTL BUS,A JMP RDSKY RDSKA: CALL BFTM ;FIND REQUESTOR JZ RDSK3 ;IF ERROR FOUND ORL A,#80H ;DISC PHONE OUTL BUS,A ;WRITE MASK RDSKB: MOV R4,#25 RDSKC: IN A,P1 JB7 RDSKB ;IF STILL ACTIVE MOV R3,#20 CALL WAIT ;WAIT 10 MSEC DJNZ R4,RDSKC ;IF NOT 250 MSEC JMP RDSK3 ;THIS ROUTINE WATCHES THE INTERRUPT LINE FOR A RING, ;AND RETURNS WHEN THE RING IS COMPLETED. IT IS ;CALLED FROM RDSK. RGDT: MOV R6,#20H RGDT1: STOP TCNT MOV A,#0F1H MOV T,A ;RESET TIMER TO 2 MSEC STRT T JNI RGDT3 ;IF NO RING MOV A,R6 ADD A,#20H MOV R6,A ;INCR UP COUNT JNC RGDT2 ;IF NO OVER FLOW MOV R6,#0FFH MOV R2,#46H ;RESET 4.5 SEC JMP RGDT1 RGDT2: JTF RGDT1 ;IF TIMER UP JMP RGDT2 RGDT3: MOV A,R6 ADD A,#0FFH ;DECR COUNT MOV R6,A JC RGDT2 ;IF NOT MIN RET ;THIS ROUTINE DECODES THE INCOMING DATA AND WATCHES ;FOR A #+TRANSFER CODE. THEN IT RETURNS THE APPROPRIATE ;LOGICAL NUMBER. IT IS CALLED FROM RDSK. DECD: MOV A,R2 ANL A,#0FH MOV R2,A ;SAVE DIGIT XRL A,#0CH JZ DECD1 ;IF "#" JF0 DECD2 ;IF # WAS IN DECD0: CLR F0 CLR A ;SET MORE DIGITS REQ RET DECD1: CLR F0 CPL F0 ;SET # IN RET DECD2: MOV A,R2 ADD A,#0FDH JC DECD0 ;IF STATION>2 MOV A,R2 RET ;THIS IS THE REV LEVEL IDENT ORG 7FFH DB 10H END