ASMB,L,R,C
*     NAME:   RW$UB 
*     SOURCE: 92064-18192 
*     RELOC:  92064-16059 
*     PGMR:   G.A.A.
* 
*  ***************************************************************
*  * (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 RW$UB,7  92064-16059  REV.1650  750422
* 
      HED RW$UB 
* 
*     RW$UB READS AND WRITES A WORD OR BLOCK OF WORDS ON A RTE FILE 
*     CALLING SEQUENCE: 
*     SET E=1  FOR READ 
*         E=0  FOR WRITE
*     LDA DCB       SET A TO DCB ADDRESS
*     LDB COUNT     SET B TO THE NO OF WORDS TO BE XFERED 
*     JSB RW$SUB    CALL
*     DEF BUF       BUFFER CONTAING (WRITE) OR RECIEVING (READ) 
*     JMP ERROR     ERROR RETURN  CODE IN A 
*     ---    NORMAL RETURN
* 
      EXT RWND$,R/W$
      EXT EXEC,P.PAS
      EXT RFLG$ 
      ENT RW$UB,NX$EC 
      ENT $KIP
RW$UB NOP           ENTRY 
      CMB,INB,SZB,RSS  SET NEGATIVE SKIP IF NOT ZERO
      JMP ZER0      ZERO GO RETURN
      STB COUNT       NEGATIVE
      CLB,SEZ,RSS          COUNTER
      LDB RSS       SET READ/WRITE SWITCH 
      STB NEXTW     RSS IF WRITE, ELSE NOP
      JSB PRAM      GO GET THE PRAMETERS
      ADA B         CALCULATE 
      CMA,INA       THE # 
      ADA BUFPT,I   OF REMAINING
      STA LEFT      WORDS AND SET 
      LDB BUFPT,I   GET THE POINTER TO B
      LDA RW$UB     GET USER BUFFER 
      LDA A,I       GET ADDRESS 
      RAL,CLE,SLA,ERA   IF INDIRECT 
      JMP *-2       TRY AGAIN 
      ISZ RW$UB     STEP RETURN 
      STA PTR       SET USER POINTER
NEXTW RSS OR NOP IF WRIT
      JMP READ      DO READ THING 
      LDA PTR,I     WRITE; GET WORD 
      STA B,I       SET IT IN DCB 
RDW   ISZ PTR       STEP POINTER
      INB           STEP DCB ADDRESS
      ISZ LEFT      ANY ROOM LEFT?
RSS   RSS           YES; SKIP 
      JMP ENDBL     NO; GO WRITE IT OUT 
CONT  ISZ COUNT     STEP WORD COUNT-DONE? 
      JMP NEXTW     NO; DO NEXT WORD
      STB BUFPT,I   RESET THE BUFFER POINTER
      LDB NEXTW     IF WRITE
      SZB           THEN
      STB FLAG,I    SET THE WRITTEN ON FLAG 
EX    ISZ RW$UB     YES; STEP THE RETURN ADDRESS
      JMP RW$UB,I   RETURN
      SPC 2 
ZER0  ISZ RW$UB     STEP FOR GOOD RETURN
      JMP EX        EXIT
      SPC 2 
ENDBL LDB TYPE,I    IF TYPE TWO 
      CPB .2        THEN
      LDB COUNT     IF COUNT IS 
      INB,SZB,RSS   EXAUSTED
      JMP CONT      JUST CONTINUE 
      LDB NEXTW     GET THE READ WRITE FLAG 
      SZB           IF WRITE THEN 
      STB FLAG,I    SET THE BIT IN THE DCB
      CLB,INB       SET FOR NEXT BLOCK
      JSB NX$EC     GO GET IT 
      JMP RW$UB,I   ERROR - RETURN
      LDB BLKLN     OK -
      CMB,INB       RESET 
      STB LEFT      LEFT COUNTER
      LDB BUFA      AND BUFFER POINTER
      JMP CONT      AND CONTINUE
      SPC 1 
READ  LDA B,I       GET THE WORD
      STA PTR,I     SET IN USER BUFFER
      JMP RDW       RETURN TO WRITE CODE
      SPC 2 
COUNT NOP 
BUFA  NOP 
      SPC 2 
$KIP  NOP           SKIP ENTRY
      STB COUNT     SAVE THE WORD COUNT 
      JSB PRAM      GO SET THE PRAMS
      CMA,INA       COMPUTE THE BUFFER
      ADA BUFPT,I   OFFSET
      ADA COUNT     ADD THE COUNT 
      STA B         SET UP FOR DIVID
      ASR 16        EXTENT THE SIGN 
      DIV BLKLN     DIVIDE BY BLOCK LENGTH
      SSB           SKIP IF POSITIVE
      ADA N1        ELSE ADDJUST THE BLOCK
      SSB           IF NEGATIVE 
      ADB BLKLN     ADJUST TO POSITIVE
      ADB BUFA      COMPUTE THE NEW BUFFER ADDRESS
      SWP           PUT BUFFER ADDRESS IN A BLOCK IN B
      SZB,RSS       IF ZERO THE GO TO EXIT
      JMP *+3 
      JSB NX$EC     GO GET THE BLOCK
      JMP $KIP,I    ERROR RETURN
      STA BUFPT,I   SET THE BUFFER ADDRESS IN THE DCB 
      ISZ $KIP      SET TO NORMAL RETURN
      JMP $KIP,I    MAKE NORMAL RETURN
      SPC 1 
PRAM  NOP           FETCH DCB ADDRESS SUBROUTINE
      CLB,CLE       SET UP
      JSB P.PAS     AND 
      DEC -16       FETCH 
DCB   NOP           DCB 
TMP   NOP 
TYPE  NOP 
TR    NOP 
SEC   NOP 
#SEC  NOP 
SAV   NOP 
PTR   NOP           USED AS LOCAL 
SEC/T NOP 
LEFT  NOP           USED AS LOCAL ONLY
CTRK  NOP 
CSEC  NOP 
BUFPT NOP 
FLAG  NOP 
BLKLN NOP 
EXT#  NOP 
      LDB PTR,I     GET THE BLOCK LENGTH WORD 
      BRS,BLR       CLEAR THE LEAST AND SIGN BITS 
      STB BLKLN     SET THE BLOCK LENGTH
      STA BUFA      SET THE BUFFER ADDRESS
      JMP PRAM,I    RETURN TO CALLER
      SKP 
*     NX$EC  COMPUTES THE ADDRESS OF THE NEXT SECTOR
*            FOR ALL READ/WRITE ACCESSES AND FOR
*            SEQUENTIAL POSITIONING.
* 
*     CALLING SEQUENCE: 
* 
*     LDB RELATIVE BLOCK NO.
*     JSB NX$EC 
*     DISCERR/EOF RETURN (ON EXTENDABLE FILES EODISC) 
*          NORMAL RETURN
* 
*     NX$EC  WRITES THE CURRENT SECTOR BUT DOES NOT 
*            SET THE RELATIVE POSITION POINTERS 
*            THE TARGET BLOCK IS READ.
*            IF RFLG$ IS NON 0. 
* 
* 
* 
NX$EC NOP 
      STA SAV       SAVE THE A REG
      LDA B         CONVERT BLOCKS
      CLB,CLE       TO
      MPY BLKLN     SECTORS 
      ASR 6         AND 
      STA SECOF     SAVE
      LDB DCB       GO WRITE THE CURRENT
      JSB R/W$      BLOCK 
      JMP NX$EC,I   IF ERROR RETURN 
      LDA TR,I      COMPUTE THE 
      CMA,INA       RELATIVE SECTOR 
      ADA CTRK,I    ADDRESS 
      MPY SEC/T,I   IN THE FILE 
      LDB SEC,I     AND 
      CMB,INB       THEN
      ADB A         ADD 
      ADB CSEC,I    THE 
      ADB SECOF     CHANGE
      ASR 16        EXTEND TO A 
      DIV #SEC,I    DIVIDE BY FILE SIZE 
      SSB           IF NEGATIVE 
      ADA N1        REMAINDER 
      SSB           CORRECT 
      ADB #SEC,I    RESULT
      SZA           IF DIFFERENT EXTENT 
      JMP EXTND     GO GET ITS ADDRESS
NX$E1 ADB SEC,I     COMPUTE THE NEW 
      LSR 16        TRACK AND 
      DIV SEC/T,I   SECTOR
      ADA TR,I      ADDRESSES 
      STA CTRK,I    AND SET THEM
      STB CSEC,I    IN THE DCB
      LDA RFLG$     IF FLAG CLEARED 
      CCE,SZA,RSS   THEN DO NOT 
      JMP NORD      READ
      LDB DCB       SET UP TO 
      JSB R/W$      READ  AND DO IT 
      JMP NX$EC,I   ERROR RETURN
NORD  ISZ NX$EC     STEP AND
      LDA SAV       RESTOR A
      JMP NX$EC,I   RETURN
      SPC 5 
EXTND STB TMP       SAVE THE RELATIVE SECTOR
      ADA EXT#,I    ADD CURRENT EXTENT NUMBER 
      LDB TYPE,I    GET THE TYPE
      SSA,RSS       IF LESS THAN ZERO 
      CPB .2        OR IFIF TYPE 2 THEN 
      JMP SOF       END OF FILE 
      LDB DCB       GO SET UP 
      JSB RWND$     THE EXTENT
      JMP NX$EC,I   ERROR RETURN
      LDB TMP       GET THE SECTOR OFFSET 
      JMP NX$E1     AND GO COMPUTE THE ADDRESS
SOF   LDA N12       ELSE EOF
      JMP NX$EC,I   RETURN
SECOF NOP 
      SPC 2 
N1    OCT -1
.2    DEC 2 
N12   DEC -12 
      SPC 2 
A     EQU 0 
B     EQU 1 
      SPC 1 
END   EQU * 
      SPC 1 
      END 
                                                                                                                    