.TITLE UTX .ENABL LC .ident -020000- .SBTTL INTRO PAGE ; ; UTX IS A TASK TO DISPLAY THE STRUCTURE OF THE USER TASK LIST ; ; UTX WILL DISPLAY THE RELATIVE RANKING OF TASKS ON EACH OF THE ; N LEVELS AND WILL DISPLAY FLAGS FOR: ; NEXT TASK TO SWAP ; NEXT TASK TO LOAD ; ROBIN POINTER ; ; AFTER RUNNING VIA A: ; ; MCR>UTX (TO RUN EVERY 60 CLOCK TICKS) ; ; OR: ; ; MCR>UTX 15 (TO RUN EVERY 15 CLOCK TICKS) ; ; ; UTX WILL DISPLAY THE UTL AND UPDATE ITSELF EVERY N TICKS ; ; A CONTROL C WHILE THE TASK IS RUNNING WILL CAUSE IT TO EXIT AFTER THE ; END OF THE NEXT DISPLAY ; ;DUE TO THE NUMBER OF VARIATIONS IN DIRECT CURSOR ADDRESSING FOR THE ;VARIOUS CRT TERMINALS, (WE'VE SEEN =, Y, * DEFINE THE ;SECOND CHARACTER OF THE ESC SEQUENCE HERE, (OR PATCH WITH A TKB GLOBAL DEF) ; ; Written: ?-?-?, -1.0.0-, ? ; ; Modified: 30-Apr-1981, -2.0.0-, Bruce C. Wright ; Changed to use screen formatting package ; ; ; .MCALL DIR$,QIOW$,MRKT$,EXIT$S,GMCR$,WTSE$,ASTX$,QIOW$S .SBTTL DIRECTIVE PARAMTER BLOCKS ; ;GET MCR ; GMCR: GMCR$ ; ;QIO TO WRITE LINE ; BAD: QIOW$ IO.WVB,5,1,,IOST,, ; ;ATTACH WITH ^C AST QIO ; ATT: QIOW$ IO.ATA,5,1,,IOST,, ; ;DETACH ; DET: QIOW$ IO.DET,5,1,,IOST,,<> ; ; ;EXIT AST'S ; ASTEXI: ASTX$ ; ;60 TICK MARK TIME (CAN BE CHANGED) ; MARK: MRKT$ 2,60.,1 ; ;WAIT FOR MARK TIME ; WAIT: WTSE$ 2 ; .SBTTL STORAGE AREA EXITFL: .WORD 0 ;FLAG FOR EXIT PENDING NLEVEL: .WORD 0 ;NUMBER OF LEVELS SPSAVE: .WORD 0 ;SAVE STACK POINTER HERE IOST: .WORD 0,0 ;IO STATUS BLOCK BUFFER: .BLKB 20. ; Temporary buffer space. ; spaces: .ascii / / ; 12 spaces badmsg: .ascii /Unsupported terminal type/ BADLEN=.-BADMSG .EVEN LINE: .ASCII / Level 1 Level 2 Level 3 Level 4/ .ASCII / Level 5 Level 6/ LINELN=.-LINE .EVEN ; ; ;SAVE AREA FOR LAST DISPLAY, SAVE NUMBER OF TASKS/LEVEL ;CURRENTLY MAXIMUM OF 6 LEVELS ; DISNUM: .BLKW 6 ; ;ROOM FOR 6 LEVELS OF UTL DATA ;FOR EACH LEVEL WILL STORE ; ;0() NUMBER OF TASKS AT THIS LEVEL ;2() ROBIN POINTER ;4() NEXT JOB TO LOAD POINTER ;6() NEXT JOB TO SWAP POINTER ; BUFF: .BLKW 24. ; ; ;THE TASK WILL PUSH ON HIS STACK THE TASK NAMES OF THE VARIOUS TASKS ;IN EACH UTL LEVEL AND THE RECOVER THEM ; ; The following buffer is used for the temporary ; storage of the active task information. ; tskbuf: .blkw 1024. ; Used for temporary storage. tskend: .SBTTL INTRO CODE START: DIR$ #GMCR ;GET MCR TO SET RECALL MOV #GMCR+6,R0 ;BUMP PAST "UTX " JSR PC,$CDTB ;GET # OF TICKS /SCAN CMP R1,#10 ;DO CHECK OF RANGE BLT 2$ ;TOO LOW, THEN BRANCH CMP R1,#300. ;EVERY 5 SECONDS IS MAX BGT 2$ MOV R1,MARK+M.KTMG ;CHANGE MARK TIME MAGNITUDE 2$: DIR$ #ATT ;ATTACH WITH AST'S mov #5,r0 ; Get the LUN to call with. call $sctyp ; Get the terminal type. tst r2 ; Is the terminal supported? bne 50$ ; J if so. 150$: DIR$ #BAD INC EXITFL BR REGO 50$: mov #1,r1 ; Indicate buffering to be done. call $scbuf ; Set buffering mode. call $scclr ; Clear the terminal screen. MOV #.UTLHD,R5 ;GET UTL LISTHEAD CLR R1 ;CLEAR COUNTER 22$: MOV (R5),R5 ;GET NEXT/FIRST LEVEL INC R1 ;COUNT A LEVEL CMP (R5),#.UTLHD ;BACK AT UTL LISTHEAD BNE 22$ ;NO MUL #13.,R1 ;MAKE R1 SIZE OF LINE mov r1,r2 ; Put size of line into R2 mov #line,r1 ; Point to output line. call $scout ; Output the header line. .SBTTL STORE UTL DATA REGO: TST EXITFL ;EXIT PENDING BEQ 1$ ;NO mov #5,r0 ; Get the LUN call $scclr ; Clear the screen. call $scflu ; Flush the buffer. DIR$ #DET ;DETACH TERMINAL EXIT$S ;YES 1$: MOV PS.EXP,-(SP) ;SAVE STATUS BIS #140,PS.EXP ;DISABLE CONTEXT SWITCHING MOV #BUFF,R5 ;POINT TO UTL DATA STORAGE AREA mov #tskend,r3 ;point to the task data area. CLR NLEVEL ;CLEAR LEVEL COUNTER MOV #.UTLHD,R0 ;GET USER TASK LISTHEAD MOV (R0),R0 ;GET FIRST LEVEL STORE: MOV Z.NE(R0),(R5) ;SAVE NUMBER OF TASKS BIC #177400,(R5)+ ;CLEAR UPPER BYTE MOV Z.NT(R0),(R5)+ ;SAVE NEXT TASK TO RUN MOV Z.LD(R0),(R5)+ ;SAVE NEXT TASK TO LOAD MOV Z.NS(R0),(R5)+ ;SAVE NEXT TASK TO SWAP MOVB Z.NE(R0),R4 ;GET LOOP COUNTER BEQ 2$ ;DON'T STORE IF LEVEL EMPTY MOV Z.FJ(R0),R1 ;GET FIRST JOB NODE ADDRESS IN R1 1$: MOV X.TD(R1),R2 ;GET STD OF TASK IN R2 MOV S.TN(R2),-(r3) ;SAVE NAME MOV S.TN+2(R2),-(r3) MOV X.TI(R1),-(r3) ;SAVE TI POINTER cmp r3,#tskbuf+20 ; Are we too full ? blo SHOW ;IF SO, DON'T SAVE ANY MORE MOV R1,-(r3) ;SAVE UTL NODE ADDRESS FOR AN ID MOV (R1),R1 ;GET NEXT JOB NODE ADDRESSS SOB R4,1$ ;DO UNTIL ALL JOBS AT THIS LEVEL FOUND 2$: INC NLEVEL ;COUNT A LEVEL MOV (R0)+,R0 ;GET NEXT LEVEL CMP R0,#.UTLHD ;BACK AT START ? BEQ SHOW ;IF SO DISPLAY BR STORE ;ELSE TRY FOR NEXT LEVEL .SBTTL SHOW TASKS SHOW: ; ;DURING THIS CODE, REGISTER USAGE IS AS FOLLOWS ; ;R0 = POINTER TO CURRENT OUTPUT BUFFER BEING ASSEMBLED ;R1 = POINTER TO LEVEL STORAGE AREA IN "BUFF:" ;R2 = ;R3 = USED TO READ SAVED DATA BACK OFF STACK ;R4 = CURRENT LEVEL (0 = FIRST LEVEL) ;R5 = CURRENT TASK AT THIS LEVEL (0 = FIRST TASK) ; mov #tskend,r3 ; Set r3 to read saved data. CALL ..ENB0 ;REENABLE CONTEXT SWITCHING CLR R4 ;START AT LEVEL 0 MOV #BUFF,R1 ;POINT TO FIRST LEVEL IN "BUFF" DISLEV: MOV #1,R5 ;START AT FIRST TASK IN LEVEL DISTAS: CMP R5,0(R1) ;DONE WITH TASKS AT THIS LEVEL ? BGT LEVDON ;IF SO, SEE IF NEED TO DELETE SOME JSR PC,DISONE ;ELSE DISPLAY THIS TASK INC R5 ;COUNT A TASK BR DISTAS ;AND DISPLAY ANOTHER LEVDON: DEC R5 ;MAKE ACTUAL NUMBER OF TASKS FOUND MOV R4,R2 ;GET LEVEL # ASL R2 ;MAKE IT WORD OFFSET ADD #DISNUM,R2 ;POINT TO NUMBER OF TASKS LAST TIME CMP R5,(R2) ;COMPARE BEQ NODIFF ;SAME NUMBER BGT ADDSOM ;MORE THIS TIME MOV R2,-(SP) ;SAVE R2 WIPED IN ERASE CALL JSR PC,ERASE ;SOME TO ERASE MOV (SP)+,R2 ;RESTORE HIM ADDSOM: MOV R5,(R2) ;MORE TASKS, UPDATE NUMBER DISPLAYED NODIFF: ;SAME NUMBER OF TASKS AT THIS LEVEL INC R4 ;GO TO NEXT LEVEL ADD #10,R1 ;UPDATE BUFF POINTER CMP r3,#tskbuf+20 ;ARE WE NEARING END OF STACK ? blo FULL ;IF SO, QUIT DISPLAYING CMP R4,NLEVEL ;CHECK NUMBER OF LEVELS DISPLAYED BLT DISLEV ;IF NOT ALL, DISPLAY ANOTHER full: mov #5,r0 ; Get the LUN to output. call $scflu ; Flush the buffer if necessary. DIR$ #MARK ;WAIT ONE SECOND DIR$ #WAIT ;WAIT FOR IT JMP REGO ;AND GO AGAIN ; ;ENTRY FOR CONTROL C SEEN ; CCENT: INC EXITFL ;SHOW EXIT PENDING DIR$ #ASTEXI ;EXIT AST .SBTTL DISPLAY TASK ;ENTER WITH ;R0 = (destroyed) ;R1 = POINTER TO LEVEL STORAGE AREA IN "BUFF" ;R2 = AVAILABLE (WIPED BY $C5TA) ;R3 = POINTER TO SAVED TASK DATA ON STACK ;R4 = CURRENT LEVEL (0 = FIRST LEVEL) ;R5 = CURRENT TASK AT THIS LEVEL (1 = FIRST TASK @ LEVEL) DISONE: MOV R1,-(SP) ;SAVE R1 FOR LATER USE MOV R5,R2 ;GET TASK NUMBER MOV R4,R1 ;GET LEVEL # MUL #13.,R1 ;14 COLUMNS BETWEEN LEVELS mov #5,r0 ; Get LUN to output to. call $scadr ; Address the screen. mov #buffer,r0 ; Point to temporary buffer. MOV -(R3),R1 ;GET FIRST HALF OF TASK NAME JSR PC,$C5TA ;CONVERT TO ASCII MOV -(R3),R1 ;GET 2ND HALF OF TASK NAME JSR PC,$C5TA MOVB #40,(R0)+ ;PUT IN SPACE MOV -(R3),R1 ;GET PUD POINTER MOVB U.DN(R1),(R0)+ ;FILL IN TI NAME MOVB U.DN+1(R1),(R0)+ MOV R2,-(SP) MOV R3,-(SP) MOVB U.UN(R1),R3 ;GET UNIT NUMBER CLR R2 ;CLEAR UPPER REG DIV #10,R2 ;SEPERATE DIGITS OF DEV NUMBER BIS #60,R2 ;CONVERT UPPER DIGIT TO ASCII MOVB R2,(R0)+ BIS #60,R3 ;CONVERT REM (LOWER DIGIT) TO ASCII MOVB R3,(R0)+ MOV (SP)+,R3 ;RESTORE REG'S MOV (SP)+,R2 MOV -(R3),R2 ;GET UTL ADDRESS MOV (SP)+,R1 ;RECOVER LEVEL STORAGE AREA POINTER MOVB #40,(R0) ;PUT IN A SPACE FOR FLAG CMP R2,2(R1) ;IS IT ROBIN POINTER ? BNE 1$ MOVB #'r,(R0) ;IF SO, SET FLAG 1$: CMP R2,4(R1) ;OR NEXT JOB TO SWAP ? BNE 2$ MOVB #'s,(R0) ;IF SO, SET FLAG 2$: CMP R2,6(R1) ;OR NEXT JOB TO LOAD ? BNE 3$ MOVB #'l,(R0) ;IF SO, SET FLAG 3$: INC R0 ;ADJUST FOR SPACE OR FLAG CHARACTER mov r1,-(sp) ; Save R1 mov r0,r2 ; Point to the end of the buffer. mov #buffer,r1 ; Point to beginning of buffer. sub r1,r2 ; Compute length of buffer. mov #5,r0 ; Get LUN to output. call $scout ; Output the temp. buffer. mov (sp)+,r1 ; Recover r1 RTS PC .SBTTL ERASE OLD TASK ; ;SUB TO ERASE TASKS AT END OF A LEVEL WHEN THE NUMBER OF TASKS AT ;THAT LEVEL DECREASES ; ;CALL WITH ; ;R5 = FIRST TASK AT LEVEL TO BE ERASED ;(R2) = NUMBER OF TASKS LAST TIME WE DISPLAYED ;R4 = CURRENT LEVEL ; ERASE: MOV (R2),R2 ;NUMBER OF TASKS LAST TIME SUB R5,R2 ;MINUS NUMBER NOW = ERASE COUNT MOV R2,-(SP) ;SAVE COUNT FOR LATER eraloo: mov r0,-(sp) ; Save registers. MOV R1,-(SP) mov r2,-(sp) ; Save registers. mov #5,r0 ; Get the LUN to output to. MOV R5,R2 ;GET TASK NUMBER inc r2 ; Make it Y position (Offset ; by 1 because r5 was ;LAST DISPLAYED TASK) MOV R4,R1 ;GET LEVEL # MUL #13.,R1 ;14 COLUMNS BETWEEN LEVELS call $scadr ; Address the screen. mov #spaces,r1 ; Point to buffer of spaces. mov #12.,r2 ; Output 12. of them. call $scout ; Output the spaces. mov (sp)+,r2 ; Recover registers. mov (sp)+,r1 ; ... mov (sp)+,r0 ; ... INC R5 ;COUNT AN ERASE SOB R2,ERALOO ;AND DO R2 ERASES SUB (SP)+,R5 ;MAKE R5 RIGHT AGAIN rts pc ; And return. .END START