. **********************************************************************
. *                                                                    *
. *       T E R M I N A L   S H A R I N G   O P T I M I S E R          *
. *                                                                    *
. *                                     JOHN WALKER   MARCH 1975       *
. *                         MODIFIED BY MIKE DARNELL  JANUARY 1980     *
. *                                                                    *
. *       THIS PROGRAM PROVIDES A FACILITY BY WHICH MANY USERS MAY     *
. *       SHARE A SINGLE TERMINAL, OR A SINGLE TERMINAL MAY BE USED    *
. *       BY A HYDRA-HEADED SYSTEMS PROGRAMMER TO CONTROL A            *
. *       MULTITUDE OF RUNS.  THE PROGRAM USES RSI$ TO PASS IMAGES     *
. *       TO AND RECEIVE IMAGES FROM, THE VARIOUS SUBSIDIARY RUNS.     *
. *                                                                    *
. *       THE TERMINAL SHARING OPTIMISER IS ACTIVATED BY:              *
. *                                                                    *
. *            @HYDRA                                                  *
. *                                                                    *
. *       HYDRA WILL THEN ACCEPT INPUT FROM THE TERMINAL.  CLIST MODE  *
. *       IS ENTERED TO REGISTER A LIST OF CONTROL STATEMENTS          *
. *       PROCESSED BY HYDRA.  THESE STATEMENTS ARE AS FOLLOWS:        *
. *                                                                    *
. *       1.   @LOGIN CHAR                                             *
. *                                                                    *
. *       THIS STATEMENT ACTIVATES A SITE CODE AND DEFINES THE SINGLE  *
. *       ASCII CHARACTER CHAR AS THE TERMINAL IDENTIFIER FOR THAT     *
. *       SITE.  INPUT MAY THEN BE TYPED IN FOR THAT TERMINAL BY       *
. *       PREFIXING EACH INPUT LINE WITH THE SPECIFIED CHAR.  ALL      *
. *       OUTPUT FOR THAT SITE WILL BE TYPED OUT PREFIXED BY CHAR      *
. *       AND A SPACE.                                                 *
. *                                                                    *
. *       2.   @LOGOUT CHAR                                            *
. *                                                                    *
. *       THIS STATEMENT DEACTIVATES THE SITE CODE DEFINED BY THE      *
. *       ASCII CHARACTER CHAR AS THE TERMINAL IDENTIFIER FOR THAT     *
. *       SITE.  ALL CONNECTIONS BETWEEN THE RUN AND THE SPECIFIED     *
. *       SITE ARE DESTROYED.                                          *
. *                                                                    *
. *       3.   @ASSUME<,L>   CHAR<,@ REPLACEMENT>                      *
. *                                                                    *
. *       THIS STATEMENT DEDICATES THE INPUT TO THE TERMINAL           *
. *       IDENTIFIED BY CHAR.  ONCE THE @ASSUME STATEMENT HAS BEEN     *
. *       ENTERED, ALL INPUT TYPED TO THE TERMINAL WHICH DOES NOT      *
. *       BEGIN WITH AN AT-SIGN (@) WILL BE DIRECTED TO THE SPECIFIED  *
. *       TERMINAL.  INPUT BEGINNING WITH AN AT-SIGN WILL CONTINUE TO  *
. *       INTERPRETED AS HYDRA COMMANDS.                               *
. *          TO ENTER A CONTROL STATEMENT TO THE @ASSUME'D TERMINAL,   *
. *       IT IS NECESSARY TO HAVE A CHARACTER WHICH WILL SUBSTITUTE    *
. *       AN AT-SIGN IN COLUMN 1.  THE <@ REPLACEMENT> SERVES THIS     *
. *       PURPOSE.  THE DEFAULT <@ REPLACEMENT> IS A COLON (:).  IF A  *
. *       COLON IS NOT WANTED, AN ALTERNATIVE <@ REPLACEMENT> MAY BE   *
. *       SPECIFIED IN THE <@ REPLACEMENT> FIELD OF THE @ASSUME        *
. *       COMMAND.                                                     *
. *          THE 'L' OPTION WILL CAUSE AN AUTOMATIC @ECHO OF THE NEWLY *
. *       @ASSUME'D TERMINAL TO BE DONE.  IF THE 'L' OPTION IS NOT     *
. *       SPECIFIED, NO @ECHO WILL BE DONE.                            *
. *          @ASSUME MODE MAY BE TERMINATED AND HYDRA REVERTED TO THE  *
. *       USE OF LEADING TERMINAL IDENTIFIERS BY THE COMMAND :         *
. *                                                                    *
. *            @ASSUME,N                                               *
. *                                                                    *
. *       4.   @STATUS                                                 *
. *                                                                    *
. *       THE @STATUS STATEMENT WILL TYPE THE IDENTIFICATION           *
. *       CHARACTERS AND SITE CODES FOR ALL ACTIVE TERMINALS.          *
. *                                                                    *
. *       5.   @ECHO CHAR                                              *
. *                                                                    *
. *       THE @ECHO STATEMENT WILL RETYPE THE LAST INPUTS AND OUTPUTS  *
. *       OF THE TERMINAL IDENTIFIED BY CHAR.                          *
. *                                                                    *
. *       6.   @ENDX                                                   *
. *                                                                    *
. *       THE @ENDX STATEMENT WILL CAUSE AN EXIT FROM HYDRA.           *
. *       TO REENTER HYDRA, USE THE STATEMENT :                        *
. *                                                                    *
. *       7.   @HYDRA                                                  *
. *                                                                    *
. *       THIS WILL CAUSE HYDRA TO BE REACTIVATED, AND ALL             *
. *       PREVIOUSLY DEFINED TERMINALS TO BE ACCESSABLE.               *
. *       HYDRA USES A TEMPORARY FILE NAMED HYDRA$RUNID TO             *
. *       SAVE ITS ENVIRONMENT IN.  IF THIS FILE IS @FREED,            *
. *       NO RECOVERY IS POSSIBLE.                                     *
. *                                                                    *
. **********************************************************************
.                                     . 
          $INCLUDE  'MAXR$/'          . STANDARD REGISTER DEFINITIONS   
          $INFO     1 3               . ELEMENT IS QUARTER-WORD 
          $ASCII                      . ALL CHARACTERS ARE ASCII
PF        $FORM     12,6,18           . PRINT FORM  
.                                     . 
.                                     . 
. **********************************************************************
. *                                                                    *
. *       EQUATES FOR HYDRA ENVIRONMENT                                *
. *                                                                    *
. **********************************************************************
.                                     . 
BUFLN     $EQU      56                . NUMBER OF WORDS IN I/O BUFFERS  
LINSAV    $EQU      24                . NUMBER OF LINES TO SAVE PER TERMINAL
NTERM     $EQU      95                . # OF RSI TERMINALS ALLOWED BY HYDRA 
SAVSEC    $EQU      BUFLN//28         . NUMBER OF SECTORS PER I/O SAVE  
STATBFL   $EQU      10                . WORD LENGTH OF STATBF   
TPKTLN    $EQU      4                 . NUMBER OF WORDS NEEDED PER TERMINAL 
.                                     . 
$(1)                                  . 
HYDRA*                                . 
          I$D       IDPKT             . PRINT ID LINE   
          ER        ERR$              . ERROR RETURN FROM ID$   
          LA,U      A0,EDITPK         . GET ADDRESS OF EDIT PACKET  
          LMJ       X11,AEDIT$        . ENTER EDIT MODE 
          LA        A0,FRECSINT       . FREE CSINTNAME$ 
          ER        ACSF$             . 
          LA        A0,(1,ASG+3)      . GET RUN ID IN @ASG IMAGE
          ER        PCT$              . 
          LA        A0,ASG+3          . GET RUN ID  
          SA        A0,IOPKT+1        . SAVE IN I/O PACKET  
          SA        A0,SAVEIN+1       . STORE IN INPUT SAVE PACKET  
          SA        A0,SAVOUT+1       . STORE IN OUTPUT SAVE PACKET 
TESTSP                                . 
          LA,S6     A0,ASG+3          . GET LAST CHARACTER OF FILE NAME 
          TE,U      A0,05             . IS IT A FIELDATA BLANK ?
          J         DOASGA            . NO, GO DO @ASG,A
          DL        A0,ASG+2          . YES, GET FILE NAME  
          DSC       A0,6              . SHIFT ONE CHARACTER 
          DS        A0,ASG+2          . REPLACE FILE NAME   
          J         TESTSP            . GO TEST FOR SPACE AGAIN 
DOASGA                                . 
          LA        A0,(ASGL,ASG)     . TRY @ASG,A OF HYDRA FILE
          ER        CSF$              . 
          AND       A0,(0400000000000). SEE IF @ASG,A WAS SUCCESSFUL
          TNZ       A1                . 
          J         DOREC             . SUCCESSFUL, GO DO RECOVERY  
          AND       A0,(0100000000000). SEE IF FILE WAS ALREADY ASSIGNED
          TZ        A1                . 
          J         DOREC             . FILE ALREADY ASSIGNED, GO DO RECOVERY   
          LA        A0,ASGT           . NO FILE, DO @ASG,T  
          SA        A0,ASG            . 
          LA        A0,(ASGL,ASG)     . 
          ER        CSF$              . 
          J         DOINIT            . INITIALIZE, CAN'T RECOVER   
DOREC                                 . 
          LA,U      A0,020            . IOW$ READ FUNCTION  
          SA,S2     A0,IOPKT+3        . SAVE IN I/O PACKET  
          LA,U      A0,IOPKT          . GET ADDRESS OF I/O PACKET   
          ER        IOW$              . READ IN RECOVERY DATA   
          LA,U      A0,010            . IOW$ WRITE FUNCTION 
          SA,S2     A0,IOPKT+3        . SAVE IN I/O PACKET  
          LA        A0,MSG12          . PRINT 'RECOVERED' MESSAGE   
          ER        APRINT$           . 
          LA,U      A0,1              . GET ONE IN A0   
          SA        A0,RECFLG         . SET RECOVERY FLAG FOR INPGET
          SZ        TERMFLAG          . CLEAR TERMINATION MODE FLAG 
          J         BGNAOP            . GO FORK OFF INPGET  
DOINIT                                . 
          ER        OPT$              . GET PROCESSOR CALL OPTIONS  
          AND,U     A0,010000         . ISOLATE 'N' OPTION  
          SA        A1,NOPTN          . SAVE 'N' OPTION STATUS  
          LA,U      A0,010            . IOW$ WRITE FUNCTION 
          SA,S2     A0,IOPKT+3        . SAVE IN I/O PACKET  
          LA,U      A0,IOPKT          . GET ADDRESS OF I/O PACKET   
          ER        IOW$              . ZERO OUT HYDRA RECOVERY AREA
          LA,U      A0,RSTRA$         . SET TO TERMINATE ALL SITES  
          SA,H1     A0,RTPKT          . STORE FUNCTION IN TERM PACKET   
          LA,U      A0,RTPKT          . 
          ER        RSI$              . TERMINATE ALL ACTIVE SITES  
          LA,U      A0,RSTRM$         . SET TO TERMINATE A SITE 
          SA,H1     A0,RTPKT          . STORE FUNCTION IN TERM PACKET   
          LA        A0,IOSTRT         . GET HYDRA FLAG  
          SA        A0,INPUT+(BUFLN-1) . SET HYDRA FLAG IN INPUT BUFFER 
          SA        A0,OUTPUT+(BUFLN-1) . SET HYDRA FLAG IN OUTPUT BUFFER   
BGNAOP                                . 
          LA        A0,CLIST          . LOAD ADDRESS OF CLIST$ TABLE
          ER        CLIST$            . REGISTER CONTROL STATEMENT LIST 
          LA        A0,(1,INPGET)     . SET UP TO FORK OFF INPGET   
          ER        FORK$             . CREATE INPUT ACTIVITY INPGET
          LA        A0,(1,HOLDEM)     . SET UP TO FORK OFF HOLDEM   
          ER        FORK$             . CREATE TERMINAL HOLD ACTIVITY   
.                                     . 
. **********************************************************************
. *                                                                    *
. *       OUTPUT EDITING ACTIVITY                                      *
. *                                                                    *
. **********************************************************************
.                                     . 
OUTGET                                . 
          TZ        TERMFLAG          . ARE WE IN TERMINATION MODE ?
          J         TERMIT            . YES.  TERMINATE 
          TS        RHOLD             . LOCK ROPKT  
          LA,U      A0,ROPKT          . GET ADDRESS OF ROPKT FOR RSI$   
          ER        RSI$              . ASK FOR OUTPUT FROM ANY TERMINAL
          SZ,S1     RHOLD             . UNLOCK ROPKT
          LA,H2     A1,ROPKT+2        . LOAD OUTPUT TERMINAL NUMBER 
          TS        RCHAIN            . LOCK THE TERMINAL CHAIN 
          LA,U      A2,0              . INITIALIZE SITEID OFFSET
RHFN                                  . 
          TNZ       SITEID,A2         . IS THIS SITE LOGGED IN? 
          J         SITENACT          . NO, SITE IS INACTIVE
          TNE       A1,SITEID+1,A2    . SAME RSI$ TERMINAL NUMBER?  
          J         SITEACT           . YES, THIS IS THE TERMINAL WE WANT   
SITENACT                              . 
          AA,U      A2,TPKTLN         . INCREMENT SITEID OFFSET 
          TNE,U     A2,SITEIDEND      . HAVE ALL TERMINALS BEEN CHECKED?
          J         OUTUNK            . YES, UNKNOWN TERMINAL   
          J         RHFN              . NO, CONTINUE CHECKING   
SITEACT                               . 
          SZ,S1     RCHAIN            . UNLOCK TERMINAL LIST
          LA        A0,A2             . GET SITEID OFFSET IN A0 
          DSL       A0,36             . CONVERT OFFSET TO TERMINAL ID   
          DI,U      A0,TPKTLN         . 
          AA,U      A0,040            . 
          LA        A1,A0             . GET TERMINAL ID IN A1   
OUTUNR                                . 
          LA        A6,A1             . SAVE TERM ID IN A6  
          LA,H1     A0,ROPKT+4        . GET TERMINAL STATUS 
          AND,U     A0,04005          . IS TERMINAL IN TERMINATION ?
          TZ        A1                . 
          SA        A6,KILTRM         . YES, SET TERMINAL FOR TERMINATION   
          TP        ROPKT+2           . DID REQUEST ERROR ? 
          J         OUTWAIT           . YES.  WAIT AND TRY AGAIN
          LA,S1     A0,ROPKT+2        . LOAD STATUS BITS
          TEP,U     A0,4              . WAS OUTPUT AVAILABLE ?  
          J         OUTWAIT           . NO.  TRY AGAIN  
          LA,H2     A0,ROPKT+4        . GET SECOND HALF OF TERMINAL STATUS  
          AND,U     A0,1              . IS THIS A SPECIAL CONTROL FUNCTION ?
          JNZ       A1,OUTGET         . YES, SKIP IT
          TZ        NOPTN             . DOES USER WANT OUTPUT SAVED ?   
          J         NOSAVO            . NO, HAS 'N' OPTION ON PROCESSOR CALL
          TP        A2                . WAS OUTPUT FROM A VALID TERMINAL ?  
          J         NOSAVO            . NO, DON'T SAVE IT   
          TS        SITEID+2,A2       . YES, LOCK RSI TERMINAL  
          LA,H2     A1,SITEID+2,A2    . GET NEXT SECTOR TO WRITE IN 
          SA        A1,SAVOUT+5       . STORE IN OUTPUT SAVE PACKET 
          LA,H1     A0,ROPKT+3        . GET NUMBER OF CHARACTERS IN IMAGE   
          SSL       A0,6              . RIGHT JUSTIFY IT
          SA,H2     A0,OUTPUT+(BUFLN-2) . SAVE IN BUFFER
          LA,S2     A0,ROPKT+2        . GET STATUS  
          SA,S1     A0,OUTPUT+(BUFLN-2) . SAVE IN BUFFER
          LA,U      A0,SAVOUT         . GET ADDRESS OF OUTPUT SAVE PACKET   
          ER        IOW$              . INITIATE I/O
          AA,U      A1,SAVSEC         . INCREMENT SECTOR
          TG,H2     A1,SITEID+3,A2    . IS SECTOR BEYOND RANGE ?
          LA,H1     A1,SITEID+3,A2    . YES, START WITH FIRST AGAIN 
          SA,H2     A1,SITEID+2,A2    . SAVE NEW NEXT SECTOR
          SZ,S1     SITEID+2,A2       . UNLOCK THE TERMINAL 
NOSAVO                                . 
          LA,U      A0,EDITPK         . GET ADDRESS OF EDIT PACKET  
          LMJ       X11,AEDIT$        . ENTER EDIT MODE 
          TZ        ASSUMID           . ARE WE ASSUMED TO A TERMINAL?   
          J         SKIPID            . YES, DON'T GIVE ID CHARACTER
          LA        A0,A6             . GET TERM ID BACK IN A0  
          LMJ       X11,AECHAR$       . PUT TERM ID IN PRBUF
SKIPID                                . 
          LA,U      A0,OUTPUT         . LOAD OUTPUT IMAGE ADDRESS   
          LA,H1     A1,ROPKT+3        . LOAD OUTPUT CHARACTER COUNT 
          SSL       A1,6              . RIGHT JUSTIFY IT
          TG,U      A1,131            . IS CHARACTER COUNT < 131
          LA,U      A1,130            . NO, CHANGE TO 130   
          LMJ       X11,AECOPY$       . COPY OUTPUT IMAGE INTO PRBUF
          LMJ       X11,AECOLN$       . GET CURRENT COLUMN IN A0
          AA,U      A0,3              . CONVERT COLUMN COUNT TO WORDS   
          DSL       A0,36             . 
          DI,U      A0,4              . 
          SA,S3     A0,PRBUF          . SAVE # OF WORDS TO PRINT
          LA,U      A0,NULLS          . LOAD ADDRESS OF NULLS   
          LA,U      A1,4              . LOAD NUMBER OF NULLS
          LMJ       X11,AECOPY$       . COPY NULLS INTO PRBUF   
          LMJ       X11,AEDITX$       . TERMINATE EDIT MODE 
          TZ        ASSUMID           . ASSUMED TO A TERMINAL?  
          J         CK4TRD            . YES, CHECK FOR TREAD$   
DOAPRT                                . NO, DO APRINT$  
          LA        A0,PRBUF          . GET PRINT INFORMATION   
          ER        APRINT$           . PRINT THE OUTPUT IMAGE  
          J         OUTGET            . ASK FOR MORE OUTPUT 
CK4TRD                                . 
          LA,S2     A1,ROPKT+2        . GET STATUS  
          AND,U     A1,1              . CHECK FOR BIT ONE   
          TE,U      A2,1              . WAS  OUTPUT FOR A TREAD$?   
          J         DOAPRT            . NO, GO DO APRINT$   
          LA        A0,ESCO           . SIMULATE TREAD$ 
          ER        APRTCN$           . 
          LA        A0,PRTSOE         . PRINT AN SOE
          ER        APRINT$           . 
          LA        A0,PRBUF          . PRINT OUTPUT
          ER        APRINT$           . 
          LA        A0,ENDO           . AND SIMULATE TREAD$ 
          ER        APRTCN$           . 
          J         OUTGET            . CONTINUE
OUTWAIT                               . 
          LA,U      A1,250            . 
          ER        TWAIT$            . WAIT A QUARTER SECOND   
          J         OUTGET            . ASK FOR MORE OUTPUT 
.                                     . 
. **********************************************************************
. *                                                                    *
. *       OUTPUT FROM UNKNOWN TERMINAL RECEIVED                        *
. *                                                                    *
. **********************************************************************
.                                     . 
OUTUNK                                . 
          SZ,S1     RCHAIN            . CLEAR TERMINAL LIST LOCK
          LA,U      A1,'?'            . LOAD QUESTION MARK FOR ERROR
          LNA,U     A2,1              . SET A2 FOR INVALID TERMINAL 
          J         OUTUNR            . RETURN TO EDIT LINE 
.                                     . 
. **********************************************************************
. *                                                                    *
. *       @ENDX ENCOUNTERED - TERMINATE HYDRA                          *
. *                                                                    *
. **********************************************************************
.                                     . 
TERMIT                                . 
          LA,U      A0,IOPKT          . SAVE HYDRA ENVIRONMENT  
          ER        IOW$              . 
          LA        A0,MSG01          . 
          ER        APRINT$           . PRINT SIGN OFF MESSAGE  
          ER        EXIT$             . TERMINATE OUTPUT ACTIVITY   
/ .                                   . 
. **********************************************************************
. *                                                                    *
. *       INPUT ACTIVITY                                               *
. *                                                                    *
. **********************************************************************
.                                     . 
$(3)                                  . 
INPGET                                . 
          TZ        RECFLG            . WAS RECOVERY DONE?  
          J         STATUS            . YES, SHOW STATUS OF TERMINALS   
.                                     . 
. **********************************************************************
. *                                                                    *
. *       CLEAR INPUT BUFFER FOR READ$ (OR TREAD$)                     *
. *                                                                    *
. **********************************************************************
.                                     . 
READN                                 . 
          LA        A1,KILTRM         . GET TERMINAL TO KILL
          SZ        KILTRM            . ZERO OUT FLAG   
          TNZ       A1                . NEED TO TERMINATE A TERMINAL ?  
          J         NOKILL            . NO  
          SA        A1,TRMACS         . YES, SAVE TERMINAL TO KILL  
          J         LOGOUT2           . GO KILL IT  
NOKILL                                . 
          TZ        TERMFLAG          . ARE WE IN TERMINATION MODE? 
          ER        EXIT$             . YES, EXIT   
          LA        A4,BLANKS         . NO, GET BLANKS IN A4
          LA,U      A0,INPUT          . GET ADDRESS OF INPUT BUFFER IN A0   
          LA,U      A1,20             . GET BUFFER LENGTH IN A1 
BLANKLOOP                             . 
          SA        A4,0,A0           . STORE BLANKS IN INPUT BUFFER
          AA,U      A0,1              . INCREMENT BUFFER POINTER
          JGD       A1,BLANKLOOP      . CONTINUE FILLING BUFFER WITH BLANKS 
READAGN                               . 
          LA        A0,READP          . GET READ PARAMETERS 
          ER        AREAD$            . READ A LINE OF INPUT
READON                                . 
          TEP       A0,(0020000000000). IS IT AN INFOR BUFFER ? 
          J         READN             . YES.  IGNORE IT 
          TNE       A0,(0040000000000). IS IT AN EXTRANEOUS READ ?  
          J         READAGN           . YES.  IGNORE IT 
          AND       A0,(077,0)        . ISOLATE CONTROL TYPE
          JNZ       A1,CSI            . PROCESS IF A CONTROL STATEMENT  
          TZ        ASSUMID           . ARE WE ASSUMED TO A TERMINAL ?  
          J         ASSUMIN           . YES.  PASS TO THAT TERMINAL 
          TNZ,U     0,A0              . NULL IMAGE ?
          J         READN             . YES.  IGNORE IT 
          LA,Q1     A1,INPUT          . LOAD TERMINAL SELECTOR CHARACTER
          SA        A1,TRMACS         . SAVE TERMINAL SELECTOR CHARACTER
          LA        A2,A1             . GET TERM SELECT CHAR IN A2  
          ANA,U     A2,040            . CONVERT SELECT CHAR TO OFFSET   
          MSI,U     A2,TPKTLN         . 
          TNZ       SITEID,A2         . IS THIS TERM LOGGED IN? 
          J         READNF            . NO, ISSUE ERROR MESSAGE 
          LA        A1,SITEID+1,A2    . YES, GET TERMINAL # FOR RSI$
          SA,H2     A1,RIPKT          . STORE IN RSI$ INPUT PACKET  
          LA,U      A1,,A0            . LOAD LENGTH OF IMAGE READ   
          LSSL      A1,2              . MULTIPLY BY FOUR TO GET CHARACTERS  
          ANA,U     A1,1              . DECREMENT FOR REMOVED FIRST CHARACTER   
          SA,H1     A1,RIPKT+1        . SET LENGTH IN RSI$ INPUT PACKET 
.                                     . 
. **********************************************************************
. *                                                                    *
. *       LEFT SHIFT THE IMAGE ONE CHARACTER                           *
. *                                                                    *
. **********************************************************************
.                                     . 
          LA,U      A1,,A0            . LOAD LENGTH OF IMAGE
          LA        A3,BLANKS         . LOAD SPACES TO FILL LAST WORD   
          J         READLSE           . ENTER LEFT SHIFT LOOP   
READLS                                . 
          LA        A4,INPUT,A1       . LOAD NEXT WORD OF IMAGE 
          LDSC      A3,9              . SHIFT ONE CHARACTER LEFT
          SA        A4,INPUT,A1       . REPLACE IN IMAGE
          LSSL      A3,3*9            . LEFT JUSTIFY CARRIED CHARACTER  
READLSE                               . 
          JGD       A1,READLS         . LOOP FOR ALL WORDS IN IMAGE 
.                                     . 
. **********************************************************************
. *                                                                    *
. *       PASS THE IMAGE TO THE RUN                                    *
. *                                                                    *
. **********************************************************************
.                                     . 
READRI                                . 
          LA,U      A0,RIPKT          . 
          ER        RSI$              . TRANSMIT THE IMAGE TO THE SYSTEM
          LA,S3     A0,RIPKT+2        . LOAD EXPOOL WAIT FIELD  
          TOP,U     A0,020            . IS EXPOOL TIGHT ?   
          J         READNT            . NO.  CONTINUE NORMALLY  
          LA,U      A1,250            . 
          ER        TWAIT$            . YES.  WAIT FOR THINGS TO LOOSEN UP  
          J         READRI            . ...AND RETRY THE RSI$   
READNT                                . 
          TZ        NOPTN             . DOES USER WANT INPUT SAVED ?
          J         NOSAVI            . NO, HAS 'N' OPTION ON PROCESSOR CALL
          TS        SITEID+2,A2       . LOCK RSI TERMINAL   
          LA,H2     A1,SITEID+2,A2    . GET NEXT SECTOR TO WRITE IN 
          SA        A1,SAVEIN+5       . STORE IN INPUT SAVE PACKET  
          LA,H1     A0,RIPKT+3        . GET NUMBER OF CHARACTERS IN IMAGE   
          SSL       A0,6              . RIGHT JUSTIFY IT
          SA,H2     A0,INPUT+(BUFLN-2) . SAVE IN BUFFER 
          LA,S2     A0,RIPKT+2        . GET STATUS  
          SA,S1     A0,INPUT+(BUFLN-2) . SAVE IN BUFFER 
          LA,U      A0,SAVEIN         . GET ADDRESS OF INPUT SAVE PACKET
          ER        IOW$              . INITIATE I/O
          AA,U      A1,SAVSEC         . INCREMENT SECTOR
          TG,H2     A1,SITEID+3,A2    . IS SECTOR BEYOND RANGE ?
          LA,H1     A1,SITEID+3,A2    . YES, START WITH FIRST AGAIN 
          SA,H2     A1,SITEID+2,A2    . SAVE NEW NEXT SECTOR
          SZ,S1     SITEID+2,A2       . UNLOCK THE TERMINAL 
NOSAVI                                . 
          LA,H1     A0,RIPKT+4        . GET TERMINAL STATUS 
          AND,U     A0,04005          . IS TERMINAL IN TERMINATION ?
          TNZ       A1                . 
          J         TERMACTV          . NO, TERMINAL IS ACTIVE  
          LA        A1,TRMACS         . YES, GET TERMINAL SELECTOR CHARACTER
          J         LOGOUT2           . GO TERMINATE FOR HYDRA  
TERMACTV                              . 
          TP        RIPKT             . CHECK STATUS OF RSI$
          ER        EABT$             . ERROR, ABORT$   
          J         READN             . GO READ MORE INPUT  
.                                     . 
. **********************************************************************
. *                                                                    *
. *       INPUT HAD AN UNKNOWN TERMINAL ID                             *
. *                                                                    *
. **********************************************************************
.                                     . 
READNF                                . 
          SA,Q1     A1,MSG02+1        . SET TERMINAL ID IN MESSAGE  
          LA        A0,MSG02          . 
          ER        APRINT$           . PRINT ERROR MESSAGE 
          J         READN             . GO READ NEXT IMAGE  
.                                     . 
. **********************************************************************
. *                                                                    *
. *       ASSUME MODE INPUT:  PASS TO ASSUMED TERMINAL                 *
. *                                                                    *
. **********************************************************************
.                                     . 
ASSUMIN                               . 
          LA,Q1     A2,INPUT          . LOAD FIRST CHARACTER OF LINE
          LA,U      A1,'@'            . LOAD AN AT-SIGN 
          TNE       A2,ASSUMMS        . IS FIRST CHARACTER THE MASTER SPACE ?   
          SA,Q1     A1,INPUT          . YES.  SUBSTITUTE AN AT-SIGN 
          LA        A1,ASSUMID        . LOAD ASSUMED TERMINAL ID IN A1  
          SA        A1,TRMACS         . SAVE TERMINAL SELECTOR CHARACTER
          LA        A2,A1             . LOAD ASSUMED TERMINAL ID IN A2  
          ANA,U     A2,040            . CONVERT TERMINAL ID TO OFFSET   
          MSI,U     A2,TPKTLN         . 
          TNZ       SITEID,A2         . IS THIS TERMINAL LOGGED IN? 
          J         READNF            . NO, REMIND USER TO LOG IN   
          LA        A1,SITEID+1,A2    . GET TERMINAL # FOR RSI$ 
          SA,H2     A1,RIPKT          . STORE IN RSI$ INPUT PACKET  
          LSSL      A0,2              . CONVERT INPUT COUNT TO CHARACTERS   
          SA,H1     A0,RIPKT+1        . SET INPUT COUNT IN RSI$ PACKET  
          J         READRI            . PASS IMAGE TO TERMINAL  
.                                     . 
. **********************************************************************
. *                                                                    *
. *       CONTROL STATEMENT INTERPRETER                                *
. *                                                                    *
. **********************************************************************
.                                     . 
CSI                                   . 
          SSL       A1,18             . RIGHT JUSTIFY CONTROL TYPE  
          TNE,U     A1,077            . WAS '@ENDX' STATEMENT ENTERED ? 
          J         CSIENDX           . YES.  SET TERMINATION MODE  
          LX,U      X11,READN         . NO, SET RETURN ADDRESS FOR LOGIN
          J         $+1,A1            . BRANCH ON STATEMENT TYPE
          ER        EABT$             . TYPE 0:  ERROR  
          J         LOGIN             . TYPE 1:  LOG IN TERMINAL
          J         ASSUME            . TYPE 2:  ASSUME A TERMINAL ID   
          J         LOGOUT            . TYPE 3:  LOG OUT A TERMINAL 
          J         STATUS            . TYPE 4:  PRINT LOGGED IN TERMINALS  
          J         ECHO              . TYPE 5:  ECHO SAVED LINES OF A TERMINAL 
.                                     . 
. **********************************************************************
. *                                                                    *
. *       TERMINATE WHEN @ENDX STATEMENT RECEIVED                      *
. *                                                                    *
. **********************************************************************
.                                     . 
CSIENDX                               . 
          LA,U      A0,1              . LOAD A NONZERO  
          SA        A0,TERMFLAG       . MARK OUTPUT TERMINATION MODE
          ER        EXIT$             . TERMINATE   
.                                     . 
. **********************************************************************
. *                                                                    *
. *       @LOGIN #                                                     *
. *                                                                    *
. **********************************************************************
.                                     . 
LOGIN                                 . 
          TS        RCHAIN            . LOCK THE TERMINAL LIST  
          LA,Q4     A1,INPUT+1        . LOAD TERMINAL IDENTIFIER
          TNE,U     A1,'@'            . IS LOGIN ID AN '@'? 
          J         BADID             . YES, BAD ID 
          TNE,U     A1,'?'            . IS LOGIN ID AN '?'  
          J         BADID             . YES, BAD ID 
          ANA,U     A1,040            . GOOD ID, CONVERT TO SITEID OFFSET   
          MSI,U     A1,TPKTLN         . 
          TZ        SITEID,A1         . IS TERMINAL ALREADY LOGGED IN?  
          J         SIGNAR            . YES, TELL USER  
          LX        X8,A1             . SAVE SITEID OFFSET IN X8
          ER        DATE$             . GET TIME-DATE IN A0-A1  
          SA        A1,FDSID          . SAVE TIME AS SID
          LA,U      A1,015            . GET FIELDATA 'H' IN A1  
          SA,A1     A1,FDSID          . FIRST CHARACTER OF SID IS 'H'   
          LA,Q1     A6,INPUT+2        . GET NEXT CHARACTER  
          TNE,U     A6,' '            . IS IT A SPACE?  
          J         GOTSID            . YES, USE TIME AS SID
          TE,U      A6,','            . IS IT A COMMA?  
          J         BADID             . NO, BAD LOGIN   
          LA,Q2     A1,INPUT+2        . GET FIRST CHARACTER OF SID  
          ANA,U     A1,040            . CHANGE CHARACTER TO OFFSET  
          LA,H2     A0,ASC2FD,A1      . GET CORRESPONDING FIELDATA CHAR 
          SA,S1     A0,FDSID          . SAVE FIELDATA CHARACTER 
          LA,Q3     A1,INPUT+2        . GET 2ND CHARACTER OF SID
          ANA,U     A1,040            . CHANGE CHARACTER TO OFFSET  
          LA,H2     A0,ASC2FD,A1      . GET CORRESPONDING FIELDATA CHAR 
          SA,S2     A0,FDSID          . SAVE FIELDATA CHARACTER 
          LA,Q4     A1,INPUT+2        . GET 3RD CHARACTER OF SID
          ANA,U     A1,040            . CHANGE CHARACTER TO OFFSET  
          LA,H2     A0,ASC2FD,A1      . GET CORRESPONDING FIELDATA CHAR 
          SA,S3     A0,FDSID          . SAVE FIELDATA CHARACTER 
          LA,Q1     A1,INPUT+3        . GET 4TH CHARACTER OF SID
          ANA,U     A1,040            . CHANGE CHARACTER TO OFFSET  
          LA,H2     A0,ASC2FD,A1      . GET CORRESPONDING FIELDATA CHAR 
          SA,S4     A0,FDSID          . SAVE FIELDATA CHARACTER 
          LA,Q2     A1,INPUT+3        . GET 5TH CHARACTER OF SID
          ANA,U     A1,040            . CHANGE CHARACTER TO OFFSET  
          LA,H2     A0,ASC2FD,A1      . GET CORRESPONDING FIELDATA CHAR 
          SA,S5     A0,FDSID          . SAVE FIELDATA CHARACTER 
          LA,Q3     A1,INPUT+3        . GET 6TH CHARACTER OF SID
          ANA,U     A1,040            . CHANGE CHARACTER TO OFFSET  
          LA,H2     A0,ASC2FD,A1      . GET CORRESPONDING FIELDATA CHAR 
          SA,S6     A0,FDSID          . SAVE FIELDATA CHARACTER 
GOTSID                                . 
          LA        A1,FDSID          . GET FIELDATA SID
          SA        A1,RNPKT+4        . SET SITE CODE IN PACKET 
          SZ,H2     RNPKT             . CLEAR H2 TO AVOID INADVERTANT   
                                      .       TERMINAL NUMBER EXCHANGE  
          LA,U      A0,RNPKT          . GET ADDRESS OF RSI$ INIT PACKET 
          ER        RSI$              . SIGN ON THE SITE
          LA,S1     A0,RNPKT+2        . LOAD THE STATUS 
          TEP,U     A0,040            . ERROR STAT RETURNED?
          J         INITERR           . YES, GO DETERMINE WHAT'S WRONG  
          LA        A0,X8             . GET SITEID OFFSET   
          LA        A1,FDSID          . GET SITE ID 
          SA        A1,SITEID,A0      . SAVE SITE ID
          LA,H2     A1,RNPKT          . GET RSI$ TERMINAL # 
          SA        A1,SITEID+1,A0    . SAVE RSI$ TERMINAL #
          LA,H1     A1,SITEID+3,A0    . GET FIRST SECTOR TO SAVE AT 
          TNZ,H2    SITEID+2,A0       . ANY LINES ALREADY SAVED ?   
          SA,H2     A1,SITEID+2,A0    . NO, SET AS NEXT SAVE SECTOR 
          SZ,S1     RCHAIN            . CLEAR TERMINAL LIST LOCK
          LA,U      A0,IOPKT          . GET ADDRESS OF I/O PACKET   
          ER        IOW$              . SAVE HYDRA ENVIRONMENT  
          J         0,X11             . RETURN  
SIGNAR                                . 
          SZ,S1     RCHAIN            . CLEAR TERMINAL LIST LOCK
          LA,Q4     A1,INPUT+1        . GET CHARACTER ID
          SA,Q1     A1,MSG03+1        . SET TERMINAL ID IN MESSAGE  
          LA        A0,MSG03          . 
          ER        APRINT$           . PRINT 'ALREADY LOGGED IN' MESSAGE   
          J         0,X11             . RETURN  
INITERR                               . 
          LA,H1     A0,RNPKT+4        . LOAD THE STATUS 
          TEP,U     A0,040000         . A REAL INITIALIZATION ERROR ?   
          J         INITERR1          . YES, GO DETERMINE WHAT'S WRONG  
          ER        EABT$             . NO!! THIS NEEDS DEBUGGING!! 
INITERR1                              . 
          LA,H2     A0,RNPKT+3        . LOAD THE STATUS 
          TEP,U     A0,01             . SITE ALREADY ACTIVE ?   
          J         SITACT            . YES 
          TEP,U     A0,02             . SITE ALREADY ACTIVE ?   
          J         SITACT            . YES 
          TEP,U     A0,04             . QUOTA REJECT ?  
          J         QUOTANO           . YES 
          TEP,U     A0,010            . INVALID SITE ID?
          J         SITBAD            . YES 
          TEP,U     A0,040            . NOT ENOUGH EXPOOL?  
          J         NOEXPOOL          . YES 
          TEP,U     A0,0100           . MAX RSI (GCCMIN) REJECT?
          J         MAXRSI            . YES 
          ER        EABT$             . ??? THIS NEEDS DEBUGGING ???
SITACT                                . 
          LA        A0,MSG13          . 
          J         INITPRT           . 
QUOTANO                               . 
          LA        A0,MSG16          . 
          J         INITPRT           . 
SITBAD                                . 
          LA        A0,MSG17          . 
          J         INITPRT           . 
NOEXPOOL                              . 
          LA        A0,MSG18          . 
          J         INITPRT           . 
MAXRSI                                . 
          LA        A0,MSG19          . 
INITPRT                               . 
          ER        APRINT$           . PRINT INIT ERROR MESSAGE
          SZ,S1     RCHAIN            . CLEAR TERMINAL LIST LOCK
          J         0,X11             . RETURN  
.                                     . 
. **********************************************************************
. *                                                                    *
. *       BAD LOGIN ID                                                 *
. *                                                                    *
. **********************************************************************
.                                     . 
BADID                                 . 
          SZ,S1     RCHAIN            . CLEAR TERMINAL LIST LOCK
BADID2                                . 
          LA        A0,MSG07          . 
          ER        APRINT$           . PRINT BAD ID MSG
          J         0,X11             . RETURN  
.                                     . 
. **********************************************************************
. *                                                                    *
. *       ASSUME #,@                                                   *
. *                                                                    *
. **********************************************************************
.                                     . 
ASSUME                                . 
          SZ        ECHOFLAG          . CLEAR AUTOMATIC @ECHO FLAG  
          LX,U      X11,READN         . SET RETURN ADDRESS FOR BADID
          LA,Q4     A0,INPUT+1        . LOAD COMMA OR SPACE 
          TE,U      A0,' '            . IS IT A SPACE ? 
          J         ASSCMA            . NO.  CHECK FOR OPTIONS  
ASSUME1                               . 
          LA,Q1     A0,INPUT+2        . LOAD TERMINAL ID TO ASSUME  
          TNE,U     A0,'@'            . IS ASSUME CHAR AN '@'?  
          J         BADID2            . YES, BAD ID 
          TNE,U     A0,'?'            . IS ASSUME CHAR AN '?'   
          J         BADID2            . YES, BAD ID 
          SA        A0,ASSUMID        . SET AS ASSUMED TERMINAL 
          LA,Q2     A0,INPUT+2        . LOAD COMMA FOR AT-SIGN CHARACTER
          TE,U      A0,','            . IS USER SPECIFYING AT-SIGN CHARACTER ?  
          J         ASSNCM            . NO.  SKIP SETUP 
          LA,Q3     A0,INPUT+2        . YES.  LOAD AT-SIGN REPLACEMENT  
          TNE,U     A0,'@'            . IS AT-SIGN REPLACEMENT AN '@' ? 
          J         BADATRP           . YES, BAD REPLACEMENT CHARACTER  
          SA        A0,ASSUMMS        . NO, SET AT-SIGN REPLACEMENT 
          J         ASSNCM            . CONTINUE
.                                     . 
. **********************************************************************
. *                                                                    *
. *       BAD AT-SIGN (@) REPLACEMENT CHARACTER ON @ASSUME             *
. *                                                                    *
. **********************************************************************
.                                     . 
BADATRP                               . 
          SA,Q2     A0,MSG14+9        . STORE BAD CHARACTER IN ERR MSG  
          LA        A0,MSG14          . GET ERROR MSG PRINT INFO
          ER        APRINT$           . PRINT ERROR MSG 
          J         0,X11             . RETURN  
.                                     . 
. **********************************************************************
. *                                                                    *
. *       AT-SIGN (@) REPLACEMENT CHARACTER ON @ASSUME IS OK           *
. *                                                                    *
. **********************************************************************
.                                     . 
ASSNCM                                . 
          LA        A1,ASSUMID        . LOAD ASSUMED TERMINAL   
          SA,Q1     A1,MSG04+1        . SET IN CONFIRM MESSAGE  
          LA        A0,MSG04          . 
          ER        APRINT$           . PRINT CONFIRMATION  
          LA        A0,A1             . GET TERMINAL ID IN A0   
          ANA,U     A0,040            . CONVERT TERM ID TO SITEID OFFSET
          MSI,U     A0,TPKTLN         . 
          LX        X8,A0             . SAVE OFFSET IN X8   
          LA,U      A0,IOPKT          . GET ADDRESS OF I/O PACKET   
          ER        IOW$              . SAVE HYDRA ENVIRONMENT  
          LA,U      A0,' '            . GET BLANK IN A0 
          SA,Q1     A0,INPUT+2        . SET BLANK FOR LOGIN (IF NECESSARY)  
          LA        A0,ASSUMID        . LOAD ASSUMED TERMINAL ID
          SA,Q4     A0,INPUT+1        . SET TERMINAL ID FOR LOGIN   
          TNZ       SITEID,X8         . IS THIS SITE LOGGED IN? 
          LMJ       X11,LOGIN         . NO, GO LOG IT IN
          LA        A0,SITEID+1,X8    . GET SITEID FOR ROPKT
          TS        RHOLD             . LOCK ROPKT  
          SA        A0,ROPKT          . SAVE SITEID IN ROPKT
          LA,U      A0,RSGET$         . SET OUTPUT FOR ASSUMED TERMINAL ONLY
          SA,H1     A0,ROPKT          . SAVE FUNCTION IN ROPKT  
          SZ,S1     RHOLD             . UNLOCK ROPKT
          TNZ       ECHOFLAG          . WAS 'L' OPTION GIVEN ?  
          J         READN             . NO, GO GET MORE INPUT   
          LA        A0,ASSUMID        . YES, GET ASSUMED TERMINAL ID
          SA,Q3     A0,INPUT+1        . STORE FOR ECHO  
          J         ECHO              . GO ECHO SAVED I/O   
.                                     . 
. **********************************************************************
. *                                                                    *
. *       OPTION ON @ASSUME STATEMENT - VALIDATE FOR 'L' OR 'N'.       *
. *                                                                    *
. **********************************************************************
.                                     . 
ASSCMA                                . 
          LA,Q1     A0,INPUT+2        . LOAD OPTION LETTER  
          TG,U      A0,0140           . IS IT LOWER CASE ?  
          ANA,U     A0,040            . YES.  CONVERT TO UPPER CASE 
          TNE,U     A0,'N'            . IS 'N' OPTION SPECIFIED ?   
          J         ENDASM            . YES, GO CLEAR ASSUME MODE   
          TE,U      A0,'L'            . NO, IS 'L' OPTION SPECIFIED ?   
          J         ASSMER            . NO, ERROR ON ASSUME STATEMENT   
          SA        A0,ECHOFLAG       . YES, SET FOR AUTOMATIC @ECHO
          DL        A0,INPUT+2        . GET TERMINAL ID AND @ REPLACEMENT   
          LDSL      A0,18             . SHIFT BACK  
          DS        A0,INPUT+2        . STORE FOR @ASSUME   
          J         ASSUME1           . GO ASSUME TERMINAL  
.                                     . 
. **********************************************************************
. *                                                                    *
. *       @ASSUME,N - END ASSUME MODE.                                 *
. *                                                                    *
. **********************************************************************
.                                     . 
ENDASM                                . 
          SZ        ASSUMID           . CLEAR ASSUME MODE   
          LA        A0,(RSGTA$,0)     . SET UP TO POLL ALL TERMINALS
          TS        RHOLD             . LOCK ROPKT  
          SA        A0,ROPKT          . CHANGE OUTPUT PACKET
          SZ,S1     RHOLD             . UNLOCK ROPKT
          LA        A0,MSG05          . 
          ER        APRINT$           . PRINT CONFIRM MESSAGE   
          LA,U      A0,IOPKT          . GET ADDRESS OF I/O PACKET   
          ER        IOW$              . SAVE HYDRA ENVIRONMENT  
          J         READN             . GO READ NEXT IMAGE  
.                                     . 
. **********************************************************************
. *                                                                    *
. *       ERROR ON @ASSUME STATEMENT.                                  *
. *                                                                    *
. **********************************************************************
.                                     . 
ASSMER                                . 
          LA        A0,MSG06          . 
          ER        APRINT$           . PRINT @ASSUME ERROR MESSAGE 
          J         READN             . PROCESS NEXT LINE   
.                                     . 
. **********************************************************************
. *                                                                    *
. *       @LOGOUT #                                                    *
. *                                                                    *
. **********************************************************************
.                                     . 
LOGOUT                                . 
          LA,Q1     A1,INPUT+2        . LOAD TERMINAL IDENTIFIER
          SA        A1,TRMACS         . SAVE TERMINAL SELECTOR CHARACTER
LOGOUT2                               . 
          ANA,U     A1,040            . CONVERT ID TO SITEID OFFSET 
          MSI,U     A1,TPKTLN         . 
          TNZ       SITEID,A1         . IS SITE ALREADY TERMINATED? 
          J         READN             . YES, GO GET NEXT INPUT  
          TS        RCHAIN            . LOCK THE TERMINAL LIST  
          SZ        SITEID,A1         . REMOVE THE SITE FROM ACTIVE LIST
          LA        A0,SITEID+1,A1    . GET RSI$ TERMINAL NUMBER
          SA,H2     A0,RTPKT          . PUT IN RSI$ TERM PACKET 
          LA,U      A0,RTPKT          . GET ADDRESS OF RSI$ PACKET  
          ER        RSI$              . TERMINATE THE SITE  
          SZ,S1     RCHAIN            . UNLOCK THE TERMINAL LIST
SOMSG                                 . 
          LA        A0,TRMACS         . GET THE TERMINAL ID 
          SA,Q1     A0,MSG11+1        . SAVE IN TERM MESSAGE
          LA        A0,MSG11          . 
          ER        APRINT$           . PRINT TERM MESSAGE  
          LA        A0,TRMACS         . GET THE TERMINAL ID 
          TNE       A0,ASSUMID        . IS THIS TERMINAL ASSUMED?   
          J         ENDASM            . YES. CLEAR ASSUME STATUS
          LA,U      A0,IOPKT          . GET ADDRESS OF I/O PACKET   
          ER        IOW$              . SAVE HYDRA ENVIRONMENT  
          J         READN             . ACCEPT NEXT COMMAND 
.                                     . 
. **********************************************************************
. *                                                                    *
. *       @STATUS                                                      *
. *                                                                    *
. **********************************************************************
.                                     . 
STATUS                                . 
          TS        RCHAIN            . LOCK THE LIST   
          SZ        STAT              . ZERO THE TERMINAL COUNTER   
          LA,U      A2,0              . INITIALIZE THE SITEID OFFSET
CHEKNXT                               . 
          TNZ       SITEID,A2         . IS THIS TERMINAL LOGGED IN? 
          J         STATNXT           . NO, GO GET NEXT TERMINAL
          LA        A6,SITEID+1,A2    . YES, GET THE TERMINAL NUMBER
          SA,H2     A6,RRPKT          . STORE IN RSI$ RUN STATUS PACKET 
          LA        A6,STAT           . 
          AA,U      A6,1              . 
          SA        A6,STAT           . 
          LA        A0,MSG08          . GET STATUS HEADER PRINT INFO
          TNE,U     A6,1              . IS THIS THE FIRST TERMINAL? 
          ER        APRINT$           . YES, PRINT THE HEADER   
          LA        A0,A2             . GET THE SITEID OFFSET   
          DSL       A0,36             . CONVERT SITEID OFFSET TO TERM ID
          DI,U      A0,TPKTLN         . 
          AA,U      A0,040            . 
          SA,Q4     A0,MSG09+1        . SAVE IN MSG 
          LA,U      A0,RRPKT          . GET RSI$ PACKET ADDRESS 
          ER        RSI$              . 
          LA        A0,STATBF+2       . STORE SITE-ID IN MSG09  
          TNZ       A0                . NULLS?  
          LA        A0,BLANKS         . YES, CHANGE TO BLANKS   
          SA        A0,MSG09+4        . 
          LA        A0,STATBF+3       . 
          TNZ       A0                . NULLS?  
          LA        A0,BLANKS         . YES, CHANGE TO BLANKS   
          SA        A0,MSG09+5        . 
          LA        A0,STATBF         . STORE RUN-ID IN MSG09   
          TNZ       A0                . NULLS?  
          LA        A0,BLANKS         . YES, CHANGE TO BLANKS   
          SA        A0,MSG09+7        . 
          LA        A0,STATBF+1       . 
          TNZ       A0                . NULLS?  
          LA        A0,BLANKS         . YES, CHANGE TO BLANKS   
          SA        A0,MSG09+8        . 
          LA        A0,STATBF+5       . STORE USER-ID IN MSG09  
          TNZ       A0                . NULLS?  
          LA        A0,BLANKS         . YES, CHANGE TO BLANKS   
          SA        A0,MSG09+10       . 
          LA        A0,STATBF+6       . 
          TNZ       A0                . NULLS?  
          LA        A0,BLANKS         . YES, CHANGE TO BLANKS   
          SA        A0,MSG09+11       . 
          LA        A0,STATBF+7       . 
          TNZ       A0                . NULLS?  
          LA        A0,BLANKS         . YES, CHANGE TO BLANKS   
          SA        A0,MSG09+12       . 
          LA        A0,MSG09          . 
          ER        APRINT$           . PRINT THE TERM ID   
STATNXT                               . 
          AA,U      A2,TPKTLN         . INCREMENT THE SITEID OFFSET 
          TE,U      A2,SITEIDEND      . HAVE ALL TERMINALS BEEN CHECKED?
          J         CHEKNXT           . NO, GO CHECK THE NEXT ONE   
          TZ        STAT              . ALL CHECKED, WERE ANY LOGGED IN?
          J         HAVETERMS         . YES 
          LA        A0,MSG10          . NO, TELL USER   
          ER        APRINT$           . SAY NO TERMS LOGGED IN  
HAVETERMS                             . 
          LA        A0,ASSUMID        . GET ASSUMED TERMINAL
          SA,Q1     A0,MSG04+1        . PUT IN MSG  
          LA        A0,MSG04          . 
          TZ        ASSUMID           . IS THERE AN ASSUMED TERMINAL?   
          ER        APRINT$           . YES, PRINT IT   
          SZ,S1     RCHAIN            . CLEAR TS
          J         READN             . GET NEXT IMAGE  
.                                     . 
. **********************************************************************
. *                                                                    *
. *       @ECHO #                                                      *
. *                                                                    *
. **********************************************************************
.                                     . 
ECHO                                  . 
          TNZ       NOPTN             . WAS 'N' OPTION ON PROCESSOR CALL ?  
          J         DOECHO            . NO, GO DO ECHO  
          LA        A0,MSG15          . YES, CANNOT ECHO
          ER        APRINT$           . TELL USER   
          J         READN             . GO GET NEXT IMAGE   
DOECHO                                . 
          LX,U      X11,READN         . SET RETURN ADDRESS FOR BAD ID   
          LA,Q3     A0,INPUT+1        . GET TERMINAL TO ECHO
          TNE,U     A0,'@'            . IS IT AN '@' ?  
          J         BADID2            . YES, BAD ID 
          TNE,U     A0,'?'            . IS IT AN '?'
          J         BADID2            . YES, BAD ID 
          LA        A1,A0             . NO, SAVE TERMINAL ID IN A1  
          ANA,U     A0,040            . CONVERT TERMINAL ID TO SITEID OFFSET
          MSI,U     A0,TPKTLN         . 
          LX        X8,A0             . SAVE OFFSET IN X8   
          TNZ       SITEID,X8         . IS THIS SITE LOGGED IN ?
          J         READNF            . NO, TELL USER   
          TS        SITEID+2,X8       . YES, LOCK THE TERMINAL  
          LA,H2     A0,SITEID+2,X8    . GET FIRST SECTOR TO READ
          SA        A0,SAVEIN+5       . STORE IN I/O PACKET 
          LA,U      A0,020            . GET 'READ' FUNCTION 
          SA,S2     A0,SAVEIN+3       . SET I/O PACKET TO READ  
ECHOLP                                . 
          SZ        INPUT+(BUFLN-1)   . ZERO OUT HYDRA FLAG 
          LA,U      A0,SAVEIN         . READ THE SAVE AREA  
          ER        IOW$              . 
          LA        A0,INPUT+(BUFLN-1) . GET HYDRA FLAG FROM INPUT BUFFER   
          TE        A0,IOSTRT         . BUFFER IN USE ? 
          J         ECHOSK            . NO, SKIP IT 
          LA,H2     A0,INPUT+(BUFLN-2) . GET # OF CHARACTERS IN IMAGE   
          TNZ       A0                . NULL IMAGE ?
          J         ECHOSK            . YES, SKIP IT
          TG,U      A0,133            . NO, IS CHARACTER COUNT < 133 ?  
          LA,U      A0,132            . NO, CHANGE TO 132   
          AA,U      A0,3              . CONVERT CHARACTERS TO WORDS 
          DSL       A0,36             . 
          DI,U      A0,4              . 
          SA,S3     A0,ECHOPF         . SAVE # OF WORDS TO PRINT
          LA        A0,ECHOPF         . GET PRINT INFO  
          ER        APRINT$           . PRINT THE LINE  
ECHOSK                                . 
          LA        A0,SAVEIN+5       . GET LAST SECTOR READ
          AA,U      A0,SAVSEC         . INCREMENT TO NEXT SECTOR
          TG,H2     A0,SITEID+3,X8    . IS SECTOR BEYOND RANGE ?
          LA,H1     A0,SITEID+3,X8    . YES, START WITH FIRST SECTOR
          TNE,H2    A0,SITEID+2,X8    . BACK TO BEGINNING ? 
          J         ECHOND            . YES, FINISHED   
          SA        A0,SAVEIN+5       . NO, STORE NEXT SECTOR TO READ   
          J         ECHOLP            . CONTINUE
ECHOND                                . 
          LA        A0,IOSTRT         . GET HYDRA FLAG  
          SA        A0,INPUT+(BUFLN-1) . STORE IN INPUT BUFFER  
          LA,U      A0,010            . GET 'WRITE' FUNCTION
          SA,S2     A0,SAVEIN+3       . SET I/O PACKET TO WRITE 
          SZ,S1     SITEID+2,X8       . UNLOCK THE TERMINAL 
          J         READN             . PROCESS NEXT LINE   
/ .                                   . 
. **********************************************************************
. *                                                                    *
. *       HOLD ACTIVITY                                                *
. *                                                                    *
. **********************************************************************
.                                     . 
$(5)                                  . 
HOLDEM                                . 
          LA,U      A2,0              . INITIALIZE SITEID OFFSET
HOLDLP                                . 
          TZ        TERMFLAG          . ARE WE IN TERMINATION MODE ?
          ER        EXIT$             . YES, EXIT   
          TNZ       SITEID,A2         . IS THIS SITE LOGGED IN ?
          J         SKIPST            . NO, SKIP SITE   
          LA        A0,SITEID+1,A2    . YES, GET RSI$ TERMINAL NUMBER   
          SA,H2     A0,RHPKT          . STORE IN RSI$ HOLD PACKET   
          LA,U      A0,RHPKT          . GET ADDRESS OF RSI$ HOLD PACKET 
          ER        RSI$              . ACK THE TERMINAL
SKIPST                                . 
          AA,U      A2,TPKTLN         . INCREMENT SITEID OFFSET 
          TE,U      A2,SITEIDEND      . HAVE ALL TERMINALS BEEN ACKED ? 
          J         HOLDLP            . NO, GO ACK NEXT 
          TZ        TERMFLAG          . ARE WE IN TERMINATION MODE ?
          ER        EXIT$             . YES, STOP   
          LA        A0,HOLDPR         . NO, PRINT NULL ON SCOPE 
          ER        APRINT$           . 
          LA,U      A1,3000           . WAIT A WHILE
          ER        TWAIT$            . 
          J         HOLDEM            . GO ACK AGAIN
/ .                                   . 
. **********************************************************************
. *                                                                    *
. *       TABL PROC - THIS PROC BUILDS THE SITEID TABLE FOR HYDRA      *
. *                                                                    *
. **********************************************************************
.                                     . 
TABL*     $PROC 
          $UNLIST                     . 
CNTR*     $EQU      1                 . INITIALIZE COUNTER  
STRTSC    $EQU      (NTERM*TPKTLN)+10 . STARTING SECTOR FOR LINE SAVES  
LOOP      $NAME                       . 
FRSTSC    $EQU      ((CNTR-1)*SAVSEC*LINSAV)+STRTSC . FIRST SECTOR  
LASTSC    $EQU      FRSTSC+((LINSAV-1)*SAVSEC) . LAST SECTOR
          +         0000000000000     . SITE ID 
          +         0000000000000     . RSI$ TERMINAL NUMBER
          +         0000000000000     . NEXT SECTOR TO SAVE LINE AT 
          +         FRSTSC,LASTSC     . FIRST, LAST SECTORS FOR LINE SAVE   
       $IF          CNTR<NTERM        . 
CNTR*     $EQU      CNTR+1            . INCREMENT COUNTER   
          $GO       LOOP              . CONTINUE
       $ELSE                          . 
          $LIST                       . 
          $END      TABL              . 
.                                     . 
$(0)                                  . 
.                                     . 
. **********************************************************************
. *                                                                    *
. *       HYDRA RECOVERY AREA - ALL VALUES NEEDED FOR HYDRA RECOVERY   *
. *       MUST BE BETWEEN THE LABELS 'IOSTRT' AND 'IOWLEN'             *
. *                                                                    *
. **********************************************************************
.                                     . 
IOSTRT    '*HF*'                      . 
ASSUMID   +         0000000000000     . ASSUMED TERMINAL IDENTIFIER 
ASSUMMS   +         0,0,0,':'         . ASSUME MODE MASTER SPACE CHARACTER  
NOPTN     +         0000000000000     . SAVE AREA FOR 'N' OPTION STATUS 
STAT      +         0000000000000     . 
TERMFLAG  +         0000000000000     . TERMINATION MODE FLAG   
SITEID    TABL                        . LIST OF SITE IDS, RSI$ TERMINAL #   
SITEIDEND $EQU      $-SITEID          . 
IOWLEN    $EQU      ((($-IOSTRT)+27)/28)*28 . NUMBER OF WORDS TO READ/WRITE 
          $RES      28                . PAD OUT RECOVERY AREA   
.                                     . 
. **********************************************************************
. *                                                                    *
. *       END OF HYDRA RECOVERY AREA                                   *
. *                                                                    *
. **********************************************************************
.                                     . 
ASC2FD                                . FIELDATA-ASCII, ASCII-FIELDATA TABLES   
          +         000100,000005     . 
          +         000133,000055     . 
          +         000135,000076     . 
          +         000043,000003     . 
          +         000136,000047     . 
          +         000040,000052     . 
          +         000101,000046     . 
          +         000102,000072     . 
          +         000103,000051     . 
          +         000104,000040     . 
          +         000105,000050     . 
          +         000106,000042     . 
          +         000107,000056     . 
          +         000110,000041     . 
          +         000111,000075     . 
          +         000112,000074     . 
          +         000113,000060     . 
          +         000114,000061     . 
          +         000115,000062     . 
          +         000116,000063     . 
          +         000117,000064     . 
          +         000120,000065     . 
          +         000121,000066     . 
          +         000122,000067     . 
          +         000123,000070     . 
          +         000124,000071     . 
          +         000125,000053     . 
          +         000126,000073     . 
          +         000127,000043     . 
          +         000130,000044     . 
          +         000131,000045     . 
          +         000132,000054     . 
          +         000051,000000     . 
          +         000055,000006     . 
          +         000053,000007     . 
          +         000074,000010     . 
          +         000075,000011     . 
          +         000076,000012     . 
          +         000046,000013     . 
          +         000044,000014     . 
          +         000052,000015     . 
          +         000050,000016     . 
          +         000045,000017     . 
          +         000072,000020     . 
          +         000077,000021     . 
          +         000041,000022     . 
          +         000054,000023     . 
          +         000134,000024     . 
          +         000060,000025     . 
          +         000061,000026     . 
          +         000062,000027     . 
          +         000063,000030     . 
          +         000064,000031     . 
          +         000065,000032     . 
          +         000066,000033     . 
          +         000067,000034     . 
          +         000070,000035     . 
          +         000071,000036     . 
          +         000047,000037     . 
          +         000073,000001     . 
          +         000057,000057     . 
          +         000056,000002     . 
          +         000042,000004     . 
          +         000137,000077     . 
          +         000077,000000     . 
          +         000077,000006     . 
          +         000077,000007     . 
          +         000077,000010     . 
          +         000077,000011     . 
          +         000077,000012     . 
          +         000077,000013     . 
          +         000077,000014     . 
          +         000077,000015     . 
          +         000077,000016     . 
          +         000077,000017     . 
          +         000077,000020     . 
          +         000077,000021     . 
          +         000077,000022     . 
          +         000077,000023     . 
          +         000077,000024     . 
          +         000077,000025     . 
          +         000077,000026     . 
          +         000077,000027     . 
          +         000077,000030     . 
          +         000077,000031     . 
          +         000077,000032     . 
          +         000077,000033     . 
          +         000077,000034     . 
          +         000077,000035     . 
          +         000077,000036     . 
          +         000077,000037     . 
          +         000077,000054     . 
          +         000077,000057     . 
          +         000077,000055     . 
          +         000077,000004     . 
          +         000077,000077     . 
BLANKS    '    '                      . ASCII BLANKS
CLIST     +         6,$+1             . CLIST LIST DESIGNATOR   
          +         0000000000477     . CLIST LIST HEADER   
          'LOGIN   '                  . 
          'ASSUME  '                  . 
          'LOGOUT  '                  . 
          'STATUS  '                  . 
          'ECHO    '                  . 
ECHOFLAG  +         0000000000000     . AUTOMATIC @ECHO ON @ASSUME FLAG 
ECHOPF    PF        1,0,INPUT         . PRINT INFO FOR ECHO COMMAND 
EDITPK    +         00041,PRBUF+1     . 
          +         0000000000000     . 
          +         0010100000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         '&','D','E',0     . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
ENDO      +         ENDOL,$+1         . @@END IMAGE 
          'D,@@END '                  . 
ENDOL     $EQU      $-(ENDO+1)        . 
ESCO      +         ESCOL,$+1         . @@ESC O IMAGE   
          'D,@@ESC O   '              . 
ESCOL     $EQU      $-(ESCO+1)        . 
FDSID     +         0000000000000     . 
FRECSINT  +         FRECSINTL,$+1     . @FREE CSINTNAME$
          '@FREE,R  CSINTNAME$. '     . 
FRECSINTL $EQU      $-(FRECSINT+1)    . 
HOLDPR    PF        0,0,$             . NULL PRINT FOR HOLDEM   
IDPKT     I$DPKT    'IDBUFF' 'Hydra 5R4' 020 . ID BUFFER
INPUT     $RES      BUFLN             . INPUT BUFFER
KILTRM    +         0000000000000     . ID OF TERMINAL TO TERMINATE 
MSG01     PF        1,MSG01L-1,$+1    . SIGN OFF MESSAGE
          'END HYDRA.  '              . 
MSG01L    $EQU      $-MSG01           . 
MSG02     PF        1,MSG02L-1,$+1    . 
          '? Please login.'           . 
MSG02L    $EQU      $-MSG02           . 
MSG03     PF        1,MSG03L-1,$+1    . 
          '? Alreasy logged in.'      . 
MSG03L    $EQU      $-MSG03           . 
MSG04     PF        1,MSG04L-1,$+1    . 
          '? Assumed.  '              . 
MSG04L    $EQU      $-MSG04           . 
MSG05     PF        1,MSG05L-1,$+1    . 
          'End @ASSUME mode.   '      . 
MSG05L    $EQU      $-MSG05           . 
MSG06     PF        1,MSG06L-1,$+1    . 
          '@ASSUME error.'            . 
MSG06L    $EQU      $-MSG06           . 
MSG07     PF        1,MSG07L-1,$+1    . 
          'Illegal login id'          . 
MSG07L    $EQU      $-MSG07           . 
MSG08     PF        1,MSG08L-1,$+1    . 
          'Terminal     Site       Run ID       User ID' .  
MSG08L    $EQU      $-MSG08           . 
MSG09     PF        1,MSG09L-1,$+1    . 
          '   ?        ??????      ????????    ????????????    ' .  
MSG09L    $EQU      $-MSG09           . 
MSG10     PF        1,MSG10L-1,$+1    . 
          'No terminals logged in. '  . 
MSG10L    $EQU      $-MSG10           . 
MSG11     PF        1,MSG11L-1,$+1    . 
          '  terminated.   '          . 
MSG11L    $EQU      $-MSG11           . 
MSG12     PF        1,MSG12L-1,$+1    . 
          'HYDRA environment recovered.' .  
MSG12L    $EQU      $-MSG12           . 
MSG13     PF        1,MSG13L-1,$+1    . 
          'Site already active.'      . 
MSG13L    $EQU      $-MSG13           . 
MSG14     PF        1,MSG14L-1,$+1    . 
          'Invalid @ replacement character:    ' .  
MSG14L    $EQU      $-MSG14           . 
MSG15     PF        1,MSG15L-1,$+1    . 
          '@ECHO disabled by N option on HYDRA call.' . 
MSG15L    $EQU      $-MSG15           . 
MSG16     PF        1,MSG16L-1,$+1    . 
          'QUOTA reject on ER RSI$ '  . 
MSG16L    $EQU      $-MSG16           . 
MSG17     PF        1,MSG17L-1,$+1    . 
          'Invalid/Illegal Site-ID '  . 
MSG17L    $EQU      $-MSG17           . 
MSG18     PF        1,MSG18L-1,$+1    . 
          'Terminal cannot sign in due to low EXPOOL ' .
MSG18L    $EQU      $-MSG18           . 
MSG19     PF        1,MSG19L-1,$+1    . 
    'Terminal cannot sign in - Maximum RSI (GCCMIN) already active ' .  
MSG19L    $EQU      $-MSG19           . 
NULLS     +         0000000000000     . ASCII NULLS 
OUTPUT    $RES      BUFLN             . OUTPUT BUFFER   
PRBUF     PF        1,33,$+1          . 
          $RES      33                . 
PRTSOE    PF        1,PRTSOEL,$+1     . PRINT AN SOE
          +         0036000000000     . SOE-NUL-NUL-NUL 
PRTSOEL   $EQU      $-(PRTSOE+1)      . 
RCHAIN    +         0000000000000     . LOCK FOR TERMINAL CHAIN 
READP     +         READON,INPUT      . READ$ INFORMATION   
RECFLG    +         0000000000000     . FLAG SET WHEN HYDRA RECOVERS
RHOLD     +         0000000000000     . LOCK FOR ROPKT  
RHPKT     +         RSNOT$,000000     . RSI$ ACKNOWLEDGE PACKET (FOR HOLD)  
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
RIPKT     +         RSPUT$,000000     . RSI$ INPUT PACKET   
          +         0000000,INPUT     . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
RNPKT     +         RSDEM$,000000     . RSI$ INITIALIZATION PACKET  
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
ROPKT     +         RSGTA$,000000     . RSI$ OUTPUT PACKET  
          +         BUFLN*4,OUTPUT    . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
RRPKT     +         RSRUN$,000000     . RSI$ RUN STATUS INFO PACKET 
          +         STATBFL*4,STATBF  . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
RTPKT     +         RSTRM$,000000     . RSI$ TERMINATE A SITE PACKET
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
STATBF    $RES      STATBFL           . BUFFER FOR RSRUN$ INFO  
TRMACS    +         0000000000000     . TERMINAL SELECTOR CHARACTER SAVE AREA   
.                                     . 
. **********************************************************************
. *                                                                    *
. *       FIELDATA ER PACKET AREAS                                     *
. *                                                                    *
. **********************************************************************
.                                     . 
          $FDATA                      . 
ASG       '@ASG,A'                    . @ASG IMAGE  
          '      '                    . 
          'HYDRA$'                    . 
          '      '                    . 
          ',F/0/T'                    . 
          'RK/384'                    . 
ASGL      $EQU      $-ASG             . LENGTH OF @ASG IMAGE
ASGT      '@ASG,T'                    . 
IOPKT     'HYDRA$'                    . 
          '      '                    . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         IOWLEN,IOSTRT     . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
SAVEIN    'HYDRA$'                    . 
          '      '                    . 
          +         0000000000000     . 
          +         0001000000000     . 
          +         BUFLN,INPUT       . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
SAVOUT    'HYDRA$'                    . 
          '      '                    . 
          +         0000000000000     . 
          +         0001000000000     . 
          +         BUFLN,OUTPUT      . 
          +         0000000000000     . 
          +         0000000000000     . 
          +         0000000000000     . 
          $END      HYDRA             . 
