hollywoodhijinx/parser.zap
2019-04-14 02:06:26 -04:00

2417 lines
50 KiB
Plaintext

.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