1 ! E X E C F o r m a l S h u t D o w n P r o g r a m 2 ! PROGRAM : DOWN.BAS 3 ! PACKAGE : SYSTEMS UTILITIES 4 V$ = "V01-01" 5 ! DATE : 01-Mar-82 6 ! AUTHOR : Steven R. Gerber 7 ! 8 ! Copyright (C) 1982 By Steven R. Gerber 9 ! 10 EXTEND ! This is an Extend Mode Program 20 Y$=SYS(CHR$(6%)+CHR$(-7%)) ! Enable CTRL/C Trapping & \ ON ERROR GOTO 19000 95 ! & ! P R O G R A M D E S C R I P T I O N & ! 295 ! & ! I / O C H A N N E L S & ! & ! #1% Buffer used to Receive Messages & ! #2% The .HLD Virtual Array & ! 395 ! & ! V A R I A B L E D E F I N I T I O N S & ! 595 ! & ! F U N C T I O N S & ! 795 ! & ! F U N C T I O N / S U B R O U T I N E D E F I N I T I O N S & ! 895 ! & ! D I M E N S I O N I N G A R E A & ! 900 DIM SYS.3%(30%) ! Monitor Tables Part 1 995 ! & ! S T A R T O F P R O G R A M & ! & ! Am I Attached or Detached ? & ! 1000 ME%=(PEEK(518%) AND 255%)/2% ! My Job number & \ CHANGE SYS(CHR$(6%)+CHR$(-3%)) TO SYS.3% & \ SYS.3%(I%)=SYS.3%(I%)+SWAP%(SYS.3%(I%+1%)) FOR I%=5% TO 29% STEP 2% & \ JOBTBL%=SYS.3%(11%) & \ KB.DDB%=PEEK(PEEK(PEEK(JOBTBL%+(ME%*2%)))) & \ IF (PEEK(KB.DDB%+2%) AND 255%)/2%=ME% & AND (PEEK(KB.DDB%+6%) AND 8192%)=8192% & THEN 1110 ! Attached 1005 ! & ! Set Constants & ! 1010 BUF.OFFSET%=0% & \ CHAN%=1% & \ LOCAL%=0% & \ NETWORK%=0% & \ SLP%=0% & \ TIMER%=0% & \ TRUNCATE%=0% & \ ACCESS%=SLP%+TRUNCATE%+LOCAL%+NETWORK% 1015 ! & ! Get KB.UNIT% (Keyboard from which I was Spawned) and & ! P1% (Virtual Array Pointer) & ! 1020 COMMON.CORE$=SYS(CHR$(7%)) & \ PTR%=ASCII(COMMON.CORE$) & \ KB.UNIT%=VAL(MID(COMMON.CORE$,2%,PTR%)) & \ P2%=ASCII(MID(COMMON.CORE$,PTR%+2%,1%)) & \ P1%=VAL(MID(COMMON.CORE$,PTR%+3%,P2%)) 1025 ! & ! Open a Buffer for Messages & ! 1030 OPEN "NL:" AS FILE 1%,RECORDSIZE 32% & \ FIELD #1%,32% AS PASS$ 1035 ! & ! Open the Message Holding file & ! 1040 OPEN "[210,2]EXEC.HLD" AS FILE 2% & \ DIM #2%,HOLD$(64%) 1045 ! & ! Receive a Message & ! 1050 Y$=SYS(CHR$(6%)+CHR$(22%)+CHR$(2%)+CHR$(ACCESS%)+ & STRING$(6%,0%)+CHR$(CHAN%)+CHR$(0%)+ & CHR$(MAX.LEN%)+CHR$(SWAP%(MAX.LEN%))+ & CHR$(BUF.OFFSET%)+CHR$(SWAP%(BUF.OFFSET%))+ & STRING$(10%,0%)+CHR$(TIMER%)+CHR$(SWAP%(TIMER%))+CHR$(0%)) & \ PARAM$=RIGHT(Y$,21%) ! Contains PPN$ & \ PARAM%=VAL(LEFT(PARAM$,1%)) & \ PPN$=MID(PARAM$,2%,PARAM%) & \ COMMA%=INSTR(1%,PPN$,",") & \ PJT.PROJECT%=VAL(LEFT(PPN$,COMMA%-1%)) & \ PGR.PROGRAMMER%=VAL(RIGHT(PPN$,COMMA%+1%)) & \ CHANGE Y$ TO Y% & \ MES.LEN%=Y%(13%)+SWAP%(Y%(14%)) 1055 ! & ! Add PPN information and the actual Message to EXEC.HLD & ! 1060 HOLD$(P1%)=CHR$(PJT.PROJECT%)+CHR$(PGR.PROGRAMMER%)+LEFT(PASS$,MES.LEN%) & \ P1%=P1%+1% & \ GOTO 1050 1065 ! & ! Remove myself from the Receiver Table & ! 1070 Y$=SYS(CHR$(6%)+CHR$(22%)) 1075 ! & ! Close all I/O Channels & ! 1080 CLOSE 1%,2% 1085 ! & ! Give Notification & ! 1090 Y$=SYS(CHR$(6%)+CHR$(-5%)+CHR$(0%)+"%EXEC Shutting Down ...") & \ IF KB.UNIT%<>0% THEN Y$=SYS(CHR$(6%)+CHR$(-5%)+CHR$(0%)+"%EXEC Shutting Down ...") 1095 ! & ! Kill Myself & ! 1100 Y$=SYS(CHR$(6%)+CHR$(8%)+CHR$(ME%)+STRING$(24%,0%)+CHR$(255%)) & \ GOTO 32767 1105 ! & ! Get KB.UNIT% (Keyboard to which I am Attached) & ! 1110 KB.DDB%=PEEK(PEEK(PEEK(520%))) & \ KB.UNIT%=SWAP%(PEEK(KB.DDB%+2%)) AND 127% 1115 ! & ! Send a Message to EXEC & ! 1120 LSET PASS$="EXEC\%%SHUT"+CHR$(LEN(NUM1$(KB.UNIT%)))+NUM1$(KB.UNIT%) & \ NAM$="EXEC " & \ MES.LEN%=16% & \ Y$=SYS(CHR$(6%)+CHR$(22%)+CHR$(-1%)+CHR$(0%)+NAM$+ & CHR$(CHAN%)+CHR$(0%)+ & CHR$(MES.LEN%)+CHR$(SWAP%(MES.LEN%))+ & CHR$(BUF.OFFSET%)+CHR$(SWAP%(BUF.OFFSET%))) & \ GOTO 1070 9995 ! & ! S U B R O U T I N E S & ! 18995 ! & ! S T A N D A R D E R R O R H A N D L I N G & ! 19000 IF ERL=1000 THEN Y$=SYS(CHR$(9%)) & \ RESUME 32767 19010 IF ERL=1020 THEN RESUME 1080 19020 IF ERL=1050 THEN RESUME 1070 19040 PRINT ERR,ERL & \ RESUME 32767 19995 ! & ! L I B R A R Y R O U T I N E S & ! 29995 ! & ! C C L E N T R Y & ! 32700 ! & ! E X I T F R O M P R O G R A M C O D E & ! 32767 END