2417 lines
50 KiB
Plaintext
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
|