M.MMP=0;THIS IS A MULTIPROCESSOR MONITOR! .TITLE WNDMNG ;WINDOW DEFINE AND MESSUP ;IF "R$$11D" IS DEFINED, ASSEMBLE TO USE STANDARD IAS DIRECTIVES ;FOR ALL MAPPING. SLOWER, BUT USABLE. THIS ALLOWS MSX TO RUN UNDER IAS. ;R$$11D=0 ;UNCOMMENT FOR IAS VERSION OF MSX .IF NDF,R$$11D ;NO HDR DEF FOR RSX11D/IAS .MCALL HDRDF$ HDRDF$ .ENDC ;ASSUMES EXTERNAL PAGE ADDRESSES ARE AVAILABLE TO THE TASK ;CALLING IT. ; ; THIS ROUTINE IS THE PART OF THE (/PR:0) MAIN PROGRAM ;THAT WILL CALL A PRIVILEGED TASK TO OBTAIN ITS WINDOW ADDRESSES ;AND SUITABLE PCB ADDRESSES WITHIN THE EXECUTIVE. IT USES ITS ;ABILITY TO EXPLICITLY MAP THE PSW AND THE USER APR'S TO ;CHANGE THE TASK'S MAPPING BY ALTERING ALL COPIES OF THE WINDOW ;BLOCKS USED BY RSX TOGETHER. THESE COPIES ARE: ; 1. THE COPY INSIDE THE RSX NODE POOL WHILE THE TASK ; IS ACTIVE ; 2. THE COPY IN THE TASK HEADER IN ITS LOW ADDRESS SPACE ; 3. THE WINDOW CONTROL BLOCK USED IN RSX DIRECTIVES ; ;THE ASSUMPTION OF THIS ROUTINE IS THAT THE TASK IS FIXED AND MAY ;BE NEITHER CHECKPOINTED NOR SHUFFLED DURING EXECUTION. THE ;PARTITION CONTROL BLOCK DATA IS TREATED AS CONSTANT DURING ;EXECUTION, AND STRANGE AND HORRIBLE THINGS WILL HAPPEN IF THE ;TASK EVER MOVES WHILE EXECUTING. IT IS NECESSARY TO FIX THE ;TASK, NOT MERELY MAKE IT NON-CHECKPOINTABLE, TO GUARANTEE ;AGAINST SHUFFLING. ; ; THE APR ITSELF WILL BE SET LAST, AFTER THE RSX COPIES ;ARE SET, BUT THE ENTIRE SETUP OPERATION WILL OCCUR AT PRIORITY ;7 TO PREVENT RSX FROM EVER SEEING WHAT IS GOING ON. ; ;FOR SIMPLICITY, 2 ROUTINES WILL BE DEFINED HERE, AND REGION AND ;WINDOW CONTROL BLOCKS WILL BE LOCATED HERE. ; ; THE ROUTINE WNDSET WILL SET UP THE REGIONS AND WINDOWS. ; THE ROUTINE WNDCLR WILL REMOVE THEM (SHOULD BE CALLED ; JUST PRIOR TO EXIT FROM THE TASK) .IDENT /GCE000/ ;GCE, 3/28/79 .MCALL DIR$,GREG$,MAP$,CRRG$,CRAW$,ELAW$,DTRG$ .MCALL RDBDF$,WDBDF$,RDBBK$,WDBBK$ WDBDF$ RDBDF$ .MCALL SPND$S,SDAT$,RQST$,RCVD$ ; FIRST, GENERATE RSX REGIONS. TO AVOID COMPLEXITY, ;BUILD THIS TASK WITH RSX11M.STB BUT WITH /PR:0 TO AVOID ;USING EXTRA ADDRESS SPACE. THIS SECTION WILL RUN USING ;MFPI/MTPI TO COMMUNICATE WITH KERNEL MODE FOR A FEW ;INSTRUCTIONS; THAT LOOKS LIKE LESS SPACE THAN THE EQUIVALENT ;RSX CONTROL BLOCKS WOULD REQUIRE TO GO INTO THE NODES ;THEMSELVES. IT WILL SET PREVIOUS KERNEL MODE TO GRAB ;DATA AT PRIO 7, THEN RESTORE THE PSW TO ITS PRISTINE ;ORIGINAL STATE (AT PRIO 0 THEN) SO RSX CANNOT FIND OUT ;ABOUT IT. ; THIS LOOKS STRANGE BUT IS SYMBOLIC AND LOCALIZED ;AND THUS CANNOT CAUSE PROBLEMS. ; THESE ROUTINES WILL ASSUME ALL WINDOWS ARE 4K WORDS ;LONG, READ/WRITE. ; THE TASK SHOULD BE TASKBUILT WITH ENOUGH OF AN EXTTSK ;TO GUARANTEE THAT ALL APR'S REALLY ARE FULL IN THE AREAS ;USED FOR OVERLAYS. EXTSCT MAY BE NEEDED. THE PDR'S ARE ;TO BE SET UP AT 4K R/W ACCESS ALWAYS. ; LATER, THE PDR'S MAY BE SET UP EACH TIME TOO... ; ; CONTROL BLOCKS FOR 1 REGION, 4 WINDOWS INTO IT. ; (ASSUMES 3 APR'S USED FOR TASK MAPPING AND THAT ; THESE CREATE 3 WINDOWS) ; RDB:: RGNK=20. ;SIZE OF REGION IN K WORDS RGSIZ=RGNK*40 ;MULTIPLY OUT TO GET SIZE IN 32 WORD BLOCKS RDBBK$ RGSIZ,EDXDAT,GEN,273,0 ;RWED ACCESS FOR EVERYBODY ;REGION GETS ATTACHED TO THIS TASK AND DELETED ON ;EXIT. WDB3:: WDBBK$ 3,200,0,0,200,603 WDB4:: WDBBK$ 4,200,0,200,200,603 WDB5:: WDBBK$ 5,200,0,400,200,603 WDB6:: WDBBK$ 6,200,0,600,200,603 ;ALL THE ABOVE ARE 4K WINDOWS R/W MEMORY. ACCESS TO OTHERS MAY BE R/W ;BUT NOBODY ELSE GETS DELETE/EXTEND PRIVILEGES. ;(NEITHER DO WE-- THIS SCHEME DISALLOWS EXTENDING WINDOWS.) WDBTBL: .WORD 0 ;APR 0 NOT IN A WINDOW BLOCK .WORD 0 ;APR 1 NOT IN A WINDOW BLOCK .WORD 0 ;APR 2 NOT IN A WINDOW BLOCK .WORD WDB3 ;APR 3 MAPPED BY WDB3 .WORD WDB4 ;APR 4 MAPPED BY WDB4 .WORD WDB5 ;APR 5 MAPPED BY WDB5 .WORD WDB6 ;APR 6 MAPPED BY WDB6 .WORD 0 ;APR 7 IS ALWAYS EXTERNAL PAGE. ; ;NOW ON TO IT. CRRG: CRRG$ RDB CRAW3: CRAW$ WDB3 CRAW4: CRAW$ WDB4 CRAW5: CRAW$ WDB5 CRAW6: CRAW$ WDB6 MAP3: MAP$ WDB3 ;SET UP APR TO WINDOW 3 MAP4: MAP$ WDB4 MAP5: MAP$ WDB5 MAP6: MAP$ WDB6 ELAW3: ELAW$ WDB3 ELAW4: ELAW$ WDB4 ELAW5: ELAW$ WDB5 ELAW6: ELAW$ WDB6 DTRG: DTRG$ RDB WNDSET:: DIR$ #CRRG ;CREATE THE DATA REGION MOV RDB+R.GID,R5 MOV R5,WDB3+W.NRID MOV R5,WDB4+W.NRID MOV R5,WDB5+W.NRID MOV R5,WDB6+W.NRID ;COPY REGION ID TO WINDOWS DIR$ #CRAW3 ;CREATE WINDOW FOR APR3 DIR$ #CRAW4 ;CREATE APR4 WINDOW DIR$ #CRAW5 DIR$ #CRAW6 ;LIKEWISE APR5,APR6 ;NOW SET UP MAPPING TO THE WINDOWS TO BE SURE ;PDR PRTOTYPES AND RSX MAP WINDOWS ARE SET UP. DIR$ #MAP3 DIR$ #MAP4 DIR$ #MAP5 DIR$ #MAP6 ;MAP ALL WINDOWS WE CREATED FOR DATA. ; ;HERE SET UP TO DO OUR OWN BASHING LATER ON... ; ; ; N.B. WE WILL NOT DO ANYTHING TO THE PDR'S OR TO THE ;PDR PROTOTYPES NOW... THEY ***MUST*** BE SET UP CORRECTLY VIA ;TASKBUILDS. IT IS ASSUMED THAT RESIDENT OVERLAYS ARE LOADED ;(MOST LIKELY VIA MANUAL LOAD) PRIOR TO CALLING THIS ROUTINE ;WITH ALL COPIES, AND THAT THE LAST-LOADED ONES WILL AT LEAST ;BE MAPPED FOR ALL 4K OF SPACE (OR AT LEAST THE LARGEST AMOUNT ;OF SPACE TO BE USED FOR THAT APR). ; ;NOW GET HEADER IN KERNEL SPACE .IF NDF,R$$11D .IFF ;IAS MOV #.CRTSK,R0 ;GET MY ATL ADDRESS JSR PC,GETKNL ;LOAD FROM KERNEL MODE MOV R0,MYHDR ;SAVE IT FOR LATER MOV #177640,R0 ;USER APR 0 MOV #8.,R1 ;SAVE ALL INITIAL APR'S MOV #PCBLST,R2 ;SAVE IN PCBLST ARRAY ;ASSUME THAT ALL MAPS ARE WRT INITIAL. PROBABLY FALSE, BUT INITIAL TRY 15$: MOV (R0)+,(R2)+ ;COPY SOB R1,15$ ;ALL APR'S INTO PCBLST .IFT ;RSX11M MOV #$HEADR,R0 ;CURRENT TASK HEADER ADDRESS JSR PC,GETKNL ;FIND IT THERE MOV R0,MYHDR ;SAVE HEADER ADDRESS FOR LATER COMPARING ADD #H.WND,R0 ;NOW POINT AT NO. WINDOWS JSR PC,GETKNL ;LOCATE THE ADDR IN KNL SPACE MOV R0,R3 ;SAVE JSR PC,GETKNL ;FIND NUMBER OF WINDOWS MOV R0,R2 ;R2 = NO. WINDOWS ADD #2,R3 ;R1 NOW POINTS AT FIRST WINDOW ;NOW LOOP THROUGH ALL WINDOWS AND SET UP OUR ACCESS CONTROL BLOCKS. 10$: MOV R3,R0 ;FORM WINDOW LOC ADD #W.BPCB,R0 ;POINT AT PCB ADDRESS JSR PC,GETKNL ;FIND IT MOV R0,R4 ;R4 IS PCB ADDR IN KNL BEQ 40$ ;IF 0, MAP IS NOT REALLY THERE...IGNORE IT ADD #P.REL,R4 ;R4 NOW IS PRTTN ADDR IN 32 WORD BLOCKS ;MUST FIND WHICH APR IT IS TO STORE THINGS. MOV R3,R0 ;GET BACK WINDOW LOC ADD #W.BLVR,R0 ;POINT AT LOW VIRT ADDR JSR PC,GETKNL ;GET VIRT ADDR IN R0 JSR PC,GETAPR ;R1 NOW HAS APR NUMBER ASL R1 ;MAKE IT AN INDEX. MOV R4,R0 ;NOW GET PRTTN ADR FOR PCBLST JSR PC,GETKNL ;FIND IT IN KERNEL SPACE MOV R0,PCBLST(R1) ;SAVE FOR LATER MOV R3,R0 ;POINT AT WINDOW AGAIN ADD #W.BOFF,R0 ;THEN AT PHYS MEM. OFFSET IN PARTITION MOV R0,WBFLST(R1) ;SAVE FOR LATER USE IN MAPPING 40$: ADD #W.BLGH,R3 ;UPDATE TO NEXT WINDOW DEC R2 ;SEE IF ANY MORE WINDOWS ARE LEFT BGT 10$ ;IF SO DO THEM ALL 11$: MOV #H.NLUN,R0 ;FIND NO. WINDOWS IN HEADER MOV @R0,R2 ;GET NO.LUNS ASL R2 ASL R2 ;MULT. BY 4 FOR LUN TABLE ADD #2,R0 ;PASS NO. LUNS ADD R2,R0 ;PASS LUN TABLE ;R0 NOW POINTS AT COPY OF HEADER IN LOW CORE... H.WND POINTS AT ; KERNEL SPACE!! ;TO ALLOW FOR POSSIBLE DIFFERENCES IN NO. WINDOWS KNOWN TO RSX AND IN ;HEADER, DO AS SEPARATE LOOPS. MOV @R0,R2 ;NO. WINDOWS MOV R2,R3 ;SET UP WINDOW POINTER ADD #2,R3 ;PASS NO. WINDOWS ; 12$: MOV W.BLVR(R3),R0 ;LOW VIRT ADDR OF BLOCK JSR PC,GETAPR ;GET APR NO. ASL R1 ;MAKE INDEX MOV R3,LBFLST(R1) ;SAVE MEM OFFSET LOCALLY ADD #W.BOFF,LBFLST(R1) ADD #W.BLGH,R3 ;NOW UPDATE TO NEXT WINDOW DEC R2 ;SEE IF DONE LAST WINDOW BGT 12$ ;DO ALL IF NOT .ENDC ;R$$11D RTS PC ; ;GETAPR SUB IS FOR STARTUP; IT USES THE WINDOW VIRTUAL ADDRESSES TO ;COMPUTE THE START APR NUMBER OF EACH WINDOW. THIS ALLOWS TESTING OF ;THESE ROUTINES WHERE PROGRAMS DO NOT OCCUPY ALL APR'S. ;NOTE THAT EXEC ADDRESSES ARE TO BE STORED AS 0 FOR THE CASE OF NO ;WINDOW. ; INPUT: R0 = W.BLVR OF WINDOW BLOCK ; OUTPUT: R1=APR NUMBER IF FOUND ; OTHER REGS DESTROYED: R2 ; .IF NDF,R$$11D LOADR: .WORD 0,20000,40000,60000,100000,120000,140000 .WORD 160000 HIADR: .WORD 17777,37777,57777,77777,117777,137777,157777,177777 GETAPR: MOV R2,-(SP) ;SAVE R2 ACROSS CALL CLR R1 ;START WITH APR 0 MOV #8.,R2 ;8 APR'S TO CYCLE THROUGH 1$: CMP R0,LOADR(R1) ;IS ADDR HIGHER THAN BOTTOM OF APR? BLO 2$ ;NO, SKIP IT CMP R0,HIADR(R1) ;IS IT ALSO LOWER THAN TOP OF APR? BHI 2$ ;NO, FORGET IT ;FOUND IT! ASR R1 ;DIVIDE R1 BY 2 FOR APR NUMBER BR 3$ ;SCRAM 2$: ADD #2,R1 ;BUMP R1 BY AN APR INDEX DEC R2 ;SEE IF MORE... BGT 1$ ;IF SO KEEP LOOKING 3$: MOV (SP)+,R2 ;RESTORE R2 RTS PC .ENDC ; ;GETKNL SUB LOADS WHATEVER IS POINTED AT BY R0 IN KERNEL SPACE. ;WRD RETURNS IN R0. INVISIBLE TO RSX. GETKNL: MOV @#177776,-(SP) ;SAVE OLD PSW MOV #140340,@#177776 ;PRIO 7 PREV MODE = KERNEL MFPI @R0 ;LOAD WHATEVER WAS POINTED AT BY R0 TO ;STACK MOV (SP)+,R0 ;RETURN IT IN R0 MOV (SP)+,@#177776 ;BACK TO OLD PSW RTS PC .IF DF,LSTAPR APRLST: .WORD 177640 ;PAR 0 .WORD 177642 ;PAR 1 .WORD 177644 ;PAR 2 .WORD 177646 ;PAR 3 .WORD 177650 ;PAR 4 .WORD 177652 ;PAR 5 .WORD 177654 ;PAR 6 .WORD 177656 ;PAR 7 USER MODE .ENDC .GLOBL PCBLST,WBFLST,LBFLST,WDBTBL .GLOBL MYHDR MYHDR: .WORD 0 ;THIS TASK'S $HEADR CONTENT PCBLST: .BLKW 8. ;LIST OF PCB ADDRESSES (CONTENTS OF ;PCB+P.REL FOR EACH APR WINDOW) WBFLST: .BLKW 8. ;WINDOW BUFF WORD ADDRESSES IN EXEC LBFLST: .BLKW 8. ;WINDOW BUFFERS IN LOCAL SPACE PER APR ; THE ABOVE TABLES ARE USED TO ACCESS COPIES OF APR'S ;TO BASH THEM QUICKLY GIVEN A NEW OFFSET AND APR NUMBER. ; WNDCLR:: DIR$ #ELAW3 ;ELIMINATE WINDOW ON APR3 DIR$ #ELAW4 DIR$ #ELAW5 DIR$ #ELAW6 ;AND APR 4,5, AND 6 DIR$ #DTRG ;DETACH REGION TO LET RSX FREE THE SPACE. RTS PC ;BACK TO CALLER. ; ; M A P P E R ; ; MAIN MAPPING SUBROUTINE TO CHANGE APR'S. ; PERFORMS NO ERROR CHECKS--USE CORRECTLY OR DIE!! ; INPUTS: ; R0=APR NUMBER - 0 THROUGH 6 LEGAL (APR7 MUST MAP THE ; I/O PAGE) ; R1=NUMBER TO PUT INTO THE APR ; ALL OTHER REGISTERS DESTROYED. SAVE PRIOR TO CALL ; (POSSIBLY VIA ANOTHER SUB TO CALL THIS ONE) IF YOU WANT ; THEM SAVED/RESTORED. ; ; THIS ROUTINE IS WRITTEN TO EXECUTE IN USER MODE. A ROUTINE ;OPERATING FROM AN INTERRUPT SERVICE ROUTINE CAN BASH THE RSX MAPS ;BUT CANNOT LOCATE TASK COPIES. ; .GLOBL MAPPER .GLOBL MAPOFF .GLOBL MAPCMN,MAPOF2 ;MAPCMN IS MAPPER ENTRY WITH ;R0 = TWICE THE APR NUMBER. ;MAPOF2 IS MAPOFF ENTRY WITH R0 = TWICE ;THE APR NUMBER. ;MAPOFF IS LIKE MAPPER EXCEPT THAT ITS INPUT IN R1 IS THE OFFSET FROM ;THE BASE OF THE REGION RATHER THAN THE ACTUAL NUMBER TO STUFF INTO ;THE APR. IT SHOULD BE EASIER TO USE THAN MAPPER... .IF NDF,R$$11D MAPOFF: ASL R0 ;MAKE A BYTE INDEX OUT OF APR NUMBER MAPOF2: ADD PCBLST(R0),R1 ;MAKE APR VALUE OUT OF OFFSET FROM BASE BR MAPCMN ;MERGE WITH MAPPER. MAPPER: ASL R0 ;MAKE OFFSET OF APR NUMBER MAPCMN: MOV PCBLST(R0),R2 ;GET PARTITION BASE FOR THIS APR BEQ 1$ ;IF NONE, HE IS NOT MAPPED...NO ACTION MOV R1,R3 ;COPY NO. TO PUT INTO APR SUB R2,R3 ;GET OFFSET BY COMPLEX MATHEMATICAL FORMULA ; **************************************** ; FOLLOWING SECTION REPLACED TO SPEED UP THE CODE ; ********************************************* ; MOV @#177776,-(SP) ;SAVE CURRENT PSW ; MOV #140340,@#177776;FILL IN PRIORITY 7, PREV MODE=KERNEL ; MOV R3,-(SP) ;SET TO BASH RSX WINDOW OFFSET ; MTPI @WBFLST(R0) ;BASH RSX OFFSET ; TST LBFLST(R0) ;SEE IF THERE IS A LOCAL WINDOW ; BEQ 2$ ;IF NOT FORGET MOD ; MOV R3,@LBFLST(R0) ;IF SO, CHANGE IT ;2$: TST WDBTBL(R0) ;SEE IF THERE IS A LOCAL WINDOW ; BEQ 3$ ;IF NOT, SKIP CHANGES ; MOV WDBTBL(R0),R2 ;GET WINDOW ADDR ; MOV R3,W.NOFF(R2) ;AND SET IT UP TOO. ;3$: MOV R1,@APRLST(R0) ;BASH THE APR ; MOV (SP)+,@#177776 ;GO BACK TO NORMAL PRIO, AND PREV MODE. ; ************************************ ; NEW CODE, LIKE THE ABOVE REPLACED SECTION IN FUNCTION BUT FASTER ; THOUGH IT USES MORE REGISTERS. ; ************************************ CLR R5 ;SET UP TO USE FASTER ADDRESS MODES TO BASH MOV -(R5),R4 ;APR'S. SAVE CURRENT PSW IN R4 HERE. MOV #140340,@R5 ;SET NEW PS FOR PRI 7, PREV KERNEL MODE MOV R3,-(SP) ;PREPARE TO MOVE R3 TO KERNEL SPACE MTPI @WBFLST(R0) ;DO THE MOVE .IF DF,FL.CTX ;FULL CONTEXT (ALL RSX DATA) IF DEFINED... ; ****************************** ; NOTE: THE SECTION IMMEDIATELY FOLLOWING IS PROBABLY NOT NEEDED ; FOR CORRECT RSX-11M OPERATION BUT IS THERE FOR SAFETY. ; ******************************** MOV LBFLST(R0),R2 ;GET LOCAL HDR WINDOW ADDR IF ANY BEQ 2$ ;IF 0, NONE EXISTS SO FORGET MOD MOV R3,@R2 ;ELSE BASH THE HEADER COPY 2$: MOV WDBTBL(R0),R2 ;GET WDB ADDR IF ONE EXISTS FOR THIS APR BEQ 3$ ;IF 0, NONE THERE. MOV R3,W.NOFF(R2) ;ELSE BASH WINDOW DESCR. BLK. LOCALLY TOO. ; ******************************* ; END OF PROBABLY UNNECESSARY SECTION ; ********************************** .ENDC .IF DF,LSTAPR 3$: MOV R1,@APRLST(R0) ;CHANGE THE ACTUAL APR NOW .IFF 3$: MOV R1,177640(R0) ;CHANGE THE ACTUAL APR NOW .ENDC MOV R4,@R5 ;FINALLY RESTORE PSW FROM BEFORE 1$: RTS PC .IFF ;IAS MAPOFF: ASL R0 MAPOF2: BR MAPCM2 MAPPER: ASL R0 MAPCMN:; SUB PCBLST(R0),R1 ;GET WINDOW BLK VALUE MAPCM2: MOV WDBTBL(R0),R2 ;GET WINDOW BLK BEQ MPX ;IGNORE ZERO MOV R1,W.BOFF(R2) ;ELSE FILL IN OFFSET .MCALL MAP$S MAP$S R2 ;MAP IT IN VIA IAS MPX: RTS PC ;THEN DONE .ENDC ;CONTEXT SAVE/RESTORE FOR ALL APR'S ; USE AS FAST (RELATIVELY!) REPLACEMENT FOR APR SWITCHING ; LOGIC IN STANDALONE SYSTEMS. ; NOTE: ; THESE ROUTINES WILL SAVE/RESTORE ONLY APR'S 1-6 ; LEAVING APR 7 ALONE FOR I/O PAGE AND APR 0 ALONE FOR ROOT. ; ; THESE RESTRICTIONS CANNOT REALLY BE HELPED, SINCE THIS ROUTINE ; AND ITS DATA BASE MUST BE MAPPED IN IN ANY CASE, AND SINCE ; IT DEPENDS ON I/O PAGE MAPPING TO CONTROL THINGS... ; GCE .GLOBL A.PRSV,A.PRRS ;APR SAVE/RESTORE ;CALL VIA JSR PC,A.PRSV OR JSR PC,A.PRRS A.PRSV: .IF NDF,R$$11D MOV #177642,R0 ;POINT AT APR 1 (PAR, NOT PDR) .REPT 6. MOV (R0)+,-(SP) ;SAVE A PAR .ENDR .IFF MOV #WDBTBL+2,R0 ;IN IAS, IGNORE REAL APR'S. .REPT 6 MOV (R0)+,R5 BEQ .+6 ;GET WINDOW BLK ADDR MOV W.BOFF(R5),-(SP);SAVE IF IT IS THERE .ENDR .ENDC MOV 14(SP),PC ;RETURN WITHOUT POPPING ; ;A.PRRS ASSUMES AN A.PRSV CALL IS ON STACK WITH OLD RETURN CELL FOR ; POPPING OFF APR'S. A.PRRS: .IF NDF,R$$11D MOV (SP)+,14(SP) ;COPY RETURN UP STACK CLR R5 MOV -(R5),R4 ;SAVE PSW MOV #140340,@R5 ;PRI 7, PREV KERNEL MODE (RSX11M... REG SET 0) MOV #PCBLST+16,R0 ;PCB ADDRESSES MOV #WBFLST+16,R2 ;R2 GETS WINDOW ADDR LIST MOV #177656,R1 ;R1 GETS APR ADDRESS STARTING WITH APR 6 ;NOW GO DOWN VIA AUTODECREMENT FROM APR6 THRU APR1 ; POPPING PAR'S OFF STACK AND TREATING THEM... .REPT 6. ;REPEAT TO AVOID LOOP DELAY .IF DF,CK.APR ;IF CHECKING NONZERO APR MAPPINGS... TST -2(R0) ;SEE IF 0 PCB BASE (NO WINDOW INDICATOR) BNE .+10 CMP (SP)+,-(R1) ;FLUSH STACK AND R1 POINTER CMP -(R0),-(R2) ;FLUSH PCB BASE PTR AND KNL ADDR PTR BR .+14 ;SKIP PAST UPDATE .ENDC ;DONE WINDOW CHECK BUSINESS MOV (SP)+,R3 ;GET OLD APR MOV R3,-(R1) ;SAVE IN NEW ONE SUB -(R0),R3 ;FORM OFFSET FROM PCB BASE FOR WINDOW MOV R3,-(SP) ;SAVE IN RSX VIA PUSH OF DATA MTPI -(R2) ;AND GOING TO KERNEL ADDRESS .ENDR MOV R4,@R5 ;RETURN TO OLD PSW .IFF MOV #1,R5 ;APR NO. .REPT 6 MOV R5,R0 ;APR NO. INC R5 MOV (SP)+,R1 ;NEW VALUE JSR PC,MAPPER ;GET IAS TO MAP IT IN. SAVES R4,R5 .ENDR .ENDC RTS PC .END