.FUNCT PARSER,PTR=P-LEXSTART,WRD,VAL=0,VERB=0,OF-FLAG=0,LEN,DIR=0,NW=0,LW=0,CNT=-1,OWINNER,OMERGED,TEMP=0,?TMP2,?TMP1 ?PRG1: IGRTR? 'CNT,P-ITBLLEN /?REP2 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 '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 SET 'OWINNER,WINNER ZERO? P-OFLAG \?CND11 SET 'P-PRSA-WORD,FALSE-VALUE ?CND11: ZERO? QUOTE-FLAG \?CND14 EQUAL? WINNER,PLAYER /?CND14 SET 'WINNER,PLAYER SET 'LAST-PLAYER-LOC,HERE LOC WINNER FSET? STACK,VEHBIT /?CND19 SET 'LAST-PLAYER-LOC,HERE LOC WINNER >HERE ?CND19: CALL LIT?,HERE >LIT ?CND14: ZERO? RESERVE-PTR /?ELS24 SET 'PTR,RESERVE-PTR CALL STUFF,P-LEXV,RESERVE-LEXV ZERO? VERBOSITY /?CND26 EQUAL? PLAYER,WINNER \?CND26 CRLF ?CND26: SET 'RESERVE-PTR,FALSE-VALUE SET 'P-CONT,FALSE-VALUE JUMP ?CND22 ?ELS24: ZERO? P-CONT /?ELS32 SET 'PTR,P-CONT SET 'P-CONT,FALSE-VALUE ZERO? SAYING? /?ELS36 SET 'SAYING?,FALSE-VALUE JUMP ?CND22 ?ELS36: ZERO? VERBOSITY /?CND22 EQUAL? PLAYER,WINNER \?CND22 CRLF JUMP ?CND22 ?ELS32: SET 'SAYING?,FALSE-VALUE SET 'WINNER,PLAYER SET 'QUOTE-FLAG,FALSE-VALUE SET 'LAST-PLAYER-LOC,HERE LOC WINNER FSET? STACK,VEHBIT /?CND44 SET 'LAST-PLAYER-LOC,HERE LOC WINNER >HERE ?CND44: CALL LIT?,HERE >LIT ZERO? VERBOSITY /?CND47 CRLF ?CND47: PUTB P-LEXV,0,59 PRINTC 62 READ P-INBUF,P-LEXV ?CND22: GETB P-LEXV,P-LEXWORDS >P-LEN GET P-LEXV,PTR EQUAL? W?QUOTE,STACK \?CND50 CALL QCONTEXT-GOOD? ZERO? STACK /?CND50 ADD PTR,P-LEXELEN >PTR DEC 'P-LEN ?CND50: GET P-LEXV,PTR EQUAL? W?THEN,STACK \?CND55 ADD PTR,P-LEXELEN >PTR DEC 'P-LEN ?CND55: LESS? 1,P-LEN \?CND58 GET P-LEXV,PTR EQUAL? W?GO,STACK \?CND58 ADD PTR,P-LEXELEN GET P-LEXV,STACK >NW ZERO? NW /?CND58 CALL WT?,NW,64 ZERO? STACK /?CND58 ADD PTR,P-LEXELEN >PTR DEC 'P-LEN ?CND58: ZERO? P-LEN \?ELS65 PRINTI "[Beg pardon?]" CRLF RFALSE ?ELS65: GET P-LEXV,PTR EQUAL? STACK,W?OOPS \?ELS67 GRTR? P-LEN,1 /?ELS70 PRINTI "[You can't use OOPS that way.]" CRLF RFALSE ?ELS70: GET OOPS-TABLE,O-PTR ZERO? STACK /?ELS72 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 ?CND63 ?ELS72: PUT OOPS-TABLE,O-END,FALSE-VALUE PRINTI "[There was no word to replace!]" CRLF RFALSE ?ELS67: PUT OOPS-TABLE,O-END,FALSE-VALUE ?CND63: GET P-LEXV,PTR EQUAL? STACK,W?AGAIN,W?G \?ELS79 ZERO? P-OFLAG \?THN83 ZERO? P-WON \?ELS82 ?THN83: PRINTI "[You can't use AGAIN that way.]" CRLF RFALSE ?ELS82: GRTR? P-LEN,1 \?ELS86 ADD PTR,P-LEXELEN GET P-LEXV,STACK EQUAL? STACK,W?PERIOD,W?COMMA,W?THEN /?THN90 ADD PTR,P-LEXELEN GET P-LEXV,STACK EQUAL? STACK,W?AND \?ELS89 ?THN90: ADD PTR,4 >PTR GETB P-LEXV,P-LEXWORDS SUB STACK,2 PUTB P-LEXV,P-LEXWORDS,STACK JUMP ?CND80 ?ELS89: PRINTI "[I couldn't understand that sentence.]" CRLF RFALSE ?ELS86: ADD PTR,P-LEXELEN >PTR GETB P-LEXV,P-LEXWORDS SUB STACK,1 PUTB P-LEXV,P-LEXWORDS,STACK ?CND80: GETB P-LEXV,P-LEXWORDS GRTR? STACK,0 \?ELS98 CALL STUFF,RESERVE-LEXV,P-LEXV SET 'RESERVE-PTR,PTR JUMP ?CND96 ?ELS98: SET 'RESERVE-PTR,FALSE-VALUE ?CND96: 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,P-WALK-DIR ?PRG101: IGRTR? 'CNT,P-ITBLLEN /?CND77 GET P-OTBL,CNT PUT P-ITBL,CNT,STACK JUMP ?PRG101 ?ELS79: SET 'P-NUMBER,-1 SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE SET 'P-ADVERB,FALSE-VALUE 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 SET 'RESERVE-PTR,FALSE-VALUE SET 'LEN,P-LEN SET 'P-NCN,0 SET 'P-GETFLAGS,0 PUT P-ITBL,P-VERBN,0 SET 'P-SENTENCE,PTR ?PRG110: DLESS? 'P-LEN,0 \?ELS114 SET 'QUOTE-FLAG,FALSE-VALUE JUMP ?CND77 ?ELS114: GET P-LEXV,PTR >WRD CALL BUZZER-WORD?,WRD ZERO? STACK \FALSE ZERO? WRD \?THN119 CALL NUMBER?,PTR >WRD ZERO? WRD /?ELS118 ?THN119: ZERO? P-LEN \?ELS123 SET 'NW,0 JUMP ?CND121 ?ELS123: ADD PTR,P-LEXELEN GET P-LEXV,STACK >NW ?CND121: EQUAL? WRD,W?TO \?ELS128 EQUAL? VERB,ACT?TELL,ACT?ASK \?ELS128 PUT P-ITBL,P-VERB,ACT?TELL SET 'WRD,W?QUOTE JUMP ?CND126 ?ELS128: EQUAL? WRD,W?THEN \?CND126 ZERO? VERB \?CND126 ZERO? QUOTE-FLAG \?CND126 GET P-ITBL,P-NC1 ZERO? STACK /?CND126 PUT P-ITBL,P-VERB,ACT?TELL PUT P-ITBL,P-VERBN,0 SET 'WRD,W?QUOTE ?CND126: EQUAL? WRD,W?PERIOD \?ELS137 EQUAL? LW,W?MR,W?MISS,W?MRS \?ELS137 SET 'LW,0 JUMP ?CND112 ?ELS137: EQUAL? WRD,W?THEN,W?PERIOD,W?QUOTE \?ELS141 EQUAL? WRD,W?QUOTE \?CND142 ZERO? QUOTE-FLAG /?ELS147 SET 'QUOTE-FLAG,FALSE-VALUE JUMP ?CND142 ?ELS147: SET 'QUOTE-FLAG,TRUE-VALUE ?CND142: ZERO? P-LEN /?THN151 ADD PTR,P-LEXELEN >P-CONT ?THN151: PUTB P-LEXV,P-LEXWORDS,P-LEN JUMP ?CND77 ?ELS141: CALL WT?,WRD,16,3 >VAL ZERO? VAL /?ELS154 EQUAL? VERB,FALSE-VALUE,ACT?WALK,ACT?GO \?ELS154 EQUAL? LEN,1 /?THN157 EQUAL? LEN,2 \?ELS160 EQUAL? VERB,ACT?WALK,ACT?GO /?THN157 ?ELS160: EQUAL? NW,W?THEN,W?PERIOD,W?QUOTE \?ELS162 GRTR? LEN,1 /?THN157 ?ELS162: ZERO? QUOTE-FLAG /?ELS164 EQUAL? LEN,2 \?ELS164 EQUAL? NW,W?QUOTE /?THN157 ?ELS164: GRTR? LEN,2 \?ELS154 EQUAL? NW,W?COMMA,W?AND \?ELS154 ?THN157: SET 'DIR,VAL EQUAL? NW,W?COMMA,W?AND \?CND167 ADD PTR,P-LEXELEN CALL CHANGE-LEXV,STACK,W?THEN ?CND167: GRTR? LEN,2 /?CND112 SET 'QUOTE-FLAG,FALSE-VALUE JUMP ?CND77 ?ELS154: CALL WT?,WRD,64,1 >VAL ZERO? VAL /?ELS174 ZERO? VERB \?ELS174 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 >TEMP GETB P-LEXV,TEMP PUTB P-VTBL,2,STACK ADD TEMP,1 GETB P-LEXV,STACK PUTB P-VTBL,3,STACK JUMP ?CND112 ?ELS174: CALL WT?,WRD,8,0 >VAL ZERO? VAL \?THN179 EQUAL? WRD,W?A /?THN183 EQUAL? WRD,W?BOTH,W?ALL,W?EVERYTHING /?THN183 CALL WT?,WRD,32 ZERO? STACK \?THN183 CALL WT?,WRD,128 ZERO? STACK /?ELS178 ?THN183: SET 'VAL,0 \?ELS178 ?THN179: GRTR? P-LEN,1 \?ELS187 EQUAL? NW,W?OF \?ELS187 EQUAL? VERB,ACT?TAKE /?ELS187 ZERO? VAL \?ELS187 EQUAL? WRD,W?A /?ELS187 EQUAL? WRD,W?ALL,W?BOTH,W?EVERYTHING /?ELS187 SET 'OF-FLAG,TRUE-VALUE JUMP ?CND112 ?ELS187: ZERO? VAL /?ELS191 ZERO? P-LEN /?THN194 EQUAL? NW,W?THEN,W?PERIOD \?ELS191 ?THN194: SET 'P-END-ON-PREP,TRUE-VALUE LESS? P-NCN,2 \?CND112 PUT P-ITBL,P-PREP1,VAL PUT P-ITBL,P-PREP1N,WRD JUMP ?CND112 ?ELS191: EQUAL? P-NCN,2 \?ELS200 PRINTI "[There are too many nouns in that sentence!]" CRLF RFALSE ?ELS200: INC 'P-NCN CALL CLAUSE,PTR,VAL,WRD >PTR ZERO? PTR /FALSE LESS? PTR,0 \?CND112 SET 'QUOTE-FLAG,FALSE-VALUE JUMP ?CND77 ?ELS178: EQUAL? WRD,W?OF \?ELS209 ZERO? OF-FLAG /?THN213 EQUAL? NW,W?PERIOD,W?THEN \?ELS212 ?THN213: CALL CANT-USE,PTR RFALSE ?ELS212: SET 'OF-FLAG,FALSE-VALUE JUMP ?CND112 ?ELS209: CALL WT?,WRD,4 ZERO? STACK \?CND112 EQUAL? VERB,ACT?TELL \?ELS220 CALL WT?,WRD,64 ZERO? STACK /?ELS220 CALL WAY-TO-TALK RFALSE ?ELS220: CALL CANT-USE,PTR RFALSE ?ELS118: CALL UNKNOWN-WORD,PTR RFALSE ?CND112: SET 'LW,WRD ADD PTR,P-LEXELEN >PTR JUMP ?PRG110 ?CND77: PUT OOPS-TABLE,O-PTR,FALSE-VALUE ZERO? DIR /?CND227 SET 'PRSA,V?WALK SET 'P-WALK-DIR,DIR SET 'PRSO,DIR SET 'P-OFLAG,FALSE-VALUE RTRUE ?CND227: SET 'P-WALK-DIR,FALSE-VALUE ZERO? P-OFLAG /?CND231 CALL ORPHAN-MERGE ZERO? STACK /?CND231 SET 'WINNER,OWINNER ?CND231: ZERO? P-CONT /?CND236 GET P-ITBL,P-VERB ZERO? STACK \?CND236 GET P-ITBL,P-NC1 ZERO? STACK /?CND236 PUT P-ITBL,P-VERB,ACT?TELL ?CND236: 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 PUT P-LEXV,PTR,WRD PUT AGAIN-LEXV,PTR,WRD RTRUE .FUNCT WAY-TO-TALK PRINTR "[Refer to your HOLLYWOOD HIJINX manual for the correct way to talk to characters.]" .FUNCT WT?,PTR,BIT,B1=5,OFFS=P-P1OFF,TYP GETB PTR,P-PSOFF >TYP BTST TYP,BIT \FALSE GRTR? B1,4 /TRUE BAND TYP,P-P1BITS >TYP EQUAL? TYP,B1 /?CND13 INC 'OFFS ?CND13: GETB PTR,OFFS RSTACK .FUNCT CLAUSE,PTR,VAL,WRD,OFF,NUM,ANDFLG=0,FIRST??=1,NW,LW=0,LEN,?TMP1 SUB P-NCN,1 MUL STACK,2 >OFF ZERO? VAL /?ELS3 GET P-LEXV,PTR EQUAL? STACK,W?RIGHT,W?LEFT \?ELS3 ADD PTR,P-LEXELEN GET P-LEXV,STACK EQUAL? STACK,W?END \?ELS3 SET 'VAL,0 INC 'P-LEN JUMP ?CND1 ?ELS3: ZERO? VAL /?ELS7 ADD P-PREP1,OFF >NUM PUT P-ITBL,NUM,VAL ADD NUM,1 PUT P-ITBL,STACK,WRD ADD PTR,P-LEXELEN >PTR EQUAL? WRD,W?TO /?CND1 SET 'LEN,P-LEN ?PRG11: DEC 'LEN GET P-LEXV,PTR >WRD EQUAL? WRD,W?LEFT,W?RIGHT \?CND1 GRTR? LEN,0 \?CND1 ADD PTR,P-LEXELEN GET P-LEXV,STACK EQUAL? STACK,W?END /?CND1 CALL WT?,WRD,8,0 >VAL PUT P-ITBL,NUM,VAL ADD NUM,1 PUT P-ITBL,STACK,WRD ADD PTR,P-LEXELEN >PTR JUMP ?PRG11 ?ELS7: INC 'P-LEN ?CND1: ZERO? P-LEN \?CND22 DEC 'P-NCN RETURN -1 ?CND22: ADD P-NC1,OFF >NUM MUL PTR,2 ADD P-LEXV,STACK PUT P-ITBL,NUM,STACK GET P-LEXV,PTR EQUAL? STACK,W?THE,W?A,W?AN \?CND25 GET P-ITBL,NUM ADD STACK,4 PUT P-ITBL,NUM,STACK ADD PTR,P-LEXELEN >PTR DEC 'P-LEN ?CND25: ?PRG28: DLESS? 'P-LEN,0 \?CND30 ADD NUM,1 >?TMP1 MUL PTR,2 ADD P-LEXV,STACK PUT P-ITBL,?TMP1,STACK RETURN -1 ?CND30: GET P-LEXV,PTR >WRD CALL BUZZER-WORD?,WRD ZERO? STACK \FALSE ZERO? WRD \?THN38 CALL NUMBER?,PTR >WRD ZERO? WRD /?ELS37 ?THN38: ZERO? P-LEN \?ELS42 SET 'NW,0 JUMP ?CND40 ?ELS42: ADD PTR,P-LEXELEN GET P-LEXV,STACK >NW ?CND40: EQUAL? WRD,W?PERIOD \?ELS47 EQUAL? LW,W?MR,W?MRS,W?MISS \?ELS47 SET 'LW,0 JUMP ?CND33 ?ELS47: EQUAL? WRD,W?AND,W?COMMA \?ELS51 SET 'ANDFLG,TRUE-VALUE JUMP ?CND33 ?ELS51: EQUAL? WRD,W?ALL,W?BOTH,W?EVERYTHING \?ELS53 EQUAL? NW,W?OF \?CND33 DEC 'P-LEN ADD PTR,P-LEXELEN >PTR JUMP ?CND33 ?ELS53: EQUAL? WRD,W?THEN,W?PERIOD /?THN59 CALL WT?,WRD,8 ZERO? STACK /?ELS58 GET P-ITBL,P-VERB ZERO? STACK /?ELS58 ZERO? FIRST?? \?ELS58 ?THN59: INC 'P-LEN ADD NUM,1 >?TMP1 MUL PTR,2 ADD P-LEXV,STACK PUT P-ITBL,?TMP1,STACK SUB PTR,P-LEXELEN RSTACK ?ELS58: ZERO? ANDFLG /?ELS64 GET P-ITBL,P-VERBN ZERO? STACK /?THN67 CALL VERB-DIR-ONLY?,WRD ZERO? STACK /?ELS64 ?THN67: SUB PTR,4 >PTR ADD PTR,2 CALL CHANGE-LEXV,STACK,W?THEN ADD P-LEN,2 >P-LEN JUMP ?CND33 ?ELS64: CALL WT?,WRD,128 ZERO? STACK /?ELS70 GRTR? P-LEN,0 \?ELS73 EQUAL? NW,W?OF \?ELS73 EQUAL? WRD,W?ALL,W?EVERYTHING \?CND33 ?ELS73: CALL WT?,WRD,32 ZERO? STACK /?ELS77 ZERO? NW /?ELS77 CALL WT?,NW,128 ZERO? STACK \?CND33 ?ELS77: ZERO? ANDFLG \?ELS81 EQUAL? NW,W?BUT,W?EXCEPT /?ELS81 EQUAL? NW,W?AND,W?COMMA /?ELS81 ADD NUM,1 >?TMP1 ADD PTR,2 MUL STACK,2 ADD P-LEXV,STACK PUT P-ITBL,?TMP1,STACK RETURN PTR ?ELS81: SET 'ANDFLG,FALSE-VALUE JUMP ?CND33 ?ELS70: CALL WT?,WRD,32 ZERO? STACK \?CND33 CALL WT?,WRD,4 ZERO? STACK \?CND33 ZERO? ANDFLG /?ELS91 GET P-ITBL,P-VERB ZERO? STACK \?ELS91 SUB PTR,4 >PTR ADD PTR,2 CALL CHANGE-LEXV,STACK,W?THEN ADD P-LEN,2 >P-LEN JUMP ?CND33 ?ELS91: CALL WT?,WRD,8 ZERO? STACK \?CND33 CALL CANT-USE,PTR RFALSE ?ELS37: CALL UNKNOWN-WORD,PTR RFALSE ?CND33: SET 'LW,WRD SET 'FIRST??,FALSE-VALUE ADD PTR,P-LEXELEN >PTR JUMP ?PRG28 .FUNCT THIS-IS-IT,OBJ EQUAL? OBJ,FALSE-VALUE,PLAYER,NOT-HERE-OBJECT /TRUE EQUAL? OBJ,INTDIR /TRUE EQUAL? PRSA,V?WALK,V?WALK-TO \?ELS9 EQUAL? OBJ,PRSO /TRUE ?ELS9: SET 'P-THEM-OBJECT,OBJ SET 'P-IT-OBJECT,OBJ RTRUE .FUNCT REFERRING,WHO=0 PRINTI "[I don't see wh" ZERO? WHO /?ELS3 PRINTI "om" JUMP ?CND1 ?ELS3: PRINTI "at" ?CND1: PRINTR " you're referring to.]" .FUNCT FAKE-ORPHAN,TMP,?TMP1 CALL ORPHAN,P-SYNTAX,FALSE-VALUE PRINTI "[Be specific: what object do you want to " GET P-OTBL,P-VERBN >TMP ZERO? TMP \?ELS3 PRINTI "tell" JUMP ?CND1 ?ELS3: GETB P-VTBL,2 ZERO? STACK \?ELS5 GET TMP,0 PRINTB STACK JUMP ?CND1 ?ELS5: GETB TMP,2 >?TMP1 GETB TMP,3 CALL WORD-PRINT,?TMP1,STACK PUTB P-VTBL,2,0 ?CND1: SET 'P-OFLAG,TRUE-VALUE SET 'P-WON,FALSE-VALUE PRINTR "?]" .FUNCT SEE-VERB? EQUAL? PRSA,V?LOOK,V?EXAMINE,V?LOOK-INSIDE /TRUE EQUAL? PRSA,V?SEARCH,V?FIND,V?LOOK-ON /TRUE EQUAL? PRSA,V?OPEN /TRUE EQUAL? PRSA,V?LOOK-UNDER,V?LOOK-BEHIND,V?READ /TRUE EQUAL? PRSA,V?LOOK-THRU,V?LOOK-DOWN,V?COUNT /TRUE EQUAL? PRSA,V?PLAY \FALSE RTRUE .FUNCT PERFORM,A,O=0,I=0,V,OA,OO,OI ZERO? DEBUG /?CND1 PRINTI "[Perform: " PRINTN A ZERO? O /?CND5 PRINTC 47 EQUAL? A,V?WALK \?ELS11 PRINTN O JUMP ?CND5 ?ELS11: CALL DPRINT,O ?CND5: ZERO? I /?CND14 PRINTC 47 CALL DPRINT,I ?CND14: PRINTC 93 CRLF ?CND1: SET 'OA,PRSA SET 'OO,PRSO SET 'OI,PRSI SET 'PRSA,A ZERO? LIT \?ELS20 CALL SEE-VERB? ZERO? STACK /?ELS20 CALL TOO-DARK RETURN 2 ?ELS20: EQUAL? A,V?WALK /?CND18 EQUAL? IT,I,O \?CND27 ZERO? P-IT-OBJECT /?ELS32 CALL ACCESSIBLE?,P-IT-OBJECT ZERO? STACK \?CND27 ?ELS32: ZERO? I \?ELS39 CALL FAKE-ORPHAN RETURN 2 ?ELS39: CALL REFERRING RETURN 2 ?CND27: EQUAL? THEM,I,O \?CND44 ZERO? P-THEM-OBJECT /?ELS49 CALL VISIBLE?,P-THEM-OBJECT ZERO? STACK /?ELS49 ZERO? DEBUG /?CND52 PRINTI "[them=" CALL DPRINT,P-THEM-OBJECT PRINTC 93 CRLF ?CND52: EQUAL? THEM,O \?CND56 SET 'O,P-THEM-OBJECT ?CND56: EQUAL? THEM,I \?CND44 SET 'I,P-THEM-OBJECT JUMP ?CND44 ?ELS49: ZERO? I \?ELS66 CALL FAKE-ORPHAN RETURN 2 ?ELS66: CALL REFERRING,TRUE-VALUE RETURN 2 ?CND44: EQUAL? HER,I,O \?CND71 ZERO? P-HER-OBJECT /?ELS76 CALL VISIBLE?,P-HER-OBJECT ZERO? STACK /?ELS76 ZERO? DEBUG /?CND79 PRINTI "[her=" CALL DPRINT,P-HER-OBJECT PRINTC 93 CRLF ?CND79: EQUAL? HER,O \?CND83 SET 'O,P-HER-OBJECT ?CND83: EQUAL? HER,I \?CND71 SET 'I,P-HER-OBJECT JUMP ?CND71 ?ELS76: ZERO? I \?ELS93 CALL FAKE-ORPHAN RETURN 2 ?ELS93: CALL REFERRING,TRUE-VALUE RETURN 2 ?CND71: EQUAL? HIM,I,O \?CND98 ZERO? P-HIM-OBJECT /?ELS103 CALL VISIBLE?,P-HIM-OBJECT ZERO? STACK /?ELS103 ZERO? DEBUG /?CND106 PRINTI "[him=" CALL DPRINT,P-HIM-OBJECT PRINTC 93 CRLF ?CND106: EQUAL? HIM,O \?CND110 SET 'O,P-HIM-OBJECT ?CND110: EQUAL? HIM,I \?CND98 SET 'I,P-HIM-OBJECT JUMP ?CND98 ?ELS103: ZERO? I \?ELS120 CALL FAKE-ORPHAN RETURN 2 ?ELS120: CALL REFERRING,TRUE-VALUE RETURN 2 ?CND98: EQUAL? O,IT \?CND125 SET 'O,P-IT-OBJECT ZERO? DEBUG /?CND125 PRINTI "[it=" CALL DPRINT,O PRINTC 93 CRLF ?CND125: EQUAL? I,IT \?CND18 SET 'I,P-IT-OBJECT ZERO? DEBUG /?CND18 PRINTI "[it=" CALL DPRINT,O PRINTC 93 CRLF ?CND18: SET 'PRSI,I SET 'PRSO,O SET 'V,FALSE-VALUE EQUAL? A,V?WALK /?CND139 EQUAL? NOT-HERE-OBJECT,PRSO,PRSI \?CND139 CALL NOT-HERE-OBJECT-F >V ZERO? V /?CND139 SET 'P-WON,FALSE-VALUE ?CND139: CALL THIS-IS-IT,PRSI CALL THIS-IS-IT,PRSO SET 'O,PRSO SET 'I,PRSI ZERO? V \?CND148 GETP WINNER,P?ACTION CALL STACK >V ?CND148: ZERO? V \?CND151 LOC WINNER GETP STACK,P?ACTION CALL STACK,M-BEG >V ?CND151: ZERO? V \?CND154 GET PREACTIONS,A CALL STACK >V ?CND154: ZERO? V \?CND157 ZERO? I /?CND157 EQUAL? A,V?WALK /?CND157 LOC I ZERO? STACK /?CND157 LOC I GETP STACK,P?CONTFCN >V ZERO? V /?CND157 CALL V,M-CONT >V ?CND157: ZERO? V \?CND166 ZERO? I /?CND166 GETP I,P?ACTION CALL STACK >V ?CND166: ZERO? V \?CND171 ZERO? O /?CND171 EQUAL? A,V?WALK /?CND171 LOC O ZERO? STACK /?CND171 LOC O GETP STACK,P?CONTFCN >V ZERO? V /?CND171 CALL V,M-CONT >V ?CND171: ZERO? V \?CND180 ZERO? O /?CND180 EQUAL? A,V?WALK /?CND180 GETP O,P?ACTION CALL STACK >V ZERO? V /?CND180 CALL THIS-IS-IT,O ?CND180: ZERO? V \?CND189 GET ACTIONS,A CALL STACK >V ?CND189: EQUAL? V,M-FATAL /?CND192 CALL GAME-VERB? ZERO? STACK \?CND192 GETP HERE,P?ACTION CALL STACK,M-END >V ?CND192: SET 'PRSA,OA SET 'PRSO,OO SET 'PRSI,OI RETURN V .FUNCT BUZZER-WORD?,WORD CALL NUMBER-WORD?,WORD ZERO? STACK \TRUE CALL NAUGHTY-WORD?,WORD ZERO? STACK /FALSE RTRUE .FUNCT NUMBER-WORD?,WRD EQUAL? WRD,W?ONE /?THN6 EQUAL? WRD,W?TWO,W?THREE,W?FOUR /?THN6 EQUAL? WRD,W?FIVE,W?SIX,W?SEVEN /?THN6 EQUAL? WRD,W?EIGHT,W?NINE,W?TEN /?THN6 EQUAL? WRD,W?ELEVEN,W?TWELVE,W?THIRTE /?THN6 EQUAL? WRD,W?FOURTE,W?FIFTEE,W?SIXTEE /?THN6 EQUAL? WRD,W?SEVENT,W?EIGHTE,W?NINETE /?THN6 EQUAL? WRD,W?TWENTY,W?THIRTY,W?FORTY /?THN6 EQUAL? WRD,W?FIFTY,W?SIXTY,W?EIGHTY /?THN6 EQUAL? WRD,W?NINETY,W?HUNDRE,W?THOUSA /?THN6 EQUAL? WRD,W?MILLIO,W?BILLIO,W?ZERO \FALSE ?THN6: PRINTR "[Use numerals for numbers, for example ""10.""]" .FUNCT NAUGHTY-WORD?,WORD EQUAL? WORD,W?CURSE,W?GODDAMNED,W?CUSS /?THN6 EQUAL? WORD,W?DAMN,W?SHIT,W?FUCK /?THN6 EQUAL? WORD,W?SHITHEAD,W?PISS,W?SUCK /?THN6 EQUAL? WORD,W?BASTARD,W?SCREW,W?FUCKING /?THN6 EQUAL? WORD,W?DAMNED,W?PEE,W?COCKSUCKER /?THN6 EQUAL? WORD,W?FUCKED,W?CUNT,W?ASSHOLE /?THN6 EQUAL? WORD,W?BITCH \FALSE ?THN6: CALL PICK-ONE,OFFENDED PRINT STACK CRLF RTRUE .FUNCT VERB-DIR-ONLY?,WRD,?ORTMP CALL WT?,WRD,128 ZERO? STACK \FALSE CALL WT?,WRD,32 ZERO? STACK \FALSE CALL WT?,WRD,16 POP '?ORTMP ZERO? ?ORTMP /?ORP6 RETURN ?ORTMP ?ORP6: CALL WT?,WRD,64 RSTACK .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,59 /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 NUMBER?,PTR,CNT,BPTR,CHR,SUM=0,TIM=0,EXC=0,NOHYP?=0,?TMP1 MUL PTR,2 ADD P-LEXV,STACK GETB STACK,2 >CNT EQUAL? CNT,7 \?CND1 SET 'NOHYP?,TRUE-VALUE ?CND1: MUL PTR,2 ADD P-LEXV,STACK GETB STACK,3 >BPTR ?PRG4: DLESS? 'CNT,0 /?REP5 GETB P-INBUF,BPTR >CHR ZERO? NOHYP? /?CND11 EQUAL? CNT,3 \?CND11 EQUAL? CHR,45 /?CND11 ZERO? TIM \FALSE SET 'EXC,SUM SET 'SUM,0 ?CND11: EQUAL? CHR,58 \?ELS22 ZERO? EXC \FALSE SET 'TIM,SUM SET 'SUM,0 JUMP ?CND20 ?ELS22: EQUAL? CHR,45 \?ELS28 SET 'NOHYP?,FALSE-VALUE ZERO? TIM \FALSE SET 'EXC,SUM SET 'SUM,0 JUMP ?CND20 ?ELS28: GRTR? SUM,9999 \?ELS34 SET 'SUM,10000 JUMP ?REP5 ?ELS34: LESS? CHR,58 \FALSE GRTR? CHR,47 \FALSE MUL SUM,10 >?TMP1 SUB CHR,48 ADD ?TMP1,STACK >SUM ?CND20: INC 'BPTR JUMP ?PRG4 ?REP5: PUT P-LEXV,PTR,W?INTNUM PUT AGAIN-LEXV,PTR,W?INTNUM ZERO? EXC /?ELS43 SET 'P-EXCHANGE,EXC JUMP ?CND41 ?ELS43: ZERO? TIM /?ELS46 SET 'P-EXCHANGE,0 GRTR? TIM,23 /FALSE GRTR? TIM,19 /?CND48 GRTR? TIM,12 /FALSE GRTR? TIM,7 /?CND48 ADD 12,TIM >TIM ?CND48: MUL TIM,60 ADD SUM,STACK >SUM JUMP ?CND41 ?ELS46: SET 'P-EXCHANGE,0 ?CND41: SET 'P-NUMBER,SUM RETURN W?INTNUM .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,64,1 >?TMP1 GET P-OTBL,P-VERB EQUAL? ?TMP1,STACK /?THN4 CALL WT?,WRD,32 ZERO? STACK /?ELS3 ?THN4: SET 'ADJ,TRUE-VALUE JUMP ?CND1 ?ELS3: CALL WT?,WRD,128,0 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 ZERO? TEMP /?THN22 GET P-OTBL,P-PREP1 EQUAL? TEMP,STACK \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 ZERO? TEMP /?THN43 GET P-OTBL,P-PREP2 EQUAL? TEMP,STACK \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 ?CND10 ?ELS75: SET 'P-ACLAUSE,FALSE-VALUE RFALSE ?ELS72: EQUAL? WRD,W?ALL,W?ONE /?THN81 GETB WRD,P-PSOFF BTST STACK,32 \?ELS80 CALL ADJ-CHECK,WRD,ADJ ZERO? STACK /?ELS80 ?THN81: SET 'ADJ,WRD JUMP ?CND70 ?ELS80: EQUAL? WRD,W?ONE \?ELS86 CALL CLAUSE-WIN,ADJ JUMP ?CND10 ?ELS86: GETB WRD,P-PSOFF BTST STACK,128 \?CND70 ADD BEG,P-WORDLEN EQUAL? STACK,END \?CND70 EQUAL? WRD,P-ANAM \?ELS93 CALL CLAUSE-WIN,ADJ JUMP ?CND10 ?ELS93: 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 ?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 ?PRG99: IGRTR? 'CNT,P-ITBLLEN \?ELS103 SET 'P-MERGED,TRUE-VALUE RTRUE ?ELS103: GET P-OTBL,CNT PUT P-ITBL,CNT,STACK JUMP ?PRG99 .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,MSG,?TMP1 PUT OOPS-TABLE,O-PTR,PTR CALL PICK-ONE,UNKNOWN-MSGS >MSG PRINTC 91 GET MSG,0 PRINT STACK MUL PTR,2 >BUF ADD P-LEXV,BUF GETB STACK,2 >?TMP1 ADD P-LEXV,BUF GETB STACK,3 CALL WORD-PRINT,?TMP1,STACK SET 'QUOTE-FLAG,FALSE-VALUE SET 'P-OFLAG,FALSE-VALUE GET MSG,1 PRINT STACK PRINTR "]" .FUNCT SYNTAX-CHECK,SYN,LEN,NUM,OBJ,DRIVE1=0,DRIVE2=0,PREP,VERB,?TMP2,?TMP1 GET P-ITBL,P-VERB >VERB ZERO? VERB \?CND1 CALL NOT-IN-SENTENCE,STR?10 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 /?CND6 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 \?REP5 CALL DONT-UNDERSTAND 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? VERB,ACT?FIND \?ELS48 PRINTI "That's your problem!" CRLF RFALSE ?ELS48: EQUAL? WINNER,PLAYER \?ELS53 CALL ORPHAN,DRIVE1,DRIVE2 PRINTI "[Wh" JUMP ?CND51 ?ELS53: PRINTI "[Your command wasn't complete. Next time, type wh" ?CND51: EQUAL? VERB,ACT?WALK,ACT?GO \?ELS58 PRINTI "ere" JUMP ?CND56 ?ELS58: ZERO? DRIVE1 /?ELS64 GETB DRIVE1,P-SFWIM1 EQUAL? STACK,ACTORBIT /?THN61 ?ELS64: ZERO? DRIVE2 /?ELS60 GETB DRIVE2,P-SFWIM2 EQUAL? STACK,ACTORBIT \?ELS60 ?THN61: PRINTI "om" JUMP ?CND56 ?ELS60: PRINTI "at" ?CND56: EQUAL? WINNER,PLAYER \?ELS71 PRINTI " do you want to " JUMP ?CND69 ?ELS71: PRINTI " you want" CALL TPRINT,WINNER PRINTI " to " ?CND69: CALL VERB-PRINT ZERO? DRIVE2 /?CND74 CALL CLAUSE-PRINT,P-NC1,P-NC1L ?CND74: SET 'P-END-ON-PREP,FALSE-VALUE ZERO? DRIVE1 /?ELS82 GETB DRIVE1,P-SPREP1 JUMP ?CND78 ?ELS82: GETB DRIVE2,P-SPREP2 ?CND78: CALL PREP-PRINT,STACK EQUAL? WINNER,PLAYER \?ELS88 SET 'P-OFLAG,TRUE-VALUE PRINTI "?]" CRLF RFALSE ?ELS88: 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: GETB P-VTBL,2 ZERO? STACK \?ELS7 GET TMP,0 PRINTB STACK RTRUE ?ELS7: GETB TMP,2 >?TMP1 GETB TMP,3 CALL WORD-PRINT,?TMP1,STACK PUTB P-VTBL,2,0 RTRUE .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 /?REP5 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: PRINTC 32 ?CND8: GET BEG,0 >WRD EQUAL? WRD,W?HIM \?ELS20 CALL VISIBLE?,P-HIM-OBJECT ZERO? STACK /?THN17 ?ELS20: EQUAL? WRD,W?HER \?ELS22 CALL VISIBLE?,P-HER-OBJECT ZERO? STACK /?THN17 ?ELS22: EQUAL? WRD,W?THEM \?CND14 CALL VISIBLE?,P-THEM-OBJECT ZERO? STACK \?CND14 ?THN17: SET 'PN,TRUE-VALUE ?CND14: EQUAL? WRD,W?PERIOD \?ELS27 SET 'NOSP,TRUE-VALUE JUMP ?CND3 ?ELS27: EQUAL? WRD,W?ALL \?ELS29 PRINTI "all" JUMP ?CND3 ?ELS29: CALL WT?,WRD,4 ZERO? STACK \?THN34 CALL WT?,WRD,8 ZERO? STACK /?ELS31 ?THN34: CALL WT?,WRD,32 ZERO? STACK \?ELS31 CALL WT?,WRD,128 ZERO? STACK \?ELS31 SET 'NOSP,TRUE-VALUE JUMP ?CND3 ?ELS31: EQUAL? WRD,W?ME \?ELS37 CALL DPRINT,PLAYER SET 'PN,TRUE-VALUE JUMP ?CND3 ?ELS37: CALL NAME?,WRD ZERO? STACK /?ELS39 CALL CAPITALIZE,BEG SET 'PN,TRUE-VALUE JUMP ?CND3 ?ELS39: ZERO? FIRST?? /?CND42 ZERO? PN \?CND42 ZERO? CP /?CND42 PRINTI "the " ?CND42: ZERO? P-OFLAG \?THN50 ZERO? P-MERGED /?ELS49 ?THN50: PRINTB WRD JUMP ?CND47 ?ELS49: EQUAL? WRD,W?IT \?ELS53 CALL VISIBLE?,P-IT-OBJECT ZERO? STACK /?ELS53 CALL DPRINT,P-IT-OBJECT JUMP ?CND47 ?ELS53: EQUAL? WRD,W?HER \?ELS57 ZERO? PN \?ELS57 CALL DPRINT,P-HER-OBJECT JUMP ?CND47 ?ELS57: EQUAL? WRD,W?THEM \?ELS61 ZERO? PN \?ELS61 CALL DPRINT,P-THEM-OBJECT JUMP ?CND47 ?ELS61: EQUAL? WRD,W?HIM \?ELS65 ZERO? PN \?ELS65 CALL DPRINT,P-HIM-OBJECT JUMP ?CND47 ?ELS65: GETB BEG,2 >?TMP1 GETB BEG,3 CALL WORD-PRINT,?TMP1,STACK ?CND47: SET 'FIRST??,FALSE-VALUE ?CND3: ADD BEG,P-WORDLEN >BEG JUMP ?PRG1 .FUNCT NAME?,WRD EQUAL? WRD,W?MR,W?MRS,W?MISS /TRUE EQUAL? WRD,W?BUCK,W?PALACE,W?HERMAN /TRUE EQUAL? WRD,W?HILDEG,W?BURBAN,W?AUNT /TRUE EQUAL? WRD,W?COUSIN,W?UNCLE,W?BUDDY \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,SP?=1,WRD ZERO? PREP /FALSE ZERO? P-END-ON-PREP \FALSE ZERO? SP? /?CND8 PRINTC 32 ?CND8: CALL PREP-FIND,PREP >WRD EQUAL? WRD,W?THROUGH \?ELS14 PRINTI "through" JUMP ?CND12 ?ELS14: PRINTB WRD ?CND12: GET P-ITBL,P-VERBN GET STACK,0 EQUAL? W?SIT,STACK \?CND17 EQUAL? W?DOWN,WRD \?CND17 PRINTI " on" ?CND17: GET P-ITBL,P-VERBN GET STACK,0 EQUAL? W?GET,STACK \TRUE EQUAL? W?OUT,WRD \TRUE PRINTI " of" 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 /?REP2 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 /?CND6 GET B,0 CALL CLAUSE-ADD,STACK ADD B,P-WORDLEN >B JUMP ?PRG14 ?ELS13: GET OCL,1 EQUAL? INSRT,STACK /?CND21 CALL CLAUSE-ADD,INSRT ?CND21: CALL CLAUSE-ADD,P-ANAM JUMP ?CND6 ?ELS8: GET BEG,0 CALL CLAUSE-ADD,STACK ?CND6: ADD BEG,P-WORDLEN >BEG JUMP ?PRG1 ?REP2: EQUAL? SRC,DEST \?CND26 GRTR? OBEG,0 \?CND26 GET OCL,P-MATCHLEN SUB STACK,OBEG >CNT LESS? 0,CNT \?CND26 PUT OCL,P-MATCHLEN,0 INC 'OBEG ?PRG31: GET OCL,OBEG CALL CLAUSE-ADD,STACK,TRUE-VALUE SUB CNT,2 >CNT ZERO? CNT /?REP32 ADD OBEG,2 >OBEG JUMP ?PRG31 ?REP32: SET 'OBEG,0 ?CND26: 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,CHECK?=0,OCL,PTR GET P-CCTBL,CC-OCLAUSE >OCL GET OCL,P-MATCHLEN >PTR ZERO? CHECK? /?ELS5 ZERO? PTR /?ELS5 CALL ZMEMQ,WRD,OCL ZERO? STACK \FALSE ?ELS5: ADD PTR,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 PRINTC 91 CALL PREP-PRINT,PREP,FALSE-VALUE ZERO? STACK /?ELS16 CALL TPRINT,OBJ JUMP ?CND14 ?ELS16: CALL DPRINT,OBJ ?CND14: PRINTC 93 CRLF RETURN OBJ ?ELS8: SET 'P-GWIMBIT,0 RFALSE .FUNCT SNARF-OBJECTS,PTR GET P-ITBL,P-NC1 >PTR ZERO? PTR /?CND1 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 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 /?REP2 GET TBL,CNT >OBJ CALL ZMEMQ,OBJ,P-BUTS ZERO? STACK \?CND3 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,ONEOBJ 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?EVERYTHING \?ELS26 SET 'P-GETFLAGS,P-ALL EQUAL? NW,W?OF \?CND6 ADD PTR,P-WORDLEN >PTR JUMP ?CND6 ?ELS26: EQUAL? WRD,W?BUT,W?EXCEPT \?ELS31 ZERO? BUT /?ORP37 PUSH BUT JUMP ?THN34 ?ORP37: PUSH TBL ?THN34: CALL GET-OBJECT,STACK ZERO? STACK /FALSE SET 'BUT,P-BUTS PUT BUT,P-MATCHLEN,0 JUMP ?CND6 ?ELS31: CALL BUZZER-WORD?,WRD ZERO? STACK \FALSE EQUAL? WRD,W?A \?ELS41 ZERO? P-ADJ \?ELS44 SET 'P-GETFLAGS,P-ONE EQUAL? NW,W?OF \?CND6 ADD PTR,P-WORDLEN >PTR JUMP ?CND6 ?ELS44: SET 'P-NAM,ONEOBJ ZERO? BUT /?ORP55 PUSH BUT JUMP ?THN52 ?ORP55: PUSH TBL ?THN52: CALL GET-OBJECT,STACK ZERO? STACK /FALSE ZERO? NW \?CND6 RTRUE ?ELS41: EQUAL? WRD,W?AND,W?COMMA \?ELS59 EQUAL? NW,W?AND,W?COMMA /?ELS59 SET 'P-AND,TRUE-VALUE ZERO? BUT /?ORP67 PUSH BUT JUMP ?THN64 ?ORP67: PUSH TBL ?THN64: CALL GET-OBJECT,STACK ZERO? STACK \?CND6 RFALSE ?ELS59: CALL WT?,WRD,4 ZERO? STACK \?CND6 EQUAL? WRD,W?AND,W?COMMA /?CND6 EQUAL? WRD,W?OF \?ELS73 ZERO? P-GETFLAGS \?CND6 SET 'P-GETFLAGS,P-INHIBIT JUMP ?CND6 ?ELS73: CALL WT?,WRD,32,2 >WV ZERO? WV /?ELS78 CALL ADJ-CHECK,WRD,P-ADJ ZERO? STACK /?ELS78 SET 'P-ADJ,WV SET 'P-ADJN,WRD JUMP ?CND6 ?ELS78: CALL WT?,WRD,128 ZERO? STACK /?CND6 SET 'P-NAM,WRD SET 'ONEOBJ,WRD ?CND6: EQUAL? PTR,EPTR /?PRG4 ADD PTR,P-WORDLEN >PTR SET 'WRD,NW JUMP ?PRG4 .FUNCT ADJ-CHECK,WRD,ADJ ZERO? ADJ /TRUE EQUAL? WRD,W?COPY,W?FILM,W?SLIDE /TRUE EQUAL? WRD,W?FIRST,W?SECOND,W?THIRD /TRUE EQUAL? WRD,W?SAWED /TRUE EQUAL? WRD,W?RED,W?WHITE,W?BLUE /TRUE EQUAL? WRD,W?ORANGE,W?YELLOW,W?GREEN /TRUE EQUAL? WRD,W?INDIGO,W?VIOLET \FALSE RTRUE .FUNCT GET-OBJECT,TBL,VRB=1,BTS,LEN,XBITS,TLEN,GCHECK=0,OLEN=0,OBJ,ADJ,X SET 'XBITS,P-SLOCBITS GET TBL,P-MATCHLEN >TLEN BTST P-GETFLAGS,P-INHIBIT /TRUE SET 'ADJ,P-ADJN ZERO? P-NAM \?CND4 ZERO? P-ADJ /?CND4 CALL WT?,P-ADJN,128 ZERO? STACK /?ELS11 SET 'P-NAM,P-ADJN SET 'P-ADJ,FALSE-VALUE JUMP ?CND4 ?ELS11: CALL WT?,P-ADJN,16,3 >BTS ZERO? BTS /?CND4 SET 'P-ADJ,FALSE-VALUE PUT TBL,P-MATCHLEN,1 PUT TBL,1,INTDIR SET 'P-DIRECTION,BTS RTRUE ?CND4: ZERO? P-NAM \?CND14 ZERO? P-ADJ \?CND14 EQUAL? P-GETFLAGS,P-ALL /?CND14 ZERO? P-GWIMBIT \?CND14 ZERO? VRB /FALSE CALL NOT-IN-SENTENCE,STR?11 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 /?CND36 FCLEAR PLAYER,TRANSBIT CALL DO-SL,HERE,SOG,SIR FSET PLAYER,TRANSBIT ?CND36: CALL DO-SL,PLAYER,SH,SC ?CND30: GET TBL,P-MATCHLEN SUB STACK,TLEN >LEN BTST P-GETFLAGS,P-ALL /?CND40 BTST P-GETFLAGS,P-ONE \?ELS44 ZERO? LEN /?ELS44 EQUAL? LEN,1 /?CND47 RANDOM LEN GET TBL,STACK PUT TBL,1,STACK PRINTI "[How about" GET TBL,1 CALL TPRINT,STACK PRINTI "?]" CRLF ?CND47: PUT TBL,P-MATCHLEN,1 JUMP ?CND40 ?ELS44: GRTR? LEN,1 /?THN52 ZERO? LEN \?ELS51 EQUAL? P-SLOCBITS,-1 /?ELS51 ?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: 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 SET 'P-ADJN,FALSE-VALUE RTRUE ?ELS66: ZERO? VRB /?ELS75 EQUAL? WINNER,PLAYER /?ELS75 PRINTI "[Please try saying that another way.]" CRLF RFALSE ?ELS75: ZERO? VRB /?ELS79 ZERO? P-NAM /?ELS79 CALL WHICH-PRINT,TLEN,LEN,TBL EQUAL? TBL,P-PRSO \?ELS86 PUSH P-NC1 JUMP ?CND82 ?ELS86: PUSH P-NC2 ?CND82: 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 ?ELS79: ZERO? VRB /?CND64 CALL NOT-IN-SENTENCE,STR?11 ?CND64: SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RFALSE ?ELS51: ZERO? LEN \?ELS93 ZERO? GCHECK /?ELS93 ZERO? VRB /?CND96 SET 'P-SLOCBITS,XBITS ZERO? LIT \?THN103 CALL SPEAKING-VERB? ZERO? STACK /?ELS102 ?THN103: CALL OBJ-FOUND,NOT-HERE-OBJECT,TBL SET 'P-XNAM,P-NAM SET 'P-NAM,FALSE-VALUE SET 'P-XADJ,P-ADJ SET 'P-XADJN,P-ADJN SET 'P-ADJ,FALSE-VALUE SET 'P-ADJN,FALSE-VALUE RTRUE ?ELS102: CALL TOO-DARK ?CND96: SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RFALSE ?ELS93: ZERO? LEN \?CND40 SET 'GCHECK,TRUE-VALUE JUMP ?PRG28 ?CND40: ADD TLEN,1 GET TBL,STACK >X SET 'P-SLOCBITS,XBITS SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RTRUE .FUNCT SPEAKING-VERB?,V=0 ZERO? V \?CND1 SET 'V,PRSA ?CND1: EQUAL? V,V?ASK-ABOUT,V?ASK-FOR,V?HELLO /TRUE EQUAL? V,V?TELL,V?QUESTION,V?REPLY \FALSE RTRUE .FUNCT MOBY-FIND,TBL,OBJ=1,LEN,FOO SET 'P-NAM,P-XNAM SET 'P-ADJ,P-XADJ PUT TBL,P-MATCHLEN,0 GETB 0,18 ZERO? STACK /?ELS5 ?PRG6: CALL META-LOC,OBJ >FOO ZERO? FOO /?CND8 CALL THIS-IT?,OBJ >FOO ZERO? FOO /?CND8 CALL OBJ-FOUND,OBJ,TBL >FOO ?CND8: IGRTR? 'OBJ,DUMMY-OBJECT \?PRG6 GET TBL,P-MATCHLEN >LEN EQUAL? LEN,1 \?CND16 GET TBL,1 >P-MOBY-FOUND ?CND16: SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RETURN LEN ?ELS5: SET 'P-MOBY-FLAG,TRUE-VALUE SET 'P-TABLE,TBL SET 'P-SLOCBITS,-1 FIRST? ROOMS >FOO /?KLU37 ?KLU37: ?PRG21: ZERO? FOO /?REP22 CALL SEARCH-LIST,FOO,TBL,P-SRCALL NEXT? FOO >FOO /?PRG21 JUMP ?PRG21 ?REP22: GET TBL,P-MATCHLEN >LEN ZERO? LEN \?CND28 CALL DO-SL,LOCAL-GLOBALS,1,1 ?CND28: GET TBL,P-MATCHLEN >LEN ZERO? LEN \?CND31 CALL DO-SL,ROOMS,1,1 ?CND31: GET TBL,P-MATCHLEN >LEN EQUAL? LEN,1 \?CND34 GET TBL,1 >P-MOBY-FOUND ?CND34: SET 'P-MOBY-FLAG,FALSE-VALUE SET 'P-NAM,FALSE-VALUE SET 'P-ADJ,FALSE-VALUE RETURN LEN .FUNCT WHICH-PRINT,TLEN,LEN,TBL,OBJ,RLEN SET 'RLEN,LEN PRINTI "[Which" EQUAL? P-NAM,W?PLANK \?ELS3 PRINTI " end" JUMP ?CND1 ?ELS3: ZERO? P-OFLAG \?THN6 ZERO? P-MERGED \?THN6 ZERO? P-AND /?ELS5 ?THN6: PRINTC 32 PRINTB P-NAM JUMP ?CND1 ?ELS5: EQUAL? TBL,P-PRSO \?ELS9 CALL CLAUSE-PRINT,P-NC1,P-NC1L,FALSE-VALUE JUMP ?CND1 ?ELS9: CALL CLAUSE-PRINT,P-NC2,P-NC2L,FALSE-VALUE ?CND1: PRINTI " do you mean," ?PRG12: INC 'TLEN GET TBL,TLEN >OBJ CALL TPRINT,OBJ EQUAL? LEN,2 \?ELS16 EQUAL? RLEN,2 /?CND17 PRINTC 44 ?CND17: PRINTI " or" JUMP ?CND14 ?ELS16: GRTR? LEN,2 \?CND14 PRINTC 44 ?CND14: DLESS? 'LEN,1 \?PRG12 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 FIRST? OBJ \?CND6 CALL SEARCH-LIST,OBJ,TBL,P-SRCALL ?CND6: CALL THIS-IT?,OBJ ZERO? STACK /?CND9 CALL OBJ-FOUND,OBJ,TBL ?CND9: IGRTR? 'CNT,RMGL \?PRG4 ?CND1: GETP HERE,P?THINGS >RMG ZERO? RMG /?CND15 GET RMG,0 >RMGL SET 'CNT,0 ?PRG18: ZERO? P-NAM /?ELS22 ADD CNT,1 GET RMG,STACK EQUAL? P-NAM,STACK \?CND20 ?ELS22: ZERO? P-ADJ /?ELS26 ADD CNT,2 GET RMG,STACK EQUAL? P-ADJN,STACK \?CND20 ?ELS26: ZERO? P-NAM \?THN31 ZERO? P-ADJ /?CND20 ?THN31: 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 ?CND15 ?CND20: ADD CNT,3 >CNT LESS? CNT,RMGL /?PRG18 ?CND15: 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 GET TBL,P-MATCHLEN ZERO? STACK \FALSE EQUAL? PRSA,V?LOOK-INSIDE,V?CHASTISE,V?EXAMINE /?THN51 EQUAL? PRSA,V?LEAVE,V?FOLLOW,V?FIND /?THN51 EQUAL? PRSA,V?ENTER,V?SMELL,V?SEARCH /?THN51 EQUAL? PRSA,V?LOOK-ON,V?WAIT-FOR,V?WALK-TO \FALSE ?THN51: CALL DO-SL,ROOMS,1,1 RSTACK .FUNCT DO-SL,OBJ,BIT1,BIT2,BITS 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 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 \?CND13 CALL SEE-INSIDE?,OBJ ZERO? STACK /?CND13 FSET? OBJ,SURFACEBIT \?ELS24 PUSH P-SRCALL JUMP ?CND20 ?ELS24: FSET? OBJ,SEARCHBIT \?ELS26 PUSH P-SRCALL JUMP ?CND20 ?ELS26: PUSH P-SRCTOP ?CND20: CALL SEARCH-LIST,OBJ,TBL,STACK ?CND13: NEXT? OBJ >OBJ /?PRG6 RTRUE .FUNCT THIS-IT?,OBJ,SYNS FSET? OBJ,INVISIBLE /FALSE ZERO? P-NAM /?ELS5 GETPT OBJ,P?SYNONYM >SYNS ZERO? SYNS /FALSE PTSIZE SYNS DIV STACK,2 SUB STACK,1 CALL ZMEMQ,P-NAM,SYNS,STACK ZERO? STACK /FALSE ?ELS5: ZERO? P-ADJ /?ELS11 GETPT OBJ,P?ADJECTIVE >SYNS ZERO? SYNS /FALSE PTSIZE SYNS SUB STACK,1 CALL ZMEMQB,P-ADJ,SYNS,STACK ZERO? STACK /FALSE ?ELS11: ZERO? P-GWIMBIT /TRUE FSET? OBJ,P-GWIMBIT /TRUE RFALSE .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,BITS,PTR,OBJ,TAKEN GET TBL,P-MATCHLEN >PTR ZERO? PTR /TRUE BTST BITS,SHAVE /?THN8 BTST BITS,STAKE \TRUE ?THN8: ?PRG10: DLESS? 'PTR,0 /TRUE ADD PTR,1 GET TBL,STACK >OBJ EQUAL? OBJ,IT \?ELS17 ZERO? P-IT-OBJECT /?THN21 CALL ACCESSIBLE?,P-IT-OBJECT ZERO? STACK \?ELS20 ?THN21: CALL REFERRING RFALSE ?ELS20: SET 'OBJ,P-IT-OBJECT JUMP ?CND15 ?ELS17: EQUAL? OBJ,HER \?ELS26 ZERO? P-HER-OBJECT /?THN30 CALL ACCESSIBLE?,P-HER-OBJECT ZERO? STACK \?ELS29 ?THN30: CALL REFERRING RFALSE ?ELS29: SET 'OBJ,P-HER-OBJECT JUMP ?CND15 ?ELS26: EQUAL? OBJ,HIM \?ELS35 ZERO? P-HIM-OBJECT /?THN39 CALL ACCESSIBLE?,P-HIM-OBJECT ZERO? STACK \?ELS38 ?THN39: CALL REFERRING RFALSE ?ELS38: SET 'OBJ,P-HIM-OBJECT JUMP ?CND15 ?ELS35: EQUAL? OBJ,THEM \?CND15 ZERO? P-THEM-OBJECT /?THN48 CALL ACCESSIBLE?,P-THEM-OBJECT ZERO? STACK \?ELS47 ?THN48: CALL REFERRING RFALSE ?ELS47: SET 'OBJ,P-THEM-OBJECT ?CND15: CALL ULTIMATELY-IN?,OBJ ZERO? STACK \?PRG10 EQUAL? OBJ,HANDS,YOUR-FEET /?PRG10 SET 'PRSO,OBJ FSET? OBJ,TRYTAKEBIT \?ELS59 SET 'TAKEN,TRUE-VALUE JUMP ?CND57 ?ELS59: CALL ULTIMATELY-IN?,OBJ,BUCKET ZERO? STACK /?ELS61 ZERO? BUCKET-PEG /?ELS61 SET 'TAKEN,TRUE-VALUE JUMP ?CND57 ?ELS61: EQUAL? WINNER,PLAYER /?ELS65 SET 'TAKEN,FALSE-VALUE JUMP ?CND57 ?ELS65: BTST BITS,STAKE \?ELS67 CALL ITAKE,FALSE-VALUE EQUAL? STACK,TRUE-VALUE \?ELS67 SET 'TAKEN,FALSE-VALUE JUMP ?CND57 ?ELS67: EQUAL? PRSA,V?PUT \?ELS71 EQUAL? OBJ,WATER /TRUE ?ELS71: SET 'TAKEN,TRUE-VALUE ?CND57: ZERO? TAKEN /?ELS78 BTST BITS,SHAVE \?ELS78 PRINTI "[You don't seem to be holding" GET TBL,P-MATCHLEN LESS? 1,STACK \?ELS83 PRINTI " all those things" JUMP ?CND81 ?ELS83: EQUAL? OBJ,NOT-HERE-OBJECT \?ELS85 PRINTI " that" JUMP ?CND81 ?ELS85: CALL THIS-IS-IT,OBJ CALL TPRINT,OBJ ?CND81: PRINTI "!]" CRLF RFALSE ?ELS78: ZERO? TAKEN \?PRG10 EQUAL? WINNER,PLAYER \?PRG10 PRINTI "[taking" CALL TPRINT,PRSO ZERO? ITAKE-LOC /?CND92 PRINTI " from" CALL TPRINT,ITAKE-LOC ?CND92: PRINTI " first]" CRLF JUMP ?PRG10 .FUNCT MANY-CHECK,LOSS=0,TMP,?TMP1 GET P-PRSO,P-MATCHLEN GRTR? STACK,1 \?ELS3 GETB P-SYNTAX,P-SLOC1 BTST STACK,SMANY /?ELS3 SET 'LOSS,1 JUMP ?CND1 ?ELS3: 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 PRINTC 91 PRINT YOU-CANT PRINTI "use more than one object at a time with """ GET P-ITBL,P-VERBN >TMP ZERO? TMP \?ELS18 PRINTI "tell" JUMP ?CND16 ?ELS18: ZERO? P-OFLAG \?THN21 ZERO? P-MERGED /?ELS20 ?THN21: GET TMP,0 PRINTB STACK JUMP ?CND16 ?ELS20: GETB TMP,2 >?TMP1 GETB TMP,3 CALL WORD-PRINT,?TMP1,STACK ?CND16: 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 \?ELS13 ADD CNT,1 RSTACK ?ELS13: IGRTR? 'CNT,SIZE \?PRG9 RFALSE .FUNCT ZMEMQB,ITM,TBL,SIZE,CNT=0 ?PRG1: GETB TBL,CNT EQUAL? ITM,STACK \?ELS5 ZERO? CNT /TRUE RETURN CNT ?ELS5: IGRTR? 'CNT,SIZE \?PRG1 RFALSE .FUNCT LIT?,RM,OHERE,LIT=0,OGWIM=0 SET 'OHERE,HERE SET 'HERE,RM FSET? RM,ONBIT \?ELS3 SET 'LIT,TRUE-VALUE JUMP ?CND1 ?ELS3: EQUAL? RM,ON-POOL-1 \?ELS5 CALL LIT?,BOAT-DOCK ZERO? STACK /?ELS5 SET 'LIT,TRUE-VALUE JUMP ?CND1 ?ELS5: EQUAL? RM,ON-POOL-2 \?ELS9 CALL LIT?,LEDGE ZERO? STACK /?ELS9 SET 'LIT,TRUE-VALUE JUMP ?CND1 ?ELS9: SET 'OGWIM,P-GWIMBIT SET 'P-GWIMBIT,ONBIT PUT P-MERGE,P-MATCHLEN,0 SET 'P-TABLE,P-MERGE SET 'P-SLOCBITS,-1 EQUAL? OHERE,RM \?CND14 CALL DO-SL,WINNER,1,1 EQUAL? WINNER,PLAYER /?CND14 IN? PLAYER,RM \?CND14 CALL DO-SL,PLAYER,1,1 ?CND14: 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,OGWIM RETURN LIT .FUNCT PICK-ONE,FROB,THIS=0,L,CNT,RND,MSG,RFROB GET FROB,0 >L GET FROB,1 >CNT DEC 'L ADD FROB,2 >FROB MUL CNT,2 ADD FROB,STACK >RFROB ZERO? THIS /?ELS3 ZERO? CNT \?ELS3 SET 'RND,THIS JUMP ?CND1 ?ELS3: SUB L,CNT RANDOM STACK >RND ?CND1: GET RFROB,RND >MSG GET RFROB,1 PUT RFROB,RND,STACK PUT RFROB,1,MSG INC 'CNT EQUAL? CNT,L \?CND8 SET 'CNT,0 ?CND8: PUT FROB,0,CNT RETURN MSG .FUNCT PICK-REMOVE,OBJ,FROB,L,CNT,RND,MSG,RFROB,ROBJ GET FROB,0 >L GET FROB,1 >CNT DEC 'L ADD FROB,2 >FROB ADD CNT,1 MUL STACK,2 ADD FROB,STACK >RFROB SUB L,CNT CALL ZMEMQ,OBJ,RFROB,STACK >RND ZERO? RND /FALSE DEC 'RND GET RFROB,RND >MSG GET RFROB,0 PUT RFROB,RND,STACK PUT RFROB,0,MSG INC 'CNT EQUAL? CNT,L \?CND6 SET 'CNT,0 ?CND6: PUT FROB,0,CNT RETURN MSG .FUNCT DONT-HAVE?,OBJ,WHERE LOC OBJ >WHERE EQUAL? WHERE,PLAYER /FALSE IN? WHERE,PLAYER \?ELS7 PRINTI "You'll have to take" CALL TPRINT,OBJ PRINTC 32 FSET? WHERE,CONTBIT \?ELS10 PRINTI "out" JUMP ?CND8 ?ELS10: PRINTI "off" ?CND8: PRINTI " of" CALL TPRINT,WHERE PRINTR " first." ?ELS7: CALL NOT-HOLDING,OBJ RTRUE .FUNCT NOT-HOLDING,OBJ=0 PRINTI "You're not holding" ZERO? OBJ /?ELS3 CALL TPRINT,OBJ JUMP ?CND1 ?ELS3: PRINTI " that" ?CND1: PRINTR "." .FUNCT ASKING?,ACTOR EQUAL? PRSA,V?QUESTION,V?ASK-FOR,V?ASK-ABOUT \FALSE EQUAL? PRSO,ACTOR \FALSE RTRUE .FUNCT TALKING-TO?,ACTOR CALL ASKING?,ACTOR ZERO? STACK \TRUE EQUAL? PRSA,V?WAVE-AT,V?HELLO,V?TELL /?THN10 EQUAL? PRSA,V?ALARM,V?REPLY \FALSE ?THN10: EQUAL? PRSO,ACTOR \FALSE RTRUE .FUNCT TOUCHING?,THING EQUAL? PRSA,V?TAKE,V?RUB,V?SHAKE /TRUE EQUAL? PRSA,V?SWING /TRUE EQUAL? PRSA,V?CLEAN,V?PUT,V?PUT-ON /TRUE EQUAL? PRSA,V?MOVE,V?PULL,V?PUSH /TRUE EQUAL? PRSA,V?PUT-UNDER,V?PUT-BEHIND,V?SMELL /TRUE EQUAL? PRSA,V?KISS,V?BURN /TRUE CALL HURT?,THING ZERO? STACK /FALSE RTRUE .FUNCT HURT?,THING EQUAL? PRSA,V?MUNG,V?KICK,V?KILL /?THN8 EQUAL? PRSA,V?KNOCK,V?SQUEEZE,V?CUT /?THN8 EQUAL? PRSA,V?BITE,V?RAPE,V?SHAKE \?ELS5 ?THN8: EQUAL? PRSO,THING /TRUE ?ELS5: EQUAL? PRSA,V?THROW \FALSE EQUAL? PRSI,THING \FALSE RTRUE .FUNCT ANYONE-HERE?,OBJ FIRST? HERE >OBJ /?KLU12 ?KLU12: ?PRG1: ZERO? OBJ \?ELS5 RETURN OBJ ?ELS5: FSET? OBJ,ACTORBIT \?ELS7 EQUAL? OBJ,PLAYER /?ELS7 RETURN OBJ ?ELS7: NEXT? OBJ >OBJ /?PRG1 JUMP ?PRG1 .FUNCT GETTING-INTO? EQUAL? PRSA,V?WALK-TO,V?ENTER /TRUE EQUAL? PRSA,V?SIT,V?STAND-ON,V?LIE-DOWN /TRUE EQUAL? PRSA,V?CLIMB-UP,V?CLIMB-ON,V?LEAP /TRUE EQUAL? PRSA,V?SWIM,V?WEAR,V?WALK-AROUND \FALSE RTRUE .FUNCT SAY-THE,THING PRINTI "The " CALL DPRINT,THING RSTACK .FUNCT BUT-THE,THING PRINTI "But" CALL TPRINT,THING PRINTC 32 RTRUE .FUNCT MOVING?,THING EQUAL? PRSA,V?MOVE,V?PULL,V?PUSH /?THN8 EQUAL? PRSA,V?TAKE,V?TURN,V?PUSH-TO /?THN8 EQUAL? PRSA,V?RAISE,V?SHAKE \FALSE ?THN8: EQUAL? PRSO,THING \FALSE RTRUE .FUNCT NOT-HERE-OBJECT-F,TBL,PRSO?=1,OBJ EQUAL? PRSO,NOT-HERE-OBJECT \?ELS3 EQUAL? PRSI,NOT-HERE-OBJECT \?ELS3 PRINTR "Those things aren't here!" ?ELS3: EQUAL? PRSO,NOT-HERE-OBJECT \?ELS7 SET 'TBL,P-PRSO JUMP ?CND1 ?ELS7: SET 'TBL,P-PRSI SET 'PRSO?,FALSE-VALUE ?CND1: ZERO? PRSO? /?ELS12 EQUAL? PRSA,V?FIND,V?FOLLOW,V?BUY /?THN17 EQUAL? PRSA,V?WAIT-FOR,V?WALK-TO /?THN17 EQUAL? PRSA,V?TAKE \?CND10 EQUAL? WINNER,PLAYER /?CND10 ?THN17: CALL FIND-NOT-HERE,TBL,PRSO? >OBJ ZERO? OBJ /FALSE EQUAL? OBJ,NOT-HERE-OBJECT /?CND10 RETURN 2 ?ELS12: EQUAL? PRSA,V?TELL,V?ASK-ABOUT,V?ASK-FOR /FALSE ?CND10: PRINT YOU-CANT PRINTI "see" CALL NAME?,P-XNAM ZERO? STACK \?CND36 PRINTI " any" ?CND36: CALL NOT-HERE-PRINT,PRSO? PRINTI " here!" CRLF CALL PCLEAR RETURN 2 .FUNCT FIND-NOT-HERE,TBL,PRSO?,M-F,OBJ CALL MOBY-FIND,TBL >M-F ZERO? DEBUG /?CND1 PRINTI "[Found " PRINTN M-F PRINTI " obj]" CRLF ?CND1: EQUAL? 1,M-F \?ELS9 ZERO? DEBUG /?CND10 PRINTI "[Namely:" CALL DPRINT,P-MOBY-FOUND PRINTC 93 CRLF ?CND10: ZERO? PRSO? /?ELS16 SET 'PRSO,P-MOBY-FOUND RFALSE ?ELS16: SET 'PRSI,P-MOBY-FOUND RFALSE ?ELS9: ZERO? PRSO? \?ELS21 PRINTI "You wouldn't find any" CALL NOT-HERE-PRINT,PRSO? PRINTR " there." ?ELS21: RETURN NOT-HERE-OBJECT .FUNCT NOT-HERE-PRINT,PRSO?=0,?TMP1 ZERO? P-OFLAG \?THN6 ZERO? P-MERGED /?ELS5 ?THN6: ZERO? P-XADJ /?CND8 PRINTC 32 PRINTB P-XADJN ?CND8: ZERO? P-XNAM /FALSE PRINTC 32 PRINTB P-XNAM RTRUE ?ELS5: ZERO? PRSO? /?ELS19 GET P-ITBL,P-NC1 >?TMP1 GET P-ITBL,P-NC1L CALL BUFFER-PRINT,?TMP1,STACK,FALSE-VALUE RSTACK ?ELS19: GET P-ITBL,P-NC2 >?TMP1 GET P-ITBL,P-NC2L CALL BUFFER-PRINT,?TMP1,STACK,FALSE-VALUE RSTACK .FUNCT MOVE-ALL,FROM,TO=0,OBJ,NXT FIRST? FROM >OBJ /?KLU18 ?KLU18: ?PRG1: ZERO? OBJ /TRUE NEXT? OBJ >NXT /?KLU19 ?KLU19: FCLEAR OBJ,WORNBIT EQUAL? OBJ,FUSE /?CND7 ZERO? TO /?ELS12 MOVE OBJ,TO JUMP ?CND7 ?ELS12: REMOVE OBJ ?CND7: SET 'OBJ,NXT JUMP ?PRG1 .FUNCT GLOBAL-IN?,OBJ1,OBJ2,TBL GETPT OBJ2,P?GLOBAL >TBL ZERO? TBL /FALSE PTSIZE TBL SUB STACK,1 CALL ZMEMQB,OBJ1,TBL,STACK RSTACK .FUNCT WHAT-A-CONCEPT PRINTR "What a concept!" .FUNCT YOU-DONT-NEED,THING,STRING?=0 PRINTI "[You don't need to refer to" ZERO? STRING? /?ELS3 CALL TPRINT,THING JUMP ?CND1 ?ELS3: CALL TPRINT,THING ?CND1: PRINTR " that way to finish this story.]" .FUNCT ITS-CLOSED,OBJ CALL THIS-IS-IT,OBJ CALL SAY-THE,OBJ CALL IS-CLOSED CRLF RTRUE .FUNCT IS-CLOSED PRINTI " is closed." RTRUE .ENDI