.TITLE MMU -- MMU FEATURE TEST .IDENT /V01.00/ MMR0 =: 177572 ;MEMORY MANAGEMENT REG 0 MMR1 =: 177574 ;MEMORY MANAGEMENT REG 1 MMR2 =: 177576 ;MEMORY MANAGEMENT REG 2 MMR3 =: 172516 ;MEMORY MANAGEMENT REG 3 UISDR0 =: 177600 ;USER I SPACE DESCRIPTOR REG 0 UISAR0 =: 177640 ;USER I SPACE ADDRESS REG 0 UDSDR0 =: 177620 ;USER D SPACE DESCRIPTOR REG 0 UDSAR0 =: 177660 ;USER D SPACE ADDRESS REG 0 SISDR0 =: 172200 ;SUPERVISOR I SPACE DESCRIPTOR REG 0 SISAR0 =: 172240 ;SUPERVISOR I SPACE ADDRESS REG 0 SDSDR0 =: 172220 ;SUPERVISOR D SPACE DESCRIPTOR REG 0 SDSAR0 =: 172260 ;SUPERVISOR D SPACE ADDRESS REG 0 KISDR0 =: 172300 ;KERNEL I SPACE DESCRIPTOR REG 0 KISAR0 =: 172340 ;KERNEL I SPACE ADDRESS REG 0 KDSDR0 =: 172320 ;KERNEL D SPACE DESCRIPTOR REG 0 KDSAR0 =: 172360 ;KERNEL D SPACE ADDRESS REG 0 PSW =: 177776 ;PROCESSOR STATUS WORD UMODE =: 140000 ;USER MODE SMODE =: 40000 ;SUPERVISOR MODE KMODE =: 0 ;KERNEL MODE PR7 =: 340 ;CPU PRIORITY 7 PR0 =: 0 ;CPU PRIORITY 0 $JSX =: 4 ;EXTENDED JOB STATUS WORD NOVBG$ =: 100 ;DISABLE VBGEXE BIT $USRTO =: 50 ;USER TOP ADDRESS $SYPTR =: 54 ;POINTER TO RMON $CNFG1 =: 300 ;SYSTEM CONFIGURATION WORD FJOB$ =: 200 ;FOREGROUND LOADED BIT $SYSGE =: 372 ;SYSGEN FEATURE WORD TSXP$ =: 100000 ;TSX-PLUS SYSTEM BIT RTEM$ =: 10 ;RTEM-11 SYSTEM BIT TPS =: 177564 ;PRINTER STATUS REG TPB =: TPS+2 ;PRINTER BUFFER REG CR =: 15 ;CARRIAGE RETURN LF =: 12 ;LINE FEED .MCALL .EXIT,.PRINT ;SYSTEM MACRO CALLS .ASECT .=$JSX .WORD NOVBG$ ;DISABLE VBGEXE .PSECT START:: MOV @#$SYPTR,R5 ;GET ADDRESS OF RMON BIT #TSXP$!RTEM$,$SYSGE(R5) ;CHECK OPERATING SYSTEM BEQ 10$ ;IF EQ OK .PRINT #ESYST ;OPERATING SYSTEM ERROR .EXIT ;EXIT 10$: TSTB $CNFG1(R5) ;FOREGROUND LOADED? BPL 20$ ;IF PL NO .PRINT #EFJOB ;FOREGROUND LOADED ERROR .EXIT ;EXIT 20$: MOV @#4,-(SP) ;SAVE VECTOR 4 MOV @#6,-(SP) ; MOV #TRINT,@#4 ;SET TRAP 4 SST ROUTINE MOV #PR7,@#6 ; MOV #MMR0,R0 ;CHECK MMR0-MMR2 MOV #3,R1 ; CALL CKREG ; BCC 40$ ;IF CC OK 30$: .PRINT #ENMMU ;NO MMU ERROR JMP 110$ ;EXIT 40$: MOV #8.,R1 ;CHECK KISAR0-KISAR7 MOV #KISAR0,R0 ; CALL CKREG ; BCS 30$ ;IF CS FAILED MOV #KISDR0,R0 ;CHECK KISDR0-KISDR7 CALL CKREG ; BCS 30$ ;IF CS FAILED MOV #UISAR0,R0 ;CHECK UISAR0-UISAR7 CALL CKREG ; BCS 30$ ;IF CS FAILED MOV #UISDR0,R0 ;CHECK UISDR0-UISDR7 CALL CKREG ; BCS 30$ ;IF CS FAILED TST @#MMR3 ;CHECK FOR MMR3 BCS 60$ ;IF CS FAILED BIS #F.MR3,FEAT ;FLAG MMR3 MOV #SISAR0,R0 ;CHECK FOR SISAR0-SISAR7 CALL CKREG ; BCS 50$ ;IF CS FAILED MOV #SISDR0,R0 ;CHECK FOR SISDR0-SISDR7 CALL CKREG ; BCS 50$ ;IF CS FAILED BIS #F.SUP,FEAT ;FLAG SUPERVISOR MODE 50$: MOV #KDSAR0,R0 ;CHECK FOR KDSAR0-KDSAR7 CALL CKREG ; BCS 60$ ;IF CS FAILED MOV #KDSDR0,R0 ;CHECK FOR KDSDR0-KDSDR7 CALL CKREG ; BCS 60$ ;IF CS FAILED MOV #UDSAR0,R0 ;CHECK FOR UDSAR0-UDSAR7 CALL CKREG ; BCS 60$ ;IF CS FAILED MOV #UDSDR0,R0 ;CHECK FOR UDSDR0-UDSDR7 CALL CKREG ; BCS 60$ ;IF CS FAILED BIT #F.SUP,FEAT ;HAVE SUPERVISOR MODE? BEQ 55$ ;IF EQ NO MOV #SDSAR0,R0 ;CHECK FOR SDSAR0-SDSAR7 CALL CKREG ; BCS 60$ ;IF CS FAILED MOV #SDSDR0,R0 ;CHECK FOR SDSDR0-SDSDR7 CALL CKREG ; BCS 60$ ;IF CS FAILED 55$: BIS #F.DSP,FEAT ;FLAG DATA SPACE 60$: MOV @#PSW,-(SP) ;SAVE PSW MOV #PR7,@#PSW ;RAISE CPU PRIORITY MOV @#MMR0,-(SP) ;SAVE MMR0 CLR @#MMR0 ;DISABLE RELOCATION TST FEAT ;HAVE MMR3? BPL 70$ ;IF PL NO MOV @#MMR3,-(SP) ;SAVE MMR3 CLR @#MMR3 ;DISABLE 22-BIT ADDRESSING 70$: MOV #8.,R4 ;PAGE COUNT CLR R5 ;RELOCATION BIAS MOV #KISAR0,R0 ;SAVE & INIT PARS/PDRS MOV #KISDR0,R1 ; MOV #UISAR0,R2 ; MOV #UISDR0,R3 ; 80$: MOV @R0,-(SP) ; MOV @R1,-(SP) ; MOV @R2,-(SP) ; MOV @R3,-(SP) ; MOV R5,(R0)+ ; MOV R5,(R2)+ ; MOV #77406,@R1 ; MOV (R1)+,(R3)+ ; ADD #200,R5 ; DEC R4 ; BNE 80$ ; MOV #177600,-(R0) ;MAP I/O PAGE MOV @R0,-(R2) ; MOV @#10,-(SP) ;SAVE VECTOR 10 MOV @#12,-(SP) ; MOV @#250,-(SP) ;SAVE VECTOR 250 MOV @#252,-(SP) ; MOV #TRRTI,@#10 ;SET TRAP 10 SST ROUTINE MOV #PR7,@#12 ; MOV #MPSST,@#250 ;SET TRAP 250 SST ROITINE MOV #PR7,@#252 ; CALL CKEXT ;EHECK EXTENDED FEATURES CALL PFEAT ;PRINT MMU FEATURES ;;;;;;;;;;;;;;;;;;;;;;;; MOV #-1,@#MMR0 ;CHECK MMR0 VALUES MOV @#MMR0,ARGS ; CLR @#MMR0 ; MOV @#MMR0,ARGS+2 ; MOV #FMR0,R1 ;PRINT STATE CALL PSTAT ; TST FEAT ;HAVE MMR3? BPL 85$ ;IF PL NO MOV #-1,@#MMR3 ;CHECK MMR0 VALUES MOV @#MMR3,ARGS ; CLR @#MMR3 ; MOV @#MMR3,ARGS+2 ; MOV #FMR3,R1 ;PRINT STATE CALL PSTAT ; 85$: MOV @#KISAR0,-(SP) ;SAVE KISAR0 MOV @#KISDR0,-(SP) ;SAVE KISDR0 MOV #-1,@#KISAR0 ;CHECK KISAR0/KISDR0 VALUES MOV @#KISAR0,ARGS ; CLR @#KISAR0 ; MOV @#KISAR0,ARGS+2 ; MOV #-1,@#KISDR0 ; MOV @#KISDR0,ARGS+4 ; CLR @#KISDR0 ; MOV @#KISDR0,ARGS+6 ; MOV (SP)+,@#KISDR0 ;RESTORE KISDR0 MOV (SP)+,@#KISAR0 ;RESTORE KISAR0 MOV #FPAG,R1 ;PRINT STATE CALL PSTAT ; BIS #1,@#MMR0 ;ENABLE RELOCATION CALL TESTS ;PERFORM TESTING ;;;;;;;;;;;;;;;;;;;;;;;; CLR @#MMR0 ;DISABLE RELOCATION MOV (SP)+,@#252 ;RESTORE VECTOR 250 MOV (SP)+,@#250 ; MOV (SP)+,@#12 ;RESTORE VECTOR 10 MOV (SP)+,@#10 ; MOV #8.,R4 ;PAGE COUNT MOV #KISAR0+20,R0 ;RESTORE PARS/PDRS MOV #KISDR0+20,R1 ; MOV #UISAR0+20,R2 ; MOV #UISDR0+20,R3 ; 90$: MOV (SP)+,-(R3) ; MOV (SP)+,-(R2) ; MOV (SP)+,-(R1) ; MOV (SP)+,-(R0) ; DEC R4 ; BNE 90$ ; TST FEAT ;HAVE MMR3? BEQ 100$ ;IF EQ NO MOV (SP)+,@#MMR3 ;RESTORE MMR3 100$: MOV (SP)+,@#MMR0 ;RESTORE MMR0 MOV (SP)+,@#PSW ;RESTORE PSW 110$: MOV (SP)+,@#6 ;RESTORE VECTOR 4 MOV (SP)+,@#4 ; .EXIT ;EXIT TESTS:: BIS #UMODE,@#PSW ;SET USER MODE CLC ;CLEAR CARRY MOV #4,ARGS ;CHECK IF HALT TRAPS TO 4 OR 10 HALT ; BCS 10$ ;IF CS TRAP TO 4 MOV #10.,ARGS ;IF CC TRAP TO 10 10$: BIC #UMODE,@#PSW ;BACK TO KERNEL MODE MOV #FHLT,R1 ;PRINT STATE CALL PSTAT ; MOV #123456,@#20000 ;MAGIC MOV #FMFP1,R1 ;PRINT MESSAGE CALL PRINT ; MOV #ILSST,@#10 ;TRAP 10 SST ISR MFPD @#20000 ;MFPD BCS 20$ ;IF CS RESERVED INSTRUCTION MOV #FMFP2,R1 ;EDIT MESSAGE MOV #BUFF,R0 ; MOV #ARGS,R2 ; MOV (SP)+,@R2 ; CALL $EDMSG ; CLRB @R0 ;MAKE IT ASCIZ MOV #BUFF,R1 ;PRINT IT CALL PRINT ; 20$: MOV #TRRTI,@#10 ;RESTORE MOV #FACF1,R1 ;TEST ACF CALL PRINT ; BIS #UMODE,@#PSW ;SET USER MODE MOV #77404,@#UISDR0+2 ;SET ACF BITS TO 10 TST @#20000 ;PERFORM TEST BIC #UMODE,@#PSW ;BACK TO KERNEL MODE MOV #FACF2,R1 ; CALL PRINT ; BIS #UMODE,@#PSW ;SET USER MODE CLR @#20000 ;PERFORM TEST BIC #UMODE,@#PSW ;BACK TO KERNEL MODE MOV #77406,@#UISDR0+2 ;RESTORE ACF BITS RETURN ;RETURN PSTAT:: MOV #BUFF,R0 ;SET BUFFER ADDRESS MOV #ARGS,R2 ;SET ARGUMENT BLOCK CALL $EDMSG ;EDIT MESSAGE CLRB @R0 ;MAKE IT ASCIZ MOV #BUFF,R1 ;SET MESSAGE ADDRESS BR PRINT ;PRINT IT PFEAT:: MOV #BUFF,R0 ;SET BUFFER ADDRESS MOV #FMMU,R1 ;SET FORMAT STRING MOV #ARGS,R2 ;SET ARGUMENT BLOCK MOV R2,R3 ;COPY MOV FEAT,R4 ;GET CPU FEATURES ASL R4 ;SKIP MMR3 FLAG MOV #F18B,R5 ;CHECK FOR 22-BIT ASL R4 ; BCC 10$ ; MOV #F22B,R5 ; 10$: MOV R5,(R3)+ ; MOV #FNSF,R5 ;CHECK FOR SUPERVISOR MODE ASL R4 ; BCC 20$ ; MOV #FSUP,R5 ; 20$: MOV R5,(R3)+ ; MOV #FNSF,R5 ;CHECK FOR CSM INSTRUCTION ASL R4 ; BCC 30$ ; MOV #FCSM,R5 ; 30$: MOV R5,(R3)+ ; MOV #FNSF,R5 ;CHECK FOR DATA SPACE ASL R4 ; BCC 40$ ; MOV #FDSP,R5 ; 40$: MOV R5,(R3)+ ; CALL $EDMSG ;EDIT MESSAGE CLRB @R0 ;MAKE IT ASCIZ MOV #BUFF,R1 ;SET BUFFER ADDRESS PRINT:: MOVB (R1)+,R0 ;GET CHARACTER BEQ 10$ ;IF EQ END OF LINE CALL OUCHR ;PRINT CHARACTER BR PRINT ;TO NEXT CHAR 10$: RETURN ;RETURN OUCHR:: TSTB @#TPS ;PRINTER READY? BPL OUCHR ;IF PL NO MOVB R0,@#TPB ;PRINT CHARACTER RETURN ;RETURN ;+ ;CKREG -- CHECK DEVICE REGISTERS ; ;INPUT: ; R0 - REGISTER ADDRESS ; R1 - WORD COUNT ; ;OUTPUT: ; CC - ALL THE REGISTERS AVAILABLE ; CS - SOME REGISTERS NOT AVAILABLE ;- CKREG:: JSR R2,$SAVVR ;SAVE REGISTERS 0-2 10$: TST @R0 ;CHECK FOR REGISTER EXISTANCE BCS 20$ ;IF CS NOT FOUND ADD #2,R0 ;TO NEXT REGISTER DEC R1 ;MORE TO TEST? BNE CKREG ;IF NE YES 20$: RETURN ;RETURN CKEXT:: TST FEAT ;HAVE MMR3? BPL 25$ ;IF PL NO MOV #MMR3,R0 ;MMR3 BIT #20,@R0 ;22-BIT MAPPING BIT? (SHOULD BE 0) BNE 10$ ;IF NE WRONG STATE BIS #20,@R0 ;ENABLE 22-BIT MAPPING BIT #20,@R0 ;22-BIT ENABLED? BEQ 10$ ;IF EQ NO BIS #F.EXT,FEAT ;FLAG 22-BIT SUPPORT 10$: BIT #10,@R0 ;CSM ENABLED BIT? (SHOULD BE 0) BNE 20$ ;IF NE WRONG STATE BIS #10,@R0 ;ENABLE CSM INSTRUCTION BIT #10,@R0 ;CSM ENABLED? BEQ 20$ ;IF EQ NO BIS #F.CSM,FEAT ;FLAG CSM INSTRUCTION SUPPORT 20$: CLR @#MMR3 ;TURN OFF EXTENDED FEATURES 25$: RETURN ;RETURN TRINT:: BIS #1,2(SP) ;SET CARRY TRRTI:: RTI ;RETURN FROM INTERRUPT ILSST:: MOV R0,-(SP) ;SAVE VOLATILE REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; MOV #BUFF,R0 ;SET BUFFER ADDRESS MOV #RSVI,R1 ;SET FORMAT STRING MOV #ARGS,R2 ;SET ARGUMENT BLOCK MOV 6(SP),@R2 ;SET USER PC CALL $EDMSG ;EDIT MESSAGE CLRB @R0 ;MAKE IT ASCIZ MOV #BUFF,R1 ;PRINT IT CALL PRINT ; MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 ; MOV (SP)+,R0 ; BR TRINT ;RETURN FROM INTERRUPT WITH CARRY MPSST:: MOV R0,-(SP) ;SAVE VOLATILE REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; MOV #BUFF,R0 ;SET BUFFER ADDRESS MOV #MMUF,R1 ;SET FORMAT STRING MOV #ARGS+6,R2 ;FILL ARGUMENT BLOCK MOV @#MMR2,-(R2) ; MOV @#MMR1,-(R2) ; MOV @#MMR0,-(R2) ; MOV 6(SP),-(R2) ; CALL $EDMSG ;EDIT MESSAGE CLRB @R0 ;MAKE IT ASCIZ MOV #BUFF,R1 ;PRINT IT CALL PRINT ; BIC #160000,@#MMR0 ;UNFREEZE MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 ; MOV (SP)+,R0 ; RTI ;RETURN FROM INTERRUPT FEAT:: .WORD 0 ;MMU FEATURE WORD F.MR3 =: 100000 ;HAVE MMR3 REGISTER F.EXT =: 40000 ;22-BIT ADDRESSING F.SUP =: 20000 ;HAVE SUPERVISOR MODE F.CSM =: 10000 ;CSM INSTRUCTION F.DSP =: 4000 ;HAVE DATA SPACE ARGS:: .BLKW 4 ;EDMSG ARGUMENTS BUFF:: .BLKW 40. ;BUFFER ESYST: .ASCIZ /?MMU-F-Invalid operating system/ EFJOB: .ASCIZ /?MMU-F-Foreground loaded/ ENMMU: .ASCIZ /?MMU-F-No memory management unit/ FMMU: .ASCII /MMU FEATURES: %I%I%I%I%N%N/ FNSF: .ASCIZ // F18B: .ASCIZ /18-BIT/ F22B: .ASCIZ /22-BIT/ FSUP: .ASCIZ /, SUPERVISOR MODE/ FCSM: .ASCIZ /, CSM INSTRUCTION/ FDSP: .ASCIZ /, DATA SPACE/ FMR0: .ASCII /MOV #-1,@#MMR0 ;MMR0 = %P%N/ .ASCIZ /CLR @#MMR0 ;MMR0 = %P%N/ FMR3: .ASCII /MOV #-1,@#MMR3 ;MMR3 = %P%N/ .ASCIZ /CLR @#MMR3 ;MMR3 = %P%N/ FPAG: .ASCII /MOV #-1,@#KISAR0 ;KISAR0 = %P%N/ .ASCII /CLR @#KISAR0 ;KISAR0 = %P%N/ .ASCII /MOV #-1,@#KISDR0 ;KISDR0 = %P%N/ .ASCIZ /CLR @#KISDR0 ;KISDR0 = %P%N%N/ FHLT: .ASCII /BIS #140000,@#PSW ;SET USER MODE%N/ .ASCIZ /HALT ;TRAP TO %M%N/ FMFP1: .ASCII /MOV #123456,@#20000 ;/ .ASCIZ /MFPD @#20000 ;/ FMFP2: .ASCIZ /MOV (SP)+,R0 ;R0=%P%N%N/ FACF1: .ASCII /MOV #77404,@#UISDR1 ;ACF=10/ .ASCIZ /TST @#20000 ;/ FACF2: .ASCIZ /CLR @#20000 ;/ MMUF: .ASCIZ /*** MMU FAULT AT %P, MMR0=%P, MMR1=%P, MMR2=%P ***%N/ RSVI: .ASCIZ /*** RESERVED INSTRUCTION AT %P ***%N/ .END START