ASMB,R,L,C
      HED @REFA-REMOTE EXEC & FILE ACCESS *(C) HEWLETT-PACKARD CO. 1976*
      NAM @REFA,7 91705-16110 REV.A 760401
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 1 
* 
* @REFA 
* SOURCE: 91705-18110 REV.A 
* BINARY: 91705-16110 REV.A 
* JIM HARTSELL
* AUG. 30, 1974 
* MODIFIED BY: C.C.H. (12-30-75) [DERIVED FROM: 91705-18010 REV.C]
* 
* LIBRARY SUBROUTINE APPENDED TO RTE-C SATELLITE USER 
* PROGRAM FOR REMOTE EXEC, REMOTE FILE ACCESS, AND
* MASTER PROGRAM TO PROGRAM CALLS TO THE CENTRAL STATION. 
* 
      ENT DCRET,DPURG,DOPEN,DCLOS 
      ENT DREAD,DWRIT,DPOSN,DWIND 
      ENT DNAME,DCONT,DLOCF,DAPOS,DSTAT 
* 
      ENT DEXEC 
* 
      ENT POPEN,PREAD,PWRIT,PCONT,GETLU 
* 
      ENT %DLST,%DNLD,%RMCN,%PRMB 
* 
      EXT @QUE,@DEQ,EXEC,%LU,@DISP
      EXT $LIBR,$LIBX,%CPFL 
      EXT $LIST,%LIST,$XEQ,$PVCN,%TMOT
* 
A     EQU 0 
B     EQU 1 
* 
* 
* CREATE A CENTRAL FILE.
* 
DCRET NOP 
      JSB CQUE      NO RETURN. CALL IS POINTER TO 
      DEC 150       ENTRY POINT AND FUNCTION CODE.
* 
* PURGE A CENTRAL FILE. 
* 
DPURG NOP 
      JSB CQUE
      DEC 151 
* 
* OPEN A CENTRAL FILE.
* 
DOPEN NOP 
      JSB CQUE
      DEC 152 
* 
* WRITE ON CENTRAL FILE.
* 
DWRIT NOP 
      JSB CQUE
      DEC 153 
* 
* READ FROM CENTRAL FILE. 
* 
DREAD NOP 
      JSB CQUE      SIGN BIT OF FCN CODE SET FOR
      OCT 100232    READ (FCN = 154). 
* 
* POSITION CENTRAL FILE.
* 
DPOSN NOP 
      JSB CQUE
      DEC 155 
* 
* REWIND CENTRAL FILE.
* 
DWIND NOP 
      JSB CQUE
      DEC 156 
* 
* CLOSE CENTRAL FILE. 
* 
DCLOS NOP 
      JSB CQUE
      DEC 157 
* 
* RENAME CENTRAL FILE.
* 
DNAME NOP 
      JSB CQUE
      DEC 158 
* 
* CONTROL CENTRAL FILE. 
* 
DCONT NOP 
      JSB CQUE
      DEC 159 
* 
* LOCATE CENTRAL FILE RECORD. 
* 
DLOCF NOP 
      JSB CQUE
      DEC 160 
* 
* ABS POSITION CENTRAL FILE.
* 
DAPOS NOP 
      JSB CQUE
      DEC 161 
* 
* READ CENTRAL FILE DIRECTORY.
* 
DSTAT NOP 
      JSB CQUE
      OCT 100242    READ CALL. FCN = 162. 
* 
* REMOTE EXEC CALLS 
* 
DEXEC NOP 
      LDA DEXEC     SAVE RETURN ADDRESS.
      STA NCALL 
      INA 
      LDB A,I       GET IDEST ADDR. 
      LDB B,I       IDEST VALUE.
      SZB 
      JMP LEXEC     GENERATE LOCAL CALL.
* 
      INA           GENERATE REMOTE CALL. 
      LDA A,I       GET REQUEST CODE ADDR.
      LDA A,I       GET REQUEST CODE. 
      ELA,CLE,ERA   CLEAR SIGN BIT. 
      LDB EFCN
      ELB,CLE 
      CPA B1        IF READ DATA, SET SIGN BIT
      CCE           IN FUNCTION CODE. 
      ERB 
      STB EFCN
      JMP *+2 
NCALL NOP 
      JSB CQUE
EFCN  OCT 243       FCN = 163.
* 
* OPEN A CENTRAL PROGRAM. 
* 
POPEN NOP 
      JSB CQUE
      DEC 1 
* 
* READ FROM CENTRAL PROGRAM.
* 
PREAD NOP 
      JSB CQUE
IWRT  OCT 100002    READ CALL. FCN = 2. 
* 
* WRITE TO CENTRAL PROGRAM. 
* 
PWRIT NOP 
      JSB CQUE
      DEC 3 
* 
* CONTROL A CENTRAL PROGRAM.
* 
PCONT NOP 
      JSB CQUE
      DEC 4 
* 
* GET CENTRAL LU OF THIS SATELLITE. 
* 
GETLU NOP 
      JSB CQUE
      DEC 9 
* 
* SPECIAL ENTRY POINT FOR REMAC. REQUEST A FORMATTED
* DIRECTORY LIST PRINT LINE FROM THE CENTRAL STATION. 
* 
%DLST NOP 
      JSB CQUE
      OCT 100012    FCN = 10. 
* 
* SPECIAL ENTRY POINT FOR APLDR. REQUEST AN ABSOLUTE
* PROGRAM DATA RECORD FROM THE CENTRAL STATION DISC.
* 
%DNLD NOP 
      JSB CQUE
      DEC 0 
* 
* SPECIAL ENTRY POINT FOR REMAC. SEND ASCII CENTRAL 
* OPERATOR COMMAND. 
* 
%RMCN NOP 
      JSB CQUE
      DEC 200 
      SPC 3 
* 
* DESTINATION CODE IN DEXEC CALL WAS NON-ZERO. GENERATE 
* LOCAL EXEC CALL FROM USER DEXEC CALL, EXECUTE IT, 
* AND RETURN TO USER WITH A,B INTACT. 
* 
LEXEC LDA DLC2      INITIALIZE RETURN ADDRESS.
      STA LCAL1 
* 
      LDA DEXEC     GET # PARAMS TO MOVE. 
      CMA 
      ADA DEXEC,I 
      ADA MD1 
      CMA,INA 
      STA DLEN
* 
      LDA DEXEC     SET UP MOVE POINTERS. 
      ADA B2
      STA PLEN
      LDA DLC2
      STA DADR
* 
LMOVE LDA PLEN,I    MOVE CALL PARAMETERS. 
      STA DADR,I
      ISZ LCAL1     BUMP NEW RETURN ADDR. 
      ISZ PLEN
      ISZ DADR
      ISZ DLEN
      JMP LMOVE 
* 
      LDA DEXEC,I   SET UP RETURN ADDRESS.
      STA DEXEC 
* 
      DLD RINST 
      DST DADR,I    SET UP RETURNS TO USER. 
      ISZ DADR
      ISZ DADR
      STA DADR,I
* 
      JSB EXEC      EXECUTE LOCAL CALL. 
LCAL1 NOP 
LCAL2 NOP           RCODE GOES HERE.
      BSS 6         ROOM FOR 6 MORE PARAMS. 
      NOP           SLOP ROOM FOR JMP DEXEC,I 
      NOP            (ERROR & NORMAL EXITS) 
* 
* 
DLC2  DEF LCAL2 
* 
* DO NOT CHANGE ORDER OF NEXT TWO STATEMENTS *
* 
RINST JMP DEXEC,I 
      ISZ DEXEC 
* 
      SKP 
* WHEN CQUE IS CALLED, THE ADDRESS OF THE USER
* CALL AND THE FUNCTION CODE CAN BE DETERMINED
* VIA THE ENTRY POINT CONTENTS. 
* 
CQUE  NOP 
      LDA CQUE,I    FETCH FUNCTION CODE.
      CLB           CHECK SIGN BIT. 
      SSA 
      INB 
      STB RDATA     SET "READ DATA" FLAG. 
      ELA,CLE,ERA   CLEAR SIGN BIT. 
      STA FCN 
      LDA CQUE      FETCH USER CALL ADDRESS.
      ADA MD2 
      LDA A,I 
      STA CALL
RQUE  CLA           CLEAR DATA BUFR ADDR. 
      STA DADR
* 
* BUILD AND QUEUE THE PARMB.
* 
QUE   JSB @QUE
FCN   NOP           FUNCTION CODE.
CALL  NOP           ADDR OF USER CALL.
      DEF PARMB     PARAMETER BUFFER. 
      DEF REPLY     REPLY BUFFER. 
      DEF DADR      RETURNED DATA BUFR ADDR OR 0. 
      DEF DLEN      RETURNED DATA BUFR LENGTH.
      DEF PLEN      RETURNED PARMB LENGTH.
* 
      JMP REJ       REQUEST REJECTED. GO COMPLETE.
* 
      STB QENT      ACCEPTED. SAVE ENTRY ADDRESS. 
* 
* THE PARMB IS NOW QUEUED AND READY. FORMAT EXEC CALL 
* FOR TRANSMISSION, BUT DON'T EXECUTE YET.
* 
      LDA IWRT      WRITE--NO ABORT. (100002B)
      STA IRW       SET FOR "TRANSMIT ONLY".
      CLB 
      CPB DADR      IS THERE ANY DATA? (SKIP IF TRUE) 
      JMP CONST       NO. GO TO FORM CONWORD WITH MODE =0.
      LDA FCN 
      ARS 
      CPA B1        IS FUNCTION PREAD OR PWRIT? 
      JMP CONST     YES, DO REQ. ONLY NOW 
* 
* SET UP MODE BITS(#6,7) FOR THE REQUEST & DATA CALL TO DVR65.
* 
      LDB IRW       GET THE REQUEST CODE. 
      LDA RDATA     GET THE "READ DATA" FLAG. 
      SZA           IS DATA TO BE READ? 
      ADB MD1         YES. SET REQUEST CODE =1--READ. 
      STB IRW       SAVE THE REQUEST CODE.
      BLR,CLE,RBL   POSITION THE DRIVER-MODE INFORMATION
      BLF             TO BITS# 6,7. 
CONST LDA %LU       GET THE LOGICAL UNIT NUMBER.
      IOR 1         FORM THE CONFIGURED CONWORD,
      STA CONWD       AND SAVE FOR THE CALL TO THE DRIVER.
      LDA MD4       INITIALIZE THE
      STA BUZY        REMOTE-BUSY RETRY COUNTER.
      LDA MD10      INITIALIZE THE
      STA RTRY        DRIVER-BUSY RETRY COUNTER.
* 
* REQUEST PERMISSION TO TRANSMIT THE PARMB TO CENTRAL.
* 
DISP  CLA           SIGNAL PARMB NOT SENT YET.
      STA SNFLG 
      LDA %TMOT     SET UP FOR TIME-OUT.
      SZA,RSS 
      CLA,INA 
      STA TIME
* 
      JSB @DISP 
      SZA           (A) = 0 OR ADDR OF QUEUE ENTRY. 
      JMP DISP1 
* 
      LDB QENT      REPLY INTERRUPT MAY HAVE
      INB           OCCURRED WHILE @DISP HAD
      LDB B,I       INTERRUPTS OFF. SEE IF @INTR
      CPB B2        CAME THRU AND GAVE US 
      JMP INIT      PERMISSION. 
      JMP ZONK
* 
DISP1 CPA QENT      OUR QUEUE ENTRY?
      JMP INIT      YES.
* 
      STA DQENT     NO. DEAD ENTRY, SO DE-QUE!
      JSB @DEQ
DQENT NOP 
      OCT 1 
* 
      NOP 
      JMP DISP      SEARCH QUEUE AGAIN. 
* 
* PERMISSION GRANTED. NO OTHER REQUESTS ARE OUTSTANDING.
* QUEUE ENTRY FLAG WORD = "PARMB SENT". 
* 
INIT  LDA %CPFL     CHECK IF LAST REQUEST FOUND 
      SZA,RSS       "LINE DOWN" CONDITION.
      JMP XMIT      NO. 
* 
      JSB EXEC      YES. SCHED ENABL WITH WAIT. 
      DEF *+4 
      DEF D9
      DEF ENABL 
      DEF AS.01 
* 
      CLA           CLEAR FLAG. 
      JSB STPFL 
* 
* 
XMIT  JSB EXEC      PERFORM TRANSMISSION. 
      DEF *+7 
      DEF IRW 
      DEF CONWD 
      DEF PARMB 
      DEF PARSZ 
      DEF DADR      POINT TO ADDR OF DATA BUFR(NO Z-BIT)
      DEF DLEN      POINT TO LENGTH OF DATA BUFR(NO Z-BIT)
      JMP DOWN      INFORM USER OF ABORTIVE ERROR.
* 
* USER IN I/O SUSPEND DURING TRANSMISSION.
* WHEN COMPLETE, CHECK FOR ERRORS.
* 
      DST XSTAT     (DEBUG AID ONLY)
      SLA,RAR 
      JMP GOOD      NO ERRORS.
* 
      SWP 
      AND B40       ISOLATE EQT12 BIT#5 (REMOTE BUSY).
      CLE,ERB       MOVE BUSY-REJECT BIT(EQT5 #1) TO <E>. 
      SEZ,SZA,RSS   BUSY-REJECT/REMOTE BUSY OR BOTH?
      JMP DOWN        NEITHER--DRIVER ERROR!
      SEZ,RSS       WAS THE REMOTE SYSTEM BUSY? 
      JMP BZWT       YES. GO TO WAIT A WHILE. 
      SZA            NO. SIMULTANEOUS REQUESTS? 
      JMP XMIT        YES. LET DVR65 RESOLVE PROBLEM. 
      JMP DELAY     DRIVER BUSY--DELAY & RE-CALL. 
* 
BZWT  ISZ BUZY      O.K. TO RE-TRY? 
      JMP ZONK       YES. DO SO VIA WAIT LIST.
      JMP FAIL       NO. REPORT THE ERROR!
* 
QKNAP LDA T100M     PROBABLY APLDR TRYING TO
      STA TIME      READ DATA FROM CENTRAL. 
      JMP ZONK
* 
DELAY ISZ RTRY      DELAY FOR A WHILE, IF RETRIES VALID.
      JMP QKNAP       VALID: TRY AGAIN, IN 100 MSEC; ELSE,
FAIL  LDA MD103        GIVE UP! 
      JMP DOWN1 
* 
GOOD  ISZ SNFLG     SIGNAL PARMB SENT.
* 
* THE PARMB HAS BEEN SENT, OR SOMEONE ELSE IS PENDING A REPLY.
* SUSPEND THIS USER VIA THE OPERATOR SUSPEND LIST UNTIL A 
* REPLY ARRIVES OR TIME-OUT OCCURS.  THE SCE/5 @CLCK MODULE 
* WILL RESTART THE USER.
* 
* BEFORE SUSPENDING, ESTABLISH AN ENTRY IN THE WAIT-LIST. 
* 
ZONK  LDB %LIST 
      LDA 1,I       NEG. # ENTRIES. 
      STA TEMP
      INB 
* 
WLOOP LDA 1,I       CHECK TIME WORD.
      SZA,RSS       ZERO? 
      JMP SWAIT     YES. FOUND EMPTY ENTRY. 
* 
      ADB B5
      ISZ TEMP
      JMP WLOOP 
      JMP FAIL      NONE. SYSTEM FAILURE. 
* 
SWAIT STB TEMP1 
      JSB $LIBR 
      NOP 
      LDA TIME      STORE TIME VALUE IN WORD 1. 
      STA TEMP1,I 
      ISZ TEMP1 
      LDA XEQT,I    STORE PROGRAM NAME. 
      ADA D12 
      STA TEMP      ADDR OF NAME IN ID SEG. 
* 
      LDB MD3 
MLOOP LDA TEMP,I
      STA TEMP1,I 
      ISZ TEMP
      ISZ TEMP1 
      INB,SZB 
      JMP MLOOP 
* 
      LDA XEQT,I    STORE ID SEG ADDR.
      STA TEMP1,I 
* 
      STA IDSG      SUSPEND THE USER. 
      LDA DEFX
      STA XSUSP,I 
* 
      CLA           PRIVILEDGED MODE. 
      STA $PVCN 
* 
      JSB $LIST 
      OCT 106 
IDSG  NOP 
* 
      JMP $XEQ      GIVE UP CPU.
DEFX  DEF AWAKE     RESTART ADDRESS.
* 
* USER HAS BEEN RE-SCHEDULED FROM POINT OF SUSPENSION.
* 
AWAKE LDA QENT      REPLY RECEIVED? 
      INA 
      LDA A,I 
      CPA B3
      JMP COMPX     YES, GO COMPLETE USER CALL. 
      CPA B1        NO. DID WE SEND PARMB?
      JMP DISP      NO. TRY PERMISSION AGAIN. 
      CPA B2        RETRY IF QUEUE WAS FULL.
      JMP *+2 
      JMP QUE 
      LDA SNFLG     WAS IT A TIME-OUT?
      SZA 
      JMP DOWN      YES.
      LDA %TMOT     NO. PERMISSION HAS BEEN 
      SZA,RSS 
      CLA,INA 
      STA TIME      GRANTED TO SEND PARMB.
      JMP INIT
* 
* CENTRAL MUST HAVE GONE DOWN. SET ERROR CODE 
* IN REPLY BUFFER FOR @DEQ. 
* 
DOWN  LDA MD51
      JSB STPFL 
DOWN1 LDB FCN       STORE IN A-REG SLOT 
      ADB MD11      FOR RFA/DEXEC;
      SSB,RSS       IERR SLOT FOR PTOPC, DLIST, DNLD. 
      JMP DOWN2 
      STA REPLY+3 
      JMP COMPL 
DOWN2 STA REPLY+2 
      JMP COMPL 
* 
* COMPLETE A REJECTED OR INCOMPLETE REQUEST.
* 
REJ   STB QENT
      CPA MD1       QUEUE FULL? 
      JMP QKNAP     YES, LET SOMEONE COMPLETE A REQUEST 
      JMP COMPL     NO. 
* 
* REPLY HAS BEEN RECEIVED.
* PERFORM COMPLETION PROCESSING.
* 
COMPX LDA IWRT      WRITE--NO ABORT. (100002B)
      LDB FCN       FUNCTION CODE 
      CPB B3        IS IT A PWRIT?
      JMP PDATA     YES 
      CPB B2        IS IT A PREAD?
      RSS           YES 
      JMP COMPL     PERFORM COMPLETION PROCESSING 
      ADA MD1       FORM READ-REQUEST--NO ABORT.
* 
*  P TO P DATA TRANSFERS
* 
PDATA STA IRW       SET READ/WRITE TYPE 
      LDA %LU 
      IOR B300      DATA ONLY 
      STA CONWD     CONTROL WORD
* 
      LDA QENT      ADDR OF QUEUE ENTRY 
      ADA D10       POINT TO ITS TIME-TAGS
      STA TITAG     SAVE ADDR FOR DATA ONLY CALL
      INA 
      STA TITAG+1    & ADDR OF 2ND TIME-TAG 
* 
      JSB EXEC      CALL DRIVER TO DO DATA NOW
      DEF *+7 
      DEF IRW 
      DEF CONWD 
      DEF DADR,I
      DEF DLEN
TITAG NOP 
      NOP 
      JMP DOWN      DRIVER ERROR DETECTED.
* 
      SLA,RSS 
      JMP DOWN      ERROR OCCURRED
* 
COMPL LDA CALL,I    SET RETURN ADDRESS. 
      STA TEMP
* 
      JSB @DEQ
QENT  NOP           ADDR OF QUEUE ENTRY.
      OCT 0         NORMAL PROCESSING.
* 
      JMP DSPLY     ERROR RETURN. 
      SEZ           NORMAL RETURN.
      ISZ TEMP      IF E=1, BUMP RETURN ADDR. 
      JMP TEMP,I
* 
      SKP 
* 
* AN ERROR RETURN FROM @DEQ INDICATES SPECIAL 
* COMPLETION PROCESSING.
* (A)= 0: DISPLAY REPLY BUFFER AND TERMINATE. 
* (A)= 1: DISPLAY REPLY BUFFER, SUSPEND, DE-QUE QUEUE 
*         ENTRY AND REPEAT THE REQUEST. 
* 
DSPLY STA FLAG
* 
      JSB EXEC      DISPLAY ERROR MESSAGE STORED
      DEF *+5       IN REPLY BUFFER BY @DEQ.
      DEF B2
      DEF B1        LU 1. 
      DEF REPLY 
      DEF D17 
* 
      LDA FLAG      CHECK FLAG. 
      SZA 
      JMP SUSP      GO SUSPEND. 
* 
      JSB EXEC      ABORTIVE ERROR. 
      DEF *+2       TERMINATE (ABORT) THE USER. 
      DEF B6
* 
SUSP  JSB EXEC      CENTRAL DOWN. SUSPEND UNTIL 
      DEF *+2       RE-STARTED BY "GO" BY OPERATOR. 
      DEF B7
* 
      JMP RQUE      RE-TRY THE REQUEST. 
* 
* STORE A-REG CONTENTS IN "LINE DOWN" FLAG. 
* 
STPFL NOP 
      JSB $LIBR 
      NOP 
      STA %CPFL 
      JSB $LIBX 
      DEF STPFL 
      SKP 
* CONSTANTS AND WORKING STORAGE.
* 
XSUSP OCT 101730
XEQT  OCT 1717
B1    OCT 1 
B2    OCT 2 
B3    OCT 3 
B5    OCT 5 
B6    OCT 6 
B7    OCT 7 
B40   OCT 40
B300  OCT 300 
D9    DEC 9 
D10   DEC 10
D12   DEC 12
D17   DEC 17
MD1   DEC -1
MD2   DEC -2
MD3   DEC -3
MD4   DEC -4
MD10  DEC -10 
MD11  DEC -11 
MD51  DEC -51       "LINE DOWN" ERROR CODE. 
MD103 DEC -103
XSTAT OCT 0,0 
TIME  NOP 
T100M EQU MD10      100 MS. WAIT. 
TEMP  NOP 
TEMP1 NOP 
BUZY  NOP           BUSY-RE-TRY COUNTER.
RTRY  NOP 
FLAG  NOP 
SNFLG OCT 0 
RDATA NOP           "READ DATA" FLAG. 
AS.01 ASC 1,01
ENABL ASC 3,ENABL 
* 
DADR  NOP           DATA BUFFER ADDRESS.
DLEN  NOP           DATA LENGTH.
PLEN  NOP           REQUEST LENGTH. 
* 
CONWD NOP           CONFIGURED CONTROL WORD.
DUMMY NOP           DUMMY PARAMETER 
IRW   NOP 
PARSZ DEC 35        PARAMETER BUFFER LENGTH 
%PRMB DEF PARMB 
PARMB BSS 35        PARAMETER BUFFER AREA.
REPLY EQU PARMB     REPLY BUFFER AREA.
* 
SIZE  EQU * 
* 
      END 
                                                                                                                                                                                                                