;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; THIS PROGRAM WAS WRITTEN BY ELIE MAY TO LEARN HOW MEMORY ; ; MANAGEMENT WORKS. THIS PROGRAM AS IT STANDS SHOULD RUN ON A ; ; PDP 11/45, 34, OR 40 WITHOUT ANY CHANGES. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .MCALL .REGDEF,.PRINT,.EXIT .GLOBL BTOA .REGDEF .MACRO DEFINE,SYMBOL,BASE,NUM SYMBOL'0= BASE SYMBOL'1 = BASE+NUM SYMBOL'2 = BASE+<2*NUM> SYMBOL'3 = BASE+<3*NUM> SYMBOL'4 = BASE+<4*NUM> SYMBOL'5 = BASE+<5*NUM> SYMBOL'6 = BASE+<6*NUM> SYMBOL'7 = BASE+<7*NUM> .ENDM .MACRO EQUATE,SYM1,SYM2 SYM1'0= SYM2'0 SYM1'1= SYM2'1 SYM1'2=SYM2'2 SYM1'3= SYM2'3 SYM1'4= SYM2'4 SYM1'5= SYM2'5 SYM1'6= SYM2'6 SYM1'7= SYM2'7 .ENDM PS = 177776 ;PROCESSOR STATUS WORD CBIT = 1 ;CARRY BIT VBIT = 2 ;OVERFLOW BIT ZBIT = 4 ;ZERO BIT NBIT = 10 ;NEGATIVE BIT TBIT = 20 ;TRAP BIT DEFINE BR,0,40 REG0.7 = 0 ;USE HARDWARE REGISTERS 0-7 REG8.15 = 4000 ;USE HARDWARE REGISTERS 8-15 KERNEL = 0 ;KERNEL MODE SUPER = 1 ;SUPERVISOR USER = 3 PREVIOUS= 10000 ;BITS 12,13 FOR PREVIOUS MODE CURRENT= 40000 ;BITS 14-15 FOR CURRENT MODE ;;;;;;;;;;;;;;;;;;; STKLIM = 177774 ;STACK LIMIT PIR = 177772 ;PROGRAM INTERRUPT REGISTER SWITCHS= 177570 ;SWITCH REGISTER ;;;;; MEMORY MANAGEMENT ;;;;;;; SR0 = 177572 ;STATUS REGISTER 0 SR1 = 177574 ;STATUS REGISTER 1 SR2 = 177576 ;STATUS REGISTER 2 SR3 = 172516 ;STATUS REGISTER 3 ;SR0 BIT DEFINITIONS MMENABLE= 1 ;ENABLE MEMORY MANAGEMENT ;PAGENUMBER BITS 1-3 ;MODE BITS 5-6 ;MAINTENANCE BIT 8 RDOABRT = 20000 ; READ ONLY ABORT PLABRT = 40000 ; PAGE LENGTH ABORT NRABRT = 100000 ;NON RESIDENT ABORT ; SR1 DEFINITION ; SR1 SHOWS ANY REGISTERS THAT HAVE CHANGED IN THE COURSE ; OF EXECUTING THE INSTRUCTION THAT CAUSED THE MEMORY MANAGEMENT ; TRAP. THE LOW 3 BITS OF EACH OF THE TWO BYTES SHOWS THE ; REGISTER NUMBER AND THE UPPER 5 BITS SHOWS THE 2'S ; COMPLEMENT OF THE AMOUNT THE REGISTER CHANGED BY. ; ; SR2 DEFINITION ; SR2 CONTAINS THE BEGINNING ADDRESS OF THE INSTRUCTION THAT CAUSED ; THE MEMORY MANAGEMENT TRAP. THEREBY IF A PAGE IS REQUESTED AND ; IS NOT IN MEMORY WE CAN READJUST ANY REGISTERS THAT CHANGED IN THE ; TRAP AS REFERENCED IN SR1 AND REPLACE THE STACK VALUE FOR THE NEXT ; INSTRUCTION WITH SR2 AND RE-EXECUTE THE INSTRUCTION THAT CAUSED ; THE TRAP AFTER EITHER PARS ARE ADJUSTED OR THE PAGE IS READ IN ; FROM SOME EXTERNAL DEVICE. ; NOTE **** SR1 IS USED IN THE PDP 11/45 ONLY **** ; DEFINE U1SDR,177600,2 ;DEFINE USER1 DESCRIPTOR REGS. DEFINE UDSDR,177620,2 ;USER D SPACE DESCRIPTOR REGISTORS DEFINE U1SAR,177640,2 ;USER 1 SPACE ADDRESS REGISTERS DEFINE UDSAR,177660,2 ;USER D SPACE ADDRESS REGISTERS DEFINE S1SDR,172200,2 ;SUPERVISOR 1 SPACE DESCRIPTOR REGISTERS DEFINE SDSDR,172220,2 ;SUPERVISOR D SPACE DESCRIPTOR REGISTERS DEFINE S1SAR,172240,2 ;SUPERVISOR 1 SPACE ADDRESS REGISTERS DEFINE SDSAR,172260,2 ;SUPERVISOR D SPACE ADDRESS REGISTERS DEFINE K1SDR,172300,2 ;KERNEL 1 SPACE DESCRIPTOR REGISTERS DEFINE KDSDR,172320,2 ;KERNEL D SPACE DESCRIPTOR REGISTERS DEFINE K1SAR,172340,2 ;KERNEL 1 SPACE ADDRESS REGISTERS DEFINE KDSAR,172360,2 ;KERNEL SPACE ADDRESS REGISTERS ;;;;;;;;;;;;;;; LOCAL KERNEL TEST ;;;;;;;;; EQUATE PAR,K1SAR ;PAGE ADDRESS REG. IS FOR KERNEL EQUATE PDR,K1SDR ;PAGE DESCRIPTOR FOR KERNEL EQUATE UPAR,U1SAR ;USER PAGE ADDRESS REGISTERS EQUATE UPDR,U1SDR ;USER DESCRIPTOR REGISTERS ;;;;;;;;;;;; DESCRIPTION OF PAR AND PDR ;;;;;;;;;;;;; ; PAR CONTAINS A 12 BIT PAGE NUMBER (BITS 0-11) ; ; PDR - PAGE DESCRIPTION REGISTER ; ; FIELD BITS FUNCTION ; ----- ---- --------- ; ACF 0-2 ACCESS CONTROL FIELD 000 = NON-RESIDENT(ERROR) ; 001 = READ-ONLY ; 010 = READ-ONLY ; 011 = UNUSED ; 100 = READ/WRITE ; 101 = READ/WRITE ; 110 = READ/WRITE ; 111 = UNUSED ; ; ED 3 EXPANSION DIRECTION 0 EXPAND UP FROM RELATIVE 0 ; 1 EXPAND DOWN ; ; PLF 8-14 PAGE LENGTH FIELD 7 BITS(1-128BLOCKS) UP = 0 ;EXPANSION DIRECTION NONRES = 0 ;NON RESIDENT RDONLY = 2 ;RESIDENT READ ONLY RD.WRT = 6 ;ALLOW READ/WRITE BLOCK = 400 ;BLOCK SIZE ADRSVEC = 4 ;ADDRESS ERROR INSVEC = 10 ;INSTRUCTION ERROR BPTVEC = 14 ;BPT VECTOR IOTVEC = 20 ;IOT VECTOR PWRVEC = 24 ;POWER FAIL VECTOR EMTVEC = 30 ;EMT VECTOR TRPVEC = 34 ;TRAP VECTOR KBVEC = 60 ;INPUT VECTOR FOR TTY PRVEC = 64 ;OUTPUT VECTOR FOR TTY PRVEC = 70 ;PAPER TAPE READER VECTOR PPVEC = 74 ;PAPER TAPE PUNCH VECTOR KW11LVEC= 100 ;LINE CLOCK VECTOR KW11PVEC= 104 ;PROGRAMMABLE CLOCK VECTOR MEMVEC = 114 ;MEMORY SYSTEM ERROR PIRQVEC = 240 ;PROGRAM INTERRUPT REQUEST FPPVEC = 244 ;FLOATING POINT ERROR MMVEC = 250 ;MEMORY MANAGEMENT VECTOR START: MOV @#ADRSVEC,SAV4 ;FOR VECTOR RESTORATION MOV @#INSVEC,SAV10 ; MOV @#MEMVEC,SAV114 MOV @#MMVEC,SAV250 MOV #ADRSERR,@#ADRSVEC MOV #INSERR,@#INSVEC ;INSTRUCTION ERROR MOV #MEMERR,@#MEMVEC MOV #MMERR,@#MMVEC MOV #TRAPPER,@#TRPVEC ;TRAPVECTOR CLR @#TRPVEC+2 ;PS 0 FOR TRAP CLR @#SR0 ;SET UP MEMORY MANAGEMENT CLR @#PAR0 ;PAGE 0 MOV #177*BLOCK+UP+RD.WRT,PDR0 MOV #200,PAR1 ;PAGE 1 AT 20K MOV #177*BLOCK+UP+RD.WRT,@#PDR1 MOV #1400,@#PAR6 ;PAGE 6 FOR RT11 MOV #177*BLOCK+UP+RD.WRT,@#PDR6 MOV #7600,@#PAR7 ;PAGE 7 FOR DEVICE REGISTERS MOV #177*BLOCK+UP+RD.WRT,@#PDR7 ; ;;;;;;; COMPUTE AVAILABLE MEMORY ;;;;;;; ; USE PAR2 FOR TESTING ALL ADDRESSES MOV #31.,R1 ;LIMIT IS 124K MOV #40000,R2 ;FOR TESTING. GETS WHAT PAR2 POINTS AT. CLR @#PAR2 ;START FOR MEM=0,124K,20000 MOV #177*BLOCK+UP+RD.WRT,@#PDR2 MOV #1,@#SR0 ;TURN ON MEMORY MANAGEMENT LOOP: MOV COR,(R2) ;SEE IF MEMORY FOUND TST TRAPCND ;CHECK IF WE TRAPPED YET BNE NXT ;IF YES EXIT FROM LOOP ADD #4,COR ADD #200,PAR2 ;NEXT 4K BLOCK DEC R1 ;IF IT GOT HERE IT FOUND IT. BNE LOOP ;LOOP UNTIL DONE .PRINT #WORKED NXT: MOV #400,@#PAR2 ;VIRTUAL=PHYSICAL=40000 MOV #0*BLOCK+UP+RD.WRT,@#PDR2 .PRINT #NPLERR ;ABOUT TO DO PAGE LENGTH ERROR MOV #50000,R3 ;USE REGISTER TO SHOW CHANGES IN SR1 IF POSSIBLE CMP (R3)+,(R3)+ ; MOV #177*BLOCK+UP+RDONLY,@#PDR2 ;READ ONLY .PRINT #NRDOERR ;ABOUT TO DO READ ONLY ERROR MOV #50000,R2 ;ABOUT TO DO READ ONLY ERROR MOV -(R2),(R3)+ ;SHOW ERRORS MOV #177*BLOCK+UP+NONRES,@#PDR2 ;NON RESIDENT .PRINT #NNONRES ;PRINT NONRESIDENT WARNING TST @#50000 ;;;; TRY KERNEL USER MODES CLR @#UPAR0 ;USER PAGE 0 = KERNEL PAGE ZERO MOV #177*BLOCK+UP+RD.WRT,UPDR0 ;EXCEPT USER IS READ ONLY MOV #600,UPAR1 ;20000-377777 IN VIRTUAL IS 60000-77777 PHYSICAL MOV #177*BLOCK+UP+RD.WRT,UPDR1 ;ALLOW REFERENCE MOV #600,@#UPAR2 ;SAME PAGE FOR 40K MOV #0*BLOCK+UP+RD.WRT,@#UPDR2 ;FOR PAGE LENGTH ERROR MOV #600,@#UPAR3 ;SAME FOR RDONLY ERROR MOV #177*BLOCK+UP+RDONLY,@#UPDR3 ;READ ONLY MOV #600,@#UPAR4 ;SAME FOR NON ACCESSIBLE PAGE ERROR MOV #177*BLOCK+UP+NONRES,@#UPDR4 ; MOV SP,R5 ;FOR COMPARING KERNEL SP AND USER SP MOV #USER*CURRENT,@#PS ;NOW IN USER MODE MOV #600,SP ;DEFINE USER SP MOV SP,R4 ;USER SP .PRINT #UM.MSG .PRINT #NPLERR ;TRY PAGE LENGTH ERROR TST @#50000 ; .PRINT #NRDOERR ;READ ONLY ERROR INC @#60000 .PRINT #NNONRES ;NONRESIDENT TST @#100000 HALT TRAP ;GET BACK TO KERNEL TRAPPER: RESTOR: CLR @#SR0 ;DISABLE MEMORY MANAGEMENT MOV SAV114,@#MEMVEC ;RESTORE VECTORS MOV SAV250,@#MEMVEC MOV SAV4,@#ADRSVEC MOV SAV10,@#INSVEC ;RESTORE VECTOR MOV SAV114,@#MEMVEC .EXIT WORKED: .ASCIZ /PDP 11 IS FULL BLOWN (124K)/ UM.MSG: .ASCIZ <15><12>/***NOW IN USER MODE***/ NPLERR:.ASCIZ <15><12>/ABOUT TO DO PAGE LENGTH ERROR/ NRDOERR:.ASCIZ <15><12>/ABOUT TO WRITE TO READ ONLY AREA/ NNONRES:.ASCIZ <15><12>/ABOUT TO REFERENCE NON RESIDENT ADDRESS/ .EVEN SAV4: .WORD 0 SAV10: .WORD 0 SAV114: .WORD 0 SAV250: .WORD 0 DIAGNOZ:MOV R0,D.R0 ;SAVE REGISTERS MOV R1,D.R1 MOV R2,D.R2 MOV R3,D.R3 MOV R4,D.R4 MOV R5,D.R5 MOV SP,D.SP ADD #6,D.SP ;CORRECT FOR INT. AND JSR MOV 2(SP),D.PC ;GET PC FROM STACK MOV 4(SP),D.PS ;PROCESSOR STATUS FROM STACK MOV @#SR0,D.SR0 MOV @#SR1,D.SR1 MOV @#SR2,D.SR2 MOV @#PS,D.PSNOW ;CURRENT PS MOV TRAPCND,R2 ;TRAP CONDITION MOV #TRAPAD,R3 ;TRAP ADDRESS JSR PC,BTOA ;CONVERT TO ASCII .PRINT #TRAPMSG ;PRINT CONDITION .PRINT #REGMSG ;PRINT HEADER MOV #D.R0,R4 ;POINTER TO NEXT WORD DLOOP: MOV (R4)+,R2 ;REGISTER VALUE MOV #RBUFF,R3 ;BUFFER FOR ASCII JSR PC,BTOA ;CONVERT IT MOVB #200,RBUFF+8. ;NO CRLF .PRINT #RBUFF ;PRINT THE ASCII CMP R4,#D.PSNOW ;CHECK IF DONE BLOS DLOOP .PRINT #RBUFF+10. ;CR LF .PRINT #SRMSG ;MEMORY MANAGEMENT INFO MOV #D.SR0,R4 ;POINTER D1LOOP: MOV (R4)+,R2 ;GET VALUE MOV #RBUFF,R3 ;BUFFER JSR PC,BTOA MOVB #200,RBUFF+8. ;NO CRLF .PRINT #RBUFF CMP R4,#D.SR3 ;IF DONE BLOS D1LOOP .PRINT #MM.MSG BIT #MMENABLE,D.SR0 ;CHECK IF MM ON OR OFF BNE D.2 .PRINT #OFF BR D.3 ;NEXT CONDITION D.2: .PRINT #ON D.3: .PRINT #PAGENUM MOV D.SR0,R2 ;EXTRACT PAGENUMBER ASR R2 ;ADJUST IN BOTTOM BIC #177770,R2 ; 3 BITS ONLY ADD #100060,R2 ;NUMBER FOLLOWED BY 200 MOV R2,RBUFF .PRINT #RBUFF .PRINT #MODEMSG BIT #140,D.SR0 ;IF KERNEL OR USER BNE D.4 .PRINT #KERMSG ;KERNEL BR D.5 D.4: .PRINT #USERMSG D.5: BIT #RDOABRT,D.SR0 ;IF READ ONLY ERROR BEQ D.6 .PRINT #RDOMSG BIC #RDOABRT,@#SR0 D.6: BIT #PLABRT,D.SR0 ;IF PAGE LENGTH ABORT BEQ D.7 ;IF NOT SKIP .PRINT #PLMSG ;PAGE LENGTH MSG BIC #PLABRT,@#SR0 D.7: BIT #NRABRT,D.SR0 ;IF NON RESIDENT ABORT BEQ D.8 ; .PRINT #NRMSG BIC #NRABRT,@#SR0 D.8: RTS PC MM.MSG: .ASCII <15><12>/MEMORY MANAGEMENT /<200> OFF: .ASCII /OFF /<200> ON: .ASCII /ON /<200> PAGENUM:.ASCII /PAGE= /<200> MODEMSG:.ASCII / MODE IS /<200> KERMSG: .ASCII /KERNEL/<0> USERMSG:.ASCII /USER/<0> PLMSG: .ASCIZ /PAGE LENGTH ABORT/ RDOMSG:.ASCIZ /READ ONLY ABORT/ NRMSG: .ASCIZ /NON RESIDENT PAGE ABORT/ .EVEN D.R0: .WORD 0 D.R1: .WORD 0 D.R2: .WORD 0 D.R3: .WORD 0 D.R4: .WORD 0 D.R5: .WORD 0 D.SP: .WORD 0 D.PC: .WORD 0 D.PS: .WORD 0 D.PSNOW: .WORD 0 D.SR0: .WORD 0 D.SR1: .WORD 0 D.SR2: .WORD 0 D.SR3: .WORD 0 TRAPCND:.WORD 0 TRAPMSG:.ASCII /TRAPPED TO / TRAPAD: .ASCIZ /ABCDEFGH/ .EVEN REGMSG: .ASCII /R0 R1 R2 R3 R4 R5 / .ASCII /R6 PC PS KPS/ .BYTE 0 .EVEN RBUFF: .ASCII /ABCDEFGH/<200><0><0> .EVEN INSERR:MOV #10,TRAPCND ;FLAG INSTRUCTION ERROR JSR PC,DIAGNOZ .PRINT #M.INSERR RTI M.INSERR:.ASCIZ /INSTRUCTION ERROR/ .EVEN ADRSERR:MOV #4,TRAPCND ;FLAG ADDRESS ERROR JSR PC,DIAGNOZ CLR R0 ;CONVERT CORE TO ASCII MOV COR,R1 ; DIV #10.,R0 ;QUOTIENT IN R0, R1 = REMAINDEER ADD #60,R0 ;ASCII ADD #60,R1 ; MOVB R0,UPBYTE MOVB R1,DOWN .PRINT #COREMSG RTI ;RETURN FROM INTERRUPT COR: .WORD 0 ;4K COUNTER COREMSG:.ASCII <15><12>/PDP 11 HAS / UPBYTE: .BYTE 0 DOWN: .BYTE 0 .ASCIZ /K OF CORE/ SRMSG: .ASCIZ /SR0 SR1 SR2 SR3 / .EVEN MEMERR: MOV #114,TRAPCND ;TRAPCONDITION JSR PC,DIAGNOZ .PRINT #MEMMSG RTI MMERR: MOV #250,TRAPCND ;FLAG TRAP CONDITION JSR PC,DIAGNOZ .PRINT #MMMSG RTI ADRMSG: .ASCIZ /ADDRESS ERROR/ MEMMSG: .ASCIZ /MEMORY PARITY ERROR/ MMMSG: .ASCIZ /MEMORY MANAGEMENT ERROR/ .EVEN .END START