.TITLE MODES -- Print processor modes ala VMS .IDENT /033084/ .NLIST ME .NLIST BEX .ENABL LC ;************************************************************************ ; ; Program to display processor modes ie. (K,U,S,I,F) ; ; Format: MODES ; ; Dept: DPG ; Date: 23-DEC-83 ; Author: Peter V. DeVita ; ; Note: Code written by Michael L. Gordon for DPG has been ; included in this module. Many thanks for the time ; savings this code has provided! ; ; Modified ; -------- ; ; 30-MAR-84 PVD Add printing of averages. ; Print BT system ID. ; ; 23-APR-84 PVD Fix hanging on ^Z character typed. ; ;************************************************************************ ; ;M$$TST=0 ; Define when it test mode, ie. CIB not actually allocated, ; simulated output. ; ;M$$BUG=0 ; Define to enable use of the DEBUG macro. ; ;R$$PRO=0 ; This is a PRO 350 ; R$$MPL=0 ; This is RSX-11M-Plus ; M$$USI=0 ; Define to catch unsolicited input: ^W = repaint screen ; else exit ; M$$PRI=0 ; Define to enable printing of task error messages ; M$$ABO=0 ; Define to issue abort AST ; M$$AVG=0 ; Define to calculate and print averages ; .MCALL EXIT$S,QIOW$S,DIR$,EXST$S,QIO$S,ASTX$S .MCALL QIOW$,ALUN$,GTIM$S,WTSE$S,MRKT$S,SREX$S .IF DF R$$PRO ; BM255 ;.MCALL UPTUP$ ;UPTIME UPDATE ; BM255 .ENDC ; DF R$$PRO ; BM255 .PAGE .SBTTL LCLMCR -- Local Macros. .MACRO MSG NUM,MESSAGE MSG'NUM: .ASCII "MESSAGE" MSGL'NUM=.-MSG'NUM .EVEN .ENDM .MACRO PRINT MSGNUM MOV #MSG'MSGNUM,PRIQIO+Q.IOPL MOV #MSGL'MSGNUM,PRIQIO+Q.IOPL+2 DIR$ #PRIQIO .ENDM .MACRO ASCMSG LINMSG .ASCII \LINMSG\ .ENDM .MACRO PUSH A1,A2,A3,A4,A5 .IIF DF A1, MOV 'A1,-(SP) .IIF DF A2, MOV 'A2,-(SP) .IIF DF A3, MOV 'A3,-(SP) .IIF DF A4, MOV 'A4,-(SP) .IIF DF A5, MOV 'A5,-(SP) .ENDM .MACRO POP A5,A4,A3,A2,A1 .IIF DF A5, MOV (SP)+,'A5 .IIF DF A4, MOV (SP)+,'A4 .IIF DF A3, MOV (SP)+,'A3 .IIF DF A2, MOV (SP)+,'A2 .IIF DF A1, MOV (SP)+,'A1 .ENDM .MACRO DEBUG VAR .IF DF M$$BUG PUSH R0,R1,R2 ; Don't futz up anyones registers ! MOV 'VAR,R1 ; In MOV #TEMP,R0 ; Out MOV #1,R2 ; No zero supression CALL $CBOMG ; Convert it QIOW$S #IO.WVB,#5,#1,,,,<#TEMP,#6,#40> POP R2,R1,R0 ; .ENDC ; DF M$$BUG .ENDM .SBTTL LCLEQU -- Local equates. .IF DF R$$PRO $ALOCB=011112 $ALOC1=011154 $CKINT=032716 $CKCSR=041370 $CRAVL=041416 $DEACB=011264 $DEAC1=011324 $FRKHD=041452 $ICAVL=041416 $IDLFL=001303 $INTSC=002754 $INTSE=003020 $INTSV=003020 $INTSF=003054 $INTX1=003054 $TTNS =042000 $HEADR=001274 $SWSTK=006046 .ENDC .IF DF F$$LPP AC0=%0 ; Floating point accumulators AC1=%1 ; AC2=%2 ; AC3=%3 ; AC4=%4 ; ; FP-11 PSW settings FL.SGL=0 ; Single percision FL.DBL=100 ; Double Percision .ENDC CR=15 ; Carriage Return LF=12 ; Line Feed SPC=40 ; Space NULL=0 ; Null ESC=33 ; Escape ETB=27 ; Control W M..KNL=DATKNL-DATKNL ; Offsets into data packet returned M..USR=DATUSE-DATKNL ; ... by the CIB M..IDL=DATIDL-DATKNL M..FRK=DATFRK-DATKNL .IF DF K$$DAS M..SUP=DATSUP-DATKNL .ENDC ; DF K$$DAS M..AST=^B000001 ; AST Flag M..CTW=^B000010 ; ^W Flag M..NOP=^B000100 ; No print flag M..ALO=^B001000 ; CIB allocation flag M..1ST=^B010000 ; First time through flag .PAGE .SBTTL MAIN -- Code Section. ;+ ; This is the main program control loop. ; ;- START: .IF NDF R$$PRO MOV @#177764,SYSTEM ; Get system ID ADD #100,SYSTEM ; Convert to ASCII MOV @#$VERSN,VERSN ; Get version of RSX MOV @#$VERSN+2,VERSN+2 ; ... .ENDC ;R$$PRO .IF DF M$$ABO SREX$S #ABOAST ; Issue abort AST CMP $DSW,#IS.SUC ; Successful ? BEQ 5$ ; BR if no JMP EXIT ; .ENDC ;M$$ABO 5$: .IIF DF M$$USI CALL ISSAST ; Catch unsolicited input CALL CRECIB ; Create clock intercept block DEBUG CIBADR DEBUG NEWCIN CALL SETTIM ; Get current time in ASCII format PRINT 1 ; Print initial screen layout 1$: .IF DF M$$USI BIT #M..AST,FLAGS ; Did we service an AST BEQ 4$ ; BR if no BIT #M..CTW,FLAGS ; ^W typed BNE 3$ ; BR if yes JMP EXIT ; Get out 3$: PRINT 1 ; Repaint the initial screen BIS #M..NOP,FLAGS ; Don't print CALL ISSAST ; Catch unsolicited input .ENDC ;M$$USI 4$: MRKT$S #14.,#2.,#2. ; Mark time for 2 seconds CMP $DSW,#IS.SUC ; Successful ? BNE EXIT ; BR if no WTSE$S #14. ; Wait for the event flag CALL SETTIM ; Get current time in ASCII format CALL GETTIC ; Get Tic counts CALL CALC ; Calculate percentages PRINT 0 ; Update time on the screen CALL OUTMSG ; Output percentage messages BR 1$ ; Repeat EXIT: PRINT 2 ; Return cursor to bottom of screen and ; leave screen up. CALL DEACIB ; Release clock intercept block EXST$S EXSTA ; Exit status is 40 on error .PAGE .SBTTL SETXY -- Set up the proper (X,Y) coordinates for current output. ;+ ; INPUT ; R0 = Start of line coordinates ; ; OUTPUT ; PERLIN is set with proper line coordinates ;- SETXY: PUSH R0,R1,R2 ; MOV #CORLIN,R1 ; R1 = Address to put coordinates MOV #CORLEN,R2 ; R2 = Length of a coordinate parameter 1$: MOVB (R0)+,(R1)+ ; Copy a byte SOB R2,1$ ; Continue until all transfered POP R2,R1,R0 ; RETURN .SBTTL SETTIM -- Get binary time and convert to ASCII. ;+ ; INPUT ; None. ; ; OUTPUT ; Date and time in ASCII format DD-MMM-YY HH:MM:SS in ; DATBUF and TIMBUF respectively. ;- SETTIM: PUSH R0,R1,R2 ; GTIM$S #GETIM ; Get binary time and date CMP $DSW,#IS.SUC ; Successfull ? BEQ 1$ ; BR if yes CALLR EXIT ; Exit 1$: MOV #DATBUF,R0 ; R0 = Address of date buffer MOV #GETIM+G.TIYR,R1 ; R1 = Address of binary date CALL $DAT ; Convert to ASCII MOV #TIMBUF,R0 ; R0 = Address of time buffer MOV #GETIM+G.TIHR,R1 ; R1 = Address of binary time MOV #3,R2 ; R2 = Conversion parameter CALL $TIM ; Convert to ASCII POP R2,R1,R0 ; RETURN ; .PAGE .SBTTL OUTMSG -- Output message to terminal screen. ;+ ; INPUT ; Tick counts have been calculated and stored for all the ; output parameters. ; ; OUTPUT ; Tick fields are updated on the terminal screen. ;- OUTMSG: .IF DF M$$PRI BIT #M..NOP,FLAGS ; No print flag set ? BEQ 2$ ; BR if no BIC #M..NOP,FLAGS ; Clear no print flag BR 3$ ; Bypass printing .ENDC ;M$$PRI 2$: MOV #KNLXY,R0 ; R0 = 1st output coordinate address MOV #KNLTKS,R1 ; R1 = 1st tick count address .IIF DF F$$LPP MOV #KNLPER,R4 ; R2 = 1st tick percentage address 1$: CALL SETXY ; Set up the proper screen coordinates MOV #FXDLEN,OUTSCR+Q.IOPL+2 ; QIO size init to fixed length coordinate ADD (R1)+,OUTSCR+Q.IOPL+2 ; ... plus the # of ticks (%) DIR$ #OUTSCR ; Print the line ADD #CORLEN,R0 ; Point to next coordinate CMP #-1,(R1) ; (R1) = -1 if at end of list BEQ 3$ ; BR if at end of list .IF DF F$$LPP MOV R4,OUTPER+Q.IOPL ; QIO string address DIR$ #OUTPER ; Print the percentage ADD #PERQIO,R4 ; Bump QIO output address .ENDC JMP 1$ ; Continue 3$: RETURN ; .PAGE .SBTTL CRECIB -- Create CIB. ;+ ; INPUT ; Pass controller registration block with controller and ; devices to monitor = 0. ; ; +------------------------------------------+ ; R5 --> | Address of Device Registration Block | ; +------------------------------------------+ ; ; Address of Controller Registration Block | ; +------------------------------------------+ ; ; Device Registration Block ; +------------------------------+ ; DEVREG: | Number of devices to monitor | ; +------------------------------+ ; ; Controller Registration Block ; +--------------------------------------+ ; CNTREG: | Number of controllers to monitor | ; +--------------------------------------+ ; ; ; OUTPUT ; Carry bit clear = success ; Carry bit set = failure ;- CRECIB: .IF NDF M$$TST MOV #DEVREG,ALLREG ; Controller registration block addr. MOV #CNTREG,ALLREG+2 ; Device registration block addr. MOV #ALLREG,R5 ; ... CALL SETCLI ; Set up the CIB. BCC 1$ ; BR if yes success .IIF DF M$$PRI PRINT 4 ; CIB allocation failed JMP EXIT ; Error .ENDC ; NDF M$$TST 1$: RETURN .PAGE .SBTTL GETTIC -- Get current tic information. ;+ ; INPUT ; INIYR = Time CIB started ; OUTPUT ; NEWDAT = Address of return data (tic information). ;- GETTIC: .IF DF M$$TST MOV #NEWDAT,R0 ; ADD #2,M..IDL(R0) ;ONLY UNTIL THE TIC GATHERING ADD #2,M..KNL(R0) ;CODE IS DEBUGGED. ADD #2,M..USR(R0) ; ADD #2,M..FRK(R0) ; .IIF DF K$$DAS ADD #2,M..SUP(R0); .IFF ; DF M$$TST MOV #INIYR,R1 ; Time CIB started CALL RSTCLI ; Request statistics BCC 2$ ; BR is OK .IIF DF M$$PRI PRINT 5 ; Request statictics failed JMP EXIT ; 2$: MRKT$S #14.,#1.,#1. ; It will take at least one tic before CMP $DSW,#IS.SUC ; the data is made available, so wait BEQ 4$ ; for it. JMP EXIT ; 4$: WTSE$S #14. ; Wait for the event flag MOV #INIYR,R1 ; Time CIB started MOV #NEWDAT,R2 ; Address of return data CALL GSTCLI ; Gather statistics BCC 3$ ; BR if OK BR 2$ ; Wait one tic and try again ;;;.IIF DF M$$PRI PRINT 6 ; Gather statictics failed ;;;JMP EXIT ; 3$: .IF DF M$$AVG BIT #M..1ST,FLAGS ; First time through BEQ 5$ ; BR if no MOV #NEWDAT,R1 ; MOV #ORGDAT,R2 ; MOV M..IDL(R1),M..IDL(R2) ; Save the original tic information MOV M..KNL(R1),M..KNL(R2) MOV M..USR(R1),M..USR(R2) MOV M..FRK(R1),M..FRK(R2) .IIF DF K$$DAS MOV M..SUP(R1),M..SUP(R2) MOV M..IDL+2(R1),M..IDL+2(R2) MOV M..KNL+2(R1),M..KNL+2(R2) MOV M..USR+2(R1),M..USR+2(R2) MOV M..FRK+2(R1),M..FRK+2(R2) .IIF DF K$$DAS MOV M..SUP+2(R1),M..SUP+2(R2) BIC #M..1ST,FLAGS ; Clear first time through flag ; .ENDC ;M$$AVG 5$: .ENDC ; DF M$$TST RETURN .PAGE .SBTTL CALC -- Calculate percentages. ;+ ; INPUT ; NEWDAT = Address of tic counts returned. ; OLDDAT = Address of previous tics counts returned. ; OUTPUT ; KNLTKS --> FRKTKS = Number of tics that have elapsed. ; KNLPER --> FRKPER = Percentages of tics that have elapsed. ; OLDDAT = Updated to have current tic information. ; ;- CALC: CLR TICTOT ; Tic totals .IF NDF F$$LPP MOV #NEWDAT,R0 ; Move new counts to save area MOV M..IDL(R0),IDLTKS ; MOV M..KNL(R0),KNLTKS ; MOV M..USR(R0),USRTKS ; MOV M..FRK(R0),FRKTKS ; .IIF DF K$$DAS MOV M..SUP(R0),SUPTKS MOV #OLDDAT,R1 ; Subtract old counts from them SUB M..IDL(R1),IDLTKS ; BGE 1$ ; NEG IDLTKS ; 1$: ADD IDLTKS,TICTOT SUB M..KNL(R1),KNLTKS ; BGE 2$ ; NEG KNLTKS ; 2$: ADD KNLTKS,TICTOT SUB M..USR(R1),USRTKS ; BGE 3$ ; NEG USRTKS ; 3$: ADD USRTKS,TICTOT SUB M..FRK(R1),FRKTKS ; BGE 4$ ; NEG FRKTKS ; 4$: .IF DF K$$DAS SUB M..SUP(R1),SUPTKS ; BGE 5$ ; NEG SUPTKS ; 5$: ADD SUPTKS,TICTOT .ENDC ; DF K$$DAS .IF DF M$$TST ; RETURN ; .ENDC .IFF MOV #NEWDAT,R0 ; MOV #OLDDAT,R1 ; MOV #KNLTKS,R2 ; .IIF DF M$$AVG MOV #ORGDAT,R3 ; .IIF DF M$$AVG MOV #ORGKNL,R4 ; ; Kernel LDFPS #FL.DBL ; 32-bit integer .IIF DF M$$AVG CLRF AC3 ; LDCIF M..KNL(R0),AC0 ; LDCIF M..KNL(R1),AC1 ; SUBF AC1,AC0 ; LDFPS #FL.SGL ; 16-bit integer STCFI AC0,(R2) ; ADD (R2)+,TICTOT ; .IF DF M$$AVG LDFPS #FL.DBL LDCIF M..KNL(R0),AC0 LDCIF M..KNL(R3),AC1 SUBF AC1,AC0 ADDF AC0,AC3 STCFI AC0,(R4)+ TST (R4) .ENDC ;M$$AVG .IF DF K$$DAS ; Supervisor LDFPS #FL.DBL ; LDCIF M..SUP(R0),AC0 ; LDCIF M..SUP(R1),AC1 ; SUBF AC1,AC0 ; LDFPS #FL.SGL ; STCFI AC0,(R2) ; ADD (R2)+,TICTOT ; .IF DF M$$AVG LDFPS #FL.DBL LDCIF M..SUP(R0),AC0 LDCIF M..SUP(R3),AC1 SUBF AC1,AC0 ADDF AC0,AC3 STCFI AC0,(R4)+ TST (R4) .ENDC ;M$$AVG .ENDC ; User LDFPS #FL.DBL ; LDCIF M..USR(R0),AC0 ; LDCIF M..USR(R1),AC1 ; SUBF AC1,AC0 ; LDFPS #FL.SGL ; STCFI AC0,(R2) ; ADD (R2)+,TICTOT ; .IF DF M$$AVG LDFPS #FL.DBL LDCIF M..USR(R0),AC0 LDCIF M..USR(R3),AC1 SUBF AC1,AC0 ADDF AC0,AC3 STCFI AC0,(R4)+ TST (R4) .ENDC ;M$$AVG ; Idle LDFPS #FL.DBL ; LDCIF M..IDL(R0),AC0 ; LDCIF M..IDL(R1),AC1 ; SUBF AC1,AC0 ; LDFPS #FL.SGL ; STCFI AC0,(R2) ; ADD (R2)+,TICTOT ; .IF DF M$$AVG LDFPS #FL.DBL LDCIF M..IDL(R0),AC0 LDCIF M..IDL(R3),AC1 SUBF AC1,AC0 ADDF AC0,AC3 STCFI AC0,(R4)+ TST (R4) STCFI AC3,ORGTOT .ENDC ;M$$AVG ; Fork Queue LDFPS #FL.DBL ; LDCIF M..FRK(R0),AC0 ; LDCIF M..FRK(R1),AC1 ; SUBF AC1,AC0 ; LDFPS #FL.SGL ; STCFI AC0,(R2) ; .IF DF M$$AVG LDFPS #FL.DBL LDCIF M..FRK(R0),AC0 LDCIF M..FRK(R3),AC1 SUBF AC1,AC0 STCFI AC0,(R4)+ TST (R4) .ENDC ;M$$AVG ; ; .IFTF MOV M..IDL(R0),M..IDL(R1) ; New counts become old counts MOV M..KNL(R0),M..KNL(R1) MOV M..USR(R0),M..USR(R1) MOV M..FRK(R0),M..FRK(R1) .IIF DF K$$DAS MOV M..SUP(R0),M..SUP(R1) .IFF MOV M..IDL+2(R0),M..IDL+2(R1) MOV M..KNL+2(R0),M..KNL+2(R1) MOV M..USR+2(R0),M..USR+2(R1) MOV M..FRK+2(R0),M..FRK+2(R1) .IIF DF K$$DAS MOV M..SUP+2(R0),M..SUP+2(R1) ; ; F(x) = 100./(TICTOT/x) ; ; Where x is the number of tics for ; the current field. ; MOV #KNLTKS,R4 ; Point to tic data area MOV #KNLPER+PERCNT,R3 ; Point to percentage data area LDFPS #FL.SGL ; Set to single percision LDCIF TICTOT,AC2 ; AC1 = tic totals LDCIF #100.,AC3 ; AC1 = 100 percent 6$: ; CLRF AC0 ; Clear accumulators CLRF AC1 ; LDFPS #FL.SGL ; Set to single percision LDCIF (R4),AC0 ; AC0 = current tics DIVF AC2,AC0 ; AC0 = x/TICTOT MULF AC3,AC0 ; AC0 = percentage as a whole number ; Convert to decimal STCFI AC0,(R4) ; Save it MOV (R4),R1 ; In MOV R3,R0 ; Out CLR (R3) ; Clear out CLR 2(R3) ; ... old percentage CLR 4(R3) ; ... data CLR R2 ; Zero supression CALL $CBDMG ; Convert it ADD #PERQIO,R3 ; Bump address pointer ASR (R4)+ ; Screen only has 50 characters TST (R4) ; -1 is end odd data fields BPL 6$ ; BR to continue ; ; Now calculate the averages for total running time. ; ; F(x) = 100./(TICTOT/x) ; ; Where x is the number of tics for ; the current field. ; MOV #ORGKNL,R4 ; Point to tic data area (IN) MOV #KNLAVG,R3 ; Point to percentage data area (OUT DEC) LDFPS #FL.SGL ; Set to single percision LDCIF #100.,AC3 ; AC1 = 100 percent LDFPS #FL.DBL ; Set to double percision LDCIF ORGTOT,AC2 ; AC1 = tic totals 7$: ; CLRF AC0 ; Clear accumulators CLRF AC1 ; LDFPS #FL.DBL ; Set to double percision LDCIF (R4),AC0 ; AC0 = current tics DIVF AC2,AC0 ; AC0 = x/TICTOT MULF AC3,AC0 ; AC0 = percentage as a whole number ; Convert to decimal LDFPS #FL.SGL ; Set to single percision STCFI AC0,(R4) ; Save it MOV (R4),R1 ; In MOV R3,R0 ; Out CLR (R3) ; Clear out CLR 2(R3) ; ... old percentage CLR 4(R3) ; ... data CLR R2 ; Zero supression CALL $CBDMG ; Convert it ADD #PERQIO,R3 ; Bump address pointer ADD #4.,R4 TST (R4) ; -1 is end odd data fields BPL 7$ ; BR to continue RETURN ; .ENDC .PAGE .SBTTL DEACIB -- Deallocate CIB. ;+ ; INPUT ; None. ; OUTPUT ; Carry bit clear = Cleared or didn't exist ; Carry bit set = Another CIB was found ;- DEACIB: CALL CLRCLI ; Clear CIB BCC 1$ ; BR if OK .IIF DF M$$PRI PRINT 7 ; CIB deallocation failed JMP EXIT ; Exit 1$: RETURN ; .IF DF M$$ABO .SBTTL ABOAST -- Abort AST service routine. ;+ ; INPUT ; We are somehow aborted. ; OUTPUT ; Clean exit (deallocate CIB) via EXIT: ;- ABOAST: JMP EXIT ; Do a clean exit .ENDC ;M$$ABO .IF DF M$$USI .SBTTL USIAST -- QIO AST routine. ;+ ; INPUT ; Any character typed on the screen. ; OUTPUT ; ASTFLG = Set to one to say someone typed a character and ; M..CTW set if it was a ^W. ;- USIAST: CMPB #IE.EOF,IOSB ; ^Z typed ? BEQ 2$ ; yes CMPB #IS.SUC,IOSB ; QIO complete successfully ? BNE 1$ ; BR is no 2$: BIS #M..AST,FLAGS ; Say someone typed a character CMPB #ETB,ASTCHA ; ^W Typed ? BNE 1$ ; BR if no BIS #M..CTW,FLAGS ; Say the character was a ^W 1$: TST (SP)+ ; Pop IOSB address off stack ASTX$S ; Exit AST routine .SBTTL ISSAST -- Issue unsolicited input AST. ;+ ; INPUT ; FLAGS = Flag word. ; OUTPUT ; FLAGS = AST and ^W flags cleared. ; ASTCHA = One byte AST character buffer is cleared. ;- ISSAST: BIC #M..AST!M..CTW,FLAGS ; Clear AST and CTW flag CLR ASTCHA ; Clear AST character QIO$S #IO.RVB,#5,#1,,#IOSB,#USIAST,<#ASTCHA,#1> CMPB $DSW,#IS.SUC ; Success ? BEQ 1$ ; BR if yes MOV #6,EXSTA ; 6 = QIO failed JMP EXIT ; 1$: RETURN ; .ENDC ;M$$USI .PAGE ;*********************************************************************** ; ; The following code is included from the SRMLOG sources written ; by Michael L. Gordon for DPG. ; ;*********************************************************************** ; .TITLE CIBPRO CLOCK INTERCEPT BLOCK PROCEDURES ; .IDENT /00.006/ ;PVD .LIST MEB .NLIST MEB .MCALL CALL ; ;+ ; ;CLOCK INTERCEPT BLOCK PROCEDURES ; ;HERE ARE THE PROCEDURES THAT DIRECTLY ACCESS THE CLOCK INTERCEPT BLOCK. ; ; MICHAEL L. GORDON ; 19 MAY 1980 ; ; ; ;- ; ; MODIFIED: ; 16 JUL 80 00.001 MICHAEL L. GORDON ; SUPPORT FOR CONTROLLER BUSY STATISTICS. ; ; 13 SEP 80 00.002 MICHAEL L. GORDON ; SUPPORT FOR RSX-11M-PLUS SYSTEMS. ; ; 18 SEP 80 00.003 MICHAEL L. GGORDON ; CORRECT CONDITIONALIZATION FOR USING THE ICB/ITB POOL ; SO THAT IT IS USED ONLY IF BOTH R$$MPL AND K$$DAS ARE ; DEFINED. ; ; 19 SEP 80 00.004 MICHAEL L. GORDON ; IN CLOCK INTERCEPT CODE TEST FOR USER/SUPERVISOR VERSUS ; KERNEL IF RSX-11M-PLUS ; ; 12 NOV 80 00.005 MICHAEL L. GORDON ; SUPPORT FOR SRMLOG II. ; ; 29 JAN 81 00.006 MICHAEL L. GORDON ; SAVE THE PSW BEFORE CALLING INTERUPT SAVE. ; ; .PAGE .SBTTL CLOCK -- Intercept block. ; ;+ ; **-CLOCK INTERCEPT BLOCK. ; ;THIS IS THE CLOCK INTERCEPT BLOCK WHICH IS COPIED INTO A DYNAMIC BUFFER ;AND THEN VECTORED INTO THE CLOCK INTERUPT VECTOR. ; ; MICHAEL L. GORDON ; 19 MAY 1980 ; IDENT /00.004/ ; ;- ; ; MODIFIED: ; 16 JUL 80 00.001 MICHAEL L. GORDON ; SUPPORT FOR DISK CONTROLLER STATISTICS ; ; 13 SEP 80 00.002 MICHAEL L. GORDON ; SUPPORT FOR RSX-11M-PLUS SYSTEMS. ; ; 11 NOV 80 00.003 MICHAEL L. GORDON ; SUPPORT FOR SRMLOG II. ; ; 29 JAN 81 00.004 MICHAEL L. GORDON ; SAVE THE PSW BEFORE CALLING INTERUPT SAVE. ; 15 JAN 84 00.004 PETER V. DEVITA ; SUPPORT FOR RSX-11M-PLUS V2.0 SYSTEMS. ; ; CLKBLK: ;START OF THE CIB .IF GE SRMLEV-2 ; ;FOR ADDRESSES OF DATA BLOCKS. WE DEVELOP THE RELOCATED ADDR IN SETCLI. ADRDAT: .WORD ;ADDR OF USER RETURNED STATISTICS ADRCNT: .WORD ;ADDR OF INTERNAL STATISTICS .IFTF ; ;CUMULATIVE STATISTICS RETURNED TO USER. ; DATKNL: .WORD 0,0 ;FOR KERNEL TICKS DATUSE: .WORD 0,0 ;FOR USER TICKS DATIDL: .WORD 0,0 ;FOR IDLE TICKS. DATFRK: .WORD 0,0 ;FOR FORK TICKS DATCO1: .WORD 0 ;FOR CONTROLLER 1 TICKS. DATCO2: .WORD 0 ;FOR CONTROLLER 2 TICKS. DATCO3: .WORD 0 ;FOR CONTROLLER 3 TICKS. .IFT ;SRMLEV-2 GE ; .IF DF R$$MPL .IF DF K$$DAS DATSUP: .WORD 0,0 ;FOR SUPERVISOR TICKS .ENDC DATUN1: .WORD 0 ;FOR DEVICE 1 TICKS DATUN2: .WORD 0 ;FOR DEVICE 2 TICKS DATUN3: .WORD 0 ;FOR DEVICE 3 TICKS DATUN4: .WORD 0 ;FOR DEVICE 4 TICKS DATUN5: .WORD 0 ;FOR DEVICE 5 TICKS DATUN6: .WORD 0 ;FOR DEVICE 6 TICKS .IF NE COIDFL DATCI1: .WORD 0 ;FOR CONTROLLER 1 .AND. CPU IDLE TICKS DATCI2: .WORD 0 ;FOR CONTROLLER 2 .AND. CPU IDLE TICKS DATCI3: .WORD 0 ;FOR CONTROLLER 3 .AND. CPU IDLE TICKS .ENDC .IFTF ;SRMLEV-2 GE ; ;ENSURE LAYOUT. ASSUME DATUSE-DATKNL,4 ASSUME DATIDL-DATUSE,4 ASSUME DATFRK-DATIDL,4 ASSUME DATCO1-DATFRK,4 ASSUME DATCO2-DATCO1,2 ASSUME DATCO3-DATCO2,2 ASSUME CONMAX,3 .IFT ;SRMLEV-2 GE ; .IF DF R$$MPL .IF DF K$$DAS ASSUME DATSUP,DATCO3+2 .IFTF ASSUME UN9MAX,6 .IFT ASSUME DATUN1,DATSUP+4 .ENDC ; DF K$$DAS .IF NE COIDFL ASSUME DATCI1,DATUN6+2 .ENDC .IFTF ;SRMLEV-2 GE ; ;TIME STATISTICS STARTED. ; ;THIS IS THE 7. BYTE TIME VECTOR. INIYR:: .BYTE 0 ;YEAR INIMO: .BYTE 0 ;MONTH INIDA: .BYTE 0 ;DAY INIHR: .BYTE 0 ;HOUR INIMI: .BYTE 0 ;MINUTE INISC: .BYTE 0 ;SECOND INITI: .BYTE 0 ;TICK ; ;GUARD BYTE TO CHECK THAT THIS CIB IS OURS. GUARD: .BYTE CIBGRD ; ;CONTROL FLAG WORD. ; IF BIT 100000 IS SET, THEN THERE IS A REQUEST FOR STATISTICS. CONFLG: .WORD 0 ; ;TEMPORARY STORAGE TO SAVE THE PSW. SAVPS: .WORD 0 ; ;STATISTICS MAINTAINED SINCE STARTED. ;ONLY AVAILABLE TO THE CLOCK INTERCEPT CODE. CNTKNL: .WORD 0,0 ;KERNEL TICKS CNTUSE: .WORD 0,0 ;USER TICKS CNTIDL: .WORD 0,0 ;IDLE TICKS CNTFRK: .WORD 0,0 ;FORK TICKS CNTCO1: .WORD 0 ;DISK CONTROLLER 1 TICKS CNTCO2: .WORD 0 ;DISK CONTROLLER 2 TICKS CNTCO3: .WORD 0 ;DISK CONTROLLER 3 TICKS .IFT ;SRMLEV-2 GE ; .IF DF R$$MPL .IF DF K$$DAS CNTSUP: .WORD 0,0 ;SUPERVISOR TICKS .ENDC CNTUN1: .WORD 0 ;DEVICE 1 TICKS CNTUN2: .WORD 0 ;DEVICE 2 TICKS CNTUN3: .WORD 0 ;DEVICE 3 TICKS CNTUN4: .WORD 0 ;DEVICE 4 TICKS CNTUN5: .WORD 0 ;DEVICE 5 TICKS CNTUN6: .WORD 0 ;DEVICE 6 TICKS .IF NE COIDFL CNTCI1: .WORD 0 ;CONTROLLER 1 BUSY .AND. CPU IDLE TICKS CNTCI2: .WORD 0 ;CONTROLLER 2 BUSY .AND. CPU IDLE TICKS CNTCI3: .WORD 0 ;CONTROLLER 3 BUSY .AND. CPU IDLE TICKS .ENDC .IFTF ;SRMLEV-2 GE ; .ENABL LSB .PAGE ; ;CLOCK INTERCEPT CODE FOLLOWS. CLOCK: ;CLOCK VECTOR POINTS TO HERE. MOV 2(SP),SAVPS ;SAVE THE PSW. ;+ ; **-$CKINT-CLOCK INTERRUPT ; ; THIS ROUTINE IS ENTERED AS THE RESULT OF A CLOCK INTERRUPT. $INTSV ; IS CALLED TO SAVE REGISTERS R4 AND R5 AND $INTCT IS INCREMENT. IF ; THE RESULT IS NONZERO, THEN A JUMP TO $INTXT IS EXECUTED. ELSE ; A FORK IS EXECUTED SO THAT PENDING CLOCK INTERRUPTS CAN BE PRO- ; CESSED. ;- ;$CKINT:: ;;;REFERENCE LABEL ; BM236 1$: ; BM236 ; .IF NDF K$$DAS ; BM236 ; .IF DF K$$DAS ; PVDTST ; BM236 JSR R5,@#$INTSE ;;;CALL INTERRUPT SAVE ROUTINE ; BM236 .WORD ^C&PR7 ;;;NEW PRIORITY IS PR5 ; BM236 ; BM236 ; .IFF ; NDF K$$DAS ; BM236 ; BM236 ; JSR R5,(PC) ;;;SAVE R5 WITHOUT DISTURBING CCS ; BM236 ; JSR R4,(PC) ;;;SAVE R4 WITHOUT DISTURBING CCS ; BM236 ; MFPS R4 ;;;GET PSW CONTAINING CONTROLLER INDEX ; BM236 ; BIC #177760,R4 ;;;REDUCE TO CONTROLLER INDEX ; BM236 ; ASL R4 ;;;MAKE IT A WORD INDEX ; BM236 ; DEC @#$STKDP ;;;SWITCH STACKS ? ; BM236 ; BNE 5$ ;;;IF NE NO ; BM236 ; MOV SP,@#$HEADR ;;;SAVE STACK POINTER ; BM236 ;5$: BIC #^C&PR7,@#PS ;;;DROP TO DEVICE PRIORITY ; BM236 ; CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHE ; BM236 ; MOV #$INTSF,-(SP) ;;;PUSH ADDRESS OF EXEC EXIT ROUTINE ; BM236 ; BM236 ; .ENDC ; DF K$$DAS ; BM236 ; BM236 ; BM236 ; .IF DF K$$W11 ; MOV #3,@#K$$W11 ;;;ENABLE AND START TIMER ; .ENDC .IF DF R$$PRO MOV @#$CKCSR,-(SP) ;TMM104 ;;;PVDTST @$CKCSR ;ENSURE CLOCK ISN'T LONESOME ;TMM104 TST @(SP)+ .ENDC ;TMM104 ;TMM104 ; .IF DF M$$PRO ; CALL @#$STTIC ;UPDATE SANITY TIMER ; BIT @#$CKURM,@#$CPURM;DO WE MAINTAIN CLOCK? ; BEQ 7$ ;IF EQ NO -- EXIT ; .ENDC .IF DF R$$PRO INTSIZ=.-1$-2 ; FOR PRO/350 .IFF .IIF NDF S$$WST INTSIZ=42 ; FOR V2.0 .IIF DF S$$WST INTSIZ=30 ; FOR V2.1 .ENDC ;R$$PRO ; JSR R5,@#$INTSV ;CALL INTERUPT SAVE ROUTINE. ; .WORD ^C&PR7 ASSUME CI9STA,100000 TST CONFLG ;RETURN IMAGE OF STATISTICS? BPL 20$ ;NO. .IFF ;SRMLEV-2 GE ; ;RETURN IMAGE OF STATISTICS TO REQUESTOR. MOV CNTKNL,DATKNL ;KERNEL TICKS MOV CNTKNL+2,DATKNL+2 MOV CNTUSE,DATUSE ;USER TICKS MOV CNTUSE+2,DATUSE+2 MOV CNTIDL,DATIDL ;IDLE TICKS MOV CNTIDL+2,DATIDL+2 MOV CNTFRK,DATFRK ;FORK TICKS MOV CNTFRK+2,DATFRK+2 MOV CNTCO1,DATCO1 ;DISK CONTROLLER 1 TICKS CLR CNTCO1 ; AND CLEAR FOR NEXT INTERVAL MOV CNTCO2,DATCO2 ;DISK CONTROLLER 2 TICKS CLR CNTCO2 ; AND CLEAR FOR NEXT INTERVAL MOV CNTCO3,DATCO3 ;DISK CONTROLLER 3 TICKS CLR CNTCO3 ; AND CLEAR FOR NEXT INTERVAL .IFT ;SRMLEV-2 GE MOV ADRCNT,R4 ;ADDR OF INTERNAL BLOCK MOV ADRDAT,R5 ;ADDR OF BLOCK RETURNED TO CALLER MOV (R4)+,(R5)+ ;KERNEL TICKS MOV (R4)+,(R5)+ MOV (R4)+,(R5)+ ;USER TICKS MOV (R4)+,(R5)+ MOV (R4)+,(R5)+ ;IDLE TICKS MOV (R4)+,(R5)+ MOV (R4)+,(R5)+ ;FORK TICKS MOV (R4)+,(R5)+ MOV @R4,(R5)+ ;CONTROLLER 1 CLR (R4)+ MOV @R4,(R5)+ ;CONTROLLER 2 CLR (R4)+ MOV @R4,(R5)+ ;CONTROLLER 3 CLR (R4)+ ; .IF DF R$$MPL .IF DF K$$DAS MOV (R4)+,(R5)+ ;SUPERVISOR TICKS MOV (R4)+,(R5)+ .ENDC ; ;DEVICE TICKS .REPT UN9MAX MOV @R4,(R5)+ CLR (R4)+ .ENDR ; ;CONTROLLER BUSY .AND. CPU IDLE TICKS .IF NE COIDFL .REPT CO9MAX MOV @R4,(R5)+ CLR (R4)+ .ENDR .ENDC .ENDC ;SRMLEV-2 GE BIC #CI9STA,CONFLG ;NOW CLEAR REQUEST FLAG. ; ;SEE WHAT PROCESS WE ARE IN. 20$: .IF NDF R$$MPL ;IF NOT RSX-11M-PLUS TST SAVPS ;IN KERNEL MODE? BPL 30$ ;YES. .IFF BIT #140000,SAVPS ;IN EITHER USER OR SUPERVISOR MODE? BEQ 30$ ;NO, SO IN KERNEL. .ENDC ;DF R$$MPL ; .IF GE SRMLEV-2 .IF DF K$$DAS BPL 25$ ;BR IF IN SUPERVISOR MODE. .ENDC ; DF K$$DAS ; .ENDC ;SRMLEV-2 GE .IF DF K$$DAS .IFTF ;R$$MPL NDF INC CNTUSE+2 ;BUMP UP USER COUNT. BNE 40$ ;BR IF NOT CARRY INTO HIGH WORD. INC CNTUSE ;BUMP UP HIGH WORD. BR 40$ ; .IFF ;R$$MPL NDF ; .IF GE SRMLEV-2 .IFT ;DF K$$DAS ; ;IN SUPERVISOR MODE. 25$: INC CNTSUP+2 ;BUMP UP LOW WORD BNE 40$ ;NO CARRY. INC CNTSUP ;BUMP UP HIGH WORD BR 40$ ; .ENDC ;SRMLEV-2 GE .ENDC ;R$$MPL NDF ; ;IN KERNEL MODE, COULD BE IDLE. 30$: TSTB @#$IDLFL ;IDLE FLAG SET? BNE 35$ ;YES. INC CNTKNL+2 ;BUMP UP KERNEL COUNT. BNE 40$ ;BR IF NOT CARRY INTO HIGH WORD. INC CNTKNL ;BUMP UP HIGH WORD. BR 40$ ; ;IDLE. 35$: INC CNTIDL+2 ;BUMP UP IDLE COUNT. BNE 36$ ;BR IF NOT CARRY INTO HIGH WORD. INC CNTIDL ;BUMP UP HIGH WORD. 36$: ; ;CHECK FOR CONTROLLERS BUSY .AND. CPU IDLE .IF GE SRMLEV-2 .IF NE COIDFL ASSUME CO9MAX,3 ; ;CONTROLLER 1. CODCI1: BR 40$ ;ASSUME NO MEASUREMENT NOP ;FOR OPERAND OF INSTRUCTION BEQ CODCI2 ;IF EQ THEN CONTROLLER NOT BUSY INC CNTCI1 ;BUMP UP CONTROLLER BUSY COUNT. ; ;CONTROLLER 2. CODCI2: BR 40$ ;ASSUME NO MEASUREMENT NOP ;FOR OPERAND OF INSTRUCTION BEQ CODCI3 ;IF EQ THEN CONTROLLER NOT BUSY INC CNTCI2 ;BUMP UP CONTROLLERE BUSY COUNT. ; ;CONTROLLER 3. CODCI3: BR 40$ ;ASSUME NO MEASUREMENT NOP ;FOR OPERAND OF INSTRUCTION BEQ 40$ ;IF EQ THEN CONTROLLER NOT BUSY INC CNTCI3 ;BUMP UP CONTROLLER BUSY COUNT. .ENDC ;COIDFL NE .ENDC ;SRMLEV-2 GE ; ;SEE IF FORK QUEUE IS EMPTY. 40$: TST @#$FRKHD ;FORK QUEUE EMPTY? BEQ 50$ ;YES. INC CNTFRK+2 ;BUMP UP FORK QUEUE NON EMPTY COUNT. BNE 50$ ;BR IF NOT CARRY INTO HIGH WORD. INC CNTFRK ;BUMP UP HIGH WORD. ; ;NOW SEE WHAT DISK CONTROLLERS ARE BUSY. 50$: ; ;FOR CONTROLLER 1. CODCO1: BR 130$ ;ASSUME NO MEASUREMENT. NOP ;FOR RESERVATION OF "TSTB @#" BEQ 55$ ;IF EQ THEN CONTROLLER NOT BUSY. INC CNTCO1 ;BUMP UP COUNT OF CONTROLLER BUSY. ; ;FOR CONTROLLER 2. 55$: CODCO2: BR 130$ ;ASSUME NO MEASUREMENT. NOP ;FOR RESERVATION OF "TSTB @#" BEQ 60$ ;IF EQ THEN CONTROLLER NOT BUSY. INC CNTCO2 ;BUMP UP COUNT OF CONTROLLER BUSY. ; ;FOR CONTROLLER 3. 60$: CODCO3: BR 130$ ;ASSUME NO MEASUREMENT. NOP ;FOR RESERVATION OF "TSTB @#" BEQ 130$ ;IF EQ THEN CONTROLLER NOT BUSY. INC CNTCO3 ;BUMP UP COUNT OF CONTROLLER BUSY. ; 130$: .IF GE SRMLEV-2 ; ;DEVICE BUSY MEASUREMENT TMP=1 .MACRO UNTMES CUR,NEXT ; ;FOR UNIT 'CUR BR 140$ ;ASSUME NO MEASUREMENT NOP ;FOR OPERAND OF INSTRUCTION BEQ CODUN'NEXT ;BR IF DEVICE NOT BUSY INC CNTUN'CUR ;BUMP UP DEVICE BUSY COUNT ; ; .LIST ME CODUN'NEXT: .NLIST ME .ENDM ; ; CODUN1: .REPT UN9MAX UNTMES \TMP,\TMP+1 TMP=TMP+1 .ENDR ; 140$: .ENDC ;SRMLEV-2 GE ;NOW GO TO NORMAL CLOCK INTERUPT CODE. ;JMP @#$CKINT+6 JMP @#$CKINT+INTSIZ ; .DSABL LSB ; ;END OF CLOCK INTERCEPT BLOCK. CLKLN=.-CLKBLK ;SIZE OF CIB IN BYTES. ; ; ;NOW DEFINE ABSOLUTE OFFSETS TO CIB FIELDS RELATIVE TO THE VECTOR TRANSFER ;ADDRESS SIGNIFIED BY THE LABEL CLOCK: ; C9IKNL==DATKNL-CLOCK ;OFFSET TO KERNEL COUNT FIELD C9IUSE==DATUSE-CLOCK ;OFFSET TO USER COUNT FIELD C9IIDL==DATIDL-CLOCK ;OFFSET TO IDLE COUNT FIELD C9IFRK==DATFRK-CLOCK ;OFFSET TO FORK COUNT FIELD C9IYR==INIYR-CLOCK ;OFFSET TO START OF 7. BYTE TIME VECTOR C9IFLG==CONFLG-CLOCK ;OFFSET TO CONTROL FLAG WORD ;DEFINITION OF CONTROL FLAG WORD CI9STA==100000 ;IF SET, CALLER REQUESTS STATISTICS. C9IGRD==GUARD-CLOCK ;OFFSET TO GUARD BYTE. ; CIBGRD==62 ;GUARD BYTE VALUE. SRMCIB==62 ;GUARD BYTE VALUE. ;;;PVD CIBGRD==252 ;GUARD BYTE VALUE. ;;;PVD ; Don't want to deallocate SRMLOG's CIB ; ;CODE MODIFICATION ADDR BLOCK FOR CONTROLLER BUSY CODE. CONADB: ASSUME CONMAX,3 .WORD CODCO1 ;FIRST CODE TO BE MODIFIED TO TSTB @# .WORD CODCO2 ;2ND CODE TO BE MODIFIED TO TSTB @# .WORD CODCO3 ;3RD CODE TO BE MODIFIED TO TSTB @# ; .IF GE SRMLEV-2 .IF NE COIDFL ; ;CODE MODIFICATION FOR CONTROLLER BUSY .AND. CPU IDLE CIDADB: ASSUME CO9MAX,3 .WORD CODCI1 .WORD CODCI2 .WORD CODCI3 .ENDC ;COIDFL NE ; ;CODE MODIFICATION ADDR BLOCK FOR DEVICE BUSY UNTADB: ASSUME UN9MAX,6 .WORD CODUN1 .WORD CODUN2 .WORD CODUN3 .WORD CODUN4 .WORD CODUN5 .WORD CODUN6 ; ; .IFF ;END OF CODE MODIFICATION ADDR BLOCK. ; ; ;DEVELOPMENT OF THE OP CODE TO MOVE INTO THE ADDRESSES INDICATED BY THE ;CODE MODIFICATION ADDR BLOCK. BSYOPC: .IF NDF R$$MPL TSTB @#0 ;DEVELOP ABSOLUTE TSTB INSTRUCTION .IFF TST @#0 ;DEVELOP ABSOLUTE TST INSTRUCTION .ENDC ;NDF R$$MPL .ENDC ;SRMLEV-2 GE ; ; ;END OF DEFINITION OF THE CLOCK INTERCEPT BLOCK AND ITS DATA BASE. .PAGE .SBTTL SETCLI -- Allocate and initialize a clock intercept block. ; ;+ ; ; **-SETCLI PROCEDURE ; ;PROCEDURE TO ALLOCATE AND INITIALIZE THE CLOCK INTERCEPT BLOCK. IF THE BLOCK ;ALREADY EXISTS, THEN IF IT IS A VALID BLOCK WE COPY THE TIME VECTOR. ;ELSE WE DON'T ALTER THE INTERCEPT. ; ; INPUTS: ; R5=ADDR OF CONTROLLER REGISTRATION BLOCK. ; ; OUTPUTS: ; C-CLEAR => DONE OK. CLOCK INTERCEPT BLOCK ALLOCATED, INITIALIZED, AND ; CLOCK VECTOR OF 100 NOW POINTS TO THE CIB. ; ; 7. BYTE TIME VECTOR AT INIYR: CONTAINS THE TIME THE CIB ; WAS STARTED. ; ; IF THE CIB ALREADY EXISTS THEN THE TIME CIB STARTED IS RETURNED ; ; C-SET => FAILURE. ; EITHER THE DYNAMIC BUFFER COULD NOT BE ALLOCATED OR ANOTHER ; CLOCK INTERCEPT BLOCK WAS FOUND, WHICH WAS NOT OURS. ; ; ALSO, THE CONTROLLER REGISTRATION BLOCK COULD BE INVALID. ; ; ; ; R4 IS ONLY REGISTER NECESSARILY PRESERVED. ; ; MICHAEL L. GORDON ; 19 MAY 1980 ; IDENT /00.003/ ; ;- ; ; MODIFIED: ; 16 JUL 80 00.001 MICHAEL L. GORDON ; SUPPORT FOR DISK CONTROLLER BUSY MEASUREMENT. ; ; 13 SEP 80 00.002 MICHAEL L. GORDON ; SUPPORT FOR RSX-11M-PLUS. USE THE ICB/ITB POOL. ; ; 11 NOV 80 00.003 MICHAEL L. GORDON ; SUPPORT FOR SRMLOG II. ; ; ; .ENABL LSB ; SETCLI:: .IF LT SRMLEV-2 ; ;ENSURE THAT THE CONTROLLER REGISTRATION BLOCK IS OK. MOV (R5)+,R3 ;GET NUMBER OF CONTROLLERS. BEQ 2$ ;NONE IS OK. CMP R3,#CONMAX ;TOO MANY SUPPLIED? BLOS 2$ ;NO, OK. ; .IFF ;SRMLEV-2 LT ; ;PROCESS REGISTRATION BLOCKS MOV (R5)+,R0 ;ADDR OF DEVICE REG. BLOCK CMP @R0,#UN9MAX ;TOO MANY DEVICES? BHI 1$ ;YES, INVALID. CMP @0(R5),#CO9MAX ;TOO MANY CONTROLLERS? BLOS 3$ ;NO, OK. .IFTF ;SRMLEV-2 LT 1$: SEC ;RETURN WITH ERROR RETURN ;RETURN ; .IFF ;SRMLEV-2 LT ; ;HANDLE DEVICES. 3$: MOV (R0)+,R2 ;# TO DO. MOV #UNTADB,R1 ;ADDR OF CODE MODIFICATION ADDR BLOCK CALL PREPCD ;PREP THE CODE. ; ;CONTROLLERS. MOV @R5,R0 ;ADDR OF CONTROLLER REG. BLOCK MOV (R0)+,R2 ;# TO DO. MOV #CONADB,R1 ;ADDR OF CODE MODIFICATION ADDR BLOCK CALL PREPCD ;PREP THE CODE. ; .IF NE COIDFL ; ;CONTROLLERS BUSY .AND. CPU IDLE MOV @R5,R0 ;ADDR OF CONTROLLER REG. BLOCK MOV (R0)+,R2 ;# TO DO MOV #CIDADB,R1 ;ADDR OF CODE MODIFICATION ADDR BLOCK CALL PREPCD ;PREP THE CODE. .ENDC ;COIDFL .ENDC ;SRMLEV-2 LT ; 2$: CLC ;ASSUME OK. CALL $SWSTK,800$ ;SERIALIZE ACCESS. .IF DF R$$PRO MOV @#230,R0 ;GET CURRENT CLOCK VECTOR. .IFF MOV @#100,R0 ;GET CURRENT CLOCK VECTOR. .ENDC ;R$$PRO CMP #$CKINT,R0 ;CURRENTLY VECTORED TO CLOCK ROUTINE? BEQ 5$ ;YES, SO ALLOCATE THE CIB. CMPB C9IGRD(R0),#SRMCIB ;PVD CURRENTLY VECTORED TO SRM CLOCK ROUTINE? BEQ 32$ ;PVD BR IF YES CMPB C9IGRD(R0),#CIBGRD ;A CIB EXISTS. IS IT OURS? BEQ 32$ ;YES, SO JUST GET THE TIME. BR 10$ ;A FOREIGN CIB EXISTS. LEAVE IT ALONE. 5$: BIS #M..ALO,FLAGS ;PVD SAY WE ALLOCATED THE CLOCK BLOCK MOV #CLKLN,R1 ;LENGTH OF BLOCK TO ALLOCATE. .IF NDF R$$MPL & K$$DAS CALL $ALOCB ;ALLOCATE THE CORE BLOCK. .IFF MOV #<$ICAVL-2>,R0 ;ADDR OF ICB/ITB POOL LISTHEAD - 2. CALL $ALOC1 ;ALLOCATE THE I AND D SPACE POOL BLOCK. .ENDC ;NDF R$$MPL & K$$DAS ; BCC 20$ ;OK. ; ;ERROR IN ALLOCATION OR PROTOCAL OF THE CIB. 10$: MOV @$HEADR,R0 ;ADDR OF SAVED REGISTERS. INC 6(R0) ;SET USER C CONDITION CODE. BR 800$ ;AND RETURN. ; ;ALLOCATED THE BLOCK OK. ;HANDLE CONTROLLER BUSY MEASUREMENT PREPPING. 20$: .IF LT SRMLEV-2 TST R3 ;ANY CONTROLLERS? BEQ 24$ ;NO. MOV #CONADB,R2 ;ADDR OF CODE MODIFICATION ADDR BLOCK. 22$: MOV (R2)+,R1 ;ADDR OF NEXT CONTROLLER MEASUREMENT CODE TO CHANGE MOV BSYOPC,(R1)+ ;OPCODE OF INSTRUCTION. MOV (R5)+,@R1 ; AND ADDR OF THE MEASUREMENT FIELD SOB R3,22$ ;DO ALL CONTROLLERS. .IFF ; ;SETUP RELOCATABLE ADDRESSES. WE DO THIS RATHER THAN WRITING DYNAMIC PIC ;CODE SINCE IT EXECUTES FASTER. ;ADD THE ADDR OF THE DYNAMIC MEMORY BLOCK. ; ADD R0,ADRDAT ;TO USER BLOCK ADD R0,ADRCNT ;TO INTERNAL BLOCK. .ENDC ;SRMLEV-2 LT ; ;NOW STORE THE CURRENT TIME. 24$: MOV #$TTNS-14,R1 ;ADDR OF SYSTEM TIME BLOCK MOV #INIYR,R2 ;ADDR OF TIME VECTOR IN CIB. MOV #7,R3 ;NUMBER OF FIELDS TO DO. 25$: MOVB (R1)+,(R2)+ ;COPY THE TIME. INC R1 ;THE SYSTEM TIME BLOCK HAS A WORD FIELD SIZE SOB R3,25$ ;ALL OF IT. ; ;NOW COPY THE CIB TO THE DYNAMIC STORAGE BUFFER. MOV R0,CIBADR ;;;PVD MOV R0,R2 ;COPY THE DSR BUFFER ADDR MOV #CLKBLK,R1 ;ADDR OF THE CIB. MOV #,R3 ;# OF WORDS TO COPY. 30$: MOV (R1)+,(R2)+ ;COPY A WORD SOB R3,30$ ;ALL OF IT. ADD #CLOCK-CLKBLK,R0 ;ADDR OF THE NEW CLOCK INTERUPT ROUTINE MOV R0,NEWCIN ;;;PVD .IF DF R$$PRO MOV R0,@#230 ;AND SET OUR CIB ADDR IN THE CLOCK VECTOR. .IFF MOV R0,@#100 ;AND SET OUR CIB ADDR IN THE CLOCK VECTOR. .ENDC ;R$$PRO ; 800$: RETURN ;RETURN FROM SYSTEM STACK TO USER STACK, AND ;THEN RETURN TO THE CALLER OF THIS PROCEDURE. ; ; ;THE CIB WE FOUND IS OK. COPY THE DATE/TIME VECTOR IN THE CIB. 32$: MOV #INIYR,R2 ;TIME VECTOR IN OUR BUFFER. ADD #C9IYR,R0 ;POINT TO TIME VECTOR IN CIB. MOV #7,R3 ;NUMBER OF BYTES TO COPY. 33$: MOVB (R0)+,(R2)+ ;COPY THE NEXT CHARACTER. SOB R3,33$ ;ALL OF IT. BR 800$ ;AND GOOD RETURN. ; ;END OF PROCEDURE SETCLI. ; .IF GE SRMLEV-2 ; ; ; PROCEDURE PREPCD ; ; PROCEDURE TO PREP THE CLOCK INTERCEPT BLOCK OPCODES FOR MEASUREMENTS ; ; INPUTS: ; R0=ADDR OF THE CODES TO PUT IN, OF FORM: ; .WORD ; .WORD ; .BYTE ; .BYTE ; R1=ADDR OF CODE MODIFICATION ADDR BLOCK ; R2=# OF ENTRIES TO DO. ; ; OUTPUTS: ; R0=END ADDR ; R1=END ADDR ; R2=ZERO ; ; R3 IS ALTERED ; ; PREPCD: TST R2 ;ANY TO DO? BEQ 380$ ;NO, OUT. ; ;NEXT ENTRY HERE. 310$: MOV (R1)+,R3 ;ADDR OF CODE BLOCK TO MODIFY MOV (R0)+,(R3)+ ;FIRST WD OF CHANGED CODE. MOV (R0)+,(R3)+ ;SECOND WD OF CHANGED CODE. CMPB (R0)+,(R3)+ ;SKIP OVER LOW BYTE. MOVB (R0)+,(R3)+ ;HI BYTE OF CHANGED CODE. SOB R2,310$ ;DO ALL ENTRIES 380$: RETURN ;RETURN FROM PREPCD ; ; END OF PROCEDURE PREPCD ; .ENDC ;SRMLEV-2 GE ; .PAGE .SBTTL CLRCLI -- Clear intercept block procedure. ; ;+ ; **-CLRCLI PROCEDURE ; ; PROCEDURE TO CLEAR THE CLOCK INTERCEPT BLOCK. ; ; IF THE CLOCK INTERCEPT BLOCK IS NOT OURS, WE WILL NOT CLEAR IT. ; ; INPUTS: ; NONE ; OUTPUTS: ; C-CLEAR => WE CLEARED IT OR IT DID NOT EXIST. ; C-SET => ANOTHER CIB WAS FOUND. ; ; R4 IS ONLY REGISTER NECESSARILY PRESERVED. ; ; MICHAEL L. GORDON ; 19 MAY 1980 ; IDENT /00.001/ ; ;- ; ; MODIFIED: ; 13 SEP 80 00.001 MICHAEL L. GORDON ; SUPPORT FOR RSX-11M-PLUS. USE ICB/ITB POOL. ; ; CLRCLI:: CLC ;ASSUME OK. BIT #M..ALO,FLAGS ;PVD DID WE ALLOCATE THE CLOCK BLOCK BEQ 800$ ;PVD BR IF NO CALL $SWSTK,800$ ;SERIALIZE ACCESS IN SYSTEM STACK. .IF DF R$$PRO MOV @#230,R0 ;GET CLOCK INTERCUPT VECTOR .IFF MOV @#100,R0 ;GET CLOCK INTERCUPT VECTOR .ENDC ;R$$PRO CMP #$CKINT,R0 ;DOES A CIB EXIST? BEQ 800$ ;NO, JUST RETURN ; ;CIB EXISTS, SEE IF IT IS OURS. CMPB C9IGRD(R0),#CIBGRD ;VALID GUARD BYTE? BNE 10$ ;NO, A FOREIGN CIB. SO RETURN WITH C SET. ; ;WE CAN DEALLOCATE THIS CIB. .IF DF R$$PRO MOV #$CKINT,@#230 ;RESET CLOCK VECTOR TO SYSTEM CLOCK CODE. .IFF MOV #$CKINT,@#100 ;RESET CLOCK VECTOR TO SYSTEM CLOCK CODE. .ENDC ;R$$PRO SUB #CLOCK-CLKBLK,R0 ;POINT TO BEGINNING OF BLOCK. MOV #CLKLN,R1 ;SIZE OF BLOCK IN BYTES. .IF NDF R$$MPL & K$$DAS CALLR $DEACB ;CALL AND RETURN DEALLOCATION ROUTINE. .IFF MOV #<$ICAVL-2>,R3 ;ADDR OF ICB/ITB POOL LISTHEAD -2. CALLR $DEAC1 ;CALL AND RETURN FROM DEALLOCATION ; ROUTINE. .ENDC ;NDF R$$MPL $ K$$DAS ; ;END OF PROCEDURE CLRCLI. ; 1000$: JMP 10$ ;BR HELPER. 8000$: JMP 800$ ;BR HELPER. ; .PAGE .SBTTL RSTCLI -- Request statistics registration. ; ;+ ; **-RSTCLI PROCEDURE ; ;PROCEDURE TO REQUEST THAT STATISTICS BE MADE AVAILABLE TO THE CALLER. ; ; STATISTICS ARE NOT IMMEDIATELY AVAILABLE. WHEN THE CIB EXAMINES THE FLAG ; AT THE NEXT CLOCK TICK, THEN THE STATISTICS ARE MADE AVAILABLE AND THE ; REQUEST FLAG IS CLEARED BY THE CIB ; ; INPUTS: ; R1=ADDR OF 7. BYTE TIME VECTOR ; ; OUTPUTS: ; C-CLEAR => REQUEST ACCEPTED. ; C-SET => INVALID CIB OR TIME VECTOR DID NOT MATCH ONE IN THE CIB. ; ; R0,R1,R2,R3 ALTERED ; RSTCLI:: CLC ;ASSUME OK. CALL $SWSTK,800$ ;SERIALIZE ACCESS. .IF DF R$$PRO MOV @#230,R0 ;ADDR OF CURRENT CLOCK INTERUPT VECTOR. .IFF MOV @#100,R0 ;ADDR OF CURRENT CLOCK INTERUPT VECTOR. .ENDC ;R$$PRO CALL VERCLI ;VERIFY THAT IT IS OK. BCS 1000$ ;NO GOOD. BIS #CI9STA,C9IFLG(R0) ;SET FLAG REQUESTING STATISTICS. BR 8000$ ;AND GOOD RETURN. ; ; END OF PROCEDURE RSTCLI. .PAGE .SBTTL GSTCLI -- Gather statistics. ; ;+ ; **-GSTCLI PROCEDURE ; ;GATHER STATISTICS ; ;IF THE CIB IS GOOD AND THE STATISTICS REQUEST FLAG IS CLEAR THEN AN 8. WORD ;STATISTICS BLOCK IS RETURNED TO THE CALLER. ; ; INPUTS: ; R1=ADDR OF 7. BYTE TIME VECTOR ; R2=ADDR OF CIBSSZ/2 WORD STATISTICS BLOCK INTO WHICH DATA IS RETURNED ; ; OUTPUTS: ; C-CLEAR => DONE OK. ; C-SET => INVALID CIB OR 7. BYTE TIME VECTORS DID NOT MATCH. ; ; MICHAEL L. GORDON ; 19 MAY 1980 ; IDENT /00.001/ ; ;- ; ; MODIFIED: ; 16 JUL 80 00.001 MICHAEL L. GORDON ; SUPPORT FOR RETURNING CIBSSZ/2 WORDS INTO STATISTICS BLOCK ; ; GSTCLI:: CLC ;ASSUME OK. CALL $SWSTK,800$ ;SERIALIZE ACCESS. .IF DF R$$PRO MOV @#230,R0 ;ADDR OF CURRENT CLOCK INTERUPT VECTOR .IFF MOV @#100,R0 ;ADDR OF CURRENT CLOCK INTERUPT VECTOR .ENDC ;R$$PRO MOV R2,-(SP) ;SAVE IT. CALL VERCLI ;VERIFY INTEGRITY OF CIB MOV (SP)+,R2 BCS 1000$ ;NO GOOD. ASSUME CI9STA,100000 TST C9IFLG(R0) ;STATISTICS GATHERED? BMI 1000$ ;NO. ; ;STATISTICS ARE AVAILABLE. COPY TO USER BUFFER. ADD #C9IKNL,R0 ;POINT TO STATISTICS FIELDS IN CIB. MOV #,R1 ;NUMBER OF WORDS TO COPY. 50$: MOV (R0)+,(R2)+ ;COPY A WORD SOB R1,50$ ;ALL OF IT. BR 8000$ ;AND RETURN. ; ;END OF PROCEDURE GSTCLI .DSABL LSB .PAGE .SBTTL VERCLI -- Verify CIB procedure. ; ;+ ; **-VERCLI PROCEDURE ; ; PROCEDURE TO VERIFY THAT THE CIB EXISTS, HAS A CORRECT GUARD BYTE AND THAT ; THE TIME VECTOR IN THE CIB IS EQUAL TO THE ONE SUPPLIED BY THE CALLER. ; ; ************************************************************************** ; IT IS ASSUMED THAT WE ARE ENTERED IN SYSTEM STACK TO SERIALIZE ACCESS ; TO THE CIB ; ************************************************************************** ; ; INPUTS: ; R0=CLOCK INTERUPT VECTOR ; R1=ADDR OF USER'S 7. BYTE TIME VECTOR. ; ; OUTPUTS: ; C-CLEAR => VALID CIB AND USER TIME MATCHES ; C-SET => INVALID CIB OR USER TIME DOES NOT MATCH CIB TIME. ; ; R1,R2,R3 ALTERED ; ; MICHAEL L. GORDON ; 19 MAY 1980 ; ;- ; VERCLI:: CMP #$CKINT,R0 ;NORMAL CLOCK INTERUPT IN VECTOR? BEQ 990$ ;YES, NO CIB. CMPB #CIBGRD,C9IGRD(R0) ;VALID GUARD BYTE? BEQ 4$ ;NO, A FOREIGN CIB. CMPB #SRMCIB,C9IGRD(R0) ;PVD SRMLOG GUARD BYTE? BNE 990$ ; 4$: MOV R0,R2 ;COPY CIB ADDR ADD #C9IYR,R2 ;POINT TO TIME VECTOR IN CIB. MOV #7,R3 ;NUMBER OF BYTES TO CHECK. 5$: CMPB (R1)+,(R2)+ ;TIME MATCH? BNE 990$ ;NO. SOB R3,5$ ;CHECK ENTIRE TIME VECTOR. RETURN ;GOOD RETURN. OK CIB. 990$: SEC ;ERROR. RETURN ; ; END OF PROCEDURE VERCLI. ; ; ; ;END OF MODULE SYSCIBPRO. ; .END ;*********************************************************************** ; ; End of Michael L. Gordons code. ; ;*********************************************************************** .PAGE .EVEN ; ; DIRECTIVE PARAMETER BLOCKS ; OUTSCR: QIOW$ IO.WVB,$SLUN,$QIOF,,IOSB,, .IIF DF F$$LPP OUTPER: QIOW$ IO.WVB,$SLUN,$QIOF,,IOSB,, PRIQIO: QIOW$ IO.WVB,$SLUN,$QIOF,,IOSB,, .SBTTL LCLDAT -- Local data. IOSB: .BLKW 2 ; I/O STATUS BLOCK ADDR: .WORD 0 SIZE: .WORD 0 FLAGS: .WORD M..NOP!M..1ST ; No print flag and 1st time in initially set $SLUN=5 $QIOF=1 KNLTKS: .WORD 0 ; Kernel tic output count .IF DF K$$DAS SUPTKS: .WORD 0 ; Supervisor tic output count .ENDC USRTKS: .WORD 0 ; User tic output count IDLTKS: .WORD 0 ; Idle tic output count FRKTKS: .WORD 0 ; Fork Queue tic output count GOHOME: .WORD -4 ; Don't clear to end of line .WORD -1 ; End the list TICTOT: .WORD 0 ; Accumulated tic totals .IF DF M$$AVG ORGKNL: .BLKW 2 ; Kernel tic output count .IF DF K$$DAS ORGSUP: .BLKW 2 ; Supervisor tic output count .ENDC ORGUSR: .BLKW 2 ; User tic output count ORGIDL: .BLKW 2 ; Idle tic output count ORGFRK: .BLKW 2 ; Fork Queue tic output count .WORD -1 ; End of list .WORD -1 ; ... ORGTOT: .BLKW 2 ; Accumulated tic total for total run average .ENDC ;M$$AVG .IF DF F$$LPP KNLPER: ; Kernel tic output percentage .ASCII /[10;71H/ .BLKB 6 .IF DF M$$AVG .ASCII /[10;77H/ KNLAVG: .BLKB 6 .ENDC ;M$$AVG .ASCII .EVEN .IF DF K$$DAS SUPPER: ; Supervisor tic output percentage .ASCII /[12;71H/ .BLKB 6 .IF DF M$$AVG .ASCII /[12;77H/ SUPAVG: .BLKB 6 .ENDC ;M$$AVG .ASCII .EVEN .ENDC USRPER: ; User tic output percentage .ASCII /[14;71H/ .BLKB 6 .IF DF M$$AVG .ASCII /[14;77H/ USRAVG: .BLKB 6 .ENDC ;M$$AVG .ASCII .EVEN IDLPER: ; Idle tic output percentage .ASCII /[16;71H/ .BLKB 6 .IF DF M$$AVG .ASCII /[16;77H/ IDLAVG: .BLKB 6 .ENDC ;M$$AVG .ASCII .EVEN FRKPER: ; Fork Queue tic output percentage .ASCII /[20;71H/ PERCNT=.-FRKPER .BLKB 6 .IF DF M$$AVG .ASCII /[20;77H/ FRKAVG: .BLKB 6 .ENDC ;M$$AVG .ASCII .EVEN PERQIO=.-FRKPER .ENDC ;F$$LPP .EVEN ; ; GETIM: .BLKW 8. NEWDAT: .BLKW ; Tic information just gathered OLDDAT: .BLKW ; Pervious tic information .IIF DF M$$AVG ORGDAT: .BLKW ; Original tic information ; ; Device and Controller Registration Blocks ; ALLREG: .WORD 0,0 CNTREG: .WORD 0,0 DEVREG: .WORD 0,0 ; ; Line coordinates ; ; NOTE: Coordinates must all be the same size. ; Pad at end with nulls if nesessary. ; KNLXY: .ASCII /[10;19H/ .IF DF K$$DAS SUPXY: .ASCII /[12;19H/ .ENDC USRXY: .ASCII /[14;19H/ IDLXY: .ASCII /[16;19H/ FRKXY: .ASCII /[20;19H/ HOME: .ASCII /[01;01H/ CORLEN=.-HOME PERLIN: .ASCII ; Start of a percentage line CORLIN: .BLKB CORLEN ; Storage for (X,Y) coordinates .ASCII /[0K/ ; Clear to end of line FXDLEN=.-PERLIN ; Fixed length portion of QIO .NLIST ; Create maximum output percentage line .REPT 50. .BYTE '> .ENDR .BYTE '* .LIST .NLIST BEX .EVEN .IIF DF M$$USI ASTCHA: .WORD 0 ; Unsolicited input character storage EXSTA: .WORD 1 ; Exit status .PAGE .SBTTL SCRLAY -- Screen Layout. MSG1: .ASCII /[2J/ ; Clear entire screen .IF DF R$$PRO .ASCII /[1;35HRSX-11M-Plus/ .IFF .ASCII /[1;32HRSX-11M-Plus V/ .EVEN VERSN: .BLKW 2 .ENDC ;R$$PRO .ASCII /[2;33HProcessor Modes/ .ASCII .EVEN .IF NDF R$$PRO .ASCII /[3;36H'/ SYSTEM: .WORD 0 .ASCII /' System/ .ASCII .EVEN .ENDC ;R$$PRO .IF DF R$$PRO .ASCII \[3;34HPRO/350 System\ .ASCII .EVEN .ENDC ;R$$PRO MSG0: .ASCII /[4;32H/ DATBUF: .BLKB 10. .BYTE 40 TIMBUF: .BLKB 7. .ASCII MSGL0=.-MSG0 .IF DF M$$TST TESTL: .ASCII /[6;30HTHIS IS A TEST -- DATA NOT VALID/ .ASCII .ENDC ; DF M$$TST LINE7: .ASCII /[7;18H0//[7;27H20//[7;37H40/ .ASCII .ASCII /[7;47H60//[7;57H80//[7;66H100% CUR/ .IIF DF M$$AVG .ASCII / AVG/ .ASCII LINE8: .ASCII /[8;18H+---------+---------+---------+---------+---------+/ .ASCII / ---/ .IIF DF M$$AVG .ASCII / ---/ .ASCII LINE9: .ASCII /[9;18H|//[9;28H|//[9;38H|/ .ASCII /[9;48H|//[9;58H|//[9;68H|/ .ASCII LINE10: .ASCII /[10;2HKernel/ .ASCII /[10;18H|//[10;28H|//[10;38H|/ .ASCII /[10;48H|//[10;58H|//[10;68H|/ .ASCII LINE11: .ASCII /[11;18H|//[11;28H|//[11;38H|/ .ASCII /[11;48H|//[11;58H|//[11;68H|/ .ASCII .IF DF K$$DAS LINE12: .ASCII /[12;2HSupervisor/ .ENDC .ASCII /[12;18H|//[12;28H|//[12;38H|/ .ASCII /[12;48H|//[12;58H|//[12;68H|/ .ASCII LINE13: .ASCII /[13;18H|//[13;28H|//[13;38H|/ .ASCII /[13;48H|//[13;58H|//[13;68H|/ .ASCII LINE14: .ASCII /[14;2HUser/ .ASCII /[14;18H|//[14;28H|//[14;38H|/ .ASCII /[14;48H|//[14;58H|//[14;68H|/ .ASCII LINE15: .ASCII /[15;18H|//[15;28H|//[15;38H|/ .ASCII /[15;48H|//[15;58H|//[15;68H|/ .ASCII LINE16: .ASCII /[16;2HIdle/ .ASCII /[16;18H|//[16;28H|//[16;38H|/ .ASCII /[16;48H|//[16;58H|//[16;68H|/ .ASCII LINE17: .ASCII /[17;18H|//[17;28H|//[17;38H|/ .ASCII /[17;48H|//[17;58H|//[17;68H|/ .ASCII LINE18: .ASCII /[18;18H+---------+---------+---------+---------+---------+/ .ASCII LINE19: .ASCII /[19;18H|//[19;28H|//[19;38H|/ .ASCII /[19;48H|//[19;58H|//[19;68H|/ .ASCII LINE20: .ASCII /[20;2HFork Queue Busy/ .ASCII /[20;18H|//[20;28H|//[20;38H|/ .ASCII /[20;48H|//[20;58H|//[20;68H|/ .ASCII LINE21: .ASCII /[21;18H|//[21;28H|//[21;38H|/ .ASCII /[21;48H|//[21;58H|//[21;68H|/ .ASCII LINE22: .ASCII /[22;18H+---------+---------+---------+---------+---------+/ .ASCII MSGL1=.-MSG1 .PAGE .EVEN MSG2: .ASCII /[22;1H/ MSGL2=.-MSG2 .IF DF M$$PRI .SBTTL TSKERR -- Task Error Messages MSG 3, MSG 4, MSG 5, MSG 6, MSG 7, .ENDC ;M$$PRI .EVEN CIBADR: .WORD 0 NEWCIN: .WORD 0 TEMP: .BLKB 6 .END START