1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-03-02 17:44:40 +00:00
Files
Paul Kimpel 2c72f7fd1d Commit CUBE Library version 13 of February 1972.
1. Commit library tape images, directories, and extracted text files.
2. Commit additional utilities under Unisys-Emode-Tools.
2018-05-27 11:24:23 -07:00

591 lines
47 KiB
Plaintext

BEGIN 00000000
COMMENT CUBE LIBRARY NUMBER IS Z100002. THIS VERSION
DATED 1/30/68;
COMMENT TEACHER/DU, A VERSION OF THE IBM COURSEWRITER 00000100
PROGRAM FOR COMPUTER-AIDED INSTRUCTION. 00000200
VERSION 6 USES SEARCH INSTEAD OF LIBRARIAN TO BE 00000300
COMPATIBLE WITH FILE SECURITY, & USES EFFICIENT BRANCH 00000400
SUGGESTED BY DAVE DAHM. 00000500
VERSION 7 IS RE-ENTRANT AND ALLOWS UMAX USERS, WHERE 00000600
UMAX IS DEFINED IN FIRST STATEMENT OF PROGRAM. 00000700
UMAX SET TO 4 AT U OF DENVER BUT DECLARATIONS FOR 00000800
10 USERS ARE INCLUDED. 00000900
PHILOSOPHY OF RE-ENTRANT VERSION IS TO PROCESS EACH 00001000
USER UNTIL HE COMES TO A WRITE, THEN MARK THE PLACE 00001100
HE WAS AND WORK ON THE NEXT USER. BOOLEAN ACTIVE IS KEPT 00001200
TRUE ALONG WITH EITHER MOREPROCESS OR MORETYPE UNTIL 00001300
ALL USERS ARE WAITING FOR INPUT. 00001400
VERSION 8 INCORPORATES BREAK LABELS ON ALL WRITES. 00001405
THIS PROGRAM INTERPRETIVELY EXECUTES PROGRAMMED INSTRUCTION 00001500
MATERIAL PREPARED USING THE FOLLOWING 10 OPERATIONS: 00001600
RD TYPES & WAITS FOR STUDENT TO PRESS~ 00001700
QU TYPES TEXT & CONTINUES TO NEXT STATEMENT 00001800
TY TYPES TEXT IF PRIOR COND. MET--FOLLOWS CA & 1 OR MORE CB. 00001900
CA CORRECT ANSWER-COMPARED WITH STUDENTS ANSWER. 00002000
CB ADDITIONAL FORMS OF SAME CORRECT ANSWER 00002100
WA WRONG ANSWER-COMPARED WITH STUDENTS ANSWER 00002200
WB ADDL FORMS OF SAME WRONG ANSWER 00002300
UN TEXT TO BE TYPED IF STUDENTS RESPONSE IS UNANTICIPATED 00002400
BR BRANCH TO LABEL 00002500
LA LABEL 00002600
BLANK OP FIELD MEANS CONTINUATION OF PREVIOUS OP--LEGAL ONLY FOR 00002700
QU,RD,TY, AND UN. 00002800
COL 2-3 OP CODE A2 00002900
COL 5-64 TEXT OR LABEL, 10A6 00003000
COL 73-80 SEQUENCE NUMBER 00003100
A[*] CONTAINS CHARACTER STRING AS FOLLOWS: 00003200
0 BLANK, 2-CHR OPCODE, BLANK, FIRST 4 CHR OF TEXT 00003300
1-7 56 CHR OF TEXT, MAKING TOTAL OF 60 CHR 00003400
8 RECORD NO. TO BRANCH TO IF OP IS BR. IF 8 IS BLANKS THEN 00003500
WE LOOK FOR LABEL & WRITE IT BACK FOR NEXT TIME. IF NOT BLANK 00003600
THEN WE READ COURSE[N]. IF LABEL MATCHES WE ARE DONE. IF NOT, 00003700
WE LOOK FOR IT & WRITE IT BACK. 00003800
9 SEQUENCE NUMBER, 8 DIGITS ALPHA 00003900
*******************; 00004000
DEFINE UMAX=04#; 00004100
DEFINE NTERM=04#; %0400004105
ALPHA FILE IN TTIN0 14(2,8), 00004200
TTIN1 14(2,8), 00004300
TTIN2 14(2,8), 00004400
TTIN3 14(2,8), 00004500
TTIN4 14(2,8), 00004600
TTIN5 14(2,8), 00004700
TTIN6 14(2,8), 00004800
TTIN7 14(2,8), 00004900
TTIN8 14(2,8), 00005000
TTIN9 14(2,8), 00005100
TTIN10 14(2,8); 00005200
SWITCH FILE TTIN~TTIN0,TTIN1,TTIN2,TTIN3,TTIN4,TTIN5,TTIN6,TTIN7, 00005300
TTIN8,TTIN9,TTIN10; 00005400
ALPHA FILE OUT TOUT 14(2,10); 00005500
FILE CRS0 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00005600
CRS1 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00005700
CRS2 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00005800
CRS3 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00005900
CRS4 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00006000
CRS5 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00006100
CRS6 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00006200
CRS7 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00006300
CRS8 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00006400
CRS9 DISK RANDOM "NAMEIT" "SAVE" (1,10,30), 00006500
CRS10 DISK RANDOM "NAMEIT" "SAVE" (1,10,30); 00006600
SWITCH FILE COURSE~CRS0,CRS1,CRS2,CRS3,CRS4,CRS5,CRS6,CRS7,CRS8, 00006700
CRS9,CRS10; 00006800
SAVE 00006900
INTEGER ARRAY STA[0:UMAX], %TERM UNIT AND BUFFER NUMBER 00007000
N[0:UMAX], %LINE NUMBER 00007100
NCA[0:UMAX]; %LINE NUMBER OF CORRECT ANSWER 00007200
SAVE 00007300
INTEGER ARRAY PLACE[0:UMAX]; 00007400
SAVE ARRAY USERS[0:NTERM|2]; %0400007405
SAVE 00007500
BOOLEAN ARRAY RDFLAG[0:UMAX], 00007600
MORETYPE[0:UMAX], 00007700
U[0:UMAX,0:19], 00007800
MOREPROCESS[0:UMAX], 00007900
INUSE[0:UMAX]; 00008000
SAVE 00008100
ARRAY DICT[0:6]; 00008200
SAVE ARRAY A[0:9]; 00008300
ARRAY B[0:9]; 00008400
SAVE ARRAY STU[0: 7]; 00008500
ALPHA ID1; 00008600
ALPHA OPCODE; 00008700
INTEGER I,NUN,NC,M,USER; 00008800
BOOLEAN MATCH,ANYUSER; %0100008900
BOOLEAN ARRAY ACT[0:UMAX]; %0100008905
DEFINE ACTIVE=ACT[USER]#; %0100008910
INTEGER CT; %0100008915
ALPHA ARRAY OPS[0:11]; 00009000
LABEL ENDSTA,PROC,LOOKACTIVE,ANYMORE,BRK; 00009100
INTEGER NUSE,TEMP; %0400009105
LABEL PRC,STATS,FOUNDIT; %0400009110
FORMAT TPNAME(X8,"{!PLEASE TYPE COURSE NAME{!~"), 00009200
TCH(X8,"{!YOU ARE USING TEACHER/DU, VERSION 8{!~"); 00009300
FORMAT F4(X8,"{!~"), 00009400
FCA(X8,"HERE IS THE CORRECT ANSWER:{!~"), 00009500
FNQU(X8,"NOW REPEAT THE CORRECT ANSWER.{!~"); 00009600
FORMAT FLEAVING(X8,"{!YOU ARE LEAVING THIS COURSE.{!~"), 00009700
FNEWCOURSE(X8,"WOULD YOU LIKE TO SELECT ANOTHER ", 00009800
"COURSE.{!~"), 00009900
FQUIT(X8,"{!YOU HAVE QUIT BEFORE COMPLETING THE COURSE.{!~"), 00010000
FEXIT(X8, "{!FINISHED. PLEASE LOG OUT.{!~"), 00010100
FYN(X8,"PLEASE ANSWER YES OR NO.{!~"); 00010200
FORMAT FNOLAB(X8,"{!MISSING LABEL ~"), 00010300
FNOCA(X8,"ERROR--NO CA FOLLOWS THIS QU{!~"), 00010400
FNEXTQU(X8,"{!NO UN WAS PROVIDED. NEXT QU:{!~"), 00010500
ER99(X8,"{!NO OPCODE 99 AT END OF COURSE{!~"), 00010600
FBADOP(X8,"{!CA,CB,WB, OR TY INCORRECTLY PLACED{!~"), 00010700
FBADNAME(X8,"{!NO COURSE NAMED ",A1,A6,". CHECK ", 00010800
"NAME & RETYPE.{!~"); 00010900
FORMAT FUSERS(X8,"USERS:",I2,". YOU ARE #",I2,".{!LINES:{!~"), 00011000
FLINES(X8,I3,"{!~"); 00011100
DEFINE CALLBRANCH=BEGIN BRANCH(LABWRD); 00011200
GO TO SW[PLACE[USER]];END#; 00011300
DEFINE LABWRD=A[0]#; 00011600
PROCEDURE UNATTATCH(USER); %0400012005
VALUE USER; %0400012010
INTEGER USER; %0400012015
BEGIN %0400012020
INTEGER I; %0400012025
ANYUSER~INUSE[USER]~FALSE; %0400012030
RELEASE(STA[USER]); %0400012040
STA[USER]~0; %0400012041
NUSE ~ NUSE -2; %0400012042
FOR I~1 STEP 1 UNTIL UMAX DO %0400012045
IF INUSE[I] THEN ANYUSER~TRUE; %0400012050
END UNATTATCH; %0400012055
PROCEDURE BREAK; 00012065
BEGIN 00012070
UNATTATCH(USER); 00012075
GO TO ANYMORE; 00012080
END BREAK; 00012085
STREAM PROCEDURE MOVEOP(F,T); 00012100
BEGIN 00012200
SI~F; SI~SI+1; DI~T; DI~DI+6; DS~2 CHR; 00012300
END; 00012400
PROCEDURE NO99; 00012500
BEGIN LABEL BRK; 00012600
WRITE(TOUT(STA[USER]),ER99)[:BRK]; 00012700
ACTIVE~MOREPROCESS[USER]~TRUE; 00012800
PLACE[USER]~6; GO TO ENDSTA; 00012900
BRK: BREAK; 00012905
END; 00013000
PROCEDURE NEXTLINE; 00013100
BEGIN 00013200
LABEL CALLNO99,RETURN; 00013300
N[USER]~N[USER]+1; 00013400
READ(COURSE[USER][N[USER]],10,A[*])[CALLNO99]; 00013500
MOVEOP(A,OPCODE); 00013600
GO TO RETURN; 00013700
CALLNO99: NO99; 00013800
RETURN: END OF NEXTLINE; 00013900
INTEGER STREAM PROCEDURE FINDGP(A); 00014000
BEGIN 00014100
LABEL FOUND; 00014200
SI~A; 60(IF SC="~" THEN JUMP OUT 1 TO FOUND; SI~SI+1; 00014300
TALLY~TALLY+1); 00014400
FOUND: FINDGP~TALLY; 00014500
END; 00014600
STREAM PROCEDURE MOVE(F,T,N); 00014700
VALUE N; 00014800
BEGIN 00014900
SI~F; DI~T; DI~DI+1; DS~N CHR; 00015000
END; 00015100
STREAM PROCEDURE FILLTHE(DICT); 00015200
BEGIN 00015300
DI~DICT; 00015400
DI~DI+4; DS~4 LIT "STOP"; %[0] 00015500
DI~DI+4; DS~4 LIT "HELP"; %[1] 00015600
DI~DI+4; DS~12 LIT "HOW MANY USE"; %[2-3] 00015700
DS~8 LIT "0SAVE "; %[4] 00015800
DI~DI+4; DS~3 LIT "YES"; DI~DI+1; %[5] 00015900
DI~DI+4; DS~2 LIT "NO"; DI~DI+2; %[6] 00016000
END; 00016100
INTEGER STREAM PROCEDURE NCH(A); 00016200
BEGIN 00016300
LABEL BLANK,AGAIN; 00016400
SI~A; 00016500
SI~SI+4; 00016600
AGAIN: 60(IF SC=" " THEN JUMP OUT 1 TO BLANK;SI~SI+1;TALLY~ 00016700
TALLY+1); 00016800
BLANK: SI~SI+1; TALLY~TALLY+1; IF SC!" " THEN GO TO AGAIN; 00016900
SI~SI+1; TALLY~TALLY+1; IF SC!" " THEN GO TO AGAIN; 00017000
TALLY~TALLY+62; 00017100
NCH~TALLY; 00017200
END; 00017300
BOOLEAN STREAM PROCEDURE EQ(A,S,N); 00017400
VALUE N; 00017500
BEGIN 00017600
TALLY~1; 00017700
SI~A; SI~SI+4; 00017800
DI~S; N(IF SC!DC THEN TALLY~0); 00017900
EQ~TALLY; 00018000
END; 00018100
PROCEDURE TYPE; 00018200
BEGIN 00018300
STREAM PROCEDURE MOVETEXT(F,T,N,M); 00018400
VALUE N,M; 00018500
BEGIN 00018600
SI~F; SI~SI+M; 00018700
DI~T; DS~N CHR; DS~3 LIT "{!~"; 00018800
END; 00018900
STREAM PROCEDURE MOVE40(F,T); 00019000
BEGIN 00019100
SI~F; SI~SI+4; 00019200
DI~T;DS~40 CHR; DS~1 LIT"~"; 00019300
END; 00019400
PROCEDURE WRITETEXT; 00019500
BEGIN LABEL BRK, ENDWRT; 00019600
NC~NCH(A); 00019700
IF NC{53 THEN 00019800
BEGIN 00019900
MOVETEXT(A,STU[1],NC,4); 00020000
WRITE(TOUT(STA[USER]),8,STU[*])[:BRK]; 00020100
END ELSE 00020200
BEGIN 00020300
NC~NC-40; 00020400
MOVE40(A,STU[1]); 00020500
WRITE(TOUT(STA[USER]),8,STU[*])[:BRK]; 00020600
MOVETEXT(A,STU[1],NC,44); 00020700
WRITE(TOUT(STA[USER]),8,STU[*])[:BRK]; 00020800
END; 00020900
GO TO ENDWRT; 00020990
BRK: BREAK; 00020995
ENDWRT: END WRITETEXT; 00021000
WRITETEXT; 00021100
NEXTLINE; 00021200
ACTIVE~TRUE; 00021300
IF OPCODE=" " THEN 00021400
MORETYPE[USER]~TRUE ELSE 00021500
BEGIN 00021600
MORETYPE[USER]~FALSE; 00021700
MOREPROCESS[USER]~TRUE; 00021800
END; 00021900
END OF TYPE; 00022000
BOOLEAN PROCEDURE WHOISIT(L,U); %0400022100
VALUE L; %0400022200
REAL L,U; %0400022300
BEGIN 00022400
INTEGER I,J,K,LINE; 00022500
LABEL DUN; 00022600
WHOISIT~TRUE; %0400022605
LINE~0&L[9:9:9]; 00022700
FOR I~1 STEP 1 UNTIL UMAX DO 00022800
IF LINE=STA[I] THEN 00022900
BEGIN 00023000
J~I; 00023100
GO TO DUN; 00023200
END; 00023300
WHOISIT~FALSE; %0400023400
DUN: U~J; %0400024100
END OF WHOISIT; 00024200
PROCEDURE TESTMATCH; 00024300
BEGIN 00024400
NC~NCH(A); 00024500
IF NC=FINDGP(STU[1]) AND 00024600
EQ(A,STU[1],NC) THEN MATCH~TRUE ELSE MATCH~FALSE; 00024700
END; 00024800
PROCEDURE BRANCH(A1); 00024900
ALPHA A1; 00025000
BEGIN 00025100
LABEL GOTIT,NEXT,FINDLAB,RETURN,BRK; 00025200
INTEGER LOCLA,LOCBR; 00025300
STREAM PROCEDURE MOVE8(F,T); 00025400
BEGIN 00025500
SI~F; DI~T; SI~SI+4; DS~8 CHR; DS~3 LIT "{!~"; 00025600
END; 00025700
STREAM PROCEDURE MOVELINE(F,T); 00025800
BEGIN 00025900
SI~F; DI~T; DS~10 WDS; 00026000
END; 00026100
MONITOR FLAG; 00026200
FLAG~FINDLAB; 00026300
MOVE8(A1,STU[1]); 00026400
LOCLA~A[8]; 00026500
COMMENT IF A[8] WAS BLANKS WE WILL GET A FLAG BIT ERROR 00026600
& BRANCH TO FINDLAB; 00026700
READ(COURSE[USER][LOCLA],10,A[*]); 00026800
MOVEOP(A,OPCODE); 00026900
IF OPCODE="LA" THEN IF EQ(LABWRD,STU[1],8) THEN 00027000
BEGIN 00027100
N[USER]~LOCLA; 00027200
PLACE[USER]~9; 00027300
GO TO RETURN; 00027400
END; 00027500
COMMENT IF WE GET HERE THERE WAS A RECNO BUT IT WAS 00027600
WRONG, PROBABLY DUE TO A CHANGE SINCE LAST USE OF 00027700
THIS COURSE; 00027800
READ(COURSE[USER][N[USER]],10,A[*]); 00027900
FINDLAB: 00028000
LOCBR~N[USER]; 00028100
MOVELINE(A,B); 00028200
COMMENT SAVES REC & RECNO TO WRITE BACK AFTER LABEL 00028300
ADDRESS HAS BEEN FILLED IN; 00028400
N[USER]~-1; 00028500
NEXT: NEXTLINE; 00028600
IF OPCODE="99" THEN 00028700
BEGIN 00028800
WRITE(TOUT(STA[USER]),FNOLAB)[:BRK]; 00028900
WRITE(TOUT(STA[USER]),8,STU[*])[:BRK]; 00029000
PLACE[USER]~6; 00029100
GO TO RETURN; 00029200
END; 00029300
IF OPCODE="LA" THEN 00029400
IF EQ(LABWRD,STU[1],8) THEN GO TO GOTIT; 00029500
GO TO NEXT; 00029600
GOTIT: 00029700
B[8]~N[USER]; 00029800
WRITE(COURSE[USER][LOCBR],10,B[*]); 00029900
PLACE[USER]~9; 00030000
GO TO RETURN; 00030100
BRK: BREAK; 00030105
RETURN: END OF BRANCH; 00030200
PROCEDURE PROCESS; 00030300
BEGIN 00030400
LABEL NEXTCB,TESTTYC,NEXTQU,TESTWA,NEXTWB,TESTTYW,EXIT,UN1, 00030500
TMC,TMW,MISS99,UNA,LSEARCH,NEXTREAD; 00030600
LABEL RD,QU,TY,CA,CB,WA,WB,UN,BR,LA,L99,PEX; 00030700
LABEL BRK; 00030705
SWITCH OP~RD,QU,TY,CA,CB,WA,WB,UN,BR,LA,L99; 00030800
LABEL P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15, 00030900
P16,P17; 00031000
SWITCH SW~P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15, 00031100
P16,P17; 00031200
ACTIVE~MOREPROCESS[USER]~FALSE; 00031300
IF PLACE[USER]>9 THEN 00031400
BEGIN 00031500
READ(COURSE[USER][N[USER]],10,A[*])[MISS99]; 00031600
MOVEOP(A,OPCODE); 00031700
END; 00031800
GO TO SW[PLACE[USER]]; 00031900
P1: 00032000
WRITE(TOUT(STA[USER]),TCH)[:BRK]; 00032100
ACTIVE~MOREPROCESS[USER]~TRUE; 00032200
PLACE[USER]~2; GO TO EXIT; 00032300
P2: 00032400
WRITE(TOUT(STA[USER]),TPNAME)[:BRK]; 00032500
PLACE[USER]~3; GO TO EXIT; 00032600
P3: 00032700
IF EQ(DICT[0],STU[1],4) THEN GO TO PEX; %0500032705
ID1~" "; 00032800
I~FINDGP(STU[1]); 00032900
IF I>7 THEN I~7; 00033000
MOVE(STU[1],ID1,I); 00033100
FILL COURSE[USER] WITH ID1,*; 00033200
SEARCH(COURSE[USER],A[*]); 00033300
IF A[0]<2 THEN 00033400
BEGIN 00033500
WRITE(TOUT(STA[USER]),FBADNAME,ID1.[6:6],ID1)[:BRK]; 00033600
PLACE[USER]~3; GO TO EXIT; 00033700
END; 00033800
N[USER]~-1; 00033900
NEXTLINE; 00034000
MATCH~FALSE; 00034100
RDFLAG[USER]~FALSE; 00034200
P9: 00034300
LSEARCH: 00034400
FOR I~1 STEP 1 UNTIL 11 DO IF OPCODE=OPS[I] THEN 00034500
GO TO OP[I]; 00034600
QU: FOR I~0 STEP 1 UNTIL 19 DO U[USER,I]~FALSE; 00034700
TYPE; 00034800
PLACE[USER]~10;GO TO EXIT; 00034900
P10: 00035000
IF OPCODE!"CA" THEN 00035100
BEGIN 00035200
WRITE(TOUT(STA[USER]),FNOCA)[:BRK]; 00035300
ACTIVE~MOREPROCESS[USER]~TRUE; 00035400
PLACE[USER]~13;GO TO EXIT; 00035500
END; 00035600
NCA[USER]~N[USER]; COMMENT SAVES LOC OF CA FOR LOOPING; 00035700
PLACE[USER]~11;GO TO EXIT; 00035800
P11: 00035900
NEXTREAD: 00036000
IF EQ(DICT[0],STU[1],4) THEN 00036100
BEGIN 00036200
WRITE(TOUT(STA[USER]),FQUIT)[:BRK]; 00036300
ACTIVE~MOREPROCESS[USER]~TRUE; 00036400
PLACE[USER]~6; GO TO EXIT; 00036500
END; 00036600
IF EQ(DICT[2],STU[1],12) THEN %0200036605
BEGIN %0200036610
M~0; %0200036615
FOR I~1 STEP 1 UNTIL UMAX DO IF INUSE[I] THEN M~M+1; %0200036620
WRITE(TOUT(STA[USER]),FUSERS,M,USER)[:BRK]; %0200036625
FOR I~1 STEP 1 UNTIL UMAX DO %0200036630
IF INUSE[I] THEN WRITE(TOUT(STA[USER]),FLINES,I)[:BRK];00 36635
N[USER]~NCA[USER]; %0200036640
PLACE[USER]~11; GO TO EXIT; %0200036645
END; %0200036650
IF RDFLAG[USER] THEN 00036700
BEGIN 00036800
RDFLAG[USER]~FALSE; 00036900
GO TO LSEARCH; 00037000
END; 00037100
IF EQ(DICT[1],STU[1],4) THEN 00037200
BEGIN 00037300
WRITE(TOUT(STA[USER]),FCA)[:BRK]; 00037400
ACTIVE~MOREPROCESS[USER]~TRUE; 00037500
PLACE[USER]~4; GO TO EXIT; 00037600
P4: 00037700
N[USER]~NCA[USER]; 00037800
READ(COURSE[USER][N[USER]],10,A[*])[MISS99]; 00037900
TYPE; 00038000
PLACE[USER]~5; GO TO EXIT; 00038100
P5: 00038200
WRITE(TOUT(STA[USER]),FNQU)[:BRK]; 0003830
N[USER]~NCA[USER]; 00038400
PLACE[USER]~11;GO TO EXIT; 00038500
END; 00038600
TESTMATCH; 00039700
IF MATCH THEN GO TO TESTTYC; 00039800
NEXTCB: 00039900
NEXTLINE; 00040000
IF OPCODE="CB" OR OPCODE="CA" THEN 00040100
BEGIN 00040200
TMC: TESTMATCH; 00040300
IF MATCH THEN GO TO TESTTYC; 00040400
NEXTLINE; 00040500
IF OPCODE="CA" OR OPCODE="CB" THEN GO TO TMC; 00040600
END; 00040700
IF OPCODE="TY" OR OPCODE="BR" OR OPCODE=" " 00040800
THEN GO TO NEXTCB; 00040900
GO TO TESTWA; 00041000
TESTTYC: 00041100
NEXTLINE; 00041200
IF OPCODE="CB" THEN GO TO TESTTYC; 00041300
IF OPCODE="BR" THEN CALLBRANCH; 00041400
IF OPCODE="TY" THEN BEGIN TYPE; 00041500
PLACE[USER]~12;GO TO EXIT; END; 00041600
P12: 00041700
IF OPCODE="BR" THEN CALLBRANCH; 00041800
P13: 00041900
NEXTQU: 00042000
IF OPCODE="RD" THEN GO TO RD; 00042100
IF OPCODE="QU" THEN GO TO QU; 00042200
IF OPCODE="99" THEN GO TO L99; 00042300
NEXTLINE; 00042400
GO TO NEXTQU; 00042500
TESTWA: IF OPCODE="WA" THEN GO TO WA; 00042600
IF OPCODE="UN" THEN GO TO UN; 00042700
NEXTLINE; 00042800
GO TO TESTWA; 00042900
WA: TESTMATCH; 00043000
IF MATCH THEN GO TO TESTTYW; 00043100
NEXTWB: 00043200
NEXTLINE; 00043300
IF OPCODE="WB" OR OPCODE="WA" THEN 00043400
BEGIN 00043500
TMW: TESTMATCH; 00043600
IF MATCH THEN GO TO TESTTYW; 00043700
NEXTLINE; 00043800
IF OPCODE="WB" OR OPCODE="WA" THEN GO TO TMW; 00043900
END; 00044000
IF OPCODE="TY" OR OPCODE=" " OR OPCODE="BR" 00044100
THEN GO TO NEXTWB; 00044200
IF OPCODE="UN" THEN GO TO UN; 00044300
WRITE(TOUT(STA[USER]),FNEXTQU)[:BRK]; 00044400
ACTIVE~MOREPROCESS[USER]~TRUE; 00044500
PLACE[USER]~13;GO TO EXIT; 00044600
TESTTYW: 00044700
NEXTLINE; 00044800
IF OPCODE="WB" THEN GO TO TESTTYW; 00044900
IF OPCODE="BR" THEN CALLBRANCH; 00045000
IF OPCODE="TY" THEN BEGIN TYPE; 00045100
PLACE[USER]~14;GO TO EXIT; END; 00045200
P14: 00045300
IF OPCODE="BR" THEN CALLBRANCH; 00045400
N[USER]~NCA[USER]; 00045500
COMMENT RESETS FOR NEXT TRY ON SAME QUESTION; 00045600
PLACE[USER]~11;GO TO EXIT; 00045700
UN: M~0; 00045800
UNA: NUN~N[USER]; 00045900
IF NOT U[USER,M] THEN 00046000
BEGIN 00046100
U[USER,M]~TRUE; 00046200
TYPE; 00046300
PLACE[USER]~15;GO TO EXIT; 00046400
P15: 00046500
IF OPCODE="BR" THEN CALLBRANCH; 00046600
N[USER]~NCA[USER]; 00046700
PLACE[USER]~11;GO TO EXIT; 00046800
END; 00046900
UN1: M~M+1; 00047000
NEXTLINE; 00047100
IF OPCODE="UN" THEN GO TO UNA; 00047200
IF OPCODE=" " THEN GO TO UN1; 00047300
COMMENT IF WE GET HERE WE HAVE PASSED LAST UN & WILL REPEAT IT. 00047400
STUDENT CAN STILL GET OUT BY TYPING "HELP"; 00047500
N[USER]~NUN; 00047600
READ(COURSE[USER][N[USER]],10,A[*])[MISS99]; 00047700
TYPE; 00047800
PLACE[USER]~16;GO TO EXIT; 00047900
P16: 00048000
N[USER]~NCA[USER]; 00048100
PLACE[USER]~11;GO TO EXIT; 00048200
RD: RDFLAG[USER]~TRUE; 00048300
TYPE; 00048400
PLACE[USER]~17;GO TO EXIT; 00048500
P17: 00048600
NCA[USER]~N[USER]; %0200048605
PLACE[USER]~11;GO TO EXIT; 00048700
TY:CA:CB:WB: WRITE(TOUT(STA[USER]),FBADOP)[:BRK]; 00048800
ACTIVE~MOREPROCESS[USER]~TRUE; 00048900
PLACE[USER]~13;GO TO EXIT; 00049000
BR: CALLBRANCH; 00049100
LA: NEXTLINE; 00049200
GO TO LSEARCH; 00049300
MISS99: NO99; 00049400
P6: 00049500
L99: 00049600
COMMENT WANTNEW; 00049700
CLOSE(COURSE[USER],RELEASE); 00049800
WRITE(TOUT(STA[USER]),FLEAVING)[:BRK]; 000499
ACTIVE~MOREPROCESS[USER]~TRUE; 00050000
PLACE[USER]~7; GO TO EXIT; 00050100
P7: 00050200
WRITE(TOUT(STA[USER]),FNEWCOURSE)[:BRK]; 00050300
ACTIVE~MOREPROCESS[USER]~FALSE; 00050400
PLACE[USER]~8; GO TO EXIT; 00050500
BRK: BREAK; 00050500
P8: 00050600
IF EQ(DICT[5],STU[1],3) THEN GO TO P2; 00050700
IF EQ(DICT[6],STU[1],2) THEN 00050800
BEGIN 00050900
PEX: 00050905
WRITE(TOUT(STA[USER]),FEXIT)[:BRK]; 00 5 0
UNATTATCH(USER); %0400051100
GO TO EXIT; 00051600
END; 00051700
WRITE(TOUT(STA[USER]),FYN)[:BRK]; 00051800
PLACE[USER]~8; 00051900
EXIT: END OF PROCESS; 00052000
FILL OPS[*] WITH 0,"RD","QU","TY","CA","CB","WA","WB", 00052100
"UN","BR","LA","99"; 00052200
FILLTHE(DICT); 00052300
ANYUSER~TRUE; 00052400
GO TO ANYMORE; 00052500
BRK: UNATTATCH(USER); 00052505
ANYMORE: WHILE ANYUSER DO 00052600
BEGIN 00052700
LOOKACTIVE: FOR USER~ 1 STEP 1 UNTIL UMAX DO 00053000
IF INUSE[USER] AND ACT[USER] THEN 00053100
BEGIN IF STATUS(STA[USER],1).[28:3]=0 THEN 00053200
BEGIN 00053300
IF MOREPROCESS[USER] THEN GO TO PROC; 00053400
IF MORETYPE[USER] THEN 00053500
BEGIN 00053600
READ(COURSE[USER][N[USER]],10,A[*]); 00053700
TYPE; 00053800
GO TO ENDSTA; 00053900
END; 00054000
READ(TTIN[USER](STA[USER],0),8,STU[*])[ENDSTA:ENDSTA]; 00054100
WRITE(TOUT(STA[USER]),F4)[:BRK]; 00054200
PROC: PROCESS; 00054300
ENDSTA: END; 00054400
END; 00054500
STATS: TEMP~STATUS(USERS[*]); 00054600
IF NUSE < TEMP THEN 00054700
BEGIN 00054800
FOR I~0 STEP 2 UNTIL TEMP-1 DO IF USERS[I+1]!-1 THEN 00054900
BEGIN 00055000
FOR USER~1 STEP 1 UNTIL UMAX DO 00055100
IF USERS[I].[9:9]=STA[USER].[9:9] THEN GO TO FOUNDIT; 00055200
FOR USER~1 STEP 1 UNTIL UMAX DO 00055300
IF STA[USER]=0 THEN 00055400
BEGIN 00055500
INUSE[USER]~TRUE; 00055600
STA[USER]~0&USERS[I][9:9:9]; 00055605
PLACE[USER]~1; 00055610
NUSE~NUSE+2; 00055615
GO TO PRC; 00055620
END; 00055625
FOUNDIT:END; 00055630
END; 00055635
READ(TTIN[0](0,0.5),8,STU[*])[LOOKACTIVE]; 00055640
IF NOT WHOISIT(STU[0],USER) THEN GO TO STATS; 00055645
WRITE(TOUT(STA[USER]),F4)[:BRK]; 00055650
PRC: PROCESS; 00055700
END OF WHILE ANYUSER LOOP; 00055800
END. 00055900