; ; ; B$ACTIVATE INTERNAL ROUTINE TO ACTIVATE A LEVEL ; ; ; ; B$ACTIVATE ; ; B$ACTIVATE INTERNAL ROUTINE TO ACTIVATE A LEVEL ; ; ROUTINE NAME: B$ACTIVATE ; ; PURPOSE: To read in the first block of sibblings and ini- ; talize the stack entry for the current level of a ; database file. ; ; CALLABLE: From MACRO programs only. ; ; PARAMETERS: ; R0 Is used as a scratch variable. ; R2 Level stack pointer. ; R3 Is returned as current I/O buffer address. ; R4 Pointer to root block. ; Returns carry bit set for failure. ; ; ROUTINES USED: B$IOERROR, WRITEVB and READVB macros ; ; EXAMPLE: ; MOV @RT(R5),R4 ; MOV R4,R2 ; ADD #RT.1ST+LV.SIZE,R2 ; JSR PC,B$ACTIVATE ; BCS ERROR ; ; FEATURES: Writes out the I/O buffer if it contains a ; modified data block. ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO11 with SUPERMAC ; ; OBJECT MODULE NAME: B$ACTI ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;REGESTER ASSIGNMENTS ROOT=R4 BUF=R3 LEVEL=R2 .MCALL SUPER SUPER PROCEDURE B$ACTIVATE ;DIG UP THE BLOCK NUMBER FOR THIS LEVEL OUT OF THE LAST LEVEL LET R0 := LV.PCE-LV.SIZE(LEVEL) ;R0 NOW POINTS TO THE PARENT KEY IF RESULT IS EQ ;IS THERE A PARENT KEY? RETURN ERROR ;PREVIOUS LEVEL HAS NO KEYS END IF (R0) EQ #0 ;IS THE PARENT A DELETED KEY? RETURN ERROR ;PREVIOUS LEVEL POINTS TO INACTIVE KEY???? END ;SKIP TO THE END OF THE PARENT KEY LET R0 := R0 + LV.LEN-LV.SIZE(LEVEL) - #2 LET R0 := @R0 ;AND GET IT'S OFSPRING BLOCK NUMBER IF RESULT IS EQ ;DOES THIS KEY NAVE ANY DATA? RETURN ERROR ;PREVIOUS KEY HAS NO DATA BLOCKS END LET BUF := RT.BUF(ROOT) ;GET THE BLOCK NUMBER FOR THIS LEVEL IF LV.PCB(LEVEL) NE R0 ;IS THAT BLOCK HERE ALREADY? ;IS THERE A BLOCK HERE NOW THAT ;HAS BEEN MODIFIED? IF #FL.MOD SET.IN LV.FLG(LEVEL) ;YES, WRITE IT OUT BEFORE READIN ;IN THE NEXT ONE WRITEVB LV.PCB(LEVEL),BUF ;AND CLEAR THE MOD BIT TO PREVENT ;THIS NEW BLOCK FROM BEING WRITTEN LET LV.FLG(LEVEL) := LV.FLG(LEVEL) OFF.BY #FL.MOD END LET LV.PCB(LEVEL) := R0 ;STORE THE NEW BLOCK NUMBER IN STACK READVB R0,BUF ;AND READ IT INTO CORE END IF DB.BLT(BUF) NE #"DB ;MAKE SURE THIS IS A DATA BLOCK LET RT.FLG(ROOT) := . SET.BY #FL.COR ;ITS NOT, FILE CORRUPT RETURN ERROR END LET LV.PCE(LEVEL) := BUF ;RESET THE KEY POINTER TO THE TOP ;OF THE NEW BLOCK ; ;NOW YOU CAN FLAG THIS LEVEL AS ;BEING ACTIVE LET LV.FLG(LEVEL) := . SET.BY #FL.ACT ;JUST IN CASE, SET THE NEXT LEVEL ;DOWN AS INACTIVE LET LV.FLG+LV.SIZE(LEVEL) := . OFF.BY #FL.ACT RETURN NOERROR ENDPROCEDURE B$ACTIVATE .END