checkpoint/parser.zap
historicalsource 8ae301e53b Final Revision
2019-04-13 22:12:44 -04:00

2531 lines
54 KiB
Plaintext

.FUNCT MAIN-LOOP,X
?PRG1: CALL1 MAIN-LOOP-1 >X
JUMP ?PRG1
.FUNCT MAIN-LOOP-1,ICNT,OCNT,NUM,CNT,OBJ,TBL,V,PTBL,OBJ1,TMP,X,?TMP1
SET 'CNT,0
SET 'OBJ,FALSE-VALUE
SET 'PTBL,TRUE-VALUE
EQUAL? QCONTEXT-ROOM,HERE /?CND1
SET 'QCONTEXT,FALSE-VALUE
?CND1: CALL1 PARSER
ZERO? STACK /?ELS6
SET 'CLOCK-WAIT,FALSE-VALUE
GET P-PRSI,P-MATCHLEN >ICNT
GET P-PRSO,P-MATCHLEN >OCNT
ZERO? P-IT-OBJECT /?CND7
CALL2 ACCESSIBLE?,P-IT-OBJECT
ZERO? STACK /?CND7
SET 'TMP,FALSE-VALUE
?PRG12: IGRTR? 'CNT,ICNT \?CND14
JUMP ?REP13
?CND14: GET P-PRSI,CNT
EQUAL? STACK,IT \?PRG12
PUT P-PRSI,CNT,P-IT-OBJECT
PRINT I-ASSUME
CALL2 PRINTT,P-IT-OBJECT
PRINTI ".)"
CRLF
SET 'TMP,TRUE-VALUE
?REP13: ZERO? TMP \?CND22
SET 'CNT,0
?PRG25: IGRTR? 'CNT,OCNT \?CND27
JUMP ?CND22
?CND27: GET P-PRSO,CNT
EQUAL? STACK,IT \?PRG25
PUT P-PRSO,CNT,P-IT-OBJECT
PRINT I-ASSUME
CALL2 PRINTT,P-IT-OBJECT
PRINTI ".)"
CRLF
?CND22: SET 'CNT,0
?CND7: ZERO? OCNT \?ELS39
PUSH OCNT
JUMP ?CND35
?ELS39: GRTR? OCNT,1 \?ELS41
SET 'TBL,P-PRSO
ZERO? ICNT \?ELS44
SET 'OBJ,FALSE-VALUE
JUMP ?CND42
?ELS44: GET P-PRSI,1 >OBJ
?CND42: PUSH OCNT
JUMP ?CND35
?ELS41: GRTR? ICNT,1 \?ELS48
SET 'PTBL,FALSE-VALUE
SET 'TBL,P-PRSI
GET P-PRSO,1 >OBJ
PUSH ICNT
JUMP ?CND35
?ELS48: PUSH 1
?CND35: SET 'NUM,STACK
ZERO? OBJ \?CND51
EQUAL? ICNT,1 \?CND51
GET P-PRSI,1 >OBJ
?CND51: EQUAL? PRSA,V?WALK,V?FACE \?ELS58
CALL PERFORM,PRSA,PRSO >V
JUMP ?CND56
?ELS58: ZERO? NUM \?ELS60
GETB P-SYNTAX,P-SBITS
BAND STACK,P-SONUMS
ZERO? STACK \?ELS63
CALL2 PERFORM,PRSA >V
SET 'PRSO,FALSE-VALUE
JUMP ?CND56
?ELS63: ZERO? LIT \?ELS65
SET 'QUOTE-FLAG,FALSE-VALUE
SET 'P-CONT,FALSE-VALUE
CALL1 TOO-DARK
JUMP ?CND56
?ELS65: SET 'QUOTE-FLAG,FALSE-VALUE
SET 'P-CONT,FALSE-VALUE
PRINTI "(There isn't anything to "
GET P-ITBL,P-VERBN >TMP
EQUAL? PRSA,V?TELL \?ELS72
PRINTI "talk to"
JUMP ?CND70
?ELS72: ZERO? P-MERGED \?THN77
ZERO? P-OFLAG /?ELS76
?THN77: GET TMP,0
PRINTB STACK
JUMP ?CND70
?ELS76: GETB TMP,2 >?TMP1
GETB TMP,3
CALL WORD-PRINT,?TMP1,STACK >V
?CND70: PRINTI "!)"
CRLF
SET 'V,FALSE-VALUE
JUMP ?CND56
?ELS60: SET 'X,0
SET 'TMP,0
?PRG85: IGRTR? 'CNT,NUM \?ELS89
GRTR? X,0 \?ELS92
PRINTI "The "
EQUAL? X,NUM /?CND95
PRINTI "other "
?CND95: PRINTI "object"
EQUAL? X,1 /?CND102
PRINTI "s"
?CND102: PRINTI " that you mentioned "
EQUAL? X,1 /?ELS111
PRINTI "are"
JUMP ?CND109
?ELS111: PRINTI "is"
?CND109: PRINTI "n't here."
CRLF
JUMP ?REP86
?ELS92: ZERO? TMP \?REP86
CALL1 MORE-SPECIFIC
JUMP ?REP86
?ELS89: ZERO? PTBL /?ELS126
GET P-PRSO,CNT >OBJ1
JUMP ?CND124
?ELS126: GET P-PRSI,CNT >OBJ1
?CND124: GRTR? NUM,1 /?THN133
GET P-ITBL,P-NC1
GET STACK,0
EQUAL? STACK,W?ALL \?CND130
?THN133: EQUAL? OBJ1,NOT-HERE-OBJECT \?ELS137
INC 'X
JUMP ?PRG85
?ELS137: EQUAL? P-GETFLAGS,P-ALL \?ELS139
CALL VERB-ALL-TEST,OBJ1,OBJ
ZERO? STACK \?ELS139
JUMP ?PRG85
?ELS139: CALL2 ACCESSIBLE?,OBJ1
ZERO? STACK \?ELS143
JUMP ?PRG85
?ELS143: EQUAL? OBJ1,PLAYER \?ELS145
JUMP ?PRG85
?ELS145: EQUAL? OBJ1,IT \?ELS150
PRINTD P-IT-OBJECT
JUMP ?CND148
?ELS150: PRINTD OBJ1
?CND148: PRINTI ": "
?CND130: SET 'TMP,TRUE-VALUE
ZERO? PTBL /?ELS159
PUSH OBJ1
JUMP ?CND155
?ELS159: PUSH OBJ
?CND155: CALL2 QCONTEXT-CHECK,STACK >V
ZERO? PTBL /?ELS167
PUSH OBJ1
JUMP ?CND163
?ELS167: PUSH OBJ
?CND163: SET 'PRSO,STACK
ZERO? PTBL /?ELS175
PUSH OBJ
JUMP ?CND171
?ELS175: PUSH OBJ1
?CND171: SET 'PRSI,STACK
CALL PERFORM,PRSA,PRSO,PRSI >V
EQUAL? V,M-FATAL \?PRG85
JUMP ?CND56
?REP86:
?CND56: EQUAL? V,M-FATAL \?CND4
SET 'P-CONT,FALSE-VALUE
JUMP ?CND4
?ELS6: SET 'CLOCK-WAIT,TRUE-VALUE
SET 'P-CONT,FALSE-VALUE
?CND4: ZERO? CLOCK-WAIT \?CND187
EQUAL? PRSA,V?RESTORE,V?SAVE /?THN193
CALL1 GAME-VERB?
ZERO? STACK \?CND187
?THN193: CALL1 CLOCKER >V
?CND187: SET 'PRSA,FALSE-VALUE
SET 'PRSO,FALSE-VALUE
SET 'PRSI,FALSE-VALUE
RETURN PRSI
.FUNCT VERB-ALL-TEST,O,I,L
LOC O >L
EQUAL? PRSA,V?GIVE,V?DROP \?ELS5
EQUAL? O,POCKET /FALSE
EQUAL? L,WINNER \FALSE
RTRUE
?ELS5: EQUAL? PRSA,V?PUT-IN,V?PUT \?ELS18
EQUAL? O,I,POCKET /FALSE
CALL HELD?,O,I
ZERO? STACK \FALSE
RTRUE
?ELS18: EQUAL? PRSA,V?TAKE \?ELS29
FSET? O,TAKEBIT /?CND30
FSET? O,TRYTAKEBIT \FALSE
?CND30: ZERO? I /?ELS37
EQUAL? L,I \FALSE
SET 'L,I
JUMP ?CND35
?ELS37: EQUAL? L,HERE /TRUE
?CND35: FSET? L,SURFACEBIT /TRUE
FSET? L,CONTBIT \FALSE
FSET? L,OPENBIT \FALSE
RTRUE
?ELS29: ZERO? I /TRUE
EQUAL? O,I /FALSE
RTRUE
.FUNCT GAME-VERB?,V=0
ZERO? V \?CND1
SET 'V,PRSA
?CND1: EQUAL? V,V?$ANSWER,V?$GOAL,V?$VERIFY /TRUE
EQUAL? V,V?$QUEUE,V?$STATION /TRUE
EQUAL? V,V?$FCLEAR,V?$FSET,V?$QFSET /TRUE
EQUAL? V,V?$WHERE,V?BRIEF,V?DEBUG /TRUE
EQUAL? V,V?QUIT,V?RESTART,V?RESTORE /TRUE
EQUAL? V,V?SAVE,V?SCRIPT,V?SUPER-BRIEF /TRUE
EQUAL? V,V?TELL,V?TIME,V?UNSCRIPT /TRUE
EQUAL? V,V?VERBOSE,V?VERSION,V?$FACE /TRUE
RFALSE
.FUNCT QCONTEXT-CHECK,PRSO,OTHER,WHO=0,N=0
EQUAL? PRSA,V?WHAT,V?HELP /?THN6
EQUAL? PRSA,V?TELL-ABOUT,V?SHOW \FALSE
EQUAL? PRSO,PLAYER \FALSE
?THN6: FIRST? HERE >OTHER /?KLU33
?KLU33:
?PRG10: ZERO? OTHER \?ELS14
JUMP ?REP11
?ELS14: FSET? OTHER,PERSONBIT \?CND12
FSET? OTHER,INVISIBLE /?CND12
EQUAL? OTHER,PLAYER /?CND12
INC 'N
SET 'WHO,OTHER
?CND12: NEXT? OTHER >OTHER /?KLU34
?KLU34: JUMP ?PRG10
?REP11: EQUAL? 1,N \?CND19
ZERO? QCONTEXT \?CND19
CALL2 SAID-TO,WHO
?CND19: CALL1 QCONTEXT-GOOD?
ZERO? STACK /FALSE
EQUAL? WINNER,PLAYER \FALSE
SET 'WINNER,QCONTEXT
PRINTI "(said to "
PRINTD QCONTEXT
PRINTR ")"
.FUNCT QCONTEXT-GOOD?
ZERO? QCONTEXT /FALSE
FSET? QCONTEXT,PERSONBIT \FALSE
FSET? QCONTEXT,INVISIBLE /FALSE
EQUAL? HERE,QCONTEXT-ROOM \FALSE
CALL2 META-LOC,QCONTEXT
EQUAL? HERE,STACK /TRUE
RFALSE
.FUNCT SAID-TO,WHO
SET 'QCONTEXT,WHO
LOC WHO >QCONTEXT-ROOM
RETURN QCONTEXT-ROOM
.FUNCT THIS-IS-IT,OBJ
EQUAL? OBJ,FALSE-VALUE,NOT-HERE-OBJECT,PLAYER /TRUE
EQUAL? OBJ,INTDIR,GLOBAL-HERE /TRUE
EQUAL? PRSA,V?FACE,V?WALK-TO,V?WALK \?CND1
EQUAL? OBJ,PRSO /TRUE
?CND1: FSET? OBJ,PERSONBIT /?ELS12
FSET IT,TOUCHBIT
SET 'P-IT-OBJECT,OBJ
RTRUE
?ELS12: FSET? OBJ,FEMALE \?ELS14
FSET HER,TOUCHBIT
SET 'P-HER-OBJECT,OBJ
RTRUE
?ELS14: FSET? OBJ,PLURALBIT \?ELS16
FSET THEM,TOUCHBIT
SET 'P-THEM-OBJECT,OBJ
RTRUE
?ELS16: FSET HIM,TOUCHBIT
SET 'P-HIM-OBJECT,OBJ
RTRUE
.FUNCT NOT-IT,WHO
EQUAL? WHO,P-HER-OBJECT \?ELS5
FCLEAR HER,TOUCHBIT
RTRUE
?ELS5: EQUAL? WHO,P-HIM-OBJECT \?ELS7
FCLEAR HIM,TOUCHBIT
RTRUE
?ELS7: EQUAL? WHO,P-THEM-OBJECT \?ELS9
FCLEAR THEM,TOUCHBIT
RTRUE
?ELS9: EQUAL? WHO,P-IT-OBJECT \FALSE
FCLEAR IT,TOUCHBIT
RTRUE
.FUNCT FAKE-ORPHAN,TMP,?TMP1
CALL ORPHAN,P-SYNTAX,FALSE-VALUE
PRINTI "(Be specific: what thing do you want to "
GET P-OTBL,P-VERBN >TMP
ZERO? TMP \?ELS5
PRINTI "tell"
JUMP ?CND3
?ELS5: GETB P-VTBL,2
ZERO? STACK \?ELS9
GET TMP,0
PRINTB STACK
JUMP ?CND3
?ELS9: GETB TMP,2 >?TMP1
GETB TMP,3
CALL WORD-PRINT,?TMP1,STACK
PUTB P-VTBL,2,0
?CND3: SET 'P-OFLAG,TRUE-VALUE
SET 'CLOCK-WAIT,TRUE-VALUE
PRINTR "?)"
.FUNCT TELL-D-LOC,OBJ
PRINTD OBJ
IN? OBJ,GLOBAL-OBJECTS \?ELS5
PRINTI "(gl)"
JUMP ?CND3
?ELS5: IN? OBJ,LOCAL-GLOBALS \?ELS9
PRINTI "(lg)"
JUMP ?CND3
?ELS9: IN? OBJ,ROOMS \?CND3
PRINTI "(rm)"
?CND3: EQUAL? OBJ,TURN,INTNUM \FALSE
PRINTI "("
ZERO? P-DOLLAR-FLAG /?ELS27
PRINTC CURRENCY-SYMBOL
PRINTN P-AMOUNT
PRINTI ")"
RTRUE
?ELS27: PRINTN P-NUMBER
PRINTI ")"
RTRUE
.FUNCT FIX-HIM-HER,HEM-OBJECT,C,P
GETP HEM-OBJECT,P?CHARACTER >C
CALL2 ACCESSIBLE?,HEM-OBJECT
ZERO? STACK \?CND1
ZERO? DEBUG /?CND4
PRINTI "["
PRINTD HEM-OBJECT
PRINTI ":NA]"
CRLF
?CND4: GET GLOBAL-CHARACTER-TABLE,C >P
ZERO? C /FALSE
GET CHARACTER-TABLE,C
EQUAL? P,STACK /FALSE
PRINT I-ASSUME
CALL2 PRINTT,P
PRINTI ".)"
CRLF
RETURN P
?CND1: IN? HEM-OBJECT,GLOBAL-OBJECTS \?ELS21
GET CHARACTER-TABLE,C >P
JUMP ?CND19
?ELS21: SET 'P,HEM-OBJECT
?CND19: LOC P
EQUAL? HERE,STACK \FALSE
ZERO? DEBUG /?CND29
PRINTI "["
PRINTD HEM-OBJECT
PRINTI ":LO]"
CRLF
?CND29: PRINT I-ASSUME
CALL2 PRINTT,P
PRINTI ".)"
CRLF
RETURN P
.FUNCT PERFORM,A,O=0,I=0,V,OA,OO,OI
ZERO? DEBUG /?CND1
PRINTI "[Perform: "
PRINTN A
ZERO? O /?CND9
PRINTI "/"
EQUAL? A,V?WALK,V?FACE \?ELS17
PRINTN O
JUMP ?CND9
?ELS17: CALL2 TELL-D-LOC,O
?CND9: ZERO? I /?CND22
PRINTI "/"
CALL2 TELL-D-LOC,I
?CND22: PRINTI "]"
CRLF
?CND1: SET 'OA,PRSA
SET 'OO,PRSO
SET 'OI,PRSI
SET 'PRSA,A
EQUAL? A,V?WALK,V?FACE /?CND30
EQUAL? IT,I,O \?CND33
CALL2 ACCESSIBLE?,P-IT-OBJECT
ZERO? STACK \?CND33
ZERO? I \?ELS40
CALL1 FAKE-ORPHAN
RETURN 2
?ELS40: CALL2 NOT-HERE,P-IT-OBJECT
RETURN 2
?CND33: EQUAL? THEM,I,O \?CND45
CALL2 FIX-HIM-HER,P-THEM-OBJECT >V
ZERO? V /?ELS50
ZERO? DEBUG /?CND51
PRINTI "[them="
PRINTD V
PRINTI "]"
CRLF
?CND51: EQUAL? THEM,O \?CND57
SET 'O,V
?CND57: EQUAL? THEM,I \?CND48
SET 'I,V
JUMP ?CND48
?ELS50: ZERO? I \?ELS67
CALL1 FAKE-ORPHAN
RETURN 2
?ELS67: CALL2 NOT-HERE,P-THEM-OBJECT
RETURN 2
?CND48:
?CND45: EQUAL? HER,I,O \?CND72
CALL2 FIX-HIM-HER,P-HER-OBJECT >V
ZERO? V /?ELS77
ZERO? DEBUG /?CND78
PRINTI "[her="
PRINTD V
PRINTI "]"
CRLF
?CND78: EQUAL? HER,O \?CND84
SET 'O,V
?CND84: EQUAL? HER,I \?CND75
SET 'I,V
JUMP ?CND75
?ELS77: ZERO? I \?ELS94
CALL1 FAKE-ORPHAN
RETURN 2
?ELS94: CALL2 NOT-HERE,P-HER-OBJECT
RETURN 2
?CND75:
?CND72: EQUAL? HIM,I,O \?CND99
CALL2 FIX-HIM-HER,P-HIM-OBJECT >V
ZERO? V /?ELS104
ZERO? DEBUG /?CND105
PRINTI "[him="
PRINTD V
PRINTI "]"
CRLF
?CND105: EQUAL? HIM,O \?CND111
SET 'O,V
?CND111: EQUAL? HIM,I \?CND102
SET 'I,V
JUMP ?CND102
?ELS104: ZERO? I \?ELS121
CALL1 FAKE-ORPHAN
RETURN 2
?ELS121: CALL2 NOT-HERE,P-HIM-OBJECT
RETURN 2
?CND102:
?CND99: EQUAL? O,IT \?CND126
SET 'O,P-IT-OBJECT
PRINT I-ASSUME
CALL2 PRINTT,O
PRINTI ".)"
CRLF
?CND126: EQUAL? I,IT \?CND30
SET 'I,P-IT-OBJECT
PRINT I-ASSUME
CALL2 PRINTT,I
PRINTI ".)"
CRLF
?CND30: SET 'PRSI,I
SET 'PRSO,O
SET 'V,FALSE-VALUE
ZERO? NOW-LURCHING /?CND136
EQUAL? TOLD-LURCHING,PRESENT-TIME /?CND136
ZERO? TRAIN-MOVING /?CND136
CALL1 GAME-VERB?
ZERO? STACK \?CND136
EQUAL? PRSA,V?MOVE \?THN143
EQUAL? PRSO,STOP-CORD /?CND136
?THN143: SET 'TOLD-LURCHING,PRESENT-TIME
PRINTI "The train lurches a bit."
CRLF
?CND136: EQUAL? A,V?WALK,V?FACE /?CND147
EQUAL? NOT-HERE-OBJECT,PRSO,PRSI \?CND147
CALL D-APPLY,STR?155,NOT-HERE-OBJECT-F >V
ZERO? V /?CND147
SET 'CLOCK-WAIT,TRUE-VALUE
?CND147: CALL2 THIS-IS-IT,PRSI
CALL2 THIS-IS-IT,PRSO
SET 'O,PRSO
SET 'I,PRSI
ZERO? DEBUG /?CND156
PRINTC 91
PRINTD WINNER
PRINTI "=]"
?CND156: ZERO? V \?CND160
GETP WINNER,P?ACTION
CALL D-APPLY,STR?156,STACK,M-WINNER >V
?CND160: ZERO? V \?CND163
LOC WINNER
GETP STACK,P?ACTION
CALL D-APPLY,STR?157,STACK,M-BEG >V
?CND163: ZERO? V \?CND166
GET PREACTIONS,A
CALL D-APPLY,STR?158,STACK >V
?CND166: SET 'NOW-PRSI,TRUE-VALUE
ZERO? V \?CND169
ZERO? I /?CND169
EQUAL? A,V?WALK /?CND169
LOC I
ZERO? STACK /?CND169
LOC I
GETP STACK,P?CONTFCN >V
ZERO? V /?CND169
CALL V,M-CONT >V
?CND169: ZERO? V \?CND178
ZERO? I /?CND178
GETP I,P?ACTION
CALL D-APPLY,STR?159,STACK >V
?CND178: SET 'NOW-PRSI,FALSE-VALUE
ZERO? V \?CND183
ZERO? O /?CND183
EQUAL? A,V?WALK,V?FACE /?CND183
LOC O
ZERO? STACK /?CND183
LOC O
GETP STACK,P?CONTFCN >V
ZERO? V /?CND183
CALL V,M-CONT >V
?CND183: ZERO? V \?CND192
ZERO? O /?CND192
EQUAL? A,V?WALK,V?FACE /?CND192
GETP O,P?ACTION
CALL D-APPLY,STR?160,STACK >V
?CND192: ZERO? V \?CND197
GET ACTIONS,A
CALL D-APPLY,FALSE-VALUE,STACK >V
?CND197: EQUAL? V,M-FATAL /?CND200
EQUAL? PRSA,V?RESTORE,V?SAVE /?THN206
CALL1 GAME-VERB?
ZERO? STACK \?CND200
?THN206: LOC WINNER
GETP STACK,P?ACTION
CALL D-APPLY,STR?161,STACK,M-END >V
?CND200: SET 'PRSA,OA
SET 'PRSO,OO
SET 'PRSI,OI
RETURN V
.FUNCT D-APPLY,STR,FCN,FOO=0,RES
ZERO? FCN /FALSE
ZERO? DEBUG /?CND8
ZERO? STR \?ELS14
PRINTI "[Action:]"
CRLF
JUMP ?CND8
?ELS14: PRINTC 91
PRINT STR
PRINTI ": "
?CND8: EQUAL? STR,STR?162 \?CND21
SET 'FOO,M-CONT
?CND21: ZERO? FOO /?ELS28
CALL FCN,FOO
JUMP ?CND24
?ELS28: CALL FCN
?CND24: SET 'RES,STACK
ZERO? DEBUG /?CND32
ZERO? STR /?CND32
EQUAL? RES,M-FATAL \?ELS39
PRINTI "Fatal]"
CRLF
RETURN RES
?ELS39: ZERO? RES \?ELS43
PRINTI "Not handled]"
CRLF
RETURN RES
?ELS43: PRINTI "Handled]"
CRLF
?CND32: RETURN RES
.FUNCT I-PROMPT,GARG=0
ZERO? IDEBUG \?THN4
EQUAL? GARG,G-DEBUG \?CND1
?THN4: PRINTI "[I-PROMPT:"
EQUAL? GARG,G-DEBUG /FALSE
?CND1: DEC 'P-PROMPT
ZERO? IDEBUG /FALSE
PRINTI "(0)]"
CRLF
RFALSE
.FUNCT BUZZER-WORD?,WORD
CALL2 QUESTION-WORD?,WORD
ZERO? STACK \TRUE
CALL2 NUMBER-WORD?,WORD
ZERO? STACK \TRUE
CALL2 NAUGHTY-WORD?,WORD
ZERO? STACK \TRUE
EQUAL? WORD,W?NW,W?NORTHWEST,W?NE /?THN12
EQUAL? WORD,W?SW,W?SOUTHWEST,W?NORTHEAST /?THN12
EQUAL? WORD,W?SE,W?SOUTHEAST \FALSE
?THN12: PRINTI "(Sorry, but this story has no """
PRINTB WORD
PRINTR """ directions.)"
.FUNCT QUESTION-WORD?,WORD
EQUAL? WORD,W?WHERE \?ELS5
PRINTI "(To locate something, use the command: FIND "
PRINTD SOMETHING
PRINTR ".)"
?ELS5: EQUAL? WORD,W?WHAT,W?WHAT'S /?THN10
EQUAL? WORD,W?WHO,W?WHO'S \?ELS9
?THN10: PRINTI "(To ask about something, use the command: TELL ME ABOUT "
PRINTD SOMETHING
PRINTR ".)"
?ELS9: EQUAL? WORD,W?THAT'S,W?IT'S /?THN16
EQUAL? WORD,W?WHY,W?HOW,W?WHEN /?THN16
EQUAL? WORD,W?IS,W?DID,W?ARE /?THN16
EQUAL? WORD,W?DO,W?HAVE /?THN16
EQUAL? WORD,W?AM,W?I'M,W?WE'RE /?THN16
EQUAL? WORD,W?WILL,W?WAS,W?WERE /?THN16
EQUAL? WORD,W?I'LL,W?CAN,W?WHICH /?THN16
EQUAL? WORD,W?I'VE,W?WON'T,W?HAS /?THN16
EQUAL? WORD,W?YOU'RE,W?HE'S,W?SHE'S /?THN16
EQUAL? WORD,W?SHOULD,W?WOULD,W?WHEN'S /?THN16
EQUAL? WORD,W?THEY'RE,W?COULD,W?SHALL \FALSE
?THN16: PRINTI "(Please use commands"
INC 'QUESTION-WORD-COUNT
GRTR? QUESTION-WORD-COUNT,4 \?ELS22
SET 'QUESTION-WORD-COUNT,0
PRINTI "! Your commands tell the computer what you want to do in the story. Here are examples of commands:
TURN ON THE LAMP
LOOK UNDER THE RUG
MADAME, GIVE THE BOOK TO HIM
CONDUCTOR, HELP ME
Now you can try again"
JUMP ?CND20
?ELS22: PRINTI ", not statements or questions"
?CND20: PRINTR ".)"
.FUNCT NUMBER-WORD?,WRD
EQUAL? WRD,W?ZERO,W?SEVENTY /?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?THIRTEEN /?THN6
EQUAL? WRD,W?FOURTEEN,W?FIFTEEN,W?SIXTEEN /?THN6
EQUAL? WRD,W?SEVENTEEN,W?EIGHTEEN,W?NINETEEN /?THN6
EQUAL? WRD,W?TWENTY,W?THIRTY,W?FORTY /?THN6
EQUAL? WRD,W?FIFTY,W?SIXTY,W?EIGHTY /?THN6
EQUAL? WRD,W?NINETY,W?HUNDRED,W?THOUSAND /?THN6
EQUAL? WRD,W?MILLION,W?BILLION,W?ONE \FALSE
?THN6: PRINTR "(Use numerals for numbers, for example ""10."")"
.FUNCT NAUGHTY-WORD?,WORD
EQUAL? WORD,W?CURSE,W?CURSES,W?CUSS /?THN6
EQUAL? WORD,W?DAMN,W?SHIT,W?FUCK /?THN6
EQUAL? WORD,W?CHOMP,W?DARN,W?HELL /?THN6
EQUAL? WORD,W?FUDGE,W?PISS,W?SUCK /?THN6
EQUAL? WORD,W?BASTARD,W?SCREW,W?CRAP /?THN6
EQUAL? WORD,W?FUCKED,W?GODDAMN,W?ASSHOLE /?THN6
EQUAL? WORD,W?CUNT,W?SHITHEAD,W?SUCKS /?THN6
EQUAL? WORD,W?DAMNED,W?PEE,W?COCKSUCKER /?THN6
EQUAL? WORD,W?BITCH \FALSE
?THN6: PRINTC 40
CALL2 PICK-ONE-NEW,OFFENDED
PRINT STACK
PRINTC 41
CRLF
RTRUE
.FUNCT PARSER,PTR=P-LEXSTART,WRD,VAL=0,VERB=0,OF-FLAG=0,LEN,DIR=0,NW=0,LW=0,CNT=-1,OMERGED,OWINNER,TMP,?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 'P-NUMBER,-1
SET 'P-NAM,FALSE-VALUE
SET 'P-ADJ,FALSE-VALUE
SET 'P-ADVERB,FALSE-VALUE
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? QUOTE-FLAG \?CND11
EQUAL? WINNER,PLAYER /?CND11
SET 'WINNER,PLAYER
LOC WINNER >HERE
CALL2 LIT?,HERE >LIT
?CND11: ZERO? RESERVE-PTR /?ELS21
SET 'PTR,RESERVE-PTR
CALL STUFF,P-LEXV,RESERVE-LEXV
EQUAL? VERBOSE,1,2 \?CND23
EQUAL? PLAYER,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
SET 'P-CONT,FALSE-VALUE
ZERO? VERBOSE /?CND19
EQUAL? PLAYER,WINNER \?CND19
CRLF
JUMP ?CND19
?ELS29: SET 'WINNER,PLAYER
SET 'QUOTE-FLAG,FALSE-VALUE
LOC WINNER >HERE
CALL2 LIT?,HERE >LIT
FCLEAR IT,TOUCHBIT
FCLEAR HER,TOUCHBIT
FCLEAR HIM,TOUCHBIT
FCLEAR THEM,TOUCHBIT
ZERO? VERBOSE /?CND40
CRLF
?CND40: ZERO? P-PROMPT /?CND43
ZERO? P-OFLAG \?CND43
EQUAL? P-PROMPT,P-PROMPT-START \?ELS50
PRINTI "Okay, what do you want to do now?"
JUMP ?CND48
?ELS50: DLESS? 'P-PROMPT,1 \?ELS54
PRINTI "(You won't see ""What next?"" any more.)
"
JUMP ?CND48
?ELS54: PRINTI "What next?"
?CND48: CRLF
?CND43: PUTB P-LEXV,0,59
CALL1 STATUS-LINE
PRINTI ">"
READ P-INBUF,P-LEXV
?CND19: GETB P-LEXV,P-LEXWORDS >P-LEN
GET P-LEXV,PTR
EQUAL? W?QUOTE,STACK \?CND65
CALL1 QCONTEXT-GOOD?
ZERO? STACK /?CND65
ADD PTR,P-LEXELEN >PTR
DEC 'P-LEN
?CND65: GET P-LEXV,PTR
EQUAL? W?THEN,STACK \?CND70
ADD PTR,P-LEXELEN >PTR
DEC 'P-LEN
?CND70: LESS? 1,P-LEN \?CND73
GET P-LEXV,PTR
EQUAL? W?GO,STACK \?CND73
ADD PTR,P-LEXELEN
GET P-LEXV,STACK >NW
ZERO? NW /?CND73
CALL WT?,NW,PS?VERB
ZERO? STACK /?CND73
ADD PTR,P-LEXELEN >PTR
DEC 'P-LEN
?CND73: ZERO? P-LEN \?ELS80
PRINTI "I beg your pardon?"
CRLF
RFALSE
?ELS80: GET P-LEXV,PTR
EQUAL? STACK,W?OOPS \?ELS84
GRTR? P-LEN,1 /?ELS87
PRINTI "I can't help your clumsiness."
CRLF
RFALSE
?ELS87: GET OOPS-TABLE,O-PTR
ZERO? STACK /?ELS91
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 ?CND78
?ELS91: PUT OOPS-TABLE,O-END,FALSE-VALUE
PRINTI "There was no word to replace!"
CRLF
RFALSE
?ELS84: PUT OOPS-TABLE,O-END,FALSE-VALUE
?CND78: GET P-LEXV,PTR
EQUAL? STACK,W?AGAIN,W?G \?ELS100
ZERO? P-OFLAG /?ELS103
PRINTI "It's difficult to repeat fragments."
CRLF
RFALSE
?ELS103: GRTR? P-LEN,1 \?ELS108
ADD PTR,P-LEXELEN
GET P-LEXV,STACK
EQUAL? STACK,W?PERIOD,W?COMMA,W?THEN /?THN112
ADD PTR,P-LEXELEN
GET P-LEXV,STACK
EQUAL? STACK,W?AND \?ELS111
?THN112: MUL 2,P-LEXELEN
ADD PTR,STACK >PTR
GETB P-LEXV,P-LEXWORDS
SUB STACK,2
PUTB P-LEXV,P-LEXWORDS,STACK
JUMP ?CND101
?ELS111: PRINTI "I couldn't understand that sentence."
CRLF
RFALSE
?ELS108: ADD PTR,P-LEXELEN >PTR
GETB P-LEXV,P-LEXWORDS
SUB STACK,1
PUTB P-LEXV,P-LEXWORDS,STACK
?CND101: GETB P-LEXV,P-LEXWORDS
GRTR? STACK,0 \?ELS122
CALL STUFF,RESERVE-LEXV,P-LEXV
SET 'RESERVE-PTR,PTR
JUMP ?CND120
?ELS122: SET 'RESERVE-PTR,FALSE-VALUE
?CND120: 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
?PRG125: IGRTR? 'CNT,P-ITBLLEN \?ELS129
JUMP ?CND98
?ELS129: GET P-OTBL,CNT
PUT P-ITBL,CNT,STACK
JUMP ?PRG125
?ELS100: 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-DIR,FALSE-VALUE
SET 'P-NCN,0
SET 'P-GETFLAGS,0
PUT P-ITBL,P-VERBN,0
?PRG134: DLESS? 'P-LEN,0 \?ELS138
SET 'QUOTE-FLAG,FALSE-VALUE
JUMP ?CND98
?ELS138: GET P-LEXV,PTR >WRD
CALL2 BUZZER-WORD?,WRD
ZERO? STACK \FALSE
ZERO? WRD \?THN143
CALL2 NUMBER?,PTR >WRD
ZERO? WRD /?ELS142
?THN143: EQUAL? WRD,W?TO \?ELS147
EQUAL? VERB,ACT?TELL,ACT?ASK \?ELS147
PUT P-ITBL,P-VERB,ACT?TELL
SET 'WRD,W?QUOTE
JUMP ?CND145
?ELS147: EQUAL? WRD,W?THEN \?CND145
ZERO? VERB \?CND145
ZERO? QUOTE-FLAG \?CND145
PUT P-ITBL,P-VERB,ACT?TELL
PUT P-ITBL,P-VERBN,0
SET 'WRD,W?QUOTE
?CND145: EQUAL? WRD,W?THEN,W?PERIOD,W?QUOTE \?ELS156
EQUAL? WRD,W?QUOTE \?CND157
ZERO? QUOTE-FLAG /?ELS162
SET 'QUOTE-FLAG,FALSE-VALUE
JUMP ?CND157
?ELS162: SET 'QUOTE-FLAG,TRUE-VALUE
?CND157: ZERO? P-LEN /?THN166
ADD PTR,P-LEXELEN >P-CONT
?THN166: PUTB P-LEXV,P-LEXWORDS,P-LEN
JUMP ?CND98
?ELS156: CALL WT?,WRD,PS?DIRECTION,P1?DIRECTION >VAL
ZERO? VAL /?ELS169
EQUAL? VERB,FALSE-VALUE,ACT?WALK,ACT?HEAD \?ELS169
EQUAL? LEN,1 /?THN172
EQUAL? LEN,2 \?ELS175
EQUAL? VERB,ACT?WALK,ACT?HEAD /?THN172
?ELS175: ADD PTR,P-LEXELEN
GET P-LEXV,STACK >NW
EQUAL? NW,W?THEN,W?PERIOD,W?QUOTE \?ELS177
GRTR? LEN,1 /?THN172
?ELS177: ZERO? QUOTE-FLAG /?ELS179
EQUAL? LEN,2 \?ELS179
EQUAL? NW,W?QUOTE /?THN172
?ELS179: GRTR? LEN,2 \?ELS169
EQUAL? NW,W?COMMA,W?AND \?ELS169
?THN172: SET 'DIR,VAL
EQUAL? NW,W?COMMA,W?AND \?CND182
ADD PTR,P-LEXELEN
CALL CHANGE-LEXV,STACK,W?THEN
?CND182: GRTR? LEN,2 /?CND136
SET 'QUOTE-FLAG,FALSE-VALUE
JUMP ?CND98
?ELS169: CALL WT?,WRD,PS?VERB,P1?VERB >VAL
ZERO? VAL /?ELS189
ZERO? VERB \?ELS189
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 >TMP
GETB P-LEXV,TMP
PUTB P-VTBL,2,STACK
ADD TMP,1
GETB P-LEXV,STACK
PUTB P-VTBL,3,STACK
JUMP ?CND136
?ELS189: CALL WT?,WRD,PS?PREPOSITION,0 >VAL
ZERO? VAL \?THN196
EQUAL? WRD,W?ONE,W?A /?THN200
EQUAL? WRD,W?BOTH,W?ALL /?THN200
CALL WT?,WRD,PS?ADJECTIVE
ZERO? STACK \?THN200
CALL WT?,WRD,PS?OBJECT
ZERO? STACK /?ELS195
?THN200: SET 'VAL,0 \?ELS195
?THN196: GRTR? P-LEN,1 \?ELS204
ADD PTR,P-LEXELEN
GET P-LEXV,STACK
EQUAL? STACK,W?OF \?ELS204
ZERO? VAL \?ELS204
EQUAL? WRD,W?ONE,W?A /?ELS204
EQUAL? WRD,W?ALL,W?BOTH /?ELS204
SET 'OF-FLAG,TRUE-VALUE
JUMP ?CND136
?ELS204: ZERO? VAL /?ELS208
ZERO? P-LEN /?THN211
ADD PTR,2
GET P-LEXV,STACK
EQUAL? STACK,W?THEN,W?PERIOD \?ELS208
?THN211: SET 'P-END-ON-PREP,TRUE-VALUE
LESS? P-NCN,2 \?CND136
PUT P-ITBL,P-PREP1,VAL
PUT P-ITBL,P-PREP1N,WRD
JUMP ?CND136
?ELS208: EQUAL? P-NCN,2 \?ELS217
PRINTI "(I found too many nouns in that sentence!)"
CRLF
RFALSE
?ELS217: INC 'P-NCN
CALL CLAUSE,PTR,VAL,WRD >PTR
ZERO? PTR /FALSE
LESS? PTR,0 \?CND136
SET 'QUOTE-FLAG,FALSE-VALUE
JUMP ?CND98
?ELS195: EQUAL? WRD,W?CLOSELY \?ELS228
SET 'P-ADVERB,W?CAREFULLY
JUMP ?CND136
?ELS228: EQUAL? WRD,W?CAREFULLY,W?QUIETLY /?THN231
EQUAL? WRD,W?SLOWLY,W?QUICKLY,W?BRIEFLY \?ELS230
?THN231: SET 'P-ADVERB,WRD
JUMP ?CND136
?ELS230: EQUAL? WRD,W?OF \?ELS234
ZERO? OF-FLAG /?THN238
ADD PTR,P-LEXELEN
GET P-LEXV,STACK
EQUAL? STACK,W?PERIOD,W?THEN \?ELS237
?THN238: CALL2 CANT-USE,PTR
RFALSE
?ELS237: SET 'OF-FLAG,FALSE-VALUE
JUMP ?CND136
?ELS234: CALL WT?,WRD,PS?BUZZ-WORD
ZERO? STACK /?ELS243
JUMP ?CND136
?ELS243: EQUAL? VERB,ACT?TELL \?ELS245
CALL WT?,WRD,PS?VERB
ZERO? STACK /?ELS245
PRINTI "(Please consult your manual for the correct way to talk to characters.)"
CRLF
RFALSE
?ELS245: CALL2 CANT-USE,PTR
RFALSE
?ELS142: CALL2 UNKNOWN-WORD,PTR
RFALSE
?CND136: SET 'LW,WRD
ADD PTR,P-LEXELEN >PTR
JUMP ?PRG134
?CND98: PUT OOPS-TABLE,O-PTR,FALSE-VALUE
ZERO? DIR /?CND254
EQUAL? VERB,ACT?HEAD \?ELS260
SET 'PRSA,V?FACE
JUMP ?CND258
?ELS260: SET 'PRSA,V?WALK
?CND258: SET 'P-WALK-DIR,DIR
SET 'PRSO,DIR
SET 'P-OFLAG,FALSE-VALUE
RETURN TRUE-VALUE
?CND254: SET 'P-WALK-DIR,FALSE-VALUE
ZERO? P-OFLAG /?CND263
CALL1 ORPHAN-MERGE
ZERO? STACK /?CND263
SET 'WINNER,OWINNER
?CND263: GET P-ITBL,P-VERB
ZERO? STACK \?CND268
PUT P-ITBL,P-VERB,ACT?$CALL
?CND268: CALL1 SYNTAX-CHECK
ZERO? STACK /FALSE
CALL1 SNARF-OBJECTS
ZERO? STACK /FALSE
CALL1 MANY-CHECK
ZERO? STACK /FALSE
CALL1 TAKE-CHECK
ZERO? STACK /FALSE
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,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 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 CHANGE-LEXV,PTR,WRD
PUT P-LEXV,PTR,WRD
PUT AGAIN-LEXV,PTR,WRD
RTRUE
.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
GET P-LEXV,PTR
EQUAL? STACK,W?THE,W?A,W?AN \?CND9
GET P-ITBL,NUM
ADD STACK,4
PUT P-ITBL,NUM,STACK
?CND9:
?PRG12: DLESS? 'P-LEN,0 \?CND14
ADD NUM,1 >?TMP1
MUL PTR,2
ADD P-LEXV,STACK
PUT P-ITBL,?TMP1,STACK
RETURN -1
?CND14: GET P-LEXV,PTR >WRD
CALL2 BUZZER-WORD?,WRD
ZERO? STACK \FALSE
ZERO? WRD \?THN22
CALL2 NUMBER?,PTR >WRD
ZERO? WRD /?ELS21
?THN22: ZERO? P-LEN \?ELS26
SET 'NW,0
JUMP ?CND24
?ELS26: ADD PTR,P-LEXELEN
GET P-LEXV,STACK >NW
?CND24: EQUAL? WRD,W?AND,W?COMMA \?ELS31
SET 'ANDFLG,TRUE-VALUE
JUMP ?CND17
?ELS31: EQUAL? WRD,W?ALL,W?BOTH,W?ONE \?ELS33
EQUAL? NW,W?OF \?CND17
DEC 'P-LEN
ADD PTR,P-LEXELEN >PTR
JUMP ?CND17
?ELS33: EQUAL? WRD,W?THEN,W?PERIOD /?THN39
CALL WT?,WRD,PS?PREPOSITION
ZERO? STACK /?ELS38
GET P-ITBL,P-VERB
ZERO? STACK /?ELS38
ZERO? FIRST?? \?ELS38
?THN39: INC 'P-LEN
ADD NUM,1 >?TMP1
MUL PTR,2
ADD P-LEXV,STACK
PUT P-ITBL,?TMP1,STACK
SUB PTR,P-LEXELEN
RETURN STACK
?ELS38: ZERO? ANDFLG /?ELS44
GET P-ITBL,P-VERBN
ZERO? STACK /?THN47
CALL2 VERB-DIR-ONLY?,WRD
ZERO? STACK /?ELS44
?THN47: SUB PTR,4 >PTR
ADD PTR,2
CALL CHANGE-LEXV,STACK,W?THEN
ADD P-LEN,2 >P-LEN
JUMP ?CND17
?ELS44: CALL WT?,WRD,PS?OBJECT
ZERO? STACK /?ELS50
GRTR? P-LEN,0 \?ELS53
EQUAL? NW,W?OF \?ELS53
EQUAL? WRD,W?ALL,W?ONE /?ELS53
JUMP ?CND17
?ELS53: CALL WT?,WRD,PS?ADJECTIVE
ZERO? STACK /?ELS57
ZERO? NW /?ELS57
CALL WT?,NW,PS?OBJECT
ZERO? STACK /?ELS57
JUMP ?CND17
?ELS57: ZERO? ANDFLG \?ELS61
EQUAL? NW,W?BUT,W?EXCEPT /?ELS61
EQUAL? NW,W?AND,W?COMMA /?ELS61
ADD NUM,1 >?TMP1
ADD PTR,2
MUL STACK,2
ADD P-LEXV,STACK
PUT P-ITBL,?TMP1,STACK
RETURN PTR
?ELS61: SET 'ANDFLG,FALSE-VALUE
JUMP ?CND17
?ELS50: CALL WT?,WRD,PS?ADJECTIVE
ZERO? STACK \?CND17
CALL WT?,WRD,PS?BUZZ-WORD
ZERO? STACK /?ELS67
JUMP ?CND17
?ELS67: ZERO? ANDFLG /?ELS71
GET P-ITBL,P-VERB
ZERO? STACK \?ELS71
SUB PTR,4 >PTR
ADD PTR,2
CALL CHANGE-LEXV,STACK,W?THEN
ADD P-LEN,2 >P-LEN
JUMP ?CND17
?ELS71: CALL WT?,WRD,PS?PREPOSITION
ZERO? STACK /?ELS75
JUMP ?CND17
?ELS75: CALL2 CANT-USE,PTR
RFALSE
?ELS21: CALL2 UNKNOWN-WORD,PTR
RFALSE
?CND17: SET 'LW,WRD
SET 'FIRST??,FALSE-VALUE
ADD PTR,P-LEXELEN >PTR
JUMP ?PRG12
.FUNCT VERB-DIR-ONLY?,WRD,?ORTMP
CALL WT?,WRD,PS?OBJECT
ZERO? STACK \FALSE
CALL WT?,WRD,PS?ADJECTIVE
ZERO? STACK \FALSE
CALL WT?,WRD,PS?DIRECTION
POP '?ORTMP
ZERO? ?ORTMP /?ORP6
RETURN ?ORTMP
?ORP6: CALL WT?,WRD,PS?VERB
RSTACK
.FUNCT NUMBER?,PTR,CNT,BPTR,CHR,SUM=0,TIM=0,DOLLAR=0,CCTR,TMP,NW,PTT,?TMP1
MUL PTR,2
ADD P-LEXV,STACK >TMP
GETB TMP,2 >CNT
GETB TMP,3 >BPTR
?PRG1: DLESS? 'CNT,0 \?ELS5
JUMP ?REP2
?ELS5: GETB P-INBUF,BPTR >CHR
EQUAL? CHR,58 \?ELS10
SET 'TIM,SUM
SET 'SUM,0
JUMP ?CND8
?ELS10: GRTR? SUM,9999 /FALSE
EQUAL? CHR,CURRENCY-SYMBOL \?ELS14
SET 'DOLLAR,TRUE-VALUE
JUMP ?CND8
?ELS14: GRTR? CHR,57 /FALSE
LESS? CHR,48 /FALSE
MUL SUM,10 >?TMP1
SUB CHR,48
ADD ?TMP1,STACK >SUM
?CND8: INC 'BPTR
JUMP ?PRG1
?REP2: CALL CHANGE-LEXV,PTR,W?NUMBER
ADD PTR,P-LEXELEN
GET P-LEXV,STACK >NW
ZERO? DOLLAR \?CND21
EQUAL? NW,W?PERIOD \?CND21
GRTR? P-LEN,1 \?CND21
MUL P-LEXELEN,2
ADD PTR,STACK
CALL2 CENTS-CHECK,STACK >TMP
ZERO? TMP /?ELS28
SET 'P-CENT-FLAG,TRUE-VALUE
EQUAL? TMP,100 \?CND29
SET 'TMP,0
?CND29: SET 'TIM,SUM
SET 'SUM,TMP
SUB P-LEN,2 >CCTR
MUL 2,P-LEXELEN >TMP
ADD PTR,TMP >PTT
?PRG32: DLESS? 'CCTR,0 \?ELS36
JUMP ?REP33
?ELS36: ADD PTR,P-LEXELEN >PTR
GET P-LEXV,PTT
CALL CHANGE-LEXV,PTR,STACK
MUL PTR,2
ADD STACK,2 >?TMP1
MUL PTT,2
ADD STACK,2
GETB P-LEXV,STACK
PUTB P-LEXV,?TMP1,STACK
MUL PTR,2
ADD STACK,3 >?TMP1
MUL PTT,2
ADD STACK,3
GETB P-LEXV,STACK
PUTB P-LEXV,?TMP1,STACK
JUMP ?PRG32
?REP33: SUB P-LEN,2 >P-LEN
GETB P-LEXV,P-LEXWORDS
SUB STACK,2
PUTB P-LEXV,P-LEXWORDS,STACK
JUMP ?CND21
?ELS28: SET 'P-CENT-FLAG,FALSE-VALUE
?CND21: GRTR? SUM,9999 /FALSE
ZERO? TIM /?CND41
GRTR? TIM,23 /FALSE
MUL TIM,60
ADD SUM,STACK >SUM
?CND41: ZERO? DOLLAR /?ELS54
GRTR? SUM,0 \?ELS54
SET 'P-AMOUNT,SUM
SET 'P-DOLLAR-FLAG,TRUE-VALUE
RETURN W?MONEY
?ELS54: SET 'P-NUMBER,SUM
SET 'P-DOLLAR-FLAG,FALSE-VALUE
RETURN W?NUMBER
.FUNCT CENTS-CHECK,PTR,CNT,BPTR,CCTR=0,CHR,SUM=0,TMP,?TMP1
MUL PTR,2
ADD P-LEXV,STACK >TMP
GETB TMP,2 >CNT
GETB TMP,3 >BPTR
?PRG1: DLESS? 'CNT,0 \?ELS5
JUMP ?REP2
?ELS5: GETB P-INBUF,BPTR >CHR
IGRTR? 'CCTR,2 /FALSE
GRTR? CHR,53 /FALSE
LESS? CHR,48 /FALSE
MUL SUM,10 >?TMP1
SUB CHR,48
ADD ?TMP1,STACK >SUM
INC 'BPTR
JUMP ?PRG1
?REP2: ZERO? SUM \?ELS21
RETURN 100
?ELS21: EQUAL? CCTR,1 \?ELS23
MUL 10,SUM
RSTACK
?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?ADJECTIVE
ZERO? STACK /?ELS3
SET 'ADJ,TRUE-VALUE
JUMP ?CND1
?ELS3: CALL WT?,WRD,PS?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 /?ELS10
ZERO? ADJ \?ELS10
GET P-OTBL,P-VERB
EQUAL? VERB,STACK \FALSE
?ELS10: EQUAL? P-NCN,2 /FALSE
GET P-OTBL,P-NC1
EQUAL? STACK,1 \?ELS16
GET P-ITBL,P-PREP1 >TEMP
GET P-OTBL,P-PREP1
EQUAL? TEMP,STACK /?THN20
ZERO? TEMP \FALSE
?THN20: ZERO? ADJ /?ELS24
ADD P-LEXV,2
PUT P-OTBL,P-NC1,STACK
GET P-ITBL,P-NC1L
ZERO? STACK \?CND26
ADD P-LEXV,6
PUT P-ITBL,P-NC1L,STACK
?CND26: ZERO? P-NCN \?CND22
SET 'P-NCN,1
JUMP ?CND22
?ELS24: GET P-ITBL,P-NC1
PUT P-OTBL,P-NC1,STACK
?CND22: GET P-ITBL,P-NC1L
PUT P-OTBL,P-NC1L,STACK
JUMP ?CND8
?ELS16: GET P-OTBL,P-NC2
EQUAL? STACK,1 \?ELS37
GET P-ITBL,P-PREP1 >TEMP
GET P-OTBL,P-PREP2
EQUAL? TEMP,STACK /?THN41
ZERO? TEMP \FALSE
?THN41: ZERO? ADJ /?CND43
ADD P-LEXV,2
PUT P-ITBL,P-NC1,STACK
GET P-ITBL,P-NC1L
ZERO? STACK \?CND43
ADD P-LEXV,6
PUT P-ITBL,P-NC1L,STACK
?CND43: 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 ?CND8
?ELS37: ZERO? P-ACLAUSE /?CND8
EQUAL? P-NCN,1 /?ELS57
ZERO? ADJ \?ELS57
SET 'P-ACLAUSE,FALSE-VALUE
RFALSE
?ELS57: GET P-ITBL,P-NC1 >BEG
ZERO? ADJ /?CND62
ADD P-LEXV,2 >BEG
SET 'ADJ,FALSE-VALUE
?CND62: GET P-ITBL,P-NC1L >END
?PRG66: GET BEG,0 >WRD
EQUAL? BEG,END \?ELS70
ZERO? ADJ /?ELS73
CALL2 ACLAUSE-WIN,ADJ
JUMP ?CND55
?ELS73: SET 'P-ACLAUSE,FALSE-VALUE
RFALSE
?ELS70: ZERO? ADJ \?ELS78
GETB WRD,P-PSOFF
BTST STACK,PS?ADJECTIVE /?THN81
EQUAL? WRD,W?ALL,W?ONE \?ELS78
?THN81: SET 'ADJ,WRD
JUMP ?CND68
?ELS78: EQUAL? WRD,W?ONE \?ELS84
CALL2 ACLAUSE-WIN,ADJ
JUMP ?CND55
?ELS84: GETB WRD,P-PSOFF
BTST STACK,PS?OBJECT \?CND68
EQUAL? WRD,P-ANAM \?ELS89
CALL2 ACLAUSE-WIN,ADJ
JUMP ?CND8
?ELS89: CALL1 NCLAUSE-WIN
JUMP ?CND8
?CND68: ADD BEG,P-WORDLEN >BEG
ZERO? END \?PRG66
SET 'END,BEG
SET 'P-NCN,1
SUB BEG,4
PUT P-ITBL,P-NC1,STACK
PUT P-ITBL,P-NC1L,BEG
JUMP ?PRG66
?CND55:
?CND8: 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
?PRG95: IGRTR? 'CNT,P-ITBLLEN \?ELS99
SET 'P-MERGED,TRUE-VALUE
RTRUE
?ELS99: GET P-OTBL,CNT
PUT P-ITBL,CNT,STACK
JUMP ?PRG95
.FUNCT ACLAUSE-WIN,ADJ,X
GET P-OTBL,P-VERB
PUT P-ITBL,P-VERB,STACK
ADD P-ACLAUSE,1 >X
CALL CLAUSE-COPY,P-OTBL,P-OTBL,P-ACLAUSE,X,P-ACLAUSE,X,ADJ
GET P-OTBL,P-NC2
ZERO? STACK /?ELS2
SET 'P-NCN,2
?ELS2: SET 'P-ACLAUSE,FALSE-VALUE
RTRUE
.FUNCT NCLAUSE-WIN
ADD P-ACLAUSE,1
CALL CLAUSE-COPY,P-ITBL,P-OTBL,P-NC1,P-NC1L,P-ACLAUSE,STACK
GET P-OTBL,P-NC2
ZERO? STACK /?ELS2
SET 'P-NCN,2
?ELS2: 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
CALL2 PICK-ONE,UNKNOWN-MSGS >MSG
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
CRLF
RTRUE
.FUNCT CANT-USE,PTR,BUF,?TMP1
SET 'QUOTE-FLAG,FALSE-VALUE
SET 'P-OFLAG,FALSE-VALUE
PRINTI "(Sorry, but I don't understand 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
PRINTR """ when you use it that way.)"
.FUNCT SYNTAX-CHECK,SYN,LEN,NUM,OBJ,DRIVE1=0,DRIVE2=0,PREP,VERB,?TMP2,?TMP1
GET P-ITBL,P-VERB >VERB
ZERO? VERB \?CND1
CALL1 MISSING-VERB
RFALSE
?CND1: SUB 255,VERB
GET VERBS,STACK >SYN
GETB SYN,0 >LEN
ADD 1,SYN >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
CALL2 SYNTAX-FOUND,SYN
RTRUE
?CND6: DLESS? 'LEN,1 \?ELS26
ZERO? DRIVE1 \?REP5
ZERO? DRIVE2 /?ELS29
JUMP ?REP5
?ELS29: CALL1 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
CALL2 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
CALL2 SYNTAX-FOUND,DRIVE2
RSTACK
?ELS44: EQUAL? VERB,ACT?FIND,ACT?NAME \?ELS48
PRINTI "(Sorry, but I can't answer that question.)"
CRLF
RFALSE
?ELS48: EQUAL? WINNER,PLAYER \?ELS55
CALL ORPHAN,DRIVE1,DRIVE2
PRINTI "(Wh"
JUMP ?CND53
?ELS55: PRINTI "(Your command was not complete. Next time, type wh"
?CND53: EQUAL? VERB,ACT?WALK,ACT?HEAD \?ELS64
PRINTI "ere"
JUMP ?CND62
?ELS64: ZERO? DRIVE1 /?ELS72
GETB DRIVE1,P-SFWIM1
EQUAL? STACK,PERSONBIT /?THN69
?ELS72: ZERO? DRIVE2 /?ELS68
GETB DRIVE2,P-SFWIM2
EQUAL? STACK,PERSONBIT \?ELS68
?THN69: PRINTI "om"
JUMP ?CND62
?ELS68: PRINTI "at"
?CND62: EQUAL? WINNER,PLAYER \?ELS83
PRINTI " do you want to "
JUMP ?CND81
?ELS83: PRINTI " you want"
CALL2 HIM-HER-IT,WINNER
PRINTI " to "
?CND81: CALL1 VERB-PRINT
ZERO? DRIVE2 /?CND90
CALL CLAUSE-PRINT,P-NC1,P-NC1L
?CND90: SET 'P-END-ON-PREP,FALSE-VALUE
ZERO? DRIVE1 /?ELS98
GETB DRIVE1,P-SPREP1
JUMP ?CND94
?ELS98: GETB DRIVE2,P-SPREP2
?CND94: CALL2 PREP-PRINT,STACK
EQUAL? WINNER,PLAYER \?ELS104
SET 'P-OFLAG,TRUE-VALUE
PRINTI "?)"
CRLF
RFALSE
?ELS104: SET 'P-OFLAG,FALSE-VALUE
PRINTI ".)"
CRLF
RFALSE
.FUNCT DONT-UNDERSTAND
PRINTR "(Sorry, but I don't understand. Please reword that or try something else.)"
.FUNCT VERB-PRINT,TMP,?TMP1
GET P-ITBL,P-VERBN >TMP
ZERO? TMP \?ELS5
PRINTI "tell"
RTRUE
?ELS5: GETB P-VTBL,2
ZERO? STACK \?ELS9
GET TMP,0
PRINTB STACK
RTRUE
?ELS9: 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-OCLAUSE,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
CALL CLAUSE-COPY,P-ITBL,P-OTBL,P-NC2,P-NC2L,P-NC2,P-NC2L
?CND11: LESS? P-NCN,1 /?CND14
CALL CLAUSE-COPY,P-ITBL,P-OTBL,P-NC1,P-NC1L,P-NC1,P-NC1L
?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?HIM \?ELS22
CALL2 VISIBLE?,P-HIM-OBJECT
ZERO? STACK /?THN19
?ELS22: EQUAL? WRD,W?HER \?ELS24
CALL2 VISIBLE?,P-HER-OBJECT
ZERO? STACK /?THN19
?ELS24: EQUAL? WRD,W?THEM \?CND16
CALL2 VISIBLE?,P-THEM-OBJECT
ZERO? STACK \?CND16
?THN19: SET 'PN,TRUE-VALUE
?CND16: EQUAL? WRD,W?PERIOD \?ELS29
SET 'NOSP,TRUE-VALUE
JUMP ?CND3
?ELS29: CALL WT?,WRD,PS?BUZZ-WORD
ZERO? STACK \?THN34
CALL WT?,WRD,PS?PREPOSITION
ZERO? STACK /?ELS31
?THN34: CALL WT?,WRD,PS?ADJECTIVE
ZERO? STACK \?ELS31
CALL WT?,WRD,PS?OBJECT
ZERO? STACK \?ELS31
SET 'NOSP,TRUE-VALUE
JUMP ?CND3
?ELS31: EQUAL? WRD,W?ME \?ELS37
PRINTD PLAYER
SET 'PN,TRUE-VALUE
JUMP ?CND3
?ELS37: CALL2 CAPITAL-NOUN?,WRD
ZERO? STACK /?ELS39
CALL2 CAPITALIZE,BEG
SET 'PN,TRUE-VALUE
JUMP ?CND3
?ELS39: ZERO? FIRST?? /?CND42
ZERO? PN \?CND42
ZERO? CP /?CND42
PRINTI "the "
?CND42: ZERO? P-OFLAG \?THN52
ZERO? P-MERGED /?ELS51
?THN52: PRINTB WRD
JUMP ?CND49
?ELS51: EQUAL? WRD,W?IT \?ELS55
CALL2 VISIBLE?,P-IT-OBJECT
ZERO? STACK /?ELS55
PRINTD P-IT-OBJECT
JUMP ?CND49
?ELS55: EQUAL? WRD,W?HER \?ELS59
ZERO? PN \?ELS59
PRINTD P-HER-OBJECT
JUMP ?CND49
?ELS59: EQUAL? WRD,W?THEM \?ELS63
ZERO? PN \?ELS63
PRINTD P-THEM-OBJECT
JUMP ?CND49
?ELS63: EQUAL? WRD,W?HIM \?ELS67
ZERO? PN \?ELS67
PRINTD P-HIM-OBJECT
JUMP ?CND49
?ELS67: GETB BEG,2 >?TMP1
GETB BEG,3
CALL WORD-PRINT,?TMP1,STACK
?CND49: SET 'FIRST??,FALSE-VALUE
?CND3: ADD BEG,P-WORDLEN >BEG
JUMP ?PRG1
.FUNCT CAPITAL-NOUN?,WRD
EQUAL? WRD,W?FRBZ,W?GRNZ,W?GOLA /TRUE
EQUAL? WRD,W?KNUT,W?HRNG,W?WIEN /TRUE
RFALSE
.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
PRINTI " "
?CND8: CALL2 PREP-FIND,PREP >WRD
PRINTB WRD
GET P-ITBL,P-VERBN
GET STACK,0
EQUAL? STACK,W?SIT,W?LIE \?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,SRCBEG,SRCEND,DESTBEG,DESTEND,INSRT=0,BEG,END
GET SRC,SRCBEG >BEG
GET SRC,SRCEND >END
GET P-OCLAUSE,P-MATCHLEN
MUL STACK,P-LEXELEN
ADD STACK,2
ADD P-OCLAUSE,STACK
PUT DEST,DESTBEG,STACK
?PRG1: EQUAL? BEG,END \?ELS5
GET P-OCLAUSE,P-MATCHLEN
MUL STACK,P-LEXELEN
ADD 2,STACK
ADD P-OCLAUSE,STACK
PUT DEST,DESTEND,STACK
RTRUE
?ELS5: ZERO? INSRT /?CND8
GET BEG,0
EQUAL? P-ANAM,STACK \?CND8
CALL2 CLAUSE-ADD,INSRT
?CND8: GET BEG,0
CALL2 CLAUSE-ADD,STACK
?CND3: ADD BEG,P-WORDLEN >BEG
JUMP ?PRG1
.FUNCT CLAUSE-ADD,WRD,PTR
GET P-OCLAUSE,P-MATCHLEN
ADD STACK,2 >PTR
SUB PTR,1
PUT P-OCLAUSE,STACK,WRD
PUT P-OCLAUSE,PTR,0
PUT P-OCLAUSE,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
RETURN STACK
.FUNCT SYNTAX-FOUND,SYN
SET 'P-SYNTAX,SYN
GETB SYN,P-SACTION >PRSA
RETURN PRSA
.FUNCT GWIM,GBIT,LBIT,PREP,OBJ
EQUAL? GBIT,RMUNGBIT \?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 "("
CALL PREP-PRINT,PREP,FALSE-VALUE
ZERO? STACK /?CND16
CALL2 THE?,OBJ
PRINTI " "
?CND16: PRINTD OBJ
PRINTI ")"
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
CALL2 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
CALL2 BUT-MERGE,P-PRSO >P-PRSO
RTRUE
?ELS18: CALL2 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,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: CALL2 GET-OBJECT,STACK >WV
ZERO? WAS-ALL /?CND13
SET 'P-GETFLAGS,P-ALL
?CND13: RETURN WV
?ELS8: GET PTR,P-LEXELEN >NW
EQUAL? WRD,W?ALL,W?BOTH \?ELS21
SET 'P-GETFLAGS,P-ALL
EQUAL? NW,W?OF \?CND19
ADD PTR,P-WORDLEN >PTR
JUMP ?CND19
?ELS21: EQUAL? WRD,W?BUT,W?EXCEPT \?ELS26
ZERO? BUT /?ORP32
PUSH BUT
JUMP ?THN29
?ORP32: PUSH TBL
?THN29: CALL2 GET-OBJECT,STACK
ZERO? STACK /FALSE
SET 'BUT,P-BUTS
PUT BUT,P-MATCHLEN,0
JUMP ?CND6
?ELS26: CALL2 BUZZER-WORD?,WRD
ZERO? STACK \FALSE
EQUAL? WRD,W?A,W?ONE \?ELS36
ZERO? P-ADJ \?ELS39
SET 'P-GETFLAGS,P-ONE
EQUAL? NW,W?OF \?CND6
ADD PTR,P-WORDLEN >PTR
JUMP ?CND6
?ELS39: SET 'P-NAM,ONEOBJ
ZERO? BUT /?ORP50
PUSH BUT
JUMP ?THN47
?ORP50: PUSH TBL
?THN47: CALL2 GET-OBJECT,STACK
ZERO? STACK /FALSE
ZERO? NW /TRUE
JUMP ?CND6
?ELS36: EQUAL? WRD,W?AND,W?COMMA \?ELS54
EQUAL? NW,W?AND,W?COMMA /?ELS54
SET 'P-AND,TRUE-VALUE
ZERO? BUT /?ORP62
PUSH BUT
JUMP ?THN59
?ORP62: PUSH TBL
?THN59: CALL2 GET-OBJECT,STACK
ZERO? STACK \?CND19
RFALSE
?ELS54: CALL WT?,WRD,PS?BUZZ-WORD
ZERO? STACK /?ELS64
JUMP ?CND6
?ELS64: EQUAL? WRD,W?AND,W?COMMA \?ELS66
JUMP ?CND6
?ELS66: EQUAL? WRD,W?OF \?ELS68
ZERO? P-GETFLAGS \?CND19
SET 'P-GETFLAGS,P-INHIBIT
JUMP ?CND19
?ELS68: CALL WT?,WRD,PS?ADJECTIVE
ZERO? STACK /?ELS73
ZERO? P-ADJ \?ELS73
SET 'P-ADJ,WRD
JUMP ?CND6
?ELS73: CALL WT?,WRD,PS?OBJECT
ZERO? STACK /?CND6
SET 'P-NAM,WRD
SET 'ONEOBJ,WRD
?CND19:
?CND6: EQUAL? PTR,EPTR /?PRG4
ADD PTR,P-WORDLEN >PTR
SET 'WRD,NW
JUMP ?PRG4
.FUNCT GET-OBJECT,TBL,VRB=1,BTS,LEN,XBITS,TLEN,GCHECK=0,OLEN=0,OBJ,ADJ
SET 'XBITS,P-SLOCBITS
GET TBL,P-MATCHLEN >TLEN
BTST P-GETFLAGS,P-INHIBIT /TRUE
SET 'ADJ,P-ADJ
ZERO? P-NAM \?CND4
ZERO? P-ADJ /?CND4
CALL WT?,P-ADJ,PS?OBJECT
ZERO? STACK /?ELS11
SET 'P-NAM,P-ADJ
SET 'P-ADJ,FALSE-VALUE
JUMP ?CND4
?ELS11: CALL WT?,P-ADJ,PS?DIRECTION,P1?DIRECTION >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
CALL2 MISSING-NOUN,ADJ
RFALSE
?CND14: EQUAL? P-GETFLAGS,P-ALL \?THN26
ZERO? P-SLOCBITS \?CND23
?THN26: SET 'P-SLOCBITS,-1
?CND23:
?PRG28: ZERO? GCHECK /?ELS32
CALL2 GLOBAL-CHECK,TBL
JUMP ?CND30
?ELS32: ZERO? LIT /?CND36
FCLEAR PLAYER,TRANSBIT
CALL DO-SL,HERE,SOG,SIR,TBL
FSET PLAYER,TRANSBIT
?CND36: CALL DO-SL,PLAYER,SH,SC,TBL
?CND30: GET TBL,P-MATCHLEN
SUB STACK,TLEN >LEN
BTST P-GETFLAGS,P-ALL \?ELS42
JUMP ?CND40
?ELS42: 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
CALL2 PRINTT,STACK
PRINTI "?)"
CRLF
?CND47: PUT TBL,P-MATCHLEN,1
JUMP ?CND40
?ELS44: GRTR? LEN,1 /?THN54
ZERO? LEN \?ELS53
EQUAL? P-SLOCBITS,-1 /?ELS53
?THN54: EQUAL? P-SLOCBITS,-1 \?ELS60
SET 'P-SLOCBITS,XBITS
SET 'OLEN,LEN
GET TBL,P-MATCHLEN
SUB STACK,LEN
PUT TBL,P-MATCHLEN,STACK
JUMP ?PRG28
?ELS60: ZERO? LEN \?CND63
SET 'LEN,OLEN
?CND63: ZERO? P-NAM /?ELS68
ADD TLEN,1
GET TBL,STACK >OBJ
ZERO? OBJ /?ELS68
GETP OBJ,P?GENERIC
CALL STACK,TBL >OBJ
ZERO? OBJ /?ELS68
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
?ELS68: ZERO? VRB /?ELS75
EQUAL? WINNER,PLAYER /?ELS75
CALL1 CANT-ORPHAN
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 ?CND66
?ELS79: ZERO? VRB /?CND66
CALL2 MISSING-NOUN,ADJ
?CND66: SET 'P-NAM,FALSE-VALUE
SET 'P-ADJ,FALSE-VALUE
RFALSE
?ELS53: ZERO? LEN \?ELS93
ZERO? GCHECK /?ELS93
ZERO? VRB /?CND96
SET 'P-SLOCBITS,XBITS
ZERO? LIT \?THN103
CALL1 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-ADJ,FALSE-VALUE
RTRUE
?ELS102: CALL1 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: ZERO? P-ADJ /?CND111
ZERO? P-NAM \?CND111
PRINT I-ASSUME
ADD TLEN,1
GET TBL,STACK
CALL2 PRINTT,STACK
PRINTI ".)"
CRLF
?CND111: 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?$CALL,V?ASK,V?ASK-ABOUT /TRUE
EQUAL? V,V?ASK-FOR,V?GOODBYE,V?HELLO /TRUE
EQUAL? V,V?NO,V?TELL,V?TELL-ABOUT /TRUE
EQUAL? V,V?YES,V?TALK-ABOUT,V?ANSWER /TRUE
EQUAL? V,V?ASK-CONTEXT-ABOUT,V?ASK-CONTEXT-FOR,V?REPLY /TRUE
RFALSE
.FUNCT CANT-ORPHAN
PRINTI "(Please try saying that another way.)"
CRLF
RFALSE
.FUNCT MISSING-NOUN,ADJ
PRINTR "(I couldn't find enough nouns in that sentence!)"
.FUNCT MISSING-VERB
PRINTR "(I couldn't find a verb in that sentence!)"
.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,TRUE-VALUE >FOO
ZERO? FOO /?CND8
CALL2 THIS-IT?,OBJ >FOO
ZERO? FOO /?CND8
CALL OBJ-FOUND,OBJ,TBL >FOO
?CND8: IGRTR? 'OBJ,LAST-OBJECT \?PRG6
GET TBL,P-MATCHLEN >LEN
EQUAL? LEN,1 \?CND16
GET TBL,1 >P-MOBY-FOUND
?CND16: RETURN LEN
?ELS5: SET 'P-SLOCBITS,-1
SET 'P-NAM,P-XNAM
SET 'P-ADJ,P-XADJ
PUT TBL,P-MATCHLEN,0
FIRST? ROOMS >FOO /?KLU37
?KLU37:
?PRG21: ZERO? FOO \?ELS25
JUMP ?REP22
?ELS25: CALL SEARCH-LIST,FOO,TBL,P-SRCALL,TRUE-VALUE
NEXT? FOO >FOO /?KLU38
?KLU38: JUMP ?PRG21
?REP22: CALL DO-SL,LOCAL-GLOBALS,1,1,TBL,TRUE-VALUE
CALL SEARCH-LIST,ROOMS,TBL,P-SRCTOP,TRUE-VALUE
GET TBL,P-MATCHLEN >LEN
EQUAL? LEN,1 \?CND34
GET TBL,1 >P-MOBY-FOUND
?CND34: 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"
ZERO? P-OFLAG \?THN6
ZERO? P-MERGED \?THN6
ZERO? P-AND /?ELS5
?THN6: PRINTI " "
PRINTB P-NAM
JUMP ?CND3
?ELS5: EQUAL? TBL,P-PRSO \?ELS11
CALL CLAUSE-PRINT,P-NC1,P-NC1L,FALSE-VALUE
JUMP ?CND3
?ELS11: CALL CLAUSE-PRINT,P-NC2,P-NC2L,FALSE-VALUE
?CND3: PRINTI " do you mean,"
?PRG16: INC 'TLEN
GET TBL,TLEN >OBJ
CALL2 PRINTT,OBJ
EQUAL? LEN,2 \?ELS22
EQUAL? RLEN,2 /?CND23
PRINTI ","
?CND23: PRINTI " or"
JUMP ?CND20
?ELS22: GRTR? LEN,2 \?CND20
PRINTI ","
?CND20: DLESS? 'LEN,1 \?PRG16
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
DIV STACK,2
SUB STACK,1 >RMGL
?PRG4: GET RMG,CNT >OBJ
FIRST? OBJ \?CND6
CALL SEARCH-LIST,OBJ,TBL,P-SRCALL
?CND6: CALL2 THIS-IT?,OBJ
ZERO? STACK /?CND9
CALL OBJ-FOUND,OBJ,TBL
?CND9: IGRTR? 'CNT,RMGL \?PRG4
?CND1: GET TBL,P-MATCHLEN
EQUAL? STACK,LEN \FALSE
SET 'P-SLOCBITS,-1
CALL DO-SL,GLOBAL-OBJECTS,1,1,TBL
SET 'P-SLOCBITS,OBITS
GET TBL,P-MATCHLEN
ZERO? STACK \FALSE
EQUAL? PRSA,V?WALK-TO /?THN30
EQUAL? PRSA,V?THROUGH,V?SMELL,V?SEARCH-FOR /?THN30
EQUAL? PRSA,V?SEARCH,V?LOOK-INSIDE,V?LEAVE /?THN30
EQUAL? PRSA,V?FOLLOW,V?FIND,V?EXAMINE \FALSE
?THN30: CALL DO-SL,ROOMS,1,1,TBL
RSTACK
.FUNCT DO-SL,OBJ,BIT1,BIT2,TBL,MOBY-FLAG=0,BTS
ADD BIT1,BIT2
BTST P-SLOCBITS,STACK \?ELS5
CALL SEARCH-LIST,OBJ,TBL,P-SRCALL,MOBY-FLAG
RSTACK
?ELS5: BTST P-SLOCBITS,BIT1 \?ELS12
CALL SEARCH-LIST,OBJ,TBL,P-SRCTOP,MOBY-FLAG
RSTACK
?ELS12: BTST P-SLOCBITS,BIT2 \TRUE
CALL SEARCH-LIST,OBJ,TBL,P-SRCBOT,MOBY-FLAG
RSTACK
.FUNCT SEARCH-LIST,OBJ,TBL,LVL,MOBY-FLAG=0
FIRST? OBJ >OBJ \FALSE
?PRG6: EQUAL? LVL,P-SRCBOT /?CND8
GETPT OBJ,P?SYNONYM
ZERO? STACK /?CND8
CALL2 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
ZERO? MOBY-FLAG \?THN20
CALL2 SEE-INSIDE?,OBJ
ZERO? STACK /?CND13
?THN20: FSET? OBJ,SURFACEBIT \?ELS26
PUSH P-SRCALL
JUMP ?CND22
?ELS26: FSET? OBJ,SEARCHBIT \?ELS28
PUSH P-SRCALL
JUMP ?CND22
?ELS28: PUSH P-SRCTOP
?CND22: CALL SEARCH-LIST,OBJ,TBL,STACK,MOBY-FLAG
?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
DIV STACK,2
SUB STACK,1
CALL ZMEMQ,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
CALL2 ACCESSIBLE?,P-IT-OBJECT
ZERO? STACK \?ELS20
CALL1 MORE-SPECIFIC
RFALSE
?ELS20: SET 'OBJ,P-IT-OBJECT
JUMP ?CND15
?ELS17: EQUAL? OBJ,HER \?ELS24
CALL2 ACCESSIBLE?,P-HER-OBJECT
ZERO? STACK \?ELS27
CALL1 MORE-SPECIFIC
RFALSE
?ELS27: SET 'OBJ,P-HER-OBJECT
JUMP ?CND15
?ELS24: EQUAL? OBJ,HIM \?ELS31
CALL2 ACCESSIBLE?,P-HIM-OBJECT
ZERO? STACK \?ELS34
CALL1 MORE-SPECIFIC
RFALSE
?ELS34: SET 'OBJ,P-HIM-OBJECT
JUMP ?CND15
?ELS31: EQUAL? OBJ,THEM \?CND15
CALL2 ACCESSIBLE?,P-THEM-OBJECT
ZERO? STACK \?ELS41
CALL1 MORE-SPECIFIC
RFALSE
?ELS41: SET 'OBJ,P-THEM-OBJECT
?CND15: CALL HELD?,OBJ,WINNER
ZERO? STACK \?PRG10
SET 'PRSO,OBJ
FSET? OBJ,TRYTAKEBIT \?ELS51
SET 'TAKEN,TRUE-VALUE
JUMP ?CND49
?ELS51: EQUAL? WINNER,PLAYER /?ELS53
SET 'TAKEN,FALSE-VALUE
JUMP ?CND49
?ELS53: BTST BITS,STAKE \?ELS55
CALL2 ITAKE,FALSE-VALUE
EQUAL? STACK,TRUE-VALUE \?ELS55
SET 'TAKEN,FALSE-VALUE
JUMP ?CND49
?ELS55: SET 'TAKEN,TRUE-VALUE
?CND49: ZERO? TAKEN /?ELS62
BTST BITS,SHAVE \?ELS62
PRINTI "("
CALL HE-SHE-IT,WINNER,TRUE-VALUE,STR?3
PRINTI "n't seem to be holding"
GET TBL,P-MATCHLEN
LESS? 1,STACK \?ELS71
PRINTI " those things"
JUMP ?CND69
?ELS71: EQUAL? OBJ,NOT-HERE-OBJECT \?ELS75
PRINTI " that"
JUMP ?CND69
?ELS75: CALL2 PRINTT,OBJ
CALL2 THIS-IS-IT,OBJ
?CND69: PRINTI "!)"
CRLF
RFALSE
?ELS62: ZERO? TAKEN \?PRG10
EQUAL? WINNER,PLAYER \?PRG10
PRINTI "(taking"
CALL2 HIM-HER-IT,OBJ
ZERO? ITAKE-LOC /?CND90
PRINTI " from"
CALL2 HIM-HER-IT,ITAKE-LOC
?CND90: 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
PRINTI "(You can't use more than one "
EQUAL? LOSS,2 \?CND23
PRINTI "in"
?CND23: PRINTI "direct object with """
GET P-ITBL,P-VERBN >TMP
ZERO? TMP \?ELS32
PRINTI "tell"
JUMP ?CND30
?ELS32: ZERO? P-OFLAG \?THN37
ZERO? P-MERGED /?ELS36
?THN37: GET TMP,0
PRINTB STACK
JUMP ?CND30
?ELS36: GETB TMP,2 >?TMP1
GETB TMP,3
CALL WORD-PRINT,?TMP1,STACK
?CND30: 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
ZERO? CNT /TRUE
RETURN CNT
?ELS13: IGRTR? 'CNT,SIZE \?PRG9
RFALSE
.FUNCT ZMEMZ,ITM,TBL,CNT=0
ZERO? TBL /FALSE
?PRG4: GET TBL,CNT
ZERO? STACK /FALSE
GET TBL,CNT
EQUAL? ITM,STACK \?ELS10
ZERO? CNT /TRUE
RETURN CNT
?ELS10: INC 'CNT
JUMP ?PRG4
.FUNCT LIT?,RM,RMBIT=1,OHERE,LIT=0
ZERO? ALWAYS-LIT /?CND1
EQUAL? WINNER,PLAYER /TRUE
?CND1: SET 'P-GWIMBIT,ONBIT
SET 'OHERE,HERE
SET 'HERE,RM
ZERO? RMBIT /?ELS8
FSET? RM,ONBIT \?ELS8
SET 'LIT,TRUE-VALUE
JUMP ?CND6
?ELS8: PUT P-MERGE,P-MATCHLEN,0
SET 'P-SLOCBITS,-1
EQUAL? OHERE,RM \?CND13
CALL DO-SL,WINNER,1,1,P-MERGE
EQUAL? WINNER,PLAYER /?CND13
IN? PLAYER,RM \?CND13
CALL DO-SL,PLAYER,1,1,P-MERGE
?CND13: CALL DO-SL,RM,1,1,P-MERGE
GET P-MERGE,P-MATCHLEN
GRTR? STACK,0 \?CND6
SET 'LIT,TRUE-VALUE
?CND6: SET 'HERE,OHERE
SET 'P-GWIMBIT,0
RETURN LIT
.FUNCT NOT-HERE,OBJ
SET 'CLOCK-WAIT,TRUE-VALUE
PRINTI "(You can't see "
FSET? OBJ,NARTICLEBIT /?CND3
PRINTI "any "
?CND3: CALL2 THIS-IS-IT,OBJ
ZERO? P-DOLLAR-FLAG /?ELS10
EQUAL? OBJ,INTNUM \?ELS10
PRINTI "money"
JUMP ?CND8
?ELS10: PRINTD OBJ
?CND8: PRINTR " here.)"
.ENDI