;LAST UPDATE 5/12/85 12:10 BY MTM $TITLE(ANSWER MODE OF THE MODEM) ; ;THIS SECTION OF CODE DEALS WITH THE MODEM IN THE ANSWER MODE ;THE 2 SEC BILLING ;DELAY AND THE 18 SEC ABORT TIMER ARE STARTED. AFTER THE 2 SEC BILLING DELAY ;THE ANSWER TONE OF 2225 HZ IS SENT VIA THE 103 CHIP BY SENDING A 103 MARK, ;WHICH HAPPENS TO BE 2225 HZ ALSO. IF THE CALLING MODEM IS 103, WE SHOULD SEE ;103ED COMES ON AND WE PROCEED AS AN 103 MODEM. HOWEVER, IF 212ED COMES ON, WE ;PROCEED TO CHECK WHETHER WE ARE GETTING 270MS OF SCRAMBLED MARK. IF SO ;PROCEED AS 212 MODEM. ; ;***************************************************************** ; TIMER CONSTANTS FOR 600HZ EXTERNAL CLOCK ;***************************************************************** ; M_1SEC EQU 600 M_2SEC EQU 1200 ;2 SECOND TIME CONSTANT M_3SEC EQU 1800 M_4SEC EQU 2400 M_24SEC EQU 14400 ;16 SEC TIME CONSTANT M_140MS EQU 84 ;140 MS TIME CONSTANT M_765MS EQU 459 ;765MS CONST M_600MS EQU 360 M_60MS EQU 36 M_400MS EQU 240 ;1 BYTE M_365MS EQU 219 ;1 BYTE TOTAL OR 765MS ; ;*********************************************************************** ;ANS_MOD - THIS IS THE ENTRY POINT FOR THE ANSWER MODE. ; ENTRANCE: JUMP ; DESTROYS: ; CALLS: ; I/O: ; EXITS: MODEM ROUTINE ON SUCESSFULL HANDSHAKE ; IDLE LOOP ON UNSUCESSFULL HANDSHAKE ; ;*********************************************************************** ; ANS_MOD: MOV IE,#11100000B ;CLR ALL INTERR CLR TR1 SETB CLP_SYN CLR SCRAMEN ;DISABLE SCRAMBLER CALL INIT_FLG CALL INIT_PTR ; ; TWO SECOND BILLING DELAY ; MOV TMOUT_LO,#LOW(BILL_DLY) MOV TMOUT_HI,#HIGH(BILL_DLY) MOV TMCON_LO,#LOW(-M_2SEC) MOV TMCON_HI,#HIGH(-M_2SEC) CALL TM_TRAP WAIT3: CLR TSTB_5 SETB TSTB_5 ; SJMP WAIT3 ; BILL_DLY: CALL UNTRAP ; ; BILLING DELAY FINISHED, NOW SET TO 300 BAUD ANSWER MARK. ; ANS_1: CLR SPEED ;SET TO 300 BAUD SETB HAND_SHK ;SET HANDSHAKE ON SETB XMITEN ;ENABLE TRANSMITTER OUTPUT SETB MTXD ;MARK TO PHONE LINE ; ; SET 24 SECOND ABORT TIMER ; JNB TIME_DIS,CK_ED2 ;BRANCH IF NO ABORT TIMER MOV TMOUT_LO,#LOW(PWR2) MOV TMOUT_HI,#HIGH(PWR2) MOV TMCON_LO,#LOW(-M_24SEC) MOV TMCON_HI,#HIGH(-M_24SEC) CALL TM_TRAP ;THE ABORT TIMER, 17.87-2=15.87 SEC ; CK_ED2: CLR IE.2 ;MAKE SURE SCR INT IS OFF SETB HUNT_FLG ;SEE WHETHER I AM GETTING SCRAM MK SETB DLIN_RXD CLR RVDOT_FLG ; CK_ED3: JB ED_103,CK_ED5 ;SEE 103 ENERGY, THEN BRANCH IF IT'S THERE ; JNB ED_212,CK_ED3 ;BRANCH IF NO 212 ENERGY ; CK_SCRM:SETB IE.2 ;ENABLE SCR CLK TO CHK FOR LO BAND SCRM MK MOV A,#M_60MS CALL GET_TYM CK_1: SETB HUNT_FLG CALL CHK_TYM ;DELAY FOR 60MS JNC CK_1 MOV A,#M_140MS CALL GET_TYM C_SCRM1:MOV C,HUNT_FLG ANL C,DLIN_RXD JC C_SCRM2 ;SEE SCRM MK,MAKE SURE IT IS 270MS WORTH SETB HUNT_FLG ;TRY AGAIN IF TIME PERMITS CALL CHK_TYM ;IS 140MS TIME UP JNC C_SCRM1 ;NO, SEE WHETHER I AM GETTING SCRAM MK CK_EDD2:JMP CK_ED2 C_SCRM2:MOV A,#(2*M_140MS) ;DETECT FOR 280MS OF SCRM MK CALL GET_TYM C_SCRM3:MOV C,HUNT_FLG ANL C,DLIN_RXD JNC CK_ED2 ;SEE MK, CHK FOR TIME UP CALL CHK_TYM JNC C_SCRM3 ;NO, NOT YET TIME SJMP SND_MK ; ; CHECK FOR 103 MARK ; CK_ED5: CLR IE.2 MOV A,#M_140MS ;NO LUCK,HUNT FOR 103 CALL GET_TYM C1_103: JNB ED_103,CK_ED2 ;LOSS CARRIER, CK FOR 212 AGAIN CALL CHK_TYM JNC C1_103 MOV A,#M_400MS ;SEE 140 MS OF 103 ENERGY CALL GET_TYM ;SET 400MS DELAY CKK_103:JNB ED_103,CK_ED2 ;NO WAY JOSE, LOSE ENERGY,START ALL OVER CALL CHK_TYM ;IS 400MS UP YET JNC CKK_103 ;NO, KEEP CHKING ENERGY MOV A,#M_365MS ; CALL GET_TYM ;SET TOTAL OF 765MS DELAY ; CKJ_103:JNB ED_103,CK_ED2 ;BRANCH IF ENERGY LOSS CALL CHK_TYM JNC CKJ_103 ;BRANCH IF 765MS NOT FINISHED CLR B212_FLG ;103 MODE SETB STAM ;TELL DTE 103 MODE CLR HAND_SHK ;NO NEED FOR HANDSHAKE ANY MORE JNB ANS_SEL,CTS_CXR ;ANS ONLY IN 212 MODE CALL UNTRAP MHOME: JMP PWR2 CTS_CXR:JNB TIME_DIS,CTS_XXX CALL UNTRAP ;ATOP THE ABORT TIMER CTS_XXX:CLR TF0 CLR TR0 ;STOP TIMER 0 - GET_TYM + CHK_TYM NO WORKIE CLR ET0 CLR BBB_FLG CLR SNDOT_FLG CLR RVDOT_FLG CLR DOT_ERR CLR CLP_SYN SETB CXRFLG CLR SDMK_FLG ; ; OUTPUT CXR AND CTS TO DTE ; SETB CXR_BIT ;CXR IS ACTIVE HIGH CLR CTS_S ;CTS BIT IS ACTIVE LO EXAR ; MOV IRT_CNT,#0FFH MOV TH1,#(-164) MOV TL1,#(-164) MOV C,B212_FLG ANL C,SYN_FLG ;IS IT SYN MODE? JC TYM1 ;YES, DON'T EN TIMER1 CALL I_PTR1 SETB IE.3 ;ENABLE TIMER 1 INTERR, SYSTEM TICKER CLR DT_DET ;DON'T LOOK FOR DIAL TONE **5/2/85 SETB TR1 ;LET TIMER1 RUN TYM1: SETB DISBIT ; ;********************************************************************* ;EXIT TO MODEM ;********************************************************************* ; JMP MODEM ;BEHAVE LIKE AN 103 MODEM ; ; ; ; 280MS OF SCRAMBLED MARK DETECTED, START SENDING SCRAMBLED MARK BACK ; SND_MK: SETB SPEED ;TELL EXAR CHIP IT'S IN HI SPEED MODE CLR SNDOT_FLG ;SND SCRAMBLE MARK SETB SDMK_FLG ;SEND SCRM MK IN SYN MODE SETB SCT_PIP ; ; SET UP FOR 212 ; SETB IE.0 ;ENABLE SCT CLK MOV A,#M_400MS ;SEND 765MS OF SCRAMBLED MARK, THEN TURN ON ;CTS AND CXR CALL GET_TYM CKK_212:CALL CHK_TYM JNC CKK_212 ; MOV A,#M_365MS ;CHOPPED IN TWO BECAUSE OF 600HZ TIMER CALL GET_TYM CKJ_212:CALL CHK_TYM JNC CKJ_212 ; SETB HUNT_FLG SETB DLIN_RXD SETB B212_FLG CALL SET_FRM CLR HAND_SHK ;TURN OFF HANDSHAKE TO EXAR CHIP CLR STAM ;TELL DTE I'M IN 212 MODE SJMP CTS_CXR ;TURN THEM ON AND BEHAVE LIKE A 212 MODEM ; ; $EJECT ;**************************************************************************** ; GET_TYM - THIS TIMER ROUTINE SETS UP A SOFTWARE TIMER USING TIMER0 AS TIMING ; SOURCE. REQUIRES TIMER0 RUNNING. SAVES INIT COUNT IN NTXT_PRT AND ; NTXT_PRT+1. SHOULD BE ONLY USED WHEN TM_TRAP IS ACTIVE ; DESTROYS: ACC ; CALLS: NOTHING ; RETURNS: NOTHING ; I/O: NONE ; EXITS: RETURN ; ;**************************************************************************** ; GET_TYM:PUSH RR5 ;STORE TIM PARAMETER PUSH ACC ED1: MOV A,TTH0 ;READ PRESENT STATE OF TIMER MOV BCC,TTL0 ;MAKE SURE I HAVE A STABLE READING CJNE A,TTH0,ED1 ;THEN SET NEXT STATE XCH A,BCC POP RR5 ;BCC HOLDS TH0,R5 HOLDS PARAMETER CLR C ;COUNT OF 6 ADDC A,R5 MOV NTXT_PTR,A ;NTXT_PTR HOLDS LO ;NTXT_PTR+1 HOLDS HIGH MOV A,BCC ADDC A,#0 MOV NTXT_PTR+1,A POP RR5 ;RESTORE R5 RET ; ;************************************************************************ ; CHK_TYM - THIS ROUTINE CHECKS THE STATUS OF THE SOFTWARE TIMER SET UP ; BY GET_TYM. SHOULD BE ONLY USED WHEN TM_TRAP IS ACTIVE ; DESTROYS: NOTHING ; CALLS: NOTHING ; RETURNS: CARRY = 1 TIMER FINISHED, CARRY = 0 TIMER STILL RUNNING ; I/O: NONE ; EXITS: RETURN ; ;************************************************************************ ; CHK_TYM:PUSH ACC PUSH NTXT_PTR PUSH NTXT_PTR+1 EX4: MOV A,TTH0 MOV BCC,TTL0 CJNE A,TTH0,EX4 XCH A,BCC ;A HOLDS TL0, BCC HOLDS TH0 XCH A,NTXT_PTR ;GET CONTENT OF NTXT_PTR-THL0 CLR C SUBB A,NTXT_PTR MOV A,NTXT_PTR+1 SUBB A,BCC ;CY MEANS TIME UP POP NTXT_PTR+1 POP NTXT_PTR POP ACC RET ; ;************************************************************************ ;SET_FRM - THIS ROUTINE WILL SETUP THE BIT LENGTH FOR 212 MODE. ; DESTROYS: ACC ; CALLS: NOTHING ; I/O: NONE ; EXPECTS: BIT COUNT IN 'BITCNT' INCLUDES STOP AND START BITS ; EG 10 BIT = 8 BIT DATA + 1 START + 1 STOP ; 1 = 8 BIT 2 = 9 BIT 3 = 10 BIT 4 = 11 BIT ; EXITS: RETURN ; ;*********************************************************************** ; SET_FRM:MOV A,#03H ;10 BITS FOR NOW********** ANL A,#07H ;MASK OFF UPPER BITS ADD A,#05 MOV DCOR_CNT,A ;STORE CORE COUNT MOV CORE_CNT,A ;CORE COUNT ADD A,#02 MOV M_CNT,A ;FOR BREAK DETECT MOV DM_CNT,A ;STORE M_CNT FOR BREAK DETECT MOV DFRM_CNT,A ;STORE FRAME COUNT RET ; $EJECT ;*********************************************************************** ;ALB - JUMPS HERE FROM IDLE LOOP WHEN ALB IS REQUESTED ; ;*********************************************************************** ; ALB: CLR DISBIT CLR TR1 CALL INIT_F1 CALL I_PTR1 SETB ALB_FLG CLR DATBIT CALL SET_FRM ;SET 8,9,10,11 BITS MOV TMCON_LO,#LOW(-M_765MS) ;TURN CXR ON 765MS LATER MOV TMCON_HI,#HIGH(-M_765MS) MOV TMOUT_LO,#LOW(ALB6) MOV TMOUT_HI,#HIGH(ALB6) SETB CXR_BIT ;CXR ON MOV IRT_CNT,#0FFH CLR BBB_FLG CLR DOT_ERR CLR SNDOT_FLG CLR RVDOT_FLG CLR SDMK_FLG CLR SP_FLG JNB MSOP_EXT,ALB2 ;BRANCH IF IN HIGH SPEED MODE CLR B212_FLG SETB STAM ;103 MODE TO OUTSIDE WORLD CLR SPEED ;TELL EXAR 103 MODE SJMP ALBZ ALB2: SETB B212_FLG ;SET BELL 212 SETB SPEED ;TELL EXAR 212 MODE SETB SCRM_FLG ;ENABLE SCRAMBLER SETB IE.2 ;ENABLE SCR SETB IE.0 ;ENABLE SCT CLR STAM ;LET OUTSIDE WORLD KNOW IT'S 212 MODE ALBZ: CALL TM_TRAP ALB3: MOV C,HUNT_FLG ANL C,DLIN_RXD JC ALB3 SETB HUNT_FLG SETB DLIN_RXD JMP ALB3 ALB6: CALL UNTRAP CLR CLP_SYN CALL I_PTR1 MOV IRT_CNT,#0FFH MOV TH1,#(-164) MOV TL1,#(-164) ;SETUP TICKER SETB XMITEN ;ENABLE TRANSMITTER SETB IE.3 ;ENABLE SYSTEM TICKER SETB TR1 CLR CTS_S ;SET CTS ON JMP MODEM $EJECT