ASMB,R,Q,C
      HED <#GET> DS MSG GET SUBROUTINE * (C) HEWLETT-PACKARD CO. 1980 
      NAM #GET,7 91750-1X009 REV 2013 800726 ALL
      SPC 1 
      ENT #GET
      SPC 1 
      EXT .ENTR,EXEC,#PLOG,$OPSY
      EXT .LDX,.MVW,#LOGR 
* 
*    NAME:   #GET 
*    SOURCE: 91750-18225
*    RELOC:  91750-16225
*    PGMR:   TOM MILNER APR 1980
* 
* MODIFICATIONS:
* --------------- 
* REQUEST LENGTH INCREMENTED (BY #LSZ) BEFORE CALL, AND 
*   DECREMENTED (BY #LSZ) AFTER CALL  -- TKM 05.31.79 
* SIGN BIT ON CLASS CLEARED LOCALLY  -- TKM 07.24.79
* DELETED 'D65GT' ENTRY POINT AND CHECK 
*   FOR MSG OF LENGTH 1 (MA REQUEST FOR RETRY) -- TKM 09.11.79
* 
******************************************************************
*  * (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.       *
******************************************************************
* 
* 
*  '#GET' CALLING SEQUENCE: 
* 
*     JSB #GET
*      DEF *+6
*      DEF CLASS     CLASS FOR GET SUSPEND
*      DEF RQBUF     REQUEST BUFFER ADDRESS.
*      DEF RQLEN     MAX REQUEST LENGTH 
*      DEF DABUF     DATA BUFFER ADDRESS
*      DEF DALEN     MAX DATA BUFFER LENGTH (0 IF NO DATA). 
*  <ERROR RETURN >  A & B HAVE ASCII ERROR CODE 
*  <NORMAL RETURN>  A= RCVD REQUEST LEN, B= RCVD DATA LEN 
* 
* 
* 
* 
*  '#GET' OPERATION:
*     '#GET' IS CALLED BY ROUTINES WAITING TO RECEIVE REQUESTS ( & POSSIBLY 
*     DATA) ON THEIR CLASS NUMBERS. THE MESSAGE RECEIVED CONSISTS OF 2
*     BUFFERS; THE DATA & THE REQUEST (HEADER) BUFFERS. '#GET'
*     DOES THE FOLLOWING: 
*      1. PERFORMS A ZERO-LENGTH "GET" ON THE PASSED CLASS NUMBER 
*      2. MOVES DATA TO USER BUFFER USING LENGTH= MIN(USER LEN,RCVD LEN)
*      3. IF SPECIFIED DATA LENGTH EXCEEDED, RETURNS A "DS03" 
*      4. MOVES THE REQUEST INTO THE USERS BUFFER USING 
*         LENGTH = MIN (RQLEN, 7) 
*      5. IF SPECIFIED REQUEST LENGTH EXCEEDED, RETURNS A "DS03"
*      6. IF PLOG IS ENABLED, RETHREADS THE REQUEST TO PLOG'S CLASS 
*         OTHERWISE, DEALLOCATES THE BUFFER IN SAM
*      7. RETURNS THE RECEIVED REQUEST AND DATA SIZES IN <A> & <B>
* 
* 
*  '#GET' ERROR RETURNS:
* 
*    "DS03" - ILLEGAL RECORD SIZE - REQ OR DATA EXCEEDS BUFFER
*    "DS09" - ILLEGAL PARAMETERS. 
* 
A     EQU 0 
B     EQU 1 
* 
* 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 
#GET  NOP 
      CLA 
      STA DABUF     INITALIZE POINTERS
      STA DALEN 
      LDA #GET
      STA ENTRY 
      JMP ENTRY+1 
* 
CLASS NOP 
RQBUF NOP 
RQLEN NOP 
DABUF NOP 
DALEN NOP 
* 
ENTRY NOP 
      JSB .ENTR     GET PARAMETER ADDRESSES 
       DEF CLASS
* 
      CLB           CONFIGURE DMS/NON-DMS INSTRS
      LDA $OPSY     GET OPSYSTEM TYPE 
      RAR,SLA       ROTATE DMS BIT
      STB MOD1      IT'S A DMS SYSTEM, MODIFY INSTR 
* 
      LDA CLASS,I 
      IOR CONS1     BUFR SAVE, NO DEALLOCATE
      RAL,CLE,ERA   CLEAR BIT 15 (NO WAIT)
      STA CLASS 
* 
      LDA DABUF 
      SZA,RSS 
      JMP DS096 
      LDA RQLEN,I 
      LDB DALEN,I 
      SSB,RSS       NEGATIVE? 
      SSA           NEGATIVE? 
      JMP DS095     YES, ONE OF 'EM WAS.  BAD, BAD, BAD 
* 
      ADA C#LSZ     INCREMENT REQUEST SIZE
      STA RQLEN 
      CMA,INA 
      ADA C#MXR     LARGER THAN MAX 
      SSA              ALLOWED? 
      JMP DS033     NO, DS03(3) ERROR.
* 
      JSB EXEC      DO "GET" ON PASSED CLASS #
       DEF *+7
       DEF D21N 
       DEF CLASS
       DEF DABUF,I   DATA BUFR ADDR 
       DEF D0        DATA LENGTH
       DEF RQADR     REQUEST BUFR ADDR IN SAM RETURNED
       DEF LENGT     RCVD REQUEST BUFFER LENGTH 
       JMP ENTRY,I  RETURN TO CALLER, IO00 ERROR IN A,B 
* 
      STB BRTN      SAVE RECEIVED DATA LENGTH 
      LDA B 
      CMB,INB 
      ADB DALEN,I   DATA LENGTH - RETURNED LENGTH 
      SSB 
      LDA DALEN,I   USER'S DATA LENGTH LESS, USE IT 
      STA ARTN
      SZA,RSS       SHOULD WE MOVE ANY? 
      JMP DOREQ     NO! 
      LDB DABUF     ADDR OF USER'S DATA BUFFER
      LDA BRTN
      CMA,INA       REQ ADDR (SAM) - DATA LENGTH =
      ADA RQADR       DATA ADDR (SAM) 
      JSB MOVER     DO THE DATA MOVE FROM S.A.M.
* 
DOREQ EQU * 
* 
      LDB LENGT     RCVD REQUEST BUFFER LENGTH
      STB ARTN
      CPB D1        CHECK FOR LENGTH 1 MSG
      JMP ZRET
      CMB,INB,SZB,RSS 
      JMP ZRET      ZERO LENGTH REQUEST, RETURN NOW 
      ADB C#MXR       IS THERE MORE THAN OUR BUFFER CAN HOLD? 
      SSB 
      JMP DS034     YES, DS03(4) ERROR. 
* 
* 
*     MOVE REQUEST BUFFER FROM SAM TO USER AREA 
      LDB RQBUF     USER REQUEST BUFFER ADDRESS 
      LDA RQADR     SAM BUFFER ADDRESS
      JSB MOVER     NOW MOVE THE REQUEST
* 
      LDB RQBUF 
      ADB C#EC1     <B> --> #EC1
      LDA B,I       CHECK FOR ERRORS
      ELA,CLE,ERA   IF ERRORS THEN
      CPA "DS"         IGNORE BUFFER LENGTH 
      JMP SUCCS           CHECKS
* 
      LDB BRTN      DATA LENGTH 
      CMB,INB 
      ADB DALEN,I 
      SSB           DATA TOO LARGE? 
      JMP DS035     YES, GIVE "DS03"
* 
*     SUCCESS! NOW RE-ADJUST LENGTH 
* 
SUCCS LDA C#LSZ 
      CMA,INA 
      ADA ARTN
      SSA,RSS     IF ARTN < C#LSZ 
      STA ARTN         LEAVE ARTN AS IS...
      ISZ ENTRY      BUMP TO SUCCESSFUL RETURN
* 
*  RETHREAD TO PLOG'S CLASS IF IT'S ENABLED 
* 
LOGIT LDA #PLOG 
      SZA,RSS       PLOG ENABLED? 
      JMP CLSAM     NO
      LDA RQBUF     . YES, LOG MESSAGE
      LDB CLASS 
      JSB #LOGR     DO PROGRAM LOGGING
       JMP CLSAM     ERROR RETURN 
      JMP RETRN 
* 
ZRET  ISZ ENTRY      DO NORMAL RETURN FOR ZERO-LENGTH REQ 
* 
*     DEALLOCATE THE BUFFER IN SAM
* 
CLSAM LDA CLASS 
      ALR,RAR       CLEAR "SAVE BUFFER" FLAG
      STA CLASS 
* 
      JSB EXEC      DO DUMMY GET TO RELEASE BUFFER
       DEF *+5
       DEF D21N 
       DEF CLASS
       DEF DABUF,I
       DEF D0 
      NOP           IF ERROR, WE DON'T CARE 
* 
*     RETURN TO USER
RETRN EQU * 
      LDB BRTN      DATA LENGTH 
      LDA ARTN      REQUEST LENGTH
      JMP ENTRY,I 
* 
* 
*     ERROR ROUTINES
* 
DS033 LDA Q3
      RSS 
DS034 LDA Q4
      RSS 
DS035 LDA Q5
      LDB RQBUF 
      ADB C#ECQ 
      STA B,I 
      LDB "03       ILLEGAL RECORD SIZE 
      JMP ERROR 
DS095 LDA Q5
      RSS 
DS096 LDA Q6
      LDB RQBUF 
      ADB C#ECQ 
      STA B,I 
      LDB "09 
ERROR EQU * 
      LDA "DS"
      DST ARTN      ERROR CODE RETURNED IN A & B
      JMP LOGIT     FIRST DEALLOCATE BUFFER 
* 
*  SUBROUTINE TO MOVE BLOCK OF WORDS FROM S.A.M. TO USER BUFFER 
* 
MOVER NOP 
MOD1  JMP NODMS     "NOP" HERE IF DMS SYSTEM
      JSB .LDX      PUT LENGTH IN X REG 
       DEF ARTN 
      MWF           MOVE WORDS FROM ALTERNATE (SYSTEM) MAP
      JMP MOVER,I   RETURN
* 
NODMS JSB .MVW      DO "MVW" FROM S.A.M.
       DEF ARTN 
       NOP
      JMP MOVER,I   RETURN
      SPC 3 
* 
*     DATA AREA 
* 
ARTN  NOP 
BRTN  NOP 
RQADR NOP 
LENGT NOP 
C#MXR ABS #MXR+#LSZ 
Q3    OCT 000060
Q4    OCT 000100
Q5    OCT 000120
Q6    OCT 000140
C#EC1 ABS #EC1
C#LSZ ABS #LSZ      SIZE OF LOCAL APPENDAGE 
D0    DEC 0 
D1    DEC 1 
D21N  ABS 21+100000B
C#ECQ ABS #ECQ
CONS1 OCT 060000    BUFR SAVE, DO NOT DEALLOCATE
"DS"  ASC 1,DS
"03   ASC 1,03
"09   ASC 1,09
* 
SIZE  EQU * 
* 
      END 
                                                                                                                        