;       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
;
;



       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       RADIX 8.

       AUTOEXTERN

       INTERN  M%DEF

VMAJOR  =       1.
VMINOR  =       1.
VSUB    =       2.
VEDIT   =       4.
VWHO    =       0.

;       EQUATES
STR.R=0
STR.N=2
STR.S=3


;
;MACROS

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

;
; SUBROUTINES
;
; PAINT SCREEN
;
SCREEN: LEA     A1,C.SCR
N.SCR:  CALL    PRINT
       BEQ     F.SCR
       BR      N.SCR

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

C.SCR:: WORD    0,0             ; clear screen

       DSPLY    1., 3.,<DJOB13 Ver>
       DSPLY    1.,22.,<by J.Stuyvesant>
       DSPLY    1.,39.,<AMOS/L Ver>
D%TIME::DSPLY    1.,63.,<TIME>
D%JNM:: DSPLY    2., 3.,<JOB Name :>
D%TNM:: DSPLY    3., 3.,<TRM Name :>
D%PGM:: DSPLY    4., 3.,<PGM Name :>
D%USN:: DSPLY    5., 3.,<USR Name :>
D%PPN:: DSPLY    6., 3.,<Lg :>
D%RPN:: DSPLY    7., 3.,<Rt :>
D%JST:: DSPLY    2.,22.,<Job Status     :>
D%TST:: DSPLY    3.,22.,<Terminal Status:>
D%TYP:: DSPLY    4.,22.,<Job Type       :>
D%CMD:: DSPLY    5.,34.,<CMD:>
D%LVL:: DSPLY    6.,24.,<U Lvl:>
D%EXP:: DSPLY    7.,24.,<U Exp:>
D%JCB:: DSPLY    8., 3.,<JCB Addr :>
D%TRM:: DSPLY    9., 3.,<TCB Addr :>
D%BAS:: DSPLY   10., 3.,<Job Base :>
D%SIZ:: DSPLY   11., 3.,<Job Size :>
D%PRV:: DSPLY   12., 3.,<Job Priv :>
D%MSR:: DSPLY   13., 3.,<Job MsgR :>
D%LNG:: DSPLY   14., 3.,<Job lang :>
D%CMZ:: DSPLY   15., 3.,<Job CMZ  :>
D%CMS:: DSPLY   16., 3.,<Job CMS  :>
       DSPLY   20.,12.,<ACCOUNT DATA>
D%CPU:: DSPLY   21., 3.,<CPU Time :>
D%CON:: DSPLY   22., 3.,<CON Time :>
D%DSR:: DSPLY   23., 3.,<DSK Read :>
D%DSW:: DSPLY   24., 3.,<DSK Write:>
       L.CRT    6.,79.                         ; nor vid @ 6,79
       BYTE    0.,33.                          ;
       L.CRT    6.,40.                         ; dim vid @ 6,38
       BYTE    0.,11.                          ;
       DSPLY    6.,41.,< Module         Size   S   Address  >
       L.CRT    6.,80.                         ; fgd vid @ 6,80
       BYTE    0.,12.                          ;
       L.CRT    6., 1.,                        ; rev vid @ 6,1
       BYTE    0.,32.                          ;
       L.CRT    7.,41.                         ; nor vid @ 7,40
       BYTE    0.,33.                          ;
       L.CRT    7., 1.,                        ; rev vid @ 7,1
       BYTE    0.,32.                          ;
D%TOP:: DSPLY    7.,42.,<MEM End                 >
D%BOT:: DSPLY   24.,76.,<Base>

       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

       END