ASMB,R,L,C
      HED <D65GT> DS GET SUBROUTINE * (C) HEWLETT-PACKARD CO. 1979* 
      NAM D65GT,7 91740-16025 REV 1913 781027 
      SPC 1 
      ENT D65GT 
      SPC 1 
      EXT .ENTR,EXEC,#PLOG
      EXT $OPSY,#REQU 
* 
*    NAME:   D65GT
*    SOURCE: 91740-18025
*    RELOC:  91740-16025
*    PGMR:   CHUCK WHELAN  DEC 1976 
**
**  ALTERED TO RETURN AT LEAST THE FIRST SEVEN WORDS OF ANY REQUEST 
**  TO CALLER [10-27-78] CEJ. 
* 
*   MODIFIED BY: LYLE WEIMAN, AUG '78 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.       *
******************************************************************
* 
* 
*  D65GT CALLING SEQUENCE:
* 
*     JSB D65GT 
*     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 
* 
* 
* 
* 
*  D65GT OPERATION: 
*     D65GT IS CALLED BY ROUTINES WAITING TO RECEIVE REQUESTS ( & POSSIBLY
*     DATA) ON THEIR CLASS NUMBERS.  D65GT 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 REQUEST LENGTH EXCEEDED, RETURNS A "DS03"
*      4. MOVES THE REQUEST INTO THE USERS BUFFER (UP TO THE
*         # OF WORDS SPECIFIED IN CALL. 
*      5. IF SPECIFIED DATA 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 THE B AND A REGS 
* 
* 
*  D65GT ERROR RETURNS: 
* 
*    "DS03" - ILLEGAL RECORD SIZE - REQ OR DATA EXCEEDS BUFFER
* 
      SKP 
CLASS NOP 
RQBUF NOP 
RQLEN NOP 
DABUF NOP 
DALEN NOP 
* 
D65GT NOP 
      JSB .ENTR     GET PARAMETER ADDRESSES 
      DEF CLASS 
* 
      CLB 
      LDA $OPSY     GET OP SYSTEM TYPE
      RAR,SLA 
      STB MOD1      IT'S A MAPPED SYSTEM, MODIFY PGM
* 
      LDA CLASS,I 
      IOR B6000     BUFR SAVE, NO DEALLOCATE
      STA CLASS 
* 
      JSB EXEC      DO "GET" ON PASSED CLASS #
      DEF *+7 
      DEF D21 
      DEF CLASS 
      DEF DABUF,I   DATA BUFR ADDR
      DEF K0        DATA LENGTH 
      DEF PARAM     REQUEST BUFR ADDR IN SAM RETURNED 
      DEF LENGT     RCVD REQUEST BUFFER LENGTH
* 
      STB BRTN      SAVE RECEIVED DATA LENGTH 
      LDA 1 
      CMB,INB 
      ADB DALEN,I   USER LENGTH - RETURNED LENGTH 
      SSB 
      LDA DALEN,I   USER'S 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 PARAM       DATA ADDR (SAM) 
      JSB MOVER     DO THE DATA MOVE FROM S.A.M.
* 
DOREQ CLA           SET LENGTH ERROR FLAG TO FALSE (0). 
      STA FLAG
* 
      LDB LENGT     RCVD REQUEST BUFFER LENGTH
      STB ARTN
      CMB,INB,SZB,RSS 
      JMP ZRET      ZERO LENGTH REQUEST, RETURN NOW 
      ADB RQLEN,I   CHECK VS REQUESTED LENGTH 
      SSB,RSS       WAS IT LARGER?
      JMP OKAY      NO, CONTINUE WITH NORMAL MOVE.
* 
      STB FLAG      YES, SET LENGTH ERROR FLAG TO TRUE (<0) 
      LDA D7          AND LENGTH OF REQUEST TO MOVE TO SEVEN. 
      STA ARTN
* 
*     MOVE REQUEST BUFFER FROM SAM TO USER AREA 
OKAY  LDB RQBUF     USER REQUEST BUFFER ADDRESS 
      LDA PARAM     SAM BUFFER ADDRESS
      JSB MOVER     NOW MOVE THE REQUEST
* 
      LDA FLAG      WAS THERE A REQUEST LENGTH ERROR? 
      SSA 
      JMP ERR03       YES - GIVE "DS03" ERROR.
* 
      LDB BRTN      DATA LENGTH 
      CMB,INB 
      ADB DALEN,I 
      SSB           DATA TOO LARGE? 
      JMP ERR03     YES, GIVE "DS03"
* 
      ISZ D65GT     BUMP TO SUCCESSFUL RETURN 
* 
*  RETHREAD TO PLOG'S CLASS IF IT'S ENABLED 
* 
LOGIT LDA #PLOG 
      SZA,RSS       PLOG ENABLED? 
      JMP CLSAM     NO
      STA PARAM 
* 
      JSB #REQU     RETHREAD TO PLOG
      DEF *+3 
      DEF CLASS 
      DEF PARAM 
* 
      SSA,RSS       ANY ERROR?
      JMP RETRN     NO, RETURN
      JMP CLSAM     YES, RELEASE BUFFER 
* 
ZRET  ISZ D65GT     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 D21 
      DEF CLASS 
      DEF DABUF,I 
      DEF K0
* 
*     RETURN TO USER
RETRN LDB BRTN
      LDA ARTN
      JMP D65GT,I 
* 
* 
*     ERROR ROUTINES
* 
ERR03 DLD DS03      ILLEGAL RECORD SIZE 
      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
      LDX ARTN      PUT LENGTH IN X REG 
      MWF           MOVE WORDS FROM ALTERNATE (SYSTEM) MAP
      JMP MOVER,I   RETURN
* 
NODMS MVW ARTN      DO "MVW" FROM S.A.M.
      JMP MOVER,I   RETURN
* 
*     DATA AREA 
* 
ARTN  NOP 
BRTN  NOP 
PARAM NOP 
LENGT NOP 
FLAG  NOP 
K0    OCT 0 
D7    DEC 7 
D21   DEC 21
B6000 OCT 060000
DS03  ASC 2,DS03
* 
SIZE  BSS 0 
* 
      END 
                                                                                                            