.TITLE LEVELS .MCALL DIR$,FSRSZ$,QIOW$,EXIT$,CALL,RETURN,EXIT$S .MCALL WAIT$,MRKT$S,WTSE$S,GTIM$S,ALTP$S,RUN$,GSSW$,RQST$ FSRSZ$ 1 NM: .BLKB 60 SPACE: .BLKW 1 CNT1: .BLKW 2 EX0: .ASCII /***** LEVELS DISPLAY EXITING - DEMO STARTED ON TT20:/ EX0E: .EVEN EX1: .ASCII /***** LEVELS DISPLAY EXITING *****/ EX1E: .EVEN FO1: .ASCII / TERMINAL #/ FO1E: .EVEN LEVNAM: .RAD50 /LEVELS/ .EVEN BUZBUF: .ASCIZ <7><7><7><7> BUZEND: .EVEN TIMBUF: .BLKW 8. .EVEN CLIR: .RAD50 /CLI/ FO2: .ASCII / UIC - [/ FO2E: .EVEN FO3: .ASCII /,/ FO3E: .EVEN FO4: .ASCII /] CPU (TICKS) =/ FO4E: BREAK: .ASCII /LEVEL PASS/ BRE: HED: .ASCII /*** CURRENT TASK STATUS **** / TIMMSG: .BLKB 20. TIM1: .ASCII / PDP-11 IAS SYSTEM/ TIMME: .EVEN LEVCT: .BLKB 20 UICP: .BLKW 300 UICG: .BLKW 500 CPU: .BLKW 500 STD: .BLKW 500 .EVEN SPAC: .ASCII / / .EVEN TASK: .ASCII /TASK PASS/ TASKE: .EVEN COUNT: .BLKB 1 .EVEN HDBUF: .ASCII /LEVEL #/ HDBE: .EVEN LEVEL: .BLKW 1 NAME: .BLKW 500 .EVEN TERM: .BLKW 500 .EVEN TER: .BLKW 2 .EVEN ; LOCAL MACROS ; .MACRO INH0 MOV PS.EXP,-(SP) BIS #140,PS.EXP .ENDM DSW=0 RUNN: RUN$ LEVELS,,,1,1,10.,2 RUNB: RQST$ BENCH,GEN,201,1,1 SWITCH: GSSW$ DEMOST: RUN$ DEMO,,,1,1,5.,2 EXIT0: QIOW$ IO.WVB,1,1,,,, EXIT1: QIOW$ IO.WVB,1,1,,,, BUZZ: QIOW$ IO.WVB,1,1,,,, HEAD1: QIOW$ IO.WVB,1,1,,,, NUM: QIOW$ IO.WVB,1,1,,,, EXI: EXIT$ NAM: QIOW$ IO.WVB,1,1,,,, BUFCTR=NAM+Q.IOPL+2 COU: QIOW$ IO.WVB,1,1,,,, CCOU: QIOW$ IO.WVB,1,1,,,, HEAD: QIOW$ IO.WVB,1,1,,,, FORM1: QIOW$ IO.WVB,1,1,,,, FORM2: QIOW$ IO.WVB,1,1,,,, FORM3: QIOW$ IO.WVB,1,1,,,, FORM4: QIOW$ IO.WVB,1,1,,,, .EVEN NLEV: .WORD 0 START: MOV .UTLNO,NLEV ;GET NUMBER OF TIMESHARING LEVELS INC NLEV ;ADD 1 AND STORE IN NLEV INH0 CMP .DLTNO,#0 ;ANY DEVICES IN USE ??? BEQ START1 ;NO -- GO ON MOV .DLTBA,R0 ;GET DEVICE LOAD TABLE ADDRESS CMPB DV.ST(R0),#1 ;IS LOAD REQUEST PENDING??? BNE START1 ;NO LOAD PENDING CALL ..ENB0 ;ENABLE TASK SWITCHING DIR$ #BUZZ ;BUZZ THE TERMINAL JMP WAIT ;AND WAIT START1: GTIM$S #TIMBUF ;GET CURRENT TIME PARAM MOV #TIMMSG,R0 ;POINT TO CONVERSION BUFFER MOV R0,R3 MOV #TIMBUF,R1 ;POINT TO TIME PRAMATERS CALL $DAT ;CONVERT DATE MOVB #' ,(R0)+ ;INSERT A SPACE MOV #3,R2 ;CONVERT TO HOURS MIN AND SEC CALL $TIM ;CONVERT TO ASCII DIR$ #HEAD ;PRINT HEADER LINE MOV .UTLHD,R0 ;GET UTL LISTHEAD MOV #0,R4 MOV #0,R1 MOVB #0,COUNT ;CLEAR COUNTER LEV: ;INH0 ;INIHIBIT TASK SWITCHING INC R1 ;MOVE LEVEL # TO R1 CMP R1,NLEV BMI LEV1 JMP EDEQ ;END OF ALL LEVELS NOW GO PRINT LEV1: MOV R1,LEVEL ;SAVE IN LEVEL MOV Z.NL(R0),R5 ;SAVE NEXT LEVEL IN R5 MOV Z.FJ(R0),R2 ;SAVE FIRST UJN ADDRESS MOV Z.LJ(R0),R3 ;SAVE LAST UJN ADDRESS TSTB Z.NE(R0) BEQ NEXT3 ;LEVEL EMPTY MOV R2,R0 ;PUT FIRST UJN ADD IN R0 DEQ: CMP J.JB(R0),CLIR ;IS THIS A CLI BNE DEQ1 ;NO... GO ON CMP R0,R3 ;IS THIS THE LAST UJN BEQ NEXT3 ;YES GO TO NEXT LEVEL MOV @R0,R0 ;NO GO TO NEXT NODE JMP DEQ DEQ1: MOV J.JB(R0),NAME(R4) ;GET JOB NAME MOV J.JB+2(R0),NAME+2(R4) MOV J.TA(R0),TERM(R4) ;SAVE TERMINAL NODE ADDRESS MOVB J.PC(R0),UICP(R4) ;SAVE PROGRAMMER CODE MOVB J.GC(R0),UICG(R4) ;SAVE GROUP CODE MOV J.AC(R0),CPU(R4) ;SAVE CPU TIME MOV J.AT(R0),R2 MOV A.TD(R2),STD(R4) ;SAVE STD ENTRY ADD #1,COUNT ADD #4,R4 CMP R0,R3 ;IS THIS LAST UJN BEQ NEXT3 ;YES, GO TO NEXT3 CMP #100,R4 ;MORE THAN 8 ENTRIES ?? BMI NEXT3 ;YES BRANCH OUT MOV @R0,R0 ;NO, GET NEXT LINK JMP DEQ ;AND GET NEXT NAME NEXT2: NEXT3: MOVB COUNT,LEVCT(R1) ;SAVE # OF UJNS MOVB #0,COUNT ;CLEAR COUNT MOV R5,R0 ;GET NEXT LEVEL JMP LEV ;GO TO NEXT LEVEL EDEQ: ;ENABLE TASK SWITCHING CALL ..ENB0 MOV #0,R1 ;CLEAR R1 MOV R4,CNT1 ;SAVE MAC BUFFER COUNT IN R4 MOV #0,R4 ;START AT BEGINNING OF BUFFER EDEQ1: INC R1 ;ADVANCE LEVEL POINTER CMP R1,NLEV ;LAST LEVEL ???? BMI DEQ2 ;YES GO WAIT JMP WAIT DEQ2: MOV R1,LEVEL ;SET UP LEVEL MOV #0,R5 ;CLEAR R5 MOVB LEVCT(R1),R5 ;PUT UJN COUNT IN R5 CMP #0,R5 ;NO ENTRIES THIS LEVEL ??? BEQ EDEQ1 ;RIGHT GO TO NEXT LEVEL ADD #60,LEVEL ;CHANGE LEVEL # TO ASCII DIR$ #HEAD1 ;PRINT HEADER LINE DIR$ #NUM MOV R1,R3 ;SAVE OFF R1 IN R3 PRI: MOV #NM,R0 ;PLACE ASCII ADDRESS IN R0 MOV NAME(R4),R1 ;GET FIRST HALF OF RAD50 NAME JSR PC,$C5TA ;CHANGE TO ASCII MOV NAME+2(R4),R1 ;GET SECOND HALF JSR PC,$C5TA ;CHANGE SECOND HALF MOVB #11,@R0 ;INSERT A TAB ADD #1,R0 ;AND INCREMENT MOV TERM(R4),R2 ;GET TERMINAL NODE ADDRESS MOVB I.TT(R2),R1 ;PLACE TERM # IN R1 MOV #0,R2 ;CLEAR R2 JSR PC,$CBOMG ;CHANGE TERM # TO OCTAL MOVB #11,@R0 ;INSERT A TAB ADD #1,R0 ;AND INCREMENT MOV R0,SPACE MOVB #133,@R0 ADD #1,R0 MOV UICG(R4),R1 ;PUT BINARY GROUP CODE IN R1 MOV #0,R2 ;CLEAR R2 JSR PC,$CBOMG ;ADD TO LINE MOVB #54,@R0 ADD #1,R0 MOV UICP(R4),R1 ;PUT BINARY PROG CODE IN R1 MOV #0,R2 ;CLEAR R2 JSR PC,$CBOMG ;ADD TO LIST MOVB #135,@R0 ADD #1,R0 ADD #7,SPACE CMP SPACE,R0 BMI PRI0 MOVB #11,@R0 ADD #1,R0 PRI0: MOVB #11,@R0 ;INSERT A TAB ADD #1,R0 ;AND INCREMENT MOV CPU(R4),R1 ;GET READY TO CONVERT CPU TIME MOV #0,R2 JSR PC,$CBDMG ;CONVERT MOVB #11,@R0 ;INSERT A TAB ADD #1,R0 ;AND INCREMENT MOV STD(R4),R2 ;GET SYSTEM TASK DIR ADDRESS MOV S.TN(R2),R1 ;GET FIRST TASK NAME JSR PC,$C5TA ;AND CONVERT MOV STD(R4),R2 ;GET ADDRESS MOV S.TN + 2(R2),R1 ;AND SECOND HALF JSR PC,$C5TA ;AND CONVERT MOVB #11,@R0 ;INSERT A TAB ADD #1,R0 ;AND INCREMENT SUB #NM,R0 MOV R0,BUFCTR DIR$ #NAM ; MRKT$S #2,#1,#2 ; WTSE$S #2 PRI1: ADD #4,R4 ;GO TO NEXT NAME CMP CNT1,R4 ;DOES POINTER EXCEED COUNT ??? BMI WAIT ;SKIP IF END SUB #1,R5 ;REDUCE COUNT BY ONE BEQ NEXT ;IF NO MORE UJN THEN GO TO NEXT LEV JMP PRI ;MORE LEFT PRINT AGAIN NEXT: MOV R3,R1 ;RESTORE R1 NEXT1: JMP EDEQ1 ;NEXT LEVEL WAIT: DIR$ #SWITCH MOV DSW,R0 CMP #100000,R0 BEQ STOP1 CMP #40000,R0 BEQ DEM DIR$ #RUNN DIR$ #RUNB STOP: EXIT$S DEM: STOP1: DIR$ #EXIT1 JMP STOP .EVEN .END START