.NLIST TTM .TITLE VM.SYS ; VIRTUAL MEMORY HANDLER FOR RT-11 V2 (V2B) ; ; SIMULATES A DISK IN EXTENDED MEMORY ON 11/40, 11/45, AND 11/70 ; PROCESSORS WITH KT11. ; ; "FASTER THAN A SPEEDING BULLET ..." ; -CLARK KENT ; ;R B/MAY 1975 ; WITH RANDOM ASSISTANCE FROM A(C AND HJ ; REGISTER DEFINITIONS R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; MEMORY MANAGEMENT REGISTERS MMSR0= 177572 ;STATUS REG 0 MMSR1= 177574 ;STATUS REG 1 MMSR2= 177576 ;STATUS REG 2 MMSR3= 172516 ;STATUS REG 3 UISDR0= 177600 ;USER I DESC REG 0 UISDR7= 177616 ;USER I DESC REG 7 UISAR0= 177640 ;USER I ADDR REG 0 UISAR7= 177656 ;USER I ADDR REG 7 KISDR0= 172300 ;KERNEL I DESC REG 0 KISDR7= 172316 ;KERNEL I DESC REG 7 KISAR0= 172340 ;KERNEL I ADDR REG 0 KISAR7= 172356 ;KERNEL I ADDR REG 7 ; MISCELLANEOUS DEFINITIONS PS= 177776 ;PROCESSOR STATUS WORD UMODE= 140000 ;CURRENT MODE = USER (IN PS) ADRS22= 000020 ;22-BIT ADDRESSING MODE FOR 11/70 PUMODE= 030000 ;PREVIOUS MODE = USER MODE (IN PS) .REPT 0 ;FOR CLEANLINESS AND BEAUTY THE VM HANDLER IS USED TO ALLOW RT-11 ACCESS TO EXTENDED MEMORY ON PDP-11 MODELS WITH THE KT-11 MEMORY MANAGEMENT UNIT. WHEN INSTALLED IN A SYSTEM, IT ALLOWS ACCESS TO EXTENDED MEMORY AS AN RT-11 FILE- STRUCTURED DEVICE. SIGNIFICANT PERFORMANCE IMPROVEMENTS CAN BE REALIZED BY PLACING OFTEN-REFERENCED FILES IN EXTENDED MEMORY. FOR EXAMPLE, FORTRAN LINK TIMES CAN BE REDUCED BY PLACING THE FORTRAN LIBRARY IN VM. THERE ARE SEVERAL RESTRICTIONS ON THE USE OF THE VM DEVICE. THEY ARE: 1. VM: MUST BE ZEROED USING THE SET COMMAND: SET VM SIZE = N WHERE N REPRESENTS THE NUMBER OF DIRECTORY SEGMENTS DESIRED. UNLESS THE VM: HANDLER IS TO BE USED ON ONLY ONE CONFIGURATION, THE SIZE OF THE DEVICE CANNOT BE PREDICTED, AND THEREFORE THE MONITOR TABLE WHICH IS REFERENCED BY PIP WHEN ZEROING THE DEVICE WILL NOT CONTAIN THE VALID DEVICE SIZE. USERS WHO DO NOT REQUIRE THAT THE HANDLER BE MOVED FROM SYSTEM TO SYSTEM MAY INSTALL IT IN SUCH A WAY AS TO ALLOW NORMAL PIP ZERO (/Z) OPERATIONS (SEE BELOW). 2. THE VM: DEVICE SHOULD NOT BE COMPRESSED USING THE PIP /S COMMAND UNLESS THE HANDLER IS INSTALLED WITH THE NUMBER OF BLOCKS SPECIFIED (SEE BELOW), OR UNPREDICTABLE RESULTS WILL OCCUR. INSTALLATION INSTRUCTIONS: THE VM HANDLER IS INSTALLED IN THE SAME MANNER AS ANY OTHER RT-11 HANDLER, NAMELY, IT IS ASSEMBLED, LINKED, AND THE APPROPRIATE MONITOR LOCATIONS ARE PATCHED. TO ASSEMBLE AND LINK: .R MACRO *VM=VM ERRORS DETECTED: 0 FREE CORE: XXXXX. WORDS *^C .R LINK *VM.SYS=VM *^C . ENTRIES MUST BE MADE IN THE MONITOR TABLES $PNAME, $DVSIZ, $HSIZE, AND $STAT. TWO DIFFERENT PATCHES ARE PROVIDED, ONE WHICH ALLOWS THE HANDLER TO BE USED ON SEVERAL DIFFERENT SYSTEMS (WITH THE RESTRICTIONS LISTED ABOVE), AND ANOTHER WHICH REMOVES THE RESTRICTIONS BUT DOES NOT ALLOW THE HANDLER TO BE TRANSPORTED WITHOUT REPATCHING THE MONITOR. TO MAKE THE APPROPRIATE PATCH TO THE MONITOR, FIND THE LOCATIONS OF THE VARIOUS DEVICE TABLES FOR YOUR PARTICULAR VERSION. FOR INSTANCE, THE LOCATIONS FOR STANDARD RT-11 VERSION 2 MONITORS ARE: TABLE S/J MONITOR F/B MONITOR $HSIZE 012642 013542 $DVSIZ 012676 013576 $PNAME 015470 016612 $STAT 015524 016646 THE FOLLOWING PROCEDURE PATCHES THE MONITOR APPROPRIATELY: 1. FIND THE FIRST FREE DEVICE SLOT IN $PNAME. MODIFY THIS WORD TO CONTAIN THE VALUE 105610 OCTAL (RAD50 FOR VM). 2. MODIFY THE CORRESPONDING $STAT TABLE ENTRY TO CONTAIN 100020 (OCTAL). 3. MODIFY THE CORRESPONDING $HSIZE TABLE ENTRY TO CONTAIN 000322 (OCTAL). 4. IF YOU WISH TO ALLOW THE HANDLER TO BE USED ON SEVERAL DIFFERENT SYSTEMS, MODIFY THE CORRESPONDING $DVSIZ ENTRY TO CONTAIN 0. IF THIS IS DONE, THE SET VM SIZE COMMAND IS USED TO ZERO THE DEVIC, AND THE INSTALLATION PROCEDURE IS COMPLETE. OTHERWISE, TO TAILOR THE HANDLER TO A PARTICULAR CONFIGURATION, DETERMINE THE NUMBER OF AVAILABLE BLOCKS USING THE FORMULA: SIZE = ( [MEMORY IN K WORDS] - 28 ) * 4 CONVERT THIS NUMBER TO OCTAL AND STORE IT IN THE APPROPRIATE ENTRY IN THE $DVSIZ TABLE. THIS WILL ALLOW THE DEVICE TO BE USED WITH COMPLETE GENERALITY IN PIP, PERMITTING THE /Z AND /S OPERATIONS TO TAKE PLACE IN THEIR NORMAL WAY. .ENDR ; SET COMMAND OPTIONS .ASECT .=400 .WORD KISAR0 ;WORD TO PRELOAD INTO R3 .RAD50 /SIZE/ ;NAME OF OPTION .WORD /2+40000 ;OFFSET AND LEGAL OPTIONS FLAG .WORD 0 ;END OF TABLE ; THE SET COMMAND: ; ; SET VM SIZE = N ; ; ZEROES THE VM DEVICE FOR THE MAXIMUM AMOUNT OF MEMORY ; AVAILABLE ON THE PRESENT CONFIGURATION. THE COMMAND ; ARGUMENT N SPECIFIES THE NUMBER OF DIRECTORY SEGMENTS ; TO BE ALLOCATED ON THE ZEROED DEVICE (THIS IS THE ; EQUIVALENT OF THE /N:X SWITCH TO PIP). THIS COMMAND ; MUST BE ISSUED BEFORE THE VM IS USED TO ASSURE A VALID ; RT-11 DIRECTORY IS PRESENT. ; ; NOTE: ; ; VM: CANNOT BE ZEROED USING PIP, BECAUSE THE MONITOR DOES ; NOT KNOW HOW LARGE THIS "DEVICE" IS. .ENABL LSB SIZE: CMP #37,R0 ;CHECK FOR VALID # OF DIR SEGMENTS BLO 6$ ;BOGUS -- GIVE ?ILL CMD? MOV R0,DIRSEG ;ELSE REMEMBER IT FOR LATER BNE 1$ ;BRANCH IF IT WAS SPECIFIED INC DIRSEG ;ELSE DEFAULT TO 1 SEGMENT 1$: MOV PC,R0 ;DO A PIC .TRPSET CALL ADD #TBLK-.,R0 ; TO ALLOW US TO INTERCEPT ADD R0,2(R0) ; TRAPS FROM ILLEGAL MEMORY REFS EMT 375 CLR R0 ;SET LOWEST MEM BLOCK & FLAG FOR TRAP4 MOV #8.,R1 ;NUMBER OF MEM MGMT REGS TO SET UP 2$: MOV #77406,KISDR0-KISAR0(R3) ;SET DESCRIPTOR MOV R0,(R3)+ ;AND BASE ADDRESS ADD #200,R0 ;BUMP BASE BY 4K WORDS SOB R1,2$ ;SET ALL 8 REGS MOV #177600,-(R3) ;KERNAL APR7 MAPS IO PAGE MOV #77406,@#UISDR0 ;SET USER 0-4K MAP BIS #PUMODE,@#PS ;SET PREVIOUS MODE = USER BIS #1,@#MMSR0 ;ENABLE MANAGEMENT MOV #UISAR0,R3 ;R3 -> USER 0-4K APR MOV #1600,@R3 ;MAP OVER 28K-32K MOV #7740,R0 ;SET R0 = MAX APR VALUE BIS #ADRS22,@#MMSR3 ;SET 22-BIT MODE FOR 11/70 TST @#MMSR3 ;IS 11/70 PRESENT? BEQ 3$ ;NOPE - LIMIT IS OKAY MOVB R0,R0 ;ELSE SET R0 = 177740 3$: MFPI @#0 ;TEST ADDRESSES TST (SP)+ ;UNTIL WE TRAP OUT CMP R0,@R3 ;OR MAX IS REACHED BEQ 4$ ;BRANCH IF AT MAX ADD #40,@R3 ;ELSE BUMP BY 1K WORDS AND TRY AGAIN BR 3$ ;UNTIL SOMETHING TAKES 4$: MOV @R3,R0 ;HERE WHEN MEMORY LIMIT FOUND ASR R0 ;GET MEM SIZE IN 256 WORD BLOCKS ASR R0 ASR R0 BIC #160003,R0 ADD #4-<28.*4>,R0 ;R0 = # OF BLOCKS MOV PC,R1 ;GET PIC ADRS OF SAMPLE DIRECTORY ADD #DIRSEG-.,R1 SUB @R1,R0 ;R0 = # OF BLOCKS - DIRECTORY SIZE SUB @R1,R0 ADD R0,22(R1) ;SET SIZE OF EMPTY ENTRY ADD @R1,10(R1) ;AND STARTING FILE BLOCK # ADD @R1,10(R1) MOV #1660,@R3 ;SET APR TO MAP BLOCK 6 OF VM: CLR R3 ;START AT LOC 0 OF BLOCK 6 MOV #13.,R0 ;AND MOVE 13 WORDS OF DIRECTORY 5$: MOV (R1)+,-(SP) ;PUSH THE DIRECTORY WORD MTPI (R3)+ ;AND STORE IN DEVICE SOB R0,5$ CLR @#MMSR0 ;TURN OFF MANAGEMENT 6$: MOV #6,DIRSEG+10 ;RESET FOR NEXT TIME MOV #-6,DIRSEG+22 MOV #TRAP4-TBLK,TBLK+2 RTS PC ;AND RETURN TO KMON TRAP4: CMP (SP)+,(SP)+ ;DUMP PS AND PC TST R0 ;CHECK FLAG SEC ;CARRY SET IN CASE OF ERROR BEQ 6$ ;BRANCH IF NO VM PRESENT SUB #40,@R3 ;ELSE CORRECT SIZE BIS #PUMODE,@#PS ;SET USER PREVIOUS AGAIN BR 4$ ;AND GO MAKE DIRECTORY .DSABL LSB TBLK: .WORD 3*400 ;.TRPSET CODE .WORD TRAP4-TBLK ;AND ADDRESS OF TRAP ROUTINE DIRSEG: .WORD 0,0,1,0,6,1000,0,0,0,-6,0,0,4000 ;SAMPLE DIRECTORY ; LOAD POINT .CSECT VM .WORD 250 ;VECTOR .WORD VMINT-. ;OFFSET TO INTERRUPT SERVICE .WORD 340 ;PR7 VMLQE: .WORD 0 ;POINTER TO LAST Q ENTRY VMCQE: .WORD 0 ;POINTER TO CURRENT Q ENTRY ; ENTRY POINT MOV VMCQE,R3 ;R3 -> QUEUE ELEMENT MOV (R3)+,R2 ;R2 = BLOCK NUMBER ASL R2 ASL R2 ASL R2 ;R2 = VM MEMORY BLOCK # ADD #1600,R2 ; + 28K WORDS CLR R4 ;R4 = MEMORY BLK # MOV #UISAR0,R1 ;R1 -> USER I ADDRESS REGS MOV #8.,R0 ;8 REGS TO LOAD VMSET: MOV #77406,UISDR0-UISAR0(R1) ;LOAD USER DESC REG MOV #77406,KISDR0-UISAR0(R1) ;LOAD KERNEL DESC REG MOV R4,KISAR0-UISAR0(R1) ;LOAD KERNEL I ADDR REG MOV R4,(R1)+ ;AND USER I ADDR REG ADD #200,R4 ;BUMP ADDR BY 4K SOB R0,VMSET ;AND LOOP TO SET UP ALL 8 MOV R2,-(R1) ;MAP VM BLK OVER USER I/O PAGE MOV #37406,@#UISDR7 ;WITH A LENGTH OF 2K WORDS MOV #177600,@#KISAR7 ;MAP I/O PAGE TO KERNEL MOV #160000,R5 ;R5 -> BASE OF I/O PAGE BIS #ADRS22,@#MMSR3 ;SET 22-BIT MODE FOR 11/70 (ELSE NOP) BIS #UMODE,@#PS ;GO INTO USER MODE BIS #1,@#MMSR0 ;ENABLE MANAGEMENT TST (R3)+ ;SKIP UNIT NUMBER IN Q ELEMENT MOV (R3)+,R0 ;R0 = BUFFER ADDRESS MOV @R3,R4 ;R4 = WORD COUNT BMI VMWRT ;IF NEGATIVE, WRITE REQUEST BEQ VMTRAP ;IF SEEK THEN DONE IMMEDIATELY INC R4 ;FOLD WORD COUNT TO SPEED TRANSFER ASR R4 BCC VMR2 VMREAD: MOV (R5)+,(R0)+ ;COPY TO USER BUFFER VMR2: MOV (R5)+,(R0)+ SOB R4,VMREAD ;LOOP UNTIL TRANSFER COMPLETE BR VMTRAP ;THEN GO TO COMMON EXIT VMWRT: NEG R4 ;MAKE WORD COUNT POSITIVE INC R4 ;FOLD WORD COUNT TO SPEED TRANSFER ASR R4 BCC VMW2 VMWRIT: MOV (R0)+,(R5)+ ;MOVE A WORD FROM USER BUFFER VMW2: MOV (R0)+,(R5)+ SOB R4,VMWRIT ;LOOP UNTIL TRANSFER COMPLETE MOVB @R3,R4 ;CHECK IF ZERO-FILL REQ'D BEQ VMTRAP ;NOPE - MULTIPLE OF A BLOCK VMCLR: CLR (R5)+ ;ELSE CLEAR A WORD DECB R4 ;UNTIL REACH A BLOCK BOUNDARY BNE VMCLR VMTRAP: CLR @#MMSR0 ;TRY TO TURN OFF MANAGEMENT MOV PC,R4 ;POINT TO Q ELEMENT AGAIN ADD #VMCQE-.,R4 MOV @#54,R0 ;GET BASE OF RMON JMP @270(R0) ;AND DISPATCH ELEMENT ; ABORT ENTRY BR VMTRAP ;ABORT BY DISABLING MANAGEMENT ; INTERRUPT SERVICE VMINT: MOV #160000,R5 ;RESET TO POINT TO BASE OF I/O PAGE ADD #100,@#UISAR7 ;AND REMAP TO NEXT 2K CHUNK MOV @#MMSR2,R1 ;R1 = VIRTUAL PC OF ERROR CMP @R1,(PC)+ ;CHECK FOR R0 MODIFICATION MOV (R0)+,(R5)+ ; ON THIS INSTRUCTION ONLY! BNE 1$ ;NOT THIS ONE, SO SKIP CORRECTION TST -(R0) ;ELSE UPDATE 1$: BIC R5,@#MMSR0 ;CLEAR SEGMENT LENGTH FAULT MOV PC,R2 ;GET ADDR OF EXIT CODE ADD #VMTRAP-.,R2 ; IN R2 CMP R1,R2 ;TRYING TO EXIT? BNE VMRTI ;NOPE BIC R5,2(SP) ;ELSE RETURN TO KERNEL MODE VMRTI: MOV R1,@SP ;RESTART INSTRUCTION RTI ;AND EXIT $INPTR: .WORD 0 ;FOR COMPATIBILITY .END