.TITLE XXXYYY .IDENT /V00.0C/ ;+ ;V00.0A ??-SEP-81 START OF HISTORY LOG. M.W. ;V00.0B ??-SEP-81 ADD ACCOUNTING INFO & RANDOM MESSAGE. M.W. ;V00.0C 06-NOV-81 REMOVE RANDOM MESSAGE & CREATE DUPLICATE TAC ; FILE. M.W. ;- .SUBTITLE DESCRIPTION & HOW TO USE ; ;THIS PROGRAM IS DESIGNED TO GET CERTAIN PROCESS PARAMETERS FROM CERTAIN ;PROCESS(ES) & OUTPUT THEM TO EITHER THE OPERATOR'S CONSOLE, A TERMINAL ;ACCOUNTING FILE, OR BOTH. BASED ON CONDITIONAL ASSEMBLING ACCORDING TO THE ;VALUE OF PROGRAM_TYPE, THIS SOURCE CODE ASSEMBLES 3 SLIGHTLY DIFFERENT ;PROGRAMS: ; ; (1) LOGIN (PROGRAM_TYPE = LOGIN) OUTPUTS A LOGIN RECORD ; CONTAINING INFORMATION ABOUT THE CURRENT PROCESS ; BOTH TO THE OPERATOR'S CONSOLE & TO THE END OF THE ; TERMINAL ACCOUNTING FILE (TAC FILE). ; (2) LOGOUT (PROGRAM_TYPE = LOGOUT) OUTPUTS A LOGOUT RECORD TO ; THE SAME PLACES & THEN OUTPUTS A RANDOM MESSAGE FROM ; THE FILE RANMSG. ; (3) CLEANUP (PROGRAM_TYPE = CLEANUP) RENAMES THE CURRENT TAC ; FILE (SEE NOTE C) TO SOMETHING INDICATING IT IS AN ; OLD TAC FILE & OPENS A NEW TAC FILE. THEN, FOR ALL ; USERS CURRENTLY LOGGED IN, A LOGOUT RECORD IS ; WRITTEN TO THE OLD TAC FILE & A LOGIN RECORD IS ; WRITTEN TO THE NEW ONE. THEN A CLEAN UP RECORD IS ; WRITTEN TO THE OLD TAC FILE. ; ;TO CHANGE WHICH PARAMETERS ARE OUTPUT ALL THAT IS NECESSARY IS TO (1) ;CHANGE THE CALLS TO BLDTBL & (2) POSSIBLY CREATE OR DELETE A SPECIAL ROUTINE ;USED TO HANDLE SPECIAL PARAMETERS. THE CALL TO BLDTBL IS AS FOLLOWS: ; ; BLDTBL NAME=WHICH GETJPI PARAMETER TO OUTPUT,- ; SIZE=SIZE IN BYTES OF GETJPI'S OUTPUT OF THIS ; PARAMETER,- ; DEFN=CHARACTER STRING TO PRECEED THIS PARAMETER ; WHEN IT IS OUTPUT. IF NOT SPECIFIED, ; BLDTBL MAY STILL REQUEST THAT GETJPI ; RETURN THE PROPER INFO (DEPENDING UPON ; TYPE), BUT BLDTBL DOES NOT CREATE THE ; ENTRIES NECESSARY TO OUTPUT THE INFO TO ; THE OUTPUT DEVICE. THIS IS USEFUL FOR ; PARAMETERS SUCH AS THE GROUP & MEMBER ; PARAMETERS OF THE UIC; GROUP NEEDS THE ; HEADER WHILE MEMBER DOES NOT.,- ; TYPE=STRING IF GETJPI OUTPUTS A CHARACTER ; STRING (NO SPECIAL CONSOLE ; ROUTINE IS NEEDED), OR ; VALUE IF GETJPI OUTPUTS A 2 OR 4 BYTE ; INTEGER (NO SPECIAL CONSOLE ; ROUTINE IS NEEDED), OR ; OTHER IF GETJPI DOES NOT OUTPUT THE ; PARAMETER INFO IN A WAY SUITABLE ; TO THE USER (IN WHICH CASE A SPECIAL ; CONSOLE ROUTINE IS NEEDED TO CONVERT ; GETJPI'S OUTPUT TO AN ASCII STRING ; AGREABLE TO THE USER), OR ; NONE GETJPI IS NOT CALLED AT ALL; THE ; INPUT TO THE SPECIAL CONSOLE ROUTINE ; COMES FROM INSIZE & INADDR.,- ; OUTLEN=MAXIMUM SIZE FOR FAOL TO USE TO OUTPUT ; DATA (IF NOT SPECIFIED, THE VALUE ; INPUTTED FOR SIZE IS USED),- ; BUFADDR=ONLY USED WHEN TYPE = OTHER OR TYPE = ; NONE. THIS IS WHERE GETJPI OR A ; SPECIAL CONSOLE ROUTINE IS TO OUTPUT ; IT'S INFO.,- ; CONRTN=ADDRESS OF SPECIAL CONSOLE ROUTINE TO ; CALL TO FURTHER READY THE DATA FOR ; OUTPUT TO THE CONSOLE. TO SEE HOW A ; CONSOLE ROUTINE (1) ACCESSES THE GETJPI ; INFO & (2) WHERE IT OUTPUTS ITS DATA ; REFER TO THE COMMENT PRECEEDING THE ; SPECIAL ROUTINE DRIVER.,- ; INSIZE=LENGTH OF INPUT TO CONSOLE ROUTINE IF ; TYPE = NONE,- ; INADDR=ADDRESS OF INPUT TO CONSOLE ROUTINE IF ; TYPE = NONE.,- ; TACRTN=ROUTINE TO CALL IF INFO IS TO BE ; INCLUDED IN TERMINAL ACCOUNTING.,- ; TACLEN=LENGTH OF TACRTN'S OUTPUT.,- ; TACOFF=OFFSET INTO TACREC WHERE OUTPUT IS TO ; GO. ; ;NOTE: (A) IF DURING ASSEMBLY A MACRO GENERATES AN ERROR OF THE FORM ; ; XXX_XXX_END IS TOO SMALL, ; ; THEN INCREASE XXX_XXX_SIZE UNTIL THE MESSAGE DISAPPEARS. ; ; (B) BECAUSE TRNLOG_RTN MODIFIES JPI_OUT (VIA @SPEC_OUTPUT(R6)), THIS ; PROGRAM MUST BE MODIFIED BEFORE IT CAN BE CALLED REPEATEDLY AS A ; SUBROUTINE. ; ; (C) THE ALGORITHYM TO RENAME IS 1ST TO TRY TO TRANSLATE THE LOGICAL ; NAME RENTACFIL. IF A TRANSLATION OCCURES, THAT NAME IS WHAT THE ; OLD FILE IS RENAMED TO. IF NO TRANSLATION OCCURES, THE OLD FILE ; IS RENAMED TO DRC0:[EDDIELUI.VAXTAC]DDMMMYYYY.TAC, WITH DDMMMYYYY ; BEING THE CURRENT DAY, MONTH, & YEAR. .PAGE .SUBTITLE MACROS ; ;****************************************************************************** ; ;BUILD FAOL INPUT ; ;****************************************************************************** ; .MACRO FAOLINP DEFN,CMD .IF NE PROGRAM_TYPE - CLEANUP .IF NB DEFN ;ONLY BUILD OUTPUT IF HAVE A DEFN. .SAVE_PSECT .PSECT READ_ONLY_DATA .= FAOL_INP_EQU ;BUILD INPUT TO FAOL: CUR_WIDTH= CUR_WIDTH + OUTSIZE + %LENGTH(DEFN) + 3 ;HOW BIG CURRENT LINE ;IS. .IF GT CUR_WIDTH - OUT_WIDTH ;TOO BIG FOR 1 LINE? .ASCII \!/ \ ;INSERT NEW LINE. .REPEAT START_WIDTH .ASCII / / .ENDR FAOL_INP_EQU= FAOL_INP_EQU + 2 + START_WIDTH CUR_WIDTH= OUTSIZE + %LENGTH(DEFN) + 3 + START_WIDTH ;RESET CURRENT ;WIDTH. .= FAOL_INP_EQU .ENDC ;GT CUR_WIDTH - OUT_WIDTH. .ASCII /DEFN': !'CMD' / ;TELL FAOL TO GET INPUT FROM PARS. INCCHK FAOL_INP_EQU,%LENGTH(DEFN)+6,FAOL_INP_END INCCHK FAOL_OUT_EQU,OUTSIZE,FAOL_OUT_END .RESTORE_PSECT .ENDC ;NB DEFN. .ENDC ;NE PROGRAM_TYPE - CLEANUP. .ENDM FAOLINP ; ;****************************************************************************** ; ;BUILD GETJPI ARGUMENT LIST & OTHER ASSORTED DATA STRUCTURES. ; ;****************************************************************************** ; ; .MACRO BLDTBL NAME,SIZE=4,DEFN,TYPE=STRING,OUTLEN,BUFADDR,CONRTN,- INSIZE=0,INADDR=0,TACRTN,TACLEN,TACOFF=0 ; ;SET OUTSIZE ; .IF NB OUTLEN OUTSIZE= OUTLEN .ENDC .IF B OUTLEN OUTSIZE= SIZE .ENDC .SAVE_PSECT .PSECT READ_ONLY_DATA .IF IDN TYPE STRING ;PROCESS STRING. ; ;STRINGS. ; .= JPI_ITEM_EQU ;BUILD INPUT TO GETJPI: .WORD SIZE ;MAX LENGTH OF OUTPUT. .WORD NAME ;INFO TO GET. .LONG JPI_BUF_EQU ;WHERE TO STORE OUTPUT STRING FROM ;GETJPI. .LONG JPI_OUT_EQU ;WHERE TO PUT IT'S LENGTH (FOR FAOL ;PARAMETER INPUT). .PSECT WRITEABLE_DATA .= JPI_OUT_EQU + 4 ;CONTINUING FAOL PARAMETER INPUT: .LONG JPI_BUF_EQU ;LOCATION OF ASCII STRING OUTPUT BY ;GETJPI. FAOLINP DEFN,AD ;BUILD FAOL INPUT. .IF NB TACRTN ;PUT THIS PARAMETER IN TAC FILE? TAC_RTN_EXIST= TRUE ;YES -- & SIGNAL THAT SUCH PARAMETERS ;EXIST. .= SPEC_BUF_EQU + SPEC_RTN ;ROUTINE TO CALL. .LONG TACRTN .= SPEC_BUF_EQU + SPEC_INPUT_LEN_ADDR ;ADDRESS OF LENGTH OF INPUT. .LONG JPI_OUT_EQU .= SPEC_BUF_EQU + SPEC_INPUT_ADDR ;ADDRESS OF INPUT. .LONG JPI_BUF_EQU .= SPEC_BUF_EQU + SPEC_OUTPUT_LEN ;LENGTH OF OUTPUT. .LONG TACLEN .= SPEC_BUF_EQU + SPEC_OUTPUT_ADDR ;ADDRESS OF OUTPUT. .LONG TACREC + TACOFF INCCHK SPEC_BUF_EQU,SPEC_BUF_INC,SPEC_BUF_END .ENDC ; ;PREPARE FOR NEXT INVOCATION. ; INCCHK JPI_OUT_EQU,8.,JPI_OUT_END INCCHK JPI_BUF_EQU,SIZE,JPI_BUF_END INCCHK JPI_ITEM_EQU,12.,JPI_ITEM_END .ENDC .IF IDN TYPE VALUE ;PROCESS INTEGERS. ; ;INTEGERS. ; .= JPI_ITEM_EQU ;BUILD GETJPI INPUT: .WORD SIZE ;MAX LENGTH OF OUTPUT. .WORD NAME ;INFO TO GET. .LONG JPI_OUT_EQU ;WHERE TO PUT OUTPUT VALUE (FAOL ;INPUT PARAMETER LIST). .LONG 0 ;DON'T NEED TO RETURN LENGTH. FAOLINP DEFN,SL ;BUILD FAOL INPUT. .IF NB TACRTN ;PUT THIS PARAMETER IN TAC FILE? .PSECT WRITEABLE_DATA TAC_RTN_EXIST= TRUE ;YES -- & SIGNAL THAT SUCH PARAMETERS ;EXIST. .= SPEC_BUF_EQU + SPEC_RTN ;ROUTINE TO CALL. .LONG TACRTN .= SPEC_BUF_EQU + SPEC_INPUT_ADDR ;ADDRESS OF INPUT. .LONG JPI_OUT_EQU .= SPEC_BUF_EQU + SPEC_OUTPUT_LEN ;LENGTH OF OUTPUT. .LONG TACLEN .= SPEC_BUF_EQU + SPEC_OUTPUT_ADDR ;ADDRESS OF OUTPUT. .LONG TACREC + TACOFF INCCHK SPEC_BUF_EQU,SPEC_BUF_INC,SPEC_BUF_END .ENDC ; ;PREPARE FOR NEXT INVOCATION. ; INCCHK JPI_OUT_EQU,4,JPI_OUT_END INCCHK JPI_ITEM_EQU,12,JPI_ITEM_END .ENDC .IF IDN TYPE OTHER ;PROCESS SPECIAL TYPES. ; ;OTHER. ; .= JPI_ITEM_EQU ;BUILD INPUT TO GETJPI: .WORD SIZE ;MAX LENGTH OF OUTPUT. .WORD NAME ;INFO TO GET. .LONG SPEC_INP_EQU ;WHERE TO PUT OUTPUT OF GETJPI (FOR ;SPEC INPUT) .LONG SPEC_BUF_EQU + SPEC_INPUT_LEN ;WHERE TO PUT OUTPUT LENGTH ;(FOR INPUT TO SPECIAL ROUTINES) .PSECT WRITEABLE_DATA .= SPEC_BUF_EQU + SPEC_RTN ;FINISH BUILDING INPUT FOR SPECIAL ;ROUTINES: .LONG CONRTN ;WHICH SPECIAL ROUTINE TO CALL. .= SPEC_BUF_EQU + SPEC_INPUT_ADDR .LONG SPEC_INP_EQU ;THIS TELLS THE SPECIAL ROUTINES WHERE ;GETJPI PUT IT'S OUTPUT STRING. .IF NB DEFN ;DON'T BUILD ANOTHER ENTRY IN ;JPI_OUT_BUF IF THIS PARAMETER WON'T ;STAND ALONE (DEFN NOT DEFINED). .= SPEC_BUF_EQU + SPEC_OUTPUT .LONG JPI_OUT_EQU ;WHERE TO FIND CHARACTER STRING DESC ;THAT POINTS TO WHERE THE OUTPUT FROM ;THE SPECIAL IS (FAOL USES THIS AS IT'S ;PARAMETER INPUT). .= JPI_OUT_EQU ;TELL FAOL HOW TO GET TO OUTPUT ;PRODUCED BY SPECIAL ROUTINES. .LONG OUTSIZE .LONG BUFADDR INCCHK JPI_OUT_EQU,8.,JPI_OUT_END .ENDC INCCHK SPEC_BUF_EQU,SPEC_BUF_INC,SPEC_BUF_END .IF NB TACRTN ;PUT THIS PARAMETER IN TAC FILE? TAC_RTN_EXIST= TRUE ;YES -- & SIGNAL THAT SUCH PARAMETERS ;EXIST. .= SPEC_BUF_EQU + SPEC_RTN ;ROUTINE TO CALL. .LONG TACRTN .= SPEC_BUF_EQU + SPEC_INPUT_LEN_ADDR ;ADDRESS OF LENGTH OF INPUT. .LONG SPEC_BUF_EQU + SPEC_INPUT_LEN_ADDR - SPEC_BUF_INC .= SPEC_BUF_EQU + SPEC_INPUT_ADDR ;ADDRESS OF INPUT. .LONG SPEC_INP_EQU .= SPEC_BUF_EQU + SPEC_OUTPUT_LEN ;LENGTH OF OUTPUT. .LONG TACLEN .= SPEC_BUF_EQU + SPEC_OUTPUT_ADDR ;ADDRESS OF OUTPUT. .LONG TACREC + TACOFF INCCHK SPEC_BUF_EQU,SPEC_BUF_INC,SPEC_BUF_END .ENDC FAOLINP DEFN,AD ;BUILD INPUT TO FAOL. ; ;PREPARE FOR NEXT INVOCATION. ; INCCHK JPI_ITEM_EQU,12.,JPI_ITEM_END INCCHK SPEC_INP_EQU,SIZE,SPEC_INP_END .ENDC ; ;NONE ; .IF IDN TYPE NONE ;DON'T CALL GETJPI -- SPECIAL ROUTINE ;PROVIDES ALL THAT IS NECESSARY. .PSECT WRITEABLE_DATA .IF NB CONRTN ;CONSOLE ROUTINE? .= SPEC_BUF_EQU + SPEC_RTN ;YES. .LONG CONRTN ;TELL SPECIAL ROUTINE DRIVER TO CALL ;THIS ROUTINE. .= SPEC_BUF_EQU + SPEC_INPUT_LEN ;TELL SPECIAL ROUTINE SIZE OF INPUT. .LONG INSIZE .= SPEC_BUF_EQU + SPEC_INPUT_ADDR ;TELL SPECIAL ROUTINE WHERE INPUT IS. .LONG INADDR .IF NB DEFN ;IF FAOL SHOULD OUTPUT DATA FROM THIS ;INVOCATION OF BLDTBL... .= SPEC_BUF_EQU + SPEC_OUTPUT .LONG JPI_OUT_EQU ;TELL SPECIAL ROUTINE WHERE CHARACTER ;STRING DESCRIPTOR OF ITS OUTPUT IS. .= JPI_OUT_EQU .LONG OUTSIZE ;TELL FAOL LENGTH OF OUTPUT (THIS ;CAN BE MODIFIED BY THE SPECIAL ;ROUTINE). .LONG BUFADDR ;TELL FAOL WHERE STRING TO OUTPUT IS. INCCHK JPI_OUT_EQU,8.,JPI_OUT_END .ENDC FAOLINP DEFN,AD .ENDC ;END OF DEFN. INCCHK SPEC_BUF_EQU,SPEC_BUF_INC,SPEC_BUF_END .IF NB TACRTN ;PUT THIS PARAMETER IN TAC FILE? TAC_RTN_EXIST= TRUE ;YES -- & SIGNAL THAT SUCH PARAMETERS ;EXIST. .= SPEC_BUF_EQU + SPEC_RTN ;ROUTINE TO CALL. .LONG TACRTN .IF NB DEFN ;PROVIDE INPUT INFO? .= SPEC_BUF_EQU + SPEC_INPUT_LEN_ADDR ;YES - ADDRESS OF LENGTH OF ;INPUT. .LONG JPI_OUT_EQU .= SPEC_BUF_EQU + SPEC_INPUT_ADDR ;ADDRESS OF INPUT. .LONG BUFADDR .= SPEC_BUF_EQU + SPEC_OUTPUT_LEN ;LENGTH OF OUTPUT. .LONG TACLEN .= SPEC_BUF_EQU + SPEC_OUTPUT_ADDR ;ADDRESS OF OUTPUT. .LONG TACREC + TACOFF .ENDC ;END OF DEFN. INCCHK SPEC_BUF_EQU,SPEC_BUF_INC,SPEC_BUF_END .ENDC ;NB TACRTN. .ENDC ;NB OTHER. .RESTORE_PSECT .ENDM BLDTBL .PAGE .SUBTITLE SYMBOLS .PSECT SYMBOLS,CON,LCL,NOEXE,NOPIC,NOSHR,NOWRT,NOVEC,BYTE TRUE= 1 FALSE= 0 LOGIN= 1 ;OUTPUT LOGIN RECORDS. LOGOUT= 2 ;OUTPUT LOGOUT RECORDS. CLEANUP= 4 ;CLEANUP THE TAC FILES. ; ;****************************************************************************** ; ;DEPENDING UPON PROGRAM_TYPE, 3 DIFFERENT PROGRAMS ARE ASSEMBLED (SEE ;DESCRIPTION AT TOP). ; ;****************************************************************************** ; PROGRAM_TYPE= XXXYYY ;THIS IS A XXXYYY PROGRAM. DUPLICATE_TAC= FALSE ;OUTPUT TAC INFO TO A DUPLICATE FILE? PRINT_RANMSG= TRUE ;PRINT RANMSG ON LOGOUT? OUT_WIDTH= 132. ;MAX LENGTH OF ANY 1 OUTPUT LINE. GRP_SIZE= 3 MEM_SIZE= 3 FAOL_OUT_SIZE= 200. JPI_ITEM_SIZE= 100. JPI_OUT_SIZE= 100. JPI_BUF_SIZE= 200. SPEC_BUF_SIZE= 300. FAOL_INP_SIZE= 100. SPEC_INP_SIZE= 100. DEF_DIR_SIZE= 28. TER_SIZE= 9. REN_TACFIL_NAME_SIZE= 9 ;LENGTH OF FILE NAME OF RENAMED FILE ;IF RENTACFIL DOES NOT TRANSLATE. FILENAME_SIZE= 40. ;LENGTH OF FILE NAME. ESC_SEQ_LEN= 4. ;LENGTH OF ESCAPE SEQUENCE POSSIBLY ;PREFIXED ONTO THE OUTPUT OF $TRNLOG. FILL= ^A/ / ;FILL CHARACTER. TER_CHAR= ^A/T/ ;HOW TO RECOGNIZE A TERMINAL. ZERO= ^A/0/ ESCAPE_CHAR= 27. ;ASCII CODE FOR ESCAPE CHARACTER. HEADING= 1 ;SAYS TAC RECORD IS A LOGIN RECORD. TAC_RTN_EXIST= FALSE ;HAVEN'T FOUND ANY TAC ROUTINES YET. USERNAME_SIZE= 12. NUM_TICKS_PER_SECOND= 60. ;NUMBER OF CPU TICKS PER SECOND. EFN= 1 ;WHICH EVENT FLAG TO USE. WILDCARD= -1 ;FOR GETJPI. PROCESS_TABLE= 2 ;CREATE LOGICAL NAME ENTRY IN PROCESS ;TABLE. .IF EQ PRINT_RANMSG - TRUE RANMSG_SIZE= 80 ;MAXIMUM LENGTH OF RANDON MESSAGE. .ENDC ;EQ PRINT_RANMSG - TRUE. CENTURY= 1900. ;CURRENT CENTURY. OFFSET NT_YEAR_OFF,2,START ;OFFSETS FOR $NUMTIM OUTPUT. OFFSET NT_MON_OFF,2 OFFSET NT_DAY_OFF,2 OFFSET NT_HOUR_OFF,2 OFFSET NT_MIN_OFF,2 OFFSET NT_SEC_OFF,2 OFFSET NT_TICK_OFF,2 DEFSIZ NUM_TIME_SIZE OFFSET ASC_DAY_OFF,2,START OFFSET SLACK,1 OFFSET ASC_MON_OFF,3 OFFSET SLACK,1 OFFSET ASC_YEAR_OFF,4 OFFSET SLACK,1 OFFSET ASC_HOUR_OFF,2 OFFSET SLACK,1 OFFSET ASC_MIN_OFF,2 OFFSET SLACK,1 OFFSET ASC_SEC_OFF,2 OFFSET SLACK,1 OFFSET ASC_TICK_OFF,2 DEFSIZ TIME_BUF_SIZE OFFSET SPEC_RTN,4,START ;OFFSET IN SPEC_BUF_EQU FOR ;ROUTINE TO CALL. OFFSET SPEC_OUTPUT,4 ;OFFSET IN SPEC_BUF_EQU FOR WHERE TO ;FIND POINTER & LENGTH OF OUTPUT BUFFER SPEC_OUTPUT_LEN= SPEC_OUTPUT ;OFFSET IN SPEC_BUF_EQU FOR WHERE TO ;LENGTH OF OUTPUT. SINCE THIS OVERLAYS ;SPEC_OUTPUT, 1 ROUTINE CANNOT MEANING- ;FULLY USE BOTH OFFSETS. OFFSET SPEC_OUTPUT_ADDR,4 ;OFFSET IN SPEC_BUF_EQU TO FIND ;ADDRESS OF OUTPUT. OFFSET SPEC_INPUT_LEN,4 ;OFFSET IN SPEC_BUF_EQU TO FIND ;LENGTH OF INPUT. SPEC_INPUT_LEN_ADDR= SPEC_INPUT_LEN ;OFFSET IN SPEC_BUF_EQU TO FIND ADDRESS ;OF LENGTH OF INPUT. SINCE THIS ;OVERLAYS SPEC_INPUT_LEN, 1 ROUTINE ;CANNOT MEANINGFULLY USE BOTH OFFSETS. OFFSET SPEC_INPUT_ADDR,4 ;OFFSET IN SPEC_BUF_EQU TO FIND ;LENGTH OF INPUT. DEFSIZ SPEC_BUF_INC ;LENGTH OF EACH ENTITY IN SPEC_BUF. TACDEF ;DEFINE TAC OFFSETS. $JPIDEF ;DEFINE GETJPI PARAMETERS .PAGE .SUBTITLE READ ONLY DATA .PSECT READ_ONLY_DATA,CON,LCL,NOEXE,NOSHR,NOWRT,PIC,REL,NOVEC,BYTE .IF NE PROGRAM_TYPE - CLEANUP ;THE FOLLOWING IS ONLY NEEDED ;FOR LOG IN & LOG OUT. FAOL_INP_DESC: ;INPUT FAOL COMMANDS. .BLKL 1 .LONG FAOL_INP FAOL_INP: .IF EQ PROGRAM_TYPE - LOGIN .ASCII /LOGIN --- / .ENDC .IF EQ PROGRAM_TYPE - LOGOUT .ASCII /LOGOUT -- / .ENDC START_WIDTH= . - FAOL_INP ;REMEMBER HOW LONG THIS HEADER IS. CUR_WIDTH= START_WIDTH ;LENGTH OF OUTPUT SO FAR. FAOL_INP_EQU= . .BLKB FAOL_INP_SIZE - START_WIDTH FAOL_INP_END= . .ENDC ;NE PROGRAM_TYPE - CLEANUP. CON_DEV_NAME: ;WHERE CONSOLE OUTPUT IS TO GO. .ASCID /_OPA0:/ JPI_ITEM: ;INPUT TO GETJPI JPI_ITEM_EQU= JPI_ITEM .BLKB JPI_ITEM_SIZE JPI_ITEM_END= . FAO_UIC: ;USED TO HELP CONVERT GROUP & MEMBER ;#'S IN UIC FROM BINARY TO ASCII. .ASCID /!OB/ MEM_DESC: .LONG MEM_SIZE .LONG MEM_BUF GRP_DESC: .LONG GRP_SIZE .LONG GRP_BUF IN_DEF_DIR: ;LOGICAL NAME TO TRANSLATE TO ;DEFAULT DIRECTORY. .ASCII /SYS$LOGIN/ IN_DEF_DIR_SIZE= . - IN_DEF_DIR .IF EQ PROGRAM_TYPE - LOGOUT .IF EQ PRINT_RANMSG - TRUE RANMSG_CHECK: ;MUST BE 1ST RECORD IN RANDOM MESSAGE ;FILE. .ASCII /RANMSG.TXT/ RANMSG_CHECK_SIZE= . - RANMSG_CHECK .ENDC ;EQ PRINT_RANMSG - TRUE. USR_DEV_NAME: ;WHERE RANDOM MESSAGE GOES. .ASCID /TT/ .ENDC ;EQ PROGRAM_TYPE - LOGOUT. .IF EQ PROGRAM_TYPE - CLEANUP REN_TACFIL_FNM: ;THE LOGICAL NAME TO TRANSLATE FOR THE ;RENAME FILE. NOTE -- THIS MUST BE ;THE SAME AS THE "FNM" FIELD IN ;REN_TACFAB. .ASCID /RENTACFIL/ .IFF OUT_TO_CONSOLE_TABLE: ;ONLY TERMINALS WHOSE 1ST LETTER IS IN ;THIS LIST HAVE THE CORRESPONDING ;LOGIN & LOGOUT MESSAGES WRITTEN TO THE ;CONSOLE. .ASCII /OTR/ OUT_TO_CONSOLE_TABLE_SIZE= . - OUT_TO_CONSOLE_TABLE .ENDC ;EQ PROGRAM_TYPE - CLEANUP. .PAGE .SUBTITLE WRITEABLE DATA .PSECT WRITEABLE_DATA,CON,LCL,NOEXE,NOSHR,PIC,REL,NOVEC,WRT,LONG JPI_OUT: ;POINTERS TO WHERE GETJPI IS TO OUTPUT ;ITS DATA AND LONG WORDS FOR GETJPI TO ;INSERT LENGTH OF DATA OUTPUTTED -- ;ALSO THIS IS PARAMETER INPUT FOR FAOL. JPI_OUT_EQU= JPI_OUT .BLKB JPI_OUT_SIZE JPI_OUT_END= . JPI_BUF: ;WHERE GETJPI OUTPUTS IS VALUES & ;ASCII STRINGS. JPI_BUF_EQU= JPI_BUF .BLKB JPI_BUF_SIZE JPI_BUF_END= . FAOL_OUT_DESC: .LONG FAOL_OUT_SIZE .LONG FAOL_OUT FAOL_OUT: ;OUTPUT OF FAOL. FAOL_OUT_EQU= FAOL_OUT .BLKB FAOL_OUT_SIZE FAOL_OUT_END= . OUT_DESC: .BLKL 1 ;FAOL INSERTS LENGTH HERE. .LONG FAOL_OUT .EVEN ; ;SPEC_BUF IS A DATA STRUCTURE USED TO PASS INFO TO THE SPECIAL ROUTINES. THESE ;ROUTINES: (1) HELP TO REFORMAT THE GETJPI OUTPUT FOR PARAMETERS THAT DO NOT ;RETURN A VALUE USEABLE BY HUMANS, (2) OUTPUT JOB INFO NOT RETURNED AT ALL BY ;GETJPI, & (3) OUTPUT DATA TO A BUFFER RECORD THAT IS WRITTEN OUT TO THE ;TERMINAL ACCOUNTING FILE. SPEC_BUF IS BROKEN UP INTO 20 (=SPEC_BUF_INC) BYTE ;BLOCKS WHICH ARE CREATED BY BLDTBL. THE FORMAT OF A BLOCK IS: ; ; FOR CONSOLE ROUTINES: ; ; .LONG (OFFSET = SPEC_RTN) ADDRESS OF ROUTINE TO CALL FOR ; CURRENT PARAMETER. ; .LONG (OFFSET = SPEC_OUTPUT) ADDRESS OF CHARACTER STRING ; DESCRIPTOR FOR OUTPUT FROM THE SPECIAL ROUTINE (POINTS ; INTO JPI_OUT). ; .BLKL NOT USED. ; .LONG (OFFSET = SPEC_INPUT_LEN) LENGTH OF DATA FOR INPUT TO ; THE SPECIAL ROUTINE. ; .LONG (OFFSET = SPEC_INPUT_ADDR) ADDRESS OF DATA FOR INPUT ; TO SPECIAL ROUTINE (POINTS INTO SPEC_INP). ; ; FOR TAC ROUTINES: ; ; .LONG (OFFSET = SPEC_RTN) ADDRESS OF ROUTINE TO CALL FOR ; CURRENT PARAMETER. ; .LONG (OFFSET = SPEC_OUTPUT_LEN) LENGTH OF OUTPUT. ; .LONG (OFFSET = SPEC_OUTPUT_ADDR) ADDRESS OF OUTPUT. ; .LONG (OFFSET = SPEC_INPUT_LEN_ADDR) ADDRESS OF LENGTH OF ; DATA FOR INPUT TO THE SPECIAL ROUTINE. ; .LONG (OFFSET = SPEC_INPUT_ADDR) ADDRESS OF DATA FOR INPUT ; TO SPECIAL ROUTINE (POINTS INTO SPEC_INP). ; SPEC_BUF: SPEC_BUF_EQU= SPEC_BUF .BLKB SPEC_BUF_SIZE SPEC_BUF_END= . SPEC_INP: SPEC_INP_EQU= SPEC_INP ;HOLDS THE ACTUAL INPUT DATA FOR ;THE SPECIAL ROUTINES. .BLKB SPEC_INP_SIZE SPEC_INP_END= . TIME_BUF: ;TIME & DATE. .BLKB TIME_BUF_SIZE UIC_BUF: ;PUT UIC HERE TEMPORARILY. .ASCII /[/ GRP_BUF: .BLKB GRP_SIZE .ASCII /,/ MEM_BUF: .BLKB MEM_SIZE .ASCII /]/ UIC_BUF_SIZE= . - UIC_BUF DEF_DIR: ;WHERE TRNLOG IS TO PUT THE DEFAULT ;DIRECTORY. .BLKB DEF_DIR_SIZE TACREC: ;TERMINAL ACCOUNTING OUTPUT RECORD ;BUFFER. .BLKB TACREC_SIZE .= TACREC + HEAD_OFF .IF EQ PROGRAM_TYPE - LOGOUT ;SET HEADER WORD TO IDENTIFY ;TO ANALYSIS PROGRAM WHAT KIND OF ;RECORD THIS IS. .WORD LOGOUT .IFF .WORD LOGIN .ENDC ;EQ PROGRAM_TYPE - LOGOUT. .= TACREC + TPS_OFF ;FILL IN # OF TICKS PER SECOND. .WORD NUM_TICKS_PER_SECOND .= TACREC + TACREC_SIZE ;OUT OF TACREC, NOW. .IF EQ PROGRAM_TYPE - LOGOUT TER_CHAN: .BLKL 1 ;FOR OUTPUT TO TERMINAL. .ENDC ;EQ PROGRAM_TYPE - LOGOUT. NUM_TIME_BUF: ;FOR OUTPUT FROM $NUMTIM. .BLKB NUM_TIME_SIZE OUT_TO_TACFIL: ;ONLY OUTPUT TO TAC FILE IF THIS BYTE ;HAS THE VALUE TRUE IN IT (THAT'S ;DECIDED IN TAC_TER_RTN). .BLKB 1 CUR_NUM_TIME_DESC: ;TODAY'S DATE IN NUMERIC FORM. .LONG NUM_TIME_SIZE .LONG CUR_NUM_TIME CUR_NUM_TIME: .BLKB NUM_TIME_SIZE CUR_ASC_TIME_DESC: .LONG TIME_BUF_SIZE .LONG CUR_ASC_TIME CUR_ASC_TIME: .BLKB TIME_BUF_SIZE .IF EQ PROGRAM_TYPE - CLEANUP ASC_TIME_BUF_DESC: ;WHERE CURRENT TIME GOES. .LONG TIME_BUF_SIZE .LONG ASC_TIME_BUF ASC_TIME_BUF: .BLKB TIME_BUF_SIZE PID: .QUAD WILDCARD ;AS INPUT TO GETJPI, THE PROCESS ID ;IS A WILD CARD SIGNIFYING TO GET ALL ;PROCESSES' ID'S. AS OUTPUT FROM ;GETJPI, IT CONTAINS THE RETRIVED ;PROCESS' ID. IOSB: .BLKQ 1 ;I/O STATUS BLOCK FROM GETJPI. TRAN_REN_TACFIL_DESC: ;RESULT OF TRANSLATING RENTACFIL. .LONG FILENAME_SIZE .LONG TRAN_REN_TACFIL TRAN_REN_TACFIL: .BLKB FILENAME_SIZE REN_TACFIL_DESC: .LONG REN_TACFIL_SPEC_SIZE .LONG REN_TACFIL_SPEC REN_TACFIL_SPEC: ;WHAT TO RENAME OLD FILE TO IF ;RENTACFIL DOESN'T TRANSLATE. .ASCII /DRC0:[WOOLSEY.TAC]/ REN_TACFIL_NAME: .BLKB REN_TACFIL_NAME_SIZE .ASCII /.TAC/ REN_TACFIL_SPEC_SIZE= . - REN_TACFIL_SPEC .IFF OUT_TO_CONSOLE: ;OUTPUT TO CONSOLE ONLY IF THIS BYTE ;HAS THE VALUE "TRUE" IN IT. .BLKB 1 .ENDC ;EQ PROGRAM_TYPE - CLEANUP. .IF EQ PROGRAM_TYPE - LOGOUT .IF EQ PRINT_RANMSG - TRUE RANMSG: ;THE SPACE FOR THE RANDOM MESSAGE. .BLKB RANMSG_SIZE RANMSG_DESC: .BLKL 2 ;VARIABLE STRING DESCRIPTOR POINTING ;TO OUTPUT FROM THE RANDOM MESSAGE ;FILE. NUM_RANMSG: .BLKL 1 ;# OF RANDOM MESSAGES. .ENDC ;EQ PRINT_RANMSG - TRUE. .ENDC ;EQ PROGRAM_TYPE - LOGOUT. .PAGE .SUBTITLE FILE DEFINITIONS .ALIGN LONG TACFAB: ;FOR THE TERMINAL ACCOUNTING FILE. $FAB FAC=PUT,- ;ONLY WRITES. FNM=,- ;LOGICAL FILE NAME. MRS=TACREC_SIZE,- ;MAXIMUM RECORD SIZE (CREATION ONLY). ORG=SEQ,- ;SEQUENTIAL ACCESS. XAB=TACXABPRO,- ;SET PROTECTION IF CREATING FILE. RFM=FIX ;RECORDS ALL SAME SIZE. TACXABPRO: $XABPRO PRO= ;SET PROTECTION ON CREATED FILE. TACRAB: ;FOR THE TERMINAL ACCOUNTING FILE. $RAB FAB=TACFAB,- ;THE ASSOCIATED FAB. RAC=SEQ,- ;AS I SAID BEFORE, SEQUENTIAL ACCESS. RBF=TACREC,- ;RECORD TO OUTPUT. ROP=EOF,- ;APPEND RECORD ONTO END OF FILE. RSZ=TACREC_SIZE ;LENGTH OF RECORD. .IF EQ DUPLICATE_TAC - TRUE DTACFAB: ;FOR A DUPLICATE COPY $FAB FAC=PUT,- ;ONLY WRITES. FNM=,- ;DUPLICATE FILE NAME. MRS=TACREC_SIZE,- ;MAXIMUM RECORD SIZE (CREATION ONLY). ORG=SEQ,- ;SEQUENTIAL ACCESS. XAB=TACXABPRO,- ;SET PROTECTION IF CREATING FILE. RFM=FIX ;RECORDS ALL SAME SIZE. DTACRAB: ;FOR A DUPLICATE COPY. $RAB FAB=DTACFAB,- ;THE ASSOCIATED FAB. RAC=SEQ,- ;AS I SAID BEFORE, SEQUENTIAL ACCESS. RBF=TACREC,- ;RECORD TO OUTPUT. ROP=EOF,- ;APPEND RECORD ONTO END OF FILE. RSZ=TACREC_SIZE ;LENGTH OF RECORD. .ENDC ;EQ DUPLICATE_TAC - TRUE. .IF EQ PROGRAM_TYPE - CLEANUP REN_TACFAB: ;THE RENAMED FILE'S FAB. $FAB FAC=PUT,- FNM=,- ;THIS MUST BE THE SAME AS THE ORG=SEQ,- ;CHAR STR DESC AT REN_TACFIL_FNM. RFM=FIX REN_TACRAB: $RAB FAB=REN_TACFAB,- RAC=SEQ,- RBF=TACREC,- ROP=EOF,- ;APPEND RECORD ONTO END OF FILE. RSZ=TACREC_SIZE .IF EQ DUPLICATE_TAC - TRUE REN_DTACFAB: ;THE RENAMED FILE'S FAB. $FAB FAC=PUT,- FNM=,- ;THE RENAMED DUPLICATE ORG=SEQ,- ;FILE. RFM=FIX REN_DTACRAB: $RAB FAB=REN_DTACFAB,- RAC=SEQ,- RBF=TACREC,- ROP=EOF,- ;APPEND RECORD ONTO END OF FILE. RSZ=TACREC_SIZE .ENDC ;EQ DUPLICATE_TAC - TRUE. .ENDC ;EQ PROGRAM_TYPE - CLEANUP .IF EQ PROGRAM_TYPE - LOGOUT .IF EQ PRINT_RANMSG - TRUE RANMSG_FAB: ;THE FILE CONTAINING THE RANDOM $FAB FAC=GET,- ;MESSAGES. FNM=,- ORG=SEQ,- RFM=VAR RANMSG_RAB: $RAB FAB=RANMSG_FAB,- RAC=SEQ,- UBF=RANMSG,- USZ=RANMSG_SIZE .ENDC ;EQ PRINT_RANMSG - TRUE. .ENDC ;EQ PROGRAM_TYPE - LOGOUT. .PAGE .SUBTITLE TABLE BUILDING ; ;****************************************************************************** ; ;TO CHANGE PARAMETERS OUTPUT, JUST CHANGE CALLS TO BLDTBL (& POSSIBLY THE ;SPECIAL ROUTINES) ; ;****************************************************************************** ; BLDTBL JPI$_USERNAME,USERNAME_SIZE,User_name,STRING,,,,,,- TAC_CHAR_RTN,USERNAME_SIZE,USERNAME_OFF BLDTBL JPI$_GRP,4,Uic,OTHER,UIC_BUF_SIZE,UIC_BUF,CON_GRP_RTN,,,- TAC_GRP_RTN,,GRP_OFF BLDTBL JPI$_MEM,4,,OTHER,,,CON_MEM_RTN,,,TAC_MEM_RTN,,MEM_OFF .IF EQ PROGRAM_TYPE - LOGIN BLDTBL JPI$_LOGINTIM,8,Time,OTHER,TIME_BUF_SIZE,TIME_BUF,- CON_TIME_RTN,,,TAC_LOGIN_TIME_RTN .IFF BLDTBL ,,Time,NONE,TIME_BUF_SIZE,TIME_BUF,CON_TIME_RTN,,,- TAC_LOGOUT_TIME_RTN,TIME_BUF_SIZE .ENDC ;EQ PROGRAM_TYPE - LOGIN BLDTBL JPI$_TERMINAL,7,Terminal,STRING,,,,,,TAC_TER_RTN,,TER_OFF BLDTBL ,,Directory,NONE,DEF_DIR_SIZE,DEF_DIR,CON_TRNLOG_RTN,- IN_DEF_DIR_SIZE,IN_DEF_DIR BLDTBL JPI$_CPUTIM,4,,VALUE,,,,,,TAC_INT_RTN,,TICK_OFF .PSECT READ_ONLY_DATA .= JPI_ITEM_EQU ;LAST ITEM IN GETJPI ARG LIST MUST ;BE A 0. .LONG 0 .IF NE PROGRAM_TYPE - CLEANUP .= FAOL_INP_DESC ;FAOL NEEDS TO KNOW HOW LONG THE LIST ;IS. .LONG FAOL_INP_EQU - FAOL_INP .ENDC ;NE PROGRAM_TYPE - CLEANUP. .PAGE .SUBTITLE MAIN ROUTINE .PSECT CODE,CON,EXE,LCL,NOWRT,PIC,REL,NOVEC,LONG ; ;MAIN ROUTINE. ; .ENTRY IDN ^M<> JSB INIT ;LET'S GET SET UP. 10$: .IF NE SPEC_BUF - SPEC_BUF_EQU ;ONLY CALL SPECIAL IF THERE ;ARE SOME PARAMETERS TO CONVERT. JSB SPECIAL ;CONVERT SPECIAL PARAMETERS TO READABLE ;FORM. .ENDC ;NE SPEC_BUF - SPEC_BUF_EQU JSB OUTPUT .IF EQ PROGRAM_TYPE - CLEANUP ;MORE THAN 1 CALL TO GETJPI? JSB GETPAR ;GET NEXT PROCESS'S INFO. BLBS R0,10$ ;BR IF GOT SOME DATA. CMPW R0,#SS$_NOMOREPROC ;LAST PROCESS ALREADY DONE? BNEQU 20$ ;BR IF NOT. .IFTF .IF NE PROGRAM_TYPE - LOGIN JSB FINISH ;CLEAN UP. .ENDC ;NE PROGRAM_TYPE - LOGIN. .IFT 20$: .ENDC ;EQ PROGRAM_TYPE - CLEANUP $EXIT_S .PAGE .SUBTITLE INITIALIZATION ROUTINE ; ;THIS ROUTINE OPENS THE PROPER FILES & CALLS GETPAR TO GET THE 1ST (& ;POSSIBLY ONLY) SET OF JOB PARAMETERS. ; INIT: .IF EQ PROGRAM_TYPE - CLEANUP $TRNLOG_S LOGNAM=REN_TACFIL_FNM,- ;TRY TO GET TRANSLATION OF THIS RSLBUF=TRAN_REN_TACFIL_DESC ;LOG NAME. CHKERR CMPW R0,#SS$_NORMAL ;EVERYTHING OK? BEQL 20$ ;BR IF SO -- LOG NAME ALREADY ASSIGNED. CMPW R0,#SS$_NOTRAN ;NO TRANSLATION ON NAME? BEQL 10$ ;BR IF SO. $EXIT_S R0 ;IT WAS NICE KNOWING YA. 10$: $ASCTIM_S TIMBUF=ASC_TIME_BUF_DESC ;GET CURRENT TIME. MOVC3 #2,ASC_TIME_BUF + ASC_DAY_OFF,REN_TACFIL_NAME ;MOVE DATE TO ;FILE NAME. MOVC3 #3,ASC_TIME_BUF + ASC_MON_OFF,REN_TACFIL_NAME + 2 MOVC3 #4,ASC_TIME_BUF + ASC_YEAR_OFF,REN_TACFIL_NAME + 5 $CRELOG_S TBLFLG=#PROCESS_TABLE,- ;CREATE OWN LOGICAL NAME IN LOGNAM=REN_TACFIL_FNM,- ;PROCESS TABLE. EQLNAM=REN_TACFIL_DESC CHKERR 20$: NUMTRY MACCAL=<$RENAME TACFAB,,,REN_TACFAB>,- ;TRY TO RENAME THE OLD NUM=#10,- ;FILE. WAKEUP=#1 .IF EQ DUPLICATE_TAC - TRUE NUMTRY MACCAL=<$RENAME DTACFAB,,,REN_DTACFAB>,- ;TRY TO RENAME NUM=#10,- ;THE OLD FILE. WAKEUP=#1 .ENDC ;EQ DUPLICATE_TAC - TRUE .IFF MOVL #TACFAB,R9 ;PREPARE TO OPEN CURRENT TAC FILE. MOVL #TACRAB,R10 JSB OPEN .IF EQ DUPLICATE_TAC - TRUE MOVL #DTACFAB,R9 ;PREPARE TO OPEN DUPLICATE TAC FILE. MOVL #DTACRAB,R10 JSB OPEN .ENDC ;EQ DUPLICATE_TAC - TRUE .IFT $CREATE FAB=TACFAB ;PROGRAM_TYPE = CLEANUP -- SO CREATE ;TAC FILE. CHKERR $CONNECT RAB=TACRAB ;RAB TO FAB NOW LET'S DRINK A TAB! CHKERR MOVL #REN_TACFAB,R9 ;PREPARE TO OPEN THE OLD TAC FILE. MOVL #REN_TACRAB,R10 JSB OPEN .IF EQ DUPLICATE_TAC - TRUE $CREATE FAB=DTACFAB ;PROGRAM_TYPE = CLEANUP -- SO CREATE ;DUPLICATE TAC FILE. CHKERR $CONNECT RAB=DTACRAB ;RAB TO FAB NOW LET'S DRINK A TAB! CHKERR MOVL #REN_DTACFAB,R9 ;PREPARE TO OPEN THE OLD TAC FILE. MOVL #REN_DTACRAB,R10 JSB OPEN .ENDC ;EQ DUPLICATE_TAC - TRUE .ENDC ;EQ PROGRAM_TYPE - CLEANUP JSB GETPAR ;GET PARAMETER INFO. RSB ;SEE YOU LATER. .PAGE .SUBTITLE THIS ROUTINE RETURNS THE PROPER JOB INFO ; ;THE SUBTITLE SAYS IT ALL. ; GETPAR: .IF EQ PROGRAM_TYPE - CLEANUP 10$: $GETJPI_S EFN=#EFN,- ;GET NEXT PROC'S INFO. PIDADR=PID,- ITMLST=JPI_ITEM,- IOSB=IOSB BLBS R0,20$ ;BR IF EVERYTHING PEACHY KING. CMPW R0,#SS$_NOPRIV ;NOT ENUF PRIVILEDGE? BEQL 10$ ;LET'S TRY AGAIN. CMPW R0,SS$_SUSPENDED ;IS THE GUY OUT IN SPACE? BEQL 10$ ;YEP -- LET'S IGNORE HIM. RSB ;NOPE -- RETURN W/ STATUS. 20$: $WAITFR_S EFN=#EFN ;ZZZZZZZZ. MOVZWL IOSB,R0 ;AM I OK? CHKERR ;WE'LL SEE. .IFF $GETJPI_S ITMLST=JPI_ITEM CHKERR .ENDC ;EQ PROGRAM_TYPE - CLEANUP. RSB ;BYE - BYE. .PAGE .SUBTITLE OUTPUT THE DATA. ; ;ALL OUTPUT EXCEPT ERROR REPORTING IS DONE HERE. ; OUTPUT: .IF NE PROGRAM_TYPE - CLEANUP CMPB OUT_TO_CONSOLE,#TRUE ;OUTPUT DATA TO CONSOLE? BNEQU 10$ ;BR IF NOT. $FAOL_S CTRSTR=FAOL_INP_DESC,- ;CONVERT INPUT STRING TO ASCII. OUTLEN=OUT_DESC,- OUTBUF=FAOL_OUT_DESC,- PRMLST=JPI_OUT CHKERR $BRDCST_S MSGBUF=OUT_DESC,- ;WRITE OUT INFO. DEVNAM=CON_DEV_NAME CHKERR 10$: .IFTF CMPB OUT_TO_TACFIL,#TRUE ;OUTPUT DATA TO TAC FILE? BNEQU 20$ ;BR IF NOT. .IFF MOVW #LOGOUT,TACREC + HEAD_OFF ;SAY THIS IS A LOGOUT RECORD. $PUT RAB=REN_TACRAB CHKERR .IF EQ DUPLICATE_TAC - TRUE $PUT RAB=REN_DTACRAB ;LOG THE GUY BACK IN. CHKERR .ENDC ;EQ DUPLICATE_TAC - TRUE. MOVW #LOGIN,HEAD_OFF + TACREC ;SAY THIS IS A LOGIN RECORD. .IFTF $PUT RAB=TACRAB ;LOG THE GUY BACK IN. CHKERR .IF EQ DUPLICATE_TAC - TRUE $PUT RAB=DTACRAB ;LOG THE GUY BACK IN. CHKERR .ENDC ;EQ DUPLICATE_TAC - TRUE. .ENDC ;NE PROGRAM_TYPE - CLEANUP. 20$: RSB ;ONWARD & UPWARD. .PAGE .SUBTITLE OPEN A FILE ; ;TRY TO OPEN A FILE -- IF AFTER 10 TRIES IT STILL WON'T OPEN, THEN DIE. ; OPEN: NUMTRY MACCAL=<$OPEN FAB=R9>,- NUM=#10,- WAKEUP=#1 $CONNECT RAB=R10 CHKERR RSB ;GO HOME. .PAGE .IF NE PROGRAM_TYPE - LOGIN .SUBTITLE CLEAN UP THE LOOSE ENDS ; ;THIS ROUTINE CLOSES OPEN FILES & STOPS THE CURRENT PROCESS (NOT JUST THIS ;EXECUTABLE IMAGE). ; FINISH: .IF EQ PROGRAM_TYPE - CLEANUP MOVL #CLEANUP,TACREC + HEAD_OFF ;SAY THIS IS A CLEANUP RECORD. $PUT RAB=REN_TACRAB CHKERR $CLOSE FAB=REN_TACFAB CHKERR .IF EQ DUPLICATE_TAC - TRUE $PUT RAB=REN_DTACRAB CHKERR $CLOSE FAB=REN_DTACFAB CHKERR .ENDC ;EQ DUPLICATE_TAC - TRUE. .ENDC ;EQ PROGRAM_TYPE - CLEANUP $CLOSE FAB=TACFAB .IF EQ PROGRAM_TYPE - LOGOUT .IF EQ PRINT_RANMSG - TRUE JSB PRINT_RANMSG_RTN .ENDC ;EQ DUPLICATE_TAC - TRUE. .ENDC ;EQ PROGRAM_TYPE - LOGOUT. RSB .ENDC ;NE PROGRAM_TYPE - LOGIN. .PAGE .IF EQ PROGRAM_TYPE - LOGOUT .IF EQ PRINT_RANMSG - TRUE .SUBTITLE PRINT RANDOM MESSAGE PRINT_RANMSG_RTN: MOVL #RANMSG_FAB,R9 ;PREPARE TO OPEN THE RANDOM MSG FILE. MOVL #RANMSG_RAB,R10 JSB OPEN $ASSIGN_S DEVNAM=USR_DEV_NAME,- ;GET CHANNEL TO TERMINAL. CHAN=TER_CHAN CHKERR $GET RAB=RANMSG_RAB ;GET CHECK RECORD. CHKERR MATCHC #RANMSG_CHECK_SIZE,RANMSG_CHECK,RANMSG_RAB + RAB$W_RSZ,- @RANMSG_RAB + RAB$L_RBF ;IS THIS THE RIGHT FILE? BEQL 5$ ;BR IF SO. JMP 100$ ;WRONG FILE. 5$: $GET RAB=RANMSG_RAB ;GET # OF MESSAGES IN FILE. CHKERR MOVZWL RANMSG_RAB + RAB$W_RSZ,RANMSG_DESC ;GET SIZE OF RECORD. MOVL RANMSG_RAB + RAB$L_RBF,RANMSG_DESC + 4 ;POINT TO STRING. PUSHAL NUM_RANMSG ;WHERE TO RECEIVE CONVERTED # OF ;RECORDS. PUSHAL RANMSG_DESC ;THE STRING TO CONVERT. CALLS #2,OTS$CVT_T_D ;CONVERT TEXT TO FLOATING. CHKERR PUSHAL NUM_TIME_BUF + NT_SEC_OFF ;PUSH ADDR OF SEED VALUE. CALLS #1,MTH$RANDOM ;GET RANDOM #. MULF2 NUM_RANMSG,R0 ;0 < R0 < # OF MESSAGES - 1. CVTFL R0,R7 ;CONVERT TO INTEGER. 20$: $GET RAB=RANMSG_RAB ;GET NEXT MESSAGE MESSAGE SEPARATOR ;(MES SEP = BLANK LINE). CMPL #RMS$_EOF,R0 ;END OF FILE? BNEQU 30$ ;BR IF NOT. JMP 100$ ;END OF FILE -- GO HOME. 30$: CHKERR TSTW RANMSG_RAB + RAB$W_RSZ ;MESSAGE SEPARATOR? BNEQU 20$ ;BR IF NOT (WE'RE IN THE MIDDLE OF ;A MESSAGE). SOBGEQ R7,20$ ;BR IF NOT JUST BEFORE REQUESTED ;RECORD. 40$: $GET RAB=RANMSG_RAB ;GET THAT BOOGER! CMPL R0,#RMS$_EOF ;MORE MESSAGE TO OUTPUT? BEQL 100$ ;BR IF NOT. CHKERR TSTW RANMSG_RAB + RAB$W_RSZ ;MORE MESSAGE TO OUTPUT? BEQL 100$ ;BR IF NOT. $OUTPUT CHAN=TER_CHAN,- ;OUTPUT THE MESSAGE. LENGTH=RANMSG_RAB+RAB$W_RSZ,- BUFFER=@RANMSG_RAB+RAB$L_RBF CHKERR BRB 40$ ;GO FOR MORE. 100$: RSB .ENDC ;EQ PRINT_RANMSG - TRUE. .ENDC ;EQ PROGRAM_TYPE - LOGOUT. .PAGE .IF NE SPEC_BUF - SPEC_BUF_EQU ;ONLY ASSEMBLE IF THERE WERE ;SOME SPECIAL PARAMETERS REQUESTED. .SUBTITLE SPECIAL ROUTINE DRIVER ; ;THIS ROUTINE CALLS THE APPROPIATE SPECIAL ROUTINES TO CONVERT THE INPUT TO ;A MORE READABLE FORM & ALSO TO FILL THE RECORD BUFFER TO OUTPUT TO THE TAC ;FILE. THE INPUT DATA TO THE ROUTINES IS ACCESSED IN THIS MANNER: ; ; FOR CONSOLE ROUTINES: ; ; SPEC_OUTPUT(R6) IS THE ADDRESS OF THE CHARACTER STRING ; DESCRIPTOR THAT FAOL WILL USE IN THE MAIN ; ROUTINE TO OUTPUT THIS PARAMETER. ; SPEC_INPUT_LEN(R6) IS THE LENGTH OF THE INPUT DATA THAT THE ; SPECIAL ROUTINE IS TO CONVERT. ; SPEC_INPUT_ADDR(R6) IS THE ADDRESS OF THE INPUT DATA THAT THE ; SPECIAL ROUTINE IS TO CONVERT. ; ; FOR TAC ROUTINES: ; ; SPEC_OUTPUT_LEN(R6) IS THE LENGTH OF THE OUTPUT. ; SPEC_OUTPUT_ADDR(R6) IS THE ADDRESS OF THE OUTPUT. ; SPEC_INPUT_LEN_ADDR(R6) IS THE ADDRESS OF THE LENGTH OF THE ; INPUT. ; SPEC_INPUT_ADDR(R6) IS THE ADDRESS OF THE INPUT. ; SPECIAL: MOVL #SPEC_BUF,R6 ;1ST ROUTINE TO CALL. 10$: JSB @SPEC_RTN(R6) ;CALL ROUTINE TO PROCESS PARAMETER. ACBL #SPEC_BUF_EQU - 1,#SPEC_BUF_INC,R6,10$ ;POINT R6 TO NEXT ;ROUTINE TO CALL. RSB ;BYE BYE. .PAGE .SUBTITLE TIME & DATE CONVERSION ; ;GET THE ASCII LOGIN (@SPEC_INPUT_ADDR <> 0) OR LOGOUT (@SPEC_INPUT_ADDR = 0) ;TIME. (CONSOLE ROUTINE). ; CON_TIME_RTN: $ASCTIM_S TIMBUF=@SPEC_OUTPUT(R6),- ;CONVERT BINARY TIME TIMADR=@SPEC_INPUT_ADDR(R6) ;TO ASCII. CHKERR RSB ;GO HOME. .PAGE .SUBTITLE GROUP CONVERSION. ; ;CONVERT GROUP FROM BINARY TO ASCII (CONSOLE ROUTINE). ; CON_GRP_RTN: $FAO_S CTRSTR=FAO_UIC,- ;CONVERT TO ZERO-FILLED OCTAL. OUTBUF=GRP_DESC,- ;WHERE ANSWER GOES. P1=@SPEC_INPUT_ADDR(R6) ;# TO CONVERT. CHKERR RSB ;BYE BYE. .PAGE .SUBTITLE MEMBER CONVERSION. ; ;CONVERT MEMBER FROM BINARY TO ASCII (CONSOLE ROUTINE). ; CON_MEM_RTN: $FAO_S CTRSTR=FAO_UIC,- ;CONVERT TO ZERO-FILLED OCTAL. OUTBUF=MEM_DESC,- ;WHERE ANSWER GOES. P1=@SPEC_INPUT_ADDR(R6) ;# TO CONVERT. CHKERR RSB ;RETURN. .PAGE .SUBTITLE TRANSLATE LOGICAL NAME ; ;TRANSLATE LOGICAL NAME VIA $TRNLOG (CONSOLE ROUTINE). NOTE: $GETJPI WAS NOT ;USED TO PROVIDE INPUT TO THIS ROUTINE. ; ;TO USE THIS SPECIAL ROUTINE SET UP THE DATA AS THUS: ; ; (1) IN READ ONLY DATA SECTION: ; ; INPUT: ; .ASCII /NAME TO TRANSLATE/ ; INPUT_SIZE= . - INPUT ; ; (2) IN WRITABLE DATA SECTION: ; ; OUTPUT: ; .BLKB OUTPUT_SIZE ; ; (3) THEN CALL BLDTBL: ; ; BLDTBL ,,HEADER,NONE,INPUT_SIZE,INPUT,TRNLOG_RTN,OUTPUT_SIZE,- ; OUTPUT ; CON_TRNLOG_RTN: $TRNLOG_S LOGNAM=SPEC_INPUT_LEN(R6),- ;GET LOGICAL NAME. RSLLEN=@SPEC_OUTPUT(R6),- RSLBUF=@SPEC_OUTPUT(R6) CMPW R0,#SS$_RESULTOVF ;OVERFLOW? BEQL 10$ ;IGNORE IT. CHKERR 10$: MOVL SPEC_OUTPUT(R6),R3 ;R3 POINTS TO LENGTH OF OUTPUT. CMPB #ESCAPE_CHAR,@4(R3) ;GOT AN ESCAPE CHARACTER ON THE ;FRONT? BNEQU 20$ ;NO. ADDL2 #ESC_SEQ_LEN,4(R3) ;NOW THE OUTPUT CHARACTER STRING ;DESCRIPTOR POINTS PAST THE ESCAPE ;SEQUENCE TO THE ACTUAL STRING. SUBL2 #ESC_SEQ_LEN,(R3) ;SHRINK LENGTH OF OUTPUT STRING. 20$: RSB ;GO HOME. .PAGE .SUBTITLE MOVE CHARACTER STRING TO TACREC. ; ;THIS ROUTINE MOVES CHARACTER DATA FROM WHERE EVER INPUT IS TO TACREC (TAC ;ROUTINE). ; TAC_CHAR_RTN: MOVC5 @SPEC_INPUT_LEN_ADDR(R6),@SPEC_INPUT_ADDR(R6),#FILL,- SPEC_OUTPUT_LEN(R6),@SPEC_OUTPUT_ADDR(R6) RSB .PAGE .SUBTITLE MOVE INTEGER TO TACREC. ; ;THIS ROUTINE MOVES INTEGER DATA FROM WHERE EVER INPUT IS TO TACREC (TAC ;ROUTINE). TAC_INT_RTN: MOVW @SPEC_INPUT_ADDR(R6),@SPEC_OUTPUT_ADDR(R6) RSB .PAGE .SUBTITLE CONVERT GROUP OF UIC TO DECIMAL SO ANALYSIS PROGRAM CAN USE IT TAC_GRP_RTN: PUSHL #2 PUSHAL TACREC + GRP_OFF PUSHAL GRP_DESC CALLS #3,OTS$CVT_TI_L CHKERR RSB .PAGE .SUBTITLE CONVERT MEMBER OF UIC TO DECIMAL SO ANALYSIS PROGRAM CAN USE IT TAC_MEM_RTN: PUSHL #2 PUSHAL TACREC + MEM_OFF PUSHAL MEM_DESC CALLS #3,OTS$CVT_TI_L CHKERR RSB .PAGE .SUBTITLE MOVE LOGIN TIME TO TACREC. ; ;THIS ROUTINE FINDS THE LOGIN TIME & MOVES IT TO TACREC (THIS IS A TAC ;ROUTINE). ; TAC_LOGIN_TIME_RTN: $NUMTIM_S TIMBUF=NUM_TIME_BUF,- ;CONVERT TO NUMERIC TIME. TIMADR=@SPEC_INPUT_ADDR(R6) CHKERR MOVL SPEC_OUTPUT_ADDR(R6),R3 MOVW NUM_TIME_BUF + NT_MON_OFF,MON_OFF(R3) MOVW NUM_TIME_BUF + NT_DAY_OFF,DAY_OFF(R3) MOVW NUM_TIME_BUF + NT_YEAR_OFF,YEAR_OFF(R3) SUBW2 #CENTURY,YEAR_OFF(R3) ;JUST THE LAST 2 DIGITS. MOVW NUM_TIME_BUF + NT_HOUR_OFF,HOUR_OFF(R3) MOVW NUM_TIME_BUF + NT_MIN_OFF,MIN_OFF(R3) MOVW NUM_TIME_BUF + NT_SEC_OFF,SEC_OFF(R3) RSB .PAGE .SUBTITLE MOVE LOGOUT TIME TO TACREC. ; ;THIS ROUTINE FINDS THE LOGOUT TIME & MOVES IT TO TACREC (THIS IS A TAC ;ROUTINE). ; TAC_LOGOUT_TIME_RTN: $NUMTIM_S TIMBUF=NUM_TIME_BUF ;CONVERT TO NUMERIC TIME. CHKERR MOVL SPEC_OUTPUT_ADDR(R6),R3 MOVW NUM_TIME_BUF + NT_MON_OFF,MON_OFF(R3) MOVW NUM_TIME_BUF + NT_DAY_OFF,DAY_OFF(R3) MOVW NUM_TIME_BUF + NT_YEAR_OFF,YEAR_OFF(R3) SUBW2 #CENTURY,YEAR_OFF(R3) ;JUST THE LAST 2 DIGITS. MOVW NUM_TIME_BUF + NT_HOUR_OFF,HOUR_OFF(R3) MOVW NUM_TIME_BUF + NT_MIN_OFF,MIN_OFF(R3) MOVW NUM_TIME_BUF + NT_SEC_OFF,SEC_OFF(R3) RSB .PAGE .SUBTITLE MOVE TERMINAL NAME TO TACREC ; ;THIS ROUTINE MOVES THE 1ST & 3RD CHARACTERS OF THE TERMINAL NAME (NOT ;INCLUDING THE UNDERSCORE) & THE UNIT # FROM WHERE EVER INPUT IS TO TACREC (TAC ;ROUTINE). ; TAC_TER_RTN: MOVL SPEC_INPUT_ADDR(R6),R8 ;INPUT ADDR. MOVL SPEC_OUTPUT_ADDR(R6),R4 ;OUTPUT ADDR. .IF NE PROGRAM_TYPE - CLEANUP MOVB #TRUE,OUT_TO_CONSOLE ;ASSUME AT NORMAL TERMINAL. MATCHC #1,(R8),#OUT_TO_CONSOLE_TABLE_SIZE,OUT_TO_CONSOLE_TABLE ;THIS TERMINAL IN LIST? BEQL 10$ ;BR IF SO. MOVB #FALSE,OUT_TO_CONSOLE ;DON'T OUTPUT MESSAGE TO CONSOLE. 10$: .ENDC ;NE PROGRAM_TYPE - CLEANUP. MOVB (R8)+,(R4)+ ;1ST CHAR. MOVB #TRUE,OUT_TO_TACFIL ;ASSUME AT NORMAL TERMINAL. CMPB (R8),#TER_CHAR ;AT A NON-OPERATOR'S TERMINAL AND ;NOT IN BATCH? BEQL 20$ ;YES. MOVB #FALSE,OUT_TO_TACFIL ;NO -- TELL MAIN ROUTINE NOT TO ;OUTPUT DATA TO TAC FILE. RSB 20$: INCL R8 MOVB (R8)+,(R4) ;3RD CHAR. MOVZBW (R8),TACREC + UNIT_OFF ;UNIT # SUBB #ZERO,TACREC + UNIT_OFF ;CONVERT FROM ASCII TO BINARY. RSB .ENDC ;NE SPEC_BUF - SPEC_BUF_EQU. .END IDN