.TITLE PHODIA - PHONE DIAL MODULE .IDENT /1.1/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided ; or otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: PHODIA.MAC ; Author: Gary N. Larsen ; Date: August 17, 1982 ; ; Description: ; ; This module is used to initiate the phone conversation wth another ; terminal on the system. It will assign the LUN check for a VT100 ; and then page the other terminal every ten seconds. ; ; ; Modification History: ; ;- .MCALL ALUN$S, ASTX$S, CMKT$S .MCALL MRKT$S, QIO$S, QIOW$S, SETF$S, WTSE$S ; Local equates: MRKEFN = 10. ; MARKTIME EVENT FLAG SECNDS = 2 ; BELL = 7 ; RING THE BELL ; Local/global storage: DTTBUF::.WORD 0 ; STORAGE BUFFER FOR TT: DTTNUM::.WORD 0 ; TERMINAL NUMBER TO DIAL COUNTR::.WORD 10. ; COUNTER FOR 10 SECOND DELAY MRKFLG::.WORD 0 ; MARKTIME ACTIVE FLAG ABOFLG::.WORD 0 ; ABORT CALL FLAG SCR:: .BYTE 0 ; CHARACTER TO CANCEL CALL RINGEM: .ASCII %TTnn:% .ASCII % is phoning you .%%.%%.% RNGLEN=.-RINGEM PAGING: .ASCII %Ringing % PAGTTY: .ASCII %TTnn:% .ASCIZ %... (Press any key to cancel call and continue.)% .EVEN .SBTTL PHODIA - PHONE DIAL ACTION ROUTINES ;+ ; ; PHODIA - PHONE DIAL ACTION ROUTINE ; ; This routine places a call to another terminal on the system. ; ;- DIALT:: MOVB #'T,DTTBUF ; SET THE DEVICE NAME CLR DTTNUM ; FOR Tx0: RETURN DSTTY1::CLR DTTNUM ; INITIALIZE UNIT NUMBER MOVB .PCHAR,DTTBUF ; SAVE THE FIRST CHARACTER RETURN ; Save the second character of the terminal name. DSTTY2::MOVB .PCHAR,DTTBUF+1 ; SAVE THE SECOND CHARACTER RETURN ; Save the terminal unit number. DSTTYN::MOV .PNUMB,DTTNUM ; SAVE THE TTY UNIT NUMBER RETURN DIALEM::MOV R3,-(SP) ; SAVE R3 BIT #B.WAIT,STATUS ; IS SOMEONE WAITING FOR US ? BEQ DIAL ; IF EQ, NO (CONTINUE...) ERRMSG WAITM, JMP FAIL ; RETURN FAILURE ... ; Assign a LUN to the specified terminal. DIAL: ALUN$S #TOLUN,DTTBUF,DTTNUM ; ASSIGN A LUN TO IT CALL CHKDIR ; ELSE REPORT THE ERROR BCC 10$ ; IF CC, SUCCESS JMP FAIL ; ELSE EXIT 10$: MOV #TOLUN,LUN ; USE LUN AND EFN MOV #TOEFN,EFN ; TO CHECK FOR VT100 CALL CHKTTY ; IS THIS TERMINAL ACCEPTABLE ? BCC 15$ ; IF CC, YES JMP FAIL ; ELSE GET OUT 15$: CALL GETTTY ; GET THE BINARY UNIT NUMBER MOV #TOTBL,R3 ; SETUP THE TABLE ADDRESS MOV R1,O.TNUM(R3) ; STORE THE UNIT NUMBER CALL MAKTSK ; MAKE THE RAD50 TASK NAME CMP TITBL+O.TNUM,O.TNUM(R3) ; ARE WE TALKING TO OURSELVES ? BNE 17$ ; IF NE, NO CALL SNDANS ; YES, SEND US AN ANSWER MESSAGE JMP 60$ ; AND RETURN IMMEDIATLY ; Build the ringing message for the local terminal. 17$: BIS #B.DIAL,STATUS ; SHOW WE ARE DIALING MOVB #10.,COUNTR ; RESET TEN SECONDS MOV #TILUN,LUN ; SET UP LUN FOR GETTTY CALL GETTTY ; GET THE BINARY UNIT NUMBER MOV #RINGEM,R0 ; ADDRESS FOR TTNN: MESSAGE CALL MAKTTY ; MAKE THE TERMINAL CLR ABOFLG ; CLEAR ABORT CALL FLAG QIO$S #IO.RAL!TF.RNE,#TILUN,,,#TIOSB,#DIAST,<#SCR,#1> ; Build the ringing message for the phoned terminal. 20$: MOV #10.,COUNTR ; RESET THE COUNTER BIC #B.ONL,STATUS ; PRESUME NOT ONLINE YET CALL CLRMSG ; CLEAR THE MESSAGE LINE MOV #TOLUN,LUN ; PHONED TTY LUN CALL GETTTY ; GET THE BINARY UNIT NUMBER MOV #PAGTTY,R0 ; TERMINAL TO PAGE BUFFER ADDRESS CALL MAKTTY ; MAKE THE PHONED TTY MOVB #'.,(R0) ; REPLACE SPACE WITH PERIOD MOVMSG PAGING ; PUT IN THE PAGING MESSAGE CALL WRTMSG ; NOW WRITE IT ; See if the phoned terminal has PHONE active already. 30$: CALL SNDWAT ; TELLEM WE'RE WAITING ... BCC 33$ ; IF CC, THEY'RE ACTIVE ; Broadcast a message to the phoned terminal. QIO$S #IO.WBT,#TOLUN,,,,,<#RINGEM,#RNGLEN,#40> CALL CHKDIR ; CHECK/REPORT ANY ERRORS MOV #10.,COUNTR ; RESET TEN SECONDS 33$: CALL SNDWAT ; TELLEM WE'RE WAITING ... MOV #1,R0 ; SET UP FOR DELAY CALL DELAY ; AND WAIT FOR AWHILE BIT #B.ANS,STATUS ; HAVE THEY ANSWERED YET ? BNE 40$ ; IF NE, YES ; ; The following lines were added so CTRL/C could abort a DIAL during debug. ; ; BIT #B.HANG,STATUS ; HAVE WE BEEN HUNGUP ??? ; BNE 50$ ; IF NE, YES BIT #B.DIAL,STATUS ; WAS OUR CALL REJECTED ? BEQ 50$ ; IF EQ, YES TST ABOFLG ; DID WE ABORT CALL ? BNE 50$ ; IF NE, YES ; Adjust the counter and loop to appropriate routine. DEC COUNTR ; COUNT OFF ANOTHER SECOND BGT 33$ ; IF GT, MORE TO GO BR 20$ ; AND UPDATE LOCAL TERMINAL 40$: CALL SNDGO ; TELL OTHER PHONER TO GO 50$: DIR$ #TIKIL ; KILL THE LOCAL READ 60$: BIC #B.DIAL!B.ONL,STATUS ; SHOW WE ARE NO LONGER DIALING MOV (SP)+,R3 ; RESTORE R3 RETURN FAIL: MOV (SP)+,R3 ; RESTORE R3 ADD #2,(SP) ; RETURN FAILURE RETURN ; Users did not specify someone to phone. NODIAL::ERRMSG NDIALM, ADD #2,(SP) ; RETURN FAILURE RETURN .SBTTL DELAY - WAIT SPECIFIED NUMBER OF SECONDS ;+ ; ; DELAY - Wait for a specified number of seconds. ; ; Inputs: ; R0 = the number of seconds to wait. ; ; Outputs: ; Carry clear/set = success/failure. ; ; All registers are preserved. ; ;- DELAY:: MRKT$S #MRKEFN,R0,#SECNDS ; MARK TIME FOR 10 SECONDS CALL CHKDIR ; DID WE GET A DIRECTIVE ERROR BCS 10$ ; IF CS, YES MOV #-1,MRKFLG ; SHOW MARKTIME IS ACTIVE WTSE$S #MRKEFN ; ELSE WAIT FOR MARKTIME CLR MRKFLG ; MARKTIME NO LONGER ACTIVE 10$: RETURN .SBTTL DIAST - AST ROUTINE ;+ ; ; DIAST - AST routine. ; ; The marktime is canceled if active, the phoned terminal write is killed ; incase it did not complete, and an abort message is sent if the read was ; successful (not killed) and the phoned terminal is online. ; ; Inputs: ; (SP) = the I/O status block address. ; ; Outputs: ; None. ; ;- DIAST:: CALL CANMRK ; CANCEL THE MARKTIME DIR$ #TOKIL ; INSURE WRITE IS KILLED TSTB @(SP) ; WAS THE READ SUCCESSFUL ? BMI 10$ ; IF MI, NO (PRESUME KILLED) BIT #B.ONL,STATUS ; IS PHONED TERMINAL ONLINE ? BEQ 10$ ; IF EQ, NO CALL SNDABO ; YES, TELLEM WE'RE NOT DIALING 10$: TST (SP)+ ; POP THE IOSB FROM THE STACK MOV #-1,ABOFLG ; SHOW WE ARE ABORTING CALL ASTX$S ; NOW EXIT... ; Cancel the marktime if it is active. CANMRK::TST MRKFLG ; IS THE MARKTIME ACTIVE ? BEQ 10$ ; IF EQ, NO CMKT$S #MRKEFN ; CANCEL MARK TIME DELAY SETF$S #MRKEFN ; SET THE EVENTFLAG 10$: RETURN .END