; DJOB.LIT - Dynamic job display
;
; Copyright [c] STUYVESANT
;
;
; EDIT HISTORY
; ;;;;;;;;;;;;
; [* **] DJOB13 CREATED DJOB13 FOR AMOSL 1.3 OPR SYSTEM V 1.0B(4)
; [J-01] DJOB2 DELETED CODE FOR RESET DISPLAY OF CONNECTION TIME V 1.1B(4)
; AND ERASE DISPLAY WHER FIELD RESET
;
;
DEFINE DPACK ADDR,COUNT ; SET UP FOR UNPACK ADDR= WHERE RAD50 IS COUNT=# OF WORDS @(ADDR)
LEA A1,ADDR ; EA=> A1
MOV #COUNT-1,D0 ; D0 GETS COUNT-1 SO BEQ TRUE FOR 1 WORD
CALL UPACK ; UNPACK IT ONTO SCREEN AT CURRENT POSITION
ENDM
DEFINE L.CRT ROW,COL ; SET A WORD=ROW/COL CODE
WORD <ROW_8.>+<COL>
ENDM
DEFINE DSPLY ROW,COL,TEXT ; SET BYTES =
WORD <ROW_8.>+<COL> ; ROW/COL CODE
BYTE 20$$-10$$ ; LENGTH OF MESSAGE
10$$: ASCIZ ?TEXT? ; BYTES OF MESSAGE
EVEN ; FORCE EVEN FOR NEXT NESSAGE
20$$: ; NEED FOR SUBTRACTION ABOVE
ENDM
DEFINE LOW ; SET REDUCED INTENSITY
MOV #177400+11.,D1
TCRT
ENDM
DEFINE HIGH ; SET NORMAL INTENSITY
MOV #177400+12.,D1
TCRT
ENDM
DEFINE .ODEF%I $SYM,$SIZE
$SYM==$$OFLC
IF B, $SIZE, $$OFLC=$$OFLC+1
IF NB, $SIZE, $$OFLC=$$OFLC+$SIZE
ENDM
;
;
; MEMORY MODULE INFO DATA TBL
;
OFINI
ODEF%I M%SIZE,4 ; MODULE SIZE
ODEF%I M%STAT,2 ; MODULE STATUS
ODEF%I M%NAME,6 ; MODULE NAME
ODEF%I M%ADDR,4 ; MODULE ADDRESS
OFSIZ M%DEF
OFINI
ODEF%I J%MOD,M%DEF*17. ; JOBS MEMORY MODULE data table
ODEF%I M%LINE,2 ; LAST RECORDED LINE INDEX
ODEF%I J%JCB,4 ; JOBS JCB pointer
ODEF%I J%TRM,4 ; JOBS TRMDEF pointer
;
ODEF%I J%JNM,4 ; JOBS job name
ODEF%I J%TNM,4 ; JOBS trm name
ODEF%I J%DEV,2 ; JOBS log-dev
ODEF%I J%DRV,2 ; JOBS log-drive
ODEF%I J%PPN,2 ; JOBS log-proj-prog number
ODEF%I J%RTU,2 ; JOBS root-unit
ODEF%I J%RTD,2 ; JOBS root-device
ODEF%I J%RTP,2 ; JOBS root-proj-prog number
ODEF%I J%LVL,1 ; JOBS user expertise
ODEF%I J%EXP,1 ; JOBS user level
ODEF%I J%MSR,4 ; JOBS link to pending receive messages
ODEF%I J%LNG,4 ; JOBS pointer to language def tbl
ODEF%I J%USN,20 ; JOBS user name
ODEF%I J%CMD,30 ; JOBS forced command line
ODEF%I J%PGM,4 ; JOBS program name
ODEF%I J%TST,2 ; JOBS trm status
ODEF%I J%JST,2 ; JOBS job status
ODEF%I J%TYP,2 ; JOBS job type
ODEF%I J%BAS,4 ; JOBS memory location (ABS)
ODEF%I J%SIZ,4 ; JOBS memory size
ODEF%I J%PRV,2 ; JOBS privilage word
ODEF%I J%CMS,2 ; JOBS command file size
ODEF%I J%CMZ,2 ; JOBS command file status
ODEF%I J%CPU,4 ; JOBS cpu time
ODEF%I J%DSR,4 ; JOBS disk reads
ODEF%I J%DSW,4 ; JOBS disk writes
;
ODEF%I M%JCB,4 ; pointer to my JCB
ODEF%I M%TRM,4 ; pointer to my TRMDEF
ODEF%I M%TDV,4 ; addr of my .TDV
;.ODEF%I M%TYP,2 ; my old job type
ODEF%I XIDV,4 ; addr of PSEUDO IDV
ODEF%I S%TIME,4 ; system time
ODEF%I WORK,12 ; work space
EVEN
;
OFSIZE IMPSIZ
.=0
; PSECT
START: PHDR -1,0,PH$REE!PH$REU
GETIMP IMPSIZ,A5 ; get memory
MOV A5,A0
MOVW #[IMP],-(A0) ; defign name [DJOB.IMP]
MOVW #[B ],-(A0) ;
MOVW #[DJO],-(A0) ;
JOBIDX A0 ; get JCB addr
MOV A0,M%JCB(A5) ; save it
MOV JOBTRM(A0),A0 ; get TRMDEF addr
MOV A0,M%TRM(A5) ; save it
MOV T.TDV(A0),M%TDV(A5) ; save TDV addr of my guy
ORW #T$IMI!T$ECS!T$ILC,@A0 ; set terminal status bits
GETNAM: BYP
LIN
JNE 1$
TYPECR <USAGE: DJOB13 jobname>
EXIT
RAD50 /C JEFFERY R. STUYVESANT/
1$: FILNAM WORK(A5),JOB ; set job name
MOV JOBTBL,A0 ; point to job table
2$: MOV (A0)+,D1 ; get JCB pointer
BEQ 2$ ; none allocated
CMP D1,#-1 ; this the end?
BEQ 3$ ; YES
MOV D1,A1 ; NO - index JCB w/A1
CMM JOBNAM(A1),WORK(A5) ; names match?
BNE 2$ ; NO - keep looking
BR 4$ ; YES - done looking
3$: CRLF
TYPECR <? Job not found.>
EXIT
4$: CMP D1,M%JCB(A5) ; is he trying to talk to himself?
BNE 5$
TYPECR <? That is this job.>
EXIT
5$: MOV A1,J%JCB(A5) ; save JCB pointer
MOV JOBTRM(A1),D1 ; get TRMDEF addr
BR 6$ ; quit if none
; TYPECR <? That job is detached.>
; EXIT
;
; WE GET HERE IF WE HAVE A VALID JOB
;
6$: MOV M%JCB(A5),A0 ; GET PONITER TO MY JCB
; MOVW JOBTYP(A0),M%TYP(A5) ; SAVE MY JOBTYPE
; ANDW #^CJ.HEX,JOBTYP(A0) ; CLR HEX BIT FOR OCTAL OUTPUT
CALL SCREEN ; PAINT SCREEN
JMP BEGIN ; GOTO MAIN PROGRAM BODY
F.SCR: MOV #5.,D0 ; # of lines +1
10$: DEC D0 ; dec for actual # of lines
BEQ E.SCR ; if =0 then fin
MOV D0,D1 ; line number -2
LSL D1,#8. ; force to upper byte
ADD #<1._8.>+79.,D1 ; add +2 lines & column
TCRT ; locate
MOV #177400+33.,D1 ; code for nor vid
TCRT ; doit
MOV D0,D1 ; load line number -2
LSL D1,#8. ; shift to upper byte
ADD #<1._8.>+1.,D1 ; add +2 rows & column
TCRT ; locate
MOV #177400+32.,D1 ; code for rev vid
TCRT ; do it
BR 10$ ; not finished again
; THIS SBR FINDS THIS PROGRAM AND DISPLAYS ITS CURRENT REV STATUS
; AND FOR THE OPERATING SYSTEM
;
E.SCR:
LEA A0,START
MOV #<1._8.>+14.,D1 ; POSITION
TCRT ; MOVE
ADD #2.,A0 ; ADD ONE WORD TO ADDR = VER (@A0 = RUN LOGED IN OR NOT)
VCVT @A0,OT$TRM ; PRINT OUT
10$:
MOV #<1._8.>+50.,D1 ; POSITION
TCRT ; MOVE
VCVT 2,OT$TRM ; PRINT OUT VERSION OF OPR SYS (@ 2(ABS) IN MEMORY)
RTN ; FINISHED
;
; SBR TO PRINT OUT ONE DSPLY STRING
;
;
PRINT: CLR D1 ; PRE CLEAR D1
MOVW @A1,D1 ; set up D1=row/col
BEQ 120$ ; IF =0 THEN ONLY ATTRIBUTE CODE TO FOLLOW W/O POSITION
TCRT ; MOVE
CLR D1 ; PRE CLEAR D1
MOVB STR.N(A1),D1 ; = LENGTH OF STRING
BEQ 130$ ; IF =0 THEN ATTRIBUTE CODW W/POSITION
ADD #3.,A1 ; ADD 3 = BASE OF STR
TTYL @A1 ; PRINT OUT
ADD D1,A1 ; ADD LENGTH OF STR A1 NOW POINTS TO NEXT DSPLY STRING
110$: TSTW @A1 ; TSTW IF 0 END OF SCREEN
RTN ; FINISHED AND RTN
120$: CLR D1 ; PRE CLEAR D1
130$: MOVB STR.S(A1),D1 ; MOVE ATTRIBUTE CODE TO D1
ADDW #177400,D1 ; ADD FOR INDICATE ATTRIBUTE CODE
TCRT ; DO IT
ADD #4.,A1 ; ADD 4 A1=BASE OF NEXT DSLPY STRING
BR 110$ ; GOTO 110$ FOR FINISH PROCESSING
;
;
;LOCATE CURSOR BASED ON MESSAGE LOCATION
;
POSCRT::LEA A1,C.SCR ; LOAD BASE
MOVW 0(A1)[~D0],D1 ; LOCATE BASE OF MESSAGE = ROW/COL
ADDB 2(A1)[~D0],D1 ; ADD LENGTH OF MESSAGE + 1
TCRT ; MOVE CURSOR
RTN ; FIN AND RTN
;
;UNPACK A WORD (OR TWO)
;
UPACK:: TSTW @A1 ; IF =0 THEN TYPE BLANKS
BEQ 110$ ; BR =0
LEA A2,WORK(A5) ; LOACTE UNPACKING SPACE
UNPACK ; UNPACK (A1)+ =>(A2)+
TST D0 ; D0 = # WORDS-1
BEQ 100$ ; IF =1 THEN ONLY ONE WORD FINISHED
UNPACK ; UNPACK (A1)+ => (A2)+
100$: CLRB @A2 ; NULL= END OF STR FOR TTYL
TTYL WORK(A5) ; PRINT ONTO SCREEN START @ EA WORK(A5)
RTN ; FINISHED AND RTN
110$: LOW ; REDUCED INTENSITY
TYPE <***> ; FILL SPACE (3 'CUZ RAD50=TRIPLET)
TST D0 ; SEE ABOVE
BEQ 120$
TYPE <***> ; SEE ABOVE
120$: HIGH ; NORMAL INTENSITY
RTN ; FINISHED AND RTN
EVEN
L.CRT 20.,34. ; nor vid @ 17,34
BYTE 0,33. ; nor vid
L.CRT 20., 1. ; rev vid @ 17,1
BYTE 0,32. ; rev vid
WORD 0
CRCONT:: DSPLY 7.,1.,<ENTER CR TO CONTINUE>
EVEN
END.SC: WORD 0
; EXITING
FINISH::
MOV M%JCB(A5),A0
; MOVW M%TYP(A5),JOBTYP(A0) ; RESTORE OLD JOB TYPE
MOV #177400+28.,D1 ; TCRT = TURN ON CURSOR
TCRT ; DO IT
MOV #177400,D1 ; CLEAR SCREEN
TCRT ; DO IT
EXIT ; FINISH
;
;
;
; WE GET TO HERE TO ACTUALLY DO THE WORK
; HEADER PART ONLY DOSE THE TIME
;
;
;
BEGIN:
MOV #177400+29.,D1 ; TCRT = TURN OFF CURSOR
TCRT
SETB J%JNM(A5) ; JOBS job name
SETB J%TNM(A5) ; JOBS trm name
SETB J%DEV(A5) ; JOBS log-dev
SETB J%DRV(A5) ; JOBS log-drive
SETB J%PPN(A5) ; JOBS proj-prog number
SETB J%PGM(A5) ; JOBS program name
SETB J%TST(A5) ; JOBS trm status
SETB J%JST(A5) ; JOBS job status
SETB J%TYP(A5) ; JOBS job type
SETB J%BAS(A5) ; JOBS memory location (ABS)
SETB J%SIZ(A5) ; JOBS memory size
SETB J%PRV(A5) ; JOBS privilage word
SETB J%CMS(A5) ; JOBS command file size
SETB J%CMZ(A5) ; JOBS command file status
SETB J%CPU(A5) ; JOBS cpu time
SETB J%DSR(A5) ; JOBS disk reads
SETB J%DSW(A5) ; JOBS disk writes
SETB J%MSR(A5) ; JOBS privilage word
SETB J%LNG(A5) ; JOBS language pointer
SETB J%USN(A5) ; JOBS user name
SETB J%RTP(A5) ; JOBS root-ppn
SETB J%RTD(A5) ; JOBS root-dev
SETB J%RTU(A5) ; JOBS root-unit
SETB J%LVL(A5) ; JOBS user-level
SETB J%EXP(A5) ; JOBS user-expertise
SETB J%CMD(A5) ; JOBS forced cmd line
;
;
; DISPLAY JCB ADDR
; DISPLAY JCB ONLY ONCE 'CUZ THIS DONT CHANGE
; UNLESS THE JOB IS DEALLOCATED WHICH SHOULDN'T HAPPEN (not detached)
;
D$JCB: MOV #<D%JCB-C.SCR>,D0 ; FIND MESSAGE LINE
CALL POSCRT ; LOCATE CURSOR
MOV J%JCB(A5),D1 ; SET D1=JCB ADDR
OCVT 8.,OT$TRM!OT$ZER!OT$TSP ; OUTPUT OCTAL(or hex) NUMBER @TRM/NO LEAD ZERO/WITH TRAIL SP
;
MOV D1,A0 ; GET JCB ADDR INTO A0
; TOP OF MAJOR LOOP
TIME: TCKI ; TEST FOR INPUT TO IGNORE
CTRLC FINISH ; IF ^C FINISH
GTIMES D0 ; PUT SYSTEM TIME =>D0
CMP D0,S%TIME(A5) ; COMPARE NEW TIME WITH LAST TIME
BNE 100$ ; IF NE THEN PRINT OUT
SLEEP #1000 ; SLOW DOWN DISPLAY RATE
BR D$JOB ; DONT NEED TIME PRINTED
100$: MOV D0,S%TIME(A5) ; SAVE NEW TIME
MOV #<D%TIME-C.SCR>,D0 ; LOCATION OF DSLPY STRING
CALL POSCRT ; MOVE
CLR D3 ; CLR D3 FOR TIME CALL
CLR D4 ; CLR D4 FOR TIME CALL
MOV #1.,D5 ; #1 FLAG= DONT PRINT DATE
MOV #0.,A2 ; SET A2=0 FOR TIME CALL
CALL $ODTIM ; CALL TIME DISPLAY RTN
CALL D$CON ; UPDATES JOBS JOB'S CONNECT TIME
; CALL HERE BECAUSE IT CHANGES AT THE SAME
; RATE AS TIME DOES
BR TIME ; GOTO TIME FOR NEXT TIME DISPLAY
D$JOB: MOV J%JCB(A5),A0 ; SET A0=JCB OF DISPLAYED JOB
CALL D$JNM ; UPDATE JOBS JOB NAME
CALL D$TNM ; " TRM NAME
CALL D$PGM ; " PRGM NAME
CALL D$USN ; " USER NAME
CALL D$CLOG ; " CURRENT LOG IN
CALL D$RLOG ; " ROOT LOG-IN
CALL D$JST ; " JOB STATUS
CALL D$TST ; " TRM STATUS
CALL D$TYP ; " JOB TYPE
CALL D$CMD ; " FORCED CMD LINE
CALL D$LVL ; " USER LEVEL
CALL D$EXP ; " USER EXPERTISE
CALL D$BAS ; " JOB'S MEMORY BASE
CALL D$SIZ ; " JOB'S MEMORY SIZE
CALL D$PRV ; " JOB PRIVILAGE
CALL D$MSR ; " PENDING MESSAGES
CALL D$LNG ; " LANGUAGE POINTER
CALL D$CMZ ; " JOB'S CMD FILE SIZE
CALL D$CMS ; " JOB'S CMD FILE STATUS
CALL D$TRM ; " TRM ADDR
CALL D$CPU ; " JOB'S CPU TIME
CALL D$DSR ; " JOB'S DSK READS
CALL D$DSW ; " JOB'S DSK WRITES
CALL D$GRPH ; " JOB'S MEMORY MODULES
JMP TIME