.TITLE ALTWND ; ; A L T W N D ; ; ALTER AN APR AND CALL USER SUBROUTINE TO DO DATA ; MOVES INTO THAT APR. USED TO SEND OR RECEIVE DATA FROM A ; COMMON AREA INTO WHICH NO NORMAL ACCESS EXISTS. ; THIS ROUTINE ASSUMES IT IS RUNNING UNDER RSX11M MAPPED ; WITH PREVIOUS MODE = KERNEL. TO SET PREVIOUS KERNEL MODE ; ONE MAY INSTALL A TASK AND ZAP THE INITIAL PS BITS FOR ; PREVIOUS MODE TO 0 (CLEAR THE 30000 BITS SO THE INITIAL ; PS IS 140000 RATHER THAN 170000 NORMALLY). TO BE SURE ; THIS CONDITION REMAINS, CHANGE ALL "PMODE" CASES IN ; RSX11M TO 0. NOTE THAT FOR RSX11M+ THIS IS MORE COMPLEX ; DUE TO SUPERVISOR MODE INTERACTIONS AND ONE CANNOT JUST ; SET PMODE=0 BEFORE ASSEMBLY. ; ; TO USE ALTWND: ; MOV #,R0 ; MOV #,R1 ; JSR PC,ALTWND ; ROUTINE MAY USE ANY REGISTERS AND MUST RETURN VIA RTS PC. ; IT RUNS AT PRI 7 AND MUST USE THE ADDRESS RANGE SELECTED ; FOR ALTWND FOR TE APR. THIS EXAMPLE USES APR 7 (160000-177777) ; AS THE APR BEING REMAPPED. ; ; THE FOLLOWING DEFINES APR NUMBER APRN=7 ;DEFINE OFFSETS NOW PSW=177776 ;PSW PARO=APRN+APRN UAPR=177640+PARO UPDR=177600+PARO ;USER PAR, PDR REGS USED ; ; IF IT IS NOT NECESSARY TO SAVE REGISTERS FOR THE DATA MOVE SUBROUTINE ; REMOVE THE ";" FROM THE NEXT LINE ; XR.SV=0 ; ALTWND:: MFPI @#PSW ;SAVE OLD PSW MFPI @#UAPR ;ALSO OLD APR MFPI @#UPDR ;AND PDR MOV #140340,-(SP) ;SET PRI 7, PREV KNL MODE MTPI @#PSW ;;;INHIBIT INTERRUPTS MOV R1,-(SP) ;;;GET ADDRESS OF COMMON AREA IN PHYS MEM MTPI @#UAPR ;;;MAP TO IT MOV #77406,-(SP) ;;;SET UP 4K R/W ACCESSS MTPI @#UPDR ;;;INTO THAT APR TOO ;;; ;;;NOW THE USER MAY ACCESS THE 4K REGION OF MEMORY (WITH INTERRUPTS ;;;INHIBITED) VIA THE ADDRESSES APPROPRIATE TO THE APR USED. .IF NDF,XR.SV ;;; CALL HIS ROUTINE TO DO SO AFTER SAVE OF ALL REGISTERS MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) ;;;SAVE ALL REGISTERS FOR USER ROUTINE .ENDC ;;; ;;; NOW CALL THE USER SUBROUTINE TO DO ACTUAL DATA MOVES ;;; JSR PC,@R0 ;;;CALL USER'S ROUTINE .IF NDF,XR.SV ;;; ;;; NOW RESTORE CONTEXT AND RETURN MOV (SP)+,R5 ;;;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 .ENDC MTPI @#UPDR ;;;RESTORE USER PDR MTPI @#UAPR ;;;AND APR MTPI @#PSW ;FINALLY RESTORE PSW TO ALLOW INTERRUPTS AGAIN RTS PC ;AND RETURN TO USER ; ; S E T P K N - SET PREVIOUS KERNEL MODE ; ; WORKS AFTER BASH11M HAS RUN, OR ALWAYS ON RSX11M+, FOR MAINLINE. ; ;METHOD: ; ISSUES MARKTIME FOR A MARKTIME AST USING E.F. #20. AND IN THE AST ; ALTERS THE RETURN PSW TO PREVIOUS KERNEL MODE. .MCALL ASTX$S .MCALL MRKT$S,WTSE$S SETPKN:: MRKT$S #20.,#3,#1,#PKXIT ;WAIT 3 TICKS, AST TO PKXIT WTSE$S #20. ;WAIT FOR THE AST TO EXPIRE RTS PC ; MARKTIME AST... ; ASSUMES STACK HAS $DSW, PC, PS IN THAT ORDER. PKXIT: TST (SP)+ ;POP OFF EVENT FLAG NUMBER BIC #30000,4(SP) ;CLEAR PREVIOUS MODE TO KERNEL ON PS ASTX$S ;EXIT THE AST .END