.TITLE PSMON PORT SELECTOR MONITER ; ; ; $DIBDEF $DCDEF $TTDEF $JPIDEF ; ; MAXBUF=132 RUNPRI=12 ;SET IT TO RUN REAL TIME. OWNTTFLAG=10 MONTTFLAG=11 WRIOWNTTFLAG=12 WRIMONTTFLAG=13 TIMEFLAG=15 WAITFLAG=20 ; STDESS=80 X.OPEN=1 ;INDICATE FILE OPENED. X.NOFI=2 ;INDICATE NO FILE. X.NOTE=4 ;INDICATE NO TERMINAL. PSMFAB: $FAB ALQ=20,- DEQ=20,- DNM=,- FAC=,- NAM=PSMNAM,- ORG=SEQ,- RFM=VAR PSMRAB: $RAB FAB=PSMFAB,- MBC=5,- MBF=5,- ROP=,- RAC=SEQ PSMNAM: $NAM ESA=PSMESA,- ESS=STDESS PSMESA: .BLKB STDESS PSMFILNAM: .BLKB STDESS PSMFILNAMSIZ: .LONG 0 XCTL: .LONG X.NOFI ;CONTROL WORD. ASSUME NO FILE OUTPUT. JPILST: .WORD 4 ;PRIORITY. .WORD JPI$_PRI .LONG JOBPRI ; .LONG 0 ; .LONG 0 ;END OF LIST. JOBPRI: .LONG 0 ATIMEWAIT: .ASCID /0 00:00:01.00/ ; BTIMEWAIT: .BLKQ 1 ; CLEARMSG: .BYTE 27 .ASCII /[2J/ ;CLEAR SCREEN. CLEARMSGS=.-CLEARMSG CLEARMSG1: .BYTE 27 .ASCII /[1;1H/ ;GO HOME. CLEARMSG1S=.-CLEARMSG1 MONTTDESC: ;MONITER PORT DESC. .ASCID /_TTJ7:/ OWNTTDESC: .ASCID /TT/ ;OWN TERMINAL DESC. MONTTCHAN: .LONG 0 ; OWNTTCHAN: .LONG 0 ; OWNTTIOSB: .BLKL 2 ; WRIOWNTTIOSB: .BLKL 2 ; MONTTIOSB: .BLKL 2 ; WRIMONTTIOSB: .BLKL 2 ; CRTERM: .BLKL 2 ;USED TO INDICATE NO TERMINATOR. ; ;EXIT DESC BLOCK. ; EXITBLOCK: .LONG 0 .ADDRESS EXITRTN .LONG 0 .ADDRESS STATUS STATUS: .LONG 0 ;RECIEVE STATUS OF TASK. ; ; PRIBUFDESC: ;GET TERMINAL CHARACTERISTICS DESC. .LONG DIB$K_LENGTH .LONG .+4 DEPCHR: .LONG 0 OWNTTMODE: .BLKL 2 .=PRIBUFDESC+8+DIB$K_LENGTH ; ;OWN TERMINAL READ BUFFER AND POINTERS. ; OWNBUF: .BLKB MAXBUF OWNPTR: .LONG OWNBUF OWNCUR: .LONG OWNBUF ; ;MONITER PORT READ BUFFER AND POINTERS. ; W.FLAG=0 W.CNT=4 W.BUFB=8 W.SIZE=12 ; ; B.GOOD=1 ; .MACRO MONBUFALC MAXENT .MACRO MONBUFENT NUM .LONG 0,0,MONBU'NUM .SAVE_PSECT .PSECT MONBUF MONBU'NUM: .BLKB MAXBUF .RESTORE_PSECT .ENDM MONBUFENT .PSECT MONTBP: .LONG MONTBL MONTBC: .LONG MONTBL MONTBL: COUNT=0 .REPT MAXENT MONBUFENT \COUNT COUNT=COUNT+1 .ENDR MONTBE: .ENDM MONBUFALC MAXMONBUF=100 MONBUFALC MAXMONBUF ;ALLOCATE MONITER BUFFERS. MONMSG: .ASCII /SEND A DUMMY MESSAGE/ .BYTE 13 MONMSGSIZ=.-MONMSG HELPMSG: .ASCII / *** Port Selector Moniter Program ***/<10><13> .ASCII <10><13> .ASCII / Enable moniter option on P.S./<10><13> .ASCII / Set speed for TTJ7 to correspond to the terminal being monitered/ .ASCII <10><13><10><13> .ASCII / G - Go (default=output to terminal only)/<10><13> .ASCII / Q - Enable terminal output/<10><13> .ASCII / S - Suspend terminal output/<10><13> .ASCII / F - Enable file output/<10><13> .ASCII / Z - Suspend file output/<10><13> .ASCII / N - Create new file and enable file output/<10><13> .ASCII / O - Append to old file (cif) and enable file output/<10><13> .ASCII / C - Close and disable file output/<10><13> .ASCII / H - Display this messsage/<10><13> .ASCII / E - Exit program/<10><13> .ASCII <10><13> HELPMSGS=.-HELPMSG .PAGE .SBTTL MAIN CODE ; ; START: .WORD 0 $BINTIM_S TIMBUF=ATIMEWAIT,- TIMADR=BTIMEWAIT M_ON0ERR END, $ASSIGN_S DEVNAM=OWNTTDESC,- CHAN=OWNTTCHAN ;CONNECT TO OWN TERMINAL. M_ON0ERR END, $ALLOC_S DEVNAM=MONTTDESC M_ON0ERR END, $ASSIGN_S DEVNAM=MONTTDESC,- CHAN=MONTTCHAN ;CONNECT TO MONITER PORT. M_ON0ERR END, JSB WRITEMON M_IF_CS END $DCLEXH_S DESBLK=EXITBLOCK ;DECLARE EXIT HANDLER. M_ON0ERR END, $GETCHN_S CHAN=OWNTTCHAN,- ;GET OWN TT CHARACTERISTICS. PRIBUF=PRIBUFDESC M_ON0ERR END, ;; BISL #TT$M_PASSALL!TT$M_EIGHTBIT,OWNTTMODE+4 BICL #TT$M_HALFDUP,OWNTTMODE+4 ;FULL DUPLEX. $QIOW_S FUNC=#IO$_SETMODE,- ;SET TERMINAL CHARATISTICS. CHAN=OWNTTCHAN,- IOSB=OWNTTIOSB,- P1=OWNTTMODE,- P3=#0,- P4=#0,- P5=#0 M_ON0ERR END, $GETJPI_S ITMLST=JPILST ;GET JOB INFO. M_ON0ERR END, $SETPRI_S PRI=#RUNPRI ;SET NEW PRIORITY. M_ON0ERR , ;TELL USER IF ERROR. JSB CLEARSCREEN ;CLEAR SCREEN. $SETEF_S EFN=#WRIOWNTTFLAG M_ON0ERR END, JSB READOWN ;SET UP READ ON OWN TERMINAL. M_IF_CS END ;.. LOOP: $SETAST_S ENBFLG=#0 ;DISABLE AST. M_ON0ERR END, TSTB @OWNCUR ;ANY THING TO DO AT OWN TERMINAL?? M_IF_NEQ SERVICEOWN ;BRANCH IF SOMETHING. MOVL MONTBC,R2 ;GET CURRENT MONITER BUFFER. BITL #B.GOOD,W.FLAG(R2) ;GOOD?? M_IF_NEQ SERVICEMON ;BRANCH IF SOMETHING. $CLREF_S EFN=#WAITFLAG ;CLEAR WAITFLAG. M_ON0ERR END, $SETAST_S ENBFLG=#1 ;ENABLE AST. M_ON0ERR END, $WAITFR_S EFN=#WAITFLAG ;WAIT FOR SOMETHING TO HAPPEN. M_ON0ERR END, BRW LOOP SERVICEOWN: $SETAST_S ENBFLG=#1 ;ENABLE AST. M_ON0ERR END, ; M_MESS , BICB #128,@OWNCUR ;CLEAR SIGN BIT. CMPB #^A/A/,@OWNCUR ;MUST BE BETWEEN A-Z. M_IF_GTR REJOIN ;IGNORE IF NOT. CMPB #^A/Z/,@OWNCUR ;.. M_IF_LSS REJOIN ;IGNORE IF NOT. SUBB #65,@OWNCUR ;MAKE HASH. MOVZBL @OWNCUR,R2 ;GET OFFSET. ROTL #2,R2,R2 ;MAKE IT LONGWORDS. ADDL #OWNDSPTBL,R2 ;ADD IN BASE. MOVL (R2),R2 ;GET ADDRESS. JMP (R2) ;GO TO IT. OWNDSPTBL: .LONG DUMMY ;A. .LONG DUMMY ;B. .LONG CLOSE ;C. .LONG DUMMY ;D. .LONG EXIT ;E. .LONG FILE ;F. .LONG GO ;G. .LONG HELP ;H. .LONG DUMMY ;I. .LONG DUMMY ;J. .LONG DUMMY ;K. .LONG DUMMY ;L. .LONG DUMMY ;M. .LONG NEWFILE ;N. .LONG OLDFILE ;O. .LONG DUMMY ;P. .LONG TERMINAL ;Q. .LONG DUMMY ;R. .LONG NOTERMINAL ;S. .LONG DUMMY ;T. .LONG DUMMY ;U. .LONG DUMMY ;V. .LONG DUMMY ;W. .LONG DUMMY ;X. .LONG DUMMY ;Y. .LONG NOFILE ;Z. DUMMY: BRW REJOIN ;DO NOTHING. HELP: JSB CLEARSCREEN ;CLEAR SCREEN. $QIOW_S FUNC=#IO$_WRITEVBLK!IO$M_NOFORMAT,- CHAN=OWNTTCHAN,- P1=HELPMSG,- P2=#HELPMSGS,- P4=#0 M_ON0ERR END, CLOSE: $DISCONNECT RAB=PSMRAB ;CLOSE PREVIOUS FILE. $CLOSE FAB=PSMFAB ;.. BISL #X.NOFI,XCTL ;SET NO MORE FILE OUTPUT. BRW REJOIN ;.. NOFILE: BISL #X.NOFI,XCTL ;SET NO FILE OUTPUT. BRW REJOIN ;.. FILE: BICL #X.NOFI,XCTL ;SET FILE OUTPUT. JSB CHECKFILE ;CHECK FOR FILE. BRW REJOIN ;.. EXIT: $DISCONNECT RAB=PSMRAB ;CLOSE PREVIOUS FILE. $CLOSE FAB=PSMFAB ;.. $EXIT_S ;EXIT. GO: JSB CHECKFILE ;CHECK FILE CONDITION. M_IF_CS END ;EXIT IF ERROR. JSB READMON ;START READ ON MONITER. M_IF_CS END ;EXIT IF ERROR. JSB CLEARSCREEN ;CLEAR SCREEN. BRW REJOIN ;.. NEWFILE: JSB OPENNEWFILE ; BRW REJOIN OLDFILE: JSB OPENOLDFILE ; BRW REJOIN CHECKFILE: BITL #X.NOFI,XCTL ;NEED FILE?? BNEQ 1$ ;BRANCH IF NOT. BITL #X.OPEN,XCTL ;IS IT OPENED ALREADY?? BNEQ 1$ ;BRANCH IF ALREADY OPENED. JSB OPENNEWFILE ;ASK FOR A NEW FILE NAME. 1$: RSB ;RETURN. OPENNEWFILE: $DISCONNECT RAB=PSMRAB ;CLOSE PREVIOUS FILE. $CLOSE FAB=PSMFAB ;.. M_GTINP ^/ENTER NEW FILE NAME> / ;PROMPT FOR NEW FILE NAME. TSTL L_INPDESC ;ANY INPUTTED?? BEQL 1$ ;BRANCH IF NOT, USE PREVIOUS NAME. MOVC3 L_INPDESC,@L_INPDESC+4,PSMFILNAM ;SAVE FILENAME. MOVL #PSMFILNAM,PSMFAB+FAB$L_FNA ;SET FILENAME. MOVB L_INPDESC,PSMFAB+FAB$B_FNS ;.. 1$: BICL #FAB$M_CIF,PSMFAB+FAB$L_FOP ;MUST CREATE NEW ONE. $CREATE FAB=PSMFAB ;CREATE NEW FILE. M_ON0ERR 2$, ;EXIT IF ERROR. $CONNECT RAB=PSMRAB ;CONNECT FILE. M_ON0ERR END, ;.. BISL #X.OPEN,XCTL ;INDICATE FILE OPENED. BICL #X.NOFI,XCTL ;SAY WE WANT FILE OUTPUT. JSB CLEARSCREEN RSB ;.. 2$: CMPL #RMS$_FNM,R0 ;FILENAME ERROR?? M_IF_EQL OPENNEWFILE ;IF SO PROMPT AGAIN. BRW END ;EXIT IF NOT. OPENOLDFILE: $DISCONNECT RAB=PSMRAB ;CLOSE PREVIOUS FILE. $CLOSE FAB=PSMFAB ;.. M_GTINP ^/ENTER OLD FILE NAME> / ;PROMPT FOR NEW FILE NAME. TSTL L_INPDESC ;ANY INPUTTED?? BEQL 1$ ;BRANCH IF NOT, USE PREVIOUS NAME. MOVC3 L_INPDESC,@L_INPDESC+4,PSMFILNAM ;SAVE FILENAME. MOVL #PSMFILNAM,PSMFAB+FAB$L_FNA ;SET FILENAME. MOVB L_INPDESC,PSMFAB+FAB$B_FNS ;.. 1$: BISL #FAB$M_CIF,PSMFAB+FAB$L_FOP ;CREATE NEW ONE IF ONE IS NOT FOUND. $OPEN FAB=PSMFAB ;CREATE NEW FILE. M_ON0ERR 2$, ;EXIT IF ERROR. $CONNECT RAB=PSMRAB ;CONNECT FILE. M_ON0ERR END, ;.. BISL #X.OPEN,XCTL ;INDICATE FILE OPENED. BICL #X.NOFI,XCTL ;INDICATE WE WNAT FILE OUTPUT. JSB CLEARSCREEN RSB ;.. 2$: CMPL #RMS$_FNM,R0 ;FILENAME ERROR?? M_IF_EQL OPENOLDFILE ;IF SO PROMPT AGAIN. BRW END ;IF NOT, THEN EXIT. NOTERMINAL: BISL #X.NOTE,XCTL ;SET NO TERMINAL. BRW REJOIN ;.. TERMINAL: BICL #X.NOTE,XCTL ;SET TERMINAL. BRW REJOIN REJOIN: CLRB @OWNCUR ;CLEAR THE BYTE. INCL OWNCUR ;POINT TO NEXT BYTE. CMPL #OWNPTR,OWNCUR ;END?? BNEQ 1$ ;BRANCH IF NOT. MOVL #OWNBUF,OWNCUR ;WRAP AROUND. 1$: JSB READOWN ;SET UP ANOTHER READ. BRW LOOP ;GO DO NEXT THING. SERVICEMON: $SETAST_S ENBFLG=#1 ;ENABLE AST. M_ON0ERR END, BITL #X.NOTE,XCTL ;WANT TERMINAL OUTPUT?? BNEQ 2$ ;BRANCH IF NOT. JSB WRITEOWN ;WRITE CHARACTER TO TERMINAL. M_IF_CS END ;EXIT IF ERROR. 2$: BITL #X.NOFI,XCTL ;WANT FILE OUTPUT?? BNEQ 3$ ;BRNACH IF NOT. JSB WRITEFILE ;WRITE TO FILE. M_IF_CS END ;EXIT IF ERROR. 3$: BICL #B.GOOD,W.FLAG(R2) ;CLEAR GOOD FLAG. ADDL #W.SIZE,R2 ;POINT TO NEXT ENTRY. CMPL #MONTBE,R2 ;END?? BNEQ 1$ ;BRNACH IF NOT. MOVL #MONTBL,R2 ;WRAP AROUND. 1$: MOVL R2,MONTBC ;UPDATE POINTER. BRW LOOP ;KEEP LOOPING. END: BRW EXIT ;THAT'S ALL. .PAGE .SBTTL CLEAR SCREEN ROUTINE ; ; CLEARSCREEN: $QIOW_S FUNC=#IO$_WRITEVBLK!IO$M_NOFORMAT,- ;CLEAR THE SCREEN. CHAN=OWNTTCHAN,- P1=CLEARMSG,- P2=#CLEARMSGS,- P4=#0 M_ON0ERR END, $SETIMR_S EFN=#TIMEFLAG,DAYTIM=BTIMEWAIT ;SET TIMER. M_ON0ERR END, $WAITFR_S EFN=#TIMEFLAG ;WAIT FOR IT. $QIOW_S FUNC=#IO$_WRITEVBLK!IO$M_NOFORMAT,- ;CLEAR THE SCREEN. CHAN=OWNTTCHAN,- P1=CLEARMSG1,- P2=#CLEARMSG1S,- P4=#0 M_ON0ERR END, RSB .PAGE .SBTTL READ ROUTINES ; ; READOWN: $QIO_S FUNC=#IO$_READVBLK!IO$M_NOECHO,- CHAN=OWNTTCHAN,- EFN=#OWNTTFLAG,- IOSB=OWNTTIOSB,- ASTADR=READOWNTTAST,- P1=@OWNPTR,- P2=#1 M_ON0ERR 30$, BICPSW #1 BRB 40$ 30$: BISPSW #1 40$: RSB READMON: MOVL R2,-(SP) MOVL MONTBP,R2 MOVL W.BUFB(R2),R2 $QIO_S FUNC=#IO$_TTYREADALL!IO$M_NOECHO!IO$M_TIMED,- CHAN=MONTTCHAN,- EFN=#MONTTFLAG,- IOSB=MONTTIOSB,- ASTADR=READMONTTAST,- P1=(R2),- P2=#MAXBUF,- P3=#1,- P4=#CRTERM M_ON0ERR 30$, 1$: BICPSW #1 BRB 40$ 30$: BISPSW #1 40$: MOVL (SP)+,R2 RSB WRITEOWN: MOVL R2,-(SP) MOVL R3,-(SP) MOVL MONTBC,R3 MOVL W.CNT(R3),R2 MOVL W.BUFB(R3),R3 $WAITFR_S EFN=#WRIOWNTTFLAG ;WAIT FOR PREVIOUS. $QIO_S FUNC=#IO$_WRITEVBLK!IO$M_NOFORMAT,- CHAN=OWNTTCHAN,- EFN=#WRIOWNTTFLAG,- IOSB=WRIOWNTTIOSB,- P1=(R3),- P2=R2,- P4=#0 M_ON0ERR 30$, BICPSW #1 BRB 40$ 30$: BISPSW #1 40$: MOVL (SP)+,R3 MOVL (SP)+,R2 RSB WRITEFILE: MOVL R2,-(SP) MOVL R3,-(SP) MOVL MONTBC,R3 MOVL W.CNT(R3),R2 MOVL W.BUFB(R3),R3 MOVL R3,PSMRAB+RAB$L_RBF MOVW R2,PSMRAB+RAB$W_RSZ $PUT RAB=PSMRAB M_ON0ERR 30$, BICPSW #1 BRB 40$ 30$: BISPSW #1 40$: MOVL (SP)+,R3 MOVL (SP)+,R2 RSB WRITEMON: $QIO_S FUNC=#IO$_WRITEVBLK!IO$M_NOFORMAT,- CHAN=MONTTCHAN,- EFN=#WRIMONTTFLAG,- IOSB=WRIMONTTIOSB,- P1=MONMSG,- P2=#MONMSGSIZ,- P4=#0 M_ON0ERR 30$, BICPSW #1 BRB 40$ 30$: BISPSW #1 40$: RSB .ENTRY READOWNTTAST ^M ; M_MESS ,<@OWNPTR> CMPW #SS$_ABORT,OWNTTIOSB BNEQ 10$ RET 10$: M_ONIOSERR 2$,OWNTTIOSB, TSTB @OWNPTR ;NOT A NULL?? BEQL 2$ ;BRANCH IF A NULL, IGNORE. INCL OWNPTR ;POINT TO NEXT BYTE. CMPL OWNPTR,#OWNPTR ;END?? BNEQ 1$ ;BRANCH IF NOT. MOVL #OWNBUF,OWNPTR ;WRAP AROUND. 1$: $SETEF_S EFN=#WAITFLAG ;SET FOR SOMETHING TO DO. 2$: RET .ENTRY READMONTTAST ^M CMPW #SS$_ABORT,MONTTIOSB BNEQ 10$ RET 10$: CMPW #SS$_TIMEOUT,MONTTIOSB ;TIMEOUT?? BEQL 3$ ;TIME OUT IS OKAY. M_ONIOSERR 2$,MONTTIOSB, 3$: MOVL MONTBP,R2 MOVZWL MONTTIOSB+2,W.CNT(R2) ;STORE COUNT. ; M_MESS , TSTL W.CNT(R2) ;ANY THING. BEQL 2$ ;BRANCH IF NOTHING, IGNORE. BISL #B.GOOD,W.FLAG(R2) ;SET GOOD BUFFER FLAG. ADDL #W.SIZE,R2 ;POINT TO NEXT BUFFER. CMPL #MONTBE,R2 ;END?? BNEQ 1$ ;BRANCH IF NOT. MOVL #MONTBL,R2 ;WRAP AROUND. 1$: MOVL R2,MONTBP ;UPDATE POINTER. $SETEF_S EFN=#WAITFLAG ;SET FOR SOMETHING TO DO. 2$: JSB READMON ;SET UP ANOTHER READ. RET .PAGE .SBTTL EXIT HANDLER ; ; .ENTRY EXITRTN ^M $CANCEL_S CHAN=OWNTTCHAN $CANCEL_S CHAN=MONTTCHAN BICL #TT$M_PASSALL!TT$M_EIGHTBIT,OWNTTMODE+4 BISL #TT$M_HALFDUP,OWNTTMODE+4 ;HALF DUPLEX. $QIOW_S FUNC=#IO$_SETMODE,- ;CLEAR TERMINAL CHARATISTICS. CHAN=OWNTTCHAN,- IOSB=OWNTTIOSB,- P1=OWNTTMODE,- P3=#0,- P4=#0,- P5=#0 $SETPRI_S PRI=JOBPRI ;RESTORE OLD PRIORITY. RET ;BYE BYE. .END START