.FUNCT THIS-IS-IT,OBJ ZERO? OBJ /TRUE EQUAL? PRSA,V?WALK \?ELS9 EQUAL? PRSO,OBJ /TRUE ?ELS9: EQUAL? OBJ,PROTAGONIST /TRUE EQUAL? OBJ,NOT-HERE-OBJECT,ME,GLOBAL-ROOM /TRUE FSET? OBJ,FEMALEBIT \?ELS11 SET 'P-HER-OBJECT,OBJ RETURN P-HER-OBJECT ?ELS11: FSET? OBJ,ACTORBIT \?ELS13 SET 'P-HIM-OBJECT,OBJ RETURN P-HIM-OBJECT ?ELS13: SET 'P-IT-OBJECT,OBJ RETURN P-IT-OBJECT .FUNCT PARSER,PTR=P-LEXSTART,WRD,VAL=0,VERB=0,OMERGED,OWINNER,OLEN,LEN,DIR=0,NW=0,LW=0,CNT=-1,?TMP2,?TMP1 ?PRG1: IGRTR? 'CNT,P-ITBLLEN \?ELS5 JUMP ?REP2 ?ELS5: ZERO? P-OFLAG \?CND8 GET P-ITBL,CNT PUT P-OTBL,CNT,STACK ?CND8: PUT P-ITBL,CNT,0 JUMP ?PRG1 ?REP2: SET 'OMERGED,P-MERGED SET 'OWINNER,WINNER SET 'P-ADVERB,FALSE-VALUE SET 'P-MERGED,FALSE-VALUE SET 'P-END-ON-PREP,FALSE-VALUE PUT P-PRSO,P-MATCHLEN,0 PUT P-PRSI,P-MATCHLEN,0 PUT P-BUTS,P-MATCHLEN,0 ZERO? QUOTE-FLAG \?CND11 EQUAL? WINNER,PROTAGONIST /?CND11 SET 'WINNER,PROTAGONIST LOC WINNER FSET? STACK,VEHBIT /?CND16 LOC WINNER >HERE ?CND16: CALL LIT?,HERE >LIT ?CND11: ZERO? RESERVE-PTR /?ELS21 SET 'PTR,RESERVE-PTR CALL STUFF,P-LEXV,RESERVE-LEXV CALL INBUF-STUFF,P-INBUF,RESERVE-INBUF ZERO? VERBOSITY /?CND23 EQUAL? PROTAGONIST,WINNER \?CND23 CRLF ?CND23: SET 'RESERVE-PTR,FALSE-VALUE SET 'P-CONT,FALSE-VALUE JUMP ?CND19 ?ELS21: ZERO? P-CONT /?ELS29 SET 'PTR,P-CONT ZERO? VERBOSITY /?CND31 EQUAL? PROTAGONIST,WINNER \?CND31 CRLF ?CND31: SET 'P-CONT,FALSE-VALUE JUMP ?CND19 ?ELS29: SET 'WINNER,PROTAGONIST SET 'QUOTE-FLAG,FALSE-VALUE LOC WINNER FSET? STACK,VEHBIT /?CND38 LOC WINNER >HERE ?CND38: CALL LIT?,HERE >LIT ZERO? VERBOSITY /?CND41 CRLF ?CND41: PRINTI ">" READ P-INBUF,P-LEXV GETB P-LEXV,P-LEXWORDS >OLEN ?CND19: GETB P-LEXV,P-LEXWORDS >P-LEN ZERO? P-LEN \?ELS46 PRINTI "[Come again?]" CRLF RFALSE ?ELS46: GET P-LEXV,PTR EQUAL? STACK,W?OOPS \?ELS48 ADD PTR,P-LEXELEN GET P-LEXV,STACK EQUAL? STACK,W?PERIOD,W?COMMA \?CND49 ADD PTR,P-LEXELEN >PTR DEC 'P-LEN ?CND49: GRTR? P-LEN,1 /?ELS54 CALL CANT-USE-THAT-WAY,STR?6 RFALSE ?ELS54: GET OOPS-TABLE,O-PTR ZERO? STACK /?ELS56 GRTR? P-LEN,2 \?CND57 PRINTI "[Warning: Only the first word after OOPS is used.]" CRLF ?CND57: GET OOPS-TABLE,O-PTR >?TMP1 ADD PTR,P-LEXELEN GET P-LEXV,STACK PUT AGAIN-LEXV,?TMP1,STACK SET 'WINNER,OWINNER MUL PTR,P-LEXELEN ADD STACK,6 GETB P-LEXV,STACK >?TMP2 MUL PTR,P-LEXELEN ADD STACK,7 GETB P-LEXV,STACK >?TMP1 GET OOPS-TABLE,O-PTR MUL STACK,P-LEXELEN ADD STACK,3 CALL INBUF-ADD,?TMP2,?TMP1,STACK CALL STUFF,P-LEXV,AGAIN-LEXV GETB P-LEXV,P-LEXWORDS >P-LEN GET OOPS-TABLE,O-START >PTR CALL INBUF-STUFF,P-INBUF,OOPS-INBUF JUMP ?CND44 ?ELS56: PUT OOPS-TABLE,O-END,FALSE-VALUE PRINTI "[There was no word to replace!]" CRLF RFALSE ?ELS48: PUT OOPS-TABLE,O-END,FALSE-VALUE ?CND44: GET P-LEXV,PTR EQUAL? STACK,W?AGAIN,W?G \?ELS66 ZERO? P-OFLAG /?ELS69 CALL CANT-USE-THAT-WAY,STR?7 RFALSE ?ELS69: ZERO? P-WON \?ELS72 PRINTI "[That would just repeat a mistake!]" CRLF RFALSE ?ELS72: EQUAL? OWINNER,PROTAGONIST /?ELS74 CALL VISIBLE?,OWINNER ZERO? STACK \?ELS74 PRINTI "[" PRINT YOU-CANT PRINTI "see " CALL DPRINT,OWINNER PRINTI " any more.]" CRLF RFALSE ?ELS74: GRTR? P-LEN,1 \?ELS78 ADD PTR,P-LEXELEN GET P-LEXV,STACK EQUAL? STACK,W?PERIOD,W?COMMA,W?THEN /?THN82 ADD PTR,P-LEXELEN GET P-LEXV,STACK EQUAL? STACK,W?AND \?ELS81 ?THN82: MUL 2,P-LEXELEN ADD PTR,STACK >PTR GETB P-LEXV,P-LEXWORDS SUB STACK,2 PUTB P-LEXV,P-LEXWORDS,STACK JUMP ?CND67 ?ELS81: CALL RECOGNIZE RFALSE ?ELS78: ADD PTR,P-LEXELEN >PTR GETB P-LEXV,P-LEXWORDS SUB STACK,1 PUTB P-LEXV,P-LEXWORDS,STACK ?CND67: GETB P-LEXV,P-LEXWORDS GRTR? STACK,0 \?ELS90 CALL STUFF,RESERVE-LEXV,P-LEXV CALL INBUF-STUFF,RESERVE-INBUF,P-INBUF SET 'RESERVE-PTR,PTR JUMP ?CND88 ?ELS90: SET 'RESERVE-PTR,FALSE-VALUE ?CND88: SET 'WINNER,OWINNER SET 'P-MERGED,OMERGED CALL INBUF-STUFF,P-INBUF,OOPS-INBUF CALL STUFF,P-LEXV,AGAIN-LEXV SET 'CNT,-1 SET 'DIR,AGAIN-DIR ?PRG93: IGRTR? 'CNT,P-ITBLLEN \?ELS97 JUMP ?CND64 ?ELS97: GET P-OTBL,CNT PUT P-ITBL,CNT,STACK JUMP ?PRG93 ?ELS66: CALL STUFF,AGAIN-LEXV,P-LEXV CALL INBUF-STUFF,OOPS-INBUF,P-INBUF PUT OOPS-TABLE,O-START,PTR MUL 4,P-LEN PUT OOPS-TABLE,O-LENGTH,STACK GETB P-LEXV,P-LEXWORDS MUL P-LEXELEN,STACK ADD PTR,STACK MUL 2,STACK >LEN SUB LEN,1 GETB P-LEXV,STACK >?TMP1 SUB LEN,2 GETB P-LEXV,STACK ADD ?TMP1,STACK PUT OOPS-TABLE,O-END,STACK SET 'RESERVE-PTR,FALSE-VALUE SET 'LEN,P-LEN SET 'P-NCN,0 SET 'P-GETFLAGS,0 ?PRG102: DLESS? 'P-LEN,0 \?ELS106 SET 'QUOTE-FLAG,FALSE-VALUE JUMP ?CND64 ?ELS106: GET P-LEXV,PTR >WRD CALL NAUGHTY-WORD?,WRD ZERO? STACK \FALSE GET P-LEXV,PTR >WRD ZERO? WRD \?THN111 CALL NUMBER?,PTR >WRD ZERO? WRD /?ELS110 ?THN111: CALL NEXT-WORD,PTR >NW EQUAL? WRD,W?TO \?ELS115 EQUAL? VERB,ACT?TELL,ACT?ASK \?ELS115 CALL WT?,NW,PS?VERB,P1?VERB ZERO? STACK /?ELS115 PUT P-ITBL,P-VERB,ACT?TELL SET 'WRD,W?QUOTE JUMP ?CND113 ?ELS115: EQUAL? WRD,W?THEN \?CND113 GRTR? P-LEN,0 \?CND113 ZERO? VERB \?CND113 ZERO? QUOTE-FLAG \?CND113 PUT P-ITBL,P-VERB,ACT?TELL PUT P-ITBL,P-VERBN,0 SET 'WRD,W?QUOTE ?CND113: EQUAL? WRD,W?THEN,W?PERIOD /?THN125 EQUAL? WRD,W?QUOTE \?ELS124 ?THN125: EQUAL? WRD,W?QUOTE \?CND127 ZERO? QUOTE-FLAG /?ELS132 SET 'QUOTE-FLAG,FALSE-VALUE JUMP ?CND127 ?ELS132: SET 'QUOTE-FLAG,TRUE-VALUE ?CND127: ZERO? P-LEN /?THN136 ADD PTR,P-LEXELEN >P-CONT ?THN136: PUTB P-LEXV,P-LEXWORDS,P-LEN JUMP ?CND64 ?ELS124: CALL WT?,WRD,PS?DIRECTION,P1?DIRECTION >VAL ZERO? VAL /?ELS139 EQUAL? VERB,FALSE-VALUE,ACT?WALK,ACT?GO \?ELS139 EQUAL? LEN,1 /?THN142 EQUAL? LEN,2 \?ELS145 EQUAL? VERB,ACT?WALK,ACT?GO /?THN142 ?ELS145: EQUAL? NW,W?THEN,W?PERIOD,W?QUOTE \?ELS147 LESS? LEN,2 \?THN142 ?ELS147: ZERO? QUOTE-FLAG /?ELS149 EQUAL? LEN,2 \?ELS149 EQUAL? NW,W?QUOTE /?THN142 ?ELS149: GRTR? LEN,2 \?ELS139 EQUAL? NW,W?COMMA,W?AND \?ELS139 ?THN142: SET 'DIR,VAL EQUAL? NW,W?COMMA,W?AND \?CND152 ADD PTR,P-LEXELEN CALL CHANGE-LEXV,STACK,W?THEN ?CND152: GRTR? LEN,2 /?CND104 SET 'QUOTE-FLAG,FALSE-VALUE JUMP ?CND64 ?ELS139: CALL WT?,WRD,PS?VERB,P1?VERB >VAL ZERO? VAL /?ELS159 ZERO? VERB \?ELS159 SET 'P-PRSA-WORD,WRD SET 'VERB,VAL PUT P-ITBL,P-VERB,VAL PUT P-ITBL,P-VERBN,P-VTBL PUT P-VTBL,0,WRD MUL PTR,2 ADD STACK,2 >CNT GETB P-LEXV,CNT PUTB P-VTBL,2,STACK ADD CNT,1 GETB P-LEXV,STACK PUTB P-VTBL,3,STACK JUMP ?CND104 ?ELS159: CALL WT?,WRD,PS?PREPOSITION,0 >VAL ZERO? VAL \?THN164 EQUAL? WRD,W?ALL,W?ONE,W?BOTH /?THN168 EQUAL? WRD,W?EVERYT /?THN168 CALL WT?,WRD,PS?ADJECTIVE ZERO? STACK \?THN168 CALL WT?,WRD,PS?OBJECT ZERO? STACK /?ELS163 ?THN168: SET 'VAL,0 \?ELS163 ?THN164: ZERO? VAL /?CND170 EQUAL? WRD,W?BACK \?CND170 EQUAL? VERB,ACT?HAND /?CND170 SET 'VAL,0 ?CND170: GRTR? P-LEN,0 \?ELS177 EQUAL? NW,W?OF \?ELS177 ZERO? VAL \?ELS177 EQUAL? WRD,W?ALL,W?ONE,W?A /?ELS177 EQUAL? WRD,W?BOTH,W?EVERYT /?ELS177 JUMP ?CND104 ?ELS177: ZERO? VAL /?ELS181 ZERO? P-LEN /?THN184 EQUAL? NW,W?THEN,W?PERIOD \?ELS181 ?THN184: SET 'P-END-ON-PREP,TRUE-VALUE LESS? P-NCN,2 \?CND104 PUT P-ITBL,P-PREP1,VAL PUT P-ITBL,P-PREP1N,WRD JUMP ?CND104 ?ELS181: EQUAL? P-NCN,2 \?ELS190 PRINTI "[There were too many nouns in that sentence.]" CRLF RFALSE ?ELS190: INC 'P-NCN CALL CLAUSE,PTR,VAL,WRD >PTR ZERO? PTR /FALSE LESS? PTR,0 \?CND104 SET 'QUOTE-FLAG,FALSE-VALUE JUMP ?CND64 ?ELS163: CALL WT?,WRD,PS?BUZZ-WORD ZERO? STACK /?ELS199 JUMP ?CND104 ?ELS199: EQUAL? VERB,ACT?TELL \?ELS201 CALL WT?,WRD,PS?VERB,P1?VERB ZERO? STACK /?ELS201 EQUAL? WINNER,PROTAGONIST \?ELS201 CALL SEE-MANUAL,STR?8 RFALSE ?ELS201: CALL CANT-USE,PTR RFALSE ?ELS110: CALL UNKNOWN-WORD,PTR RFALSE ?CND104: SET 'LW,WRD ADD PTR,P-LEXELEN >PTR JUMP ?PRG102 ?CND64: PUT OOPS-TABLE,O-PTR,FALSE-VALUE ZERO? DIR /?CND208 SET 'PRSA,V?WALK SET 'PRSO,DIR SET 'P-OFLAG,FALSE-VALUE SET 'P-WALK-DIR,DIR SET 'AGAIN-DIR,DIR RETURN TRUE-VALUE ?CND208: SET 'P-WALK-DIR,FALSE-VALUE SET 'AGAIN-DIR,FALSE-VALUE ZERO? P-OFLAG /?CND212 CALL ORPHAN-MERGE ?CND212: CALL SYNTAX-CHECK ZERO? STACK /FALSE CALL SNARF-OBJECTS ZERO? STACK /FALSE CALL MANY-CHECK ZERO? STACK /FALSE CALL TAKE-CHECK ZERO? STACK /FALSE RTRUE .FUNCT CHANGE-LEXV,PTR,WRD,PTRS?=0,X,Y,Z ZERO? PTRS? /?CND1 SUB PTR,P-LEXELEN MUL 2,STACK ADD 2,STACK >X GETB P-LEXV,X >Y MUL 2,PTR ADD 2,STACK >Z PUTB P-LEXV,Z,Y PUTB AGAIN-LEXV,Z,Y ADD 1,X GETB P-LEXV,STACK >Y MUL 2,PTR ADD 3,STACK >Z PUTB P-LEXV,Z,Y PUTB AGAIN-LEXV,Z,Y ?CND1: PUT P-LEXV,PTR,WRD PUT AGAIN-LEXV,PTR,WRD RTRUE .FUNCT STUFF,DEST,SRC,MAX=29,PTR=P-LEXSTART,CTR=1,BPTR GETB SRC,0 PUTB DEST,0,STACK GETB SRC,1 PUTB DEST,1,STACK ?PRG1: GET SRC,PTR PUT DEST,PTR,STACK MUL PTR,2 ADD STACK,2 >BPTR GETB SRC,BPTR PUTB DEST,BPTR,STACK MUL PTR,2 ADD STACK,3 >BPTR GETB SRC,BPTR PUTB DEST,BPTR,STACK ADD PTR,P-LEXELEN >PTR IGRTR? 'CTR,MAX \?PRG1 RTRUE .FUNCT INBUF-STUFF,DEST,SRC,CNT=-1 ?PRG1: IGRTR? 'CNT,P-INBUF-LENGTH /TRUE GETB SRC,CNT PUTB DEST,CNT,STACK JUMP ?PRG1 .FUNCT INBUF-ADD,LEN,BEG,SLOT,DBEG,CTR=0,TMP,?TMP1 GET OOPS-TABLE,O-END >TMP ZERO? TMP /?ELS3 SET 'DBEG,TMP JUMP ?CND1 ?ELS3: GET OOPS-TABLE,O-LENGTH >TMP GETB AGAIN-LEXV,TMP >?TMP1 ADD TMP,1 GETB AGAIN-LEXV,STACK ADD ?TMP1,STACK >DBEG ?CND1: ADD DBEG,LEN PUT OOPS-TABLE,O-END,STACK ?PRG6: ADD DBEG,CTR >?TMP1 ADD BEG,CTR GETB P-INBUF,STACK PUTB OOPS-INBUF,?TMP1,STACK INC 'CTR EQUAL? CTR,LEN \?PRG6 PUTB AGAIN-LEXV,SLOT,DBEG SUB SLOT,1 PUTB AGAIN-LEXV,STACK,LEN RTRUE .FUNCT WT?,PTR,BIT,B1=5,OFFS=P-P1OFF,TYP GETB PTR,P-PSOFF >TYP BTST TYP,BIT \FALSE GRTR? B1,4 /TRUE EQUAL? BIT,PS?OBJECT /TRUE BAND TYP,P-P1BITS >TYP EQUAL? TYP,B1 /?CND15 INC 'OFFS ?CND15: GETB PTR,OFFS RSTACK .FUNCT NEXT-WORD,PTR,NW ZERO? P-LEN /FALSE ADD PTR,P-LEXELEN GET P-LEXV,STACK >NW ZERO? NW /?ELS10 RETURN NW ?ELS10: ADD PTR,P-LEXELEN CALL NUMBER?,STACK RSTACK .FUNCT CLAUSE,PTR,VAL,WRD,OFF,NUM,ANDFLG=0,FIRST??=1,NW,LW=0,?TMP1 SUB P-NCN,1 MUL STACK,2 >OFF ZERO? VAL /?ELS3 ADD P-PREP1,OFF >NUM PUT P-ITBL,NUM,VAL ADD NUM,1 PUT P-ITBL,STACK,WRD ADD PTR,P-LEXELEN >PTR JUMP ?CND1 ?ELS3: INC 'P-LEN ?CND1: ZERO? P-LEN \?CND6 DEC 'P-NCN RETURN -1 ?CND6: ADD P-NC1,OFF >NUM MUL PTR,2 ADD P-LEXV,STACK PUT P-ITBL,NUM,STACK ?PRG9: DLESS? 'P-LEN,0 \?CND11 ADD NUM,1 >?TMP1 MUL PTR,2 ADD P-LEXV,STACK PUT P-ITBL,?TMP1,STACK RETURN -1 ?CND11: GET P-LEXV,PTR >WRD CALL NAUGHTY-WORD?,WRD ZERO? STACK \FALSE ZERO? WRD \?THN19 CALL NUMBER?,PTR >WRD ZERO? WRD /?ELS18 ?THN19: CALL NEXT-WORD,PTR >NW ZERO? FIRST?? /?ELS23 EQUAL? WRD,W?THE,W?A,W?AN /?THN26 ZERO? VAL /?ELS23 CALL WT?,WRD,PS?PREPOSITION ZERO? STACK /?ELS23 CALL WT?,WRD,PS?ADJECTIVE ZERO? STACK \?ELS23 ?THN26: GET P-ITBL,NUM ADD STACK,4 PUT P-ITBL,NUM,STACK JUMP ?CND14 ?ELS23: EQUAL? WRD,W?AND,W?COMMA \?ELS31 SET 'ANDFLG,TRUE-VALUE JUMP ?CND14 ?ELS31: EQUAL? WRD,W?ALL,W?ONE,W?BOTH /?THN34 EQUAL? WRD,W?EVERYT \?ELS33 ?THN34: EQUAL? NW,W?OF \?CND14 DEC 'P-LEN ADD PTR,P-LEXELEN >PTR JUMP ?CND14 ?ELS33: EQUAL? WRD,W?THEN,W?PERIOD /?THN41 CALL WT?,WRD,PS?PREPOSITION ZERO? STACK /?ELS40 GET P-ITBL,P-VERB ZERO? STACK /?ELS40 ZERO? FIRST?? \?ELS40 ?THN41: INC 'P-LEN ADD NUM,1 >?TMP1 MUL PTR,2 ADD P-LEXV,STACK PUT P-ITBL,?TMP1,STACK SUB PTR,P-LEXELEN RSTACK ?ELS40: ZERO? ANDFLG /?ELS46 GET P-ITBL,P-VERB ZERO? STACK \?ELS46 SUB PTR,4 >PTR ADD PTR,2 CALL CHANGE-LEXV,STACK,W?THEN ADD P-LEN,2 >P-LEN JUMP ?CND14 ?ELS46: CALL WT?,WRD,PS?OBJECT ZERO? STACK /?ELS50 GRTR? P-LEN,0 \?ELS53 EQUAL? NW,W?OF \?ELS53 EQUAL? WRD,W?ALL,W?EVERYT,W?ONE /?ELS53 JUMP ?CND14 ?ELS53: GET P-ITBL,P-VERB EQUAL? STACK,ACT?SHOW,ACT?HAND,ACT?FEED \?ELS57 EQUAL? WRD,W?HER \?ELS57 EQUAL? NW,W?SWORD \?ELS57 JUMP ?CND14 ?ELS57: CALL WT?,WRD,PS?ADJECTIVE,P1?ADJECTIVE ZERO? STACK /?ELS61 ZERO? NW /?ELS61 EQUAL? NW,W?HIS,W?HER,W?MY /?ELS61 CALL WT?,NW,PS?OBJECT ZERO? STACK \?THN64 CALL WT?,NW,PS?ADJECTIVE ZERO? STACK /?ELS61 ?THN64: GET P-ITBL,P-VERB EQUAL? STACK,ACT?SHOW,ACT?HAND,ACT?FEED /?ELS61 JUMP ?CND14 ?ELS61: ZERO? ANDFLG \?ELS67 EQUAL? NW,W?BUT,W?EXCEPT /?ELS67 EQUAL? NW,W?AND,W?COMMA /?ELS67 ADD NUM,1 >?TMP1 ADD PTR,2 MUL STACK,2 ADD P-LEXV,STACK PUT P-ITBL,?TMP1,STACK RETURN PTR ?ELS67: SET 'ANDFLG,FALSE-VALUE JUMP ?CND14 ?ELS50: CALL WT?,WRD,PS?ADJECTIVE ZERO? STACK \?CND14 CALL WT?,WRD,PS?BUZZ-WORD ZERO? STACK /?ELS73 JUMP ?CND14 ?ELS73: CALL WT?,WRD,PS?PREPOSITION ZERO? STACK /?ELS77 JUMP ?CND14 ?ELS77: CALL CANT-USE,PTR RFALSE ?ELS18: CALL UNKNOWN-WORD,PTR RFALSE ?CND14: SET 'LW,WRD SET 'FIRST??,FALSE-VALUE ADD PTR,P-LEXELEN >PTR JUMP ?PRG9 .FUNCT NUMBER?,PTR,CNT,BPTR,CHR,SUM=0,CCTR,TMP,XPTR,?TMP1 MUL PTR,2 ADD P-LEXV,STACK GETB STACK,2 >CNT MUL PTR,2 ADD P-LEXV,STACK GETB STACK,3 >BPTR ?PRG1: GRTR? SUM,10000 /FALSE DLESS? 'CNT,0 \?ELS7 JUMP ?REP2 ?ELS7: GETB P-INBUF,BPTR >CHR LESS? CHR,58 \?ELS12 GRTR? CHR,47 \?ELS12 MUL SUM,10 >?TMP1 SUB CHR,48 ADD ?TMP1,STACK >SUM JUMP ?CND10 ?ELS12: EQUAL? CHR,35 \FALSE ?CND10: INC 'BPTR JUMP ?PRG1 ?REP2: CALL CHANGE-LEXV,PTR,W?NUMBER ADD PTR,P-LEXELEN GET P-LEXV,STACK EQUAL? STACK,W?COMMA \?CND17 GRTR? P-LEN,1 \?CND17 MUL P-LEXELEN,2 ADD PTR,STACK >XPTR CALL AFTER-COMMA-CHECK,XPTR >TMP ZERO? TMP /?CND17 MUL PTR,2 ADD STACK,2 GETB P-LEXV,STACK >CCTR MUL XPTR,2 ADD STACK,2 GETB P-LEXV,STACK ADD CCTR,STACK >CCTR INC 'CCTR MUL PTR,2 ADD STACK,2 PUTB P-LEXV,STACK,CCTR EQUAL? TMP,1000 \?CND25 SET 'TMP,0 ?CND25: MUL 1000,SUM ADD STACK,TMP >SUM SUB P-LEN,2 >CCTR ?PRG28: DLESS? 'CCTR,0 \?ELS32 JUMP ?REP29 ?ELS32: ADD PTR,P-LEXELEN >PTR MUL 2,P-LEXELEN ADD PTR,STACK >XPTR GET P-LEXV,XPTR CALL CHANGE-LEXV,PTR,STACK MUL PTR,2 ADD STACK,2 >?TMP1 MUL XPTR,2 ADD STACK,2 GETB P-LEXV,STACK PUTB P-LEXV,?TMP1,STACK MUL PTR,2 ADD STACK,3 >?TMP1 MUL XPTR,2 ADD STACK,3 GETB P-LEXV,STACK PUTB P-LEXV,?TMP1,STACK JUMP ?PRG28 ?REP29: SUB P-LEN,2 >P-LEN GETB P-LEXV,P-LEXWORDS SUB STACK,2 PUTB P-LEXV,P-LEXWORDS,STACK ?CND17: GRTR? SUM,10000 /FALSE SET 'P-NUMBER,SUM RETURN W?NUMBER .FUNCT AFTER-COMMA-CHECK,PTR,CNT,BPTR,CCTR=0,CHR,SUM=0,?TMP1 MUL PTR,2 ADD P-LEXV,STACK GETB STACK,2 >CNT MUL PTR,2 ADD P-LEXV,STACK GETB STACK,3 >BPTR ?PRG1: DLESS? 'CNT,0 \?ELS5 JUMP ?REP2 ?ELS5: GETB P-INBUF,BPTR >CHR INC 'CCTR GRTR? CCTR,3 \?ELS10 JUMP ?REP2 ?ELS10: LESS? CHR,58 \FALSE GRTR? CHR,47 \FALSE MUL SUM,10 >?TMP1 SUB CHR,48 ADD ?TMP1,STACK >SUM ?CND8: INC 'BPTR JUMP ?PRG1 ?REP2: EQUAL? CCTR,3 \FALSE ZERO? SUM \?ELS23 RETURN 1000 ?ELS23: RETURN SUM .FUNCT ORPHAN-MERGE,CNT=-1,TEMP,VERB,BEG,END,ADJ=0,WRD,?TMP1 SET 'P-OFLAG,FALSE-VALUE GET P-ITBL,P-VERBN GET STACK,0 >WRD CALL WT?,WRD,PS?VERB,P1?VERB >?TMP1 GET P-OTBL,P-VERB EQUAL? ?TMP1,STACK /?THN4 CALL WT?,WRD,PS?ADJECTIVE ZERO? STACK /?ELS3 ?THN4: SET 'ADJ,TRUE-VALUE JUMP ?CND1 ?ELS3: CALL WT?,WRD,PS?OBJECT,P1?OBJECT ZERO? STACK /?CND1 ZERO? P-NCN \?CND1 PUT P-ITBL,P-VERB,0 PUT P-ITBL,P-VERBN,0 ADD P-LEXV,2 PUT P-ITBL,P-NC1,STACK ADD P-LEXV,6 PUT P-ITBL,P-NC1L,STACK SET 'P-NCN,1 ?CND1: GET P-ITBL,P-VERB >VERB ZERO? VERB /?ELS12 ZERO? ADJ \?ELS12 GET P-OTBL,P-VERB EQUAL? VERB,STACK \FALSE ?ELS12: EQUAL? P-NCN,2 /FALSE GET P-OTBL,P-NC1 EQUAL? STACK,1 \?ELS18 GET P-ITBL,P-PREP1 >TEMP GET P-OTBL,P-PREP1 EQUAL? TEMP,STACK /?THN22 ZERO? TEMP \FALSE ?THN22: ZERO? ADJ /?ELS26 ADD P-LEXV,2 PUT P-OTBL,P-NC1,STACK GET P-ITBL,P-NC1L ZERO? STACK \?CND28 ADD P-LEXV,6 PUT P-ITBL,P-NC1L,STACK ?CND28: ZERO? P-NCN \?CND24 SET 'P-NCN,1 JUMP ?CND24 ?ELS26: GET P-ITBL,P-NC1 PUT P-OTBL,P-NC1,STACK ?CND24: GET P-ITBL,P-NC1L PUT P-OTBL,P-NC1L,STACK JUMP ?CND10 ?ELS18: GET P-OTBL,P-NC2 EQUAL? STACK,1 \?ELS39 GET P-ITBL,P-PREP1 >TEMP GET P-OTBL,P-PREP2 EQUAL? TEMP,STACK /?THN43 ZERO? TEMP \FALSE ?THN43: ZERO? ADJ /?CND45 ADD P-LEXV,2 PUT P-ITBL,P-NC1,STACK GET P-ITBL,P-NC1L ZERO? STACK \?CND45 ADD P-LEXV,6 PUT P-ITBL,P-NC1L,STACK ?CND45: GET P-ITBL,P-NC1 PUT P-OTBL,P-NC2,STACK GET P-ITBL,P-NC1L PUT P-OTBL,P-NC2L,STACK SET 'P-NCN,2 JUMP ?CND10 ?ELS39: ZERO? P-ACLAUSE /?CND10 EQUAL? P-NCN,1 /?ELS59 ZERO? ADJ \?ELS59 SET 'P-ACLAUSE,FALSE-VALUE RFALSE ?ELS59: GET P-ITBL,P-NC1 >BEG ZERO? ADJ /?CND64 ADD P-LEXV,2 >BEG SET 'ADJ,FALSE-VALUE ?CND64: GET P-ITBL,P-NC1L >END ?PRG68: GET BEG,0 >WRD EQUAL? BEG,END \?ELS72 ZERO? ADJ /?ELS75 CALL CLAUSE-WIN,ADJ JUMP ?CND57 ?ELS75: SET 'P-ACLAUSE,FALSE-VALUE RFALSE ?ELS72: EQUAL? WRD,W?ALL,W?EVERYT,W?ONE /?THN81 GETB WRD,P-PSOFF BTST STACK,PS?ADJECTIVE \?ELS80 CALL ADJ-CHECK,WRD,ADJ,ADJ ZERO? STACK /?ELS80 ?THN81: SET 'ADJ,WRD JUMP ?CND70 ?ELS80: EQUAL? WRD,W?ONE \?ELS86 CALL CLAUSE-WIN,ADJ JUMP ?CND57 ?ELS86: GETB WRD,P-PSOFF BTST STACK,PS?OBJECT \?CND70 EQUAL? WRD,P-ANAM \?ELS91 CALL CLAUSE-WIN,ADJ JUMP ?CND10 ?ELS91: CALL CLAUSE-WIN JUMP ?CND10 ?CND70: ADD BEG,P-WORDLEN >BEG ZERO? END \?PRG68 SET 'END,BEG SET 'P-NCN,1 SUB BEG,4 PUT P-ITBL,P-NC1,STACK PUT P-ITBL,P-NC1L,BEG JUMP ?PRG68 ?CND57: ?CND10: GET P-OVTBL,0 PUT P-VTBL,0,STACK GETB P-OVTBL,2 PUTB P-VTBL,2,STACK GETB P-OVTBL,3 PUTB P-VTBL,3,STACK PUT P-OTBL,P-VERBN,P-VTBL PUTB P-VTBL,2,0 ?PRG97: IGRTR? 'CNT,P-ITBLLEN \?ELS101 SET 'P-MERGED,TRUE-VALUE RTRUE ?ELS101: GET P-OTBL,CNT PUT P-ITBL,CNT,STACK JUMP ?PRG97 .FUNCT CLAUSE-WIN,ADJ=0 ZERO? ADJ /?ELS3 GET P-OTBL,P-VERB PUT P-ITBL,P-VERB,STACK JUMP ?CND1 ?ELS3: SET 'ADJ,TRUE-VALUE ?CND1: PUT P-CCTBL,CC-SBPTR,P-ACLAUSE ADD P-ACLAUSE,1 PUT P-CCTBL,CC-SEPTR,STACK EQUAL? P-ACLAUSE,P-NC1 \?ELS9 PUT P-CCTBL,CC-OCLAUSE,P-OCL1 JUMP ?CND7 ?ELS9: PUT P-CCTBL,CC-OCLAUSE,P-OCL2 ?CND7: CALL CLAUSE-COPY,P-OTBL,P-OTBL,ADJ GET P-OTBL,P-NC2 ZERO? STACK /?ELS13 SET 'P-NCN,2 ?ELS13: SET 'P-ACLAUSE,FALSE-VALUE RTRUE .FUNCT WORD-PRINT,CNT,BUF ?PRG1: DLESS? 'CNT,0 /TRUE GETB P-INBUF,BUF PRINTC STACK INC 'BUF JUMP ?PRG1 .FUNCT UNKNOWN-WORD,PTR,BUF,?TMP1 PUT OOPS-TABLE,O-PTR,PTR PRINTI "[I don't know the word """ MUL PTR,2 >BUF ADD P-LEXV,BUF GETB STACK,2 >?TMP1 ADD P-LEXV,BUF GETB STACK,3 CALL WORD-PRINT,?TMP1,STACK PRINTI ".""]" CRLF SET 'QUOTE-FLAG,FALSE-VALUE SET 'P-OFLAG,FALSE-VALUE RETURN P-OFLAG .FUNCT CANT-USE,PTR,FOR-EACH-OTHER=0,BUF,?TMP1 PRINTI "[You used the word """ ZERO? FOR-EACH-OTHER /?ELS3 EQUAL? PTR,W?EACH \?ELS7 PRINTI "each" JUMP ?CND1 ?ELS7: PRINTI "other" JUMP ?CND1 ?ELS3: MUL PTR,2 >BUF ADD P-LEXV,BUF GETB STACK,2 >?TMP1 ADD P-LEXV,BUF GETB STACK,3 CALL WORD-PRINT,?TMP1,STACK ?CND1: PRINTI """ in a way that I don't understand.]" CRLF CALL STOP RSTACK .FUNCT SYNTAX-CHECK,SYN,LEN,NUM,OBJ,DRIVE1=0,DRIVE2=0,PREP,VERB,?TMP2,?TMP1 GET P-ITBL,P-VERB >VERB ZERO? VERB \?CND1 PRINT NO-VERB RFALSE ?CND1: SUB 255,VERB GET VERBS,STACK >SYN GETB SYN,0 >LEN INC 'SYN ?PRG4: GETB SYN,P-SBITS BAND STACK,P-SONUMS >NUM GRTR? P-NCN,NUM \?ELS8 JUMP ?CND6 ?ELS8: LESS? NUM,1 /?ELS10 ZERO? P-NCN \?ELS10 GET P-ITBL,P-PREP1 >PREP ZERO? PREP /?THN13 GETB SYN,P-SPREP1 EQUAL? PREP,STACK \?ELS10 ?THN13: SET 'DRIVE1,SYN JUMP ?CND6 ?ELS10: GETB SYN,P-SPREP1 >?TMP1 GET P-ITBL,P-PREP1 EQUAL? ?TMP1,STACK \?CND6 EQUAL? NUM,2 \?ELS19 EQUAL? P-NCN,1 \?ELS19 SET 'DRIVE2,SYN JUMP ?CND6 ?ELS19: GETB SYN,P-SPREP2 >?TMP1 GET P-ITBL,P-PREP2 EQUAL? ?TMP1,STACK \?CND6 CALL SYNTAX-FOUND,SYN RTRUE ?CND6: DLESS? 'LEN,1 \?ELS26 ZERO? DRIVE1 \?REP5 ZERO? DRIVE2 /?ELS29 JUMP ?REP5 ?ELS29: CALL RECOGNIZE RFALSE ?ELS26: ADD SYN,P-SYNLEN >SYN JUMP ?PRG4 ?REP5: ZERO? DRIVE1 /?ELS40 GETB DRIVE1,P-SFWIM1 >?TMP2 GETB DRIVE1,P-SLOC1 >?TMP1 GETB DRIVE1,P-SPREP1 CALL GWIM,?TMP2,?TMP1,STACK >OBJ ZERO? OBJ /?ELS40 PUT P-PRSO,P-MATCHLEN,1 PUT P-PRSO,1,OBJ CALL SYNTAX-FOUND,DRIVE1 RSTACK ?ELS40: ZERO? DRIVE2 /?ELS44 GETB DRIVE2,P-SFWIM2 >?TMP2 GETB DRIVE2,P-SLOC2 >?TMP1 GETB DRIVE2,P-SPREP2 CALL GWIM,?TMP2,?TMP1,STACK >OBJ ZERO? OBJ /?ELS44 PUT P-PRSI,P-MATCHLEN,1 PUT P-PRSI,1,OBJ CALL SYNTAX-FOUND,DRIVE2 RSTACK ?ELS44: EQUAL? WINNER,PROTAGONIST \?ELS51 CALL ORPHAN,DRIVE1,DRIVE2 PRINTI "[Wh" JUMP ?CND49 ?ELS51: PRINTI "[Your command was not complete. Next time, type wh" ?CND49: EQUAL? VERB,ACT?WALK,ACT?GO \?ELS56 PRINTI "ere" JUMP ?CND54 ?ELS56: ZERO? DRIVE1 /?ELS62 GETB DRIVE1,P-SFWIM1 EQUAL? STACK,ACTORBIT /?THN59 ?ELS62: ZERO? DRIVE2 /?ELS58 GETB DRIVE2,P-SFWIM2 EQUAL? STACK,ACTORBIT \?ELS58 ?THN59: PRINTI "om" JUMP ?CND54 ?ELS58: PRINTI "at" ?CND54: EQUAL? WINNER,PROTAGONIST \?ELS69 PRINTI " do you want to " JUMP ?CND67 ?ELS69: PRINTI " you want" CALL TPRINT,WINNER PRINTI " to " ?CND67: CALL VERB-PRINT SET 'P-OFLAG,FALSE-VALUE ZERO? DRIVE2 /?CND72 SET 'PREP,P-MERGED SET 'P-MERGED,FALSE-VALUE CALL CLAUSE-PRINT,P-NC1,P-NC1L SET 'P-MERGED,PREP ?CND72: ZERO? DRIVE1 /?ELS80 GETB DRIVE1,P-SPREP1 JUMP ?CND76 ?ELS80: GETB DRIVE2,P-SPREP2 ?CND76: CALL PREP-PRINT,STACK EQUAL? WINNER,PROTAGONIST \?ELS86 SET 'P-OFLAG,TRUE-VALUE PRINTI "?]" CRLF RFALSE ?ELS86: SET 'P-OFLAG,FALSE-VALUE PRINTI ".]" CRLF RFALSE .FUNCT VERB-PRINT,TMP,?TMP1 GET P-ITBL,P-VERBN >TMP ZERO? TMP \?ELS5 PRINTI "tell" RTRUE ?ELS5: EQUAL? TMP,W?ZZMGCK \?ELS7 PRINTI "answer" RTRUE ?ELS7: GETB TMP,2 ZERO? STACK \?ELS9 GET TMP,0 PRINTB STACK RTRUE ?ELS9: GETB TMP,2 >?TMP1 GETB TMP,3 CALL WORD-PRINT,?TMP1,STACK PUTB TMP,2,0 RTRUE .FUNCT CANT-ORPHAN PRINTI """I don't understand! What are you referring to?""" CRLF RFALSE .FUNCT ORPHAN,D1,D2,CNT=-1 ZERO? P-MERGED \?CND1 PUT P-OCL1,P-MATCHLEN,0 PUT P-OCL2,P-MATCHLEN,0 ?CND1: GET P-VTBL,0 PUT P-OVTBL,0,STACK GETB P-VTBL,2 PUTB P-OVTBL,2,STACK GETB P-VTBL,3 PUTB P-OVTBL,3,STACK ?PRG4: IGRTR? 'CNT,P-ITBLLEN \?ELS8 JUMP ?REP5 ?ELS8: GET P-ITBL,CNT PUT P-OTBL,CNT,STACK JUMP ?PRG4 ?REP5: EQUAL? P-NCN,2 \?CND11 PUT P-CCTBL,CC-SBPTR,P-NC2 PUT P-CCTBL,CC-SEPTR,P-NC2L PUT P-CCTBL,CC-OCLAUSE,P-OCL2 CALL CLAUSE-COPY,P-ITBL,P-OTBL ?CND11: LESS? P-NCN,1 /?CND14 PUT P-CCTBL,CC-SBPTR,P-NC1 PUT P-CCTBL,CC-SEPTR,P-NC1L PUT P-CCTBL,CC-OCLAUSE,P-OCL1 CALL CLAUSE-COPY,P-ITBL,P-OTBL ?CND14: ZERO? D1 /?ELS21 GETB D1,P-SPREP1 PUT P-OTBL,P-PREP1,STACK PUT P-OTBL,P-NC1,1 RTRUE ?ELS21: ZERO? D2 /FALSE GETB D2,P-SPREP2 PUT P-OTBL,P-PREP2,STACK PUT P-OTBL,P-NC2,1 RTRUE .FUNCT CLAUSE-PRINT,BPTR,EPTR,THE?=1,?TMP1 GET P-ITBL,BPTR >?TMP1 GET P-ITBL,EPTR CALL BUFFER-PRINT,?TMP1,STACK,THE? RSTACK .FUNCT BUFFER-PRINT,BEG,END,CP,NOSP=0,WRD,FIRST??=1,PN=0,?TMP1 ?PRG1: EQUAL? BEG,END /TRUE ZERO? NOSP /?ELS10 SET 'NOSP,FALSE-VALUE JUMP ?CND8 ?ELS10: PRINTI " " ?CND8: GET BEG,0 >WRD EQUAL? WRD,W?PERIOD \?ELS16 SET 'NOSP,TRUE-VALUE JUMP ?CND3 ?ELS16: EQUAL? WRD,W?ME,W?MYSELF \?ELS18 PRINTD ME SET 'PN,TRUE-VALUE JUMP ?CND3 ?ELS18: CALL NAME?,WRD ZERO? STACK /?ELS20 CALL CAPITALIZE,BEG SET 'PN,TRUE-VALUE JUMP ?CND3 ?ELS20: ZERO? FIRST?? /?CND23 ZERO? PN \?CND23 ZERO? CP /?CND23 EQUAL? WRD,W?MY,W?HIS,W?HER /?CND23 PRINTI "the " ?CND23: ZERO? P-OFLAG \?THN31 ZERO? P-MERGED /?ELS30 ?THN31: PRINTB WRD JUMP ?CND28 ?ELS30: EQUAL? WRD,W?IT,W?THEM \?ELS34 CALL ACCESSIBLE?,P-IT-OBJECT ZERO? STACK /?ELS34 CALL DPRINT,P-IT-OBJECT JUMP ?CND28 ?ELS34: EQUAL? WRD,W?HIM,W?HIMSELF \?ELS38 CALL ACCESSIBLE?,P-HIM-OBJECT ZERO? STACK /?ELS38 CALL DPRINT,P-HIM-OBJECT JUMP ?CND28 ?ELS38: EQUAL? WRD,W?HER,W?HERSELF \?ELS42 CALL ACCESSIBLE?,P-HER-OBJECT ZERO? STACK /?ELS42 CALL DPRINT,P-HER-OBJECT JUMP ?CND28 ?ELS42: GETB BEG,2 >?TMP1 GETB BEG,3 CALL WORD-PRINT,?TMP1,STACK ?CND28: SET 'FIRST??,FALSE-VALUE ?CND3: ADD BEG,P-WORDLEN >BEG JUMP ?PRG1 .FUNCT NAME?,WRD EQUAL? WRD,W?TRENT,W?TIFFAN,W?TIFF /TRUE EQUAL? WRD,W?THETA,W?ELYSIA,W?ELYSIUM /TRUE EQUAL? WRD,W?MITRE,W?THORBAST,W?FORD /TRUE EQUAL? WRD,W?VENUS,W?CLEVELAND \FALSE RTRUE .FUNCT CAPITALIZE,PTR,?TMP1 ZERO? P-OFLAG \?THN6 ZERO? P-MERGED /?ELS5 ?THN6: GET PTR,0 PRINTB STACK RTRUE ?ELS5: GETB PTR,3 GETB P-INBUF,STACK SUB STACK,32 PRINTC STACK GETB PTR,2 SUB STACK,1 >?TMP1 GETB PTR,3 ADD STACK,1 CALL WORD-PRINT,?TMP1,STACK RSTACK .FUNCT PREP-PRINT,PREP,WRD ZERO? PREP /FALSE PRINTI " " EQUAL? PREP,PR?THROUGH \?ELS10 PRINTI "through" RTRUE ?ELS10: CALL PREP-FIND,PREP >WRD PRINTB WRD RTRUE .FUNCT CLAUSE-COPY,SRC,DEST,INSRT=0,OCL,BEG,END,BB,EE,OBEG,CNT,B,E GET P-CCTBL,CC-SBPTR >BB GET P-CCTBL,CC-SEPTR >EE GET P-CCTBL,CC-OCLAUSE >OCL GET SRC,BB >BEG GET SRC,EE >END GET OCL,P-MATCHLEN >OBEG ?PRG1: EQUAL? BEG,END \?CND3 JUMP ?REP2 ?CND3: ZERO? INSRT /?ELS8 GET BEG,0 EQUAL? P-ANAM,STACK \?ELS8 EQUAL? INSRT,TRUE-VALUE \?ELS13 GET P-ITBL,P-NC1 >B GET P-ITBL,P-NC1L >E ?PRG14: EQUAL? B,E \?CND16 JUMP ?CND6 ?CND16: GET B,0 CALL CLAUSE-ADD,STACK ADD B,P-WORDLEN >B JUMP ?PRG14 ?ELS13: GET OCL,1 EQUAL? INSRT,STACK /?CND6 CALL CLAUSE-ADD,INSRT GET BEG,0 CALL CLAUSE-ADD,STACK JUMP ?CND6 ?ELS8: GET BEG,0 CALL CLAUSE-ADD,STACK ?CND6: ADD BEG,P-WORDLEN >BEG JUMP ?PRG1 ?REP2: EQUAL? SRC,DEST \?CND23 GRTR? OBEG,0 \?CND23 GET OCL,P-MATCHLEN SUB STACK,OBEG >CNT PUT OCL,P-MATCHLEN,0 INC 'OBEG ?PRG28: GET OCL,OBEG CALL CLAUSE-ADD,STACK SUB CNT,2 >CNT ZERO? CNT \?CND30 JUMP ?REP29 ?CND30: ADD OBEG,2 >OBEG JUMP ?PRG28 ?REP29: SET 'OBEG,0 ?CND23: MUL OBEG,P-LEXELEN ADD STACK,2 ADD OCL,STACK PUT DEST,BB,STACK GET OCL,P-MATCHLEN MUL STACK,P-LEXELEN ADD STACK,2 ADD OCL,STACK PUT DEST,EE,STACK RTRUE .FUNCT CLAUSE-ADD,WRD,OCL,PTR GET P-CCTBL,CC-OCLAUSE >OCL GET OCL,P-MATCHLEN ADD STACK,2 >PTR SUB PTR,1 PUT OCL,STACK,WRD PUT OCL,PTR,0 PUT OCL,P-MATCHLEN,PTR RTRUE .FUNCT PREP-FIND,PREP,CNT=0,SIZE GET PREPOSITIONS,0 MUL STACK,2 >SIZE ?PRG1: IGRTR? 'CNT,SIZE /FALSE GET PREPOSITIONS,CNT EQUAL? STACK,PREP \?PRG1 SUB CNT,1 GET PREPOSITIONS,STACK RSTACK .FUNCT SYNTAX-FOUND,SYN SET 'P-SYNTAX,SYN GETB SYN,P-SACTION >PRSA RETURN PRSA .FUNCT GWIM,GBIT,LBIT,PREP,OBJ EQUAL? GBIT,RLANDBIT \?CND1 RETURN ROOMS ?CND1: SET 'P-GWIMBIT,GBIT SET 'P-SLOCBITS,LBIT PUT P-MERGE,P-MATCHLEN,0 CALL GET-OBJECT,P-MERGE,FALSE-VALUE ZERO? STACK /?ELS8 SET 'P-GWIMBIT,0 GET P-MERGE,P-MATCHLEN EQUAL? STACK,1 \FALSE GET P-MERGE,1 >OBJ PRINTI "[" ZERO? PREP /?CND14 ZERO? P-END-ON-PREP \?CND14 CALL PREP-FIND,PREP >PREP PRINTB PREP EQUAL? PREP,W?OUT \?CND19 PRINTI " of" ?CND19: FSET? OBJ,NARTICLEBIT /?ELS24 PRINTI " the " JUMP ?CND14 ?ELS24: PRINTI " " ?CND14: CALL DPRINT,OBJ PRINTI "]" CRLF RETURN OBJ ?ELS8: SET 'P-GWIMBIT,0 RFALSE .FUNCT SNARF-OBJECTS,PTR GET P-ITBL,P-NC1 >PTR ZERO? PTR /?CND1 SET 'P-PHR,0 GETB P-SYNTAX,P-SLOC1 >P-SLOCBITS GET P-ITBL,P-NC1L CALL SNARFEM,PTR,STACK,P-PRSO ZERO? STACK /FALSE GET P-BUTS,P-MATCHLEN ZERO? STACK /?CND1 CALL BUT-MERGE,P-PRSO >P-PRSO ?CND1: GET P-ITBL,P-NC2 >PTR ZERO? PTR /TRUE SET 'P-PHR,1 GETB P-SYNTAX,P-SLOC2 >P-SLOCBITS GET P-ITBL,P-NC2L CALL SNARFEM,PTR,STACK,P-PRSI ZERO? STACK /FALSE GET P-BUTS,P-MATCHLEN ZERO? STACK /TRUE GET P-PRSI,P-MATCHLEN EQUAL? STACK,1 \?ELS18 CALL BUT-MERGE,P-PRSO >P-PRSO RTRUE ?ELS18: CALL BUT-MERGE,P-PRSI >P-PRSI RTRUE .FUNCT BUT-MERGE,TBL,LEN,BUTLEN,CNT=1,MATCHES=0,OBJ,NTBL GET TBL,P-MATCHLEN >LEN PUT P-MERGE,P-MATCHLEN,0 ?PRG1: DLESS? 'LEN,0 \?ELS5 JUMP ?REP2 ?ELS5: GET TBL,CNT >OBJ CALL ZMEMQ,OBJ,P-BUTS ZERO? STACK /?ELS7 JUMP ?CND3 ?ELS7: ADD MATCHES,1 PUT P-MERGE,STACK,OBJ INC 'MATCHES ?CND3: INC 'CNT JUMP ?PRG1 ?REP2: PUT P-MERGE,P-MATCHLEN,MATCHES SET 'NTBL,P-MERGE SET 'P-MERGE,TBL RETURN NTBL .FUNCT SNARFEM,PTR,EPTR,TBL,BUT=0,LEN,WV,WRD,NW,WAS-ALL=0 SET 'P-AND,FALSE-VALUE EQUAL? P-GETFLAGS,P-ALL \?CND1 SET 'WAS-ALL,TRUE-VALUE ?CND1: SET 'P-GETFLAGS,0 PUT P-BUTS,P-MATCHLEN,0 PUT TBL,P-MATCHLEN,0 GET PTR,0 >WRD ?PRG4: EQUAL? PTR,EPTR \?ELS8 ZERO? BUT /?ORP12 PUSH BUT JUMP ?THN9 ?ORP12: PUSH TBL ?THN9: CALL GET-OBJECT,STACK >WV ZERO? WAS-ALL /?CND13 SET 'P-GETFLAGS,P-ALL ?CND13: RETURN WV ?ELS8: ADD PTR,P-WORDLEN EQUAL? EPTR,STACK \?ELS21 SET 'NW,0 JUMP ?CND19 ?ELS21: GET PTR,P-LEXELEN >NW ?CND19: EQUAL? WRD,W?ALL,W?BOTH,W?EVERYT \?ELS26 CALL MANY-CHECK,P-PHR ZERO? STACK /FALSE SET 'P-GETFLAGS,P-ALL EQUAL? NW,W?OF \?CND24 ADD PTR,P-WORDLEN >PTR JUMP ?CND24 ?ELS26: CALL NAUGHTY-WORD?,WRD ZERO? STACK \FALSE EQUAL? WRD,W?BUT,W?EXCEPT \?ELS36 ZERO? BUT /?ORP42 PUSH BUT JUMP ?THN39 ?ORP42: PUSH TBL ?THN39: CALL GET-OBJECT,STACK ZERO? STACK /FALSE SET 'BUT,P-BUTS PUT BUT,P-MATCHLEN,0 JUMP ?CND6 ?ELS36: EQUAL? WRD,W?A,W?ONE \?ELS44 ZERO? P-ADJ \?ELS47 SET 'P-GETFLAGS,P-ONE EQUAL? NW,W?OF \?CND6 ADD PTR,P-WORDLEN >PTR JUMP ?CND6 ?ELS47: SET 'P-NAM,P-ONEOBJ ZERO? BUT /?ORP58 PUSH BUT JUMP ?THN55 ?ORP58: PUSH TBL ?THN55: CALL GET-OBJECT,STACK ZERO? STACK /FALSE ZERO? NW /TRUE JUMP ?CND6 ?ELS44: EQUAL? WRD,W?AND,W?COMMA \?ELS62 EQUAL? NW,W?AND,W?COMMA /?ELS62 SET 'P-AND,TRUE-VALUE ZERO? BUT /?ORP70 PUSH BUT JUMP ?THN67 ?ORP70: PUSH TBL ?THN67: CALL GET-OBJECT,STACK ZERO? STACK \?CND24 RFALSE ?ELS62: CALL WT?,WRD,PS?BUZZ-WORD ZERO? STACK /?ELS72 JUMP ?CND6 ?ELS72: EQUAL? WRD,W?AND,W?COMMA \?ELS74 JUMP ?CND6 ?ELS74: EQUAL? WRD,W?OF \?ELS76 ZERO? P-GETFLAGS \?CND24 SET 'P-GETFLAGS,P-INHIBIT JUMP ?CND24 ?ELS76: CALL WT?,WRD,PS?ADJECTIVE,P1?ADJECTIVE >WV ZERO? WV /?ELS81 CALL ADJ-CHECK,WRD,P-ADJ,P-ADJN ZERO? STACK /?ELS81 EQUAL? NW,W?OF /?ELS81 SET 'P-ADJ,WV SET 'P-ADJN,WRD JUMP ?CND6 ?ELS81: CALL WT?,WRD,PS?OBJECT,P1?OBJECT ZERO? STACK /?CND6 SET 'P-NAM,WRD SET 'P-ONEOBJ,WRD ?CND24: ?CND6: EQUAL? PTR,EPTR /?PRG4 ADD PTR,P-WORDLEN >PTR SET 'WRD,NW JUMP ?PRG4 .FUNCT NAUGHTY-WORD?,WORD ZERO? NAUGHTY-LEVEL \FALSE EQUAL? WORD,W?ASS,W?ASSHOLE \?ELS7 CALL KNOW-WORD,STR?9 RSTACK ?ELS7: EQUAL? WORD,W?BASTARD,W?BITCH \?ELS9 CALL KNOW-WORD,STR?10 RSTACK ?ELS9: EQUAL? WORD,W?COCK,W?COCKSU,W?CUNT \?ELS11 CALL KNOW-WORD,STR?11 RSTACK ?ELS11: EQUAL? WORD,W?DAMN,W?DAMNED \?ELS13 CALL KNOW-WORD,STR?12 RSTACK ?ELS13: EQUAL? WORD,W?FUCK,W?FUCKED,W?FUCKING \?ELS15 CALL KNOW-WORD,STR?13 RSTACK ?ELS15: EQUAL? WORD,W?SHIT,W?SHITHEAD \FALSE CALL KNOW-WORD,STR?14 RSTACK .FUNCT KNOW-WORD,LETTER PRINTI "[I don't know the " PRINT LETTER PRINTR "-word.]" .FUNCT ADJ-CHECK,WRD,ADJ,ADJN ZERO? ADJ /TRUE EQUAL? WRD,W?RETURN \?ELS7 EQUAL? ADJN,W?COIN /TRUE ?ELS7: EQUAL? WRD,W?NARROW,W?WIDE /TRUE EQUAL? WRD,W?PURPLE,W?ORANGE \FALSE RTRUE .FUNCT GET-OBJECT,TBL,VRB=1,BITS,LEN,XBITS,TLEN,GCHECK=0,OLEN=0,OBJ SET 'XBITS,P-SLOCBITS GET TBL,P-MATCHLEN >TLEN BTST P-GETFLAGS,P-INHIBIT /TRUE ZERO? P-NAM \?CND4 ZERO? P-ADJ /?CND4 CALL WT?,P-ADJN,PS?OBJECT,P1?OBJECT ZERO? STACK /?ELS11 SET 'P-NAM,P-ADJN SET 'P-ADJ,FALSE-VALUE SET 'P-ADJN,FALSE-VALUE JUMP ?CND4 ?ELS11: CALL WT?,P-ADJN,PS?DIRECTION,P1?DIRECTION >BITS ZERO? BITS /?CND4 SET 'P-DIRECTION,BITS ?CND4: ZERO? P-NAM \?CND14 ZERO? P-ADJ \?CND14 EQUAL? P-GETFLAGS,P-ALL /?CND14 ZERO? P-GWIMBIT \?CND14 ZERO? VRB /FALSE PRINT NOUN-MISSING RFALSE ?CND14: EQUAL? P-GETFLAGS,P-ALL \?THN26 ZERO? P-SLOCBITS \?CND23 ?THN26: SET 'P-SLOCBITS,-1 ?CND23: SET 'P-TABLE,TBL ?PRG28: ZERO? GCHECK /?ELS32 CALL GLOBAL-CHECK,TBL JUMP ?CND30 ?ELS32: ZERO? LIT \?THN39 EQUAL? PRSA,V?TELL \?ELS38 ?THN39: FCLEAR PROTAGONIST,TRANSBIT CALL DO-SL,HERE,SOG,SIR FSET PROTAGONIST,TRANSBIT JUMP ?CND36 ?ELS38: LOC PROTAGONIST FSET? STACK,VEHBIT \?CND36 LOC PROTAGONIST CALL THIS-IT?,STACK ZERO? STACK /?CND36 LOC PROTAGONIST CALL OBJ-FOUND,STACK,TBL ?CND36: CALL DO-SL,PROTAGONIST,SH,SC ?CND30: GET TBL,P-MATCHLEN SUB STACK,TLEN >LEN BTST P-GETFLAGS,P-ALL \?ELS47 JUMP ?CND45 ?ELS47: EQUAL? P-GETFLAGS,P-ALL /?ELS49 GRTR? LEN,1 /?THN52 ZERO? LEN \?ELS49 EQUAL? P-SLOCBITS,-1 /?ELS49 ?THN52: EQUAL? P-SLOCBITS,-1 \?ELS58 SET 'P-SLOCBITS,XBITS SET 'OLEN,LEN GET TBL,P-MATCHLEN SUB STACK,LEN PUT TBL,P-MATCHLEN,STACK JUMP ?PRG28 ?ELS58: CALL PUT-ADJ-NAM ZERO? LEN \?CND61 SET 'LEN,OLEN ?CND61: ZERO? P-NAM /?ELS66 ADD TLEN,1 GET TBL,STACK >OBJ ZERO? OBJ /?ELS66 GETP OBJ,P?GENERIC CALL STACK >OBJ ZERO? OBJ /?ELS66 EQUAL? OBJ,NOT-HERE-OBJECT /FALSE PUT TBL,1,OBJ PUT TBL,P-MATCHLEN,1 SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RTRUE ?ELS66: ZERO? VRB /?ELS73 EQUAL? WINNER,PROTAGONIST /?ELS73 CALL CANT-ORPHAN SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RFALSE ?ELS73: ZERO? VRB /?ELS77 ZERO? P-NAM /?ELS77 CALL WHICH-PRINT,TLEN,LEN,TBL EQUAL? TBL,P-PRSO \?ELS84 PUSH P-NC1 JUMP ?CND80 ?ELS84: PUSH P-NC2 ?CND80: SET 'P-ACLAUSE,STACK SET 'P-AADJ,P-ADJ SET 'P-ANAM,P-NAM CALL ORPHAN,FALSE-VALUE,FALSE-VALUE SET 'P-OFLAG,TRUE-VALUE JUMP ?CND64 ?ELS77: ZERO? VRB /?CND64 PRINT NOUN-MISSING ?CND64: SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RFALSE ?ELS49: ZERO? LEN \?ELS91 ZERO? GCHECK /?ELS91 CALL PUT-ADJ-NAM ZERO? VRB /?CND94 SET 'P-SLOCBITS,XBITS ZERO? LIT \?THN101 EQUAL? PRSA,V?TELL /?THN101 EQUAL? PRSA,V?WHERE,V?WHAT \?ELS100 ?THN101: CALL OBJ-FOUND,NOT-HERE-OBJECT,TBL SET 'P-XNAM,P-NAM SET 'P-XADJ,P-ADJ SET 'P-XADJN,P-ADJN SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE SET 'P-ADJN,FALSE-VALUE RTRUE ?ELS100: PRINT TOO-DARK CRLF ?CND94: SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RFALSE ?ELS91: ZERO? LEN \?CND45 SET 'GCHECK,TRUE-VALUE JUMP ?PRG28 ?CND45: SET 'P-SLOCBITS,XBITS CALL PUT-ADJ-NAM SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RTRUE .FUNCT PUT-ADJ-NAM EQUAL? P-NAM,W?IT /FALSE PUT P-NAMW,P-PHR,P-NAM PUT P-ADJW,P-PHR,P-ADJ RTRUE .FUNCT MOBY-FIND,TBL,OBJ=1,LEN,FOO,NAM,ADJ SET 'NAM,P-NAM SET 'ADJ,P-ADJ SET 'P-NAM,P-XNAM SET 'P-ADJ,P-XADJ PUT TBL,P-MATCHLEN,0 ?PRG3: IN? OBJ,ROOMS /?CND5 CALL THIS-IT?,OBJ >FOO ZERO? FOO /?CND5 CALL OBJ-FOUND,OBJ,TBL >FOO ?CND5: IGRTR? 'OBJ,LAST-OBJECT \?PRG3 GET TBL,P-MATCHLEN >LEN EQUAL? LEN,1 \?CND13 GET TBL,1 >P-MOBY-FOUND ?CND13: SET 'P-NAM,NAM SET 'P-ADJ,ADJ RETURN LEN .FUNCT WHICH-PRINT,TLEN,LEN,TBL,OBJ,RLEN SET 'RLEN,LEN PRINTI "[Which" ZERO? P-OFLAG \?THN4 ZERO? P-MERGED \?THN4 ZERO? P-AND /?ELS3 ?THN4: PRINTI " " PRINTB P-NAM JUMP ?CND1 ?ELS3: EQUAL? TBL,P-PRSO \?ELS7 CALL CLAUSE-PRINT,P-NC1,P-NC1L,FALSE-VALUE JUMP ?CND1 ?ELS7: CALL CLAUSE-PRINT,P-NC2,P-NC2L,FALSE-VALUE ?CND1: PRINTI " do you mean, " ?PRG10: INC 'TLEN GET TBL,TLEN >OBJ FSET? OBJ,NARTICLEBIT /?CND12 PRINTI "the " ?CND12: CALL DPRINT,OBJ EQUAL? LEN,2 \?ELS17 EQUAL? RLEN,2 /?CND18 PRINTI "," ?CND18: PRINTI " or " JUMP ?CND15 ?ELS17: GRTR? LEN,2 \?CND15 PRINTI ", " ?CND15: DLESS? 'LEN,1 \?PRG10 PRINTR "?]" .FUNCT GLOBAL-CHECK,TBL,LEN,RMG,RMGL,CNT=0,OBJ,OBITS,FOO GET TBL,P-MATCHLEN >LEN SET 'OBITS,P-SLOCBITS GETPT HERE,P?GLOBAL >RMG ZERO? RMG /?CND1 PTSIZE RMG SUB STACK,1 >RMGL ?PRG4: GETB RMG,CNT >OBJ CALL THIS-IT?,OBJ ZERO? STACK /?CND6 CALL OBJ-FOUND,OBJ,TBL ?CND6: IGRTR? 'CNT,RMGL \?PRG4 ?CND1: GETP HERE,P?THINGS >RMG ZERO? RMG /?CND12 GET RMG,0 >RMGL SET 'CNT,0 ?PRG15: ZERO? P-NAM /?ELS19 ADD CNT,1 GET RMG,STACK EQUAL? P-NAM,STACK /?ELS19 JUMP ?CND17 ?ELS19: ZERO? P-ADJ /?ELS23 ADD CNT,2 GET RMG,STACK CALL WT?,STACK,PS?ADJECTIVE,P1?ADJECTIVE EQUAL? P-ADJ,STACK /?ELS23 JUMP ?CND17 ?ELS23: ZERO? P-NAM \?THN28 ZERO? P-ADJ /?CND17 ?THN28: SET 'LAST-PSEUDO-LOC,HERE ADD CNT,3 GET RMG,STACK PUTP PSEUDO-OBJECT,P?ACTION,STACK GETPT PSEUDO-OBJECT,P?ACTION SUB STACK,5 >FOO ADD CNT,1 GET RMG,STACK >RMG GET RMG,0 PUT FOO,0,STACK GET RMG,1 PUT FOO,1,STACK CALL OBJ-FOUND,PSEUDO-OBJECT,TBL JUMP ?CND12 ?CND17: ADD CNT,3 >CNT LESS? CNT,RMGL /?PRG15 ?CND12: GET TBL,P-MATCHLEN EQUAL? STACK,LEN \FALSE SET 'P-SLOCBITS,-1 SET 'P-TABLE,TBL CALL DO-SL,GLOBAL-OBJECTS,1,1 SET 'P-SLOCBITS,OBITS RETURN P-SLOCBITS .FUNCT DO-SL,OBJ,BIT1,BIT2,BTS ADD BIT1,BIT2 BTST P-SLOCBITS,STACK \?ELS5 CALL SEARCH-LIST,OBJ,P-TABLE,P-SRCALL RSTACK ?ELS5: BTST P-SLOCBITS,BIT1 \?ELS12 CALL SEARCH-LIST,OBJ,P-TABLE,P-SRCTOP RSTACK ?ELS12: BTST P-SLOCBITS,BIT2 \TRUE CALL SEARCH-LIST,OBJ,P-TABLE,P-SRCBOT RSTACK .FUNCT SEARCH-LIST,OBJ,TBL,LVL,FLS,NOBJ FIRST? OBJ >OBJ \FALSE ?PRG6: EQUAL? LVL,P-SRCBOT /?CND8 GETPT OBJ,P?SYNONYM ZERO? STACK /?CND8 CALL THIS-IT?,OBJ ZERO? STACK /?CND8 CALL OBJ-FOUND,OBJ,TBL ?CND8: EQUAL? LVL,P-SRCTOP \?THN18 FSET? OBJ,SEARCHBIT /?THN18 FSET? OBJ,SURFACEBIT \?CND13 ?THN18: FIRST? OBJ >NOBJ \?CND13 FSET? OBJ,OPENBIT /?THN23 FSET? OBJ,TRANSBIT /?THN23 ZERO? P-MOBY-FLAG /?CND13 ?THN23: FSET? OBJ,SURFACEBIT \?ELS29 PUSH P-SRCALL JUMP ?CND25 ?ELS29: FSET? OBJ,SEARCHBIT \?ELS31 PUSH P-SRCALL JUMP ?CND25 ?ELS31: PUSH P-SRCTOP ?CND25: CALL SEARCH-LIST,OBJ,TBL,STACK >FLS ?CND13: NEXT? OBJ >OBJ /?PRG6 RTRUE .FUNCT OBJ-FOUND,OBJ,TBL,PTR GET TBL,P-MATCHLEN >PTR ADD PTR,1 PUT TBL,STACK,OBJ ADD PTR,1 PUT TBL,P-MATCHLEN,STACK RTRUE .FUNCT TAKE-CHECK GETB P-SYNTAX,P-SLOC1 CALL ITAKE-CHECK,P-PRSO,STACK ZERO? STACK /FALSE GETB P-SYNTAX,P-SLOC2 CALL ITAKE-CHECK,P-PRSI,STACK RSTACK .FUNCT ITAKE-CHECK,TBL,IBITS,PTR,OBJ,TAKEN GET TBL,P-MATCHLEN >PTR ZERO? PTR /TRUE BTST IBITS,SHAVE /?THN8 BTST IBITS,STAKE \TRUE ?THN8: ?PRG10: DLESS? 'PTR,0 /TRUE ADD PTR,1 GET TBL,STACK >OBJ EQUAL? OBJ,IT \?ELS19 CALL VISIBLE?,P-IT-OBJECT ZERO? STACK \?ELS22 CALL REFERRING RFALSE ?ELS22: SET 'OBJ,P-IT-OBJECT JUMP ?CND17 ?ELS19: EQUAL? OBJ,HIM \?ELS26 CALL VISIBLE?,P-HIM-OBJECT ZERO? STACK \?ELS29 CALL REFERRING,TRUE-VALUE RFALSE ?ELS29: SET 'OBJ,P-HIM-OBJECT JUMP ?CND17 ?ELS26: EQUAL? OBJ,HER \?CND17 CALL VISIBLE?,P-HER-OBJECT ZERO? STACK \?ELS36 CALL REFERRING,TRUE-VALUE RFALSE ?ELS36: SET 'OBJ,P-HER-OBJECT ?CND17: CALL ULTIMATELY-IN?,OBJ ZERO? STACK \?PRG10 EQUAL? OBJ,RAFT \?ELS45 ZERO? RAFT-HELD \?PRG10 ?ELS45: EQUAL? OBJ,INTNUM,HANDS,HAND-COVER \?ELS41 JUMP ?PRG10 ?ELS41: SET 'PRSO,OBJ FSET? OBJ,TRYTAKEBIT \?ELS50 SET 'TAKEN,TRUE-VALUE JUMP ?CND48 ?ELS50: CALL UNTOUCHABLE?,OBJ ZERO? STACK /?ELS52 SET 'TAKEN,TRUE-VALUE JUMP ?CND48 ?ELS52: EQUAL? WINNER,PROTAGONIST /?ELS54 SET 'TAKEN,FALSE-VALUE JUMP ?CND48 ?ELS54: BTST IBITS,STAKE \?ELS56 CALL ITAKE,FALSE-VALUE EQUAL? STACK,TRUE-VALUE \?ELS56 SET 'TAKEN,FALSE-VALUE JUMP ?CND48 ?ELS56: SET 'TAKEN,TRUE-VALUE ?CND48: ZERO? TAKEN /?ELS63 BTST IBITS,SHAVE \?ELS63 GET TBL,P-MATCHLEN LESS? 1,STACK \?ELS68 PRINT YNH PRINTI " all those things!" CRLF RFALSE ?ELS68: EQUAL? OBJ,NOT-HERE-OBJECT \?CND66 PRINT YOU-CANT PRINTI "see that here!" CRLF RFALSE ?CND66: EQUAL? WINNER,PROTAGONIST \?ELS73 PRINT YNH JUMP ?CND71 ?ELS73: PRINTI "It doesn't look like" CALL TPRINT,WINNER PRINTI " has" ?CND71: CALL THIS-IS-IT,OBJ CALL TRPRINT,OBJ RFALSE ?ELS63: ZERO? TAKEN \?PRG10 IN? PROTAGONIST,OBJ /?PRG10 EQUAL? WINNER,PROTAGONIST \?PRG10 PRINTI "[taking" CALL TPRINT,OBJ PRINTI " first]" CRLF JUMP ?PRG10 .FUNCT MANY-CHECK,PHR=2,LOSS=0,TMP,?TMP1 ZERO? PHR \?ELS3 GETB P-SYNTAX,P-SLOC1 BTST STACK,SMANY /?ELS3 SET 'LOSS,1 JUMP ?CND1 ?ELS3: EQUAL? PHR,1 \?ELS7 GETB P-SYNTAX,P-SLOC2 BTST STACK,SMANY /?ELS7 SET 'LOSS,2 JUMP ?CND1 ?ELS7: EQUAL? PHR,2 \?ELS11 GET P-PRSO,P-MATCHLEN GRTR? STACK,1 \?ELS11 GETB P-SYNTAX,P-SLOC1 BTST STACK,SMANY /?ELS11 SET 'LOSS,1 JUMP ?CND1 ?ELS11: EQUAL? PHR,2 \?CND1 GET P-PRSI,P-MATCHLEN GRTR? STACK,1 \?CND1 GETB P-SYNTAX,P-SLOC2 BTST STACK,SMANY /?CND1 SET 'LOSS,2 ?CND1: ZERO? LOSS /TRUE PRINTI "[" PRINT YOU-CANT PRINTI "use multiple " EQUAL? LOSS,2 \?CND24 PRINTI "in" ?CND24: PRINTI "direct objects with """ GET P-ITBL,P-VERBN >TMP ZERO? TMP \?ELS29 PRINTI "tell" JUMP ?CND27 ?ELS29: ZERO? P-OFLAG \?THN32 ZERO? P-MERGED /?ELS31 ?THN32: GET TMP,0 PRINTB STACK JUMP ?CND27 ?ELS31: GETB TMP,2 >?TMP1 GETB TMP,3 CALL WORD-PRINT,?TMP1,STACK ?CND27: PRINTI """.]" CRLF RFALSE .FUNCT ZMEMQ,ITM,TBL,SIZE=-1,CNT=1 ZERO? TBL /FALSE LESS? SIZE,0 /?ELS6 SET 'CNT,0 JUMP ?CND4 ?ELS6: GET TBL,0 >SIZE ?CND4: ?PRG9: GET TBL,CNT EQUAL? ITM,STACK /TRUE IGRTR? 'CNT,SIZE \?PRG9 RFALSE .FUNCT ZMEMQB,ITM,TBL,SIZE,CNT=0 ?PRG1: GETB TBL,CNT EQUAL? ITM,STACK /TRUE IGRTR? 'CNT,SIZE \?PRG1 RFALSE .FUNCT LIT?,RM,RMBIT=1,OHERE,LIT=0 SET 'P-GWIMBIT,ONBIT SET 'OHERE,HERE SET 'HERE,RM ZERO? RMBIT /?ELS3 FSET? RM,ONBIT \?ELS3 SET 'LIT,TRUE-VALUE JUMP ?CND1 ?ELS3: PUT P-MERGE,P-MATCHLEN,0 SET 'P-TABLE,P-MERGE SET 'P-SLOCBITS,-1 EQUAL? OHERE,RM \?CND8 CALL DO-SL,WINNER,1,1 EQUAL? WINNER,PROTAGONIST /?CND8 IN? PROTAGONIST,RM \?CND8 CALL DO-SL,PROTAGONIST,1,1 ?CND8: CALL DO-SL,RM,1,1 GET P-TABLE,P-MATCHLEN GRTR? STACK,0 \?CND1 SET 'LIT,TRUE-VALUE ?CND1: SET 'HERE,OHERE SET 'P-GWIMBIT,0 RETURN LIT .FUNCT PRSO-PRINT,PTR ZERO? P-MERGED \?THN6 GET P-ITBL,P-NC1 >PTR GET PTR,0 EQUAL? STACK,W?IT \?ELS5 ?THN6: PRINTI " " CALL DPRINT,PRSO RSTACK ?ELS5: GET P-ITBL,P-NC1L CALL BUFFER-PRINT,PTR,STACK,FALSE-VALUE RSTACK .FUNCT PRSI-PRINT,PTR ZERO? P-MERGED \?THN6 GET P-ITBL,P-NC2 >PTR GET PTR,0 EQUAL? STACK,W?IT \?ELS5 ?THN6: PRINTI " " CALL DPRINT,PRSI RSTACK ?ELS5: GET P-ITBL,P-NC2L CALL BUFFER-PRINT,PTR,STACK,FALSE-VALUE RSTACK .FUNCT THIS-IT?,OBJ,SYNS,?TMP1 FSET? OBJ,INVISIBLE /FALSE ZERO? P-NAM /?ELS5 GETPT OBJ,P?SYNONYM >SYNS PTSIZE SYNS DIV STACK,2 SUB STACK,1 CALL ZMEMQ,P-NAM,SYNS,STACK ZERO? STACK /FALSE ?ELS5: ZERO? P-ADJ /?ELS9 GETPT OBJ,P?ADJECTIVE >SYNS ZERO? SYNS /FALSE PTSIZE SYNS SUB STACK,1 CALL ZMEMQB,P-ADJ,SYNS,STACK ZERO? STACK /FALSE ?ELS9: ZERO? P-GWIMBIT /TRUE FSET? OBJ,P-GWIMBIT /TRUE RFALSE .ENDI