ASMB,R,L,C,N
*USE 'ASMB,R,N' FOR DS/1000 ONLY, AND 'ASMB,R,Z' FOR DS/1000 & DS/3000
      IFN 
      NAM POPEN,7 91740-16042 REV 1740 770714 
      XIF 
      IFZ 
      NAM POPEN,7 91741-16016 REV 1740 770714 
      XIF 
      UNL 
      IFN 
      HED POPEN (DS/1000) 91740-16042 * (C) HEWLETT-PACKARD CO 1977 
      XIF 
      IFZ 
      HED POPEN (DS/1000 & DS/3000) 91741-16016 * (C) HEWLETT-PACKARD CO 1977 
      XIF 
      LST 
* 
*     IFN OPTION
*     NAME:   POPEN 
*     SOURCE: 91740-18042 
*     RELOC:  91740-16042 
*     PRGMR:  CHUCK WHELAN
* 
*     IFZ OPTION
*     NAME:   POPEN 
*     SOURCE: 91741-18016 
*     RELOC:  91741-16016 
*     PRGMR:  CHUCK WHELAN & JIM HARTSELL 
* 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977.  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 2 
      ENT POPEN,PREAD,PWRIT,PCONT,PCLOS 
      EXT D65MS 
      EXT .ENTR 
      IFZ 
      EXT #LU3K 
      EXT D3KMS,D$INI,D$STW,D$ASC 
      EXT D$RQB,D$NWD,D$ZRO,D$WDC,D$SMP 
* 
D     EQU 256       MAX # DATA WORDS/BLOCK (DS/3000). 
      XIF 
      SUP 
* 
      SPC 3 
*   THIS PROGRAM PERFORMS ALL MASTER PROGRAM TO PROGRAM FUNCTOIONS
*   IN THE DISTRIBUTED SYSTEM.  ON EACH REQUEST IT DOES THE FOLLOWING:
* 
*      1.  MOVES PCB FROM USER AREA TO REQUEST (EXCEPT POPEN) 
*      2.  VERIFIES SUFFICIENT PARAMETERS PASSED IN CALL
*      3.  MOVES 20 WORD TAG FIELD INTO REQUEST (EXCEPT PCLOS)
*      4.  SETS STREAM, FUNCTION, AND ORIGINATOR NODE INTO REQUEST
*      5.  CALLS "D65MS" TO SEND REQUEST (& DATA) AND GET REPLY 
*      6.  IF NO SYSTEM ERROR, MOVES TAG FIELD INTO USER AREA (EXCEPT PCLOS)
*      7.  EXAMINES STATUS & GIVES "ACEPT", "REJCT", OR ERROR CODE BACK TO CALLER 
      SKP 
IPCB  NOP 
IERR  NOP 
INAM  NOP 
INODE NOP 
ITAG  NOP 
      IFZ 
ENAM  NOP           DS/3000: ENTRY NAME 
      NOP                    CONTROL INFORMATION. 
      NOP                    LOADING OPTIONS. 
BUFSZ NOP                    MAX DATA RECORD LENGTH 
      XIF 
      SPC 3 
POPEN NOP 
* 
* MASTER REQUESTS FOR POPEN COME HERE 
* 
      JSB .ENTR     PICK UP THE USER PARAMETERS 
      DEF IPCB
* 
      LDB IPCB      USER'S PCB ADDRESS
      LDA INODE,I   DESTINATION NODE
      ADB K3        4TH WORD OF PCB HAS NODE
      STA 1,I       PUT IT THERE
      STA $DEST     SAVE IT 
* 
      LDB POPEN     SET UP ERROR RETURN 
      LDA IERR
      JSB BLDRQ     SET UP BASIC REQST
      DEF ITAG
      DEC 1         FCN = 1 
      IFZ 
      JMP QOPEN     DO POPEN TO 3000
      XIF 
* 
      LDA INAM      ADDR OF NAME FIELD
      LDB RPCBA     ADDR OF PCB IN REQ BUFFER 
      MVW K3        MOVE NAME INTO PCB FIELD
* 
      LDA IPCB
* 
NODAT LDB DUMAD     USE DUMMY AS DATA POINTER 
      STB DBUF
      CLB 
      STB WRLEN     SET WRITE DATA LENGTH = 0 
* 
* 
*  THIS CODE IS USED IN COMMON BY ALL P TO P CALLS
* 
MAIN  STB RDLEN     SET READ DATA LENGTH
      STA PCBAD     SAVE PCB ADDRESS
* 
      LDA K4
      STA $STRM     SET P TO P STREAM IN REQ
* 
* THE CALL TO D65MS WILL: 
*  1) GET AN I/O CLASS
*  2) INSERT SEQ # & ORIGIN NODE
*  3) BUILD MASTER TCB
*  4) SEND REQUEST (& DATA) 
*  5) CALL "D65GT" TO AWAIT AND GET REPLY 
*  6) RETURN REPLY (& DATA) 
*  7) RETURN CONTROL
      JSB D65MS     ISSUE REQUEST CALL
      DEF *+8 
      DEF CONWD 
      DEF IRBUF     REQUEST BUFFER
      DEF IRBFL     REQUEST LENGTH
DBUF  NOP           DATA BUFFER ADDRESS 
      DEF WRLEN     DATA WRITE LENGTH 
      DEF RDLEN     DATA READ LENGTH
      DEF IRBFL     MAX EXPECTED REPLY LENGTH 
* 
      JMP ERR       ERROR DETECTED
      LDA $FUNC     FUNCTION CODE 
      CPA K5        IS THIS A PCLOS?
      JMP NOMOV     YES, WE'RE DONE 
* 
RPCBA EQU *+1 
      DLD $PCB      GET PCB 
PCBAD EQU *+1 
      DST *         SAVE 1ST 2 PCB WORDS IN USER AREA 
* 
      LDA RTAGA     ADDR OF TAG FIELD IN REQUEST
      LDB TAGAD     ADDR OF TAG FIELD IN USER AREA
      MVW K20       MOVE 20 WORDS TO USER TAG FIELD 
* 
NOMOV LDA $ERR
      SZA           WAS ERROR DETECTED? 
      JMP EXIT      YES, IERR SET 
      LDB $FUNC 
      SSB           WAS REQUEST REJECTED? 
      CLA,INA       YES, SET REJECT IERR
EXIT  STA ERRAD,I   RETURN IT TO CALLER 
      CLB 
      STB CLEAR,I   CLEAR PARAM CHECK LOC 
      JMP RTRN,I    RETURN
      SKP 
* 
*  MOVE PCB INTO REQUEST BUFFER 
MVPCB NOP 
      LDB N2
      ADB MVPCB     POINT TO ADDR OF PCB ADDR 
      LDB 1,I       GET ADDR OF PCB ADDR
      LDA 1,I       GET PCB ADDR
      LDB RPCBA     GET ADDR OF PCB IN BUFFER 
      MVW K2        MOVE 1ST TWO WORDS TO REQUEST 
      INA           POINT TO 4TH DCB WORD 
      LDB 0,I       GET DESTINATION NODE
      STB $DEST     SAVE IT 
      JMP MVPCB,I   RETURN
      SPC 2 
* 
*  COMMON PARAMETER SET-UP AND TAG FIELD MOVE FOR ALL BUT "PCLOS" 
BLDRQ NOP 
      STB RTRN      RETURN ADDRESS FOR ALL
      STA ERRAD     ADDR OF ERROR PARAMETER 
* 
      DLD BLDRQ,I   GET TAG ADDR ADDR, AND FUNC CODE
      STA CLEAR     SAVE LAST PARAM ADDR
      LDA 0,I       GET ADDR OF USER'S TAG FIELD
      SZA,RSS       WAS LAST PARAM SPECIFIED
      JMP ERR2      TOO FEW PARAMETERS IN CALL
      STB $FUNC     SET FUNCTION CODE 
      IFZ 
      LDB #LU3K     GET DS/3000 LU
      CMB,INB,SZB,RSS NEGATE
      JMP *+3       NO 3000 
      CPB $DEST     IS IT NEGATIVE LU OF 3000?
      JMP RQEX      YES, PERFORM DS/3000 P-TO-P 
      XIF 
      LDB K31       REQUEST LENGTH
      STB IRBFL 
* 
      STA TAGAD 
      LDB RTAGA     ADDR OF TAG FIELD IN REQUEST
      MVW K20       MOVE TAG FIELD INTO REQ 
      IFZ 
      ISZ BLDRQ 
      XIF 
RQEX  ISZ BLDRQ 
      ISZ BLDRQ 
      JMP BLDRQ,I   RETURN
      SPC 3 
*  ERROR PROCESSING SECTION 
ERR   ADB NEG00     SUBTRACT ASCII "00" 
      CPA "DS"      IS IT A "DSXX" ERROR? 
      SSB            AND >= "00"? 
      JMP ERR47     NO, GIVE -47
      LDA 1 
      ADA N9        NUMERIC PART - 9
      CMA,SSA       SKIP IF DS00 - DS08 
ERR47 LDA K11       MAKE A -47 ERROR
      ADA N58       A = -47 OR -50 THRU -58 
      JMP EXIT
ERR2  LDA N40 
      JMP EXIT      RETURN WITH IERR
      SKP 
* 
*  READ REQUESTS
* 
RIPCB NOP 
RIERR NOP 
RIBUF NOP 
RIL   NOP 
RITAG NOP 
* 
PREAD NOP 
      JSB .ENTR     GET USER PARAMETERS 
      DEF RIPCB 
      JSB MVPCB     MOVE 2 WORD PCB INTO REQUEST
* 
      LDB PREAD     RETURN ADDRESS
      LDA RIERR 
      JSB BLDRQ     BASIC REQUEST PROCESSING
      DEF RITAG 
K2    DEC 2 
      IFZ 
      JMP QREAD     PERFORM PREAD TO 3000 
      XIF 
* 
      LDA RIBUF     SAVE BUFFER ADDRESS 
      STA DBUF
      LDB RIL,I     SAVE DATA LENGTH
      STB $DLEN 
* 
      CLA 
      STA WRLEN     CLEAR WRITE DATA LENGTH 
      LDA RIPCB     PCB ADDRESS 
      JMP MAIN      NOW DO LINE COMM & RETURN 
      SKP 
* 
*  WRITE REQUESTS 
* 
PIPCB NOP 
PIERR NOP 
PIBUF NOP 
PIL   NOP 
PITAG NOP 
* 
* 
PWRIT NOP           PWRITE REQUESTS HERE
      JSB .ENTR     PICK UP PARAMETERS
      DEF PIPCB 
      JSB MVPCB     MOVE 2 WORD PCB INTO REQUEST BUFR 
* 
      LDB PWRIT     SET UP ERROR RETURN 
      LDA PIERR 
      JSB BLDRQ     BUILD BASIC REQST 
      DEF PITAG 
K3    DEC 3 
      IFZ 
      JMP QWRIT     PERFORM PWRIT TO 3000 
      XIF 
* 
      LDA PIBUF     GET DATA ADDRESS
      STA DBUF
      LDA PIL,I     GET DATA LENGTH 
      STA $DLEN 
      STA WRLEN 
* 
      LDA PIPCB 
      CLB 
      JMP MAIN      NOW DO LINE COMM & RETURN 
      SKP 
* 
*  CONTROL REQUESTS 
* 
CIPCB NOP 
CIERR NOP 
CITAG NOP 
* 
* 
PCONT NOP 
      JSB .ENTR     GET PARAMETERS
      DEF CIPCB 
      JSB MVPCB     MOVE 2 WORD PCB INTO REQUEST BUFR 
* 
      LDB PCONT     SET UP RETURN ADDR
      LDA CIERR 
      JSB BLDRQ     BUILD BASIC REQST 
      DEF CITAG 
K4    DEC 4 
      IFZ 
      JMP QCONT     PERFORM PCONT TO 3000 
      XIF 
* 
      LDA CIPCB     PCB ADDRESS 
      JMP NODAT     DO LINE COMM & RETURN 
      SKP 
* 
*  CLOSE REQUESTS 
* 
FIPCB NOP 
FIERR NOP 
* 
* 
RTRN  EQU * 
PCLOS NOP 
      JSB .ENTR     GET PARAMETERS
      DEF FIPCB 
      JSB MVPCB     MOVE 2 WORD PCB INTO REQUEST BUFR 
* 
      LDA DFIEA 
      STA CLEAR     SAVE LAST PARAM ADDR
      LDA FIERR 
      SZA,RSS       ERROR ADDR SPECIFIED? 
      JMP ERR2      NO, GIVE ERROR
      STA ERRAD     SET ERROR ADDRESS 
      IFZ 
      LDA #LU3K     GET 3000 LU 
      CMA,INA,SZA,RSS NEGATE IT 
      JMP *+3       JUMP IF NO 3000 LINK
      CPA $DEST     WAS NEGATIVE LU OF 3000 SPECIFIED?
      JMP QCLOS     YES, DO PCLOS TO 3000 
      XIF 
* 
      LDA K11 
      STA IRBFL     11 WORD REQUEST 
      LDA K5
      STA $FUNC     FUNCTION CODE = 5 
* 
      LDA FIPCB     PCB ADDRESS 
      JMP NODAT     DO COMMUNICATION & RETURN 
      SKP 
* 
*  DATA AREA
* 
IRBFL NOP 
WRLEN NOP 
RDLEN NOP 
K5    DEC 5 
K11   DEC 11
K20   DEC 20
K31   DEC 31
N2    DEC -2
N9    DEC -9
N40   DEC -40 
N58   DEC -58 
NEG00 OCT 147720
"DS"  ASC 1,DS
CONWD OCT 100000
ERRAD NOP 
TAGAD NOP 
CLEAR NOP 
DFIEA DEF FIERR 
RTAGA DEF $TAG      ADDR OF REQ TAG FIELD 
DUMAD DEF * 
* 
*  DEFINE REQUEST 
IRBUF BSS 31
      IFZ 
      BSS 4 
      XIF 
$STRM EQU IRBUF 
$DEST EQU IRBUF+3 
$ERR  EQU IRBUF+5 
$FUNC EQU IRBUF+7 
$PCB  EQU IRBUF+8 
$DLEN EQU IRBUF+10
$TAG  EQU IRBUF+11
      IFN 
      UNL 
      XIF 
      IFZ 
      SKP 
* 
* GENERATE POPEN REQUEST FOR REMOTE DS/3000 COMPUTER. 
* 
QOPEN LDA ITAG
      STA TAGAD 
* 
      LDA ITAG
      SZA,RSS 
      JMP ERR2      ILLEGAL NUMBER OF PARAMETERS. 
* 
* BEGIN THE REQUEST BUFFER WITH SETUP OF 8-WORD FIXED 
* FORMAT FOR PTOPC, THEN "RFA " IN NEXT 2 WORDS.
* 
      LDA IPRAM     POINT TO ADDR OF FIRST PARAM. 
      JSB D$INI     INITIALIZE BUFFER STUFFERS. 
* 
      LDB B21       POPEN STREAM = 21 OCTAL.
      JSB D$PTP     SET UP 8 WORD FIXED FORMAT AREA.
      LDB D$RQB 
      LDA B7        CHANGE POPEN MSG CLASS TO 7.
      STA B,I 
* 
      LDA "RF"
      JSB D$STW     STORE "RFA ". 
      LDA "A" 
      JSB D$STW 
* 
      LDA B25 
      JSB D$STW     FUNCTION CODE = 25 OCTAL. 
* 
      LDA INAM      MOVE PROGRAM NAME (UP TO 28 BYTES). 
      LDB N14       (DELIMITER = BLANK) 
      JSB D$ASC 
* 
      INA           (A) = TOTAL BYTES IN REQUEST. 
      ARS           NEED TO INSERT TRAILING BLANKS
      ADA N17        IN PROGRAM NAME FIELD? 
      STA TEMP
      SSA,RSS 
      JMP MVENT     NO. 
* 
LOOP2 LDA BLNKS     YES. ADD TRAILING BLANKS
      JSB D$STW          TO FILL OUT 14-WORD FIELD. 
      ISZ TEMP
      JMP LOOP2 
* 
MVENT LDA ENAM      MOVE ENTRY NAME (UP TO 8 BYTES).
      LDB N4        DELIMITER = BLANK.
      JSB D$ASC 
* 
      INA           (A) = TOTAL BYTES IN REQUEST. 
      ARS 
      ADA N21       NEED TO INSERT TRAILING BLANKS
      STA TEMP      IN ENTRY NAME FIELD?
      SSA,RSS 
      JMP MVTAG     NO. 
* 
LOOP3 LDA BLNKS     YES. ADD TRAILING BLANKS TO FILL
      JSB D$STW      OUT 4-WORD FIELD.
      ISZ TEMP
      JMP LOOP3 
* 
MVTAG LDA N20       MOVE TAG FIELD. 
      JSB D$NWD 
* 
      CLA           MOVE 2 PARAMETERS.
      LDA ENAM+1,I
      JSB D$STW 
      CLA 
      LDA ENAM+2,I
      JSB D$STW 
      CLA           ZERO 3 WORDS. 
      JSB D$STW 
      CLA 
      JSB D$STW 
      CLA 
      JSB D$STW 
      LDA MAXSZ     STORE MAX BLOCK SIZE (+WORDS).
      LDB BUFSZ     GET USER'S VALUE IF 
      SZB             IT WAS SPECIFIED. 
      LDA BUFSZ,I 
      SZA 
      SSA 
      LDA MAXSZ 
      JSB D$STW 
* 
* SET UP PARAMETER MASK AS FOLLOWS: 
*       BIT 9 = PROGRAM NAME
*       BIT 8 = ENTRY NAME
*       BIT 7 = 0 
*       BIT 6 = CONTROL INFO
*       BIT 5 = LOADING OPTIONS 
*       BIT 4 = 0 
*       BIT 3 = 0 
*       BIT 2 = 0 
*       BIT 1 = 0 
*       BIT 0 = 0 
* 
      LDA DPARM     FWA PARAM ADDR LIST.
      STA TEMP
      LDA N5        COUNTER.
      STA CONTR 
      CLA           INITIALIZE PARAMETER MASK.
* 
LOOP4 LDB TEMP,I    GET ADDR OF NEXT PARAM. 
      LDB B,I 
      SZB 
      IOR B1        SET BIT IF PARAM SPECIFIED. 
      RAL           MOVE IT OVER. 
      ISZ TEMP
      ISZ CONTR 
      JMP LOOP4     LOOP TILL DONE. 
      ALF           BITS 0-4 = 0. 
      JSB D$STW 
* 
* REQUEST BUFFER READY. D3KMS WILL WRITE IT TO QUEX'S I/O 
* CLASS. USER WILL BE SUSPENDED UNTIL D3KMS'S CLASS GET 
* IS COMPLETED WHEN THE REPLY ARRIVES.
* 
      JSB D$WDC     STORE WORD COUNT. 
      CLA           POPEN HAS A SINGLE REPLY. 
      LDB BIT15     SET NO-ABORT BIT IN FLAG WORD.
* 
      JSB REMIO     SEND REQUEST AND WAIT FOR REPLY.
* 
      JSB PASSP     RETURN ERROR CODE AND TAG FIELD.
* 
      LDA D$RQB     RETURN PCB FROM REPLY.
      ADA K10        (CURRENTLY NOT USED - ALL ZEROES)
      STA TAGPR 
      LDA N3
      LDB IPCB
      JSB MOVE
* 
      LDA ERRAD,I 
      JMP RTRN,I    RETURN TO CALLER. 
* 
* 
DPARM DEF *+1       TABLE OF POPEN PARAMETER
      DEF INAM       ADDRESSES FOR BIT MASK.
      DEF ENAM
      DEF B0
      DEF ENAM+1
      DEF ENAM+2
* 
      SKP 
* 
* SUBROUTINE TO SEND AND/OR RECEIVE BUFFERS TO/FROM THE HP3000. 
* 
REMIO NOP 
      IOR 1 
      STA CNWRD 
* 
      JSB D3KMS 
      DEF *+2 
      DEF CNWRD 
      JMP ERR       ERROR RETURN. 
* 
      LDA D$RQB     SAVE "FROM PROCESS #" AS
      ADA K4        "TO PROCESS #" FOR NEXT REQUEST.
      LDA A,I 
      ALF,ALF 
      AND B377
      STA D$SMP 
* 
      ISZ BLKCT     BUMP PREAD/PWRIT BLOCK COUNTER. 
      JMP REMIO,I   EXIT. 
* 
* SUBROUTINE TO BUILD 8-WORD FIXED FORMAT AREA OF REQUEST.
* 
*  (A) = 1ST BYTE RIGHT JUSTIFED
*  (B) = STREAM TYPE. 
* 
D$PTP NOP 
      STB TEMP      SAVE STREAM TYPE. 
      LDA K4        STORE MESSAGE CLASS = 4.
      JSB D$STW     STORE 1ST WORD IN REQUEST BUFFER. 
      CLA           CLEAR COMPUTER ID.
      JSB D$STW 
      LDA TEMP      STORE STREAM TYPE.
      JSB D$STW 
      LDA N4        CLEAR NEXT 4 WORDS. 
      JSB D$ZRO 
      LDA N2        FORCE BYTE COUNTER TO CLEAR.
      JSB D$STW 
      JMP D$PTP,I 
* 
* SUBROUTINE TO PASS RETURNED ERROR CODE AND TAG
* FIELD TO THE USER PROGRAM.
* 
PASSP NOP 
      LDB D$RQB     RETURN ERROR CODE.
      ADB K8
      LDB B,I 
      CLA           MAP DS/3000 TO DS/1 ERROR CODES.
      CPB CG211 
      INA           CCG & 211 = 1 (REJECT). 
      CPB CL209 
      LDA N41       CCL & 209 = -41.
      CPB CL205 
      LDA N42       CCL & 205 = -42.
      CPB CG210 
      LDA N44       CCG & 210 = -44.
      CPB CL213 
      LDA N44       CCL & 213 = -44.
      STA ERRAD,I 
* 
      LDB D$RQB 
      ADB K13       RETURN TAG FIELD. 
      STB TAGPR 
      LDA N20       20 WORDS. 
      LDB TAGAD 
      JSB MOVE
      JMP PASSP,I 
      SKP 
* 
* GENERATE PREAD REQUEST FOR REMOTE DS/3000 COMPUTER. 
* 
QREAD CLA           CLEAR BLOCK COUNTER.
      STA BLKCT 
      LDA RITAG 
      STA TAGAD 
      SZA,RSS 
      JMP ERR2      ILLEGAL # PARAMETERS. 
* 
      LDA RPRAM     POINT TO ADDR OF 1ST PARAM (TAG). 
      JSB D$INI     INITIALIZE BUFFER STUFFERS. 
* 
      LDB B22       SET UP 8-WORD FIXED FORMAT AREA.
      JSB D$PTP 
* 
      CLA 
      JSB D$STW 
* 
      LDA RIL,I     GET USER BUFFER LENGTH. 
      SSA,RSS 
      JMP *+4 
      CMA,INA 
      INA 
      CLE,ERA 
      JSB D$STW     STORE IN REQUEST BUFFER.
* 
      LDA RIPCB     MOVE PCB TO REQUEST.
      JSB MVPC       (EMPTY AT PRESENT) 
      LDA N20       MOVE TAG FIELD. 
      JSB D$NWD 
* 
      JSB D$WDC      SET WORD COUNT.
* 
* SEND REQUEST TO THE 3000 AND WAIT FOR REPLIES.
* 
      LDA RIBUF     SET ADDR OF USER DATA BUFFER. 
      STA TBUF
      CLA 
      STA TCNT       CLEAR RECEIVED BYTE COUNTER. 
      INA           SIGNAL FOR MULTIPLE REPLIES.
* 
SN/RC LDB BIT15     SET NO-ABORT BIT IN FLAG WORD.
* 
      JSB REMIO     SEND REQUEST AND GET REPLIES. 
* 
      LDA CNWRD     WAS LAST CALL TO RELEASE CLASS ONLY?
      AND B377
      CPA K4
      JMP DONE      YES.
* 
      LDA BLKCT     IF FIRST REPLY, PASS ERROR
      CPA B1         CODE AND TAG TO USER.
      JSB PASSP 
* 
      LDA D$RQB     CHECK IF ANY DATA WAS RECEIVED. 
      ADA B7
      LDA A,I       (A) = + BYTES.
      ADA N10       ADJUST FOR IERR & PCB.
      LDB BLKCT 
      CPB B1        IF FIRST REPLY, ADJUST FOR TAG. 
      ADA N40 
      SZA,RSS 
      JMP DEALC     NO DATA (COULD BE REJECT).
* 
      JSB RDMOV     MOVE DATA TO USER BUFFER. 
* 
      LDA D$RQB     IS CONTINUATION BIT SET?
      ADA K2
      LDA A,I 
      RAL,RAL 
      SSA 
      JMP DMREP      YES. 
DEALC LDA K4         NO. DE-ALLOCATE CLASS. 
      JMP SN/RC 
* 
DMREP LDB D$RQB     NO. SET UP "REPLY". 
      LDA B,I       STORE COUNT AND MSG CLASS.
      AND B377
      IOR LB10
      STA B,I 
      ADB K2
      LDA B,I       CLEAR REPLY BIT.
      ELA,CLE,ERA 
      STA B,I 
      ADB K2
      LDA B,I       REVERSE PROCESS NUMBERS.
      ALF,ALF 
      STA B,I 
      ADB K3
      CLA           CLEAR BYTE COUNT. 
      STA B,I 
* 
      LDA K2        TELL D3KMS TO LOOK FOR MORE.
      JMP SN/RC     GO GET NEXT DATA BLOCK. 
* 
DONE  LDA ERRAD,I 
      JMP RTRN,I    RETURN TO USER. 
      SPC 2 
* 
*     MOVE SUBROUTINE 
* 
MOVE  NOP 
      STA CONTR 
MOVE1 LDA TAGPR,I   PICK UP NEXT WORD 
      STA 1,I        AND PUT IT AWAY
      INB 
      ISZ TAGPR     INCREMENT POINTERS
      ISZ CONTR 
      JMP MOVE1     UNTIL DONE
      JMP MOVE,I
      SKP 
* 
* SUBROUTINE TO MOVE A BLOCK OF DATA FROM REPLY 
* BUFFER TO USER BUFFER (REMAINING BYTES UP TO MAX LEN).
* EXIT WITH TCNT = TOTAL BYTES REMAINING. 
* 
RDMOV NOP           (A) = + BYTES.
      SZA,RSS       EXIT FOR
      JMP RDMOV,I    0-LEN DATA.
      LDB A         ACCUMULATE LOG. 
      ADB TCNT
      STB TCNT
      INA 
      CLE,ERA       (A) = + WORDS.
      CMA,INA 
      STA TEMP      NEG. # WORDS TO MOVE. 
      LDB D$RQB 
      ADB K13       GET PAST 3-WORD "PCB" AREA. 
      LDA BLKCT     IF THIS IS FIRST REPLY, 
      CPA B1
      ADB K20        ADJUST FOR TAG FIELD.
      STB RQPTR     ADDR OF REPLY DATA. 
* 
LOOP  LDA RQPTR,I   MOVE WORD FROM REPLY
      STA TBUF,I     TO USER BUFFER.
      ISZ RQPTR     BUMP POINTERS.
      ISZ TBUF
* 
      ISZ TEMP
      JMP LOOP       ELSE LOOP TILL DONE. 
      JMP RDMOV,I   REACHED LIMIT OF MAX WORDS. 
      SKP 
* 
* GENERATE PWRIT REQUEST FOR REMOTE DS/3000 COMPUTER. 
* 
QWRIT CLA           CLEAR BLOCK COUNTER.
      STA BLKCT 
      LDA PITAG 
      STA TAGAD 
* 
      SZA,RSS 
      JMP ERR2      ILLEGAL # PARAMETERS. 
* 
      LDA PPRAM     POINT TO ADDR OF 1ST PARAM (TAG). 
      JSB D$INI     INITIALIZE BUFFER STUFFERS. 
* 
      LDB B23       SET UP 8-WORD FIXED FORMAT AREA.
      JSB D$PTP 
* 
      CLA 
      JSB D$STW 
* 
      LDA PIBUF     SET POINTER TO USER DATA. 
      STA TBUF
* 
      LDA PIL,I     GET USER BUFFER LENGTH. 
      SSA,RSS 
      JMP *+5 
      CMA,INA 
      SLA 
      INA 
      RSS 
      CLE,ELA       BYTES (POSITIVE). 
      STA TCNT      TOTAL DATA BYTES TO SEND. 
      CLE,ERA 
      JSB D$STW     STORE IN REQUEST BUFFER (TCOUNT). 
* 
      LDA PIPCB     MOVE PCB TO REQUEST.
      JSB MVPC       (EMPTY AT PRESENT) 
      LDA N20       MOVE TAG FIELD. 
      JSB D$NWD 
* 
      JSB D$WDC     SET WORD COUNT. 
* 
      JSB WRMOV     MOVE 1ST BLOCK TO REQUEST BUFFER. 
      LDA TCNT
      SZA,RSS       IF ALL DATA MOVED,
      JMP SEND      TELL D3KMS THERE IS A SINGLE REPLY. 
* 
      LDB D$RQB     CONTINUATION BLOCKS REQUIRED. 
      ADB K2
      LDA B,I 
      IOR BIT13     SET CONTINUATION BIT IN STREAM WORD.
      STA B,I 
      CLA,INA       TELL D3KMS THERE ARE MULT. BLOCKS.
* 
* SEND REQUESTS TO THE 3000 AND GET THE REPLY.
* 
SEND  LDB BIT15     SET NO-ABORT BIT IN FLAG WORD.
* 
      JSB REMIO     SEND REQUESTS AND/OR GET REPLY. 
* 
      LDB TCNT      IF ALL DATA OUT, WE HAVE RECEIVED 
      SZB            THE REPLY. 
      JMP MORE
      JSB PASSP      RETURN ERROR CODE & TAG TO USER. 
      LDA ERRAD,I 
      JMP RTRN,I     RETURN TO CALLER.
* 
* MORE DATA... SHIP OUT THE NEXT BLOCK. 
* 
MORE  LDB D$RQB     CLEAR REPLY BIT.
      ADB K2
      LDA B,I 
      ELA,CLE,ERA 
      STA B,I 
* 
      JSB WRMOV     MOVE NEXT CHUNK OF DATA.
      LDA K2
      LDB TCNT
      SZB           IF MORE DATA, KEEP CONT. BIT. 
      JMP SEND      CALL D3KMS WITH RCODE = 2.
* 
      LDB D$RQB     THIS IS LAST BLOCK. 
      ADB K2
      LDA B,I 
      AND NOT13     CLEAR CONTINUATION BIT. 
      STA B,I 
      LDA K3        TELL K3KMS THIS IS LAST BLOCK.
      JMP SEND
      SKP 
* SUBROUTINE TO STORE # BYTES LEFT TO SEND IN REQ 
* BUFFER AND MOVE NEXT BLOCK OF USER DATA (REMAINING
* BYTES UP TO MAX). STORE ADJUSTED BYTE COUNTER (N) 
* IN REQUEST. ON EXIT, TCNT IS REMAINING # DATA 
* BYTES OR ZERO.
* 
WRMOV NOP 
      LDB D$RQB 
      ADB B7
      LDA B,I       INITIALIZE BYTE COUNTER (N).
      STA BYTCT 
      LDA TCNT      # REMAINING DATA BYTES. 
      SZA,RSS       EXIT FOR
      JMP WRMOV,I    0-LEN DATA.
      LDB D$RQB 
* 
      ADB K13       SET ADDR OF DATA IN RQBUF.
      LDA BLKCT 
      SZA,RSS       ADJUST FOR TAG FIELD
      ADB K20        IN FIRST REQUEST.
      STB RQPTR 
      LDA RLSIZ 
      STA TEMP      SET MAX # DATA WORDS (NEG). 
* 
LOOP1 LDA TBUF,I    MOVE DATA FROM USER TO REQUEST. 
      STA RQPTR,I 
      ISZ TBUF
      ISZ RQPTR 
      ISZ BYTCT     ADD 2 TO BYTE COUNTER (N).
      ISZ BYTCT 
      LDA TCNT      DECREMENT TOTAL DATA BYTES LEFT.
      ADA N2
      STA TCNT
      CMA,INA       NEGATE. 
      SSA,RSS       IF 0 OR 1,
      JMP ADJ1       ALL USER DATA MOVED, 
      ISZ TEMP
      JMP LOOP1      ELSE LOOP TILL DONE. 
      JMP STBYT     REACHED LIMIT OF MAX WORDS. 
* 
ADJ1  CMA,INA       ADJUST BYTE COUNTER (N) 
      ADA BYTCT 
      STA BYTCT 
* 
STBYT LDA D$RQB     STORE BYTE COUNT (N). 
      ADA B7
      LDB BYTCT 
      STB A,I 
      LDA TCNT      IF TCNT = -1, MAKE IT 0.
      CPA N1
      CLA 
      STA TCNT
      JMP WRMOV,I   RETURN. 
      SKP 
* 
* GENERATE PCONT REQUEST FOR REMOTE DS/3000 COMPUTER. 
* 
QCONT LDA CITAG 
      STA TAGAD 
* 
      SZA,RSS 
      JMP ERR2      ILLEGAL # PARAMETERS. 
* 
      LDA CPRAM     ADDR OF 1ST PARAM (TAG).
      JSB D$INI     INITIALIZE BUFFER STUFFERS. 
* 
      LDB B24       SET UP 8-WORD FIXED FORMAT AREA.
      JSB D$PTP 
      LDA N2        CLEAR NEXT 2 WORDS. 
      JSB D$ZRO 
* 
      LDA CIPCB     MOVE PCB TO REQUEST.
      JSB MVPC       (EMPTY AT PRESENT) 
      LDA N20       MOVE TAG FIELD. 
      JSB D$NWD 
* 
      JSB D$WDC     SET WORD COUNT. 
* 
* SEND REQUEST TO THE 3000 AND WAIT FOR THE REPLY.
* 
      CLA           SINGLE BLOCK. 
      LDB BIT15     SET NO-ABORT BIT IN FLAG WORD.
* 
      JSB REMIO     SEND REQUEST AND GET REPLY. 
* 
      JSB PASSP     RETURN ERROR CODE & TAG FIELD.
* 
      LDA ERRAD,I 
      JMP RTRN,I    RETURN. 
      SKP 
* 
* GENERATE PCLOS REQUEST FOR REMOTE DS/3000 COMPUTER. 
* 
QCLOS LDB D$RQB     MOVE REQUEST TO D3KMS BUFFER. 
      LDA BRKBF 
      MVW K8        MOVE 8 WORDS
* 
      JSB D3KMS     SEND BREAK REQ TO 3000, 
      DEF *+2        AND GET THE REPLY. 
      DEF BIT15 
      NOP 
* 
      LDA FIERR     ADDR OF 1ST PARAM (DUMMY).
      JSB D$INI     INITIALIZE BUFFER STUFFERS. 
* 
      LDB B21       SET UP 8-WORD FIXED FORMAT AREA.
      JSB D$PTP 
* 
      LDB D$RQB     CHANGE PCLOS MSG CLASS TO 7.
      LDA B7
      STA B,I 
* 
      LDA "RF"      STORE "RFA ". 
      JSB D$STW 
      LDA "A" 
      JSB D$STW 
      LDA B26       STORE FCN CODE = 26 OCTAL.
      JSB D$STW 
* 
      LDA FIPCB     MOVE PCB TO REQUEST.
      JSB MVPC       (EMPTY AT PRESENT) 
* 
      JSB D$WDC     SET WORD COUNT. 
* 
* SEND REQUEST TO THE 3000 AND WAIT FOR THE REPLY.
* 
      CLA           SINGLE BLOCK. 
      LDB BIT15     SET NO-ABORT BIT IN FLAG WORD.
* 
      JSB REMIO     SEND REQUEST AND GET REPLY. 
* 
      JSB PASSP     RETURN ERROR CODE & TAG FIELD.
* 
      LDA ERRAD,I 
      JMP RTRN,I    RETURN. 
      SKP 
* 
* MOVE PCB FROM USER ARRAY TO REQUEST BUFFER. 
* 
MVPC  NOP 
      STA TAGPR     POINTER TO PCB. 
      LDA N3
      STA CONTR 
MVP1  LDA TAGPR,I 
      JSB D$STW 
      ISZ TAGPR 
      ISZ CONTR 
      JMP MVP1
      JMP MVPC,I
* 
* TEST WHETHER REQUEST FOR 3000 OR REMOTE RTE.
* 
DS3K  NOP           (A) = ADDR OF USER PCB. 
      ADA K3        BUMP TO LU WORD.
      STA TEMP
      LDA #LU3K     GET LU OF 3000. 
      INA 
      LDB A,I 
      CPB TEMP,I    SAME AS LU IN USER PCB? 
      RSS           YES. EXIT VIA P+1.
      ISZ DS3K      NO.  EXIT VIA P+2.
      JMP DS3K,I
      SKP 
                                                                                                                                                                                                                                                  