ASMB,R,L,C
      HED READF 
*     NAME:   READF 
*     SOURCE: 92064-18065 
*     RELOC:  92064-16061 
*     PGMR:   G.L.M.
* 
*  ***************************************************************
*  * (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 HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
* 
      NAM READF,7  92064-16061  REV.1650  761115
* 
      ENT READF,WRITF 
      EXT EXEC,.ENTR
      SUP 
      UNL 
* 
* 
*     THIS IS THE RTE FILE MANAGEMENT PACKAGE 
*     READ/WRITE SUBROUTINE.
* 
*     THIS ROUTINE WILL READ OR WRITE ANY TYPE FILE.  
* 
* 
*     CALLING SEQUENCE: 
* 
*     CALL READF(IDCB,IERR,IBUF,IL,L,N) 
* 
*     O R 
* 
*     IER = READF(IDCB,IERR,IBUF,IL,L,N)
* 
*     TO READ,  O R 
* 
*     CALL WRITF(IDCB,IERR,IBUF,IL,N) 
* 
*     O R 
* 
*     IER = WRITF(IDCB,IERR,IBUF,IL,N)
* 
*     TO WRITE. 
* 
* 
*     W H E R E:
* 
*     IDCB     IS THE 16  WORD DATA CONTROL BLOCK 
*              FOR THE REFERENCED FILE. 
* 
      LST 
*     IERR     IS THE ERROR RETURN LOCATION 
*              ERRORS ARE AS FOLLOWS: 
* 
*                   CODE     ERROR CONDITION
*                   0 OR >0  NO ERROR 
*                   -5       ILLEGAL RECORD NUMBER OR 
*                             ATTEMPT TO READ A RECORD NOT WRITTEN
*                   -10      A REQUIRED PARAMETER IS MISSING
*                   -11      THE DCB IS NOT OPEN
*                   -12      SOF OR EOF SENSED ON READ
*                   -17      ILLEGAL REQUEST TO A TYPE ZERO FILE
* 
*     IER      SEE IERR - RETURNED AS FUNCTION
* 
      UNL 
*     IBUF     IS THE BUFFER TO BE USED TO READ OR WRITE. 
* 
*     IL       IS THE REQUESTED TRANSFER LENGTH IN WORDS. 
* 
*     L        IS THE LENGTH AS READ IN WORDS.
* 
*     N        IS THE REQUESTED RECORD NUMBER 
*              IF N>0 OR IF N<0 THE RELATIVE RECORD 
*              NUMBER FROM THE CURRENT POSITION.
*              N IS LEGAL ON TYPE 1 AND 2 FILES ONLY. 
* 
* 
*     O P T I O N S:
* 
*     IL       IS OPTIONAL ON TYPE 1 AND 2 FILES. 
*              ON TYPE 1 FILES, 128 IS USED;
*              ON TYPE 2 FILES THE RECORD LENGTH IS USED. 
* 
*     L        IS OPTIONAL AT ALL TIMES.
* 
*     N        IS OPTIONAL AND IS IGNORED ON FILES
*              OF TYPES OTHER THAN 1 AND 2.  IF NOT 
*              SUPPLIED, ZERO IS USED.
*              THE FIRST RECORD IN A FILE IS RECORD #1. 
* 
* 
*     E X T E R N A L S:
* 
*     RW$UB         IS USED TO READ OR WRITE WORDS
*                   FROM OR TO FILES OF TYPE 2 OR 
*                   ABOVE.  IT HANDLES ALL SECTOR,
*                   TRACK, AND EXTENT SWITCHING FOR 
*                   THESE FILES AND ALSO WRITES AND/OR
*                   READS BLOCKS FROM THE FILE AS 
*                   REQUIRED.  READS ARE CONDITIONAL
*                   ON RFLG$.  A GLOBAL FLAG WHICH
*                   MUST BE NON-ZERO BEFORE A READ
*                   IS EXECUTED.
* 
*     RW$UB CALLING SEQUENCE IS:
* 
*     LDB #WORDS
*     LDA DCB ADDRESS 
*     CLE/CCE       WRITE/READ
*     JSB RW$UB CALL
*     DEF UBUF      ADDRESS OF USER'S BUFFER
*     JMP ERROR     ERROR RETURN (A = CONDITION)
*     --            NORMAL RETURN 
      SKP 
      LST 
WRITF NOP           WRITE ENTRY POINT 
      LDA WRITF     TRANSFER RETURN ADDRESS 
      STA DEADF     TO READ ENTRY 
      JMP RST       GO RESET ENTRY PARMS
* 
READF NOP           READ ENTRY POINT
      LDA READF     TRANSFER RETURN ADDRESS 
      STA DEADF     TO DUMMY ENTRY POINT
      CCA           SET ENTRY FLAG
RST   STA ENTFG     SET ENTRY FLAG
* 
      LDA DZERO     RESET 
      STA BUF         ENTRY 
      STA IL            PARMS 
      STA L               FOR M-SYSTEM
      JMP DEADF+1   GO FETCH ENTRY PARMS
* 
      SPC 3 
DCB   NOP           DCB POINTER 
IERR  NOP           ERROR BOX 
BUF   DEF ZER0      USER BUFFER ADDRESS 
IL    DEF ZER0      REQUEST LENGTH
L     DEF ZER0      RETURN LENGTH 
N     DEF ZER0      RECORD NUMBER 
DEADF NOP           READ ENTRY POINT
      JSB .ENTR     TRANSFER THE
      DEF DCB        PARAMETERS 
      LDB DCB       SET 
      ADB .3           UP 
      STB LU0            NEEDED 
      INB                   DCB 
      STB EOF0                 POINTERS 
      ADB .2
      STB RL
      ADB .3
      STB OCFLG 
      ADB .5
      STB RC
* 
      SPC 2 
      LDA N10       PRESET FOR MISSING PRAM ERROR 
      LDB BUF       BUFFER MUST BE
      CPB DZERO      SUPPLIED 
      JMP EXIT      ELSE MISSING PRAM 
      LDB OCFLG,I   IF NOT OPEN 
      ADA N1
      CPB XEQT      THEN
      JMP TYP00 
      SPC 5 
EXIT  STA IERR,I    SET THE ERROR CODE
      JMP DEADF,I    RETURN 
      SPC 2 
EOFT0 CCA            SET RETURN LEGNTH
      STA L,I        FOR EOF
      SPC 2 
EXIOK ISZ RC,I      STEP RECORD COUNT 
      CLA           DONE - OK SO
      JMP EXIT       EXIT 
      SKP 
TYP00 LDB ENTFG     IF READ 
      STB TMP       SET READ WRITE FLAG FOR EOF TEST
      LDA RL,I      GET THE READ WRITE LEGAL FLAG 
      SSB,RSS       IF WRITE
      RAR           SHIFT THE WRITE FLAG TO BIT 15
      SSA,RSS       TEST THE FLAG 
      JMP EX17      ILLEGAL REQUEST   GO EXIT 
      SPC 1 
      CCA           IF READ 
      SSB           THEN
      JMP TYP01     SKIP
* 
      CPA IL,I      EOF?
      JMP EOFW0     YES; GO MAKE CONTROL RQ 
      SPC 1 
TYP01 CLA,INA       SET UP THE REQUEST CODE 
      SSB,RSS       FOR THE CALL
      INA           AND 
      ELA,RAR         (PREVENT ABORTS)
      STA RQ        SET IT FOR THE CALL.
      JSB EXEC      CALL
      DEF RTN       THE 
      DEF RQ        EXEC
      DEF LU0,I     FOR 
      DEF BUF,I     I/O 
      DEF IL,I      TO/FROM USER BUFFER.
RTN   JMP EX17      CALL REJECTED BY DRIVER 
      ISZ TMP       TEST READ WRITE 
      JMP EXIOK     GO EXIT IF WRITE
      STB L,I       SET THE RETURN LENGTH 
      SPC 1 
      RAL,CLE,ELA   PUT THE DOWN BIT IN  E
      ALF,RAL       SHIFT THE EOF BIT 
      RAL           TO BIT 15 
      SSA           IF EOF BIT SET
      JMP EOFT0     GO DO EOF THING 
* 
      SZB           IF ZERO WORDS READ THEN SKIP
      JMP EXIOK     ELSE GO EXIT GOOD XFER
* 
      AND B70       MASK THE HIGH ORDER TYPE BIT
      SEZ,CCE,SZA     IF NOT DOWN OR IF TYPE<10 THEN EOF
      JMP TYP00     ELSE RETRY THE XFER 
* 
      JMP EOFT0 
* 
* 
* 
* 
* 
* 
      SPC 2 
EOFW0 JSB EXEC      WRITE TYPE ZERO EOF 
      DEF EOFRT     RETURN ADDRESS
      DEF .3
      DEF EOF0,I
      DEF N1
EOFRT JMP EXIOK 
      SPC 3 
EX17  LDA N17       SET UP ILLEGAL REQUEST FLAG 
      JMP EXIT      GO EXIT 
      SPC 2 
* 
* 
*     C O N S T A N T S 
N1    OCT -1
N10   DEC -10 
N17   DEC -17 
.2    OCT 2 
.3    OCT 3 
.5    OCT 5 
B70   OCT 70
DZERO DEF ZER0
TMP   EQU READF 
ENTFG EQU WRITF 
ZER0  NOP 
* 
LU0   NOP 
EOF0  NOP 
RL    NOP 
OCFLG NOP 
RC    NOP 
      SPC 5 
RQ    NOP 
      SPC 3 
A     EQU 0 
B     EQU 1 
XEQT  EQU 1717B 
      SPC 1 
PLENG EQU * 
      END 
                      