ASMB,R,L,C
      HED FREAD 91741-16012 REV 1740 770317 * (C) HEWLETT-PACKARD CO. 1977
      NAM FREAD,7 91741-16012 REV 1740 770317 
      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 THE HEWLETT-PACKARD COMPANY.   *
******************************************************************
      SPC 1 
      ENT FREAD,FRDIR 
* 
      EXT .ENTR,D3KMS,D$INI,D$RFH,D$STW,D$PRM 
      EXT D$RQB,D$ERR,D$WDC 
* 
* FREAD 
* SOURCE: 91741-18012 
* BINARY: 91741-16012 
* JIM HARTSELL
* AUG. 14, 1975 
* 
A     EQU 0 
B     EQU 1 
* 
FREAD NOP           FREAD.
      JSB ENTRY 
B3    OCT 3 
* 
FRDIR NOP           FREADDIR. 
      JSB ENTRY 
      OCT 4 
* 
ENTRY NOP 
      CLA           CLEAR OLD PARAM ADDRESSES.
      STA PRAMS 
      STA PRAMS+1 
      STA PRAMS+2 
      STA PRAMS+3 
      LDA ENTRY,I   SAVE FUNCTION CODE. 
      STA FCN 
      LDA ENTRY     SET UP FOR .ENTR CALL.
      ADA N2
      LDA A,I 
      STA RETRN 
      JMP BEGIN 
* 
PRAMS NOP           FILE NUMBER.
      NOP           BUFFER ADDRESS
      NOP           BUFFER LENGTH 
      NOP           RECORD NUMBER.
* 
RETRN NOP           ENTRY POINT.
BEGIN JSB .ENTR     GET ADDRS OF USER PARAMS. 
DPRAM DEF PRAMS 
* 
      CLA           CLEAR ERROR CODE FOR FCHEK. 
      CLB 
      DST D$ERR 
      SKP 
* 
* BUILD FRONT END OF REQUEST BUFFER.
* 
      LDA DPRAM     ADDR OF 1ST PARAM TO SEND.
      JSB D$INI     INITIALIZE BUFFER STUFFERS. 
* 
      JSB D$RFH     SET UP FIXED FORMAT.
* 
      LDA FCN 
      JSB D$STW     FREAD CODE = 3, FRDIR = 4.
* 
* MOVE USER PARAMS TO REQUEST BUFFER. 
* 
      CCA 
      JSB D$PRM     MOVE FNUM.
* 
      LDA PRAMS+1   IF NO TARGET ADDR,
      SZA,RSS 
      STA PRAMS+2    ZERO TCOUNT ADDR.
      CLA           CLEAR (A) IN CASE NO PARAM. 
      LDA PRAMS+2,I STORE USER BUFFER LEN IN "TCOUNT".
      JSB D$STW      + = WORDS, - = BYTES.
* 
      LDA FCN       IF FREADDIR, STORE RECNUM.
      CPA B3
      JMP STWD
      CLA           CLEAR (A) IN CASE NO PARAM. 
      LDA PRAMS+3,I 
      JSB D$STW 
      CLA           CLEAR (A) IN CASE NO PARAM. 
      LDA PRAMS+3 
      SZA 
      INA 
      LDA A,I 
      JSB D$STW 
* 
STWD  JSB D$WDC     SET WORD COUNT. 
      LDA N4        SET APPENDAGE LENGTH = 4 BYTES. 
      STA APEND 
* 
* SEND REQUEST TO 3000 BY WRITING TO QUEX'S CLASS,
* AND WAIT FOR THE REPLIES (MAY BE SEVERAL).
* 
      LDA PRAMS+1   SET ADDR OF USER DATA BUFFER. 
      STA TBUF
      CLA 
      STA TCNT      CLEAR RECEIVED BYTE COUNT (LOG).
* 
      INA           SIGNAL FOR MULTIPLE REPLIES.
SN/RC IOR BIT15     STORE CONTROL WORD FOR D3KMS. 
      STA CONWD     HAS NO-ABORT BIT SET. 
* 
      JSB D3KMS     SHIP REQUEST BUFFER TO QUEX,
      DEF *+2        AND WAIT FOR DATA REPLY. 
      DEF CONWD 
      JMP ABERR     ERROR RETURN. 
* 
      LDA CONWD     WAS LAST CALL TO RELEASE
      AND B377
      CPA B4        CLASS ONLY? 
      JMP DONE      YES.
* 
      LDA D$RQB     CHECK IF ANY DATA WAS 
      ADA B7         RECEIVED.
      LDA A,I 
      ADA APEND 
      SZA,RSS 
      JMP CONBT     READ ERROR - NO DATA. 
* 
* PASS RECEIVED DATA BLOCK BACK TO USER.
* 
      JSB MOVE      MOVE DATA TO USER BUFFER. 
* 
CONBT LDA D$RQB     IS CONTINUATION BIT SET?
      ADA B2
      LDA A,I 
      RAL,RAL 
      SSA 
      JMP DMREP     YES.
      LDA B4        NO. DE-ALLOC CLASS. 
      JMP SN/RC 
* 
DMREP LDB D$RQB     SET UP "REPLY". 
      LDA B,I       STORE COUNT AND MSG CLASS.
      AND B377
      IOR LB10
      STA B,I 
      ADB B2
      LDA B,I       CLEAR REPLY BIT.
      ELA,CLE,ERA 
      STA B,I 
      ADB B2
      LDA B,I       REVERSE PROCESS NUMBERS.
      ALF,ALF 
      STA B,I 
      ADB B3
      CLA           CLEAR BYTE COUNT. 
      STA B,I 
      STA APEND     SET APPENDAGE LEN = 0.
* 
      LDA B2        TELL D3KMS TO LOOK FOR MORE.
      JMP SN/RC     GO GET NEXT DATA BLOCK. 
* 
DONE  LDA TCNT      RETURN TO USER WITH 
      LDB PRAMS+2    (A) = + WORDS OR + BYTES 
      SZB,RSS 
      JMP RETRN,I 
      LDB B,I 
      SSB            DEPENDING ON HIS BUFLEN. 
      JMP RETRN,I 
      INA 
      CLE,ERA 
      JMP RETRN,I 
* 
ABERR DST D$ERR     STORE CODE FOR FCHEK RETRIEVAL. 
      CLA 
      JMP RETRN,I   RETURN. 
      SPC 3 
* 
* SUBROUTINE TO MOVE A BLOCK OF DATA FROM REPLY 
* BUFFER TO USER BUFFER.
* ENTRY: (A) = + # DATA BYTES IN THIS REPLY.
* EXIT WITH TCNT = TOTAL BYTES RECEIVED.
* 
MOVE  NOP 
      LDB A        ACCUMULATE LOG.
      ADB TCNT
      STB TCNT
      INA          (A) = + BYTES. 
      CLE,ERA 
      CMA,INA 
      STA TEMP     NEG. # WORDS TO MOVE.
* 
      LDA APEND    COMPUTE ADDR OF REPLY DATA.
      CMA,INA 
      ARS 
      LDB D$RQB 
      ADB D8
      ADB A 
      STB RQPTR     ADDRESS 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      LOOP TILL DONE. 
      JMP MOVE,I
      SKP 
* 
* CONSTANTS AND WORKING STORAGE.
* 
B2    OCT 2 
B4    OCT 4 
B7    OCT 7 
D8    DEC 8 
N2    DEC -2
N4    DEC -4
LB10  OCT 4000
B377  OCT 377 
BIT15 OCT 100000
APEND NOP 
FCN   NOP 
CONWD NOP 
TCNT  NOP 
TBUF  NOP 
TEMP  NOP 
RQPTR NOP 
* 
      END 
                                                                                                                                                                                                          