.TITLE ATL .IDENT /29NOV6/ ; ; ATL ATL DISPLAY FOR STATUS ; ; AUTHOR: M. KELLOGG ; SYSTEM: RSX-11D ; DATE: 19-NOV-76 ; REVISIONS: ; 29-NOV-76 (MK) MRL DISPLAY READABILITY IMPROVED ; ; THIS SUBROUTINE DISPLAYS THE ATL AND MRLS ON THE TEC SCOPE. ; ; DISPLAY FORMAT: ; ; UP TO 6 COLUMNS OF INFORMATION ARE DISPLAYED, USING THE NUMBER OF LINES ; SPECIFIED BY PARAMETER 'LINES'. THE FOLLOWING ITEM FORMATS ARE USED: ; ; ; DISPLAYED AT THE HEAD OF THE FIRST COLUMN. ; ; TSKNAMST ; TSKNAM TASK NAME ; NN TERMINAL NUMBER (OR 'BP' IF TASK IS BEING RUN BY BATCH) ; ST TASK STATUS (SEE TSKTBL FOR CODES). IF THE TASK IS IN ; AN AST, THE STATUS BLINKS. ; ; ; DISPLAYED BEFORE DISPLAY OF MRLS ; ; PARNAM ; PARNAM PARTITION NAME; THE MRL FOR THIS PARTITION FOLLOWS ; ; INPUTS: ; ; R0 LINE NUMBER OF START OF DISPLAY ; ; OUTPUTS: ; ; R0 NUMBER OF NEXT FREE LINE ; ; NO REGISTERS PRESERVED ; .MCALL DIR$ ; .MACRO .INH0 MOV @#PS.EXP,-(SP) BISB #140,@#PS.EXP .ENDM .INH0 ; .MACRO MOVTXT TEXT,?L MOV #TEXT,R2 L: MOVB (R2)+,(R0)+ TSTB (R2) BNE L .ENDM MOVTXT ; LINES=7. ;NUMBER OF LINES FOR DISPLAY ; ATLT: .ASCIZ <33>/S / ;END BLINK + '' MRLT: .ASCII / / BLANKS: .ASCIZ / / .EVEN CHPOS: .WORD 0 ;ALSO USED AS INITIAL LOAD FLAG LINPOS: .WORD 0 ; ; TASK STATUS TABLE ; TSKTBL: .ASCII / / ;TASK STATUS .ASCII /LQ/ ;LOAD REQUEST QUEUED .ASCII /LS/ ;LOAD REQUEST SUCCEEDED .ASCII /LF/ ;LOAD REQUEST FAILED .ASCII /RN/ ;TASK RUNNING .ASCII /AQ/ ;TASK AST QUEUED .ASCII /SU/ ;TASK SUSPENDED .ASCII /W0/ ;WAIT FOR EV FLAG 1-16 .ASCII /W1/ ;WAIT FOR EV FLAG 17-32 .ASCII /W2/ ;WAIT FOR EV FLAG 33-48 .ASCII /W3/ ;WAIT FOR EV FLAG 49-64 .ASCII /W4/ ;WAIT FOR EV FLAG 1-64 .ASCII /EX/ ;TASK EXITED .ASCII /IR/ ;I/O RUNDOWN REQUIRED .ASCII /IP/ ;I/O RUNDOWN IN PROGRESS .ASCII /ID/ ;I/O RUNDOWN FINISHED .ASCII /IF/ ;I/O RUNDOWN FAILED .ASCII /TF/ ;TASK TERMINATION FAULT .ASCII /TR/ ;TASK TERMINATION NOTICE REQ .ASCII /TS/ ;TASK SUSPENDED FOR TERM NOTICE .ASCII /SC/ ;TASK SUSPENDED FOR CHECKPOINTING .ASCII /RQ/ ;RECORD REQUEST QUEUED .ASCII /RS/ ;RECORD REQUEST SUCCEEDED .ASCII /RF/ ;RECORD REQUEST FAILED .ASCII /PE/ ;PARITY ERROR .ASCII /EA/ ;EXIT AFTER ACCOUNTING INFO IS WRITTEN .ASCII /WA/ ;WAITING FOR ACCOUNTING INFO TO BE WRITTEN .ASCII /MR/ ;TASK IN MRL - USED BY CHECKPOINTING .ASCII /ME/ ;TASK IN MRL FOR 'EXECUTE' - USED BY .REQS ; ; TASK BUFFER ; TSKBUF: .WORD -2,0,0,0 ;ATL HEAD ENTRY .BLKW 4*<6*LINES-2> ;ROOM FOR LINES*COLS-2 ENTRIES BUFEND: .BLKW 5 ;ROOM FOR ONE MORE ENTRY + STOP ATL:: MOV R0,-(SP) ;SAVE STARTING LINE TSTB CHPOS ;INITIAL LOAD? BNE SCAN ;NO MOV #TSKBUF+8.,R0 10$: CLR (R0)+ ;ZERO TASK BUFFER CMP R0,#BUFEND+10. BLO 10$ ; ; SCAN ATL AND MRLS ; ; IN ORDER TO GET A TRUE 'SNAPSHOT' OF THE SYSTEM, TASK SWITCHING IS ; INHIBITED AND TASK INFORMATION STORED IN A TEMPORARY BUFFER. FOR THE ; FORMAT OF A TASK ENTRY, SEE SUBROUTINE SCANTL. OTHER ENTRY FORMATS ; USED (4 WORDS EACH) ARE ; ; ATL HEAD ENTRY ; ; WD 1 -2 ; WD 2,3,4 DON'T CARE ; ; MRL HEAD ENTRY ; ; WD 1 -3 ; WD 2,3,4 DON'T CARE ; ; MRL PARTITION ENTRY: ; ; WD 1 PARTITION NAME (1ST 3 CHARS, RAD50) ; WD 2 PARTITION NAME (2ND 3 CHARS, RAD50) ; WD 3 ZERO ; WD 4 DON'T CARE ; ; LEFTOVER ENTRY: ; ; WD 1 -1 ; WD 2,3,4 DON'T CARE ; ; END OF LIST: ; ; WD 1 ZERO ; WD 2,3,4 DON'T CARE ; ; LEFTOVER ENTRIES ARE CAUSED BY THE LIST BEING LONGER ON THE ; PREVIOUS SCAN; THEY MUST BE BLANKED IN THE DISPLAY. ; SCAN: MOV #TSKBUF+8.,R0 ;POINT TO START OF BUFFER MOV #.ATLLH,R1 ;POINT TO ATL LIST HEAD CLR R5 ;RESET MRL FLAG .INH0 ;;INHIBIT TASK SWITCHING CALL SCANTL ;;SCAN THE ATL BCS 30$ ;;DONE IF BUFFER FULL MOV .TPDBA,R4 ;;POINT TO FIRST TPD ENTRY 10$: MOV R4,R1 ADD #T.RF,R1 ;;POINT TO MRL LISTHEAD CMP (R1),R1 ;;ANYTHING IN MRL? BEQ 20$ ;;NO TST R5 ;;MRL HEAD ENTRY MADE YET? BNE 15$ ;;YES INC R5 ;;SET MRL FLAG MOV #-3,(R0) ;;PUT HEAD ENTRY IN BUFFER ADD #8.,R0 CMP R0,#BUFEND ;;BUFFER FULL? BHI 30$ ;;YES 15$: MOV (R4),(R0)+ ;;PUT PAR NAME IN BUFFER MOV 2(R4),(R0)+ CLR (R0)+ ;;PUT PAR FLAG IN BUFFER CLR (R0)+ CMP R0,#BUFEND ;;BUFFER FULL? BHI 30$ ;;YES CALL SCANTL ;;SCAN THE MRL BCS 30$ ;;DONE IF BUFFER FULL 20$: ADD #T.SZ,R4 ;;POINT TO NEXT TPD ENTRY CMP R4,.TPDEA ;;DONE? BLO 10$ ;;NO 30$: CALL ..ENB0 ;;ENABLE TASK SWITCHING 40$: TST (R0) ;CHECK FOR LEFTOVER BEQ FORMAT ;END OF LIST MOV #-1,(R0) ;SET LEFTOVER FLAG ADD #8.,R0 ;CHECK NEXT BR 40$ ; ; FORMAT THE TASK BUFFER FOR OUTPUT ; FORMAT: CALL INIBUF ;INIT THE OUTPUT BUFFER MOV #TSKBUF,R5 ;POINT TO TASK BUFFER MOVB #177,CHPOS ;INIT THE CHAR CURSOR 5$: MOVB #177,LINPOS ;INIT THE LINE CURSOR BICB (SP),LINPOS MOV #LINES,R4 ;INIT LINE COUNT 10$: MOV (R5)+,R1 ;GET NAME (OR FLAG) BEQ DONE ;QUIT ON END OF LIST CALL PUTCUR ;PUT CURSOR IN LINE CMP R1,#-1 ;LEFTOVER? BNE 25$ ;NO MOV #12.,R3 20$: MOVB #' ,(R0)+ ;BLANK 12 CHARS SOB R3,20$ CLR -2(R5) ;ZERO LEFTOVER ENTRY BR 27$ 25$: CMP R1,#-2 ;ATL HEAD? BNE 26$ ;NO MOVTXT ATLT ;PUT IN LINE BR 27$ 26$: CMP R1,#-3 ;MRL HEAD? BNE 30$ ;NO MOVTXT MRLT ;PUT IN LINE 27$: ADD #6,R5 ;POINT TO NEXT ENTRY BR 90$ 30$: CALL $C5TA ;PUT NAME IN LINE MOV (R5)+,R1 CALL $C5TA MOV (R5)+,R2 ;GET PUD ENTRY ADDR BEQ 80$ ;PART ENTRY MOVB #'<,(R0)+ ;PUT < IN LINE CMP (R2),#"BP ;IS THIS BP ENTRY? BNE 40$ ;NO MOVB (R2)+,(R0)+ ;YES - PUT BP IN LINE MOVB (R2)+,(R0)+ BR 50$ 40$: MOVB 2(R2),R3 ;GET UNIT NUMBER CLR R2 DIV #8.,R2 ;SEPARATE DIGITS ADD #60,R2 ;CONVERT TO ASCII ADD #60,R3 MOVB R2,(R0)+ ;PUT TERMINAL NO IN LINE MOVB R3,(R0)+ 50$: MOVB #'>,(R0)+ ;PUT > IN LINE MOVB (R5)+,R2 ;GET TASK STATUS TSTB (R5) ;AST ACTIVE? BEQ 60$ ;NO MOVB #33,(R0)+ ;PUT START BLINK IN LINE MOVB #'B,(R0)+ 60$: MOVB TSKTBL(R2),(R0)+ ;PUT TASK STATUS IN LINE MOVB TSKTBL+1(R2),(R0)+ TSTB (R5)+ ;AST ACTIVE? BEQ 70$ ;NO MOVB #33,(R0)+ ;PUT END BLINK IN LINE MOVB #'S,(R0)+ 70$: BR 90$ 80$: MOVTXT BLANKS ;BLANK REST OF PART ENTRY TST (R5)+ ;POP OVER LAST WD OF ENTRY ; ; ENTRY FORMATTED - SEE IF BUFFER SHOULD BE OUTPUT ; 90$: CMP R0,#BUFF+80. ;MAX ENTRY IS 20 CHARS LONG BLE 100$ ;STILL ROOM CALL OUTBUF ;OUTPUT THE BUFFER ; ; GET SET TO DO NEXT ENTRY ; 100$: DEC R4 ;CHECK FOR ANOTHER LINE BNE 10$ ;YES - DO ANOTHER ENTRY SUB #13.,CHPOS ;GO TO NEXT COLUMN BR 5$ ;RE-INIT LINE COUNT AND CURSOR ; ; FORMATTING DONE - FINISH UP AND EXIT ; DONE: CALL OUTBUF ;OUTPUT THE BUFFER MOV (SP)+,R0 ;RESTROE STARTING LINE ADD #LINES,R0 ;COMPUTE NEXT FREE LINE RETURN ; SCAN TASK LIST ; ; THIS SUBROUTINE SCANS A LIST OF ATL NODES, AND PLACES THE FOLLOWING ; INFORMATION IN A BUFFER FOR EACH NODE: ; ; WD 1 TASK NAME (1ST 3 CHARS, RAD50) ; WD 2 TASK NAME (2ND 3 CHARS, RAD50) ; WD 3 TERMINAL PUD ADDRESS ; WD 4 LOW BYTE: TASK STATUS ; HIGH BYTE: AST FLAG ; ; INPUTS: ; ; R0 POINTER TO TASK BUFFER ; R1 POINTER TO LIST HEAD ; BUFEND ADDRESS OF LAST ENTRY IN BUFFER ; TASK SWITCHING MUST BE INHIBITED. ; THE TASK LIST MUST NOT BE EMPTY. ; ; OUTPUTS: ; ; R0 POINTER TO NEXT FREE ENTRY IN TASK BUFFER ; CC IF TASK BUFFER IS NOT FULL ; CS IF TASK BUFFER IS FULL ; R2 AND R3 DESTROYED ; TASK SWITCHING IS NOT RE-ENABLED. ; SCANTL: MOV (R1),R2 ;POINT TO FIRST NODE 10$: MOV A.TD(R2),R3 ;GET STD ADDRESS BEQ 15$ ;SKIP THE NULL TASK MOV (R3)+,(R0)+ ;SAVE NAME MOV (R3)+,(R0)+ MOV A.TI(R2),(R0)+ ;SAVE TERMINAL PUD ADDR MOV A.TS(R2),(R0)+ ;SAVE STATUS AND AST FLAG CMP #BUFEND,R0 ;BUFFER FULL? BLO 20$ ;YES - EXIT WITH CS (BLO=BCS) 15$: MOV (R2),R2 ;POINT TO NEXT NODE CMP R2,R1 ;DONE ENTIRE LIST? BNE 10$ ;NO 20$: RETURN ;YES - EXIT WITH CC (CLEARED BY CMP EQUAL) ; OUTPUT BUFFER ; OUTBUF: SUB #BUFF,R0 ;GET COUNT OF CHARS IN BUFFER BEQ INIBUF ;EMPTY BUFFER MOV R0,CHCNT ;SET CHAR COUNT DIR$ #LINOUT ;WRITE THE BUFFER ; ; INITIALIZE BUFFER ; INIBUF: MOV #BUFF,R0 RETURN ; ; PUT CURSOR IN BUFFER ; PUTCUR: MOVB #33,(R0)+ ;ESC MOVB #'F,(R0)+ ;F MOVB CHPOS,(R0)+ ;177-CHAR MOVB LINPOS,(R0)+ ;177-LINE DECB LINPOS ;GO TO NEXT LINE RETURN .END