.TITLE PHONE - RSX-11M PHONE UTILITY .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: PHONE.MAC ; Author: Gary N. Larsen ; Date: July 29, 1982 ; ; Description: ; ; ; ; Modification History: ; ;- .ENABL AMA .NLIST BEX .MCALL ALUN$S, DIR$, EXIT$S, GLUN$S, GMCR$, GTSK$ .MCALL QIOW$, QIOW$S, STOP$S .SBTTL LOCAL EQUATES ; Local/global equates: CMDSIZ == 80. ; SIZE OF COMMAND LINE BUFFER ERRSIZ = 80. ; SIZE OF ERROR MESSAGES OUTSIZ = 512. ; SIZE OF OUTPUT BUFFER .SBTTL MESSAGE STORAGE AREA WRONG: .ASCII %PHONE was started with the wrong task name, to run type:% .ASCII .ASCII % >RUN $PHONE/TASK=PHOT% WNAME: .ASCII %nn% ; OVERWRITE WITH ASCII NUMBER WRONGL = .-WRONG HOMCLR: .ASCIZ /[H//[J/ ; CLEAR THE ENTIRE SCREEN HOCLEN=.-HOMCLR PRM: .ASCII "[2;1H%""[0K" ; POSITION AND CLEAR PROMPT PRL = .-PRM .EVEN .SBTTL LOCAL AND GLOBAL STORAGE AREA ; Local and global storage area. TIOSB:: .BLKW 2 ; TERMINAL I/O STATUS BLOCK REGTOP::.WORD 6 ; TOP SCROLL REGION LINE # REGBOT::.WORD 23. ; BOTTOM SCROLL REGION LINE # DATBUF::.BLKW 8. ; DATE BUFFER LUNBUF::.BLKW 6 ; GLUN BUFFER SCRCNT::.WORD 0 ; BYTE FOR PHONE SCREEN ; Directive Parameter Blocks: GTSK: GTSK$ GBUFF ; GET TASK PARAMETERS GBUFF:: .BLKW 16. ; AND STORE IT HERE TNAME == GBUFF+G.TSTN ; ADDRESS OF TASK NAME GMCR:: GMCR$ ; GET COMMAND LINE DPB MCRFLG::.WORD 0 ; COMMAND FROM MCR -1 = TRUE TIATT:: QIOW$ IO.ATA,TILUN,TIEFN,,TIOSB,, TIDET:: QIOW$ IO.DET,TILUN,TIEFN,,TIOSB,, TIKIL:: QIOW$ IO.KIL,TILUN,TIEFN,,,, ; KILL INPUT ON LOCAL TERMINAL OUKIL:: QIOW$ IO.KIL,OULUN,OUEFN,,,, ; KILL OUTPUT ON LOCAL TERMINAL TOKIL:: QIOW$ IO.KIL,TOLUN,TOEFN,,,, ; KILL OUTPUT TO PHONED TERMINAL TISET:: QIOW$ SF.SMC,TILUN,TIEFN,,TIOSB,, ; SET CHARACTERISTICS TTYCH:: .BYTE TC.FDX,1 ; SET TERMINAL TO FULL DUPLEX TTYCHL= .-TTYCH ; Various buffers. .PSECT $$ZZZZ,RW,D,REL,CON ; FORCE BUFFERS TO END OF TASK BUFPTR::.WORD 0 ; POINTER TO MESSAGE BUFFER CBUF:: .BLKB CMDSIZ ; COMMAND LINE BUFFER MSGBUF::.BLKB OUTSIZ ; MESSAGE OUTPUT BUFFER SCRBUF::.BLKB OUTSIZ ; SCREEN FORMAT BUFFER ERRBUF::.BLKB ERRSIZ ; ERROR MESSAGE BUFFER .PSECT ; RETURN TO ORIGINAL PSECT .SBTTL PHONE - MAIN LINE CODE ;+ ; ; PHONE - Main line code. ; ; This program is used to communicate between terminals on an RSX-11M system. ; ;- .ENABL LSB PHONE:: ALUN$S #TILUN,#"TI,#0 ; ASSIGN THE LOCAL INPUT LUN BCS 90$ ; IF CS, FAILURE ALUN$S #OULUN,#"TI,#0 ; ASSIGN THE LOCAL OUTPUT LUN BCS 90$ ; IF CS, FAILURE MOV #TILUN,LUN ; SETUP THE LUN CALL GETTTY ; GET THE BINARY UNIT NUMBER MOV #TITBL,R3 ; SET UP THE TABLE ENTRY MOV R1,O.TNUM(R3) ; STORE THE TERMINAL NUMBER CALL MAKTSK ; NOW MAKE THE TASK NAME DIR$ #GTSK ; GET OUR TASK NAME BCS 90$ ; IF CS, ERROR CMP TNAME,O.TASK(R3) ; DO WE HAVE THE CORRECT TASK NAME ? BNE 5$ ; IF NE, NO (GIVE SOME HELP) CMP TNAME+2,O.TASK+2(R3) ; SECOND PART CORRECT ? BEQ 10$ ; IF EQ, YES 5$: MOVB ASCNAM+1,WNAME ; COPY THE ASCII MOVB ASCNAM+2,WNAME+1 ; TERMINAL NAME MOV #WRONG,R1 ; SET THE MESSAGE ADDRESS MOV #WRONGL,R2 ; SET THE MESSAGE BYTE COUNT CALL OUTMSG ; OUTPUT THE MESSAGE JMP EXIT ; AND EXIT 10$: MOV #TILUN,LUN ; USE LUN AND EFN FOR LOCAL TI: MOV #TIEFN,EFN ; FOR QIO CALL CHKVT1 ; IS THIS A VT100 TERMINAL ? BCS 100$ ; IF CS, NO (CAN'T RUN THEN) DIR$ #TIATT ; ATTACH TI0: WITH/UNSOL/AST BCS 90$ ; IF CS, ERROR DIR$ #TISET ; SET TERMINAL CHARACTERISTICS BCS 90$ ; IF CS, ERROR ; Make and write the initial screen message for phone. CALL MAKSCR ; MAKE THE SCREEN MESSAGE CALL SCRMSG ; WRITE THE SCREEN MESSAGE BIC #B.STRT,STATUS ; SHOW FINISHED WITH STARTUP CALL ARMREC ; ARM THE RECEIVE DATA AST BCS 90$ ; IF CS, IT FAILED ; Try to get a MCR command line. DIR$ #GMCR ; GET COMMAND LINE BCS LOOP ; IF CS, PRESUME NONE MOV $DSW,R3 ; COPY THE BYTE COUNT BEQ LOOP ; IF EQ, NO COMMAND LINE MOV #GMCR+G.MCRB,R4 ; ADDRESS OF COMMAND LINE ; Skip over the taskname. 80$: DEC R3 ; ADJUST THE BYTE COUNT BEQ LOOP ; IF EQ, NO MORE COUNT CMPB (R4)+,#SPACE ; ARE WE TO THE SPACE YET ? BNE 80$ ; IF EQ, NO (LOOP) MOV #MSGBUF,BUFPTR ; SET UP NEW BUFFER POINTER MOV #2,R1 ; NOW GO TO LINE 2 MOV #2,R2 ; COLUMN 2 CALL MAKCUR ; MAKE THE CURSOR ADDRESS MOV R4,R1 ; COPY THE BUFFER ADDRESS MOV R3,R2 ; AND THE BYTE COUNT ; Copy the MCR command line. 85$: MOVB (R1)+,@BUFPTR ; COPY THE NEXT BYTE INC BUFPTR ; ADJUST THE BUFFER POINTER SOB R2,85$ ; AND LOOP UNTIL DONE CALL WRTMSG ; NOW OUTPUT THE COMMAND MOV #-1,MCRFLG ; SHOW COMMAND IS FROM MCR BR PARSE ; AND CONTINUE ... ; Report the error message and exit. 90$: CALL CHKDIR ; REPORT THE DIRECTIVE ERROR 100$: JMP EXIT ; AND EXIT .DSABL LSB ; Main line loop. LOOP:: CLR MCRFLG ; COMMAND IS NOT FROM MCR CALL PROMPT ; PROMPT THE USER BCC 10$ ; IF CC, GOT A COMMAND JMP EXIT ; ELSE, TIME TO EXIT 10$: BIC #B.HANG,STATUS ; SHOW WE AREN'T HUNGUP MOV TIOSB+2,R3 ; MOVE IN THE BYTE COUNT MOV #CBUF,R4 ; ADDRESS OF THE COMMAND BUFFER ;+ ; ; Use TPARS to parse the command line. ; ; Inputs: ; R1 = bit 0 in the low byte controls processing of blanks/tabs: ; if 0, ignore blanks, if 1 then pass blanks and tabs. ; the high byte contains the number of characters that ; keywords are alloewed to be abbreviated (0 = exact). ; R3 = the input string byte count, ; R4 = the input buffer address. ; ; Outputs: ; R3 = zero on success or ; remaining byte count on syntax error. ; R4 = end of input string or ; updated buffer address on syntax error. ; ;- ; Parse the command line. .ENABL LSB PARSE:: MOV #<400*1>,R1 ; IGNORE BLANKS, MATCH 1 CHARACTER MOV #KEYWRD,R2 ; ADDRESS OF KEYWORD TABLE MOV #START,R5 ; STARTING TRANSITION ADDRESS MOV #MSGBUF,BUFPTR ; SETUP THE BUFFER POINTER CALL .TPARS ; PARSE THE COMMAND LINE BCC 10$ ; IF CC, SUCCESS BIT #B.MSG,STATUS ; MESSAGE ALREADY ON THE SCREEN ? BNE LOOP ; IF NE, YES (LEAVE IT THERE) ERRMSG UNRCMD, BR LOOP ; AND GET THE NEXT COMMAND ; See if we answered or we were answered. 10$: BIT #B.ANS,STATUS ; HAS THE PHONE BEEN ANSWERED ? BEQ LOOP ; IF EQ, NO (GET NEXT COMMAND) ; Stop here and process characters in the AST routine. 20$: MOV #TITBL,R3 ; SET UP LOCAL TABLE ENTRY MOV #FF,O.CHAR(R3) ; SET CHARACTER TO CLEAR SCREEN CALL PROCESS ; PROCESS THIS CHARACTER MOV #TOTBL,R3 ; ADDRESS OF PHONED TERMINAL MOV O.INIT(R3),O.LINE(R3) ; SETUP TO TOP LINE NUMBER MOV #1,O.COL(R3) ; AND COLUMN 1 30$: STOP$S ; STOP UNTIL UNSTOPPED IN AST BIT #B.HANG,STATUS ; ARE WE HANGING UP THE PHONE ? BEQ 30$ ; IF EQ, NO (LOOP FOR NOW) BIC #B.ANS,STATUS ; SHOW WE'RE ALLOWED TO DIAL CALL CLEAN ; CLEAN UP OUTSTANDING I/O JMP LOOP ; AND GET THE NEXT COMMAND .DSABL LSB .SBTTL EXIT - CLEANUP AND EXIT PHONE ;+ ; ; EXIT - Cleanup and exit phone. ; ;- EXIT:: CALL CLEAN ; CLEANUP OUTSTANDING I/O BIT #B.STRT,STATUS ; ARE WE IN THE STARTUP CODE ? BNE 10$ ; IF NE, YES (LEAVE SCREEN) MOV #HOMCLR,R1 ; ADDRESS OF CLEAR SCREEN MOV #HOCLEN,R2 ; AND BYTE COUNT CALL WRITIT ; NOW WRITE IT 10$: EXIT$S ; AND EXIT TO THE SYSTEM .SBTTL CLEAN - CLEANUP OUTSTANDING I/O ;+ ; ; CLEAN - Cleanup outstanding I/O on terminals. ; ; Inputs: ; None ; ; Outputs: ; All registers are preserved. ; ;- CLEAN:: DIR$ #OUKIL ; KILL OUTPUT ON LOCAL TERMINAL DIR$ #TIKIL ; KILL INPUT ON LOCAL TERMINAL DIR$ #TOKIL ; KILL PHONED TERMINAL I/O RETURN .SBTTL PROMPT - PROMPT USER FOR A COMMAND ;+ ; ; PROMPT - Prompt the user for a command. ; ; This program is used to to prompt the user for commands. ; ; Inputs: ; None. ; ; Outputs: ; C bit clear/set = command line / time to exit. ; ; All registers are preserved. ; ;- PROMPT::JSR R2,$SAVVR ; SAVE R0 - R2 10$: BIS #B.RPR,STATUS ; SHOW WE ARE PROMPTING QIOW$S #IO.RPR!TF.BIN,#TILUN,#TIEFN,,#TIOSB,,<#CBUF,#80.,,#PRM,#PRL,#0> BIC #B.RPR,STATUS ; WE ARE NO LONGER PROMPTING CALL CLRMSG ; CLEAR THE MESSAGE LINE CMPB #IE.EOF,TIOSB ; END OF FILE TYPED ? BEQ 20$ ; IF EQ, YES (TIME TO EXIT) ; Convert command line to uppercase for the table parser. MOV #CBUF,R0 ; ADDRESS OF COMMAND BUFFER MOV R0,R1 ; STORAGE FOR CONVERTED COMMAND MOV TIOSB+2,R2 ; MOVE IN THE BYTE COUNT BEQ 10$ ; IF EQ, NOTHING ENTERED CALL $CVTUC ; CONVERT COMMAND TO UPPERCASE CLC ; SHOW WE HAVE A COMMAND LINE RETURN ; RETURN TO THE MAIN LINE 20$: SEC ; SHOW IT'S TIME TO EXIT RETURN .END PHONE ; TRANSFER ADDRESS