;********************************************************************
;* TRMOFF.M68 (Terminal Off) .... now this is really cool!
;*
;* Monitor system JOBs for lack of input...turn off screen after
;* a three minute grace period if no CPU time used.
;*
;* by Dave Heyliger - AMUS (May '86)
;*
;*###################################################################
;# How it works:
;# Similar to NETSPY, a mini JOB is set up that basically sleeps
;# all day, peeking every once in a while at each JOBs CPU time.
;# If the terminal is ON, and there is no activity within 3 mins,
;# TRMOFF will turn OFF the terminal without interrupting the
;# JOB that this terminal is attached to (i.e., if a BASIC menu
;# program is just sitting there, TRMOFF will turn off the screen
;# while the menu is still "running"). To turn the terminal back ON,
;# just hit any key or a return. The input key is ignored, the
;# screen comes back on, and everybody is happy.
;#
;# What you need to do:
;# Step 1: modify your terminal driver ("piece of cake" - ha ha).
;# Assuming an AM62, AM62A, AM70, TVI925, etc. do the following
;#
;# (NOTE: AM70TO, AM62TO, and T925TO.M68 all have been placed in
;# the driver account, [100,53], for you to use if you would
;# rather just obtain a modified driver).
;#
;# a. COPY AM70TO.M68=AM70.M68 (for example)
;# b. VUE AM70TO.M68
;# c. from the ">" type S INP: {return}
;# d. now hit ONE control-x, you should be at the input routine
;# it will look something like this:
;#
;#
;#INP: BMI INMLT ; skip if multi-byte processing
;# CMPB D1,#1 ; function code?
;# BEQ INPM ; yes - could be multi-byte sequence
;# CMPB D1,#33 ; escape?
;# BEQ INPM ; yes - could be multi-byte sequence
;# LCC #0 ; no - normal processing
;# RTN
;#
;#INPM: LCC #PS.N ; possible multi-byte - return N flag
;# RTN
;#
;# e. place the cursor at the line LCC #0 and hit a bunch of
;# control-B's, and insert the code listed below. I have left
;# in the code above so you can see exactly where it needs to
;# go.
;#
;#INP: BMI INMLT ; skip if multi-byte processing
;# CMPB D1,#1 ; function code?
;# BEQ INPM ; yes - could be multi-byte sequence
;# CMPB D1,#33 ; escape?
;# BEQ INPM ; yes - could be multi-byte sequence
;#;
;#;++++++ NEW STUFF FOR AUTO TURN-ON WITH TRMOFF.LIT +++++++++
;#;
;# PUSH D1 ;save everything (paranoid, we are)
;# PUSH D7
;# PUSH A6
;# PUSH D3
;# CLR D1 ;clear the reg
;# MOVW T.STS(A5),D6 ;get the terminal status word
;# PUSH D6 ;and save the original
;# ANDW #20000,D6 ;get this bit
;# CMPW D6,#20000 ;see if this bit is on (tv OFF)
;# BLO CONT ;NO, tv is ON, so normal processing
;# POP D6 ;tv OFF, so get the status word
;# MOVW #20000,D7 ;and the bit indicating it's OFF
;# COMW D7 ;complement
;# ANDW D7,D6 ;and turn this bit off (tv will be ON)
;# MOVW D6,@A5 ;move this into the status word
;# LEA A6,C37 ;get the "turn on" byte string address
;# MOV A6,D1 ;move this address to D1 for TRMBFQ
;# MOV #2,D3 ;the number of bytes for turn on
;# TRMBFQ ;turn tv ON
;#CONT: POP D6 ;restore junk
;# POP D3
;# POP A6
;# POP D7
;# POP D1
;#;
;#;++++++ END OF "NEW HOT STUFF" - ZOUNDS! ++++++++++++++++
;#;
;# LCC #0 ; no - normal processing
;# RTN
;#
;#INPM: LCC #PS.N ; possible multi-byte - return N flag
;# RTN
;#
;# f. It might be wise to make sure that label C37: inside
;# the terminal driver IS the TURN ON code (most are).
;#
;# g. Now assemble the new terminal driver, and place it in
;# DSK0:1,6.
;#
;# Step 2: look at the bottom of this code and insert the proper JOB names
;# that you would like scanned. Be sure to have a full SIX
;# characters between the "/ /" (use blanks if necessary).
;#
;# Step 3: modify your AMOSL.INI file (by making a COPY and testing
;# it first!!!). Set up a mini JOB that will have a pseudo
;# terminal driver on it. Have it run TRMOFF. TRMOFF uses
;# microscopic CPU time and will not bog you down. Also, be
;# sure to change the TRMDEF lines so that the "new" terminal
;# drivers are attached.
;#
;********************************************************************
OBJNAM TRMOFF.LIT ;the final product
SEARCH SYS ;get the monitor calls...
SEARCH SYSSYM
SEARCH TRM
VMAJOR=1 ;define a version number
VMINOR=0
VEDIT=100.
TOP: SLEEP #1800000. ;sleep for 3 minutes (#600000.=1 min.)
CTRLC STOP ;quit on controlC
INI: MOV JOBTBL,A0 ;JOB TABLE address to A0
LEA A1,JOBS ;JOBS (list to check) address to A1
MOV #0,D4 ;D4 will be a counter for offset use
;--- Scan for the JOBs to be checked
;
SCAN: MOV (A0)+,A3 ;A3 now points to each JCB per SCAN
MOV A3,D1 ;Set the status register
JMI TOP ;if at end of JOBTBL, clean-up time
BEQ SCAN ;if a "0" then look at next JCB
LEA A4,JOBNAM(A3) ;valid JOB so get the NAME of the JOB
CMM @A1,@A4 ;see if this name matches name in list
BEQ TIME ;found a match!
JMP SCAN ;else try the next JOB on the system
;--- Time to check to see if CPU time is same as 3 minutes ago.
;
TIME: LEA A4,JOBCPU(A3) ;"tiw"... but for how long???
LEA A2,CPUBUF ;point A2 to start of CPU usage array
LEA A6,FLAGS ;on-off flags
ADD D4,A2 ;offset adjustment
ADD D4,A6 ;offset adjustment
CMM @A2,@A4 ;time same as 3 minutes ago???
BEQ TIME2 ;yup, time to turn off if not OFF
MOV (A4),@A2 ;else store the "new" CPU time
CLR @A6 ;flag NOT set cuz CPU time indicated
NOOFF: ADD #4,D4 ;and adjust offset value
ADD #4,A1 ;point A1 to next JOB on list
JMP SCAN ;and begin scanning system again
TIME2: CMP @A6,#1 ;already turned off?
BEQ NOOFF ;yup
MOV #1,@A6 ;nope, set flag saying "I'm OFF"
;--- Terminal not being used, so
; 1) detach that terminal from that unused JOB
; 2) attach that terminal to the JOB running this program
; 3) turn it off
; 4) attach terminals back to the original JOBs
;
ONOFF: PUSH D4 ;our beloved offset value
JOBIDX A6 ;this JCB
MOV JOBTRM(A6),A5 ;this TB^
PUSH A5 ;save it
MOV JOBTRM(A3),A5 ;their TB^
PUSH A5 ;save it
LEA A5,JOBTRM(A3) ;address of their TB^
JLOCK ;----------------------------------------------------------
CLR @A5 ;"detach" their terminal
LEA A4,JOBTRM(A6) ;A4 points to this TB^ memory area
POP @A4 ;TB^ now is their terminal
PUSH @A4 ;and save it too (need it later)
PRTTAB 377,44 ;turn the sucker off
POP @A5 ;attach it back to original owner
POP @A4 ;attach OUR original terminal back
MOV JOBTRM(A3),A5 ;get their terminal status word
CLRW D0 ;clear for use
MOVW T.STS(A5),D0 ;move in the tsw
ORW #20000,D0 ;flip on this bit for the .TDV to see
MOVW D0,@A5 ;and place it in the tsw
JUNLOK ;-----------------------------------------------------------
UPDATE: POP D4 ;get our beloved offset value
ADD #4,D4 ;increment offset adjustment
ADD #4,A1 ;point to next JOB
JMP SCAN ;and continue scan
;--- List of JOBs that have terminals that don't auto turn off.
; You MUST list these JOBS IN ORDER (i.e., how STAT lists them, ok?).
;
JOBS: RAD50 /SPOCK /
RAD50 /BONES /
RAD50 /YEOMAN/
EVEN
;--- CPU time usage array and ON/OFF flags array. 10 = 8 JOBs max. If you
; need more than 8 JOBs monitored, then 15 = 13 JOBs, 20 = 16 JOBs, etc
; (Learn base 8, members. It's good for you!).
;
CPUBUF: BLKL 10 ;original setup for eight JOBs
FLAGS: BLKL 10