ASMB,L,R,C,Q
      HED RW$UB 
*     NAME:   RW$UB 
*     SOURCE: 92067-18143 
*     RELOC:  92067-16125 
*     PGMR:   G.A.A.,N.J.S. 
* 
*  ***************************************************************
*  * (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.       *
*  ***************************************************************
* 
      NAM RW$UB,7 92067-16125 REV.1903 781003   
      EXT RWND$, R/W$, RFLG$
      EXT EXEC, P.PAS 
      EXT .DAD, .DMP, .DDI, .DNG
      ENT RW$UB, $KIP, NX$EC
      SUP 
* 
* 
* 
*     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$UB     CALL
*     DEF BUF       BUFFER CONTAING (WRITE) OR RECIEVING (READ) 
*     JMP ERROR     ERROR RETURN  CODE IN A 
*     ---    NORMAL RETURN
* 
* 
* 
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 BUFA      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           NOP IF READ   RSS IF WRITE
      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
      LDA FLAG,I    IF
      LDB NEXTW      WRITE
      CCE             THEN
      SZB              SET THE
      RAR,ELA           WRITTEN-
      STA FLAG,I         ON FLAG
EX    ISZ RW$UB     STEP THE RETURN ADDRESS 
      JMP RW$UB,I   RETURN
* 
* 
ZER0  ISZ RW$UB     STEP FOR GOOD RETURN
      JMP EX        EXIT
* 
* 
ENDBL LDB TYPE,I    IF TYPE TWO 
      CPB .2        THEN
      LDB COUNT     IF COUNT IS 
      INB,SZB,RSS   EXAUSTED
      JMP CONT      JUST CONTINUE 
      LDA FLAG,I    GET DCB WRITTEN-ON FLAG 
      LDB NEXTW     GET THE READ\WRITE FLAG 
      CCE           IF WRITING
      SZB            THEN SET 
      RAR,ELA         THE DCB 
      STA FLAG,I       WRITTEN ON FLAG
      CLA           SET TO GET NEXT BLOCK 
      CLB,INB       (SENDING DOUBLE WORD 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 
* 
READ  LDA B,I       GET THE WORD
      STA PTR,I     SET IN USER BUFFER
      JMP RDW       RETURN TO WRITE CODE
* 
* 
COUNT BSS 2 
BUFA  NOP 
* 
* 
*    ENTRY    A = DCB ADDRESS 
*             B = # WORDS TO SKIP 
* 
* 
$KIP  NOP           SKIP ENTRY
      STB COUNT+1   MAKE THE WORD COUNT 
      SSB            A DOUBLE WORD INTEGER
      CCB,RSS         TAKING INTO ACCOUNT 
      CLB              WHETHER IT IS POSITIVE 
      STB COUNT         OR NEGATIVE 
      JSB PRAM      GO SET THE PRAMS
      LDB BUFA      COMPUTE 
      CMB,INB        THE
      ADB BUFPT,I     BUFFER
      CLA              OFFSET 
      JSB .DAD      ADD THE DOUBLE
      DEF COUNT      WORD COUNT 
      SWP 
      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
      STB TMP       SAVE NEW BUFFER ADDRESS 
      SZA,RSS       IF RELATIVE BLOCK IS ZERO,
      JMP SK1        THEN GO EXIT 
      LSL 16
      SSB 
      CCA 
      JSB NX$EC     GO GET THE CORRECT BLOCK
      JMP $KIP,I    ERROR RETURN
SK1   LDA TMP 
      STA BUFPT,I   SET THE BUFFER ADDRESS IN THE DCB 
      ISZ $KIP      SET TO NORMAL RETURN
      JMP $KIP,I    MAKE NORMAL RETURN
* 
* 
*   ENTRY   A CONTAINS DCB ADDRESS
* 
*   EXIT    A CONTAINS DCB BLOCK LENGTH IN WORDS
* 
* 
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 
TMP1  NOP 
FLAG  NOP 
SEC/T NOP 
LEFT  NOP           USED AS LOCAL ONLY
CTRK  NOP 
CSEC  NOP 
BUFPT NOP 
PTR   NOP           USED AS LOCAL 
BLKLN NOP 
EXT#  NOP 
      STA BUFA      SAVE BUFFER ADDRESS 
      LDA FLAG,I    GET THE BLOCK LENGTH WORD 
      AND BLMSK     MASK TO BITS 14 - 7 
      STA BLKLN     SET THE BLOCK LENGTH
      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: 
* 
*     DLD 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 
      DST SECOF     SAVE THE RELATIVE BLOCK NUMBER
      CLA           CONVERT BLOCKS (A BLOCK 
      LDB BLKLN      IS AN ENTIRE DCB 
      JSB .DMP        BUFFER IN THIS CASE)
      DEF SECOF        TO LOGICAL SECTORS 
      SWP 
      ASR 6 
      SWP 
      DST SECOF     RELATIVE SECTOR OFFSET
* 
      CLE           SET E TO INDICATE WRITE 
      LDB DCB       GO WRITE THE
      JSB R/W$       CURRENT BLOCK
      JMP NX$EC,I   IF ERROR, RETURN P+1
* 
      CLB 
      LDA #SEC,I    GET FILE SIZE IN +SECTORS OR -TRACKS
      SSA,RSS       +SECTORS ALREADY? 
      JMP NX1       YES 
      CMA,INA       NO - CONVERT
      LSL 8          TO SECTORS 
NX1   SWP           GET TO A,B REGISTERS
      DST SIZE       AND SAVE 
* 
      LDA TR,I      COMPUTE THE RELATIVE
      CMA,INA       SECTOR ADDRESS IN 
      ADA CTRK,I      THE FILE
      MPY SEC/T,I 
      SWP 
      JSB .DAD      (TR - CTRK)SEC/T +
      DEF SECOF      RELATIVE SECTOR OFFSET 
      DST SECOF 
* 
      LDB SEC,I 
      CMB,INB 
      ADB CSEC,I
      CLA           RELATIVE SECTOR OFFSET +
      SSB               (TAKE INTO ACCOUNT THAT 
      CCA                THIS COULD BE NEGATIVE)
      JSB .DAD       ((TR - CTRK)SEC/T) + (CSEC - SEC)) 
      DEF SECOF 
      DST SECOF 
* 
      JSB .DDI      DIVIDE BY FILE (EXTENT) SIZE
      DEF SIZE      RELATIVE EXTENT IN A,B
      STB TMP1      SAVE IT  (KNOW < 256 EXTENTS/FILE)
      JSB .DMP      MANIPULATE TO GET REMAINDER 
      DEF SIZE       MULTIPLY BY SIZE AND 
      JSB .DNG        SUBTRACT FROM ORIGINAL
      JSB .DAD         DIVIDEND.
      DEF SECOF     A,B = SECOF - (SECOF/SIZE)*SIZE 
      DST SECOF     SAVE RELATIVE SECTOR OFFSET 
* 
      SSA,RSS       IF REMAINDER IS POSITIVE
      JMP NX2        THEN SKIP
      JSB .DAD      CORRECT SECTOR
      DEF SIZE       OFFSET IN FILE 
      DST SECOF       AND SAVE
      LDB TMP1      CORRECT THE 
      ADB N1         EXTENT # 
      STB TMP1
NX2   LDB TMP1      IF DIFFERENT
      SZB            EXTENT GO GET
      JMP EXTND       ITS ADDRESS 
* 
NX$E1 CLA           COMPUTE 
      LDB SEC,I      THE NEW
      JSB .DAD        TRACK AND 
      DEF SECOF        SECTOR 
      SWP               ADDRESS 
      DIV SEC/T,I 
      ADA TR,I
      STA CTRK,I    SET THEM
      STB CSEC,I      IN THE DCB
* 
      LDA RFLG$     IF READ FLAG IS 
      CCE,SZA,RSS    CLEARED THEN 
      JMP NORD        DON'T READ
      LDB DCB       SET UP TO READ
      JSB R/W$      GO DO IT
      JMP NX$EC,I   ERROR RETURN
NORD  ISZ NX$EC     STEP TO P+2 
      JMP NX$EC,I    AND RETURN 
* 
* 
* 
* 
* 
EXTND ADB EXT#,I    ADD CURRENT EXTENT NUMBER 
      LDA TYPE,I    GET THE TYPE
      SSB,RSS       IF EXTENT IS LESS THAN ZERO 
      CPA .2         OR IF TYPE 2 THEN
      JMP SOF         END OF FILE 
      LDA B         GO SET
      LDB DCB        UP THE 
      JSB RWND$       EXTENT
      JMP NX$EC,I   ERROR RETURN
      JMP NX$E1     GO COMPUTE NEW TRACK\SECTOR ADDRESS 
SOF   LDA N12       ELSE EOF
      JMP NX$EC,I   RETURN
* 
* 
BLMSK OCT 77600 
N1    OCT -1
N12   DEC -12 
* 
.2    DEC 2 
* 
SECOF BSS 2 
SIZE  BSS 2 
* 
A     EQU 0 
B     EQU 1 
* 
END   EQU * 
* 
      END 
                                                                                                                                                              