; ; ; B$GETNEXT - INTERNAL ROUTINE TO READ NEXT BLOCK OF SIBLINGS ; ; ; B$GETNEXT ; ; B$GETNEXT - READS NEXT BLOCK OF SIBLINGS ; ; ROUTINE NAME: B$GETNEXT ; ; PURPOSE: To read in the next block of sibblings in a data- ; base file. ; ; CALLABLE: From MACRO only. ; ; PARAMETERS: ; R2 The level stack pointer. ; R3 The pointer to the I/O block for this level. ; R4 The pointer to the root block. ; Returns carry bit set on error. ; ; ROUTINES USED: B$IOERROR, READVB and WRITEVB macros ; ; EXAMPLE: ; MOV 2(R5),R4 ; MOV RT.BUF(R4),R3 ; MOV RT.PCL(R4),R2 ; JSR PC,B$GETNEXT ; BCS ERROR ; ; FEATURES: Writes out the I/O buffer if it contains a modi- ; fied block. ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO11 with SUPERMAC ; ; OBJECT MODULE NAME: B$GETN ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;REGESTER ASSIGNMENTS ROOT=R4 BUF=R3 LEVEL=R2 .MCALL SUPER SUPER PROCEDURE B$GETNEXT IF #FL.ACT SET.IN LV.FLG(LEVEL) ;LEVEL MUST BE ACTIVE LET BUF := RT.BUF(ROOT) ;GET BUFFER ADDRESS IF DB.PNB(BUF) NE #0 ;DOES THIS BLOCK HAVE SIBBLINGS? ;SHULD I WRITE OUT THE LAST ;BLOCK THAT SAT HERE? IF #FL.MOD SET.IN LV.FLG(LEVEL) ;YES WRITEVB LV.PCB(LEVEL),BUF ;CLEAR THE MOD BIT SO THAT ;THE NEXT BLOCK WONT BE WRITTEN LET LV.FLG(LEVEL) := LV.FLG(LEVEL) OFF.BY #FL.MOD END ;INITALIZE THE POINTER TO THE ;CURRENT BLOCK TO THE NEW BLOCK LET LV.PCB(LEVEL) := DB.PNB(BUF) ;READ IT IN READVB LV.PCB(LEVEL),BUF IF DB.BLT(BUF) EQ #"DB RETURN NOERROR ELSE LET RT.FLG := . SET.BY #FL.COR ;FILE IS CORRUPT END END END RETURN ERROR ENDPROCEDURE B$GETNEXT .END