ASMB,Q,C,Z
*USE 'ASMB,N' FOR DS/1000 ONLY, AND 'ASMB,Z' FOR DS/1000 & DS/3000
      IFN 
      NAM POPEN,7 91750-1X148 REV.2013 800710 ALL RTE-RTE 
      XIF 
      IFZ 
      NAM POPEN,7 91750-1X148 REV.2013 800710 MEF RTE-RTE-MPE 
      XIF 
      UNL 
      IFN 
      HED POPEN (DS/1000) 91750-1X148 * (C) HEWLETT-PACKARD CO 1980 
      XIF 
      IFZ 
      HED POPEN (DS/1000 & DS/3000) 91750-1X148 * (C) HEWLETT-PACKARD CO 1980 
      XIF 
      LST 
* 
*     IFN OPTION
*     NAME:   POPEN 
*     SOURCE: 91750-18148 
*     RELOC:  91750-1X148 
*     PRGMR:  CHUCK WHELAN
*     MODIF'D: GAB [790206] TO REPLACE EXTENDED INSTR'S W/ JSB'S
*     MODIF'D: JDH [790220] FOR DS REQUEST EQUATED OFFSETS
*     MODIF'D: DWT [790531] FOR PHASE FOUR (RELOCATION OF RQB)
*     MODIF'D: JDH [791010] FOR REMOTE SESSION POPEN "ICLON" PARAM
*     MODIF'D: DMT [800709] TO CHECK FOR SLAVE NAME = 0 
* 
*     IFZ OPTION
*     NAME:   POPEN 
*     SOURCE: 91750-18148 
*     RELOC:  91750-1X148 
*     PRGMR:  CHUCK WHELAN & JIM HARTSELL 
*     MODIFIED BY DMT [790327] FOR DS/1000 ENHANCEMENTS (NEW D3KMS) 
* 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 1 
      ENT POPEN,PREAD,PWRIT,PCONT,PCLOS,PNRPY 
      EXT #MAST,#MSTC,#TTOV,#NODE 
      EXT .MVW
      EXT .ENTR 
      EXT #RQB
RQB   EQU #RQB
      IFZ 
      EXT #LU3K 
      EXT D3KMS,D$INI,D$STW,D$ASC,D$3BF,D$TAG 
      EXT D$RQB,D$NWD,D$ZRO 
      XIF 
A     EQU 0 
B     EQU 1 
      SUP 
* 
      SPC 1 
*   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 "#MAST" 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 
* GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV XXXX 790531      *
*                                                                *
*     GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY:      *
*                                                                *
*         REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST        *
*         GET,   #SLAV, RQCNV, RPCNV, GRPM,  LSTEN, PTOPM        *
*         EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3        *
*                                                                *
******************************************************************
* 
***!!!!! THE FIRST 7 WORDS (#STR THRU #ENO) MUST BE FIXED !!!!!***
#STR  EQU 0         STREAM WORD.
#SEQ  EQU #STR+1    SEQUENCE NUMBER.
#SRC  EQU #SEQ+1    SOURCE NODE #.
#DST  EQU #SRC+1    DEST. NODE #. 
#EC1  EQU #DST+1    REPLY ECOD1.
#EC2  EQU #EC1+1    REPLY ECOD2.
#ENO  EQU #EC2+1    NUMBER OF NODE REPORTING ERROR. 
* 
#ECQ  EQU #ENO+1    ERROR CODE QUALIFIER (BITS 4 TO 7)
#LVL  EQU #ECQ      MESSAGE FORMAT LEVEL (BITS 0 TO 3)
#MAS  EQU #LVL+1    MA "SEND" SEQ. #
#MAR  EQU #MAS+1    MA "RECV" SEQ. #
#MAC  EQU #MAR+1    MA "CANCEL" FLAGS 
#HCT  EQU #MAC+1    HOP COUNT 
#SID  EQU #HCT+1    SESSION ID WORD 
* 
#EHD  EQU #SID      LAST ITEM OF HEADER 
#MHD  EQU #EHD+1    MINIMUM HEADER SIZE 
#REQ  EQU #MHD      START OF REQUEST SPECIFIC AREA
#REP  EQU #MHD      START OF REPLY SPECIFIC AREA
* 
#MXR  EQU #MHD+24   <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>>
#LSZ  EQU 2         <<< SIZE OF LOCAL APPENDAGE AREA >>>
* 
******************************************************************
* 
* GLBLK-END 
      SKP 
* PPBLK-START 
* 
******************************************************************
*                                                                *
*      P T O P   B L O C K                 REV XXXX 790420       *
*                                                                *
*      OFFSETS INTO DS/1000 PTOP MESSAGE BUFFERS, USED BY:       *
*                                                                *
*   POPEN, PTOPM, GET/ACEPT/REJCT, RQCNV, RPCNV, LSTEN, REMAT    *
*                                                                *
******************************************************************
* 
* OFFSETS INTO PTOP REQUEST AND REPLY BUFFERS.
* 
#FCD  EQU #REP      FUNCTION CODE.
#PCB  EQU #FCD+1    PCB AREA (3 WORDS). 
#TAG  EQU #PCB+3    TAG AREA (20 WORDS).
* 
* MAXIMUM SIZE OF PTOP REQUEST/REPLY BUFFER.
* 
#PLW  EQU #MXR      M A X I M U M   S I Z E    ! ! !
* 
* PPBLK-END 
      SKP 
IPCB  NOP 
IERR  NOP 
INAM  NOP 
INODE NOP 
ITAG  NOP 
ICLON NOP 
ENAM  EQU ICLON     DS/3000: ENTRY NAME 
      IFZ 
      NOP           DS/3000: CONTROL INFORMATION. 
      NOP                    LOADING OPTIONS. 
BUFSZ NOP                    MAX DATA RECORD LENGTH 
      XIF 
      SPC 3 
POPEN NOP 
* 
* MASTER REQUESTS FOR POPEN COME HERE 
* 
*     CALL POPEN(IPCB,IERR,INAM,INODE,ITAG [,ICLON])
* 
      JSB .ENTR     PICK UP THE USER PARAMETERS 
      DEF IPCB
* 
*   MAKE SURE POPEN NAME ISN'T NUMERIC 0. 
* 
      LDA POPEN     SET ERROR RETURN. 
      STA RTRN
      LDA IERR
      STA ERRAD 
      LDA N41       PRE-SET ERROR TO -41. 
      LDB INAM      GET NAME PARAMETER. 
      SZB,RSS       IF NOT PROVIDED,
      JMP ERR2       REPORT -40.
      LDB B,I       GET VALUE.
      SZB,RSS       IF ZERO,
      JMP SETER      REPORT -41.
* 
      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 RQB+#DST  SAVE IT 
* 
      CLA,INA       INITIALIZE POPEN FUNCTION CODE = 1. 
      STA POFCN 
* 
      LDA ICLON     CLONING/ENAM PARAMETER SPECIFIED? 
      SZA,RSS 
      JMP BUILD     NO. 
      LDB ICLON,I   YES. DO THEY WANT CLONING?
      LDA POFCN       (ENAM IS AN ASCII PARAMETER)
      CPB K1
      IOR BIT13     YES. SET BIT 13 OF FUNCTION WORD. 
      STA POFCN 
* 
BUILD LDB POPEN     SET UP ERROR RETURN 
      LDA IERR
      JSB BLDRQ     SET UP BASIC REQST
IPRAM DEF ITAG
POFCN NOP           FCN = 1 
      IFZ 
      JMP QOPEN     DO POPEN TO 3000
      XIF 
* 
      LDA BIT15     MAKE SURE POPEN ALWAYS
      STA CONWD      BYPASS NO-REPLY OPTION 
      LDA INAM      ADDR OF NAME FIELD
      LDB RPCBA     ADDR OF PCB IN REQ BUFFER 
      JSB .MVW      MOVE NAME INTO PCB FIELD
      DEF K3
      NOP 
* 
      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 RQB+#STR  SET P TO P STREAM IN REQ
* 
      LDA CONWD     GET CONTROL WORD
      SLA,RSS       IS NO-REPLY OPTION SET? 
      JMP CMAST     .NO, JUST CALL #MAST
      LDB BIT15 
      STB #MSTC     .YES, SET NO-WAIT OPTION IN #MAST 
      LDB TTOV
      STB #TTOV     ALSO, SET TRANSACTION T/O VALUE IN #MAST
* 
* THE CALL TO #MAST WILL: 
*  1) GET AN I/O CLASS
*  2) INSERT SEQ # & ORIGIN NODE
*  3) BUILD MASTER TCB
*  4) SEND REQUEST (& DATA) 
*  5) CALL "#GET" TO AWAIT AND GET REPLY
*  6) RETURN REPLY (& DATA) 
*  7) RETURN CONTROL
CMAST EQU * 
      JSB #MAST     ISSUE REQUEST CALL
      DEF *+7 
      DEF CONWD 
      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 RQB+#FCD  FUNCTION CODE 
      CPA K5        IS THIS A PCLOS?
      JMP NOMOV     YES, WE'RE DONE 
* 
RPCBA EQU *+1 
      DLD RQB+#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
      JSB .MVW      MOVE 20 WORDS TO USER TAG FIELD 
      DEF K20 
      NOP 
* 
NOMOV LDA RQB+#EC2
      SZA           WAS ERROR DETECTED? 
      JMP EXIT      YES, IERR SET 
      LDB RQB+#FCD
      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 
      STB #MSTC     CLEAR NO-WAIT FLAG
      STB #TTOV     CLEAR XACT T/O VALUE
      LDA BIT15 
      LDB MODE      GET MODE WORD 
      SSB           IS NO-REPLY SET FOR ONE TIME ONLY?
      IOR K1        .NO, CONWD WILL BE SET FOR NO-REPLY 
      STA CONWD     SET CONWD 
      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 
      JSB .MVW      MOVE 1ST TWO WORDS TO REQUEST 
      DEF K2
      NOP 
      INA           POINT TO 4TH PCB WORD 
      LDB 0,I       GET DESTINATION NODE
      STB RQB+#DST  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, 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 RQB+#FCD  SET FUNCTION CODE 
      IFZ 
      LDB #LU3K     GET DS/3000 LU
      CMB,INB,SZB,RSS NEGATE
      JMP *+3       NO 3000 
      CPB RQB+#DST  IS IT NEGATIVE LU OF 3000?
      JMP RQEX      YES, PERFORM DS/3000 P-TO-P 
      XIF 
      LDB C#PLW     REQUEST LENGTH
      STB IRBFL 
* 
      STA TAGAD 
      LDB RTAGA     ADDR OF TAG FIELD IN REQUEST
      JSB .MVW      MOVE TAG FIELD INTO REQ 
      DEF K20 
      NOP 
      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 
* 
*  INTERNAL ERROR OCCURRED. SET UP DS/1000 REQUEST BUFFER IN CASE USER
*  WANTS TO CALL DSERR. (NUMERIC ERROR CODE IS IN A-REGISTER.)
* 
SETER STA RQB+#EC2  STORE ERROR.
      CLB 
      STB RQB+#EC1
      STB RQB+#ECQ
      LDB #NODE     SET ERROR NODE
      STB RQB+#ENO   TO LOCAL.
      JMP EXIT      RETURN WITH IERR. 
      SKP 
* 
*  SET NO-REPLY OPTION:  CALL PNRPY[(IMODE[,ITTOV])]
* 
*    IMODE = 0 OR DEFAULT => ONE TIME ONLY
*    IMODE < 0 => ALL FOLLOWING PTOP CALLS
*    IMODE > 0 => TURN OFF NO-REPLY OPTION
*    ITTOV => TRANSACTION TIME-OUT OVERRIDE 
* 
IMODE NOP 
ITTOV NOP 
PNRPY NOP 
      JSB .ENTR 
       DEF IMODE
      LDB IMODE     IMODE PASSED? 
      SZB 
      LDB IMODE,I   .YES, PICK UP MODE PARAMETER
      STB MODE      STORE IT IN MODE
      LDA BIT15     GET BIT 15 FOR CONWD
      SZB,RSS       MODE = 0? 
      IOR K1        .YES, OR IN NO-REPLY BIT
      SSB           MODE < 0? 
      IOR K1        .YES
      STA CONWD 
      LDA ITTOV     ITTOV PASSED? 
      SZA           .NO 
      LDA ITTOV,I   .YES, PICK UP TTOV PARAMETER
      CMA,INA 
      AND =B377     IGNORE ALL BUT THE RIGHT BYTE 
      STA TTOV      STORE IT AWAY 
      CLA 
      STA IMODE     CLEAR IMODE FOR NEXT CALL 
      STA ITTOV 
      JMP PNRPY,I   RETURN
* 
MODE  NOP 
TTOV  NOP 
      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
RPRAM DEF RITAG 
K2    DEC 2 
      IFZ 
      JMP QREAD     PERFORM PREAD TO 3000 
      XIF 
* 
      LDA BIT15 
      STA CONWD     MAKE SURE PREAD WILL ALWAYS WAIT
      LDA RIBUF     SAVE BUFFER ADDRESS 
      STA DBUF
      LDB RIL,I     SAVE DATA LENGTH
      STB RQB+#PCB+2
* 
      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 
PPRAM 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 RQB+#PCB+2
      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 
CPRAM 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 RQB+#DST  WAS NEGATIVE LU OF 3000 SPECIFIED?
      JMP QCLOS     YES, DO PCLOS TO 3000 
      XIF 
* 
      LDA L#PCB 
      STA IRBFL     11 WORD REQUEST 
      LDA K5
      STA RQB+#FCD  FUNCTION CODE = 5 
* 
      LDA FIPCB     PCB ADDRESS 
      JMP NODAT     DO COMMUNICATION & RETURN 
      SKP 
* 
*  DATA AREA
* 
IRBFL NOP 
WRLEN NOP 
RDLEN NOP 
K1    OCT 1 
K5    DEC 5 
K11   DEC 11
K20   DEC 20
N2    DEC -2
N9    DEC -9
N40   DEC -40 
N41   DEC -41 
N58   DEC -58 
NEG00 OCT 147720
BIT13 OCT 20000 
BIT15 OCT 100000
"DS"  ASC 1,DS
CONWD OCT 100000
ERRAD NOP 
TAGAD NOP 
CLEAR NOP 
DFIEA DEF FIERR 
RTAGA DEF RQB+#TAG  ADDR OF REQ TAG FIELD 
DUMAD DEF * 
* 
*  DEFINE REQUEST 
L#PCB ABS #PCB+3
C#PLW ABS #PLW
      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. 
* 
      LDA IPRAM     POINT TO ADDR OF FIRST PARAM. 
      JSB D$INI     INITIALIZE BUFFER STUFFERS. 
* 
      JSB SETOC     SET STREAM, CLASS, AND "RFA ".
* 
      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 
      LDA N3        ZERO 3 WORDS. 
      JSB D$ZRO 
      CLA 
      LDA BUFSZ,I   GET USER'S MAX BLOCK SIZE.
      SZA           IF NOT SUPPLIED, ZERO, OR 
      SSA            NEGATIVE, USE MAXSZ. 
      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 (PARAMS) 
*       BIT 5 = LOADING OPTIONS (FLAGS) 
*       BIT 4 = 0 (STACKSIZE) 
*       BIT 3 = 0 (DLSIZE)
*       BIT 2 = 0 (MAXDATA) 
*       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 D3KMS     SEND REQUEST AND WAIT FOR REPLY.
      DEF *+2 
      DEF BIT15 
      JMP E3K       ERROR RETURN. 
* 
      JSB PASSP     RETURN ERROR CODE AND TAG FIELD.
* 
      LDA D$RQB     RETURN PCB FROM REPLY.
      ADA K10        (CURRENTLY NOT USED - ALL ZEROES)
      LDB IPCB
      JSB .MVW
      DEF K3
      NOP 
* 
      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
      SPC 1 
* 
* SUBROUTINE TO PASS RETURNED ERROR CODE AND TAG
* FIELD TO THE USER PROGRAM.
* 
PASSP NOP 
      JSB CLER      CLEAR DS/1000 ERROR INDICATOR.
      LDB D$3BF+8   RETURN ERROR CODE.
      CLA           MAP DS/3000 TO DS/1000 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 
      STA RQB+#EC2  SET DS/1000 ERROR.
* 
      LDA D$RQB 
      ADA K13       RETURN TAG FIELD. 
      LDB TAGAD 
      JSB .MVW
      DEF K20 
      NOP 
      JMP PASSP,I 
      SPC 1 
*   CLEAR DS/1000 ERROR CODES.
CLER  NOP 
      CLA 
      STA RQB+#EC1
      STA RQB+#EC2
      STA RQB+#ENO
      STA RQB+#ECQ
      JMP CLER,I
      SKP 
* 
* GENERATE PREAD REQUEST FOR REMOTE DS/3000 COMPUTER. 
* 
QREAD 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. 
* 
      LDA K4        SET CLASS TO 4
      STA D$3BF 
      LDA B22        AND STREAM TO 22.
      STA D$3BF+2 
* 
      CLA 
      JSB D$STW 
* 
      LDA RIL,I     GET USER BUFFER LENGTH. 
      SSA,RSS       IF NEGATIVE,
      JMP *+4 
      CMA,INA         MAKE POSITIVE AND 
      INA              CONVERT FROM BYTES 
      CLE,ERA           TO WORDS. 
      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 
* 
* SEND REQUEST TO THE 3000 AND WAIT FOR REPLIES.
* 
      JSB D3KMS     SEND REQUEST AND GET REPLY. 
      DEF *+6 
      DEF BIT15 
      DEF 0 
      DEF 0 
      DEF RIBUF,I 
      DEF RIL,I 
      JMP E3K       ERROR RETURN. 
* 
      JSB PASSP     SET ERROR CODE. 
* 
      LDA D$TAG     MOVE TAG FIELD. 
      LDB TAGAD 
      JSB .MVW
      DEF K20 
      NOP 
* 
      LDA ERRAD,I 
      JMP RTRN,I    RETURN TO USER. 
      SPC 2 
      SKP 
* 
* GENERATE PWRIT REQUEST FOR REMOTE DS/3000 COMPUTER. 
* 
QWRIT 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. 
* 
      LDA K4        SET CLASS TO 4
      STA D$3BF 
      LDA B23        AND CLASS TO 23. 
      STA D$3BF+2 
* 
      CLA 
      JSB D$STW 
* 
      LDA PIL,I     GET USER BUFFER LENGTH. 
      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 
* 
* SEND REQUESTS TO THE 3000 AND GET THE REPLY.
* 
      JSB D3KMS 
      DEF *+4 
      DEF BIT15 
      DEF PIBUF,I 
      DEF PIL,I 
      JMP E3K       ERROR RETURN. 
* 
      JSB PASSP      RETURN ERROR CODE & TAG TO USER. 
      LDA ERRAD,I 
      JMP RTRN,I     RETURN TO CALLER.
      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. 
* 
      LDA K4        SET CLASS TO 4
      STA D$3BF 
      LDA B24        AND STREAM TO 24.
      STA D$3BF+2 
* 
      LDA N2        CLEAR FIRST 2 APPENDAGE WORDS.
      JSB D$ZRO 
* 
      LDA CIPCB     MOVE PCB TO REQUEST.
      JSB MVPC       (EMPTY AT PRESENT) 
      LDA N20       MOVE TAG FIELD. 
      JSB D$NWD 
* 
* SEND REQUEST TO THE 3000 AND WAIT FOR THE REPLY.
* 
      JSB D3KMS 
      DEF *+2 
      DEF BIT15 
      JMP E3K       ERROR RETURN. 
* 
      JSB PASSP     RETURN ERROR CODE & TAG FIELD.
* 
      LDA ERRAD,I 
      JMP RTRN,I    RETURN. 
      SKP 
* 
* GENERATE PCLOS REQUEST FOR REMOTE DS/3000 COMPUTER. 
* 
QCLOS LDA B6        SET CLASS TO 6
      STA D$3BF 
      LDA B22        AND STREAM TO 22 
      STA D$3BF+2 
      CLA             AND APPENDAGE LEN TO 0. 
      STA D$3BF+7 
* 
      JSB D3KMS     SEND BREAK REQ TO 3000, 
      DEF *+2        AND GET THE REPLY. 
      DEF BIT15 
      JMP E3K       ERR RETURN
* 
      LDA FIERR     ADDR OF 1ST PARAM (DUMMY).
      JSB D$INI     INITIALIZE BUFFER STUFFERS. 
* 
      JSB SETOC     SET CLASS, STREAM, AND "RFA ".
      LDA B26       STORE FCN CODE = 26 OCTAL.
      JSB D$STW 
* 
      LDA FIPCB     MOVE PCB TO REQUEST.
      JSB MVPC       (EMPTY AT PRESENT) 
* 
* SEND REQUEST TO THE 3000 AND WAIT FOR THE REPLY.
      JSB D3KMS     SEND REQUEST AND GET REPLY. 
      DEF *+2 
      DEF BIT15 
      JMP E3K       ERROR RETURN. 
* 
      JSB CLER      CLEAR DS/1000 ERROR INDICATOR.
      CLA           RETURN ERROR CODE ZERO. 
      STA 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
      SPC 3 
* 
* SET UP FOR POPEN/PCLOSE.
* 
SETOC NOP 
      LDA B7        SET CLASS TO 7
      STA D$3BF 
      LDA B21        AND STREAM TO 21.
      STA D$3BF+2 
* 
      LDA "RF"      STORE "RFA ". 
      JSB D$STW 
      LDA "A" 
      JSB D$STW 
* 
      JMP SETOC,I   RETURN. 
      SPC 3 
*  D3KMS REPORTED AN ERROR. SET UP DS/1000 HEADER IN CASE USED CALL DSERR.
* 
E3K   DST RQB+#EC1  SAVE ASCII ERROR CODE.
      LDA #NODE     STORE NODE #
      IOR BIT15      AND "ASCII" BIT. 
      STA RQB+#ENO
      CLA           CLEAR QUALIFIER.
      STA RQB+#ECQ
      LDA RQB+#EC1  RESTORE ASCII CODE. 
      JMP ERR       CONVERT TO NUMERIC. 
      SKP 
* 
* CONSTANTS AND WORKING STORAGE.
* 
B0    OCT 0 
B1    OCT 1 
B6    OCT 6 
B7    OCT 7 
B21   OCT 21
B22   OCT 22
B23   OCT 23
B24   OCT 24
B25   OCT 25
B26   OCT 26
K10   DEC 10
K13   DEC 13
N3    DEC -3
N4    DEC -4
N5    DEC -5
N14   DEC -14 
N17   DEC -17 
N20   DEC -20 
N21   DEC -21 
N42   DEC -42 
N44   DEC -44 
CL205 OCT 040315
CL209 OCT 040321
CG210 OCT 000322
CG211 OCT 000323
CL213 OCT 040325
MAXSZ DEC 4096      MAXIMUM USER BUFFER SIZE. 
"RF"  ASC 1,RF
"A"   ASC 1,A 
BLNKS ASC 1,
TEMP  NOP 
* 
TAGPR NOP 
CONTR NOP 
      XIF 
* 
      LST 
* 
      BSS 0         SIZE OF POPEN 
* 
      END 
                                                                                  