ASMB,R,Q,C
      HED <#GETR> DS GET SUBROUTINE * (C) HEWLETT-PACKARD CO. 1980
      NAM #GETR,7 91750-1X010 REV 2013 800407 ALL 
      SPC 1 
      ENT #GETR,#SBFA,#SBFL,#SDAL 
      SPC 1 
      EXT .ENTR,EXEC
      EXT $OPSY,#CLTA 
      EXT .LDX,.MVW,.CAY
* 
*    NAME:   #GETR
*    SOURCE: 91750-18010
*    RELOC:  91750-1X010
*    PGMR:   LYLE WEIMAN APR 1979 
**
* 
******************************************************************
*  * (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.       *
******************************************************************
* 
* 
*  #GETR CALLING SEQUENCE:
* 
*     JSB #GETR 
*     DEF *+4 [OR 6 OR 7 OR 8 OR 9] 
*     DEF CLASS     CLASS FOR GET SUSPEND 
*     DEF DSHDR     DS HEADER ADDRESS 
*     DEF DSHDL     DS HEADER (MAX)+LENGTH (ZERO IS VALID). 
*     [DEF USRBF]    USER DATA BUFFER.  DEFAULT = NO USER DATA MOVED
*     [DEF USRBL]    MAX USER DATA LENGTH. "      "   "    "     "
*     [DEF STATS]    DRIVER STATUS (A-REGISTER FROM "GET") RETURNED HERE. 
*     [DEF LLU]      OPTIONAL RETURN FOR "LAST LU" WORD 
*     [DEF DELAY]    OPTIONAL RETURN FOR 'RTRY' DELAY VALUE 
*  <ERROR RETURN >    (BAD CLASS #) A & B HAVE ASCII ERROR CODE 
*  <NORMAL RETURN>  A= ACTUAL  LENGTH OF HEADER, EXCLUDING "APPENDAGE". 
*                   B=ACTUAL LENGTH OF USER DATA BLOCK. 
*                   X=3RD OPTIONAL PARAMETER FROM "GET" (REQUEST CODE)
*                   Y=RETURNED SEARCH KEY (BUFFER ADDRESS IN S.A.M.)
* 
* 
* 
* 
*  #GETR OPERATION: 
*     #GETR IS CALLED BY ROUTINES WAITING TO RECEIVE REQUESTS ( & POSSIBLY
*     DATA) ON THEIR CLASS NUMBERS.  #GETR DOES THE FOLLOWING:
*      1. PERFORMS A CLASS-I/O "GET" ON THE PASSED CLASS NUMBER.
*         THE USER DATA PORTION (1ST BUFFER) WILL BE MOVED INTO THE 
*         USER BUFFER AREA, IF ONE IS SUPPLIED, AS MUCH AS THE LENGTH 
*         SUPPLIED. 
* 
*     NOTE: #SBFA (AN ENTRY POINT) WILL CONTAIN THE VALUE RETURNED IN 
*           THE FIRST "OPTIONAL PARAMETER" WORD (IF DOUBLE-BUFFERING
*           [I.E., Z-BIT] IS USED, THEN THIS IS THE ADDRESS OF THE SAM
*           BUFFER).  THIS MAY BE USEFUL
*           FOR CALLERS WHO DO NOT USE DOUBLE-BUFFERING, AND IT IS
*           ESSENTIAL FOR #PUTR, WHICH USES THIS VALUE TO DETERMINE THE 
*           SAM BUFFER ADDRESS FOR STUFFING DATA. 
*           LIKEWISE, #SBFL WILL CONTAIN THE 2ND OPTIONAL PARAMETER 
*           (IF DOUBLE-BUFFERING IS USED (Z-BIT), THEN THIS IS THE
*           2ND BUFFER LENGTH). 
*      2. MOVES THE REQUEST INTO THE REQUEST BUFFER (UP TO THE
*         # OF WORDS SPECIFIED IN CALL. 
*      3. RETURNS THE "RTRY DELAY VALUE" WORD IN 'DELAY' (IF SPECIFIED), AND
*         THE "LAST LU WORD" IN 'LLU' (IF SPECIFIED). 
*      4. RETURNS THE RECEIVED REQUEST LENGTH AND STATUS IN THE B AND A REGS, 
*         RESPECTIVELY. 
*      5. UPON RETURN, THE CLASS BUFFER REMAINS ALLOCATED IN SAM, AND MUST
*         BE CLEARED OUT OR RE-THREADED.
      SKP 
*     GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2001 790531      *
*                                                                *
*     GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY:      *
*                                                                *
*         REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST        *
*         GET,   #SLAV, RQCNV, RPCNV, GRPM,  DINIT, PTOPM        *
*         EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3        *
*         DSTIO, LUMAP, #CMGT                                    *
******************************************************************
* 
***!!!!! THE ORDER OF THE FIRST 7 WORDS (#STR THRU #ENO) IS      *
***!!!!!     FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES *
***!!!!!     AND ERROR CODES ALWAYS BE IN THE SAME PLACE,        *
***!!!!!     REGARDLESS OF MESSAGE FORMAT.  THIS MAKES STORE-AND-*
***!!!!!     FORWARD CODE MUCH SIMPLER.                          *
#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 >>>
* 
******************************************************************
      SKP 
CLASS NOP           CLASS NUMBER
DSHDR NOP           ADDRESS TO STORE DS 1000 HEADER 
DSHDL NOP           MAXIMUM LENGTH OF DS 1000 HEADER TO RETURN
USRBF DEF K0        USER DATA BUFFER (DEFAULTS TO NO DATA RETURNED) 
USRBL DEF K0        MAXIMUM AMOUNT OF DATA TO RETURN
STATS NOP           OPTIONAL RETURN ADDRESS FOR DRIVER STATUS 
LLU   NOP           "LAST LU WORD" RETURN ADDRESS 
DELAY NOP           'RTRY DELAY VALUE' WORD RETURN ADDRESS
* 
#GETR NOP 
      JSB .ENTR     GET PARAMETER ADDRESSES 
      DEF CLASS 
* 
INI   JSB CONFG    CONFIGURE DMS/NON-DMS ('NOP' AFTER 1ST CALL) 
* 
      LDA CLASS,I 
      IOR B6000     BUFR SAVE, NO DEALLOCATE
      STA CLASS 
      AND =B377     ISOLATE CLASS NUMBER. 
      ADA #CLTA,I   COMPUTE ADDRESS OF CLASS TABLE ENTRY. 
      STA CLTBA     SAVE ADDRESS FOR LATER USE. 
* 
      JSB EXEC      DO "GET" ON PASSED CLASS #
      DEF *+8 
      DEF K21N
      DEF CLASS 
      DEF USRBF,I   DATA BUFR ADDR
      DEF USRBL,I   DATA LENGTH 
      DEF #SBFA     REQUEST BUFR ADDR IN SAM RETURNED 
      DEF #SBFL     RCVD REQUEST BUFFER LENGTH
      DEF IPRM3      3RD OPTIONAL PARAMETER 
      JMP #GETR,I    --ERROR RETURN, BAD CLASS#-- 
* 
      STA STATS,I   RETURN DRIVER STATUS
      STB ARTN+1     SAVE ACTUAL LNTH OF USER DATA BFR FOR RTN TO CALLER
      STB #SDAL 
      LDB CLTBA     GET THE CLASS BUFFER ADDRESS, 
* 
LX3   LDA B,I       (XLA B,I IF DMS)
      NOP           (REQUIRED FOR DMS)
* 
      JSB .CAY       AND RETURN THE ADDRESS IN <Y>. 
* 
      INA           POINT TO CONWORD IN CLASS BUFFER. 
      STA B 
LX0   LDA B,I       (CROSS) LOAD THE CONWORD. 
      NOP 
      ALF,SLA       POSITION Z-BIT, AND TEST FOR Z BUFFER.
      JMP GETX      Z BUFFER PRESENT, GO TO GET CONTENTS. 
* 
      CLB,RSS       NO Z BUFFER, SO SET HEADER LEN. =0. 
* 
GETX  LDB #SBFL     RCVD REQUEST BUFFER LENGTH
      STB ARTN      SAVE ACTUAL LENGTH OF HEADER
      LDA 1 
      CMB,INB,SZB,RSS 
      JMP ZRET      ZERO LENGTH REQUEST, RETURN NOW 
      ADB DSHDL,I   CHECK VS REQUESTED LENGTH 
      SSB           WAS IT LARGER?
      LDA DSHDL,I   YES, USE SHORTER LENGTH 
      SZA,RSS       LENGTH WANTED = 0?
      JMP X2        . YES JUST GET APPENDAGE
* 
*     MOVE REQUEST BUFFER FROM SAM TO USER AREA 
* 
      STA DSHDL 
      LDB DSHDR     USER REQUEST BUFFER ADDRESS 
      LDA #SBFA     SAM BUFFER ADDRESS
MOD1  JMP NODMS     "NOP" HERE IF DMS SYSTEM
      JSB .LDX      PUT LENGTH IN X REGISTER
      DEF DSHDL     LENGTH OF TRANSFER
      MWF           MOVE WORDS FROM ALTERNATE (SYSTEM) MAP
      JMP X2
NODMS JSB .MVW      "MOVE WORD" 
      DEF DSHDL 
      NOP 
* 
X2    EQU * 
      LDB #SBFA     RETURN
      ADB #SBFL       THE LAST 2 WORDS OF HEADER
      ADB =D-1
LX1   LDA B,I       (CROSS) LOAD "LAST LU WORD" 
      NOP           (REQUIRED FOR XLA)
      STA LLU,I     RETURN TO CALLER
* 
      LDA DELAY     ARE WE TO RETURN THE
      SZA,RSS         "RTRY DELAY VALUE" ?
      JMP ZRET      NO
      ADB =D-1      YES, BACK UP ADDRESS POINTER TO DELAY WORD
LX2   LDA B,I       (CROSS) LOAD DELAY WORD 
      NOP           (REQUIRED FOR XLA)
      STA DELAY,I   RETURN TO CALLER
* 
ZRET EQU *          DO NORMAL RETURN FOR ZERO-LNTH BUFFER 
      ISZ #GETR     BUMP TO SUCCESSFUL RETURN 
* 
* 
*     RETURN TO USER
* 
* 
      LDA @K0 
      STA USRBF     RESET ENTRY ADDRESSES, IN CASE NEXT 
      STA USRBL       ENTRY DOESN'T PASS ALL 5 PARAMS 
      JSB .LDX      RETURN WITH 3RD OPTIONAL PARAMETER
      DEF IPRM3        IN (X) 
      CLA 
      STA STATS 
      STA DELAY 
      STA LLU 
      DLD ARTN
      ADA L#LSZ       SUBTRACT APPENDAGE LENGTH 
      JMP #GETR,I 
* 
* 
* 
* 
CONFG NOP          ROUTINE TO CONFIGURE FOR DMS/NON-DMS INSTR.
      CLB 
      LDA $OPSY    GET OP-SYSTEM TYPE 
      RAR,SLA      MAPPED SYSTEM? 
      STB MOD1      YES, CONFIGURE FOR "MWF" INSTR. 
      STB INI      CLEAR CALL TO THIS ROUTINE.
      SLA,RSS       DMS SYSTEM? 
      JMP CONFG,I  RETURN 
      DLD XLABI     YES, PICK UP "XLA B,I" INSTRUCTION
      DST LX0 
      DST LX1 
      DST LX2 
      DST LX3 
      JMP CONFG,I 
*     DATA AREA 
* 
ARTN  EQU CONFG 
BRTN  EQU CONFG+1 
#SBFA EQU CONFG+2      ADDRESS OF DS HEADER 
#SBFL EQU CONFG+3      LENGTH OF DS HEADER
IPRM3 EQU CONFG+4      3RD OPTIONAL PARAMETER 
#SDAL EQU CONFG+5   LENGTH OF DATA BUFFER 
CLTBA EQU CONFG+6   CLASS TABLE ENTRY ADDRESS.
K0    EQU INI       THIS LOCN 0 AFTER 1ST CALL
@K0   DEF K0
K21N  OCT 100025    CLASS "GET", NO ABORT 
B6000 OCT 060000
XLABI XLA B,I 
L#LSZ ABS -#LSZ 
A     EQU 0 
B     EQU 1 
* 
SIZE  BSS 0 
* 
      END 
                                                                                                                                                                                        