.TITLE MN10.. NODE MANIPULATION ROUTINES .IDENT /MN10../ .PAGE ; N$SQUEEZE:: ;COMPRESS NODE TABLE ; ; EXIT CONDITIONS ; ERROR OR SUCCESS STATUS ONLY ; CALL N$SETUP ;IS NODE TABLE SET UP IFSUCCESS 20$ ;J IF TABLE SET UP 10$: RETURN ;EXIT IF ERROR ; 20$: SAVE R0,R1,R2 TST NLOST ;ARE ANY BYTES LOST BEQ 61$ ;J IF NO WORK TO DO MOV NFIRST,R0 ;HOLD ADDRESS OF FIRST NODE MOV R0,R2 ;HOLD ADDRESS OF OUTPUT POSITION ; 30$: MOV 2(R0),R1 ;HOLD MAXIMUM SIZE OF NODE BEQ 60$ ;J IF THIS IS THE LAST NODE BIC #100000,R1 ;REMOVE PROTECT FLAG IF SET ADD #6,R1 ;ADD HEADER SIZE TO NODE SIZE BIT #100000,@R0 ;IS NODE MARKED FOR DELETE BNE 50$ ;J IF NODE MARKED FOR DELETE ; 40$: MOVB (R0)+,(R2)+ ;COPY ACROSS ALL BYTES IN NODE SOB R1,40$ ;LOOP TO END OF NODE BR 30$ ;PROCESS NEXT NODE ; 50$: ADD R1,R0 ;INCREMENT INPUT POINTER PAST NODE ADD R1,NFREEB ;ADD RELEASED BYTES TO FREE COUNT SUB R1,NLOST ;REDUCE LOST BYTE COUNT SUB R1,NUSEDB ;REDUCE USED BYTE COUNT DEC NNODE ;REDUCE NUMBER OF NODE IN TABLE COUNT BR 30$ ;PROCESS NEXT NODE ; 60$: MOV R2,NLASTADD ;HOLD LAST NODE ADDRESS MOV NFIRST,R0 ;HOLD ADDRESS OF FIRST NODE MOV R0,NNEXT ;POINT NEXT TO ACCESS AT FIRST NODE MOV R0,NPRESENT ;PRESENT NODE IS FIRST NODE CLR (R2)+ ;LOAD A TERMINATION BLOCK IN NODE TABLE CLR (R2)+ CLR @R2 SETSUCCESS 62$ ;SET SUCCESS FLAG AND BRANCH ; 61$: SETERROR ;SET FAIL FLAG 62$: UNSAVE R0,R1,R2 ;RESTORE REGISTERS EXITSUCCESS ; .END ;