.TITLE RECURS .IDENT /RSX.V4/ .ASECT .GLOBL N.OVPT,$AUTO,.SAVR1,$WRERR .PSECT .PSECT $$AUTP .PSECT $SEGST .PSECT $$AUTP ;TO ASSURE ALLOCATION IMMEDIATELY AFTER $$AUTO ; ; ; AT SEGMENT READ TIME ( CALL SUBR ) THE OLD SEGMENT ID IS SAVED ; AND THE NEW SEGMENT ID IS STACKED. ; THE TRANSFER TO THE SUBROUTINE IS CHANGED FROM RETURN IN SAVRG$ ; TO A CALL. THIS ASSURES THAT THE RETURN GIVES CONTROL TO THIS ; SEGMENT HANDLING ROUTINE. THE CURRENT SEGMENT ID CAN BE ; POPPED OFF THE STACK AND THE OLD SEGMENT IS BROUGHT INTO CORE. ; ; TWO BRANCH INTRUCTIONS MUST BE PATCHED INTO THE $$AUTO ROUTINE. ; ; $AUTO+10 := BR .+20 (THIS IS JUST A CHANGE FROM BNE TO BR ) ; $AUTO+36 := BR SEGENT ( FOR RSX 4.0 BR SEGENT=441 ) ; ( FOR RSX 4.1 BR SEGENT=431, AUTO CHANGED.. ) ; MOV (R5),ENTRYP MOV #SEGEXIT,14(SP) SUB #2,SEGP ;POINTER TO SEGMENT STACK CMP SEGP,#SEGP ;SEE IF 'STACK' OVERFLOW BEQ 99$ ;IF SO TELL USER MOV R2,@SEGP ;ELSE MOVE POINTER TO SEGM. DESC. TABLE JMP $AUTO+42 ;READ SEGMENT, WHEN READY CNTRL IS ; ;TRANSFERRED TO SEGEXIT. 99$: JSR R4,$WRERR ;COME HERE ON ERROR (TABLE EXHAUSTED ) .BYTE 70.,1 SEGEXIT: CALL @ENTRYP ;MAKE A CALL TROUGH TEH TABLE TO THE JSR R5,.SAVR1 ;WANTED ROUTINE MOV @#N.OVPT,R1 ADD #2,SEGP ;SKIP TEH SEGMENT JUST READ MOV @SEGP,R2 ;READ IN THE OLD SEGMENT BEQ 9$ ;NO OLD SEGMENT ? BIT #10000,(R2) ;YES BEQ 9$ ;SEGMENT ALREADY THERE JMP $AUTO+42 ;YES 9$: RETURN .PSECT $SEGST ENTRYP: .WORD 0 SEGP: .WORD SEGSTND SETSTK: .BLKW 100 SEGSTND: .WORD 0 .PSECT $$AUTP .=.-112 E00262= .+262 .END