ASMB,L,C
      NAM GES.C,7 92060-16102 780728 REV. 1901 $CLIB
* 
* REVISED USE OF D.RPx TO .Rx FOR RTE-LC
* 
*     NAME:    GES.C
*     SOURCE:  92060-18068
*     PGMR:    EARL STUTES
* 
*************************************************************** 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977.  ALL RIGHTS     * 
* RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE-  * 
* REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * 
* OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.   * 
*************************************************************** 
      SPC 2 
* THIS PROCEDURE DOES ALL OF THE WORK NECESSARY TO MAKE THE NEXT
* SECTOR AVAILABLE TO THE COMPILER LIBRARY FOR BOTH READ AND WRITE
* OPERATIONS. 
      SPC 4 
* PROC READWRITE(R/WFLG); 
* VALUE R/WFLG; BOOLEAN R/WFLG; 
* R/WFLAG IS PASSED IN A
* BEGIN 
* INTEGER TRACK,
*         .128 := 128,
*         SECTOR, 
*         REQCODE;
*   REQCODE := (IF R/WFLAG THEN 1 ELSE 2);
*   TRACK := STARTRACK+(STARTSECTOR/2+OFFSETBLOCK)/BLOCKSPERTRACK;
*   SECTOR := ((STARTSECTOR/2 + OFFSETBLOCK) MOD BLOCKSPERTRACK)*2; 
*   EXEC(REQCODE,FCB.LU,BUFFER,128,TRACK,SECTOR); 
*   IF STATUS <> 0 THEN 
*   BEGIN 
*     A := -1;
*     ERROR RETURN & P+1
*   END 
*   ELSE
*     NORMAL RETURN & P+2 
* END OF READWRITESECTOR; 
      SKP 
      ENT RW#EC 
      EXT EXEC
      EXT C.STR     EXTENT START TRACK
      EXT C.SSC     EXTENT START SECTOR 
      EXT C.BFF     THE BUFFER POINTER
      EXT C.RSC     CURRENT OFFSET BLOCK
      EXT C.S/T     BLOCKS PER TRACK
      EXT C.FLU     THE LU OF INTEREST
* PROC READWRITE(R/WFLG); 
* VALUE R/WFLG; BOOLEAN R/WFLG; 
* BEGIN 
* INTEGER TRACK,
TRACK BSS 1 
*         .128 := 128,
.128  DEC 128 
*         SECTOR, 
SECTR BSS 1 
*         REQCODE,
REQCD BSS 1 
      SPC 3 
RW#EC BSS 1 ENTRY POINT 
*   REQCODE := (IF R/WFLAG THEN 1 ELSE 2) 
      CLB,INB 
      SZA,RSS 
      INB 
      STB REQCD 
*   TRACK := FCB.STARTTRACK+(STARTSECTOR/2 + OFFSETBLOCK) / BLOCKSPERTRACK; 
      LDB C.SSC,I 
      BRS 
      ADB C.RSC,I 
      ASR 16
      DIV C.S/T,I 
      ADA C.STR,I 
      STA TRACK 
*   SECTOR := ((STARTSECTOR/2+OFFSETBLOCK) MOD BLOCKSPERTRACK)*2; 
      BLS 
      STB SECTR 
      LDA C.BFF 
      INA 
      STA .DBUF 
*   EXEC(REQCODE,FCB.LU,BUFFER,128,TRACK,SECTOR); 
      JSB EXEC
      DEF *+6+1 
      DEF REQCD 
      DEF C.FLU,I 
.DBUF BSS 1 
      DEF .128
      DEF TRACK 
      DEF SECTR 
*   IF STATUS <> 0 THEN 
      SLA 
      CCA,RSS 
      ISZ RW#EC 
      JMP RW#EC,I 
*   BEGIN 
*     A := -1;
*     ERROR RETURN & P+1
*   END 
*   ELSE
*     NORMAL RETURN & P+2 
* END OF READWRITESECTOR; 
      SKP 
*PROC GETNEXTSECTOR(R/WFLAG); 
*VALUE R/WFLAG; BOOLEAN R/WFLAG;
* R/WFLAG IS PASSED IN THE A REGISTER;
*BEGIN
*INTEGER COUNT; 
*IF FCB.OFFSETBLOCK = FCB.NUMBEROFBLOCKS THEN 
*[ FCB.EXTENT := FCB.EXTENT + 1;
*  GETEXTENT(3,R/WFLAG);
*    FCB.STARTTRACK := RETURNP4;
*    FCB.STARTSECTOR ;= RETURNP5 AND @377;
*  FCB.OFFSETBLOCK ;= 0;];
*IF R/WFLAG THEN
*[ READWRITE(R/WFLAG,BUFFER,COUNT); 
*  IF ERROR THEN GO ERROR EXIT;]
*ELSE 
*  IF WRITEBUFFER THEN
*  [ READWRITE(R/WFLAG,BUFFER,COUNT); 
*    IF ERROR THEN GO ERROR EXIT;]; 
*FCB.OFFSETBLOCK := FCB.OFFSETBLOCK + 1;
*IF FCB.BP > 128 THEN 
*  FCB.BP := FCB.BP - 128;
*ELSE 
*  FCB.BP := 1; 
*IF R/WFLAG THEN
*  BUFFERVALID := TRUE
*ELSE 
*  WRITEBUFFER := FALSE;
*END OF GETNEXTSECTOR;
      SKP 
*PROC GETNEXTSECTOR(R/WFLAG); 
*VALUE R/WFLAG; BOOLEAN R/WFLAG;
* R/WFLAG IS PASSED IN THE A REGISTER 
      ENT GES.C 
      ENT GE#SC 
      EXT C.FAD     FILE DIRECTORY WORD D 
      EXT C.FLU     FILE LU WORD
      EXT C.EXT     FCB EXTENT #
      EXT GEX.C     CALLD.RTR PROCEDURE 
      EXT .R4     D.RTR RETURNP4
      EXT .R5     D.RTR RETURNP5
A     EQU 0 
B     EQU 1 
RWFLG BSS 1         R/WFLAG VALUE HOLDER
*BEGIN
.1    DEC 1 
      SPC 2 
GES.C BSS 1         ENTRY 
GE#SC EQU GES.C 
      STA RWFLG     SAVE THE PARAMETERS 
*IF FCB.OFFSETBLOCK = FCB.NUMBEROFBLOCKS THEN 
      EXT C.RSC     OFFSETBLOCK WORD IN FCB 
      EXT C.#SC     NUMBEROFBLOCKS WORD IN FCB
      LDB C.RSC,I 
      CPB C.#SC,I 
      JMP *+2 
      JMP L1
*[ FCB.EXTENT := FCB.EXTENT + 1;
      ISZ C.EXT,I 
*  CALLD.RTR(3,R/WFLAG);
      LDA =D3 
      JSB GEX.C 
      DEF RWFLG 
*    IF ERROR THEN GO ERROR EXIT; 
      JMP GES.C,I 
*    FCB.STARTTRACK := RETURNP4;
      LDA .R4 
      STA C.STR,I 
      EXT C.SSC     THE EXTENT START SECTOR 
*    FCB.STARTSECTOR ;= RETURNP5 AND @377;];
      LDA .R5 
      AND =B377 
      STA  C.SSC,I
*    FCB.OFFSETBLOCK ;= 0;];
L4    CLA 
      STA C.RSC,I 
*IF R/WFLAG THEN
L1    LDA RWFLG 
      SZA 
      JMP L5
*  IF WRITEBUFFER THEN
      LDB C.BFF,I 
      SSB,RSS 
      JMP L7
* [ READWRITE(R/WFLAG); 
L5    JSB RW#EC 
*   IF ERROR THEN GO ERROR EXIT;];
      JMP GES.C,I 
*  FCB.OFFSETBLOCK := FCB.OFFSETBLOCK + 1;
L7    ISZ C.RSC,I 
* EXIT: 
*IF FCB.BP > 128 THEN 
EXIT  EQU * 
      LDA BP,I
      ADA =D-129
      SSA,INA 
*  FCB.BP := FCB.BP - 128 
*ELSE 
*  FCB.BP := 1; 
      CLA,INA 
      STA BP,I
      EXT C.WRD     THE BUFFER OFFSET POINTER 
BP    EQU C.WRD 
*IF R/WFLAG THEN
      ISZ RWFLG 
      CLA,RSS 
*  BUFFERVALID := TRUE
      CLA,INA 
*ELSE 
*  WRITEBUFFER := FALSE;
      STA C.BFF,I 
      ISZ GES.C 
      JMP GES.C,I 
      END 
                                                                                                                  