;LAST UPDATE 5/12/85 22:45 BY MTM $TITLE(POWER ON SECTION) ; ;************************************************************************** ;POWER ON AND IDLE LOOP CODE ;************************************************************************** ; ; ; ; M3_5MS EQU 3500 ;******* TIME CONST FOR 3.5MS M_140MS EQU 5 DT_VAL EQU 150 ;DIALTONE TICKER ; ;THIS IS TO FORCE THESE AS DATA MEMORY LOCATIONS FOR ASSEMBLER ; DDPH DATA 83H DDPL DATA 82H TTH0 DATA 8CH TTL0 DATA 8AH TTH1 DATA 8DH TTL1 DATA 8BH ; ;************************************************************************* ; POWER ON AND INITILIZATION - THESE ROUTINES INITILIZE INTERNAL MEMORY, ; I/O PORTS AND EXIT TO THE IDLE LOOP. ; DESTROYS: ALL INTERNAL MEMORY AND REGISTERS ; CALLS: SLVOPT, INIT_FLG, INIT_PTR ; I/O: INITS ALL I/O PORTS ; EXITS: TO IDLE LOOP ; ;:************************************************************************* ; ; ;THIS IS THE BEGINNING OF THE WORLD ; PWR_ON: MOV PSW,#BNK0 ;SET TO BANK 0 FIRST ; CLR A ;CLEAR ALL INTERNAL MEM MOV R0,#BNK1 MOV R1,#(P0-BNK1-1) CLN0: MOV @R0,A INC R0 DJNZ R1,CLN0 ; MOV SP,#STACK ;INIT THE STACK CALL SLVOPT ;INIT DEFAULT OPTIONS PWR2: MOV IE,#11100000B ;NO INTERRUPTS ENABLED CALL INIT_FLG ;INIT ALL FLGS CALL INIT_PTR ;DEFAULT VALUES ; ;******************* ; INIT I/O PORTS ;******************* ; MOV P0,#11111011B ;INIT PORT 0 ; BIT 0 = INPUT - W1 OPTION ; BIT 1 = INPUT - W2 OPTION ; BIT 2 = OUTPUT - CXR - 0 ; BIT 3 = INPUT - RTSM/P2225 ; BIT 4 = NOT USED ; BIT 5 = INPUT - *ALB ; BIT 6 = INPUT - ORG/ANS ; BIT 7 = OUTPUT - *CTSM = 1 MOV P1,#10110000B ;INIT PORT 1 ; BIT 0 = OUTPUT - HANDSHAKE TO EXAR = 0 ; BIT 1 = OUTPUT - SPEED SELECT = 0 ; BIT 2 = OUTPUT - SCRAM ENABLE = 0 ; BIT 3 = OUTPUT - XMITEN = 0 ; BIT 4 = NOT USED ; BIT 5 = OUTPUT - *TXD = 1 ; BIT 6 = OUTPUT - DTON DIAL TONE DET = 0 ; BIT 7 = OUTPUT - STAM (MOD STATUS) = 1 MOV P2,#10111111B ;INIT PORT 2 ; BIT 0 = INPUT - DIAL TONE DETECT ; BIT 1 = INPUT - RECEIVE DATA FROM MODEM ; BIT 2 = INPUT - PSKM 212 MARK DETECTED ; BIT 3 = INPUT - FSKM 103 MARK DETECTED ; BIT 4 = NOT USED ; BIT 5 = NOT USED ; BIT 6 = OUTPUT - P2225 DETECTED = 0 ; BIT 7 = INPUT - ED, ENERGY DETECT MOV P3,#11111111B ;INIT PORT 3 ; BIT 0 = INPUT - TXD FROM DTE ; BIT 1 = OUTPUT - RXD TO DTE ; BIT 2 = INPUT - SCT CLOCK ; BIT 3 = INPUT - SCT CLOCK ; BIT 4 = INPUT - DBC CLOCK ; BIT 5 = INPUT - 103 RXD FROM MODEM ; BIT 6 = INPUT - MSOP, MODEM SPEED ; BIT 7 = INPUT - *RTSM ; ;******************************* ; INIT TIMERS ;******************************* ; MOV TMOD,#00100101B ;PROGRAM TIMER0 AS NON-GATED,16 BIT CNTER ;PROGRAM TIMER1 AS NON-GATED,8 BIT AUTO_RELOAD MOV TCON,#00000101B ;DISABLE TIMER0 & 1, SET BOTH INT0 & 1 ;AS EDGE TRIGGERED,CLR ALL FLG MOV IP,#00001101B ;SET INT0 & 1 & TIMER 1 TO HI LEVEL INTERR ;THEN LOWER PRIORITY OF INT0 TO AVOID ;PTR CONTENTION DURING MULTIPLE INTERR. CLR DT_BIT ; CLEAR DIAL TONE DETECT BIT UNTIL IT WORKS ; ;****************************************************************************** ; MAIN IDLE LOOP - THIS LOOP IS ENTERED AFTER POWER UP INITILIZATION ; DESTROYS: ; CALLS: ; BRANCHES TO: ; I/O: ; ;****************************************************************************** ; IDLE: JB ALB_NOT,IDLE1 ;BRANCH IF NOT ALB MODE JMP ALB ;GO DO ALB IDLE1: JB ORAN_SEL, IDLE_ORG ;BRANCH IF ORIGINATE MODE JMP IDLE_ANS ;GOTO ANSWER MODE IDLE LOOP IDLE_ORG:JB RTSM_225,IR_ORG1 ;BRANCH IF RTS MODEM ENABLE ; ; COMES HERE WHEN IN ORIGINATE MODE, 2225HZ TRIGGER ; SETB HAND_SHK ;ENABLE HANDSHAKE FOR CARRIER DET CLR SPEED ;SET 103 MODE CALL WAIT_1 ;WAIT 1MS JB ED_103,IC_ORG1 ;BRANCH IF CARRIER PRESENT ; ; SJMP IDLE ;NO CARRIER, GO BACK TO IDLE IC_ORG1:CALL WAIT_1 ;WAIT 1MS JB ED_103,IC_ORG2 SJMP IDLE ;MUST HAVE BEEN GLITCH ON ED_103 IC_ORG2:SETB P_2225 ;SET ENERGY DETECT BIT CLR DT_BIT ;STOP TICKER FROM DETECTING DIALTONE CLR DTON ;CLEAR DIAL TONE ON JMP ORG_MOD ;START ORIGINATE CYCLE ; ; COMES HERE WHEN IN ORIGNATE MODE, RTSM TRIGGER ; IR_ORG1:JNB RTS_BIT,IR_ORG2 ;BRANCH IF *RTSM IS TRUE ; ; JMP IDLE ;NO *RTSM, GO BACK TO IDLE IR_ORG2:CALL WAIT_1 ;WAIT 1MS JNB RTS_BIT,IR_ORG3 ;STILL THERE? JMP IDLE ; MUST BE GLITCH IR_ORG3:JMP ORG_MOD ; START ORIGINATE CYCLE ; ; COMES HERE WHEN IN ANSWER MODE ; IDLE_ANS: JNB RTS_BIT,ID_ANS1 SJMP IDLE ;NO *RTSM, GO BACK TO IDLE ID_ANS1:CALL WAIT_1 ;WAIT 1MS FOR DEBOUNCE JNB RTS_BIT,ID_ANS2 ;STILL THERE? JMP IDLE ; MUST HAVE BEEN GLITCH ID_ANS2:JMP ANS_MOD ; START ANSWER CYCLE ; ; ;**************************************************************************** ; THE SUBROUTINES ;**************************************************************************** ; ; ;********************************************************************* ;WAIT_1 - THIS ROUTINE WAITS 1 MS AND RETURNS ; DESTROYS: ; CALLS: ; EXITS: VIA RETURN ; I/O: NONE ; ;********************************************************************* ; WAIT_1: RET ; ;********************************************************************* ;SDT_TIC - SETUP DIALTONE DETECT TICKER ; ; DESTROYS: NOTHING ; CALLS: NOTHING ; EXPECTS: NOTHING ; RETURNS: SYSTEM TICKER ACTIVE ; ;********************************************************************** ; SDT_TIC: CLR TR0 CLR TR1 CLR ET0 CLR ET1 CLR TF0 CLR TF1 MOV TMOD,#00100001B ;16 BIT TIMER 0 INTERNAL CLOCK MOV TH1,#(-DT_VAL) MOV TL1,#(-DT_VAL) SETB TR1 SETB ET1 ;START TICKER INTERRUPT RET ; RDT_TIC: CLR ET1 CLR TR1 MOV TH1,#(-TYM_CON) MOV TL1,#(-TYM_CON) MOV TMOD,#00100101B RET ; $EJECT