The following is the original UNIVAC® 1100 series assembly language
for ANIMAL, the host program which used PERVADE
to propagate itself among the UNIVAC
installed base. The program is, itself, unremarkable. Note that the
assembly-time variable which controlled whether or not it pervaded was
named “VIRUS
”.
In 1975 each computer vendor had their own terminology for concepts such as files, programs, etc. which have since become (reasonably) standardised. The following brief lexicon gives contemporary translations of Univac mainframe speak of the 1960's and 70's you'll encounter reading the code.
Univacky | Modern Term |
---|---|
element | file |
ER | system call |
PCT | open file table |
processor | application |
run | job or session |
And of course, back the days when we were just making the transition
from card punches to timesharing terminals, real programmers wrote
in ALL CAPITALS
. UNIVAC old-timers who have forgotten some
of the instruction mnemonics may want to refer to the
instruction set summary. This was
developed on an 1110, but would run on the 1106 and 1108 as well.
I could not find a copy of this in machine-readable form, so I had to
type it in from a 20 year old listing. I've tried to proofread it
carefully, but there may be some typos still lurking herein.
. . T H E A N I M A L G U E S S I N G P R O G R A M . . JOHN WALKER APRIL 1974 . . (OR, BRUTE FORCE ARTIFICIAL INTELLIGENCE) . . THIS PROGRAM GIVES THE APPEARANCE OF POSSESSING INTELLIGENCE . BY BEING ABLE TO GUESS ANIMALS THOUGHT OF BY THE USER. IT . ASKS QUESTIONS AND FINALLY TELLS THE USER WHICH ANIMAL HE . HAD IN MIND. IF IT IS INCORRECT, IT ASKS THE USER WHICH . ANIMAL HE HAD IN MIND AND ASKS HIM TO SUPPLY A QUESTION . WHICH DISTINGUISHES THE ANIMAL THE PROGRAM THOUGH WAS . CORRECT FROM THE USER'S ANIMAL. THIS INFORMATION IS THEN . SAVED IN THE ANIMAL MEMORY FILE: HENCE THE PROGRAM LEARNS . THROUGH EXPERIENCE. . . THE PROGRAM USES RANDOM SELECTION OF VARIOUS REPLIES AND . SUBSTITUTION OF NOUNS FOR PRONOUNS IN SENTENCES TO AVOID . THE REPETITIOUS PATTER OUTPUT BY MOST INTERACTIVE QUERY . PROGRAMS. THE PROGRAM IS CAPABLE OF DETECTING IF IS . BEING LED ASTRAY IN THE DESCRIPTION OF AN ANIMAL, AND IF . SO, ASKS THE USER TO MAKE SURE HIS DESCRIPTION JIBES WITH . THE DESCRIPTION THE PROGRAM ALREADY HAS. WHAT THE USER . TELLS THE PROGRAM THREE TIMES IS TRUE, AND THE PROGRAM . WILL UNLEARN AN INCORRECT DESCRIPTION OF AN ANIMAL. . . THE ANIMAL GUESSING PROGRAM IS SELF-INSTALLING AND SELF- . MAINTAINING. IT CREATES AND UPDATES A MEMORY FILE AS IT . IS USED. THE NAME OF THIS MEMORY FILE MAY BE CHANGED . BY THE GENERATOR OF THIS PROGRAM BY MODIFYING THE FILE . NAMES FOUND ON THE 'MEMFILE' AND 'BACKUPFN' FOLLOWING . THIS TEXT AND REASSEMBLING THE PROGRAM. . . IF GENERATED WITH THE TAG 'MAINTENANCE' (SEE BELOW) SET . NONZERO, IT IS POSSIBLE TO SIGN ON TO ANIMAL WITH THE . 'M' OPTION AND THE KEYS TO THE ANIMAL MEMORY FILE SPEC- . IFIED ON THE CALL STATEMENT: . . @ANIMAL,M RKEY/WKEY . . AND ENTER 'ANIMAL FILE MAINTENANCE MODE'. IN THIS MODE, . THE USER MAY TYPE IN COMMANDS AND 'EDIT' THE ANIMAL TREE. . THE OPERATIONS AVAILABLE ARE: . . AB ABORT MAINTENANCE, DON'T UPDATE FILE . CA CHANGE NAME OF ANIMAL . CQ CHANGE QUESTION TEXT . DA DELETE ANIMAL FROM MEMORY . DQ DELETE QUESTION FROM MEMORY . GA ADD GENERIC NAME TO PROHIBITED LIST . GD DELETE GENERIC NAME FROM PROHIBITED LIST . LT LIST MEMORY TREE . PL PLAY A ROUND OF THE GAME . . WHEN USING ANY OF THE COMMAND WHICH OPERATE ON A SPECIFIC . NODE, SUCH AS CA, DA, OR CQ, THE USER WILL BE PUT INTO GAME . MODE SO THAT HE CAN LEAD THE PROGRAM TO THE ANIMAL OR QUESTION . TO BE DELETED OR CHANGED. WHEN THE DESIRED QUESTION OR ANIMAL . IS OUTPUT BY THE PROGRAM, THE USER SHOULD TYPE: . . THAT'S IT . . TO THE PROGRAM RATHER THAN THE NORMAL YES OR NO ANSWER. THAT . WILL SELECT THE NODE FOR PROCESSING. WHEN IN MAINTENANCE MODE, . ALL QUESTIONS AND ANIMALS PRINTED WILL BE PRECEDED BY THEIR . RELATIVE MEMORY ADDRESS, WHICH CAN BE USED TO FIND THEM IN . THE TREE LISTING PRODUCED BY THE 'LT' COMMAND. . . END END MAINTENANCE, UPDATE FILE . MAINTENANCE EQU 1 ENABLE MAINTENANCE MODE . . . THE TAG 'LEVEL' DEFINED THE LEVEL OF THE ANIMAL PROCESSOR. . THIS NUMBER IS DISPLAYED WHEN THE USER SIGNS ON IN MAINTENANCE . MODE, AND IS KEPT IN THE FILE FOR PURPOSES OF COMPATIBILITY . BETWEEN LEVELS (IN OTHER WORDS, THE AUTOMATIC CONVERSION . OF OLD ANIMAL FILES TO THE NEW FORMAT WHEN A NEW ANIMAL . PROCESSOR LEVEL IS IMPLEMENTED). THIS TAG SHOULD NOT BE . CHANGED IN THE FIELD. . LEVEL EQU '2.0' LEVEL OF ANIMAL PROCESSOR . . . THE TAG 'LOCLVL' DEFINES A LOCAL LEVEL OF THE ANIMAL PROCESSOR. . IF ANIMAL IS REGENERATED BY A SITE, ANT THE SITE WANTS TO . IDENTIFY THEIR LOCAL LEVEL, THEY SHOULD USE THIS TAG, NOT . THE TAG 'LEVEL' ABOVE. THIS VALUE WILL BE KEPT IN THE ANIMAL . MEMORY FILE IMMEDIATELY AFTER THE VALUE FOR 'LEVEL' AND WILL . BE CONCATENATED WITH 'LEVEL' IN THE THE MAINTENANCE MODE SIGN-ON . LINE. THIS VALUE WILL ALWAYS BE ZERO IN SYMBOLICS SHIPPED . BY ANIMAL DEVELOPMENT CENTRE (ADC). . LOCLVL EQU 0 NO LOCAL CODE IN ADC SOFTWARE ! . . THE TAG 'VIRUS' CONTROLS WHETHER THE ANIMAL PROCESSOR WILL SPREAD . LIKE ONE THROUGHOUT THE 1100 SERIES USER COMMUNITY. . VIRUS EQU 1 GO WILD ! . LIT$ 2 . . THE FOLLOWING LINE DEFINES THE NAME OF THE CATALOGUED ANIMAL . MEMORY FILE. THIS MAY ME CHANGES AT THE WHIM OF THE GENERATOR . OF THE ANIMAL PROCESSOR. THE FORMAT FOR THE FILE NAME MUST . BE: 'QUAL*FILENAME&/RKEY/WKEY/&' . MEMFILE 'BOBO*SIMPLEMINDED&/DUDLEY/DORITE&' . . THE FOLLOWING LINE DEFINES THE NAME OF THE BACKUP FILE FOR THE . ANIMAL MEMORY. THE BACKUP FILE IS USED TO ATTEMPT RECOVERY . IF THE ANIMAL MEMORY FILE IS DESTROYED. IF THE TAG . BACKUPFN IS EQUATED TO ZERO, THE BACKUP MECHANISM WILL BE . TURNED OFF AND THE CODE REMOVED FROM THE ANIMAL PROCESSOR. . BACKUPFN '853429*EIGENVALUE&/VECTOR/CALCUL&' BE INCONSPICUOUS . . . AXR$ DEFUNCT$ ELT$ . EOL EQU 077 LINE TERMINATOR CHARACTER . CHAR '%',EOL DEFINE STOP CHARACTER . . STRUCTURE OF NODE IN TREE . NODELNK EQUF 0 YES AND NO LINK WORD NODEYL EQUF NODELNK,,H1 YES LINK NODENL EQUF NODELNK,,H2 NO LINK NODELEN EQUF 1,,S1 LENGTH OF NODE TEXT NODEREFC EQUF 1,,H2 NODE REFERENCE COUNT (FOR REBALANCE) NODEBL EQUF 2,,H1 BACK LINK TO FATHER NODE NODEBITS EQUF 2,,H2 CONTROL BITS FOR THIS NODE NODEBKL EQUF 3,,H1 BACK LINK TO PREVIOUS NODE NODEFL EQUF 3,,H2 FORWARD LINK TO NEXT NODE NODEUID EQUF 4 USERID OF NODE ADDER NODEAC EQUF 5 ACCOUNT NUMBER OF NODE ADDER NODETEXT EQUF 7 START OF TEXT IN NODE . . MEANING OF BITS IN 'NODEBITS' . NBDEL EQU 1 NODE IS DELETED NBGENERIC EQU 2 NODE IS A PROHIBITED GENERIC NAME . . FUNCTION FOR REFERENCING MEMORY WITH RELATIVE ADDRESSES . F FUNC . M* NAME 0 END MEMORY+F(1) $(1). . BEGIN SR R2,R15 SAVE TDATE$ AT PROCESSOR CALL ON VIRUS LMJ X11,PERVADE PERVADE THROUGHOUT THE FILE SYSTEM OFF VIRUS LA A0,(INFL,INFOR) LOAD INFOR BUFFER ADDRESS LMJ X11,RINF$ READ INFOR TABLE PRINT$ . PRINT ERROR MESSAGE IF ANY . . ACQUIRE THE MEMORY FILE . ON MAINTENANCE LA A1,INFOR LOAD OPTIONS FROM CALL STATEMENT LA,U A0,1 LOAD INFOR FIELD NUMBER TEP,U A1,OPTION('M') IS THE 'M' OPTION ON ? LMJ X11,SELT$ LOOK FOR FIELD 1 IN INFOR J NOMAINT SKIP IF NO FIELD SPECIFIED TZ ENL ELEMENT NAME PRESENT ? TNZ EVL ELEMENT VERSION PRESENT ? J NOMAINT NO. IGNORE THE 'M' OPTION LA,U A0,1 LOAD A ONE SA A0,MAINT SET MAINTENANCE MODE FOR PROCESSOR NOMAINT OFF MAINTENANCE ASGMA F$MSG1 ASGMEM EDIT THE MEMORY FILE ASSIGN IMAGE F$MSG MEMFILE EDIT THE MEMORY FILE NAME ON MAINTENANCE TNZ MAINT IN MAINTENANCE MODE ? J ASGUSR NO. USER STANDARD KEYS ON FILE F$CHAR '/' EDIT A SLASH BEFORE THE READ KEY F$FD1 ENAME EDIT ELEMENT NAME AS READ KEY F$CHAR '/' EDIT A SLASH BETWEEN KEYS F$FD1 EVER EDIT ELEMENT VERSION AS WRITE KEY J ASGMF GO ASSIGN THE MEMORY FILE ASGUSR OFF MAINTENANCE F$MSGR . COPY THE READ AND WRITE KEYS ASGMF CSF$ FL$ TRY TO ASSIGN THE FILE JP A0,MEMOK SKIP IF ASSIGNED CORRECTLY TEP A0,(BIT(21)) DOES ANIMAL NEED TO BE INSTALLED ? J INSTALL YES. INSTALL ANIMAL AT THIS SITE TOP A0,(BIT(18)) FACILITY WAIT STATUS ? J LATER NO. TELL USER TO TRY LATER TWAIT$ 10000 WAIT FOR TEN SECONDS CSF$ FL$ TRY ONE MORE TIME JP A0,MEMOK SKIP IF OK THIS TIME LATER PRINT$ LATEM,LATEL J ENDALL TERMINATE . . ENTER THIS CODE FOR UNEXPECTED EOF . UPDATES WILL NOT BE APPLIED TO THE FILE . EOFANS CSF$ FREEMEM FREE THE MEMORY FILE ON MAINTENANCE TNZ MAINT IN TREE MAINTENANCE MODE ? J EOFANM NO. EDIT NORMAL MESSAGE PRINT$ ENDMM,ENDML PRINT TREE MAINTENANCE END MESSAGE J ENDALL TERMINATE MAINTENANCE MODE EOFANM OFF MAINTENANCE PRINT$ EOFAM,EOFAL PRINT ALTERNATE SIGN OFF MESSAGE ENDALL . ON VIRUS LMJ X11,PVTERM TERMINATE PERVASION IF IN PROGRESS OFF VIRUS EXIT$ . THAT'S ALL . . PRINT THE SIGN-ON MESSAGE (THIS OVERLAPS WITH READ OF MEMORY FILE) . MEMOK . ON MAINTENANCE TZ MAINT MAINTENANCE MODE ? J MASKSO YES. SKIP NORMAL SIGN-ON OFF MAINTENANCE PRINT$ SIGNON,SIGNL PRINT THE SIGN-ON-LINE . . READ THE MEMORY FILE AND BUILD THE IN-CORE TREE . MASKSO F$DT . CLEAR THE LINE F$MSG1 USEMEM EDIT THE @USE IMAGE F$MSG1 MEMFILE INSERT THE MEMORY FILE NAME CSF$ FL$ ATTACH THE @USE NAME TO THE MEMORY FILE IOW$ IOP READ SECTOR ZERO OF MEMORY FILE F$DT . CLEAR THE EDITING IMAGE TZ,S1 IOP+3 NORMAL COMPLETION ? J LATER I/O ERROR READING MEMORY LA A0,MEMORY LOAD FILE SENTINEL TE A0,('ANIMAL') IS IT A VALID ANIMAL FORMAT FILE ? J LATER NO. REINITIALISE LA A1,MEMLEN LOAD MEMORY LENGTH IN WORDS LA,U A0,MEMORY+200,A1 COMPUTE HIGHEST ADDRESS NEEDED SA A0,HIGHCORE SET LARGEST ALLOCATED ADDRESS MCORE$ . EXPAND PROGRAM TO ACCOMMODATE FILE SA,H1 A1,IOP+4 SET READ LENGTH FOR ACTUAL READ IOW$ IOP READ THE MEMORY FILE INTO CORE TZ,S1 IOP+3 NORMAL STATUS ? J LATER NO. REINITIALISE THE FILE LA A0,MEMLEN LOAD HIGHEST ADDRESS ASSIGNED IN MEMORY AA,U A0,MEMORY ADD BASE ADDRESS OF MEMORY SA A0,HIGHUSE SAVE HIGHEST ADDRESS IN USE PCT$,0 USERID GET THE RUNID (USERID) PCT$,023 ACCOUNT,2 SAVE THE ACCOUNT NUMBER ON MAINTENANCE TZ MAINT IN MAINTENANCE MODE ? J MAINTMAIN YES. ENTER MAINTENANCE COMMAND SCANNER OFF MAINTENANCE /. . . NOW THE FUN BEGINS: ASK QUESTIONS OF THE USER . PRINT$ SIGNON1,SIGNL1 TELL THE USER WHAT'S COMING UP RESTART LX X8,BASENODE LOAD RELATIVE BASE NODE ADDRESS . . EXECUTE THE NODE POINTED TO BY X8 . DONODE LX,U X9,MEMORY,X8 COMPUTE ABSOLUTE ADDRESS OF CURRENT NODE TNZ NODELINK,X9 IS THIS A QUESTION NODE ? J ITHINK NO. THIS IS A LEAF NODE. TELL . THE USER WHAT WE THINK IT IS. . . THE NODE CONTAINS A QUESTION. POSE IT TO THE USER . ASKIT . ON MAINTENANCE TZ MAINT IN MAINTENANCE MODE ? LMJ X11,RELADR YES. EDIT ADDRESS OF NODE OFF MAINTENANCE LA,U A0,NODETEXT,X9 LOAD ADDRESS OF TEXT LA A1,NODELEN,X9 LOAD LENGTH OF QUESTION F$COPY . COPY QUESTION LMJ X4,DECIDE HAVE THE USER DECIDE J ASKAY USER SAID 'YES' LX X8,NODENL,X9 LOAD NO LINK BECAUSE USER SAID 'NO' J DONODE GO PROCESS NEXT NODE . ASKAY LX X8,NODEYL,X9 LOAD THE 'YES' LINK J DONODE PROCESS THE NODE /. . . THIS NODE HAS NO LINKS. TELL THE USER WHAT WE THINK IT IS . ITHINK F$MSG ISIT EDIT 'IS IT' ON MAINTENANCE TZ MAINT IN MAINTENANCE MODE ? LMJ X4,RELADR YES. EDIT ADDRESS OF NODE OFF MAINTENANCE LA A1,NODELEN,X9 LOAD LENGTH OF NODE ENTRY LA,U A0,NODETEXT,X9 LOAD TEXT START ADDRESS F$COPY . COPY TEXT TO THE BUFFER LMJ X4,DECIDE ASK THE USER YES OR NO J AGAING ASK USER IF HE'S TIRED YET . . WE GUESSED AND THE USER CLAIMS THAT OUR ANIMAL WAS WRONG. . ASK HIM WHAT ANIMAL HE HAD IN MIND. . LX,U X6,WHATANI LOAD QUESTION CONTROL PACKET ADDRESS LMJ X5,QUESTION ASK HIM WHAT ANIMAL IT WAS . . NOW SAVE HIS ANIMAL AND ASK FOR A QUESTION TO . DISTINGUISH HIS ANIMAL FROM THE ONE WE GUESSED. . . . SEE IF AN ARTICLE WAS SUPPLIED BY THE USER. IF NOT, . GENERATE ONE. . ITHANS LMJ X5,SCANANI SCAN THE ANIMAL SUPPLIED BY THE USER . . AT THIS POINT WE HAVE ACCEPTED THE USER'S ANIMAL AND REDUCED IT . TO CANONICAL FORM. WE SCAN THE LINEAR LIST OF NODES AND SEE IF . THE ANIMAL THE USER TYPED IN DUPLICATES ANY ANIMAL WE ALREADY . HAVE IN THE TREE. IF SO, WE ENTER SPECIAL PROCESSING FOR . DUPLICATE ANIMALS BELOW. . LX,H2 X5,NODECHAIN LOAD HEAD OF LINEAR NODE CHAIN . ALRSCN TZ NODEYL+MEMORY,X5 IS THIS A LEAF NODE ? J ALRQUN NO. IGNORE IT TE A15,NODELEN+MEMORY,X5 ARE LENGTHS THE SAME ? J ALRQUN NO. THEY CANNOT BE EQUAL LR R1,UANLW LOAD USER'S ANIMAL LENGTH IN WORDS LA A0,(1,0) LOAD POINTER TO SCAN ANIMAL LA A1,(1,0) LOAD POINTER TO USER'S ANIMAL AA,U A0,NODETEXT,X5 FORM POINTER TO TEXT OF SYMBOL J ALRCMPE ENTER COMPARISON LOOP . ALRCMPS LA A2,MEMORY,*A0 LOAD WORD FROM MEMORY ANIMAL TE A2,UANML,*A1 COMPARE WITH USER'S ANIMAL J ALRQUN UNEQUAL. IT'S NOT THIS ANIMAL ALRCMPE JGD R1,ALRCMPS LOOP FOR ALL WORDS IN ANIMAL LA A0,M(NODEBITS),X5 LOAD TYPE BITS FROM FIND NODE TEP,U A0,NBDEL IS THE NODE WE FOUND THE USER'S . ANIMAL IN ACTUALLY A DELETED NODE ? J ALRQUN YES. IGNORE THE FIND TEP,U A0,NBGENERIC WAS USER'S ANIMAL FOUND AS A . PROHIBITED GENERIC TYPE ? J GENERIC YES. ASK HIM TO BE MORE SPECIFIC J ALRDUP FIND. HANDLE DUPLICATE ANIMAL . . LINK TO NEXT NODE IN THE TREE . ALRQUN LA A0,X5 LOAD NODE RELATIVE ADDRESS TNE A0,MEMORY+NODEBKL WAS THIS THE LAST NODE IN THE TREE ? J GMQA YES. USER'S ANIMAL IS NEW TO US LX X5,NODEFL+MEMORY,X5 LINK TO NEXT NODE IN TREE J ALRSCN SCAN IT FOR EQUALITY . . USER'S ANIMAL IS A GENERIC TYPE WE'VE BEEN WARNED ABOUT. FORCE . HIM TO BE MORE SPECIFIC ABOUT WHAT KIND OF ANIMAL HE HAS IN . MIND. . GENERIC LX,U X6,SPECIFY LOAD 'PLEASE BE MORE SPECIFIC' QUESTIONS LMJ A2,RANFDIT EDIT A QUERY FROM OUR SET LA,U A0,UANML LOAD USER'S ANIMAL LA A1,UANL LOAD LENGTH OF USER'S ANIMAL F$COPY . APPEND USER'S ANIMAL TO THE QUESTION LMJ X5,QUESTK ASK USER WHICH SPECIFIC ANIMAL J ITHANS INTERPRET HIS NEW ANSWER . . . NOW THAT WE HAVE ESTABLISHED THAT THE USER'S ANIMAL IS UNIQUE . IN THE TREE, OR HAVE REMOVED ANOTHER INSTANCE OF HIS ANIMAL . WHICH HE CLAIMS WAS WRONGLY DESCRIBED, WE ENTER THIS SECTION . OF CODE WHICH ASKS THE USER FOR A QUESTION WHICH WILL . DISTINGUISH HIS ANIMAL FROM THE ONE WE THOUGHT WAS CORRECT. . GMQA F$MSG GMQ EDIT TEXT FOR QUESTION LA,U A0,UANML LOAD ADDRESS OF REPLY LA A1,UANL LOAD LENGTH OF USER'S ANIMAL F$COPY . COPY ANIMAL INTO QUESTION F$MSGR . COPY SOME MORE QUESTION LA,U A0,NODETEXT,X9 LOAD ADDRESS OF GUESSED ANIMAL LA A1,NODELEN,X9 LOAD LENGTH OF THAT ANIMAL F$COPY . COPY GUESSED ANIMAL TO MESSAGE F$CHAR ':' EDIT COLON F$PRT 1 PRINT THE QUESTION ASKQAG READ$ REPLY,EOFANS READ THE USER'S ANSWER TNZ,U 0,A0 VOID ANSWER ? J GMQA YES. ASK AGAIN LMJ X5,QUESTL SCAN THE PURPORTED QUESTION . . SCAN THE SUBMITTED QUESTION . LMJ X4,SCANQUES SCAN THE QUESTION FROM THE USER J ASKQAG REASK IF SUBMITTED QUESTION INCORRECT LMJ X7,PLUGGEN LOOK FOR PRONOUN IN QUESTION J REASTFD NONE. ASK GENERAL QUESTION . . NOW THAT WE HAVE PLUGGED THE USER'S QUESTION TO THAT AN ANIMAL . MAY BE INSERTED INTO THE QUESTION IN PLACE OF THE PRONOUN, . WE RANDOMLY DECIDE WHETHER TO INSERT THE USER'S ANIMAL OR THE . ANIMAL FROM THE TREE INTO THE QUESTION. THIS NOT ONLY MAKES . THE PROGRAM APPEAR MORE INTELLIGENT, BUT OFTEN LEADS TO . UNEXPECTED HUMOUR, E.G., . . CAN <A PYTHON> COMPETE IN THE KENTUCKY DERBY? . . WHERE THE USER'S ANIMAL WAS A HORSE. . TIME$ . GET TIME OF DAY AND,U A0,1 ISOLATE LOW ORDER BIT SA A1,A14 SAVE INVERSION FLAG FOR REPLY F$MSG REPLY EDIT THE USER'S QUESTION BACK AT HIM JB A14,GMQWOA USE USER'S ANIMAL IN THE QUESTION ? LA,U A0,UANML YES. LOAD USER ANIMAL ADDRESS LA A1,UANL LOAD USER ANIMAL LENGTH J GMQIAN GO COPY THE REST OF THE QUESTION . GMQWOA LA,U A0,M(NODETEXT),X8 LOAD ADDRESS OF OUR ANIMAL LA A1,M(NODELEN),X8 LOAD LENGTH OF OUR ANIMAL . GMQIAN F$COPY . COPY ANIMAL INTO THE QUESTION F$MSGR . IGNORE THE SECOND FMSG$ STOP F$MSGR . COPY THE REST OF THE QUESTION REASKD LA,U A13,1 INITIALISE A13 FOR 'NO' REPLY LMJ X4,DECIDE WOULD USER ASK HIS QUESTION 'YES' . FOR HIS ANIMAL ? LA,U A13 YES. FLAG TO SET LINKS FROM QUESTION XOR A14,A13 INVERT USER'S ANSWER IF WE ASKED . THE QUESTION WITH OUR ANIMAL. . . INCLUDE THE USER'S ANIMAL IN THE MEMORY TREE . LA A0,UQL LOAD LENGTH OF USER'S QUESTION LMJ X11,MAKENODE BUILD NODE FOR USER QUESTION . . CONSTRUCT LINKS IN USER QUESTION NODE . LX X1,MEMORY+NODEBL,X8 LOAD BACK LINK FROM OUR ANIMAL LA,U A4,,X8 LOAD ADDRESS OF ANIMAL WE THOUGHT IT WAS TNE A4,MEMORY+NODEYL,X1 WAS ANIMAL OFF 'YES' LINK ? SA A1,MEMORY+NODEYL,X1 YES. ATTACH NEW QUESTION TO 'YES' LINK TNE A4,MEMORY+NODENL,X1 WAS ANIMAL OFF 'NO' LINK ? SA A1,MEMORY+NODENL,X1 YES. ATTACH USER QUESTION TO 'NO' LINK SA A1,NODEBL+MEMORY,X8 ATTACH PREVIOUS ANIMAL TO THIS QUESTION . . PREVIOUS NODE NOW POINTS TO THE QUESTION SUPPLIED BY THE . USER WHICH DISTINGUISHES HIS ANIMAL FROM THE ONE WE HAD . IN THE TREE. . LR R1,UQLW LOAD USER QUESTION IN WORDS LA A3,(1,0) LOAD DESTINATION POINTER AA,U A3,NODETEXT+MEMORY,A1 GET TEXT ADDRESS LX X11,(1,UQUES) LOAD SOURCE POINTER BT A3,,*X11 COPY USER QUESTION TO NEW NODE SX X1,M(NODEBL),A1 SET QUESTION BACK LINK IN USER'S QUESTION . . CREATE A LEAF NODE FOR THE USER'S NEW ANIMAL . SA A0,X1 SET NEW QUESTION AS PREVIOUS NODE LA A0,UANL LOAD USER'S ANIMAL LENGTH LMJ X11,MAKENODE CREATE A NODE FOR USER'S ANIMAL SX X1,M(NODEBL),A1 SET QUESTION LINK IN USER'S ANIMAL LA A3,(1,0) LOAD DESTINATION POINTER AA,U A3,NODETEXT+MEMORY,A1 POINT TO TEXT OF LEAF NODE LX X11,(1,UANML) LOAD SOURCE POINTER LR R1,UANLW LOAD USER'S ANIMAL LENGTH IN WORDS BT A3,,*X11 COPY USER ANIMAL TO LEAF NODE LA,U A0,,X8 NO LINK = OLD ANIMAL LXI,U A0,,A1 YES LINK = NEW ANIMAL TZ A15 WAS ANSWER TO USER'S QUESTION 'YES' . FOR THE USER'S ANIMAL ? SSC A0,18 NO. INVERT LINKS IN QUESTION NODE SA A0,NODELINK+MEMORY,X1 SET LINKS IN USER'S QUESTION J AGAING ASK THE USER IF HE'S DONE . . WE COULD NOT FIND A PRONOUN IN THE USER'S QUESTION. . WE ARE FORCED TO ASK CIRCUITOUSLY WHAT THE CORRECT . ANSWER IS. . REASTPD F$MSG HOWDYA ASK GENERAL QUESTION OF USER LA,U A0,UANML LOAD ADDRESS OF USER ANIMAL LA A1,UANL LOAD LENGTH OF USER ANIMAL F$COPY . EDIT USER ANIMAL LA,U A14 INDICATE USER'S ANIMAL USED IN QUESTION J REASKD GO POSE THE QUESTION /. . . INPUT RECEIVING SUBROUTINES . . THESE ROUTINES PERFORM THE PRELIMINARY CHECKING AND FORMATTING . OF ANIMALS AND QUESTIONS RECEIVED BY THE USER. ALL SYNTAX AND . SEMANTIC CHECKING IS DONE BY THESE ROUTINES. . . . RECEIVE ANIMAL . . ASSUMES THE USER REPLY IS IN THE BUFFER 'REPLY' AND A15 IS SET . TO THE REPLY LENGTH IN CHARACTERS (AS RETURNED BY THE 'QUESTION' . SUBROUTINE). . . LMJ X5,SCANANI . <RETURN> ANIMAL COPIED TO 'UANML' . UANL = ANIMAL LENGTH IN CHARACTERS . UANLW = ANIMAL LENGTH IN WORDS . . ARTICLE PREFIXED TO ANIMAL IF USER DIDN'T SUPPLY ONE. . SCANANI LA,U A0,REPLY LOAD FIRST WORD OF REPLY LA,U A1 CLEAR RESULT REGISTER LR,U R1,5 LOAD LOOP COUNT FOR SCANNER ITHFW LDSC A0,6 SHIFT OFF A CHARACTER AND,U A0,077 ISOLATE LAST CHARACTER TE,U A0,' ' IS IT A SPACE ? JGD R1,ITHFW LOOP FOR AT MOST 6 CHARACTERS SSL A1,6 GET RID OF THE SPACE LR,U R1,ARTTL LOAD LENGTH OF ARTICLE TABLE LA A0,(1,0) LOAD POINTER TO TABLE SE A1,ARTTT,*A0 IS FIRST WORD AN ARTICLE IN . ANY KNOWN HUMAN LANGUAGE ? J $+2 NO. CHECK DOLPHIN AND CHIMPANZEE J GMART YES. USER SUPPLIED AN ARTICLE . . SUPPLY ARTICLE IF USER LEFT IT OUT . F$DT UANML,14 SET UP EDITOR ON REPLY BUFFER LA,S1 A2,REPLY LOAD FIRST CHARACTER OF USER RESPONSE LR,U R1,VOWELL LOAD COUNT OF VOWELS LA A1,(1,0) LOAD SEARCH POINTER LA,U A0,'AN' LOAD ARTICLE FOR LEADING VOWEL SE A2,VOWELS,*A2 IS FIRST CHARACTER A VOWEL ? LA,U A0,'A' NO. USE 'A' AS ARTICLE F$FD1 . EDIT THE ARTICLE F$SKIP 1 SKIP BEFORE THE REPLY LA,U A1,A15 LOAD LENGTH OF USER'S ANIMAL LA,U A0,REPLY LOAD ADDRESS OF USER'S ANIMAL F$COPY . COPY TO BUFFER AFTER ARTICLE F$COLN . GET CHARACTERS EDITED SA A0,A15 SET LENGTH OF USER'S ANIMAL DSL A0,36 RIGHT JUSTIFY IN A0, A1 AA,U A1,5 ROUND FOR COVERED DIVIDE DI,U A0,6 COMPUTE WORDS IN REPLY SA A0,UANLW SET LENGTH IN WORDS F$DT FL$,FLL$ RESET EDITOR ON CANNED LINE J GMARTS ENTER COMMON CODE . GMART LA A0,A15 LOAD LENGTH OF REPLY DSL A0,36 SHIFT FOR DIVIDE AA,U A1,5 ROUND UP IN DIVIDE DI,U A0,6 COMPUTE WORDS IN ENTRY SA A0,UANLW SAVE LENGTH IN WORDS LR R1,A0 LOAD LENGTH IN WORDS LA A0,(1,UANML) LOAD SAVE BUFFER ADDRESS LA A1,(1,REPLY) LOAD POINTER TO REPLY BT A0,,*A1 COPY REPLY TO SAVE BUFFER GMARTS SA A15,UANL SAVE LENGTH IN CHARACTERS J 0,X5 RETURN TO CALLER . . . SCAN QUESTION FROM USER . . THIS SUBROUTINE PERFORMS ALL CHECKS FOR CORRECT FORMAT . OF QUESTIONS AND COPIES THE QUESTION TO THE BUFFER 'UQUES'. . THE CELLS 'UQL' AND 'UQLW' ARE SET TO THE LENGTH OF THE . QUESTION IN CHARACTERS AND WORDS RESPECTIVELY. . . CALL: LMJ X4,SCANQUES . <RETURN> QUESTION SYNTAX INVALID . <RETURN> QUESTION SCANNED PROPERLY . . . . LOOK AT THE BEGINNING OF THE QUESTION AND SEE IF IT IS ONE . OF THE MOST COMMONLY USED BEGINNINGS OF QUESTIONS WHICH . CANNOT BE ANSWERED YES OR NO. SUCH QUESTIONS, LIKE 'WHAT . HAS FOUR FEET' ARE FREQUENTLY TYPED IN BY PEOPLE WHO DON'T . COMPREHEND WHAT 'A QUESTION THAT DISTINGUISHES X FROM Y' . MEANS IN TERMS OF THE ENGLISH LANGUAGE. . SCANQUES LA A0,REPLY LOAD FIRST WORD OF REPLY LR,U R1,PREFXL LOAD LENGTH OF PREFIX TABLE LR R2,(0777777770000) LOOK AT FIRST FOUR CHARACTERS LA A1,(1,0) LOAD SEARCH POINTER MSE A0,PREFIX,*A1 LOOK FOR PREFIX IN TABLE J $+2 NOT AN ILLEGAL PREFIX. QUESTION IS OK J BADPREF CLARIFY FOR USER IF BAD PREFIX . E$DITR REPLPK SET UP THE SCANNER ON THE REPLY E$COL 0 TAB TO COLUMN 1 GMQRMV LA A0,A15 LOAD CHARACTERS IN REPLY ANA,U A0,1 CONVERT TO EDIT$ COLUMN E$COL . TAB TO LAST CHARACTER IN QUESTION U$CHAR . LOAD THE FINAL CHARACTER TE,U A0,'?' IS IT A QUESTION MARK ? TNE,U A0,' ' NO. IS IT A TRAILING SPACE ? J $+2 YES. REMOVE IT J GMQSL NO. VALID LAST CHARACTER, SET LENGTH ANA,U A15,1 BACK UP LENGTH OF RESPONSE J GMQRMV LOOP FOR NEXT CHARACTER GMQSL SA A15,UQL SAVE USER QUESTION LENGTH IN CHARACTERS LA A0,A15 LOAD CHARACTERS IN QUESTION DSL A0,36 SHIFT FOR DIVIDE AA,U A1,5 ADD FOR COVERED DIVIDE DI,U A0,6 COMPUTE WORDS IN MESSAGE SA A0,UQLW SAVE WORD LENGTH OF USER QUESTION LR R1,A0 LOAD WORDS IN QUESTION LA A1,(1,UQUES) LOAD USER QUESTION BUFFER ADDRESS LA A0,(1,REPLY) LOAD REPLY BUFFER POINTER BT A1,,*A0 COPY MESSAGE TO SAVE AREA J 1,X4 RETURN TO NORMAL EXIT . . IF A USER'S QUESTION WAS NOT PHRASED PROPERLY, INFORM . HIM OF THE PROPER ENGLISH SYNTAX FOR A QUESTION WHICH . DISTINGUISHES ONE ANIMAL FROM ANOTHER. . BADPREF LX,U X6,ASKRIGHT LOAD CLARIFICATION STATEMENTS LMJ A2,RANEDIT EDIT ONE INTO THE IMAGE F$PRT 1 PRINT THE CLARIFICATION J 0,X4 GET A NEW QUESTION FROM THE USER /. . . THE USER'S ANIMAL OCCURS ELSEWHERE IN THE TREE. SCAN FROM . THE ANIMAL WE THOUGHT IT WAS AND THE FIND OF THE USER'S . ANIMAL IN THE TREE THROUGH THE BACK LINKS TO FIND THE . QUESTION AT WHICH THE USER DIVERGED FROM THE PATH WHICH . LEADS TO THE OCCURRENCE OF HIS ANIMAL. WHEN WE FIND THE . QUESTION (AND WE BETTER!), SEVERAL INTERESTING ALTERNATIVES . PRESENT THEMSELVES: MORE ABOUT THIS LATER, AFTER WE FIND . IT. . . X8 = LEAF NODE USER DISAGREED WITH . X5 = LEAF NODE USER'S ANIMAL WAS FOUND IN . ALRDUP SX X5,UFIND SAVE FIND OF USER ANIMAL LA A0,NODEBL+MEMORY,X5 A0 = QUESTION BEFORE OUR ANIMAL LA A14,X5 A14 = PREVIOUS LINK APRCPV LA A1,NODEBL+MEMORY,X8 A1 = QUESTION BEFORE USER'S ANIMAL ALRCPN TNE A0,A1 HAVE WE FOUND THE COMMON QUESTION ? J ALRFDV YES. WE HAVE FOUND THE DIVERGENT . QUESTION. GO COGITATE ON IT. LA A1,NODEBL,A1 NO. CALL THE PREVIOUS QUESTION JNZ A1,ALRCPN LOOP IF NOT BASE OF TREE LA A14,A0 SAVE PREVIOUS LINK LA A0,NODEBL+MEMORY,A0 LINK TO PREVIOUS NODE JNZ A0,ALRCPV ALWAYS JUMPS. EABT$ . HEE, HEE, HEE. . . . WE GET HERE UPON FINDING THE QUESTION AT WHICH THE USER . DIVERGED FROM THE PATH WHICH LEADS TO THE OTHER OCCURRENCE . OF HIS ANIMAL IN THE TREE. AT THIS POINT THERE ARE THREE . POSSIBILITIES FOR US TO CONSIDER. . . 1. THE USER ERRED WHEN HE ANSWERED THIS QUESTION ON . THE WAY TO THE LEAF WITH WHICH HE DISAGREED. IN . THIS CASE THE USER IS WRONG AND SHOULD BE CHAS- . TISED AND IGNORED. . . 2. THE USER ANSWERED CORRECTLY, BUT THE PERSON WHO . ORIGINALLY ENTERED THE ANIMAL HE WANTS TO ENTER . INCORRECTLY ANSWERED THE DIVERGENT QUESTION. . IN THIS CASE WE WANT TO REMOVE THE ANIMAL . CURRENTLY IN OUR TREE (REMOVING THE QUESTION WHICH . PRECEDED IT) AND ENTER THE USER'S ANIMAL. . . 3. THE QUESTION ON WHICH THE DIVERGENCE OCCURRED CAN . BE ANSWERED EITHER WAY FOR THE ANIMAL IN QUESTION. . FOR EXAMPLE, THE QUESTION 'DOES IT LIVE ON THE LAND' . COULD BE ANSWERED EITHER 'YES' OR 'NO' FOR A TURTLE. . IF THIS IS THE CASE, WE WANT TO ENTER THE USER'S . ANIMAL IN THE TREE, AND ALSO LEAVE THE ONE ALREADY . ENTERED IN PLACE. WE WILL COUNT ON A SUBSEQUENT . REBALANCE TO CONSOLIDATE THE ANIMALS. . ALRFDV SA A1,A13 SAVE DIVERGENT NODE E$DIT REPLPK SET UP EDITOR ON REPLY LINE LX X6,A13 LOAD DIVERGENT QUESTION NODE LA,U A0,NODETEXT+MEMORY,X6 LOAD QUESTION TEXT ADDRESS LA A1,NODELEN+MEMORY,X6 LOAD LENGTH IN CHARACTERS SA A1,A15 SAVE QUESTION LENGTH FOR PLUGGEN E$COPY . COPY QUESTION TO REPLY BUFFER LMJ X7,PLUGGEN TRY TO SUBSTITUTE USER ANIMAL . FOR PRONOUN IN THE QUESTION. J NODVPL CAN'T PLUG, CIRCUMLOCUTE. ON MAINTENANCE TNZ MAINT IN MAINTENANCE MODE ? J ALRMSK NO. SKIP ADDRESS EDITING SX X8,A5 SAVE CURRENT NODE POINTER LX X8,X6 LOAD ADDRESS OF QUESTION NODE LMJ X4,RELADR EDIT ADDRESS OF NODE LX X8,A5 RESTORE NODE POINTER ALRMSK OFF MAINTENANCE LMJ X7,STICKEM INSERT USER ANIMAL IN QUESTION LA A0,(1,REPLY) LOAD THE REPLY BUFFER ADDRESS LA A1,(1,UQUES) LOAD QUESTION BUFFER ADDRESS LR,U R1,14 LOAD TEXT BUFFER LENGTH BT A1,,*A0 SAVE PLUGGED TEXT IN USER QUESTION TEXT ALRFPCS LMJ X4,DECIDE REPOSE THIS QUESTION TO THE USER, . THIS TIME WITH HIS ANIMAL PLUGGED . IN FOR EXPLICITNESS. J DVRYES YES ANSWER. CHECK THE YES LINK . . . NOW THAT WE HAVE THE USER'S ANSWER TO THE DIVERGENT QUESTION, . WE COMPARE HIS ANSWER TO THE ANSWER HE GAVE THEN THE QUESTION . WAS POSED ON THE ORIGINAL QUESTION AND ANSWER SESSION. IF . THE ANSWER IS THE SAME, THE USER SEEMS WILLING TO STICK TO . HIS GUNS ON THE CONTENTION THAT HE ANSWERED CORRECTLY FOR . HIS ANIMAL. IF THE USER IS SURE, WE WILL THEN TRY TO ASK HIM . WHETHER IT CAN BE BOTH WAYS FOR HIS ANIMAL. BASED UPON THE . ANSWER TO THAT QUESTION, WE WILL EITHER DELETE THE OLD . ANIMAL OR LEAVE BOTH IT AND HIS NEW OCCURRENCE OF IT IN THE . MEMORY TREE. . LA A1,A13 LOAD DIVERGENT QUESTION NODE TNE A14,NODENL+MEMORY,A1 DOES OUR FIND OF THE . ANIMAL IN THE TREE COME OFF THE 'NO' . LINK ? J DVUERR YES. USER ERRED THE FIRST TIME J DVCFRM NO. USER IS CONSISTENT. . . 'YES' ANSWER TO DIVERGENT QUESTION . DVRYES LA A1,A13 LOAD DIVERGENT QUESTION NODE TNE A14,NODEYL+MEMORY,A1 DOES OUR FIND COME OFF . THE 'YES' LINK ? J DVUERR YES. USER IS INCONSISTENT. TELL HIM SO . . . THIS CODE IS ENTERED AFTER THE USER HAS CONFIRMED HIS ORIGINAL . ASSERTION THAT THE DIVERGENT QUESTION WAS PREVIOUSLY ANSWERED . CORRECTLY FOR HIS ANIMAL. WE NOW SCAN THE PLUGGED QUESTION . AND TRY TO REFORMULATE IT INTO A QUESTION WHICH ASKS WHETHER . THE STATEMENT COULD BE EITHER TRUE OR FALSE FOR HIS ANIMAL. . BASED UPON HIS ANSWER, WE EITHER REMOVE THE OTHER OCCURRENCE . OF HIS ANIMAL OR LET IT STAND. . . (THEN, OF COURSE, WE MUST MAKE SURE THERE ISN'T YET ANOTHER . INSTANCE OF HIS ANIMAL IN THE TREE). . DVCFRM JZ A15,DVCNFG SKIP IF UNABLE TO PLUG QUESTION LA A0,UQUES LOAD FIRST WORD OF REPLY LA A1,(1,0) LOAD SEARCH POINTER LR,U R1,CVFTL LOAD LENGTH OF CAN/DOES TABLE SE A0,CVFT,*A1 LOOK FOR WORD IN LEGAL TABLE J DVCNFG NOT FOUND. MUST ASK THE GENERAL FORM . . WE HAVE NOW ESTABLISHED THAT THE USER'S QUESTION BEGINS . WITH THE PROPER ENGLISH SYNTAX WHICH WILL PERMIT US TO . MODIFY IT INTO A QUESTION BY WHICH WE CAN ASK WHETHER THE . QUESTION COULD BE ANSWERED BOTH WAYS FOR THE ANIMAL IN . CONTENTION. THE BASIC TRANSFORMATION IS AS FOLLOWS: . . QUESTION: 'DOES IT LIVE ON THE LAND' . ANIMAL: 'A TURTLE' . . NEW QUESTION: . 'DOES <A TURTLE>[ BOTH] LIVE ON THE LAND[ AND NOT] LIVE ON THE LAND?' . F$MSG UQUES COPY FIRST PART OF QUESTION LA,U A0,UANML LOAD USER'S ANIMAL ADDRESS LA A1,UANL LOAD LENGTH OF USER'S ANIMAL F$COPY . COPY USER'S ANIMAL INTO QUESTION F$FD3 (' BOTH') EDIT 'BOTH' INTO QUESTION F$MSGR . SKIP SECOND FMSG$ STOP F$MSGR . COPY TO END OF QUESTION F$FD4 (' AND NOT') FILL IN 'AND NOT' F$COLN . REMEMBER WHERE WE ARE SA A0,A4 SAVE POSITION IN LINE F$MSG UQUES RE-EDIT FIRST PART OF QUESTION F$MSGR . IGNORE SECOND FMSG$ STOP F$COL A4,,W POSITION BACK TO ORIGINAL LOCATION F$MSGR . COPY THE REST OF THE QUESTION DVBASK LMJ X4,DECIDE ASK USER 'CAN IT BE BOTH' J DVLVBOTH YES. LEAVE BOTH IN TREE LA A0,UFIND LOAD FIND OF USER'S ANIMAL LMJ X4,DELANIMAL DELETE THE BADLY PLACED OCCURRENCE . OF THE USER'S ANIMAL IN THE TREE . DVCSCAN LX X5,UFIND RELOAD FIND POINTER LA A15,UANL RELOAD LENGTH OF USER'S ANIMAL J ALRQUN CONTINUE SCAN OF TREE . DVLVBOTH LA,U A0,1 LOAD A ONE SA A0,NEEDRBAL MARK REBALANCE NEEDED J DVCSCAN CONTINUE SCAN OF TREE FOR USER'S ANIMAL . . ASK GENERIC QUESTION WHEN UNABLE TO PLUG INTO QUESTION IN TREE . NODVPL LA A1,A15 LOAD QUESTION LENGTH LA,U A0,REPLY LOAD REPLY BUFFER ADDRESS LA,U A15 INDICATE UNABLE TO PLUG F$COPY . COPY THE QUESTION TO FDIT$'S LINE J ALRFPCS ASK GENERIC QUESTION OF USER . . ASK GENERAL QUESTION TO DETERMINE WHETHER QUESTION MAY BE . ANSWERED BOTH WAYS FOR THE USER'S ANIMAL. THIS HAPPENS . WHEN NO PRONOUN IF FOUND IN THE QUESTION OR THE SYNTAX OF THE . QUESTION DOES NOT LEND ITSELF TO TRANSLATION TO THE 'BOTH . WAYS' FORM. . DVCNFG LX,U X6,BOTHWAYS LOAD 'YES AND NO BOTH' MESSAGES LMJ A2,RANFDIT EDIT INTO THE LINE LA,U A0,UANML LOAD USER ANIMAL ADDRESS LA A1,UANL LOAD LENGTH OF USER ANIMAL F$COPY . COPY USER ANIMAL INTO QUESTION J DVBASK ASK USER WHETHER ANSWER CAN BE EITHER WAY . . . THE USER ERRED ON A QUESTION OR CHANGED HIS MIND BETWEEN THE . FIRST AND SECOND POSINGS OF THE DIVERGENT QUESTION. CHIDE . HIM GENTLY FOR HIS GROSS INCOMPETENCE AND DON'T INSERT HIS . ANIMAL IN THE TREE. . DVUERR PRINT$ MUYM,MUYML 'MAKE UP YOUR MIND.' J AGAING THIS GAME IS DONE /. . . TREE MANIPULATION FUNCTIONS . . . CREATE NODE . . LA,U A0,<LENGTH OF TEXT IN CHARACTERS> . LMJ X11,MAKENODE . <RETURN> A1 = NODE ADDRESS (RELATIVE) . . THIS SUBROUTINE ALLOCATES A MEMORY BUFFER FOR THE NODE, . EXPANDING THE MEMORY IF NECESSARY. THE NODE IS CHAINED . INTO THE LIST OF NODES (LINKS NODEFL, NODEBL). THE . TEXT LENGTH IN CHARACTERS (NODELEN) IS INITIALISED, AND . THE NODE CREATOR INFORMATION (NODEUID, NODEAC) IS FILLED . IN. THE FIELDS NODEYL, NODENL, NODEBL, NODEREFC, AND . NODEBITS WILL BE ZEROED. . MAKENODE SA A0,A5 SAVE LENGTH IN CHARACTERS DSL A0,36 SHIFT CHARACTER LENGTH FOR DIVIDE AA,U A1,5 ROUND UP FOR COVERED DIVIDE DI,U A0,6 COMPUTE NODE TEXT LENGTH IN WORDS LA A1,HIGHUSE LOAD ABSOLUTE ADDRESS OF NEW NODE AU,U A1,NODETEXT,A0 ADD TOTAL LENGTH OF NEW NODE TG A2,HIGHCORE NEED MEMORY BE EXPANDED ? LMJ X4,NUFF YES. ALLOCATE ANOTHER MEMORY BLOCK SA A2.HIGHUSE UPDATE NEXT AVAILABLE ADDRESS ANA,U A1,MEMORY MAKE NODE ADDRESS RELATIVE . . INITIALISE FIELDS IN THE NEW NODE . SZ M(NODELNK),A1 CLEAR YES AND NO LINKS SA A5,M(NODELEN),A1 SET TEXT LENGTH IN NODE SZ M(NODEREFC),A1 ZERO REFERENCE COUNT ON NODE SZ M(NODEBL),A1 CLEAR QUESTION LINK IN NODE SZ M(NODEBITS),A1 CLEAR NODE TYPE BITS . . ATTACH NODE TO LINEAR NODE LIST . LA A0,M(NODEBKL) LOAD LINK TO LAST NODE IN LINK SA A0,M(NODEBKL),A1 SET AS PREDECESSOR TO NEW NODE SA A1,M(NODEBKL) SET NEW NODE AS LAST SA A1,M(NODEFL),A0 SET NEW NODE AS SUCCESSOR TO PREVIOUS SZ M(NODEFL),A1 MARK HEAD AS SUCCESSOR TO NEW NODE . LA A0,USERID LOAD USERID FOR CURRENT USER SA A0,M(NODEUID),A1 SET USERID OF CREATOR DL A4,ACCOUNT LOAD ACCOUNT OF CREATOR DS A4,M(NODEAC),A1 SET CREATOR'S ACCOUNT IN NODE J 0,X11 RETURN TO CALLER . . DELETE ANIMAL . . LA,U A0,<ANIMAL NODE> (RELATIVE) . LMJ X11,DELANIMAL . <RETURN> . DELANIMAL TZ M(NODELNK),A0 CALLED DELANIMAL ON A QUESTION ? ERR$ . YES. BETTER TAKE A DUMP LA A1,M(NODEBITS),A0 LOAD MODE BITS FOR NODE OR,U A1,NBDEL MARK THE NODE DELETED SA A2,M(NODEBITS),A0 SET DELETE BIT IN NODE BITS LA A1,M(NODEBL),A0 LOAD LINK TO PREVIOUS QUESTION LA A3,M(NODEYL),A1 LOAD YES LINK FROM QUESTION TNE A3,A0 IS YES LINK TO DELETED ANIMAL ? LA A3,M(NODENL),A1 YES. TAKE THE NO LINK TNE A1,BASENODE IS PREVIOUS QUESTION THE BASE NODE ? J DELBN YES. WE WILL HAVE A NEW BASE NODE LA A2,M(NODEBL),A1 LOAD NODE PRIOR TO QUESTION NODE TNE A1,M(NODEYL),A2 WAS QUESTION OFF YES LINK ? SA A3,M(NODEYL),A2 YES. UPDATE YES LINK TNE A1,M(NODENL),A2 WAS QUESTION OFF NO LINK ? SA A3,M(NODENL),A2 YES. ATTACH REMAINDER TO NO LINK SA A2,M(NODEBL),A3 UPDATE BACK LINK IN REMAINING CHAIN DELASF LA A2,M(NODEBITS),A1 LOAD BITS FROM QUESTION OR,U A2,NBDEL MARK THE QUESTION DELETED SA A3,M(NODEBITS),A1 SET DELETE FLAG IN QUESTION NODE LA,U A2,1 LOAD A ONE SA A2,NEEDPACK MARK 'TREE NEEDS TO BE PACKED' ON MAINTENANCE TNZ MAINT IN MAINTENANCE MODE ? J MMDAN NO. SKIP LOGGING OF DELETED QUESTIONS SX X8,A5 SAVE CURRENT NODE POINTER LX X8,A1 LOAD POINTER TO DELETED QUESTION F$MSG ALSDEL EDIT 'ALSO DELETED: ' SX X4,A4 SAVE CALL ADDRESS LMJ X4,RELADR EDIT ADDRESS OF DELETED NODE LX X4,A4 RELOAD THE CALL ADDRESS LA,U A0,M(NODETEXT),X8 LOAD QUESTION TEXT ADDRESS LA A1,M(NODELEN),X8 LOAD LENGTH OF QUESTION F$COPY . COPY DELETED QUESTION LX X8,A5 RELOAD CURRENT NODE POINTER F$CHAR '?' EDIT QUESTION MARK F$PRT 1 PRINT THE DELETED QUESTION MMDAN OFF MAINTENANCE J 0,X4 RETURN TO CALLED . . HANDLE DELETION OF BASE NODE . DELBN SA A3,BASENODE SET REMAINDER CHAIN HEAD AS BASE NODE SZ M(NODEBL),A3 MARK REMAINDER CHAIN WITH NO BACK LINK J DELASF GO SET DELETE FLAG IN OLD BASE NODE . . . DELETE SUBTREE . . LA,U A0,<BASE NODE OF SUBTREE> . LMJ X4,DELTREE . <RETURN> . . ALL NONZERO LINKS OF THE DESIGNATED SUBTREE WILL BE FOLLOWED . AND THE DELETE BIT FILL BE SET FOR EACH NODE ENCOUNTERED. . ON MAINTENANCE DELTREE LA A1,A0 SET RUNNING POINTER TO BASE NODE SX X4,A4 SAVE CALL ADDRESS SX X8,A5 SAVE ORIGINAL X8 SA A0,A6 SAVE BASE NODE POINTER DELTFL TNZ M(NODELNK),A1 IS THIS A LEAF NODE ? J DELTLEAF YES. DELETE A LEAF NODE TZ M(NODENL),A1 DOES NODE HAVE A 'NO' LINK ? LA A1,M(NODENL),A1 YES. ADVANCE UP NO LINK TZ M(NODEYL),A1 DOES THIS (OR NEXT) NODE HAVE A . YES LINK ? LA A1,M(NODEYL),A1 YES. ADVANCE UP YES LINK J DELTFL LOOP LOOKING FOR END OF TREE . DELTLEAF LA A2,M(NODEBITS),A1 LOAD NODE STATUS BITS OR,U A2,NBDEL MARK THIS NODE DELETED SA A3,M(NODEBITS),A1 SET DELETE BIT IN NODE TNE A1,A6 JUST DELETED BASE NODE OF SUB-TREE J DELTDONE YES. SUB TREE ALL DELETED F$MSG ALSDEL EDIT 'ALSO DELETED' MESSAGE LX X8,A1 LOAD CURRENT NODE POINTER LMJ X4,RELADR EDIT RELATIVE ADDRESS OF NODE LA,U A0,M(NODETEXT),X8 LOAD NODE TEXT ADDRESS LA A1,M(NODELEN),X8 LOAD LENGTH OF NODE TEXT F$COPY . COPY THE NODE TEXT F$PRT 1 PRINT THE DELETED ITEM LA A1,X8 RESTORE CURRENT NODE POINTER LA A2,M(NODEBL),A1 LOAD LINK TO PREVIOUS NODE TNE A1,M(NODENL),A2 CHAINED OFF 'NO' LINK ? SZ M(NODENL),A2 YES. CLEAR NO LINK TNE A1,M(NODEYL),A2 CHAINED OFF 'YES' LINK ? SZ M(NODEYL),A2 YES. CLEAR THE YES LINK LA A1,A2 LOAD ADDRESS OF PREVIOUS NODE J DELTFL LOOP DELETING SUB TREE . DELTDONE LA,U A1,1 LOAD A ONE SA A1,NEEDPACK MARK TREE NEEDS TO BE PACKED LX X4,A4 RESTORE CALL ADDRESS LX X8,A5 RELOAD CURRENT NODE POINTER J 0,X4 RETURN TO CALL . . . PACK DELETED NODE FROM TREE . . LMJ X4,PACK . <RETURN> . P PROC 1 ADJUST A LINK TO NEW ADDRESSING ADJUST* NAME 0 LA A3,P(1,1),P(1,2) LOAD ADDRESS TO BE ADJUSTED TG A3,X1 IS IT ABOVE DELETED NODE ? ANA A3,A2 YES. SUBTRACT LENGTH OF DELETED ITEM SA A3,P(1,1),P(1,2) STORE THE ADJUSTED ADDRESS BACK END . . PACK SZ NEEDPACK CLEAR PACK STILL NEEDED PACK1 LX,U X1 CLEAR CURRENT NODE POINTER . PKNEXT LX X1,M(NODEFL),X1 LOAD LINK TO NEXT NODE TNZ X1 END OF TREE ? J 0,X4 YES. PACK IS NOW COMPLETE LA A0,M(NODEBITS),X1 LOAD STATUS BITS FOR THIS NODE TOP,U A0,NBDEL IS THIS NODE DELETED ? J PKNEXT NO. LOOK AT THE NEXT NODE LA A0,M(NODEFL),X1 LOAD LINK TO NEXT NODE LA A1,M(NODEBKL),X1 LOAD LINK TO PREVIOUS NODE SA A0,M(NODEFL),A1 ATTACH NEXT NODE TO PREVIOUS NODE SA A1,M(NODEBKL),A0 ATTACH PREVIOUS NODE TO NEXT NODE LA A2,M(NODELEN),X1 LOAD LENGTH OF DELETED NODE DSL A2,36 SHIFT DOWN FOR DIVIDE AA,U A3,5 ROUND UP FOR COVERED DIVIDE DI,U A2,6 COMPUTE WORDS OF TEXT IN ITEM AA,U A2,NODETEXT ADD LENGTH OF HEADER LX X2,M(NODEFL) LOAD LINK TO FIRST NODE IN TREE . . ADJUST ALL ADDRESSES ABOVE THE DELETED ITEM . PKADNX TNZ X2 END OF TREE ? J PKADJC YES. ADDRESS ADJUSTMENT COMPLETE LA A4,M(NODEFL),X2 LOAD ORIGINAL FORWARD LINK FOR NODE . (ADJUSTMENT MAY CHANGE IT) ADJUST M(NODEYL),X2 ADJUST YES LINK FROM NODE ADJUST M(NODENL),X2 ADJUST THE NO LINK, ALSO ADJUST M(NODEBL),X2 FIX THE QUESTION LINK ADJUST M(NODEFL),X2 ADJUST THE FORWARD LINK ADJUST M(NODEBKL),X2 ADJUST THE BACKWARD LINK LX X2,A4 LOAD LINK TO THE NEXT NODE J PKADNX GO ADJUST THE NEXT NODE . PKADJD ADJUST BASENODE FIX THE BASE NODE ADDRESS ADJUST M(NODEFL) FIX THE HEAD FORWARD LINK ADJUST M(NODEBKL) FIX THE LINK TO THE LAST NODE LA A0,(1,0) LOAD POINTER TO COMPRESS THE TREE AA,U A0,,X1 COMPUTE OFFSET OF DELETED NODE AU,U A0,,A2 START OF TREE ABOVE NODE TO BE COMPRESSED LA A3,HIGHUSE LOAD HIGHEST WORD IN USE ANA,U A3,MEMORY,A1 A3 = NUMBER OF WORDS ABOVE THE GAP SA A3,R1 SET AS COUNT FOR TREE COMPRESSION BT A0,MEMORY,*A1 SQUEEZE THE DELETED ITEM OUT OF THE TREE ANA A2,HIGHUSE COMPUTE -(HIGHEST WORD IN USE) SNA A2,HIGHUSE UPDATE HIGHEST WORD IN USE J PACK1 LOOK FOR MORE DELETED NODES /. . . . ASK THE USER A QUESTION . . LX,U X6,<QUESTION CONTROL BLOCK> . LMJ X5,QUESTION . A15 = LENGTH OF ANSWER IN CHARACTERS . QUESTION LMJ A2,RANFDIT EDIT A RANDOM QUESTION FROM BLOCK QUESTK F$FD2 ('? ') APPEND QUESTION MARK F$CHAR EOL APPEND END OF LINE TREAD$P GIGO. GET THE ANSWER F$DT . CLEAR THE QUESTION LINE TNZ,U 0,A0 NULL ANSWER ? J QUESTION GO ASK ANOTHER QUESTION QUESTL LA,U A0,,A0 GET RID OF H1 LA A2,REPLY-1,A0 LOAD LAST WORD IN REPLY LA,U A15,,A0 LOAD WORDS RETURNED MSI,U A15,6 COMPUTE CHARACTERS IN FULL QUESTION LR,U R1,5 LOAD LOOP COUNTER QSL DSC A1,6 SHIFT CHARACTERS FROM RIGHT INTO A1 SSL A1,30 RIGHT JUSTIFY CHARACTER TE,U A1,' ' TRAILING SPACE ? J 0,X5 NO. DONE SCANNING REPLY ANA,U A15,1 YES. DECREMENT LENGTH OF REPLY JGD R1,QSL LOOP FOR ALL CHARACTERS IN LAST WORD J 0,X5 RETURN TO CALLER . . . EDIT A RANDOM STRING FROM A QUESTION CONTROL BLOCK . . LX,U X6,<QUESTION CONTROL BLOCK> . LMJ A2,RANFDIT . <RETURN> TEXT EDITED INTO FDIT IMAGE . RANFDIT LA,U A1 CLEAR INITIAL QUESTION INDEX TNZ,H1 0,X6 MORE THAN ONE QUESTION IN BLOCK ? J RFDSIMP NO. SIMPLE CASE TIME$ . GET RANDOM TIME DSL A0,36 MOVE TIME DOWN TO A1 DI,H1 A0,,X6 DIVIDE BY NUMBER OF QUESTIONS RFDSIMP AA,U A1,,X6 COMPUTE ADDRESS OF QUESTION POINTER F$MSG 0,A1,H2 EDIT THE QUESTION TEXT J 0,A2 RETURN TO CALL . . . DECIDE A YES OR NO QUESTION . DECIDE LX,U X6,YORN GET YES OR NO LIST FOR RETRY LMJ X5,QUESTK ASK THE ORIGINAL QUESTION DECID1 LA,S1 A0,REPLY LOAD FIRST CHARACTER OF REPLY TNE,U A0,'Y' YES ? J 0,X4 YES. TAKE AFFIRMATIVE EXIT TNE,U A0,'N' NEGATIVE ? J 1,X4 YES. TAKE NEGATIVE EXIT . . LOOK FOR AFFIRMATIVE AND NEGATIVE SOUNDING WORDS IN A . TABLE. CURRENTLY THIS TABLE IS ASSEMBLED IN, BUT IT . MAY BE KEPT IN THE MEMORY IN THE FUTURE. . LA A0,REPLY LOAD USER'S REPLY TO THE QUESTION ON MAINTENANCE TNE A0,('THAT''S') IS THE REPLY 'THAT'S IT' ? TNZ MAINT YES. ARE WE IN MAINTENANCE MODE ? J DECNOM NO. SKIP NODE FINDING CODE LX X11,R5 YES. LOAD CALL ADDRESS FOR FINDNODE TZ X11 WERE WE INVOKED BY FINDNODE ? J 0,X11 YES. TAKE FINDNODE RETURN DECNOM OFF MAINTENANCE LR,U R5,YESLL LOAD LENGTH OF 'YES' LIST LA A1,(1,0) LOAD SEARCH POINTER SE A0,YESL,*A1 LOOK FOR ANSWER IN THE LIST J $+2 NOT FOUND. CHECK THE 'NO' LIST J 0,X4 FOUND IN YES LIST. TAKE YES REPLY LA A1,(1,0) RESTORE SEARCH POINTER LR,U R1,NOLL LOAD LENGTH OF 'NO' LIST SE A0,NOL,*A1 LOOK FOR ANSWER IN 'NO' LIST J $+2 NOT FOUND. REASK QUESTION J 1,X4 FOUND IN 'NO' LIST. TAKE NO REPLY LMJ X5,QUESTION ASK THE QUESTION AGAIN J DECID1 GO INTERPRET NEXT ANSWER . . . THIS SUBROUTINE SCANS A QUESTION FOUND IN THE BUFFER 'REPLY' . WHOSE LENGTH IS SPECIFIED BY A15 FOR A PRONOUN. UPON FINDING . ONE, IT IS PLUGGED WITH AN EMSG$ STOP CHARACTER TO PERMIT . SUBSTITUTION FOR IT. . . LA,U A15,<LENGTH OF QUESTION> . LMJ X7,PLUGGEN . <NO PRONOUN> REPLY BUFFER UNCHANGED . <PRONOUN PLUGGED> . PLUGGEN E$COL 0 TAB TO START OF MESSAGE . . SEARCH THE USER'S QUESTION FOR 'IT', AND SET UP TO . PLUG THE ANIMAL NAME WHEN WE ASK IT BACK TO HIM. . FINDIT U$CHAR . LOAD A CHARACTER FROM THE MESSAGE TE,U A0,'I' IS IT AN 'I' ? J FIND1 NO. ADVANCE TO NEXT START OF WORD U$CHAR . LOAD NEXT CHARACTER AND PEED AHEAD TNE,U A0,'T' IS IT AN 'IT' ? TE,U A2,' ' (MUST BE FOLLOWED BY SPACE) J FIND2 NO. RECOVER AND CONTINUE E$SKIP -2 BACK UP OVER THE 'I' E$FD1 ('&&') EDIT TWO STOP CHARACTERS INTO THE LINE E$COL A15,,W TAB TO END OF MESSAGE E$CHAR '&' INSERT END OF MESSAGE THERE E$DITX . LEAVE EDITING MODE J 1,X7 PRONOUN PLUGGED. RETURN . FIND2 TNE,U A0,' ' WAS THE BAD CHARACTER A SPACE ? J FIND3 YES. SKIP ADVANCE TO NEXT SPACE FIND1 U$POS1 ' ' FIND THE END OF THIS WORD JN A0,,X7 TAKE NO FIND RETURN IF NO PRONOUN FIND3 U$POS3 . FIND NEXT NON-BLANK E$COLN . RETURN COLUMN POINTER TG A0,A15 BEYOND END OF USER IMAGE ? J 0,X7 YES. NO PRONOUN IN SENTENCE J FINDIT GO PROCESS THIS CHARACTER . . . THIS SUBROUTINE INSERTS THE USER'S ANIMAL (FROM UANML) . INTO A QUESTION IN THE BUFFER 'REPLY' PREVIOUS SCANNED . BY 'PLUGGEN'. . . LMJ X7,STICKEM . <RETURN> QUESTION EDITED INTO FL$ . STICKEM F$MSG REPLY EDIT THE USER'S QUESTION BACK TO HIM LA,U A0,UANML LOAD ADDRESS OF USER'S ANIMAL LA A1,UANL LOAD LENGTH OF USER ANIMAL F$COPY . COPY TEXT OF MESSAGE F$MSGR . IGNORE DROPPED CHARACTERS F$MSGR , COPY REST OF QUESTION J 0,X7 RETURN TO CALLER /. . . INSTALL THE ANIMAL FILE AT A NEW SITE . INSTALL F$DT , CLEAR THE EDITING LINE F$MSG1 CREMEM EDIT THE @CAT IMAGE FOR THE MEMORY FILE F$MSG MEMFILE EDIT THE MEMORY FILE NAME F$MSGR . ...WITH KEYS F$MSG1 CREMEM1 EDIT THE ASSIGN PARAMETERS CSF$ FL$ GO TRY TO @CAT THE MEMORY FILE JN A0,LATER ERROR OFF IF UNASSIGNABLE F$DT . CLEAR THE EDITING LINE F$MSG USEMEM COPY @USE IMAGE TO LINE F$MSG1 MEMFILE EDIT NAME OF MEMORY FILE CSF$ FL$ ATTACH @USE NAME TO MEMORY FILE F$DT . CLEAR THE LINE SR R15,LUPTIME INITIALISE TIME OF LAST UPDATE IOW$ IOPW INITIALISE THE MEMORY FILE TZ,S1 IOPW+3 NORMAL WRITE STATUS ? J LATER NO. MAKE USER GO AWAY CSF$ FREEMEM RELEASE THE MEMORY FILE J ASGMA GO RETRY THE ASSIGN . . REWRITE MEMORY TO FILE WHEN USER IS DONE . AGAINQ . ON MAINTENANCE TZ MAINT MAINTENANCE MODE ? J MAINTCMD YES. RETURN TO SCANNER AT END OF GAME OFF MAINTENANCE LX,U X6,PLAYAGAIN LOAD QUESTIONS FOR PLAYAGAIN LMJ A2,RANFDIT EDIT A QUESTION TO ASK PLAY AGAIN ? LMJ X4,DECIDE DOES USER WANT TO PLAY AGAIN ? J RESTART YES. GO START ALL OVER . RWOUT TZ NEEDPACK DOES TREE NEED TO BE CONDENSED ? LMJ X4,PACK YES. SQUEEZE OUT THE DELETED ITEMS LA A0,HIGHUSE LOAD HIGHEST ADDRESS ASSIGNED ANA,U A0,MEMORY SUBTRACT MEMORY START ADDRESS SA A0,MEMLEN SET LENGTH IN FILE SA,H1 A0,IOPW+4 SET LENGTH IN ACCESS WORD SR R15,LUPTIME SAVE TIME OF LAST UPDATE LA A0,NUPDATE LOAD THE NUMBER OF FILE UPDATES AA,U A0,1 INCREMENT IT FOR THIS ONE SA A0,NUPDATE SAVE NUMBER OF FILE UPDATES IOW$ IOPW REWRITE MEMORY TO FILE TZ,S1 IOPW+3 NORMAL STATUS ? EABT$ . ******** J EOFANS SAY GOODBYE TO USER . . EXPAND MEMORY WHEN REQUIRED . NUFF LA A0,HIGHCORE LOAD HIGHEST ADDRESS AA,U A0,512 INCREMENT BY ONE MEMORY BLOCK SA A0,HIGHCORE UPDATE HIGHEST AVAILABLE ADDRESS MCORE$ . ALLOCATE ONE MORE MEMORY BLOCK J 0,X4 RETURN AFTER ALLOCATION COMPLETE /. . . ANIMAL TREE MAINTENANCE PROCESSOR . ON MAINTENANCE . MAINTMAIN F$MSG MAINTSO EDIT MAINTENANCE SIGN-ON LINE F$FD1 (LEVEL) EDIT LEVEL OF ANIMAL PROCESSOR ON LOCLVL F$FD1 (LOCLVL) EDIT LOCAL LEVEL OFF LOCLVL F$MSGR . COPY REST OF SIGN ON F$PRT 1 PRINT THE MESSAGE . . RETURN HERE TO FETCH THE NEXT COMMAND . MAINTCMD F$CHAR '*' EDIT A SOLICITATION F$CHAR EOL EDIT LINE TERMINATOR MCMA TREAD$P GIGO. SOLICIT NEXT COMMAND FROM USER TNZ,U 0,A0 NULL RESPONSE BY USER ? J MCMA YES. ASK HIM AGAIN LR,U R5 CLEAR JUMP-BACK ADDRESS FOR PLAY F$DT . CLEAR THE EDITING LINE . . SEARCH FOR THE COMMAND IN THE COMMAND TABLE . LA,H1 A0,REPLY LOAD FIRST THREE LETTERS OF COMMAND LR,U R1,TMPCTL LOAD LENGTH OF COMMAND TABLE LA A1,(1,0) LOAD COMMAND TABLE POINTER SE,H1 A0,TMPCT,*A1 LOOK FOR COMMAND IN TABLE J MCMBAD ILLEGAL COMMAND. REJECT IT LA,H2 A0,TMPCT-1,A1 LOAD COMMAND ROUTINE ADDRESS J 0,A0 ENTER COMMAND ROUTINE . . REJECT ILLEGAL COMMAND . MCMBAD F$MSG BADCMM EDIT BAD COMMAND MESSAGE F$PRT 1 PRINT ERROR MESSAGE J MAINTCMD ASK FOR ANOTHER COMMAND . . . CHANGE ANIMAL COMMAND (CA) . CHGANML LMJ X11,FINDNNODE FIND ANIMAL TO BE CHANGED TZ M(NODELNK),X8 IS SELECTED NODE AN ANIMAL ? J NOTANML NO. GIVE ERROR MESSAGE LX,U X6,NEWANML LOAD QUERY FOR NEW ANIMAL LMJ X5,QUESTION ASK FOR THE NEW ANIMAL NAME LMJ X5,SCANANI SCAN THE SUBMITTED ANIMAL . LMJ X11,DUPCHECK CHECK FOR DUPLICATE ANIMAL LA A0,UANL LOAD LENGTH OF ANIMAL LMJ X11,MAKENODE ALLOCATE A NODE FOR THE ANIMAL LA A0,M(NODEBL),X8 LOAD LINK TO QUESTION BEFORE . THE OLD ANIMAL NODE. LA,U A4,,X8 LOAD ADDRESS OF OLD NODE TNE A4,M(NODEYL),A0 CHAINED OFF YES LINK ? SA A1,M(NODEYL),A0 YES. ATTACH NEW NODE TO YES LINK TNE A4,M(NODENL),A0 CHAINED OFF NO LINK ? SA A1,M(NODENL),A0 YES. ATTACH NEW NODE TO NO LINK SA A0,M(NODEBL),A1 SET BACK LINK IN REPLACEMENT NODE LR R1,UANLW LOAD NEW ANIMAL LENGTH IN WORDS LA A0,(1,0) LOAD POINTER FOR MOVE AA,U A0,M(NODETEXT),A1 FORM DESTINATION POINTER LX X11,(1,UANML) LOAD SOURCE POINTER BT A0,,*X11 COPY TEXT TO NEW NODE LA A1,M(NODEBITS),X8 LOAD BITS FROM OLD NODE OR,U A1,NBDEL SET DELETE BIT IN THE NODE SA A2,M(NODEBITS),X8 UPDATE BITS IN THE NODE LA,U A1,1 LOAD A ONE SA A1,NEEDPACK MARK TREE IN NEED OF PACK J MAINTCMD PROCESS THE NEXT COMMAND . NOTANML F$MSG NOTANMM EDIT 'NOT ANIMAL' MESSAGE F$PRT 1 PRINT THE MESSAGE J MAINTCMD GET THE NEXT COMMAND . . . CHANGE QUESTION COMMAND (CQ) . . CHGQUES LMJ X11,FINDNODE LOOK FOR NODE TO BE CHANGED TNZ M(NODELNK),X8 IS IT A QUESTION NODE ? J NOTQUES NO. GIVE ERROR MESSAGE CQRA LX,U X6,REPLQUES LOAD QUERY FOR NEW QUESTION LMJ X5,QUESTION ASK FOR REPLACEMENT QUESTION LMJ X4,SCANQUES SCAN THE REPLACEMENT QUESTION J CQRA ASK FOR QUESTION AGAIN IF BAD LA A0,UQL LOAD LENGTH OF QUESTION LMJ X11,MAKENODE ALLOCATE A NODE FOR QUESTION LA A2,X8 LOAD THE OLD NODE ADDRESS LA A0,M(NODELNK),X8 LOAD YES AND NO LINKS OF OLD QUESTION SA A0,M(NODELNK),A1 SET LINKS IN REPLACEMENT QUESTION TNE A2,BASENODE ARE WE REPLACING THE BASE NODE ? J CHGBSN YES. HANDLE SPECIALLY LA A0,M(NODEBL),X8 LOAD LINK TO PREVIOUS QUESTION SA A0,M(NODEBL),A1 SET BACK LINK IN NEW QUESTION TNE A2,M(NODEYL),A0 CHAINED OFF YES LINK ? SA A1,M(NODEYL),A0 YES. ATTACH QUESTION TO YES LINK TNE A2,M(NODENL),A0 CHAINED OFF THE NO LINK ? SA A1,M(NODENL),A0 YES. ATTACH TO THE NO LINK CHQSTD LR R1,UQLW LOAD QUESTION LENGTH IN WORDS LX X11,(1,UQUES) LOAD POINTER TO USER QUESTION LA,U A0,M(NODETEXT),A1 LOAD NODE TEXT POINTER AA A0,(1,0) FORM POINTER TO TEXT BT A0,,*X11 COPY TEXT TO NODE LA A0,M(NODEBITS),X8 LOAD STATUS BITS FOR NODE OR,U A0,NBDEL MARK OLD NODE DELETED SA A1,M(NODEBITS),A0 SET DELETE STATUS IN NODE LA,U A0,1 LOAD A ONE SA A0,NEEDPACK MARK TREE NEEDS A PACK J MAINTCMD RETURN FOR NEXT COMMAND . CHGBSN SA A1,BASENODE SET NEW QUESTION AS BASE NODE SZ M(NODEBL),A1 SET BACK LINK IN NODE TO ZERO J CHQSTD RETURN TO COPY TEXT . . . DELETE ANIMAL COMMAND (DA) . DELANML LMJ X11,FINDNODE LOCATE NODE TO BE DELETED TZ M(NODELNK),X8 IS THIS AN ANIMAL NODE ? J NOTANML NO. GIVE ERROR MESSAGE LA A0,X8 LOAD NODE TO BE DELETED LMJ X11,DELANIMAL DELETE THE ANIMAL FROM THE TREE J MAINTCMD PROCESS NEXT COMMAND . NOTQUES F$MSG NOTQUEM EDIT 'NOT QUESTION' MESSAGE F$PRT 1 PRINT ERROR MESSAGE J MAINTCMD IGNORE THE COMMAND . . . DELETE QUESTION COMMAND (DQ) . DELQUES LMJ X11,FINDNODE LOCATE THE QUESTION TO BE DELETED TNZ M(NODELNK),X8 IS THE NODE A QUESTION ? J NOTQUES NO. GIVE ERROR MESSAGE F$MSG DELQASM ASK WHICH PATH USER WANTS TO TAKE LMJ X4,DECIDE GET THE USER'S ANSWER J DELQYES YES ANSWER. SAVE 'YES' LINK SUB TREE LA A2,M(NODENL),X8 LOAD SUB-TREE CHAINED OFF 'NO' LINK SZ M(NODENL),X8 MARK NO LINK SUBTREE REMOVED J DELQDTR GO REHOOK AND DELETE SUBTREE . DELQYES LA A2,M(NODEYL),X8 LOAD YES LINK SUBTREE SZ M(NODEYL),X8 MARK 'YES' SUBTREE REMOVED . DLQDTR LA A0,X8 LOAD ADDRESS OF QUESTION NODE TNE A0,BASENODE IS THIS THE BASE NODE ? J DLQBSN YES. PROCESS SPECIALLY LA A1,M(NODEBL),X8 LOAD LINK TO PREVIOUS QUESTION SA A1,M(NODEBL),A2 SET BACK LINK IN REMAINDER TNE A0,M(NODEYL),A1 WAS THIS OFF YES LINK ? SA A2,M(NODEYL),A1 YES. CHAIN SUBTREE TO YES LINK TNE A0,M(NODENL),A1 OR WAS IT OFF NO LINK OF PREDECESSOR ? SA A2,M(NODENL),A1 YES. ATTACH SUBTREE TO NO LINK DLQSTD LMJ X4,DELTREE DELETE THE SUBTREE NOT SELECTED J MAINTCMD RETURN FOR NEXT COMMAND . DLQBSN SA A2,BASENODE ATTACH SUBTREE AS BASE NODE SZ M(NODEBL),A2 MARK REMAINDER CHAIN WITH NO BACK LINK J DLQSTD GO DELETE THE OTHER SUBTREE . . . LIST TREE COMMAND (LT) . LISTREE PLINE$ 0 SKIP TO TOP OF PAGE F$MSG LTMTX EDIT LIST TREE HEADER MESSAGE F$FD1 FILELEVEL EDIT LEVEL OF MEMORY FILE F$FD1 FILELOCL EDIT LOCAL LEVEL OF MEMORY FILE F$MSGR . COPY TO LAST UPDATE TIME F$DAY1 LUPTIME EDIT DATE OF LAST UPDATE F$MSGR . COPY TO TIME F$TIME LUPTIME EDIT TIME OF LAST UPDATE F$MSGR . COPY TO UPDATE SERIAL NUMBER F$DECV NUPDATE EDIT NUMBER OF FILE UPDATES F$MSGR . COPY THE REST OF THE MESSAGE F$PRT 1 PRINT THE FILE LISTING HEADER, LINE 1. F$MSG LTMTX1 EDIT SECOND LINE OF FILE LIST HEADER F$DECV MEMLEN EDIT LENGTH OF MEMORY FILE F$MSGR . COPY TO BASE NODE F$DECV BASENODE EDIT ADDRESS OF ROOT NODE F$MSGR . COPY REST OF HEADER LINE F$PRT 1 PRINT SECOND LINE OF HEADER F$PRT 2 SKIP BEFORE COMMENCING NODE LISTING LX X5,M(NODEFL) LOAD LINK TO FIRST NODE . . EDIT NODES FROM THE TREE . LTNEXN TNZ X5 END OF NODES IN TREE ? J LTDONE YES. COMPLETE LISTING F$DECF 5,0,X5,U EDIT RELATIVE ADDRESS OF THIS NODE F$CHAR ':' EDIT A COLON AFTER IT F$SHIP 2 SKIP AFTER THE NODE ADDRESS LA A8,M(NODELEN),X5 LOAD LENGTH OF NODE TEXT LA,U A0,M(NODETEXT),X5 LOAD NODE TEXT LENGTH SA A0,A9 SAVE FOR POSSIBLE CONTINUATION LA A1,A8 LOAD LENGTH TO EDIT TG,U A1,A8+1 TOO MUCH TO FIT ON ALLOTTED SPACE LA,U A1,48 YES. TRIM TO FIELD LENGTH ANA A8,A1 DECREMENT LENGTH LEFT TO EDIT F$COPY . COPY UP TO 48 CHARACTERS TO LINE AA,U A9,8 INCREMENT ADDRESS FOR NEXT LINE F$COL 57 TAB TO LINKS COLUMN TNZ M(NODELNK),X5 IS THIS A LEAF NODE ? J LTZER1 YES. BLANK LINKS WHEN ZERO F$DECF 5,M(NODEYL),X5 EDIT THE YES LINK FROM NODE F$SKIP 1 SKIP BEFORE 'NO' LINK F$DECF 5,M(NODENL),X5 EDIT NO LINK FOR QUESTION NODE F$SKIP 1 SKIP AFTER THE NO LINK J LTLBL GO EDIT THE BACK (QUESTION) LINK . LTZERL F$SKIP 12 SKIP SPACE WHERE LINKS WENT LTLBL F$DECF 5,M(NODEBL),X5 EDIT QUESTION LINK FOR NODE F$SKIP 1 SKIP BEFORE NODEBITS FIELD TNZ M(NODEBITS),X5 ARE ALL STATUS BITS ZERO ? J LTNBZR YES. BLANK THE FIELD F$OCTF 6,M(NODEBITS),X5 EDIT THE NODE BITS F$SKIP 1 SKIP AFTER THE BITS J LTNBNZR GO EDIT THE REFERENCE COUNT . LTNBZR F$SKIP 7 SKIP NODE BITS FIELD LTNBNZR F$DECF 6,M(NODEREFC),X5 EDIT REFERENCE COUNT FOR NODE F$SKIP 1 SKIP AFTER REFERENCE COUNT F$COPY 6,M(NODEUID),X5 EDIT USERID OF NODE'S CREATOR F$SKIP 1 SKIP AFTER USERID F$COPY 12,M(NODEAC),X5 EDIT ACCOUNT OF NODE'S CREATOR F$PRT 1 PRINT THE NODE LISTING LX X5,M(NODEFL),X5 ADVANCE TO NEXT NODE IN TREE LTBCTD JZ A8,LTNEXN EDIT NEXT NODE IF ALL TEXT EDITED . . EDIT CONTINUATION OF NODE TEXT TOO LONG TO FIT IN ONE . LINE OF STANDARD NODE LISTING. AS MANY CONTINUATION . LINES AS ARE REQUIRED WILL BE EDITED. . F$SKIP 9 SKIP THE NODE ADDRESS FIELD F$FD1 ('...') INDICATE THIS IS A CONTINUATION LA A0,A9 LOAD ADDRESS OF NODE TEXT LA A1,A8 LOAD CHARACTERS LEFT TO EDIT TG,U A1,48+1 STILL TOO MUCH TO FIT ? LA,U A1,48 YES. LIMIT TO FIELD SIZE ANA A8,A1 COMPUTE CHARACTERS LEFT TO EDIT AA,U A9,8 ADVANCE ADDRESS OF TEXT F$COPY . COPY TEXT DATE INTO CONTINUATION F$PRT 1 PRINT CONTINUATION TEXT J LTBCTD EDIT MORE CONTINUATIONS IF NEEDED . . TREE LISTING COMPLETE . LTDONE PLINE$ 0 EJECT PAGE AT END OF LISTING J MAINTCMD GO GET ANOTHER COMMAND . . . LOCATE A NODE FOR MAINTENANCE . . THE USER PLAYS THE GAME. UPON REACHING THE DESIRED NODE, . HE ANSWERS 'THAT'S IT' TO THE QUESTION. . FINDNODE SX X11,R5 SAVE RETURN ADDRESS FROM FINDNODE J RESTART GO LOOK FOR THE NODE . . . EDIT RELATIVE ADDRESS OF NODE . . LX,U X8,<RELATIVE ADDRESS OF NODE> . LMJ X4,RELADR . RELADR F$CHAR '[' EDIT A LEFT BRACKET F$DECV 0,X8,U EDIT THE RELATIVE ADDRESS F$CHAR ']' EDIT THE CLOSING BRACKET F$SKIP 1 SKIP AFTER THE BRACKET J 0,X4 RETURN TO CALLER . OFF MAINTENANCE /. . . MEMORY BUFFER DEFINITION . . THIS STRUCTURE MUST CONTAIN ALL INFORMATION TO BE REMEMBERED . FROM EXECUTION TO EXECUTION. THE HEADING OF THIS FILE IS READ . IN EACH TIME TO RETRIEVE THE CURRENT STATE OF THE MEMORY FILE. . P PROC *3 YES,NO LEN BACKLINK,BITS NODE* NAME 0 ND$*(A(0)) EQU $-MEMORY SAVE NODE INDEX AND ADDRESS A*(0) EQU A(0)+1 UPDATE NODE COUNT * EQU $-MEMORY MAKE TAG RELATIVE * P(1,1),P(1,2) YES AND NO LINKS F1 FORM 6,12,18 F1 P(2,1) LENGTH IN CHARACTERS * P(3,1),P(3,2) BACKLINK AND BITS * ND$(A(0)-2),ND$(A(0)) FORWARD AND BACK LINKS '*ORIG*' ORIGINAL NODE 'INSTALLATION' INSTALLED AT START END A(0) EQU 0 RESET NODE COUNT TO ZERO $(4). MEMORY . 'ANIMAL' SENTINEL MEMLEN * MEML MEMORY LENGTH IN WORDS BASENODE * LAND BASE NODE ADDRESS NODECHAIN * ND$(ND$-1),ND$(0) LINKED LIST OF NODES FILELEVEL * LEVEL LEVEL OF MEMORY FILE FILELOCL * LOCLVL MEMORY FILE LOCAL LEVEL LUPTIME * $-$ TIME AND DATE OF LAST UPDATE (TDATE$) NUPDATE * 0 NUMBER OF FILE UPDATES . RES 28-($-MEMORY) ADJUST TO SECTOR BOUNDARY . . ORIGINAL TREE (FOR INSTALLATION) . LAND NODE HORSE,WHALE 24 0 'DOES IT LIVE ON THE LAND' HORSE NODE 0,0 7 LAND 'A HORSE' WHALE NODE 0,0 7 LAND 'A WHALE' . MEML EQU $-MEMORY /. . . DATA AREA . $(2). . SIGNON 'THINK OF AN ANIMAL.%' SIGNL EQU $-SIGNON SIGNON1 'I WILL ASK QUESTIONS AND TRY TO GUESS YOUR ANIMAL.%' SIGNL1 EQU $-SIGNON1 LATEM 'WE''VE GOT PROBLEMS. PLEASE TRY AGAIN LATER.%' LATEL EQU $-LATEM EOFAM 'THANK YOU, PLEASE PLAY AGAIN SOON.%' EOFAL EQU $-EOFAM MUYM 'MAKE UP YOUR MIND.' MUYML EQU $-MUYM . ISIT 'IS IT &' . P PROC 1 QCP* NAME 0 * P(1),P(1,1) I DO P(1)-1 , * 0,P(1,I+1) END . WHATANI QCP WHT1,WHT2,WHT3,WHT4 WHT1 'WHAT WAS THE ANIMAL&' WHT2 'WHAT ANIMAL WERE YOU THINKING OF&' WHT3 'WHAT ANIMAL DID YOU HAVE IN MIND&' WHT4 'WELL THEN, WHAT IS IT&' . YORN QCP YRN1,YRN2 YRN1 'YES OR NO&' YRN2 'PLEASE ANSWER YES OR NO&' . PLAYAGAIN QCP PG1,PG2 PG1 'DO YOU WANT TO TRY ANOTHER ANIMAL&' PG2 'PLAY AGAIN' . BOTHWAYS QCP BTH1,BTH2 BTH1 'COULD YOU ANSWER EITHER WAY FOR &' BTH2 'COULD SAY EITHER YES OR NO FOR &' . SPECIFY QCP SPC1,SPC2,SPC3 SPC1 'BE SPECIFIC. WHAT KIND OF &' SPC2 'PLEASE BE MORE SPECIFIC. WHAT KIND OF &' SPC3 'WHAT KIND OF &' . ASKRIGHT QCP AKR1,SKR2 AKR1 'NO, GIVE ME A QUESTION LIKE ''DOES IT HAVE FUR?'':&' AKR2 'GIVE ME A YES OR NO QUESTION LINE ''DOES IT CLIMB TREES?'':&' . GMQ 'GIVE ME A QUESTION WHICH DISTINGUISHES & FROM &' HOWWDYA 'HOW WOULD YOU ANSWER THAT QUESTION FOR &' ON MAINTENANCE NEWANML QCP NWA1 NWA1 'WHAT IS THE REPLACEMENT ANIMAL&' RPLQUES QCP RPQ1 RPQ1 'REPLACEMENT QUESTION&' DELQASM 'ASSUMED ANSWER: YES OR NO&' MAINTSO 'ANIMAL & TREE MAINTENANCE PROCESSOR.&' ALSDEL 'ALSO DELETED: &' BADCMM 'ILLEGAL COMMAND.&' NOTANMM 'THAT ISN''T AN ANIMAL.&' NOTQUEM 'THAT ISN''T A QUESTION.&' LTMTX 'ANIMAL MEMORY TREE LEVEL & LAST UPDATED ON & AT & (UPDATE #&).&' LTMTX2 'MEMORY LENGTH: & WORDS. BASE NODE: &.&' ENDMM 'END TREE MAINTENANCE.&' ENDML EQU $-ENDMM OFF MAINTENANCE . IOP IO$PKT,R$ 'ANIMAL$' 28,MEMORY 0 IOPW IO$PKT,W$ 'ANIMAL$' MEML,MEMORY 0 . ASGMEM '@ASG,AG &' CREMEM '@ASG,CPV &' CREMEM1 ',F40///10000&' USEMEM '@USE ANIMAL$,&' FREEMEM '@FREE ANIMAL$ . ' ASGAQM '@ASG,AQGD &' . VOWELS * 'A' TABLE OF VOWELS * 'E' * 'I' * 'O' * 'U' VOWELL EQU $-VOWELS . . TABLE OF SENTENCE-BEGINNING SYNTAXES WHICH MAY BE . TRANSFORMED INTO AN EITHER/OR QUESTION. . CVPT 'CAN &&' 'DOES &' 'WILL &' 'MAY &&' CVPTL EQU $-CVPT . . TABLE OF AFFIRMATIVE-SOUNDING ANSWERS . YESL 'SURE' 'OF COU' OF COURSE 'OK' 'O.K.' 'ALL RI' ALL RIGHT 'SOMETI' SOMETIMES (TRICKY, HUH?) 'FREQUE' FREQUENTLY 'CERTAI' CERTAINLY 'SURELY' YESLL EQU $-YESL . . TABLE OF NEGATIVE-SOUNDING RESPONSES . NOL 'HARDLY' 'HELL N' HELL NO 'RARELY' NOLL EQU $-NOL . . TABLE OF COMMONLY-USED QUESTIONS BEGINNINGS WHICH ARE NOT . APPLICABLE FOR YES OR NO QUESTIONS. IF THE USER BEGINS . HIS QUESTION WITH ONE OF THESE, TELL HIM WHAT KIND OF A . QUESTION WE'RE LOOKING FOR. . PREFIX 'WHO' 'WHAT' 'WHEN' 'WHY' 'HOW' PREFXL EQU $-PREFIX . . TABLE OF VALID ARTICLES . ARTT * 'A' * 'AN' * 'THE' * 'LE' * 'LA' * 'UN' * 'UNE' * 'EL' * 'IL' ARTTL EQU $-ARTT . . COMMAND TABLE FOR MAINTENANCE MODE . ON MAINTENANCE TMPCT . MAINTENANCE MODE COMMAND TABLE * 'AB ',EOFANS AB: ABORT MAINTENANCE MODE * 'DA ',DELANML DA: DELETE ANIMAL * 'DQ ',DELQUES DQ: DELETE QUESTION * 'CA ',CHGANML CA: CHANGE ANIMAL * 'CQ ',CHGQUES CQ: CHANGE QUESTION * 'LT ',LISTREE LT: LIST MEMORY TREE * 'PL ',RESTART PL: PLAY A ROUND * 'END',RWOUT END: TERMINATE TREE MAINTENANCE TMPCTL EQU $-TMPCT OFF MAINTENANCE . GIGO * 0125,FL$ TREAD$ PACKET FOR STANDARD QUESTIONS * EOFANS,REPLY . REPLPK E$PKT 14,REPLY . HIGHCORE EQUF $,,H1 HIGHEST MEMORY ADDRESS AVAILABLE NOW UANLW EQUF $,,S4 LENGTH OF USER'S ANIMAL IN WORDS UANL EQUF $,,T3 (Q4) LENGTH OF USER'S ANIMAL IN CHARACTERS * LASTD$,0 . UQLW EQUF $,,S1 USER QUESTION LENGTH IN WORDS ON MAINTENANCE MAINT EQUF $,,S2 MAINTENANCE MODE FLAG OFF MAINTENANCE NEEDRBAL EQUF $,,S3 TREE NEEDS REBALANCING FLAG NEEDPACK EQUF $,,S4 TREE NEEDS CONDENSATION FLAG UQL EQUF $,,T3 (Q4) USER QUESTION LENGTH IN CHARACTERS * 0,0 . HIGHUSE EQUF $,,H1 HIGHEST ADDRESS IN USE UFIND EQUF $,,H2 WHERE USER'S ANIMAL WAS FOUND IN TREE * 0,0 . UANML RES 14 USER'S ANIMAL SAVE BUFFER USERID RES 1 USERID OF CALLING RUN ACCOUNT RES 2 ACCOUNT OF CALLING RUN UQUES RES 14 USER QUESTION BUFFER INFOR RES 56 INFOR TABLE BUFFER INFL EQU $-INFOR LENGTH OF INFOR TABLE REPLY RES 14 REPLY BUFFER FOR QUESTIONS . END BEGIN
UNIVAC has been, over the years, a registered trademark of Eckert-Mauchly Computer Corporation, Remington Rand Corporation, Sperry Rand Corporation, Sperry Corporation, and Unisys Corporation. FASTRAND is a trademark of Sperry Rand Corporation, since merged into Unisys Corporation.