.TITLE DIAL .SBTTL INTOR PAGE ;DIALSR IS A PROGRAM DESIGNED TO BE RUN ONCE/MINUTE TO SERVICE ;DIAL UP LINES ON THE SYSTEM: ; ;ON INITIAL RUN, IT WILL POLL THE PUD TABLE AND SAVE THE PUD ADDRESSES ;OF TERMINALS WITH DIALUP LINES ATTACHED ; ;FOR EACH SUBSEQUENT EXECUTION IT WILL: ; ;A/ CHECK LOGGED ON BIT IN PUD. IF LOGGED ON: ; ;B/ TRY TO OUTPUT A NULL CHARACTER (WITH NO CARRIAGE CONTROL CHARACTERS) ; IF STATUS RETURN IS IE.DNR (DEVICE NOT READY, IMPLYING PERSON ON OTHER ; END OF PHONE HUNG UP, HE WILL ; ;C/ RUN ...BYE AT THAT TERMINAL, TO CLOSE OUT THEIR LOGGING FILE ;; ; .MCALL QIO$,QIOW$,MRKT$,STSE$,SPWN$,DIR$,WTSE$,CMKT$ .MCALL TTSYM$ TTSYM$ DEF$G .SBTTL ONE TIME ONLY CODE ;THIS CODE EXECUTES ONCE TO FIND DIALUP LINES ON THE SYSTEM ;IT WILL STORE (A MAXIMUM OF 8.) PUD POINTERS FOR DIALUP LINES ; DIAL: MOV .PUDBA,R0 ;POINT TO FIRST PUD MOV .PUDEA,R1 ;AND END OF PUD MOV .CRTSK,R2 ;GET MY ATL ADDRESS MOV A.TI(R2),MYTI ;SAVE MY TI PUD POINTER CLR R4 ;CLEAR COUNTER MOV #PUDSAV,R5 ;POINT TO SAVE AREA CHKPUD: CMP (R0),#"TT ;A TT PUD? BNE NEXT ;NO TSTB U.UN(R0) ;TT0? BEQ NEXT ;IF YES, SKIP MOV R0,A.TI(R2) ;CHANGE ME TO THIS TI DIR$ #GETDIA ;IS HE A DIAL-UP LINE ? MOV MYTI,A.TI(R2) ;PUR ME BACK AT MY TI TST IOSB+2 ;IF TRUE, THEN NON-ZERO BEQ NEXT ;NO CMP R4,#10 ;TOO MANY LINES BGT NEXT ;YES MOV R0,(R5)+ ;OK, SAVE PUD POINTER INC R4 ;COUNT ONE PUD POITER SAVED NEXT: ADD #U.SZ,R0 ;BUMP TO NEXT PUD CMP R0,R1 ;PAST END? BLO CHKPUD ;IF STILL IN PUD AREA, GO AGAIN MOV MYTI,A.TI(R2) ;PUT ME BACK AT MY NORMAL TI MOV R4,NUMDIA ;SAVE NUMBER OF DIALUP LINES FOUND .SBTTL MAIN CHECKING LOOP ;ALWAY HAVE ;R2 - MY ATL NODE ; ;AS RESULT OF INTO CODE ; ;MYTI: MY ORIGINAL TI PUD POINTER ;NUMDIA: NUMBER OF DIALUP LINES FOUND ;PUDSAV: ROOM FOR UP TO 10 PUD POINTERS FOR DIALUP LINES ; CHECK: MOV #PUDSAV,R0 ;POINT TO SAVE AREA MOV NUMDIA,R1 ;NUMBER OF LINES TO CHECK LOOP: MOV (R0)+,R5 ;GET TERMINAL PUD ADDRESS IN R5 BITB #UT.LG,U.TF(R5) ;IS HE LOGGED ON BEQ NOTBAD ;NO, SKIP IT TST U.AF(R5) ;IS HE ATTACHED? BNE NOTBAD ;IF SO, HE HAS A TASK ACTIVE, SO SKIP IT MOV R5,A.TI(R2) ;CHANGE MY PUD POINTER TO MATCH DIR$ #FULDUP ;SET TO FULL DUPLES SO NO REPROMPTS OCCUR CLR IOSB ;CLEAR RETURNED STATUS OF IO DIR$ #ONECHR ;TRY A NULL WRITE DIR$ #MARK10 ;AND WAIT 10 TICKS DIR$ #WAIT1 ;WAIT FOR EVENTS MOV IOSB,-(SP) ;SAVE IOSB AS RESULT OF READ DIR$ #RESFUL ;UNDO FULL DUPLEX CONDITION MOV (SP)+,IOSB ;RESTORE IOSB RETURN FROM READ ;WHEN WE WAKE UP, COULD HAVE TIMED OUT IF ;SOME TASK HAD IO PENDING HERE, SO TST IOSB ;DID IO FINISH? BNE 1$ ;SKIP IF IT DID DIR$ #CANONE ;CANCLE ABOVE READ IF IT DIDN'T 1$: CMPB IOSB,#IE.DNR ;IS DEVICE NOT READY BNE NOTBAD ;ITS OK MOV U.UI(R5),UICSAV ;SAVE THE UIC BEFORE BYE RUNS DIR$ #SPWBYE ;HE HUMG UP WITHOUT SIGNIN OFF, RUN BYE DIR$ #WAIT1 ;WAIT FOR BYE TO FINISH MOVB U.UN(R5),R5 ;GET UNIT NUMBER CLR R4 ;SET FOR 2-REG DIVIDE DIV #10,R4 ;REMAINDER (LOWER DIGIT) IN R5 ;QUOTIENT (UPPER DIGIT) IN R4 BIS #60,R4 ;CONVER TO ASCII MOVB R4,HNGPTR ;PUT IN ASCII MESSAGE BIS #60,R5 ;CONVERT TO ASCII MOVB R5,HNGPTR+1 ;PUT IN MESSAGE MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOVB UICSAV+1,R1 ;GET GROUP NUMBER MOV #HNGGRO,R0 ;POINT TO ASCII LINE MOV #1,R2 ;SHOW DON'T SUPRESS LEADING 0'S JSR PC,$CBTMG ;CONVERT GROUP NUMBER TO ASCII MOVB UICSAV,R1 ;GET USER NUMBER MOV #HNGUSE,R0 ;POINT TO ASCII LINE JSR PC,$CBTMG ;CONVERT USER NUMBER TO ASCII MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 MOV MYTI,A.TI(R2) ;RESTORE MY PUD POINTER DIR$ #REPHNG ;REPORT LINE SIGNED OFF NOTBAD: MOV MYTI,A.TI(R2) ;RESTORE MY PUD POINTER IN ANY CASE DEC R1 ;COUNT ONE LINE SERVICED BEQ WAIT ;DO NOE MINUTE WAIT IF DONE JMP LOOP ;ELSE DO AGAIN WAIT: DIR$ #CANCEL ;CANCEL ANY OUTSTANDING MARK TIMES DIR$ #MARK ;DO ONE MINUTE WAIT DIR$ #STOP1 ;DO STOP FOR IT JMP CHECK ;AND CHECK AGAIN .SBTTL DIRECTIVE PARAMETER BLOCKS ; ; ;QIO TO GET TERMINAL CHARACTERISTICS GETDIA: QIOW$ SF.GSC,1,1,,IOSB,, ;DIAL UP LINE (RET IN IOSB+2) ; ;SET TO FULL DUPLEX FULDUP: QIOW$ SF.SSC,1,1,,IOSB,, ;SET TO FULL DUPLEX ; ;DO ONE CHARACTER WRITE (A NULL) WITH NULL CARR CONTROL ONECHR: QIO$ IO.WLB,1,1,,IOSB,, NULPTR: .WORD 0 NULLEN=1 ; ;THEN RESET FULL DUPLEX RESFUL: QIO$ SF.SSC,1,1,,IOSB,, ; ;QIO TO KILL ABOVE READ IF TERM ATTACHED OR SOMETHING ELSE CANONE: QIOW$ IO.KIL,1,1 ; ;QIO TO REPORT LINE HUNG UP TO TI: REPHNG: QIOW$ IO.WVB,1,1,,IOSB,, ; ; ;STOP FOR EVENT FLAG 1 STOP1: STSE$ 1 ; ;WAIT FOR EVENT FLAG 1 WAIT1: WTSE$ 1 ; ;MARK TIME FOR 10 TICKS MARK10: MRKT$ 1,10,1 ; ;MARK TIME FOR ONE MINUTE MARK: MRKT$ 1,1,3 ; ;CANCEL MARK TIME REQUESTS CANCEL: CMKT$ ; ;SPAWN ...BYE SPWBYE: SPWN$ ...BYE,,,1,1 ;SPAWN ...BYE WITH DEF PART, PRI ; .SBTTL DATA AREAS IOSB: .WORD 0,0 ;IO STATUS BLOCK MYTI: .WORD 0 ;SAVE MY TI HERE NUMDIA: .WORD 0 ;NUMBER OF DIALUP LINES FOUND UICSAV: .WORD 0 ;SAVE UIC BEFORE CALLING BYE PUDSAV: .BLKW 10 ;ROOM FOR 10 (8.) PUD POINTERS ; HNGMES: .ASCII /*** USER LOGGED OFF AT TT/ HNGPTR: .ASCII /00: UIC=[/ HNGGRO: .ASCII /000,/ HNGUSE: .ASCII /000] ***/ HNGLEN=.-HNGMES .EVEN .END DIAL