1 ! ! L O G I N 2! PROGRAM : LOGIN 5! VERSION : 6B 6! EDIT : 03 7! EDIT DATE : 22-OCT-76 11 ! ! C O P Y R I G H T ! Copyright (C) 1974, 1975, 1976 ! Digital Equipment Corporation, Maynard, Massachusetts ! ! ! This software is furnished under a license for use only on a ! single computer system and may be copied only with the ! inclusion of the above copyright notice. This software, or ! any other copies thereof, may not be provided or otherwise ! made available to any other person except for use on such ! system and to one who agrees to these license terms. Title to ! and ownership of the software shall at all times remain in ! DIGITAL. ! ! The information in this software is subject to change without ! notice and should not be construed as a commitment by Digital ! Equipment Corporation. ! ! DIGITAL assumes no responsibility for the use or reliability ! of its software on equipment that is not supplied by DIGITAL. ! !******************************************************************** 100 DIM M%(30),W%(30) \ DIM #12%, U% (63%), U0% (63%, 6%), U$ (63%) = 9% ! LEA1.DAT DECLARATION -- ! USER NUMBER, OTHER USER INFO, USER IDENTIFICATION ! ENTRY POINT IF "HELLO" OR "LOGIN" 200 ON ERROR GOTO 32400 \ L5% = 4% \ I$=SYS(CHR$(0%))+SYS(CHR$(2%)) \ OPEN "KB:LOGIN.CMD" FOR INPUT AS FILE 1% \ A$=CVT$$(SYS(CHR$(7%)),1%+4%+8%+16%+32%+128%+256%) \ A$=CVT$$(RIGHT(A$,FNC%(A$,"HELLO",5%)),8%) \ A$=CVT$$(RIGHT(A$,FNC%(A$,"LOGIN",3%)),8%) \ A%=PEEK(PEEK(PEEK(520%)+8%)+24%) \ L5% = L5% OR 3% IF (SWAP%(A%) AND 255%) = 1% \ GOSUB 16000 IF A% 210 IF A% THEN GOSUB 28500 \ GOSUB 13000 \ IF I% THEN 5000 ELSE GOSUB 20000 \ IF I% THEN 21000 ELSE I$=FNL$('logged out') \ I$=SYS(CHR$(6%)+CHR$(5%)) \ GOTO 200 ! START HERE IF "HELLO" OR "LOGIN" AND NOT LOGGED IN 500 T%=0% \ IF LEN(A$) THEN GOSUB 13000 \ IF I% THEN 900 ELSE 2000 510 GOSUB 10000 \ GOTO 1000 900 T%=T%+1% \ IF T%<5% THEN PRINT FNC$;"Invalid entry - try again" ELSE PRINT FNC$;"Access denied" \ GOTO 32650 1000 GOSUB 11000 \ GOSUB 13000 \ IF I% THEN 900 2000 GOSUB 12000 \ GOSUB 15000 \ IF I% THEN 900 ELSE GOSUB 17100 \ GOTO 5010 ! START HERE IF "HELLO" OR "LOGIN" WITHOUT PPN ! AND LOGGED IN 5000 GOSUB 10000 \ N%=0% \ GOSUB 17000 5010 IF M%(4%) THEN GOSUB 27000 \ GOSUB 18000 \ GOTO 7000 5100 IF N0%=0% AND M%(3%)>1% THEN PRINT FNC$;NUM1$(M%(3%)-1%);" other user"; FNS$(M%(3%)-1%);" ";FNA$(M%(3%)-1%); " logged in under this account" 5200 GOSUB 14000 \ L5% = L5% OR 3% IF (SWAP%(A%) AND 255%) = 1% \ GOSUB 28000 \ I$ = FNL$ ('logged in ') \ GO TO 5250 IF I% 5210 I$=SYS(CHR$(0%))+SYS(CHR$(2%)) \ CLOSE 1%,2% \ PRINT \ PRINT CHR$(10%); FOR I%=1% TO 3% \ GOTO 32650 UNLESS N1% 5220 I$=SYS(CHR$(6%)+CHR$(-21%)) \ CHAIN P0$ ! DO A CHAIN, IF REQUESTED 5250 CHAIN P0$ 32000% ! CHAIN TO LEADS PROGRAM 5290 PRINT FNC$;CVT$$(RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)),3%),5%); " - ";P0$ \ N1%=0% \ RESUME 5210 ! TRAP IN CASE OF ILLEGAL FILENAME ! START HERE IF "ATTACH" 6000 N%=1% \ GOSUB 22000 \ GOSUB 27000 \ IF LEN(A$) THEN GOSUB 18800 ELSE GOSUB 10000 \ GOSUB 17000 IF A% \ GOSUB 18000 7000 IF I% THEN IF A%=0% THEN 32650 ELSE IF N%=1% THEN 5210 ELSE 5100 7020 A0%=PEEK(PEEK(J0%+8%)+24%) \ IF A%=A0% THEN CHANGE SYS(CHR$(6%)+CHR$(14%)) TO M% \ M%(I%)=M%(I%+2%) FOR I%=5% TO 10% \ GOTO 7100 7030 GOSUB 12000 \ CHANGE SYS(CHR$(6%)+CHR$(-10%)+P$) TO M% \ IF M%(28%) AND 154% THEN 7900 ELSE M%(5%)=A0% \ M%(6%)=SWAP%(A0%) 7100 GOSUB 19000 \ GOTO 7000 7900 PRINT FNC$;"Illegal password"; \ IF A% THEN 7030 ELSE PRINT " - access denied" \ GOTO 32650 ! TITLE PRINTER 10000 PRINT CHR$(-1%); \ I$=SYS(CHR$(6%)+CHR$(9%)+CHR$(0%)) \ CHANGE I$ TO M% \ PRINT FNC$;CVT$$(RIGHT(I$,3%),5%); \ PRINT " Job";M%(1%)/2%; \ IF A% THEN PRINT " [";NUM1$(SWAP%(A%) AND 255%);","; NUM1$(A% AND 255%);"] "; 10010 PRINT " KB";NUM1$(M%(2%)/2%);" ";DATE$(0%);" "; TIME$(0%) \ RETURN 10900 ON ERROR GOTO 0 \ STOP ! ACCOUNT GETTER 11000 I$=SYS(CHR$(2%)) \ PRINT FNC$;"#"; \ WAIT 30% UNLESS A% \ INPUT LINE #1%,A$ \ I$=SYS(CHR$(3%)) UNLESS N0% \ WAIT 0% \ RETURN 11900 WAIT 0% \ A$="'" \ RESUME 19999 ! PASSWORD GETTER 12000 RETURN IF N0% \ I$=SYS(CHR$(3%)) \ PRINT FNC$;"Password:"; \ GOSUB 12100 IF PEEK(PEEK(PEEK(PEEK(520%)))+8%) AND 196% \ WAIT 30% UNLESS A% \ INPUT LINE #1%,P$ \ I$=SYS(CHR$(2%)) \ WAIT 0% 12010 PRINT FNC$; \ RETURN 12100 I$=STRING$(6%,8%) \ IF PEEK(PEEK(PEEK(PEEK(520%)))+8%) AND 68% THEN I$=CHR$(13%)+CHR$(0%)+SPACE$(9%) 12110 PRINT "XXXXXX";I$; \ PRINT "OOOOOO";I$; \ PRINT "%%%%%%";I$; \ RETURN 12900 I$=SYS(CHR$(2%)) \ WAIT 0% \ P$="%" \ RESUME 19999 ! ACCOUNT VERIFY 13000 N%=-1% \ GOSUB 22000 \ I%=INSTR(1%,A$,"/") \ IF I% THEN N%=0% \ A$=LEFT(A$,I%-1%)+","+RIGHT(A$,I%+1%) 13010 I%=-1% \ CHANGE SYS(CHR$(6%)+CHR$(-10%)+"["+A$+"]") TO M% \ I%=0% IF M%(5%)<=254% AND M%(6%)<=254% AND M%(6%)<>0% AND (M%(28%) AND 154%)=0% 13020 N0%,N1%=0% IF I% \ RETURN 13900 RESUME 13020 ! NOTICE PRINTER 14000 OPEN "HELP:NOTICE.TXT" FOR INPUT AS FILE 2% \ PRINT FNC$; 14010 INPUT LINE #2%,I$ \ PRINT I$; \ GOTO 14010 14900 CLOSE 2% \ RESUME 19999 ! LOGIN 15000 I%=-1% \ CHANGE SYS(CHR$(6%)+CHR$(-10%)+"["+A$+"]"+P$) TO M% \ RETURN IF (M%(28%) AND 154%)<>0% \ M%(1%)=6% \ M%(2%)=4% \ CHANGE M% TO I$ \ CHANGE SYS(I$) TO M% \ A%=PEEK(PEEK(PEEK(520%)+8%)+24%) \ I%=0% 15010 J%=28% \ J%=28% IF (A% AND -256%)=256% \ I$=SYS(CHR$(6%)+CHR$(-13%)+CHR$(-1%)+ CHR$(-1%)+CHR$(-16%)+ CHR$(-1%)+CHR$( 6% )+ CHR$(-1%)+CHR$( J% )) \ RETURN 15900 RESUME 19999 ! DELETE ALL ????NN.TMP FILES 16000 CHANGE SYS(CHR$(6%)+CHR$(-10%)+"????"+ RIGHT(NUM1$(100%+(255% AND PEEK(518%))/2%),2%)+ ".TMP") TO W% \ W%(0%)=30% \ W%(1%)=6% \ W%(2%)=17% \ W%(3%),W%(4%)=0% \ CHANGE W% TO I$ 16010 CHANGE SYS(I$) TO W% \ KILL RAD$(W%(7%)+SWAP%(W%(8%)))+ RAD$(W%(9%)+SWAP%(W%(10%)))+ "."+RAD$(W%(11%)+SWAP%(W%(12%))) \ GOTO 16010 16900 RESUME 19999 ! GET AND/OR PRINT DETACHED JOB(S) 17000 CHANGE SYS(CHR$(6%)+CHR$(4%)) TO M% 17100 RETURN IF N0% \ IF M%(4%)=0% THEN RETURN ELSE PRINT FNC$;"Job";FNS$(1%+(M%(5%)<>0%));" "; \ PRINT RIGHT(NUM$(M%(I%)),2%); FOR I%=4% WHILE M%(I%)<>0% \ PRINT FNA$(1%+(M%(5%)<>0%)); " detached under this account" \ RETURN 17900 ON ERROR GOTO 0 \ STOP ! GET JOB NUMBER TO ATTACH TO 18000 J%=0% \ I%=-1% \ IF N0%=0% THEN WAIT 30% UNLESS A% \ PRINT FNC$;"Job number to attach to"; \ INPUT J% \ WAIT 0% 18010 I%=-3% \ I%=-2% UNLESS J% \ I%=0% IF J%>0% AND J%<=J9% 18020 IF I%=0% THEN J0%=PEEK(M%+(J%*2%)) \ IF J0%=0% THEN I%=-4% ELSE IF J%*2%=(PEEK(PEEK(PEEK(J0%))+2%) AND 255%) AND (PEEK(PEEK(PEEK(J0%))+6%) AND 8192%)<>0% THEN I%=-5% 18030 IF I%=0% THEN RETURN ELSE ON -I% GOTO 18100,18200,18300,18400,18500 18100 PRINT FNC$;"Illegal job number"; \ GOTO 18600 18200 RETURN 18300 PRINT FNC$;"Job number out of range"; \ GOTO 18600 18400 PRINT FNC$;"No job by that number"; \ GOTO 18600 18500 PRINT FNC$;"Job not detached"; 18600 IF A% THEN PRINT " - try again" \ GOTO 18000 18610 PRINT " - access denied" \ RETURN 18800 I%=-1% \ J%=VAL(A$) \ GOTO 18010 18900 WAIT 0% \ RESUME 18030 ! ATTACH TO A JOB 19000 I%=-1% \ GOSUB 16000 IF A% 19010 M%(1%),M%(2%)=6% \ M%(3%)=J% \ M%(4%)=-1% \ CHANGE M% TO I$ \ PRINT FNC$;"Attaching to job";J% UNLESS N0% \ CLOSE 1%,2% \ I$=SYS(I$) \ STOP 19900 OPEN "KB:LOGIN.CMD" FOR INPUT AS FILE 1% \ PRINT FNC$;"Failure to attach to job";J% \ CHANGE SYS(CHR$(6%)+CHR$(4%)) TO M% IF A% \ RESUME 19999 ! GENERAL RETURN 19999 RETURN 20000 CHANGE SYS(CHR$(6%)+CHR$(14%)) TO M% \ Q=M%(27%)+SWAP%(M%(28%)) \ Q=Q+65536. IF Q<0. \ T=M%(5%)+SWAP%(M%(6%)) \ T=T+65536. IF T<0. \ CHANGE SYS(CHR$(6%)+CHR$(4%)+" "+A$) TO M% 20010 I%=NOT((M%(3%)<>1% OR Q=0. OR Q>=T)) \ RETURN ! CHECK QUOTA FOR CHANGE OF ACCOUNT 21000 PRINT FNC$;"Quota exceeded - please logout" \ GOTO 5210 ! DON'T LET THEM CHANGE ACCOUNT 22000 N0%=INSTR(1%,A$,";") \ RETURN UNLESS N0% \ P$=RIGHT(A$,N0%+1%) \ A$=LEFT(A$,N0%-1%) \ N1%=INSTR(1%,P$,"'") \ RETURN UNLESS N1% ! CHECK FOR PASSWORD IN ORIGINAL STRING 22010 P0$=RIGHT(P$,N1%+1%) \ P$=LEFT(P$,N1%-1%) \ RETURN ! GET PROGRAM TO CHAIN TO IF SPECIFIED 23000 DEF FNS$(Q%) \ FNS$="" \ FNS$="s" IF Q%<>1% \ FNEND ! FNS$ IS FOR PLURALS 24000 DEF FNA$(Q%) \ FNA$="is" \ FNA$="are" IF Q%<>1% \ FNEND ! FNA$ IS FOR PLURAL VERBS 25000 DEF FNC$ \ FNC$="" \ FNC$=CHR$(13%)+CHR$(10%) IF POS(0%) \ FNEND ! FNC$ RESTORES CARRIAGE IF NEEDED 26000 DEF FNC%(Q$,Q0$,Q%) \ FOR Q0%=LEN(Q0$) TO Q% STEP -1% \ GOTO 26010 IF LEFT(Q$,Q0%)=LEFT(Q0$,Q0%) \ NEXT Q0% \ Q0%=-1% 26010 FNC%=Q0%+1% \ FNEND ! FNC% DETERMINES UNIQUENESS OF A COMMAND 27000 CHANGE SYS(CHR$(6%)+CHR$(-3%)) TO W% \ J9%=W%(4%) \ M%=W%(11%)+SWAP%(W%(12%)) \ RETURN ! GET JOBMAX (J9%) AND JOBTBL (M%) 28000 OPEN 'DATAB.LTX$/RO' FOR INPUT AS FILE 2% : I% = 0% : A0% = SWAP% (A%) AND 255% : RETURN IF A0% = 1% : L5% = L5% OR 256% : INPUT LINE #2%, P$ : P$ = CVT$$ (P$, -1%) 28005 INPUT LINE #2%, I$ : I0% = INSTR (1%, I$, ',') : GO TO 28005 UNLESS VAL (LEFT (I$, I0%-1%)) = A0% : P0$ = CVT$$ (RIGHT (I$, I0%+1%), -1%) : CLOSE 2% : PRINT FNC$;'* LEADS Data Base System V06C-29', DATE$ (0%), TIME$ (0%) : I% = -1% 28010 OPEN 'LEA1.DAT#' FOR INPUT AS FILE 12%, MODE 1% : GO TO 28910 UNLESS U% (0%) >= 0% : D$ = U$ (0%) : CLOSE 12% 28015 OPEN D$ + 'PSSST.SDB#' FOR INPUT AS FILE 2%, MODE 1% : GET #2%, RECORD 1% : FIELD #2%, 2% AS B0$, 2% AS R0$ : B0% = CVT$% (B0$) : R0% = 32% * CVT$% (R0$) : T% = 0% 28020 B% = 1% : R%, P% = 0% : T% = T% + 1% : GO TO 28950 IF T% > 3% : P$ = FNP$ ('* LEADS Password: ', 7%, -5%) 28030 R% = R% + 32% : P% = P% + 1% : GO TO 28020 IF R% > R0% AND B% = B0% : GO TO 28040 IF R% < 512% : B% = B% + 1% : R% = 0% : GET #2%, RECORD B% 28040 FIELD #2%, R%+4% AS G$, 7% AS G$ : GO TO 28030 UNLESS G$ = P$ : P$ = FNP$ ('* LEADS Identification: ', 9%, 0%) UNLESS P%=1% : I$ = SYS (CHR$ (6%) + CHR$ (9%) + CHR$ (0%)) : U% = ASCII (I$) / 2% : OPEN 'LEA1.DAT#' FOR INPUT AS FILE 12%, MODE 5% : GO TO 28940 IF U0%(0%,0%)<>0% AND P%=1% : U0%(0%,0%) = U% IF P%=1% : U% (0%) = U% (0%) + 1% : U% (U%) = P% : U0% (U%, 0%) = A% AND 255% : U0% (U%, 1%) = ASCII (MID (I$, 2%, 1%)) / 2% : U$ (U%) = P$ : CLOSE 2%, 12% : L5% = (L5% AND NOT 256%) OR 1% : RETURN 28100 P0$ = P$ : GO TO 28920 IF A% AND 255% : RETURN 28110 GO TO 28930 IF A% AND 255% : I% = 0% : PRINT FNC$;'* LEADS Password file missing.' : RETURN 28500 L5% = L5% OR 256% UNLESS (SWAP%(A%) AND 255%) = 1% : OPEN 'LEA1.DAT#' FOR INPUT AS FILE 12%, MODE 5% : U% = (PEEK(518%) AND 255%) / 2% : L5% = (L5% AND NOT 256%) OR 1%: U0% (0%, 0%) = 0% IF U0% (0%, 0%) = U% : U% (0%) = U% (0%) - 1% UNLESS U% (0%) = 0% : U% (U%), U0% (U%, 0%), U0% (U%, 1%) = 0% : U$ (U%) = FNK1$ (SPACE$(9%), 0%) : CLOSE 12% : RETURN 28600 DEF FNP$ (P8$, L%, P%) 28610 PRINT FNC$;P8$; : WAIT 30% : I8$ = SYS (CHR$ (3%)) : INPUT #1%, P$ : I8$ = SYS (CHR$ (2%)) : WAIT 0% : P$ = LEFT (CVT$$ (P$, -1%) + SPACE$ (L%), L%) : GO TO 28610 IF P$ = SPACE$ (L%) : FNP$ = FNK1$ (P$, P%) : FNEND 28650 DEF FNK1$ (C$, C%) : C% = -1% IF C% = 0% : C$ = LEFT (C$, I8%) + CHR$ (ASCII (MID (C$, I8%+1%, 1%)) XOR (I8%-C%)^2%) + RIGHT (C$, I8%+2%) FOR I8% = 0% TO LEN (C$)-1% : FNK1$ = C$ : FNEND 28660 DEF FNL$ (M$) : FNL$ = SYS (CHR$ (6%) + CHR$ (22%) + CHR$ (-1%) + CHR$ (0%) + 'SYSLOG' + STRING$ (10%, 0%) + CVT%$ (L5%) + M$ + ' from KB' + NUM1$ (ASCII(MID(SYS(CHR$(6%)+CHR$(9%)),2%,1%))/2%) + ': (LOGIN)') 28661 FNEND 28910 PRINT FNC$;'* LEADS Data Base locked out' : GO TO 28999 IF (A% AND 255%) OR (U% (0%) = -1%) : I% = 0% : RETURN 28920 I$=FNL$("* Error " + NUM1$(ERR) + SPACE$(1%+ERR>9%)) : PRINT FNC$;'* LEADS Data Base does not exist ('+NUM1$(ERR)+') -- ' : GO TO 28999 28930 PRINT FNC$;'* LEADS Password file missing -- ' : GO TO 28999 28940 PRINT FNC$;'* Manager already logged in.' : T% = 0% : GO TO 28020 28950 I$=SYS(CHR$(6%)+CHR$(5%)) : PRINT FNC$;'* Access denied.' : GO TO 32650 ! TOO MANY INCORRECT LEADS PASSWORDS. ! LOG OUT OF THIS ACCOUNT, AND THEN DIE. 28990 PRINT FNC$;'* System data base is incorrect. DATAB.LTX' : GO TO 28950 28999 PRINT '* Consult your Data Base Manager.' : I$ = SYS (CHR$ (6%) + CHR$ (5%)) : GO TO 32650 ! ENTRY POINT IF "ATTACH" 30000 ON ERROR GOTO 32400 \ I$=SYS(CHR$(0%))+SYS(CHR$(2%)) \ OPEN "KB:LOGIN.CMD" FOR INPUT AS FILE 1% \ A$=CVT$$(SYS(CHR$(7%)),1%+4%+8%+16%+32%+128%+256%) \ A$=CVT$$(RIGHT(A$,FNC%(A$,"ATTACH",3%)),8%) \ A%=PEEK(PEEK(PEEK(520%)+8%)+24%) \ GOTO 6000 ! ENTRY POINT IF LINE TYPED AND NOT LOGGED IN 32000 ON ERROR GOTO 32400 \ I$=SYS(CHR$(0%))+SYS(CHR$(2%)) \ OPEN "KB:LOGIN.CMD" FOR INPUT AS FILE 1% 32010 WAIT 1% \ INPUT LINE #1%,A$ \ WAIT 0% \ A$=CVT$$(A$,1%+4%+8%+16%+32%+128%+256%) \ A%=0% \ IF LEN(A$) THEN RESTORE ELSE 32010 32020 READ I$,P$,I%,J% \ GOTO 32600 UNLESS J% \ I%=FNC%(A$,I$,I%) \ GOTO 32020 UNLESS I% \ A$=RIGHT(A$,I%) \ ON J% GOTO 500,6000,32300,32100 ! DO CHAINING 32100 I$=SYS(CHR$(8%)+A$) \ CHAIN P$ 32000% \ STOP 32200 DATA HELLO, "", 5, 1 32210 DATA LOGIN, "", 3, 1 32220 DATA I, "", 1, 1 32230 DATA ATTACH, "", 3, 2 32240 DATA HELP, "", 4, 3 32250 DATA SET, $TTYSET,3, 4 32260 DATA SYSTAT, $SYSTAT,2, 4 32270 DATA QUEUE, $QUE, 2, 4 32299 DATA "", "", 0, 0 ! HELPER 32300 OPEN "$HELP.TXT" FOR INPUT AS FILE 2% \ PRINT FNC$; 32310 INPUT LINE #2%,I$ \ PRINT I$; \ GOTO 32310 32320 CLOSE 2% \ GOTO 32650 ! ERROR(S) 32400 IF ERR=27% THEN Q$=CHR$(9%) \ RESUME 32700 32410 E%=(ERL/1000%)-9% \ IF E%>0% AND E%<=10% THEN ON E% GOTO 10900,11900,12900,13900,14900,15900,16900,17900, 18900,19900 32430 IF ERL=5220% THEN RESUME 5290 32440 IF ERL=7030% THEN RESUME 7900 32490 IF ERL=32010% AND ERR=15% THEN Q$=CHR$(5%) \ RESUME 32670 32500 IF ERL=32100% THEN RESUME 32600 32510 IF ERL=32310% AND ERR=11% THEN RESUME 32320 32520 IF ERL=32300% OR ERL=32310% THEN RESUME 32600 32530 IF ERL=32600% OR ERL=32670% THEN RESUME 32700 32535 IF ERR = 19% THEN SLEEP 5% : RESUME ! CATCH DISK BLOCK INTERLOCK ERRORS 32540 IF ERR = 5% AND ERL = 28000% THEN RESUME 28990 ELSE IF ERR = 11% AND ERL = 28000% THEN RESUME 28990 ELSE IF ERR = 11% AND ERL = 28005% THEN RESUME 19999 ELSE IF ERL = 28010% THEN RESUME 28100 ELSE IF ERL = 28015% THEN RESUME 28110 32550 IF ERR = 5% AND ERL = 28500% THEN RESUME 19999 ELSE IF ERR = 19% THEN SLEEP 5% : RESUME 32560 IF ERL = 28660% THEN RESUME 28661 32570 IF ERL = 28610% THEN I8$ = SYS (CHR$ (2%)) + SYS (CHR$ (0%)) : RESUME 28661 32599 IF A% THEN RESUME 5210 ELSE RESUME 32600 ! EXITS 32600 Q$=CHR$(9%) \ PRINT FNC$;"Please say HELLO" 32650 Q$=CHR$(9%) 32670 I$=SYS(CHR$(0%))+SYS(CHR$(2%)) 32700 CLOSE 1%,2% \ I$=SYS(Q$) \ STOP 32767 ON ERROR GOTO 0 : END