.TITLE NOD .IDENT /09JUN7/ ; PROGRAM NAME - NOD ; ; SYSTEM/MACHINE - RSX-11D V6B / PDP-11/45 ; ; AUTHOR - RICHARD KITTELL, MP-1 ; (MODIFIED A WRITE-UP FROM RSX SIG NEWSLETTER) ; ; DATE - JANUARY 1975 ; ; TYPE/LANGUAGE - MCR TASK / MACRO-11 ; ; REVISIONS: ; 24-MAY-77 (MK) ADAPTED FOR 'MOTHER' SYSTEM ; 9-JUN-77 (MK) CODE ADDED TO PREVENT SYSTEM CRASH ON STACK ; OVERFLOW ; ; ; ABSTRACT - WILL PRINT THE ; NUMBER OF FREE NODES, THE NUMBER OF NODES ; IN USE, AND THE NUMBER OF NODES USED BY EACH TASK. TASK SWITCHING ; IS INHIBITED WHILE THE NODES ARE BEING SURVEYED TO PREVENT ; GARBLING OF DATA. ; ; ; ; 1. INTERFACE ; ; 1.1 EXECUTION-- ; ; MCR>NOD ; ; 1.2 TASKS CALLED-- ; ; NONE ; ; 1.3 INTER-TASK COMMUNICATION-- ; ; NONE ; ; 1.4 TERMINATION-- ; ; EXITS WHEN FINISHED. ; ; 2. PROGRAM DETAIL ; ; 2.1 MACROS-- ; .MCALL DIR$,GMCR$,QIOW$,EXIT$S .MACRO WRITE,BUF,LEN MOV #BUF,QIO+Q.IOPL MOV #LEN,QIO+Q.IOPL+2 DIR$ #QIO .ENDM WRITE .MACRO CONVRT,BUF MOV #BUF,R0 MOV (SP)+,R1 MOV #1,R2 CALL $CBDSG .ENDM CONVRT .MACRO PSHDAT X TST SP BEQ STKOVF MOV X,-(SP) .ENDM PSHDAT ; ; 2.2 SYMBOL DEFINITIONS-- ; EF=24 ;EVENT FLAG FOR I/O LUN=1 ;LUN FOR I/O ; ; 2.3 STORAGE ALLOCATION AND INITIALIZATION-- ; FREMSG: .ASCII / . NODES AVAILABLE TO TASKS/ FREEND: USEMSG: .ASCII / . NODES IN USE, AS FOLLOWS:/ USEEND: BYMSG: .ASCII / . NODES USED BY / TSKNAM: .BLKB 6 BYEND: STKMSG: .ASCII /STACK OVERFLOW; REBUILD NOD WITH LARGER STACK./ STKEND: .EVEN TOTAL: .WORD 0 ;ACCUMULATES NODES IN USE HOLD: .BLKW 2 ;HOLDS RAD50 TASK NAME FOR CONVERSION LF: .BYTE 12,15 ;LINE FEED AND CARRIAGE RETURN QIO: QIOW$ IO.WVB,LUN,EF,,,,<0,0,40> GMCR: GMCR$ ; ; 2.4 PROGRAM FLOW-- ; ; DO A 'GET MCR LINE' TO RELEASE BUFFER AND LOAD MONITOR ON EXIT ; START: DIR$ #GMCR ; ; DISABLE TASK SWITCHING WHILE PUSHING DATA ONTO STACK ; MOV @#PS.EXP,R2 BISB #140,@#PS.EXP ; ; PUSH NODE USAGE BY TASK ONTO STACK; ACCUMULATE # OF NODES IN ; USE. ; CLR TOTAL ;;CLEAR ACCUMULATOR MOV .STDTA,R4 ;;START OF STD LOOP1: MOV (R4)+,R5 ;;NEXT ENTRY IN R5 BEQ 1$ ;;NO MORE ENTRIES TST S.PU(R5) ;;DOES THIS TASK HAVE ANY NODES? BEQ LOOP1 ;;NO, CHECK FOR END OF STD ADD S.PU(R5),TOTAL ;;BUMP TOTAL OF NODES IN USE PSHDAT S.PU(R5) ;;SAVE COUNT ON STACK PSHDAT 2(R5) ;;SAVE 2ND HALF OF TASK NAME PSHDAT (R5) ;;SAVE 1ST HALF OF TASK NAME BR LOOP1 1$: ; ; COUNT UNUSED NODES AND PUSH VALUE ONTO STACK ; CLR R1 ;;ACCUMULATOR MOV .POLLH,R0 ;;GET FIRST HOLE BEQ LP2ND ;;NO HOLES LOOP2: ADD 2(R0),R1 ;;ADD THIS NODE MOV (R0),R0 ;;GET NEXT HOLE BNE LOOP2 ;;MORE TO DO LP2ND: ASH #-4,R1 ;;DIVIDE BY 16 TO GET NODES PSHDAT R1 ;;SAVE EMPTY NODE COUNT PSHDAT R2 ;;PUT OLD PS ON STACK TST SP BNE STKOK ; ; STACK OVERFLOW ; STKOVF: MOV #100,SP ;;GET SOME STACK TO WORK WITH MOV R2,-(SP) ;;ENABLE TASK SWITCHING CALL ..ENB0 WRITE STKMSG,STKEND-STKMSG ;WRITE MESSAGE EXIT$S ; ; ENABLE TASK SWITCHING ; STKOK: CALL ..ENB0 ; ; WRITE NUMBER OF FREE NODES ; WRITE LF,2 ;SKIP A LINE CONVRT FREMSG WRITE FREMSG,FREEND-FREMSG ; ; WRITE NUMBER OF NODES IN USE ; MOV TOTAL,-(SP) CONVRT USEMSG WRITE USEMSG,USEEND-USEMSG ; ; WRITE NUMBER OF NODES USED BY EACH TASK ; WRITE LF,2 ;SKIP A LINE LOOP3: MOV #TSKNAM,R3 ;PUT ASCII TASK NAME HERE MOV (SP)+,HOLD ;GET NAME FROM STACK (STILL IN RAD50) MOV (SP)+,HOLD+2 MOV #HOLD,R2 ;GIVE RAD50 CONVERTER THE ADDRESS MOV #6,R1 CALL ..RDTA ;CONVERT RAD50 TO ASCII SUB (SP),TOTAL ;CHECK OFF THIS TASK CONVRT BYMSG WRITE BYMSG,BYEND-BYMSG TST TOTAL ;HAVE WE PRINTED THEM ALL? BGT LOOP3 ;NO, DO IT TO IT ; ; ALL DONE ; WRITE LF,2 ;SKIP A LINE EXIT$S .END START