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