ASMB,Q,R,C
      HED <UPLIN> 91750-16179 REV.2013 (C) HEWLETT-PACKARD CO. 1980 
      NAM UPLIN,17,3 91750-16179 REV.2013 801013 ALL
      SPC 2 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS      *
*  * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY.   *
******************************************************************
      SPC 4 
* 
*       UPLIN 
*     --------------
*     SOURCE PART # 91750-18179 
*     REL PART #    91750-16179 
*     WRITTEN BY:   TOM MILNER
*     DATE WRITTEN  DEC 1979
* 
*    MODIFIED:
*      801013 BY FF TO IMPLEMENT FUNCTION 9, AND TO CHANGE
*             FUNCTION 4 SUCH THAT A LONG TIME OUT DOES NOT 
*             MASK A DORMANT OR "BAD" MASTER TCB CONDITION. 
* 
      SPC 3 
*     EXTERNAL REFERENCES 
      EXT EXEC,$LIBR,$LIBX,PGMAD,RNRQ,CLRQ,.MVW,#FWAM 
      EXT MESSS,#RSAX,#UPSM,DTACH 
* 
      EXT #OTCV,#INCV,$OPSY,#MCTR 
      EXT #RPCV,#LUMP,#RSM
      EXT #BUSY,#QRN,#LDEF
      EXT #GRPM,#LU3K,#QXCL,#TST
      EXT #PNLH,#MRTH,#CLRN 
      EXT #OFF,#PLOG
      SUP 
      SPC 3 
*  UPLIN FOR DS/1000   UPLIN IS SCHEDULED EVERY 5 SECONDS TO PERFORM
*  THE FOLLOWING FUNCTIONS: 
*    1.  CHECKS/WAITS FOR SYSTEM QUIESCENCE.  PRINTS OPERATOR MESSAGE 
*        WHEN QUIESCENCE IS ACHIEVED. 
*    2.  UPDATES SLAVE "TCB" TIMEOUT VALUES, AND IF A TRANSACTION HAS 
*        TIMED OUT, THE TCB IS PURGED, AND IF THE MONITOR ABORT 
*        FLAG IS SET, THE MONITOR IS ABORTED. 
*    3.  AFTER PROCESSING EACH SLAVE TCB LIST, UPLIN CHECKS TO SEE IF 
*        THE CORRESPONDING MONITOR IS DORMANT, AND IF SO, RESCHEDULES IT. 
*    4.  UPDATES MASTER TCB TIMEOUT VALUES, IF A MASTER TCB TIMES-OUT,
*        OR IF IT IS DORMANT OR IF THE "BAD 
*        CONTENTS" FLAG IN THE TCB IS SET, THE MASTER CLASS NUMBER
*        AND THE TCB ARE CLEARED.  IF IN A "WAIT" STATE, IT WRITES
*        A NULL REQUEST TO THE MASTER REQUESTERS CLASS. 
*    5.  SCANS THE HP3000 PROCESS NUMBER LIST AND SENDS A "KILL"
*        REQUEST FOR ABANDONED PROCESS NUMBERS. 
*    6.  IF QUEX SIGNALS HP3000 LINE DOWN (BY SETTING #CLRN RESOURCE
*        NUMBER), UPLIN CLEANS UP HP3000 TABLES:
*           * DELETES ALL PROCESS NUMBER LIST ENTRIES (PNL) 
*           * SIMULATES TIME-OUT ON ALL HP3000 MASTER TCBS
*           * CLEARS ALL TST ENTRIES & CORRESPONDING SLAVE TCBS 
*    7.  RELEASE ANY "DEAD" 1K #POOL ENTRIES IN THE PNL.
*    8.  RESCHEDULES "GRPM","RTRY", OR "QCLM" IF THEY ARE DORMANT.
*    9.  IF PLOG IS DORMANT BUT CLASS & SAM BUFFERS ARE ALLOCATED,
*        THEN BOTH ARE DEALLOCATED. 
* 
* 
* 
S#MAX EQU 12        MAX STREAM NUMBER + 1 
A     EQU 0 
B     EQU 1 
      SKP 
UPLIN EQU * 
      JSB DTACH     DETACH FROM SESSION CONTROL 
       DEF *+1
      LDA #FWAM     CHECK TO SEE THAT DS IS INITIALIZED 
      SZA,RSS 
      JMP EXIT      DS IS NOT INITIALIZED -- EXIT 
* 
      LDA $OPSY 
      RAR,SLA       IS THIS AN RTE-III OR RTE-IV? 
RSSI  RSS           YES 
      JMP *+4       NO
      LDB RSSI      GET "RSS" 
      STB MODI1     MODIFY TO DO CROSS-MAP STORE
      STB MODI2     MODIFY TO DO CROSS-MAP LOAD 
* 
* 
*     (1.) CHECK FOR SYSTEM QUIESCENCE
* 
      LDA GLCW      GET GLOBAL RN LOCK/CLEAR COMMAND
      RAL,ARS       SET THE NO-WAIT BIT 
QRNWT STA RNCW      SAVE CONFIGURED CONTROL WORD
* 
      JSB RNRQ      GO TO RTE TO REQUEST
       DEF *+4        RESOURCE NUMBER STATUS, 
       DEF RNCW        OR TO AWAIT CLEARING OF THE RN.
       DEF #QRN      ADDR OF QUIESCENT RN 
       DEF TEMP      RETURN STATUS
      JMP #1.       IGNORE ERRORS 
* 
      LDA RNCW      IF PROGRAM HAS BEEN AWAITING
      CPA GLCW       THE CLEARING OF #QRN, THEN 
      JMP #1.       BYPASS THE MESSAGE CODE.
* 
      LDA TEMP      QRN STATUS
      LDB #BUSY     ACTIVE TCB COUNT
      CPA K7        IF QRN WAS LOCKED GLOBALLY, 
      SZB            AND NO ACTIVE TCB'S EXIST, SKIP
      JMP #1.       ELSE BYPASS QUIESCENT CODE. 
* 
      LDA GLCW      RETURN TO IMMOBILIZE UPLIN
      JMP QRNWT 
* 
#1.   EQU *         END OF STEP 1 
      SKP 
* 
*     (2.) THIS SECTION PROCESSES SLAVE TRANSACTIONS & MONITORS 
* 
      LDA K2
      ADA #LDEF 
      STA PTR       PNTR TO SLAVE LIST HEADER ADDRS IN RES
      CLA 
      STA STREM     SET STREAM #
CKLST LDA PTR,I     GET ADDRESS OF HEADER 
      INA 
      STA @CLAS     SAVE ADDR OF MONITOR CLASS #
      INA           ADDRESS OF SLAVE MONITOR NAME 
      LDB @MON      MOVE NAME TO LOCAL BUFFER 
      JSB .MVW
       DEF K3 
       NOP
      LDA @MON,I    GET FIRST 2 BYTES OF NAME 
      STA ABORT        AND SAVE ABORT BIT (BIT15) 
      ELA,CLE,ERA         THEN STRIP IT OFF 
      STA @MON,I             AND RESTORE 2 BYTES OF NAME
      SZA,RSS       DOES MONITOR EXIST? 
      JMP NXLST     . NO TRY NEXT SLAVE 
      LDB PTR,I 
NXTCB STB NXADR     SAVE ADDR OF ADDR OF NEXT TCB 
* 
*     ENTER HERE TO CHECK EACH SLAVE TCB FOR TIMEOUT
* 
CKTCB LDB NXADR     PICK UP ADDR OF ADDR OF TCB 
      JSB LODWD     (CROSS)LOAD ADDR OF TCB 
      SZA,RSS       IS IT THERE?
      JMP CKMON     NO, END OF THIS LIST
      LDB A         <B> --> TCB 
      JSB TIMER     BUMP TIMER IN TCB 
      JMP NXTCB     DIDN'T TIMEOUT, CHECK NEXT TCB
* 
*     SLAVE TRANSACTION HAS TIMED OUT 
* 
      INB           <B> --> TIMEOUT & 3K BIT (TCB+1)
      JSB LODWD 
      RAL           3K BIT TO SIGN
      STA TEMP         AND SAVE IT FOR LATER
      INB           <B> --> SEQUENCE NUMBER (TCB+2) 
      JSB LODWD     (CROSS)LOAD 1ST TIME TAG WORD 
      STA SEQ#
* 
      JSB #RSAX     DELETE SLAVE TCB
       DEF *+4
       DEF K7 
       DEF SEQ#      SLAVE SEQ #
       DEF STREM     STREAM 
      SSB           SKIP IF ENTRY DELETED 
      JMP NXLST     WHOOPS! IGNORE THIS LIST
* 
      LDA TEMP      CHECK IF THIS IS A 3K REQUEST 
      SSA,RSS 
      JMP CONT      . NO 1K REQUEST ... CONTINUE
* 
      JSB EXEC      CLASS WRITE A 1-WORD MESSAGE
       DEF *+8          TO RPCNV SO IT  WILL SEND REJECT
       DEF K20N            TO 3K AND CLEAN UP TST.
       DEF K0 
       DEF SEQ# 
       DEF K1 
       DEF K1 
       DEF K0 
       DEF #RPCV
       NOP
* 
CONT  EQU *         CONTINUE
* 
*      CHECK MONITOR ABORT FLAG 
      LDA ABORT 
      SSA,RSS       SKIP IF SET 
      JMP CKTCB     NOT SET, DON'T ABORT IT, CHECK NEXT TCB 
* 
*     ABORT THE MONITOR BY GENERATING AN "OF,(NAME),1" MESSAGE
* 
      LDA @OFME     <A> --> 'OFF,XXXXXX,FL' 
      LDB @OFBU     <B> --> STORAGE 
      JSB .MVW      MOVE MSG SO 'MESSS' WON'T 
       DEF K7           WIPE IT OUT   (DUMB ROUTINE)
       NOP
      LDA @MON      <A> --> SLAVE MONITOR NAME
      LDB @NAM      <B> --> 'MESSS' BUFFER
      JSB .MVW
       DEF K3 
       NOP
* 
      JSB MESSS     CALL RTE MESSAGE PROCESSOR
       DEF *+3
@OFBU  DEF OFBUF     "OFF,XXXXXX,FL" (FL FOR 'L' COMPATIBILITY) 
       DEF K13
      JMP UPMON     GO TO RE-SCHEDULE THE MONITOR.
* 
*     (3.) THIS CODE CHECKS MONITOR STATUS TO SEE IF IT HAS ABORTED 
CKMON LDA @MON,I    1ST WORD OF MONITOR NAME
      SZA,RSS       DOES MONITOR EXIST? 
      JMP NXLST     . NO
* 
      JSB PGMAD     CHECK SLAVES STATUS 
       DEF *+2
@MON   DEF MON       SLAVE NAME 
      SZA,RSS       IF SLAVE NO LONGER EXISTS 
      JMP NXLST        THEN CHECK NEXT SLAVE (NEEDS WORK)...
      SZB           RESCHEDULE IF DORMANT 
      JMP NXLST        ELSE MONITOR IS STILL GOING
* 
*     RESCHEDULE MONITOR
UPMON LDA @CLAS,I   GET CLASS NUMBER OF MONITOR 
      RAL,CLE,ERA   CLEAR SIGN BIT
      STA PARAM     PARAMETER TO SCHEDULED ROUTINE
* 
      JSB SCHDL     SCHEDULE MONITOR, PASS CLASS NUMBER 
MON   BSS 3 
* 
*     DONE WITH THIS SLAVE LIST, START ON NEXT
NXLST ISZ PTR       POINT TO NEXT LIST HEADER ADDRESS 
      ISZ STREM     BUMP STREAM NUMBER
      LDA STREM 
      CPA MAXS#     DONE? 
      RSS           . YES NOW CHECK MASTER TCBS 
      JMP CKLST     PROCESS NEXT LIST 
* 
*     DONE WITH SLAVE MONITOR/TRANSACTION PROCESSING
* 
#3.   EQU *         END OF STEP 3.
      SKP 
*     (4.) PROCESS MASTER TCBS
* 
      LDB #MRTH     MASTER TCB HEADER 
      STB NXADR 
      CCA           STREM = -1 INDICATES
      STA STREM       A MASTER TCB IN 'TIMER' 
CKMST LDB NXADR     NEXT TCB ADDRESS
      SZB,RSS       ANOTHER TCB?
      JMP #4.       . NO
      JSB LODWD     . YES, PROCESS IT 
      STA NXADR     SAVE LINK WORD (TO NEXT TCB)
      JSB TIMER     DID THIS TCB TIME OUT?
      RSS           . NO
      JSB TMOUT     . YES CLEAN UP TABLES 
      JMP CKMST 
* 
#4.   EQU *         END OF STEP 4.
      SKP 
*     (5.) CLEANUP THE PROCESS NUMBER LIST (PNL). 
* 
      LDB #PNLH     PROCESS NUMBER LIST (PNL) HEADER
      STB NXADR 
CKPNL LDB NXADR     NEXT PROCESS NUMBER ADDRESS 
      STB PTR       (SAVE FOR LATER)
      SZB,RSS       ANOTHER ENTRY?
      JMP #5.       . NO
      JSB LODWD     . YES, GET LINK WORD
      STA NXADR     NEXT PN ENTRY ADDRESS 
* 
      INB           <B> --> HP3000 BIT (PNL+1)
      JSB LODWD 
      STA TEMP      SAVE BIT FOR LATER CHECK
      INB           <B> --> NODE NUMBER (PNL+2) 
      JSB LODWD 
      STA NODE
      ADB K2        <B> --> ID SEG ADDRS (PNL+4)
      JSB STATE     GET PGM STATE 
      SZA           DORMANT?
      SSA           BAD ID SEGMENT? 
      RSS           . YES, SEND "KILL" MSG
      JMP CKPNL     . NO LOOK AT NEXT ENTRY 
* 
      INB           <B> --> PROCESS # (PNL+5) 
      JSB LODWD     (CROSS)LOAD PROCESS # 
      STA KLBUF+4   SAVE FOR POSSIBLE "KILL". 
      LDA TEMP      CHECK FOR HP3000 PROCESS
      RAL 
      SSA 
      JMP OFF3K     LOGOFF THE 3000 PNL 
* 
      LDA PTR       <A> --> 1000 PNL ENTRY
      JSB #UPSM     LOGOFF THE 1000 PNL 
      JMP DELET 
* 
* SEND A "KILL" REQUEST TO THE 3000 DIRECTLY THROUGH QUEX.
* SINCE THE "FROM PROCESS #" IN THE REQUEST IS ZERO (NORMALLY THE 
* MASTER CLASS NUMBER), QUEX WILL SEND $STDLIST TO "CNSLM" AND
* IGNORE THE FINAL REPLY. 
* 
OFF3K LDA #QXCL     I/O CLASS # FOR QUEX
      SZA,RSS       IS HP3000 INCLUDED IN DS? 
      JMP DELET     NO. LEAVE PNL AS IS.
      SSA           IS HP3000 DISCONNECTED? 
      JMP DELET     . YES, IGNORE 'KILL', JUST DELETE PNL 
* 
      JSB EXEC      CLASS WRITE "KILL" REQUEST TO QUEX. 
       DEF *+8
       DEF K20N 
       DEF K0 
       DEF KLBUF
       DEF K8 
       DEF K8 
       DEF K0 
       DEF #QXCL
       NOP           IGNORE ERRORS. 
* 
DELET JSB #RSAX     DELETE PNL ENTRY. 
       DEF *+4
       DEF K10       CODE FOR "REMOVE". 
       DEF KLBUF+4   SMP NUMBER.
       DEF NODE      NODE NUMBER (-1 FOR HP3000)
      JMP CKPNL     GO CHECK NEXT ENTRY.
* 
KLBUF BYT 10,6      LENGTH,CLASS
      OCT 0 
      OCT 27        STREAM
      OCT 0,0,0,0,0 
* 
#5.   EQU *         END OF STEP 5.
      SKP 
*     (6.) IF QUEX HAS SET RN INDICATING HP3000 LINK DOWN CLEAN 
*           UP ALL OF THE HP3000 TABLES IN SAM. 
* 
      JSB RNRQ      IS
       DEF *+4         HP3000 
       DEF LKCLR         RESOURCE 
       DEF #CLRN           NUMBER 
       DEF TEMP              SET? 
       NOP
      LDA TEMP
      CPA K7        LOCKED? 
      RSS           . YES CLEAN UP HP3000 BLOCKS
      JMP #6.       . NO CONTINUE 
* 
*     SCAN THRU PNL AND DELETE ALL HP3000 ENTRIES.
* 
      LDB #PNLH     PNL HEADER
      STB NXADR 
CLPNL LDB NXADR 
      SZB,RSS       ANY MORE ENTRIES
      JMP MTCBS     . NO CHECK MASTER TCBS
      JSB LODWD     GET LINK WORD 
      STA NXADR     NEXT ENTRY
      INB           <B> --> 3000 BIT (PNL+1)
      JSB LODWD 
      RAL           CHECK FOR 1000 PNL
      SSA,RSS 
      JMP CLPNL     THIS IS A 1000 PNL, IGNORE IT 
      ADB K4        POINT TO PROCESS # (PNL+5)
      JSB LODWD     LOAD PROCESS # FOR SEARCH 
      STA TEMP
* 
      JSB #RSAX     DELETE PROCESS # LIST ENTRY 
       DEF *+4
       DEF K10       CODE FOR "REMOVE"
       DEF TEMP      SEARCH, USING PROCESS #
       DEF N1        NODE NUMBER (-1 FOR HP3000)
      JMP CLPNL 
* 
*     SCAN THRU TCBS & SIMULATE TIMEOUT FOR ANY HP3000
*     MASTER TCB. 
* 
MTCBS LDB #MRTH     MASTER TCB HEADER 
      STB NXADR 
NEXT  LDB NXADR     NEXT TCB ADDRESS
      SZB,RSS       ANY MORE ENTRIES? 
      JMP CLTST     . NO CLEAR TST NOW
      JSB LODWD     GET LINK WORD 
      STA NXADR     SAVE NEXT TCB ADDRESS 
* 
      INB 
      JSB LODWD     GET TIMEOUT WORD (TCB+1)
      RAL           GET TO BIT14 (HP3000 BIT) 
      SSA,RSS       HP3000 TCB? 
      JMP NEXT      . NO
      ADB N1        . YES, POINT B TO START OF TCB
      JSB TMOUT     SIMULATE TCB TIMEOUT ACTION 
      JMP NEXT
* 
*     CLEAR EACH ACTIVE TST ENTRY, ITS CORRESPONDING SLAVE TCB, 
*     AND ITS CLASS (IF ALLOCATED). 
* 
CLTST EQU * 
      LDA #TST+1    NUMBER OF ENTRIES 
      SZA,RSS 
      JMP UNLOK     ALL DONE, UNLOCK QUEX 
      CMA,INA 
      STA CTR 
* 
      LDB #TST      ADDRESS OF TST
TLOOP STB NXADR 
      JSB LODWD     (CROSS) LOAD STREAM WORD
      SZA,RSS 
      JMP TBUMP     STREAM ZERO MEANS ENTRY INACTIVE
      STA STREM     SET UP STREAM NUMBER FOR RSAX CALL
      CLA 
      JSB STRWD     INACTIVATE ENTRY
      INB 
      JSB LODWD 
      STA SEQ#      SEQUENCE NUMBER 
      INB 
      JSB LODWD     CLASS # 
      JSB DEFLU     DEALLOCATE CLASS (IF ALLOCATED) 
* 
      JSB #RSAX     DELETE SLAVE TCB
       DEF *+4
       DEF K7 
       DEF SEQ# 
       DEF STREM
* 
TBUMP LDB NXADR 
      ADB K14 
      ISZ CTR 
      JMP TLOOP 
* 
*     UNLOCK RESOURCE NUMBER ACTIVATING QUEX
UNLOK JSB RNRQ
       DEF *+4
       DEF CLRRN     (OCT 14004)
       DEF #CLRN
       DEF TEMP 
* 
#6.   EQU *         END OF STEP 6 
      SKP 
*     (7.) INCREMENT IDLE TIMERS ON REMOTELY CREATED SESSIONS 
* 
      CLA 
      JSB #UPSM 
      SPC 3 
*     (8.) RESCHEDULE HP1000 AND/OR HP3000 MONITORS IF THEY ARE DORMANT 
* 
      LDA #LU3K     IF NO HP3000
      SZA,RSS        CONNECTED, 
      JMP RE1K        GO RESCHEDULE HP1000 MONITORS.
* 
*     RESCHEDULE "QUEX", "RQCNV", OR "RPCNV" IF THEY ARE DORMANT
* 
      CLA 
      STA PARAM     SET UP SCHEDULING PARAMETER 
      JSB SCHDL     TRY TO SCHEDULE QUEX (IF DORMANT) 
      ASC 3,QUEX
      JSB SCHDL     TRY TO SCHEDULE RQCNV (IF DORMANT)
      ASC 3,RQCNV 
      JSB SCHDL     TRY TO SCHEDULE RPCNV (IF DORMANT)
      ASC 3,RPCNV 
* 
      LDA #GRPM     IF NO HP1000
      SZA,RSS        CONNECTED, 
      JMP #8.         ALL DONE! 
      SPC 1 
* 
*     RESCHEDULE "GRPM", "RTRY", OR "QCLM" IF THEY ARE DORMANT
* 
RE1K  JSB SCHDL     TRY TO SCHEDULE GRPM (IF DORMANT) 
      ASC 3,GRPM
      JSB SCHDL     TRY TO SCHEDULE RTRY (IF DORMANT) 
      ASC 3,RTRY
      JSB SCHDL     TRY TO SCHEDULE QCLM (IF DORMANT) 
      ASC 3,QCLM
* 
*     SCHEDULE LU MAPPING IF FLAG SET 
* 
      LDA #LUMP 
      SZA,RSS 
      JMP *+5 
      JSB SCHDL     TRY TO SCHEDULE LUMAP (IF DORMANT)
      ASC 3,LUMAP 
* 
*     SCHEDULE REMOTE SESSION MONITOR IF FLAG SET 
* 
      LDA #RSM
      SZA,RSS 
      JMP *+5 
      JSB SCHDL 
      ASC 3,RSM 
* 
*     CHECK IF REQUEST/REPLY CONVERTERS NEED BE SCHEDULED.
* 
      LDA #OTCV     OUTPUT CONVERTERS CLASS # 
      SZA,RSS       CLASS ALLOCATED?
      JMP RE1K2     . NO TRY INPUT CONVERTER
      JSB PGMAD     CHECK STATUS
       DEF *+2         OF OUTPUT
       DEF OTCNV         CONVERTER
      SZB           DORMANT?
      JMP RE1K2     . NO
      JSB SCHDL     . YES SCHEDULE IT 
OTCNV ASC 3,OTCNV 
* 
RE1K2 EQU * 
      LDA #INCV     INPUT CONVERTERS CLASS #
      SZA,RSS       CLASS ALLOCATED?
      JMP CHKMA     . NO ALL DONE 
      JSB PGMAD     CHECK STATUS
       DEF *+2         OF INPUT 
       DEF INCNV         CONVERTER
      SZB           DORMANT?
      JMP CHKMA     . NO
      JSB SCHDL     . YES SCHEDULE IT 
INCNV ASC 3,INCNV 
* 
*     CHECK IF 'MATIC' NEEDS TO BE SCHEDULED
* 
CHKMA LDA #MCTR 
      SZA,RSS       MA IN SYSTEM? 
      JMP #8.       . NO ALL DONE 
* 
      JSB PGMAD     GET MATIC'S STATUS
       DEF *+3
       DEF MATIC
       DEF IDSEG
* 
      SSB           MATIC IN TIME LIST? (STATUS < 0)
      JMP #8.       . YES OK
* 
      JSB EXEC      . NO PUT MATIC IN TIME LIST 
       DEF *+6
       DEF K12N      INITIAL OFFSET SCHEDULE
       DEF MATIC     PROGRAM NAME 
       DEF K2        RESOLUTION (2=SECS)
       DEF K1        MULTIPLE (1=EVERY SECOND)
       DEF N2        RUN AFTER 2 SECONDS
      NOP           WE DON'T CARE ABOUT ERRORS HERE.
#8.   EQU *         END OF STEP 8 
      SKP 
*      (9.) IF PLOG IS DORMANT BUT CLASS & SAM BUFFERS ARE ALLOCATED, 
*           CLEAN & DEALLOCATE CLASS AND DEALLOCATE RESOURCE NUMBER 
* 
* 
      LDA #PLOG     CLASS ALLOCATED 
      SZA,RSS        FOR PLOG?
      JMP #9.        . NO, ALL DONE 
* 
      JSB PGMAD     FIND STATE OF PLOG
       DEF *+2
       DEF PLOG 
* 
      CPB K6        STATE = 6?
      JMP OFFP      . YES, OFF PLOG 
      CMB,INB       STATE > 0?
      SSB 
      JMP #9.       .YES, ALL DONE  
* 
OFFP  JSB #OFF      MAKE SURE PLOG
       DEF *+2       IS DORMANT 
       DEF PLOG 
* 
      LDA #PLOG+1   MAKE LOCAL COPY 
      STA TEMP       OF RESOURCE NUMBER 
      LDA #PLOG     HOLD CLASS NUMBER (FOR DEFLU) 
      CLB           CLEAR CLASS # AND 
      STB #PLOG      RESOURCE # IS RES
      STB #PLOG+1 
* 
      JSB DEFLU     DEALLOCATE CLASS
* 
      LDA TEMP      IS RESOURCE NUMBER
      SZA,RSS        ALLOCATED? 
      JMP #9.        . NO ALL DONE
* 
      JSB RNRQ      DEALLOCATE
       DEF *+4        RESOURCE NUMBER 
       DEF RN32 
       DEF TEMP 
       DEF TEMP 
      NOP           IGNORE ERROR
* 
#9.   EQU *         END OF STEP 9 
      SKP 
*----------------------------------------------------------+
*               EXIT UPLIN                                 |
*----------------------------------------------------------+
EXIT  JSB EXEC
       DEF *+4
       DEF K6 
       DEF K0 
       DEF N1 
      SKP 
*     SUBROUTINES 
      SPC 3 
*     ROUTINE TO TIME OUT MASTER TCB'S (B --> TCB)
* 
*     IF BAD ID SEGMENT OR MASTER IS DORMANT THEN CLEAR 
*     CLASS # AND DEALLOCATE TCB.  IF (MASTER) WAITING SEND 
*     HIM A NULL MESSAGE TO INDICATE TIMEOUT. 
* 
      BSS 1         (STORAGE) 
TMOUT NOP 
      ADB K2        POINT TO SEQUENCE NUMBER (TCB+2)
      JSB LODWD     LOAD SEQUENCE NUMBER
      STA SEQ#      SAVE SEQUENCE NUMBER
* 
      INB           POINT TO TCB+3
      JSB LODWD        AND GET CLASS
      STA TMOUT-1         AND SAVE IT 
      AND =B77777   ISOLATE CLASS # 
      SZA,RSS       CLASS # = 0?
      JMP CLTCB     .YES, JUST CLEAR THE TCB
* 
      INB           POINT TO ID SEGMENT (TCB+4) 
      JSB STATE     GET PGM STATE 
      RAL,CLE,SLA,ERA   CLEAR OFF SIGN BIT
      JMP CLEAR     "BAD CONTENTS", CLR CLASS & TCB 
      SZA,RSS       DORMANT?
      JMP CLEAR     . YES, CLEAR CLASS AND TCB
      CPA K3        THIS MASTER IN WAIT STATE?
      RSS           . YES, SEND HIM A NULL MESSAGE
      JMP TMOUT,I   . NO ALL DONE 
* 
*     WRITE A NULL REQUEST INTO THE MASTER REQUESTERS CLASS 
      JSB EXEC
       DEF *+8
       DEF K20N      CLASS WRITE/READ, NO ABORT 
       DEF K0 
       DEF K0 
       DEF K0        ZERO DATA LENGTH 
       DEF SEQ#      SEND SEQUENCE NUMBER TO WAITER 
       DEF K0        ZERO REQUEST LENGTH
       DEF TMOUT-1   CLASS NUMBER 
* 
K0    NOP 
      JMP TMOUT,I   RETURN
* 
*     MASTER REQUESTER IS DORMANT, CLEAR CLASS AND TCB
* 
CLEAR LDA TMOUT-1 
      JSB DEFLU     CLEAR CLASS 
CLTCB EQU * 
      JSB #RSAX     CALL #RSAX TO PURGE MASTER TCB
       DEF *+3
       DEF K6 
       DEF SEQ#      SEQUENCE NUMBER OF MASTER TCB
      JMP TMOUT,I   RETURN
      SPC 2 
*     THIS ROUTINE BUMPS THE TIMEOUT IN A TCB (B --> TCB) 
*     AND CHECKS FOR BAD ID SEGMENTS IN MASTER TCBS.
*     'STREM' MUST BE SET (-1=MASTER TCB) 
*     ON RETURN (P+1) IF TCB STILL ACTIVE 
*               (P+2) IF TCB HAS TIMED OUT. 
* 
      BSS 1         (STORAGE) 
TIMER NOP 
      STB TIMER-1   SAVE ADDRESS OF THIS TCB
      LDA STREM     GET STREAM
      SSA           MASTER TCB? 
      JMP TMTCB     YES 
      INB           POINT TO 2ND WORD OF TCB (TCB+1)
      JSB LODWD     (CROSS)LOAD TIMER 
      SSA           LONG TIMEOUT SET (SEE 'LTIME')? 
      JMP TIME1+1   . YES, TIMEOUT ALREADY RESET
      AND FLMSK     SAVE FLAG BITS (14-8) 
      STA FLBYT 
      LDA STREM     GET STREAM
      CPA K3        SLAVE EXECW REQUEST?
      JMP LONGT     YES, SET LONG TIMEOUT 
      JMP TIME1     . NO JUST DO A TICK 
TMTCB ADB K4        POINT TO ID SEG ADDRS (TCB+4) 
      JSB STATE     GET PGM STATE 
      SZA           DORMANT?
      SSA           BAD ID?  (FLAG SET BY #RSAX)
      JMP TIME5     . YES RETURN AS TIMEOUT 
      LDB TIMER-1   NO, POINT TO 2ND WORD 
      INB              OF TCB (TCB+1) 
      JSB LODWD     (CROSS)LOAD TIMER 
      SSA           LONG TIMEOUT SET? 
      JMP TIME1+1   YES, INC TIMEOUT CNTR 
      AND FLMSK     SAVE FLAG BITS (14-8) 
      STA FLBYT     
      ADB K2        POINT TO CLASS (TCB+3)
      JSB LODWD     GET CLASS WD/ TIMEOUT FLAG
      ADB N2        POINT TO TIMEOUT (TCB+1)
      SSA,RSS       LONG TIMEOUT FOR THIS TCB?
      JMP TIME1     NO, JUST DO A TICK
* 
LONGT LDA LTIME     20 MINUTE TIMEOUT 
      IOR FLBYT     RESTORE FLAG BITS (14-8)
      JMP TIME2 
* 
TIME1 JSB LODWD     RELOAD TIMER
      AND B377      ISOLATE IT
      CPA B377      IS IT ABOUT TO ROLL OVER? 
      JMP TIME5     YES, DON'T BUMP IT, RETURN + 2
* 
      JSB LODWD     (CROSS)LOAD TIMER AGAIN 
      INA           BUMP TIMER
TIME2 JSB STRWD     (CROSS)STORE
      RSS           RETURN +1 FOR NOT TIMED-OUT 
TIME5 ISZ TIMER     RETURN +2 FOR TCB TIMED-OUT 
      LDB TIMER-1   TCB ADDR INTO <B> 
      JMP TIMER,I   RETURN
      SPC 3 
*     SUBROUTINE TO LOAD WORD FROM ALTERNATE MAP (IF RTE-III OR IV) 
* 
LODWD NOP 
MODI2 LDA B,I       GET WORD FROM TCB (RSS IF DMS SYSTEM) 
      JMP LODWD,I   RETURN IF RTE-II
      XLA B,I       LOAD WORD FROM ALTERNATE MAP
      JMP LODWD,I 
      SPC 3 
*     SUBROUTINE TO STORE A WORD IN ALTERNATE MAP (IF RTE-III OR IV)
* 
STRWD NOP 
      JSB $LIBR     LOWER FENCE 
       NOP
MODI1 NOP           RSS HERE IF DMS SYSTEM
      JMP TIME3 
      XSA B,I       STORE INTO SYSTEM MAPPED LOCATION 
      RSS 
*     BELOW INSTRUCTION IS EXECUTED FOR NON-DMS SYSTEMS ONLY
TIME3 STA B,I       STORE UPDATED TIMER IN TCB
      JSB $LIBX     RAISE FENCE 
       DEF STRWD     RETURN 
      SPC 3 
* STATE-  GETS PROGRAM STATE (STATUS) 
*         ON ENTRY  <B> --> [.] --> ID SEGMENT
*         ON RETURN <A> = PGM STATE(>0) OR ID SEG ADR(<0) 
* 
      BSS 1         (STORAGE) 
STATE NOP 
      JSB LODWD     GET ID SEG ADDRESS
      SSA           BAD ID SEGMENT? (-) 
      JMP STATE,I   . YES RETURN
      STB STATE-1   SAVE <B>
      CMA,INA       NEGATIVE ID SEG ADDRESS 
      STA IDSEG        TELLS PGMAD TO USE IT (NOT NAME) 
      JSB PGMAD     GET PGM STATUS
       DEF *+3
       DEF OFBUF     (DUMMY BUFFER FOR NAME)
       DEF IDSEG
      LDA B         RETURN STATUS IN <A>
      SSA           CHECK FOR TIME LIST (<A> < 0) 
      LDA TL           AND USE ALTERNATE STATUS CODE
      LDB STATE-1 
      JMP STATE,I   RETURN W/ STATUS
IDSEG BSS 1 
      SPC 3 
* DEFLU - DEALLOCATES A CLASS (AND FLUSHES BUFFERS) 
*     (<A> CONTAINS CLASS NUMBER) 
* 
      BSS 1         (STORAGE) 
DEFLU NOP 
      AND CLMSK     ISOLATE CLASS NUMBER (BITS 12-0)
      SZA,RSS       CLASS ALLOCATED?
      JMP DEFLU,I   . NO JUST RETURN
      STA DEFLU-1 
* 
      JSB CLRQ      DEALLOCATE CLASS
       DEF *+3
       DEF CLRQ2
       DEF DEFLU-1
       NOP
      JMP DEFLU,I 
      SPC 3 
*     SUBROUTINE TO SCHEDULE A PROGRAM (IF DORMANT) 
* 
SCHDL NOP 
      JSB EXEC      SCHEDULE
       DEF *+4
       DEF K10N 
       DEF SCHDL,I
       DEF PARAM     PRAM TO KEEP RPCNV/PLOG HAPPY
       NOP
      LDB SCHDL     SET RETURN
      ADB K3          ADDRESS 
      JMP B,I             RETURN
PARAM NOP           P1
      SKP 
*----------------------------------------------------------+
*               CONSTANTS                                  |
*----------------------------------------------------------+
@NAM  DEF OFBUF+2 
N1    DEC -1
N2    DEC -2
K1    DEC 1 
K2    DEC 2 
K3    DEC 3 
K4    DEC 4 
K6    DEC 6 
K7    DEC 7 
K8    DEC 8 
K10   DEC 10
TL    EQU K10       ALTERNATE STATUS -- TIME LIST 
K13   DEC 13
K14   DEC 14
CLRQ2 OCT 140002
MAXS# ABS S#MAX     MAXIMUM NUMBER OF STREAMS + 1 
B377  OCT 377 
FLMSK OCT 077400
CLMSK OCT 017777
LTIME OCT 100020
K10N  DEF 10,I
K12N  DEF 12,I
K20N  DEF 20,I
GLCW  OCT 040006     GLOBAL RN LOCK/CLEAR - NO ABORT
CLRRN OCT 140004
LKCLR OCT 140006
@OFME DEF *+1 
      ASC 7,OFF,XXXXXX,FL 
MATIC ASC 3,MATIC 
PLOG  ASC 3,PLOG    
RN32  OCT 040040
      UNS 
*----------------------------------------------------------+
*               STORAGE                                    |
*----------------------------------------------------------+
FLBYT BSS 1 
OFBUF BSS 6 
RNCW  BSS 1 
STREM BSS 1 
NXADR BSS 1 
TEMP  BSS 1 
SEQ#  BSS 1 
PTR   BSS 1 
CTR   BSS 1 
ABORT BSS 1 
@CLAS BSS 1 
NODE  BSS 1 
* 
SIZE  EQU * 
      END UPLIN 
                                                                                                                                                                                        