1654 lines
35 KiB
Plaintext
1654 lines
35 KiB
Plaintext
|
|
|
|
.FUNCT PARSER,PTR=P-LEXSTART,WRD,VAL=0,VERB=0,OMERGED,OWINNER,LEN,DIR=0,NW=0,LW=0,CNT=-1,OF-FLAG=0,?TMP1,?TMP2
|
|
?PRG1: INC 'CNT
|
|
GRTR? CNT,P-ITBLLEN \?ELS5
|
|
JUMP ?REP2
|
|
?ELS5: ZERO? P-OFLAG \?CND8
|
|
GET P-ITBL,CNT
|
|
PUT P-OTBL,CNT,STACK
|
|
?CND8: PUT P-ITBL,CNT,0
|
|
JUMP ?PRG1
|
|
?REP2: SET 'P-NAM,FALSE-VALUE
|
|
PUT P-NAMW,0,FALSE-VALUE
|
|
PUT P-NAMW,1,FALSE-VALUE
|
|
SET 'P-ADJ,FALSE-VALUE
|
|
PUT P-ADJW,0,FALSE-VALUE
|
|
PUT P-ADJW,1,FALSE-VALUE
|
|
SET 'OMERGED,P-MERGED
|
|
SET 'OWINNER,WINNER
|
|
SET 'P-MERGED,FALSE-VALUE
|
|
SET 'P-END-ON-PREP,FALSE-VALUE
|
|
PUT P-PRSO,P-MATCHLEN,0
|
|
PUT P-PRSI,P-MATCHLEN,0
|
|
PUT P-BUTS,P-MATCHLEN,0
|
|
ZERO? QUOTE-FLAG \?CND11
|
|
EQUAL? WINNER,PLAYER /?CND11
|
|
SET 'WINNER,PLAYER
|
|
LOC WINNER
|
|
FSET? STACK,VEHBIT /?CND11
|
|
LOC WINNER >HERE
|
|
?CND11: ZERO? RESERVE-PTR /?ELS21
|
|
SET 'PTR,RESERVE-PTR
|
|
CALL STUFF,P-LEXV,RESERVE-LEXV
|
|
CALL INBUF-STUFF,P-INBUF,RESERVE-INBUF
|
|
EQUAL? VERBOSITY,1,2 \?CND23
|
|
EQUAL? PLAYER,WINNER \?CND23
|
|
CRLF
|
|
?CND23: SET 'RESERVE-PTR,FALSE-VALUE
|
|
SET 'P-CONT,FALSE-VALUE
|
|
JUMP ?CND19
|
|
?ELS21: ZERO? P-CONT /?ELS29
|
|
SET 'PTR,P-CONT
|
|
EQUAL? VERBOSITY,1,2 \?CND31
|
|
EQUAL? PLAYER,WINNER \?CND31
|
|
CRLF
|
|
?CND31: SET 'P-CONT,FALSE-VALUE
|
|
JUMP ?CND19
|
|
?ELS29: SET 'WINNER,PLAYER
|
|
SET 'QUOTE-FLAG,FALSE-VALUE
|
|
LOC WINNER
|
|
FSET? STACK,VEHBIT /?CND38
|
|
LOC WINNER >HERE
|
|
?CND38: EQUAL? VERBOSITY,1,2 \?CND41
|
|
CRLF
|
|
?CND41: GET 0,8
|
|
BTST STACK,4 \?CND44
|
|
CALL1 REFRESH-STATUS-LINE
|
|
GET 0,8
|
|
BAND STACK,-5
|
|
PUT 0,8,STACK
|
|
?CND44: PRINTI ">"
|
|
READ P-INBUF,P-LEXV
|
|
?CND19: GETB P-LEXV,P-LEXWORDS >P-LEN
|
|
ZERO? P-LEN \?ELS51
|
|
PRINTI "[I beg your pardon?]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS51: GET P-LEXV,PTR
|
|
EQUAL? STACK,W?OOPS \?ELS55
|
|
ADD PTR,P-LEXELEN
|
|
GET P-LEXV,STACK
|
|
EQUAL? STACK,W?PERIOD,W?COMMA \?CND56
|
|
ADD PTR,P-LEXELEN >PTR
|
|
DEC 'P-LEN
|
|
?CND56: GRTR? P-LEN,1 /?ELS61
|
|
PRINTI "[There was no word after OOPS!]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS61: GET OOPS-TABLE,O-PTR >VAL
|
|
ZERO? VAL /?ELS65
|
|
GRTR? P-LEN,2 \?CND66
|
|
PRINTI "[Warning: only the first word after OOPS is used.]"
|
|
CRLF
|
|
?CND66: ADD PTR,P-LEXELEN
|
|
GET P-LEXV,STACK
|
|
PUT AGAIN-LEXV,VAL,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
|
|
MUL VAL,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 ?CND49
|
|
?ELS65: PUT OOPS-TABLE,O-END,FALSE-VALUE
|
|
PRINTI "[OOPS is useful only after the ""I don't know the word..."" response.]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS55: PUT OOPS-TABLE,O-END,FALSE-VALUE
|
|
?CND49: GET P-LEXV,PTR
|
|
EQUAL? STACK,W?AGAIN,W?G \?ELS79
|
|
ZERO? P-OFLAG /?ELS82
|
|
PRINTI "[It's difficult to repeat fragments.]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS82: ZERO? P-WON \?ELS87
|
|
PRINTI "[That would just repeat a mistake!]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS87: EQUAL? OWINNER,PLAYER /?ELS91
|
|
CALL2 VISIBLE?,OWINNER
|
|
ZERO? STACK \?ELS91
|
|
PRINTI "[You can't see"
|
|
CALL2 ARTICLE,OWINNER
|
|
PRINTI " anymore.]"
|
|
CRLF
|
|
CALL1 CLEAR-BUF
|
|
RFALSE
|
|
?ELS91: GRTR? P-LEN,1 \?ELS99
|
|
ADD PTR,P-LEXELEN
|
|
GET P-LEXV,STACK
|
|
EQUAL? STACK,W?PERIOD,W?COMMA,W?THEN /?THN103
|
|
ADD PTR,P-LEXELEN
|
|
GET P-LEXV,STACK
|
|
EQUAL? STACK,W?AND \?ELS102
|
|
?THN103: MUL 2,P-LEXELEN
|
|
ADD PTR,STACK >PTR
|
|
GETB P-LEXV,P-LEXWORDS
|
|
SUB STACK,2
|
|
PUTB P-LEXV,P-LEXWORDS,STACK
|
|
JUMP ?CND80
|
|
?ELS102: PRINTI "[I couldn't understand that sentence.]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS99: 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 \?ELS113
|
|
CALL STUFF,RESERVE-LEXV,P-LEXV
|
|
CALL INBUF-STUFF,RESERVE-INBUF,P-INBUF
|
|
SET 'RESERVE-PTR,PTR
|
|
JUMP ?CND111
|
|
?ELS113: SET 'RESERVE-PTR,FALSE-VALUE
|
|
?CND111: SET 'WINNER,OWINNER
|
|
SET 'P-MERGED,OMERGED
|
|
CALL INBUF-STUFF,P-INBUF,OOPS-INBUF
|
|
CALL STUFF,P-LEXV,AGAIN-LEXV
|
|
SET 'CNT,-1
|
|
SET 'DIR,AGAIN-DIR
|
|
?PRG116: IGRTR? 'CNT,P-ITBLLEN \?ELS120
|
|
JUMP ?CND77
|
|
?ELS120: GET P-OTBL,CNT
|
|
PUT P-ITBL,CNT,STACK
|
|
JUMP ?PRG116
|
|
?ELS79: CALL STUFF,AGAIN-LEXV,P-LEXV
|
|
CALL INBUF-STUFF,OOPS-INBUF,P-INBUF
|
|
PUT OOPS-TABLE,O-START,PTR
|
|
MUL 4,P-LEN
|
|
PUT OOPS-TABLE,O-LENGTH,STACK
|
|
GETB P-LEXV,P-LEXWORDS
|
|
MUL P-LEXELEN,STACK
|
|
ADD PTR,STACK
|
|
MUL 2,STACK >LEN
|
|
SUB LEN,1
|
|
GETB P-LEXV,STACK >?TMP1
|
|
SUB LEN,2
|
|
GETB P-LEXV,STACK
|
|
ADD ?TMP1,STACK
|
|
PUT OOPS-TABLE,O-END,STACK
|
|
SET 'RESERVE-PTR,FALSE-VALUE
|
|
SET 'LEN,P-LEN
|
|
SET 'P-NCN,0
|
|
SET 'P-GETFLAGS,0
|
|
?PRG125: DEC 'P-LEN
|
|
LESS? P-LEN,0 \?ELS129
|
|
SET 'QUOTE-FLAG,FALSE-VALUE
|
|
JUMP ?CND77
|
|
?ELS129: GET P-LEXV,PTR >WRD
|
|
ZERO? WRD \?THN132
|
|
CALL2 NUMBER?,PTR >WRD
|
|
ZERO? WRD /?ELS131
|
|
?THN132: EQUAL? WRD,W?TO \?ELS136
|
|
EQUAL? VERB,ACT?TELL,ACT?ASK \?ELS136
|
|
PUT P-ITBL,P-VERB,ACT?TELL
|
|
SET 'WRD,W?QUOTE
|
|
JUMP ?CND134
|
|
?ELS136: EQUAL? WRD,W?THEN \?ELS140
|
|
GRTR? P-LEN,0 \?ELS140
|
|
ZERO? VERB \?ELS140
|
|
ZERO? QUOTE-FLAG \?ELS140
|
|
PUT P-ITBL,P-VERB,ACT?TELL
|
|
PUT P-ITBL,P-VERBN,0
|
|
SET 'WRD,W?QUOTE
|
|
JUMP ?CND134
|
|
?ELS140: EQUAL? WRD,W?PERIOD \?CND134
|
|
EQUAL? LW,W?MR,W?DR,W?ST \?CND134
|
|
DEC 'P-NCN
|
|
CALL CHANGE-LEXV,PTR,LW,TRUE-VALUE
|
|
SET 'WRD,LW
|
|
SET 'LW,0
|
|
?CND134: EQUAL? WRD,W?THEN,W?PERIOD,W?QUOTE \?ELS149
|
|
EQUAL? WRD,W?QUOTE \?CND150
|
|
ZERO? QUOTE-FLAG /?ELS155
|
|
SET 'QUOTE-FLAG,FALSE-VALUE
|
|
JUMP ?CND150
|
|
?ELS155: SET 'QUOTE-FLAG,TRUE-VALUE
|
|
?CND150: ZERO? P-LEN /?THN159
|
|
ADD PTR,P-LEXELEN >P-CONT
|
|
?THN159: PUTB P-LEXV,P-LEXWORDS,P-LEN
|
|
JUMP ?CND77
|
|
?ELS149: CALL WT?,WRD,PS?DIRECTION,P1?DIRECTION >VAL
|
|
ZERO? VAL /?ELS162
|
|
EQUAL? VERB,FALSE-VALUE,ACT?WALK \?ELS162
|
|
EQUAL? LEN,1 /?THN165
|
|
EQUAL? LEN,2 \?ELS168
|
|
EQUAL? VERB,ACT?WALK /?THN165
|
|
?ELS168: ADD PTR,P-LEXELEN
|
|
GET P-LEXV,STACK >NW
|
|
EQUAL? NW,W?THEN,W?PERIOD,W?QUOTE \?ELS170
|
|
LESS? LEN,2 \?THN165
|
|
?ELS170: ZERO? QUOTE-FLAG /?ELS172
|
|
EQUAL? LEN,2 \?ELS172
|
|
EQUAL? NW,W?QUOTE /?THN165
|
|
?ELS172: GRTR? LEN,2 \?ELS162
|
|
EQUAL? NW,W?COMMA,W?AND \?ELS162
|
|
?THN165: SET 'DIR,VAL
|
|
EQUAL? NW,W?COMMA,W?AND \?CND175
|
|
ADD PTR,P-LEXELEN
|
|
CALL CHANGE-LEXV,STACK,W?THEN
|
|
?CND175: GRTR? LEN,2 /?CND127
|
|
SET 'QUOTE-FLAG,FALSE-VALUE
|
|
JUMP ?CND77
|
|
?ELS162: CALL WT?,WRD,PS?VERB,P1?VERB >VAL
|
|
ZERO? VAL /?ELS182
|
|
ZERO? VERB \?ELS182
|
|
SET 'VERB,VAL
|
|
PUT P-ITBL,P-VERB,VAL
|
|
PUT P-ITBL,P-VERBN,P-VTBL
|
|
PUT P-VTBL,0,WRD
|
|
MUL PTR,2
|
|
ADD STACK,2 >CNT
|
|
GETB P-LEXV,CNT
|
|
PUTB P-VTBL,2,STACK
|
|
ADD CNT,1
|
|
GETB P-LEXV,STACK
|
|
PUTB P-VTBL,3,STACK
|
|
JUMP ?CND127
|
|
?ELS182: CALL WT?,WRD,PS?PREPOSITION,0 >VAL
|
|
ZERO? VAL \?THN187
|
|
EQUAL? WRD,W?ALL,W?ONE,W?BOTH /?THN191
|
|
CALL WT?,WRD,PS?ADJECTIVE
|
|
ZERO? STACK \?THN191
|
|
CALL WT?,WRD,PS?OBJECT
|
|
ZERO? STACK /?ELS186
|
|
?THN191: SET 'VAL,0 \?ELS186
|
|
?THN187: GRTR? P-LEN,1 \?ELS195
|
|
ADD PTR,P-LEXELEN
|
|
GET P-LEXV,STACK
|
|
EQUAL? STACK,W?OF \?ELS195
|
|
ZERO? VAL \?ELS195
|
|
EQUAL? WRD,W?ALL,W?ONE,W?A /?ELS195
|
|
EQUAL? WRD,W?BOTH /?ELS195
|
|
SET 'OF-FLAG,TRUE-VALUE
|
|
JUMP ?CND127
|
|
?ELS195: ZERO? VAL /?ELS199
|
|
ZERO? P-LEN /?THN202
|
|
ADD PTR,2
|
|
GET P-LEXV,STACK
|
|
EQUAL? STACK,W?THEN,W?PERIOD \?ELS199
|
|
?THN202: SET 'P-END-ON-PREP,TRUE-VALUE
|
|
LESS? P-NCN,2 \?CND127
|
|
PUT P-ITBL,P-PREP1,VAL
|
|
PUT P-ITBL,P-PREP1N,WRD
|
|
JUMP ?CND127
|
|
?ELS199: EQUAL? P-NCN,2 \?ELS208
|
|
PRINTI "[There were too many nouns in that sentence.]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS208: INC 'P-NCN
|
|
CALL CLAUSE,PTR,VAL,WRD >PTR
|
|
ZERO? PTR /FALSE
|
|
LESS? PTR,0 \?CND127
|
|
SET 'QUOTE-FLAG,FALSE-VALUE
|
|
JUMP ?CND77
|
|
?ELS186: EQUAL? WRD,W?OF \?ELS219
|
|
ZERO? OF-FLAG /?THN223
|
|
ADD PTR,P-LEXELEN
|
|
GET P-LEXV,STACK
|
|
EQUAL? STACK,W?PERIOD,W?THEN \?ELS222
|
|
?THN223: CALL2 CANT-USE,PTR
|
|
RFALSE
|
|
?ELS222: SET 'OF-FLAG,FALSE-VALUE
|
|
JUMP ?CND127
|
|
?ELS219: CALL WT?,WRD,PS?BUZZ-WORD
|
|
ZERO? STACK /?ELS228
|
|
JUMP ?CND127
|
|
?ELS228: EQUAL? VERB,ACT?TELL \?ELS230
|
|
CALL WT?,WRD,PS?VERB
|
|
ZERO? STACK /?ELS230
|
|
PRINTI "[Please consult your manual for the correct way to talk to characters.]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS230: CALL2 CANT-USE,PTR
|
|
RFALSE
|
|
?ELS131: CALL2 UNKNOWN-WORD,PTR
|
|
RFALSE
|
|
?CND127: SET 'LW,WRD
|
|
ADD PTR,P-LEXELEN >PTR
|
|
JUMP ?PRG125
|
|
?CND77: PUT OOPS-TABLE,O-PTR,FALSE-VALUE
|
|
ZERO? DIR /?CND239
|
|
SET 'PRSA,V?WALK
|
|
SET 'PRSO,DIR
|
|
SET 'P-OFLAG,FALSE-VALUE
|
|
SET 'P-WALK-DIR,DIR
|
|
SET 'AGAIN-DIR,DIR
|
|
RETURN TRUE-VALUE
|
|
?CND239: ZERO? P-OFLAG /?CND243
|
|
CALL1 ORPHAN-MERGE
|
|
?CND243: SET 'P-WALK-DIR,FALSE-VALUE
|
|
SET 'AGAIN-DIR,FALSE-VALUE
|
|
CALL1 SYNTAX-CHECK
|
|
ZERO? STACK /FALSE
|
|
CALL1 SNARF-OBJECTS
|
|
ZERO? STACK /FALSE
|
|
CALL1 MANY-CHECK
|
|
ZERO? STACK /FALSE
|
|
CALL1 TAKE-CHECK
|
|
ZERO? STACK /FALSE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT CHANGE-LEXV,PTR,WRD,BPTR=0,X,Y,Z
|
|
ZERO? BPTR /?CND1
|
|
SUB PTR,P-LEXELEN
|
|
MUL 2,STACK
|
|
ADD 2,STACK >X
|
|
GETB P-LEXV,X >Y
|
|
MUL 2,PTR
|
|
ADD 2,STACK >Z
|
|
PUTB P-LEXV,Z,Y
|
|
PUTB AGAIN-LEXV,Z,Y
|
|
ADD 1,X
|
|
GETB P-LEXV,STACK >Y
|
|
MUL 2,PTR
|
|
ADD 3,STACK >Z
|
|
PUTB P-LEXV,Z,Y
|
|
PUTB AGAIN-LEXV,Z,Y
|
|
?CND1: PUT P-LEXV,PTR,WRD
|
|
PUT AGAIN-LEXV,PTR,WRD
|
|
RTRUE
|
|
|
|
|
|
.FUNCT STUFF,DEST,SRC,MAX=29,PTR=P-LEXSTART,CTR=1,BPTR
|
|
GETB SRC,0
|
|
PUTB DEST,0,STACK
|
|
GETB SRC,1
|
|
PUTB DEST,1,STACK
|
|
?PRG1: GET SRC,PTR
|
|
PUT DEST,PTR,STACK
|
|
MUL PTR,2
|
|
ADD STACK,2 >BPTR
|
|
GETB SRC,BPTR
|
|
PUTB DEST,BPTR,STACK
|
|
INC 'BPTR
|
|
GETB SRC,BPTR
|
|
PUTB DEST,BPTR,STACK
|
|
ADD PTR,P-LEXELEN >PTR
|
|
IGRTR? 'CTR,MAX \?PRG1
|
|
RTRUE
|
|
|
|
|
|
.FUNCT INBUF-STUFF,DEST,SRC,CNT=-1
|
|
?PRG1: IGRTR? 'CNT,59 /TRUE
|
|
GETB SRC,CNT
|
|
PUTB DEST,CNT,STACK
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT INBUF-ADD,LEN,BEG,SLOT,DBEG,CTR=0,TMP,?TMP1
|
|
GET OOPS-TABLE,O-END >TMP
|
|
ZERO? TMP /?ELS3
|
|
SET 'DBEG,TMP
|
|
JUMP ?CND1
|
|
?ELS3: GET OOPS-TABLE,O-LENGTH >TMP
|
|
GETB AGAIN-LEXV,TMP >?TMP1
|
|
ADD TMP,1
|
|
GETB AGAIN-LEXV,STACK
|
|
ADD ?TMP1,STACK >DBEG
|
|
?CND1: ADD DBEG,LEN
|
|
PUT OOPS-TABLE,O-END,STACK
|
|
?PRG6: ADD DBEG,CTR >?TMP1
|
|
ADD BEG,CTR
|
|
GETB P-INBUF,STACK
|
|
PUTB OOPS-INBUF,?TMP1,STACK
|
|
INC 'CTR
|
|
EQUAL? CTR,LEN \?PRG6
|
|
PUTB AGAIN-LEXV,SLOT,DBEG
|
|
SUB SLOT,1
|
|
PUTB AGAIN-LEXV,STACK,LEN
|
|
RTRUE
|
|
|
|
|
|
.FUNCT WT?,PTR,BIT,B1=5,OFFS=P-P1OFF,TYP
|
|
GETB PTR,P-PSOFF >TYP
|
|
BTST TYP,BIT \FALSE
|
|
GRTR? B1,4 /TRUE
|
|
BAND TYP,P-P1BITS >TYP
|
|
EQUAL? TYP,B1 /?CND13
|
|
INC 'OFFS
|
|
?CND13: GETB PTR,OFFS
|
|
RSTACK
|
|
|
|
|
|
.FUNCT CLAUSE,PTR,VAL,WRD,OFF,NUM,ANDFLG=0,FIRST??=1,NW,LW=0,?TMP1
|
|
SUB P-NCN,1
|
|
MUL STACK,2 >OFF
|
|
ZERO? VAL /?ELS3
|
|
ADD P-PREP1,OFF >NUM
|
|
PUT P-ITBL,NUM,VAL
|
|
ADD NUM,1
|
|
PUT P-ITBL,STACK,WRD
|
|
ADD PTR,P-LEXELEN >PTR
|
|
JUMP ?CND1
|
|
?ELS3: INC 'P-LEN
|
|
?CND1: ZERO? P-LEN \?CND6
|
|
DEC 'P-NCN
|
|
RETURN -1
|
|
?CND6: ADD P-NC1,OFF >NUM
|
|
MUL PTR,2
|
|
ADD P-LEXV,STACK
|
|
PUT P-ITBL,NUM,STACK
|
|
GET P-LEXV,PTR
|
|
EQUAL? STACK,W?THE,W?A,W?AN \?CND9
|
|
GET P-ITBL,NUM
|
|
ADD STACK,4
|
|
PUT P-ITBL,NUM,STACK
|
|
?CND9:
|
|
?PRG12: DLESS? 'P-LEN,0 \?CND14
|
|
ADD NUM,1 >?TMP1
|
|
MUL PTR,2
|
|
ADD P-LEXV,STACK
|
|
PUT P-ITBL,?TMP1,STACK
|
|
RETURN -1
|
|
?CND14: GET P-LEXV,PTR >WRD
|
|
ZERO? WRD \?THN20
|
|
CALL2 NUMBER?,PTR >WRD
|
|
ZERO? WRD /?ELS19
|
|
?THN20: ZERO? P-LEN \?ELS24
|
|
SET 'NW,0
|
|
JUMP ?CND22
|
|
?ELS24: ADD PTR,P-LEXELEN
|
|
GET P-LEXV,STACK >NW
|
|
?CND22: EQUAL? WRD,W?PERIOD \?ELS29
|
|
EQUAL? LW,W?MR,W?DR,W?ST \?ELS29
|
|
SET 'LW,0
|
|
JUMP ?CND17
|
|
?ELS29: EQUAL? WRD,W?AND,W?COMMA \?ELS33
|
|
SET 'ANDFLG,TRUE-VALUE
|
|
JUMP ?CND17
|
|
?ELS33: EQUAL? WRD,W?ALL,W?ONE,W?BOTH \?ELS35
|
|
EQUAL? NW,W?OF \?CND17
|
|
DEC 'P-LEN
|
|
ADD PTR,P-LEXELEN >PTR
|
|
JUMP ?CND17
|
|
?ELS35: EQUAL? WRD,W?THEN,W?PERIOD /?THN41
|
|
CALL WT?,WRD,PS?PREPOSITION
|
|
ZERO? STACK /?ELS40
|
|
GET P-ITBL,P-VERB
|
|
ZERO? STACK /?ELS40
|
|
ZERO? FIRST?? \?ELS40
|
|
?THN41: INC 'P-LEN
|
|
ADD NUM,1 >?TMP1
|
|
MUL PTR,2
|
|
ADD P-LEXV,STACK
|
|
PUT P-ITBL,?TMP1,STACK
|
|
SUB PTR,P-LEXELEN
|
|
RETURN STACK
|
|
?ELS40: ZERO? ANDFLG /?ELS46
|
|
GET P-ITBL,P-VERB
|
|
ZERO? STACK \?ELS46
|
|
SUB PTR,4 >PTR
|
|
ADD PTR,2
|
|
CALL CHANGE-LEXV,STACK,W?THEN
|
|
ADD P-LEN,2 >P-LEN
|
|
JUMP ?CND17
|
|
?ELS46: CALL WT?,WRD,PS?OBJECT
|
|
ZERO? STACK /?ELS50
|
|
GRTR? P-LEN,0 \?ELS53
|
|
EQUAL? NW,W?OF \?ELS53
|
|
EQUAL? WRD,W?ALL,W?ONE /?ELS53
|
|
JUMP ?CND17
|
|
?ELS53: CALL WT?,WRD,PS?ADJECTIVE
|
|
ZERO? STACK /?ELS57
|
|
ZERO? NW /?ELS57
|
|
CALL WT?,NW,PS?OBJECT
|
|
ZERO? STACK /?ELS57
|
|
JUMP ?CND17
|
|
?ELS57: ZERO? ANDFLG \?ELS61
|
|
EQUAL? NW,W?BUT,W?EXCEPT /?ELS61
|
|
EQUAL? NW,W?AND,W?COMMA /?ELS61
|
|
ADD NUM,1 >?TMP1
|
|
ADD PTR,2
|
|
MUL STACK,2
|
|
ADD P-LEXV,STACK
|
|
PUT P-ITBL,?TMP1,STACK
|
|
RETURN PTR
|
|
?ELS61: SET 'ANDFLG,FALSE-VALUE
|
|
JUMP ?CND17
|
|
?ELS50: CALL WT?,WRD,PS?ADJECTIVE
|
|
ZERO? STACK \?CND17
|
|
CALL WT?,WRD,PS?BUZZ-WORD
|
|
ZERO? STACK /?ELS67
|
|
JUMP ?CND17
|
|
?ELS67: CALL WT?,WRD,PS?PREPOSITION
|
|
ZERO? STACK /?ELS71
|
|
JUMP ?CND17
|
|
?ELS71: CALL2 CANT-USE,PTR
|
|
RFALSE
|
|
?ELS19: CALL2 UNKNOWN-WORD,PTR
|
|
RFALSE
|
|
?CND17: SET 'LW,WRD
|
|
SET 'FIRST??,FALSE-VALUE
|
|
ADD PTR,P-LEXELEN >PTR
|
|
JUMP ?PRG12
|
|
|
|
|
|
.FUNCT NUMBER?,PTR,CNT,BPTR,CHR,SUM=0,TIM=0,?TMP1
|
|
MUL PTR,2
|
|
ADD P-LEXV,STACK
|
|
GETB STACK,2 >CNT
|
|
MUL PTR,2
|
|
ADD P-LEXV,STACK
|
|
GETB STACK,3 >BPTR
|
|
?PRG1: DLESS? 'CNT,0 \?ELS5
|
|
JUMP ?REP2
|
|
?ELS5: GETB P-INBUF,BPTR >CHR
|
|
EQUAL? CHR,58 \?ELS10
|
|
SET 'TIM,SUM
|
|
SET 'SUM,0
|
|
JUMP ?CND8
|
|
?ELS10: GRTR? SUM,10000 /FALSE
|
|
LESS? CHR,58 \FALSE
|
|
GRTR? CHR,47 \FALSE
|
|
MUL SUM,10 >?TMP1
|
|
SUB CHR,48
|
|
ADD ?TMP1,STACK >SUM
|
|
?CND8: INC 'BPTR
|
|
JUMP ?PRG1
|
|
?REP2: CALL CHANGE-LEXV,PTR,W?INTNUM
|
|
GRTR? SUM,9999 /FALSE
|
|
ZERO? TIM /?CND19
|
|
GRTR? TIM,23 /FALSE
|
|
MUL TIM,60
|
|
ADD SUM,STACK >SUM
|
|
?CND19: 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,PS?VERB,P1?VERB >?TMP1
|
|
GET P-OTBL,P-VERB
|
|
EQUAL? ?TMP1,STACK /?THN4
|
|
CALL WT?,WRD,PS?ADJECTIVE
|
|
ZERO? STACK /?ELS3
|
|
?THN4: SET 'ADJ,TRUE-VALUE
|
|
JUMP ?CND1
|
|
?ELS3: CALL WT?,WRD,PS?OBJECT
|
|
ZERO? STACK /?CND1
|
|
ZERO? P-NCN \?CND1
|
|
PUT P-ITBL,P-VERB,0
|
|
PUT P-ITBL,P-VERBN,0
|
|
ADD P-LEXV,2
|
|
PUT P-ITBL,P-NC1,STACK
|
|
ADD P-LEXV,6
|
|
PUT P-ITBL,P-NC1L,STACK
|
|
SET 'P-NCN,1
|
|
?CND1: GET P-ITBL,P-VERB >VERB
|
|
ZERO? VERB /?ELS12
|
|
ZERO? ADJ \?ELS12
|
|
GET P-OTBL,P-VERB
|
|
EQUAL? VERB,STACK \FALSE
|
|
?ELS12: EQUAL? P-NCN,2 /FALSE
|
|
GET P-OTBL,P-NC1
|
|
EQUAL? STACK,1 \?ELS18
|
|
GET P-ITBL,P-PREP1 >TEMP
|
|
GET P-OTBL,P-PREP1
|
|
EQUAL? TEMP,STACK /?THN22
|
|
ZERO? TEMP \FALSE
|
|
?THN22: ZERO? ADJ /?ELS26
|
|
ADD P-LEXV,2
|
|
PUT P-OTBL,P-NC1,STACK
|
|
GET P-ITBL,P-NC1L
|
|
ZERO? STACK \?CND28
|
|
ADD P-LEXV,6
|
|
PUT P-ITBL,P-NC1L,STACK
|
|
?CND28: ZERO? P-NCN \?CND24
|
|
SET 'P-NCN,1
|
|
JUMP ?CND24
|
|
?ELS26: GET P-ITBL,P-NC1
|
|
PUT P-OTBL,P-NC1,STACK
|
|
?CND24: GET P-ITBL,P-NC1L
|
|
PUT P-OTBL,P-NC1L,STACK
|
|
JUMP ?CND10
|
|
?ELS18: GET P-OTBL,P-NC2
|
|
EQUAL? STACK,1 \?ELS39
|
|
GET P-ITBL,P-PREP1 >TEMP
|
|
GET P-OTBL,P-PREP2
|
|
EQUAL? TEMP,STACK /?THN43
|
|
ZERO? TEMP \FALSE
|
|
?THN43: ZERO? ADJ /?CND45
|
|
ADD P-LEXV,2
|
|
PUT P-ITBL,P-NC1,STACK
|
|
GET P-ITBL,P-NC1L
|
|
ZERO? STACK \?CND45
|
|
ADD P-LEXV,6
|
|
PUT P-ITBL,P-NC1L,STACK
|
|
?CND45: GET P-ITBL,P-NC1
|
|
PUT P-OTBL,P-NC2,STACK
|
|
GET P-ITBL,P-NC1L
|
|
PUT P-OTBL,P-NC2L,STACK
|
|
SET 'P-NCN,2
|
|
JUMP ?CND10
|
|
?ELS39: ZERO? P-ACLAUSE /?CND10
|
|
EQUAL? P-NCN,1 /?ELS59
|
|
ZERO? ADJ \?ELS59
|
|
SET 'P-ACLAUSE,FALSE-VALUE
|
|
RFALSE
|
|
?ELS59: GET P-ITBL,P-NC1 >BEG
|
|
ZERO? ADJ /?CND64
|
|
ADD P-LEXV,2 >BEG
|
|
SET 'ADJ,FALSE-VALUE
|
|
?CND64: GET P-ITBL,P-NC1L >END
|
|
?PRG68: GET BEG,0 >WRD
|
|
EQUAL? BEG,END \?ELS72
|
|
ZERO? ADJ /?ELS75
|
|
CALL2 ACLAUSE-WIN,ADJ
|
|
JUMP ?CND57
|
|
?ELS75: SET 'P-ACLAUSE,FALSE-VALUE
|
|
RFALSE
|
|
?ELS72: ZERO? ADJ \?ELS80
|
|
GETB WRD,P-PSOFF
|
|
BTST STACK,PS?ADJECTIVE /?THN83
|
|
EQUAL? WRD,W?ALL,W?ONE \?ELS80
|
|
?THN83: SET 'ADJ,WRD
|
|
JUMP ?CND70
|
|
?ELS80: EQUAL? WRD,W?ONE \?ELS86
|
|
CALL2 ACLAUSE-WIN,ADJ
|
|
JUMP ?CND57
|
|
?ELS86: GETB WRD,P-PSOFF
|
|
BTST STACK,PS?OBJECT \?CND70
|
|
EQUAL? WRD,P-ANAM \?ELS91
|
|
CALL2 ACLAUSE-WIN,ADJ
|
|
JUMP ?CND10
|
|
?ELS91: CALL1 NCLAUSE-WIN
|
|
JUMP ?CND10
|
|
?CND70: ADD BEG,P-WORDLEN >BEG
|
|
ZERO? END \?PRG68
|
|
SET 'END,BEG
|
|
SET 'P-NCN,1
|
|
SUB BEG,4
|
|
PUT P-ITBL,P-NC1,STACK
|
|
PUT P-ITBL,P-NC1L,BEG
|
|
JUMP ?PRG68
|
|
?CND57:
|
|
?CND10: GET P-OVTBL,0
|
|
PUT P-VTBL,0,STACK
|
|
GETB P-OVTBL,2
|
|
PUTB P-VTBL,2,STACK
|
|
GETB P-OVTBL,3
|
|
PUTB P-VTBL,3,STACK
|
|
PUT P-OTBL,P-VERBN,P-VTBL
|
|
PUTB P-VTBL,2,0
|
|
?PRG97: IGRTR? 'CNT,P-ITBLLEN \?ELS101
|
|
SET 'P-MERGED,TRUE-VALUE
|
|
RTRUE
|
|
?ELS101: GET P-OTBL,CNT
|
|
PUT P-ITBL,CNT,STACK
|
|
JUMP ?PRG97
|
|
|
|
|
|
.FUNCT ACLAUSE-WIN,ADJ,?TMP1
|
|
GET P-OTBL,P-VERB
|
|
PUT P-ITBL,P-VERB,STACK
|
|
ADD P-ACLAUSE,1 >?TMP1
|
|
ADD P-ACLAUSE,1
|
|
CALL CLAUSE-COPY,P-OTBL,P-OTBL,P-ACLAUSE,?TMP1,P-ACLAUSE,STACK,ADJ
|
|
GET P-OTBL,P-NC2
|
|
ZERO? STACK /?ELS2
|
|
SET 'P-NCN,2
|
|
?ELS2: SET 'P-ACLAUSE,FALSE-VALUE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT NCLAUSE-WIN
|
|
ADD P-ACLAUSE,1
|
|
CALL CLAUSE-COPY,P-ITBL,P-OTBL,P-NC1,P-NC1L,P-ACLAUSE,STACK
|
|
GET P-OTBL,P-NC2
|
|
ZERO? STACK /?ELS2
|
|
SET 'P-NCN,2
|
|
?ELS2: SET 'P-ACLAUSE,FALSE-VALUE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT WORD-PRINT,CNT,BUF
|
|
?PRG1: DLESS? 'CNT,0 /TRUE
|
|
GETB P-INBUF,BUF
|
|
PRINTC STACK
|
|
INC 'BUF
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT UNKNOWN-WORD,PTR,BUF,?TMP1
|
|
PUT OOPS-TABLE,O-PTR,PTR
|
|
PRINTI "[I don't know the word """
|
|
MUL PTR,2 >BUF
|
|
ADD P-LEXV,BUF
|
|
GETB STACK,2 >?TMP1
|
|
ADD P-LEXV,BUF
|
|
GETB STACK,3
|
|
CALL WORD-PRINT,?TMP1,STACK
|
|
PRINTI """.]"
|
|
CRLF
|
|
SET 'QUOTE-FLAG,FALSE-VALUE
|
|
RETURN QUOTE-FLAG
|
|
|
|
|
|
.FUNCT CANT-USE,PTR,BUF,?TMP1
|
|
PRINTI "[You used the word """
|
|
MUL PTR,2 >BUF
|
|
ADD P-LEXV,BUF
|
|
GETB STACK,2 >?TMP1
|
|
ADD P-LEXV,BUF
|
|
GETB STACK,3
|
|
CALL WORD-PRINT,?TMP1,STACK
|
|
PRINTI """ in a way that I don't understand.]"
|
|
CRLF
|
|
SET 'QUOTE-FLAG,FALSE-VALUE
|
|
SET 'P-OFLAG,FALSE-VALUE
|
|
RETURN P-OFLAG
|
|
|
|
|
|
.FUNCT SYNTAX-CHECK,SYN,LEN,NUM,OBJ,DRIVE1=0,DRIVE2=0,PREP,VERB,TMP,?TMP2,?TMP1
|
|
GET P-ITBL,P-VERB >VERB
|
|
ZERO? VERB \?CND1
|
|
PRINTI "[There was no verb in that sentence!]"
|
|
CRLF
|
|
RFALSE
|
|
?CND1: SUB 255,VERB
|
|
GET VERBS,STACK >SYN
|
|
GETB SYN,0 >LEN
|
|
ADD 1,SYN >SYN
|
|
?PRG6: GETB SYN,P-SBITS
|
|
BAND STACK,P-SONUMS >NUM
|
|
GRTR? P-NCN,NUM \?ELS10
|
|
JUMP ?CND8
|
|
?ELS10: LESS? NUM,1 /?ELS12
|
|
ZERO? P-NCN \?ELS12
|
|
GET P-ITBL,P-PREP1 >PREP
|
|
ZERO? PREP /?THN15
|
|
GETB SYN,P-SPREP1
|
|
EQUAL? PREP,STACK \?ELS12
|
|
?THN15: SET 'DRIVE1,SYN
|
|
JUMP ?CND8
|
|
?ELS12: GETB SYN,P-SPREP1 >?TMP1
|
|
GET P-ITBL,P-PREP1
|
|
EQUAL? ?TMP1,STACK \?CND8
|
|
EQUAL? NUM,2 \?ELS21
|
|
EQUAL? P-NCN,1 \?ELS21
|
|
SET 'DRIVE2,SYN
|
|
JUMP ?CND8
|
|
?ELS21: GETB SYN,P-SPREP2 >?TMP1
|
|
GET P-ITBL,P-PREP2
|
|
EQUAL? ?TMP1,STACK \?CND8
|
|
CALL2 SYNTAX-FOUND,SYN
|
|
RTRUE
|
|
?CND8: DLESS? 'LEN,1 \?ELS28
|
|
ZERO? DRIVE1 \?REP7
|
|
ZERO? DRIVE2 /?ELS31
|
|
JUMP ?REP7
|
|
?ELS31: PRINT RECOGNIZE
|
|
CRLF
|
|
RFALSE
|
|
?ELS28: ADD SYN,P-SYNLEN >SYN
|
|
JUMP ?PRG6
|
|
?REP7: ZERO? DRIVE1 /?ELS44
|
|
GETB DRIVE1,P-SFWIM1 >?TMP2
|
|
GETB DRIVE1,P-SLOC1 >?TMP1
|
|
GETB DRIVE1,P-SPREP1
|
|
CALL GWIM,?TMP2,?TMP1,STACK >OBJ
|
|
ZERO? OBJ /?ELS44
|
|
PUT P-PRSO,P-MATCHLEN,1
|
|
PUT P-PRSO,1,OBJ
|
|
CALL2 SYNTAX-FOUND,DRIVE1
|
|
RSTACK
|
|
?ELS44: ZERO? DRIVE2 /?ELS48
|
|
GETB DRIVE2,P-SFWIM2 >?TMP2
|
|
GETB DRIVE2,P-SLOC2 >?TMP1
|
|
GETB DRIVE2,P-SPREP2
|
|
CALL GWIM,?TMP2,?TMP1,STACK >OBJ
|
|
ZERO? OBJ /?ELS48
|
|
PUT P-PRSI,P-MATCHLEN,1
|
|
PUT P-PRSI,1,OBJ
|
|
CALL2 SYNTAX-FOUND,DRIVE2
|
|
RSTACK
|
|
?ELS48: EQUAL? VERB,ACT?FIND \?ELS52
|
|
PRINTI "[I can't answer that question.]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS52: CALL2 CHANGE-CLOTHES?,VERB
|
|
ZERO? STACK /?ELS56
|
|
CALL1 V-YELL
|
|
RFALSE
|
|
?ELS56: EQUAL? WINNER,PLAYER \?ELS61
|
|
CALL ORPHAN,DRIVE1,DRIVE2
|
|
PRINTI "[Wh"
|
|
JUMP ?CND59
|
|
?ELS61: PRINTI "[Your command was not complete. Next time, type wh"
|
|
?CND59: EQUAL? VERB,ACT?WALK \?ELS70
|
|
PRINTI "ere"
|
|
JUMP ?CND68
|
|
?ELS70: ZERO? DRIVE1 /?ELS78
|
|
GETB DRIVE1,P-SFWIM1
|
|
EQUAL? STACK,ACTORBIT /?THN75
|
|
?ELS78: ZERO? DRIVE2 /?ELS74
|
|
GETB DRIVE2,P-SFWIM2
|
|
EQUAL? STACK,ACTORBIT \?ELS74
|
|
?THN75: PRINTI "om"
|
|
JUMP ?CND68
|
|
?ELS74: PRINTI "at"
|
|
?CND68: EQUAL? WINNER,PLAYER \?ELS89
|
|
PRINTI " do you want to "
|
|
JUMP ?CND87
|
|
?ELS89: PRINTI " you want"
|
|
CALL2 ARTICLE,WINNER
|
|
PRINTI " to "
|
|
?CND87: CALL1 VERB-PRINT
|
|
ZERO? DRIVE2 /?CND98
|
|
CALL CLAUSE-PRINT,P-NC1,P-NC1L
|
|
?CND98: SET 'P-END-ON-PREP,FALSE-VALUE
|
|
ZERO? DRIVE1 /?ELS106
|
|
GETB DRIVE1,P-SPREP1
|
|
JUMP ?CND102
|
|
?ELS106: GETB DRIVE2,P-SPREP2
|
|
?CND102: CALL2 PREP-PRINT,STACK
|
|
EQUAL? WINNER,PLAYER \?ELS112
|
|
SET 'P-OFLAG,TRUE-VALUE
|
|
PRINTI "?]"
|
|
CRLF
|
|
RFALSE
|
|
?ELS112: SET 'P-OFLAG,FALSE-VALUE
|
|
PRINTI ".]"
|
|
CRLF
|
|
RFALSE
|
|
|
|
|
|
.FUNCT CHANGE-CLOTHES?,VERB,TMP
|
|
EQUAL? VERB,ACT?SET \FALSE
|
|
GET P-ITBL,P-NC1 >TMP
|
|
ZERO? TMP /FALSE
|
|
GET TMP,0
|
|
EQUAL? STACK,W?CLOTHES,W?CLOTHING /TRUE
|
|
GET TMP,0
|
|
EQUAL? STACK,W?MY \FALSE
|
|
GET TMP,2
|
|
EQUAL? STACK,W?CLOTHES,W?CLOTHING \FALSE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT VERB-PRINT,TMP,?TMP1
|
|
GET P-ITBL,P-VERBN >TMP
|
|
ZERO? TMP \?ELS5
|
|
PRINTI "tell"
|
|
RTRUE
|
|
?ELS5: GETB P-VTBL,2
|
|
ZERO? STACK \?ELS9
|
|
GET TMP,0
|
|
PRINTB STACK
|
|
RTRUE
|
|
?ELS9: GETB TMP,2 >?TMP1
|
|
GETB TMP,3
|
|
CALL WORD-PRINT,?TMP1,STACK
|
|
PUTB P-VTBL,2,0
|
|
RTRUE
|
|
|
|
|
|
.FUNCT ORPHAN,D1,D2,CNT=-1
|
|
ZERO? P-MERGED \?CND1
|
|
PUT P-OCLAUSE,P-MATCHLEN,0
|
|
?CND1: GET P-VTBL,0
|
|
PUT P-OVTBL,0,STACK
|
|
GETB P-VTBL,2
|
|
PUTB P-OVTBL,2,STACK
|
|
GETB P-VTBL,3
|
|
PUTB P-OVTBL,3,STACK
|
|
?PRG4: IGRTR? 'CNT,P-ITBLLEN \?ELS8
|
|
JUMP ?REP5
|
|
?ELS8: GET P-ITBL,CNT
|
|
PUT P-OTBL,CNT,STACK
|
|
JUMP ?PRG4
|
|
?REP5: EQUAL? P-NCN,2 \?CND11
|
|
CALL CLAUSE-COPY,P-ITBL,P-OTBL,P-NC2,P-NC2L,P-NC2,P-NC2L
|
|
?CND11: LESS? P-NCN,1 /?CND14
|
|
CALL CLAUSE-COPY,P-ITBL,P-OTBL,P-NC1,P-NC1L,P-NC1,P-NC1L
|
|
?CND14: ZERO? D1 /?ELS21
|
|
GETB D1,P-SPREP1
|
|
PUT P-OTBL,P-PREP1,STACK
|
|
PUT P-OTBL,P-NC1,1
|
|
RTRUE
|
|
?ELS21: ZERO? D2 /FALSE
|
|
GETB D2,P-SPREP2
|
|
PUT P-OTBL,P-PREP2,STACK
|
|
PUT P-OTBL,P-NC2,1
|
|
RTRUE
|
|
|
|
|
|
.FUNCT CLAUSE-PRINT,BPTR,EPTR,THE?=1,?TMP1
|
|
GET P-ITBL,BPTR >?TMP1
|
|
GET P-ITBL,EPTR
|
|
CALL BUFFER-PRINT,?TMP1,STACK,THE?
|
|
RSTACK
|
|
|
|
|
|
.FUNCT BUFFER-PRINT,BEG,END,CP,NOSP=0,WRD,FIRST??=1,PN=0,?TMP1
|
|
?PRG1: EQUAL? BEG,END /TRUE
|
|
ZERO? NOSP /?ELS10
|
|
SET 'NOSP,FALSE-VALUE
|
|
JUMP ?CND8
|
|
?ELS10: PRINTI " "
|
|
?CND8: GET BEG,0 >WRD
|
|
EQUAL? WRD,W?PERIOD \?ELS18
|
|
SET 'NOSP,TRUE-VALUE
|
|
JUMP ?CND3
|
|
?ELS18: EQUAL? WRD,W?ME \?ELS20
|
|
PRINTD ME
|
|
SET 'PN,TRUE-VALUE
|
|
JUMP ?CND3
|
|
?ELS20: EQUAL? WRD,W?MY \?ELS22
|
|
PRINTI "your"
|
|
SET 'PN,TRUE-VALUE
|
|
JUMP ?CND3
|
|
?ELS22: CALL2 NAME?,WRD
|
|
ZERO? STACK /?ELS24
|
|
CALL2 CAPITALIZE,BEG
|
|
SET 'PN,TRUE-VALUE
|
|
JUMP ?CND3
|
|
?ELS24: ZERO? FIRST?? /?CND27
|
|
ZERO? PN \?CND27
|
|
ZERO? CP /?CND27
|
|
PRINTI "the "
|
|
?CND27: ZERO? P-OFLAG \?THN37
|
|
ZERO? P-MERGED /?ELS36
|
|
?THN37: PRINTB WRD
|
|
JUMP ?CND34
|
|
?ELS36: EQUAL? WRD,W?IT \?ELS40
|
|
CALL2 ACCESSIBLE?,P-IT-OBJECT
|
|
ZERO? STACK /?ELS40
|
|
PRINTD P-IT-OBJECT
|
|
JUMP ?CND34
|
|
?ELS40: GETB BEG,2 >?TMP1
|
|
GETB BEG,3
|
|
CALL WORD-PRINT,?TMP1,STACK
|
|
?CND34: SET 'FIRST??,FALSE-VALUE
|
|
?CND3: ADD BEG,P-WORDLEN >BEG
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT NAME?,WRD
|
|
EQUAL? WRD,W?OZ,W?WIZARD,W?CLAVE /TRUE
|
|
EQUAL? WRD,W?PERELMAN,W?ABE,W?ABRAHAM /TRUE
|
|
EQUAL? WRD,W?MITCHELL,W?RAV,W?JILL /TRUE
|
|
EQUAL? WRD,W?VERA,W?GOLD,W?ELEANOR /TRUE
|
|
EQUAL? WRD,W?FORTZMAN,W?MR,W?DR /TRUE
|
|
EQUAL? WRD,W?ROCKVIL,W?EMILY,W?WARREN /TRUE
|
|
EQUAL? WRD,W?ASEEJH,W?RANDU,W?ALYSON /TRUE
|
|
EQUAL? WRD,W?PRICE,W?HALLEY,W?FRANCISCO /TRUE
|
|
EQUAL? WRD,W?ERNEST,W?GRIMWOLD,W?ESTHER /TRUE
|
|
EQUAL? WRD,W?OMNI,W?FABB,W?OMNI-FABB /TRUE
|
|
EQUAL? WRD,W?RICHARD,W?RYDER,W?MITCH /TRUE
|
|
EQUAL? WRD,W?FYLA,W?FRITA \FALSE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT CAPITALIZE,PTR,?TMP1
|
|
ZERO? P-OFLAG \?THN6
|
|
ZERO? P-MERGED /?ELS5
|
|
?THN6: GET PTR,0
|
|
PRINTB STACK
|
|
RTRUE
|
|
?ELS5: GETB PTR,3
|
|
GETB P-INBUF,STACK
|
|
SUB STACK,32
|
|
PRINTC STACK
|
|
GETB PTR,2
|
|
SUB STACK,1 >?TMP1
|
|
GETB PTR,3
|
|
ADD STACK,1
|
|
CALL WORD-PRINT,?TMP1,STACK
|
|
RSTACK
|
|
|
|
|
|
.FUNCT PREP-PRINT,PREP,WRD
|
|
ZERO? PREP /FALSE
|
|
PRINTI " "
|
|
CALL2 PREP-FIND,PREP >WRD
|
|
PRINTB WRD
|
|
RTRUE
|
|
|
|
|
|
.FUNCT CLAUSE-COPY,SRC,DEST,SRCBEG,SRCEND,DESTBEG,DESTEND,INSRT=0,BEG,END
|
|
GET SRC,SRCBEG >BEG
|
|
GET SRC,SRCEND >END
|
|
GET P-OCLAUSE,P-MATCHLEN
|
|
MUL STACK,P-LEXELEN
|
|
ADD STACK,2
|
|
ADD P-OCLAUSE,STACK
|
|
PUT DEST,DESTBEG,STACK
|
|
?PRG1: EQUAL? BEG,END \?ELS5
|
|
GET P-OCLAUSE,P-MATCHLEN
|
|
MUL STACK,P-LEXELEN
|
|
ADD STACK,2
|
|
ADD P-OCLAUSE,STACK
|
|
PUT DEST,DESTEND,STACK
|
|
RTRUE
|
|
?ELS5: ZERO? INSRT /?CND8
|
|
GET BEG,0
|
|
EQUAL? P-ANAM,STACK \?CND8
|
|
CALL2 CLAUSE-ADD,INSRT
|
|
?CND8: GET BEG,0
|
|
CALL2 CLAUSE-ADD,STACK
|
|
?CND3: ADD BEG,P-WORDLEN >BEG
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT CLAUSE-ADD,WRD,PTR
|
|
GET P-OCLAUSE,P-MATCHLEN
|
|
ADD STACK,2 >PTR
|
|
SUB PTR,1
|
|
PUT P-OCLAUSE,STACK,WRD
|
|
PUT P-OCLAUSE,PTR,0
|
|
PUT P-OCLAUSE,P-MATCHLEN,PTR
|
|
RTRUE
|
|
|
|
|
|
.FUNCT PREP-FIND,PREP,CNT=0,SIZE
|
|
GET PREPOSITIONS,0
|
|
MUL STACK,2 >SIZE
|
|
?PRG1: IGRTR? 'CNT,SIZE /FALSE
|
|
GET PREPOSITIONS,CNT
|
|
EQUAL? STACK,PREP \?PRG1
|
|
SUB CNT,1
|
|
GET PREPOSITIONS,STACK
|
|
RETURN STACK
|
|
|
|
|
|
.FUNCT SYNTAX-FOUND,SYN
|
|
SET 'P-SYNTAX,SYN
|
|
GETB SYN,P-SACTION >PRSA
|
|
RETURN PRSA
|
|
|
|
|
|
.FUNCT GWIM,GBIT,LBIT,PREP,OBJ
|
|
EQUAL? GBIT,KLUDGEBIT \?CND1
|
|
RETURN ROOMS
|
|
?CND1: SET 'P-GWIMBIT,GBIT
|
|
SET 'P-SLOCBITS,LBIT
|
|
PUT P-MERGE,P-MATCHLEN,0
|
|
CALL GET-OBJECT,P-MERGE,FALSE-VALUE
|
|
ZERO? STACK /?ELS8
|
|
SET 'P-GWIMBIT,0
|
|
GET P-MERGE,P-MATCHLEN
|
|
EQUAL? STACK,1 \FALSE
|
|
GET P-MERGE,1 >OBJ
|
|
PRINTI "["
|
|
ZERO? PREP /?CND16
|
|
ZERO? P-END-ON-PREP \?CND16
|
|
CALL2 PREP-FIND,PREP >PREP
|
|
GET P-ITBL,P-VERB
|
|
EQUAL? STACK,ACT?SIT \?ELS23
|
|
EQUAL? PREP,W?ON \?ELS23
|
|
EQUAL? OBJ,DINETTE-SET \?ELS23
|
|
PRINTB W?AT
|
|
JUMP ?CND21
|
|
?ELS23: GET P-ITBL,P-VERB
|
|
EQUAL? STACK,ACT?SIT \?ELS27
|
|
EQUAL? PREP,W?ON \?ELS27
|
|
EQUAL? OBJ,STADIUM-STANDS \?ELS27
|
|
PRINTB W?IN
|
|
JUMP ?CND21
|
|
?ELS27: PRINTB PREP
|
|
?CND21: EQUAL? PREP,W?OUT \?CND32
|
|
PRINTI " of"
|
|
?CND32: FSET? OBJ,NARTICLEBIT /?ELS39
|
|
PRINTI " the "
|
|
JUMP ?CND16
|
|
?ELS39: PRINTI " "
|
|
?CND16: CALL2 DPRINT,OBJ
|
|
PRINTI "]"
|
|
CRLF
|
|
RETURN OBJ
|
|
?ELS8: SET 'P-GWIMBIT,0
|
|
RFALSE
|
|
|
|
|
|
.FUNCT SNARF-OBJECTS,PTR
|
|
GET P-ITBL,P-NC1 >PTR
|
|
ZERO? PTR /?CND1
|
|
SET 'P-PHR,0
|
|
GETB P-SYNTAX,P-SLOC1 >P-SLOCBITS
|
|
GET P-ITBL,P-NC1L
|
|
CALL SNARFEM,PTR,STACK,P-PRSO
|
|
ZERO? STACK /FALSE
|
|
GET P-BUTS,P-MATCHLEN
|
|
ZERO? STACK /?CND1
|
|
CALL2 BUT-MERGE,P-PRSO >P-PRSO
|
|
?CND1: GET P-ITBL,P-NC2 >PTR
|
|
ZERO? PTR /TRUE
|
|
SET 'P-PHR,1
|
|
GETB P-SYNTAX,P-SLOC2 >P-SLOCBITS
|
|
GET P-ITBL,P-NC2L
|
|
CALL SNARFEM,PTR,STACK,P-PRSI
|
|
ZERO? STACK /FALSE
|
|
GET P-BUTS,P-MATCHLEN
|
|
ZERO? STACK /TRUE
|
|
GET P-PRSI,P-MATCHLEN
|
|
EQUAL? STACK,1 \?ELS18
|
|
CALL2 BUT-MERGE,P-PRSO >P-PRSO
|
|
RTRUE
|
|
?ELS18: CALL2 BUT-MERGE,P-PRSI >P-PRSI
|
|
RTRUE
|
|
|
|
|
|
.FUNCT BUT-MERGE,TBL,LEN,BUTLEN,CNT=1,MATCHES=0,OBJ,NTBL,?TMP1,?TMP2
|
|
GET TBL,P-MATCHLEN >LEN
|
|
PUT P-MERGE,P-MATCHLEN,0
|
|
?PRG1: DLESS? 'LEN,0 \?ELS5
|
|
JUMP ?REP2
|
|
?ELS5: ZERO? P-BUTS /?ELS7
|
|
GET TBL,CNT >OBJ
|
|
ADD P-BUTS,2 >?TMP1
|
|
GET P-BUTS,0
|
|
INTBL? OBJ,?TMP1,STACK \?ELS7
|
|
JUMP ?CND3
|
|
?ELS7: ADD MATCHES,1
|
|
PUT P-MERGE,STACK,OBJ
|
|
INC 'MATCHES
|
|
?CND3: INC 'CNT
|
|
JUMP ?PRG1
|
|
?REP2: PUT P-MERGE,P-MATCHLEN,MATCHES
|
|
SET 'NTBL,P-MERGE
|
|
SET 'P-MERGE,TBL
|
|
RETURN NTBL
|
|
|
|
|
|
.FUNCT SNARFEM,PTR,EPTR,TBL,BUT=0,LEN,TMP,WRD,NW,ONEOBJ,WAS-ALL=0
|
|
SET 'P-AND,FALSE-VALUE
|
|
EQUAL? P-GETFLAGS,P-ALL \?CND1
|
|
SET 'WAS-ALL,TRUE-VALUE
|
|
?CND1: SET 'P-GETFLAGS,0
|
|
PUT P-BUTS,P-MATCHLEN,0
|
|
PUT TBL,P-MATCHLEN,0
|
|
GET PTR,0 >WRD
|
|
?PRG4: EQUAL? PTR,EPTR \?ELS8
|
|
ZERO? BUT /?ORP12
|
|
PUSH BUT
|
|
JUMP ?THN9
|
|
?ORP12: PUSH TBL
|
|
?THN9: CALL2 GET-OBJECT,STACK >TMP
|
|
ZERO? WAS-ALL /?CND13
|
|
SET 'P-GETFLAGS,P-ALL
|
|
?CND13: RETURN TMP
|
|
?ELS8: GET PTR,P-LEXELEN >NW
|
|
EQUAL? WRD,W?ALL,W?BOTH \?ELS21
|
|
SET 'P-GETFLAGS,P-ALL
|
|
EQUAL? NW,W?OF \?CND19
|
|
ADD PTR,P-WORDLEN >PTR
|
|
JUMP ?CND19
|
|
?ELS21: EQUAL? WRD,W?BUT,W?EXCEPT \?ELS26
|
|
ZERO? BUT /?ORP32
|
|
PUSH BUT
|
|
JUMP ?THN29
|
|
?ORP32: PUSH TBL
|
|
?THN29: CALL2 GET-OBJECT,STACK
|
|
ZERO? STACK /FALSE
|
|
SET 'BUT,P-BUTS
|
|
PUT BUT,P-MATCHLEN,0
|
|
JUMP ?CND6
|
|
?ELS26: EQUAL? WRD,W?A,W?ONE \?ELS34
|
|
ZERO? P-ADJ \?ELS37
|
|
SET 'P-GETFLAGS,P-ONE
|
|
EQUAL? NW,W?OF \?CND6
|
|
ADD PTR,P-WORDLEN >PTR
|
|
JUMP ?CND6
|
|
?ELS37: SET 'P-NAM,ONEOBJ
|
|
ZERO? BUT /?ORP48
|
|
PUSH BUT
|
|
JUMP ?THN45
|
|
?ORP48: PUSH TBL
|
|
?THN45: CALL2 GET-OBJECT,STACK
|
|
ZERO? STACK /FALSE
|
|
ZERO? NW /TRUE
|
|
JUMP ?CND6
|
|
?ELS34: EQUAL? WRD,W?AND,W?COMMA \?ELS52
|
|
EQUAL? NW,W?AND,W?COMMA /?ELS52
|
|
SET 'P-AND,TRUE-VALUE
|
|
ZERO? BUT /?ORP60
|
|
PUSH BUT
|
|
JUMP ?THN57
|
|
?ORP60: PUSH TBL
|
|
?THN57: CALL2 GET-OBJECT,STACK
|
|
ZERO? STACK \?CND19
|
|
RFALSE
|
|
?ELS52: CALL WT?,WRD,PS?BUZZ-WORD
|
|
ZERO? STACK /?ELS62
|
|
JUMP ?CND6
|
|
?ELS62: EQUAL? WRD,W?AND,W?COMMA \?ELS64
|
|
JUMP ?CND6
|
|
?ELS64: EQUAL? WRD,W?OF \?ELS66
|
|
ZERO? P-GETFLAGS \?CND19
|
|
SET 'P-GETFLAGS,P-INHIBIT
|
|
JUMP ?CND19
|
|
?ELS66: CALL WT?,WRD,PS?ADJECTIVE
|
|
ZERO? STACK /?ELS71
|
|
CALL2 ADJ-CHECK,WRD
|
|
ZERO? STACK /?ELS71
|
|
EQUAL? NW,W?OF /?ELS71
|
|
SET 'P-ADJ,WRD
|
|
JUMP ?CND6
|
|
?ELS71: CALL WT?,WRD,PS?OBJECT
|
|
ZERO? STACK /?CND6
|
|
SET 'P-NAM,WRD
|
|
SET 'ONEOBJ,WRD
|
|
?CND19:
|
|
?CND6: EQUAL? PTR,EPTR /?PRG4
|
|
ADD PTR,P-WORDLEN >PTR
|
|
SET 'WRD,NW
|
|
JUMP ?PRG4
|
|
|
|
|
|
.FUNCT ADJ-CHECK,WRD
|
|
ZERO? P-ADJ /TRUE
|
|
EQUAL? WRD,W?HVAC,W?JANITORIA,W?RED /TRUE
|
|
EQUAL? WRD,W?MORNING,W?EVENING,W?BROWN \FALSE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT NOUN-MISSING
|
|
EQUAL? P-NAM,W?ALL,W?BOTH \?ELS5
|
|
PRINT REFERRING
|
|
CRLF
|
|
RTRUE
|
|
?ELS5: PRINTR "[There seems to be a noun missing in that sentence.]"
|
|
|
|
|
|
.FUNCT GET-OBJECT,TBL,VRB=1,BITS,LEN,XBITS,TLEN,GCHECK=0,OLEN=0,OBJ
|
|
SET 'XBITS,P-SLOCBITS
|
|
GET TBL,P-MATCHLEN >TLEN
|
|
BTST P-GETFLAGS,P-INHIBIT /TRUE
|
|
ZERO? P-NAM \?CND4
|
|
ZERO? P-ADJ /?CND4
|
|
CALL WT?,P-ADJ,PS?OBJECT
|
|
ZERO? STACK /?CND4
|
|
SET 'P-NAM,P-ADJ
|
|
SET 'P-ADJ,FALSE-VALUE
|
|
?CND4: ZERO? P-NAM \?CND9
|
|
ZERO? P-ADJ \?CND9
|
|
EQUAL? P-GETFLAGS,P-ALL /?CND9
|
|
ZERO? P-GWIMBIT \?CND9
|
|
ZERO? VRB /FALSE
|
|
CALL1 NOUN-MISSING
|
|
RFALSE
|
|
?CND9: EQUAL? P-GETFLAGS,P-ALL \?THN21
|
|
ZERO? P-SLOCBITS \?CND18
|
|
?THN21: SET 'P-SLOCBITS,-1
|
|
?CND18:
|
|
?PRG23: ZERO? GCHECK /?ELS27
|
|
CALL2 GLOBAL-CHECK,TBL
|
|
JUMP ?CND25
|
|
?ELS27: FCLEAR PLAYER,TRANSBIT
|
|
CALL DO-SL,HERE,SOG,SIR,TBL
|
|
FSET PLAYER,TRANSBIT
|
|
CALL DO-SL,PLAYER,SH,SC,TBL
|
|
?CND25: GET TBL,P-MATCHLEN
|
|
SUB STACK,TLEN >LEN
|
|
BTST P-GETFLAGS,P-ALL \?ELS33
|
|
JUMP ?CND31
|
|
?ELS33: BTST P-GETFLAGS,P-ONE \?ELS37
|
|
ZERO? LEN /?ELS37
|
|
EQUAL? LEN,1 /?CND40
|
|
RANDOM LEN
|
|
GET TBL,STACK
|
|
PUT TBL,1,STACK
|
|
PRINTI "[How about the "
|
|
GET TBL,1
|
|
PRINTD STACK
|
|
PRINTI "?]"
|
|
CRLF
|
|
?CND40: PUT TBL,P-MATCHLEN,1
|
|
JUMP ?CND31
|
|
?ELS37: GRTR? LEN,1 /?THN49
|
|
ZERO? LEN \?ELS48
|
|
EQUAL? P-SLOCBITS,-1 /?ELS48
|
|
?THN49: EQUAL? P-SLOCBITS,-1 \?ELS55
|
|
SET 'P-SLOCBITS,XBITS
|
|
SET 'OLEN,LEN
|
|
GET TBL,P-MATCHLEN
|
|
SUB STACK,LEN
|
|
PUT TBL,P-MATCHLEN,STACK
|
|
JUMP ?PRG23
|
|
?ELS55: PUT P-NAMW,P-PHR,P-NAM
|
|
PUT P-ADJW,P-PHR,P-ADJ
|
|
ZERO? LEN \?CND58
|
|
SET 'LEN,OLEN
|
|
?CND58: ZERO? P-NAM /?ELS63
|
|
ADD TLEN,1
|
|
GET TBL,STACK >OBJ
|
|
ZERO? OBJ /?ELS63
|
|
GETP OBJ,P?GENERIC
|
|
CALL STACK >OBJ
|
|
ZERO? OBJ /?ELS63
|
|
EQUAL? OBJ,NOT-HERE-OBJECT /FALSE
|
|
PUT TBL,1,OBJ
|
|
PUT TBL,P-MATCHLEN,1
|
|
SET 'P-NAM,FALSE-VALUE
|
|
SET 'P-ADJ,FALSE-VALUE
|
|
RTRUE
|
|
?ELS63: ZERO? VRB /?ELS70
|
|
EQUAL? WINNER,PLAYER /?ELS70
|
|
CALL WHICH-PRINT,TLEN,LEN,TBL
|
|
RFALSE
|
|
?ELS70: ZERO? VRB /?ELS74
|
|
ZERO? P-NAM /?ELS74
|
|
CALL WHICH-PRINT,TLEN,LEN,TBL
|
|
EQUAL? TBL,P-PRSO \?ELS81
|
|
PUSH P-NC1
|
|
JUMP ?CND77
|
|
?ELS81: PUSH P-NC2
|
|
?CND77: 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 ?CND61
|
|
?ELS74: ZERO? VRB /?CND61
|
|
CALL1 NOUN-MISSING
|
|
?CND61: SET 'P-NAM,FALSE-VALUE
|
|
SET 'P-ADJ,FALSE-VALUE
|
|
RFALSE
|
|
?ELS48: ZERO? LEN \?ELS88
|
|
ZERO? GCHECK /?ELS88
|
|
PUT P-NAMW,P-PHR,P-NAM
|
|
PUT P-ADJW,P-PHR,P-ADJ
|
|
ZERO? VRB /?CND91
|
|
SET 'P-SLOCBITS,XBITS
|
|
CALL OBJ-FOUND,NOT-HERE-OBJECT,TBL
|
|
SET 'P-XNAM,P-NAM
|
|
SET 'P-XADJ,P-ADJ
|
|
SET 'P-NAM,FALSE-VALUE
|
|
SET 'P-ADJ,FALSE-VALUE
|
|
RTRUE
|
|
?CND91: SET 'P-NAM,FALSE-VALUE
|
|
SET 'P-ADJ,FALSE-VALUE
|
|
RFALSE
|
|
?ELS88: ZERO? LEN \?CND31
|
|
SET 'GCHECK,TRUE-VALUE
|
|
JUMP ?PRG23
|
|
?CND31: SET 'P-SLOCBITS,XBITS
|
|
PUT P-NAMW,P-PHR,P-NAM
|
|
PUT P-ADJW,P-PHR,P-ADJ
|
|
SET 'P-NAM,FALSE-VALUE
|
|
SET 'P-ADJ,FALSE-VALUE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT MOBY-FIND,TBL,OBJ=1,LEN,FOO,NAM,ADJ
|
|
SET 'NAM,P-NAM
|
|
SET 'ADJ,P-ADJ
|
|
SET 'P-NAM,P-XNAM
|
|
SET 'P-ADJ,P-XADJ
|
|
PUT TBL,P-MATCHLEN,0
|
|
?PRG3: IN? OBJ,ROOMS /?CND5
|
|
CALL2 THIS-IT?,OBJ >FOO
|
|
ZERO? FOO /?CND5
|
|
CALL OBJ-FOUND,OBJ,TBL >FOO
|
|
?CND5: IGRTR? 'OBJ,MUSEUM-ENTRANCE \?PRG3
|
|
GET TBL,P-MATCHLEN >LEN
|
|
EQUAL? LEN,1 \?CND13
|
|
GET TBL,1 >P-MOBY-FOUND
|
|
?CND13: SET 'P-NAM,NAM
|
|
SET 'P-ADJ,ADJ
|
|
RETURN LEN
|
|
|
|
|
|
.FUNCT WHICH-PRINT,TLEN,LEN,TBL,OBJ,RLEN
|
|
ZERO? LEN \?CND1
|
|
PRINT REFERRING
|
|
CRLF
|
|
RTRUE
|
|
?CND1: SET 'RLEN,LEN
|
|
EQUAL? WINNER,PLAYER /?ELS8
|
|
PRINTI """I don't understand "
|
|
EQUAL? P-NAM,W?MODE \?ELS13
|
|
PRINTI "which mode you mean"
|
|
JUMP ?CND6
|
|
?ELS13: PRINTI "if you mean "
|
|
JUMP ?CND6
|
|
?ELS8: PRINTI "[Which"
|
|
ZERO? P-OFLAG \?THN27
|
|
ZERO? P-MERGED \?THN27
|
|
ZERO? P-AND /?ELS26
|
|
?THN27: PRINTI " "
|
|
PRINTB P-NAM
|
|
JUMP ?CND24
|
|
?ELS26: EQUAL? TBL,P-PRSO \?ELS32
|
|
CALL CLAUSE-PRINT,P-NC1,P-NC1L,FALSE-VALUE
|
|
JUMP ?CND24
|
|
?ELS32: CALL CLAUSE-PRINT,P-NC2,P-NC2L,FALSE-VALUE
|
|
?CND24: PRINTI " do you mean"
|
|
EQUAL? P-NAM,W?MODE /?CND6
|
|
PRINTI ", "
|
|
?CND6: EQUAL? P-NAM,W?MODE /?CND42
|
|
?PRG45: INC 'TLEN
|
|
GET TBL,TLEN >OBJ
|
|
FSET? OBJ,NARTICLEBIT /?CND47
|
|
PRINTI "the "
|
|
?CND47: CALL2 DPRINT,OBJ
|
|
EQUAL? LEN,2 \?ELS56
|
|
EQUAL? RLEN,2 /?CND57
|
|
PRINTI ","
|
|
?CND57: PRINTI " or "
|
|
JUMP ?CND54
|
|
?ELS56: GRTR? LEN,2 \?CND54
|
|
PRINTI ", "
|
|
?CND54: DLESS? 'LEN,1 \?PRG45
|
|
?CND42: EQUAL? WINNER,PLAYER /?ELS75
|
|
PRINTR "."""
|
|
?ELS75: PRINTR "?]"
|
|
|
|
|
|
.FUNCT GLOBAL-CHECK,TBL,LEN,RMG,RMGL,CNT=0,OBJ,OBITS,FOO
|
|
GET TBL,P-MATCHLEN >LEN
|
|
SET 'OBITS,P-SLOCBITS
|
|
GETPT HERE,P?GLOBAL >RMG
|
|
ZERO? RMG /?CND1
|
|
PTSIZE RMG
|
|
DIV STACK,2
|
|
SUB STACK,1 >RMGL
|
|
?PRG4: GET RMG,CNT >OBJ
|
|
CALL2 THIS-IT?,OBJ
|
|
ZERO? STACK /?CND6
|
|
CALL OBJ-FOUND,OBJ,TBL
|
|
?CND6: IGRTR? 'CNT,RMGL \?PRG4
|
|
?CND1: GET TBL,P-MATCHLEN
|
|
EQUAL? STACK,LEN \FALSE
|
|
SET 'P-SLOCBITS,-1
|
|
CALL DO-SL,GLOBAL-OBJECTS,1,1,TBL
|
|
SET 'P-SLOCBITS,OBITS
|
|
RETURN P-SLOCBITS
|
|
|
|
|
|
.FUNCT DO-SL,OBJ,BIT1,BIT2,TBL,MOBY-FLAG=0,BTS
|
|
ADD BIT1,BIT2
|
|
BTST P-SLOCBITS,STACK \?ELS5
|
|
CALL SEARCH-LIST,OBJ,TBL,P-SRCALL,MOBY-FLAG
|
|
RSTACK
|
|
?ELS5: BTST P-SLOCBITS,BIT1 \?ELS12
|
|
CALL SEARCH-LIST,OBJ,TBL,P-SRCTOP,MOBY-FLAG
|
|
RSTACK
|
|
?ELS12: BTST P-SLOCBITS,BIT2 \TRUE
|
|
CALL SEARCH-LIST,OBJ,TBL,P-SRCBOT,MOBY-FLAG
|
|
RSTACK
|
|
|
|
|
|
.FUNCT SEARCH-LIST,OBJ,TBL,LVL,MOBY-FLAG=0,FLS,NOBJ
|
|
FIRST? OBJ >OBJ \FALSE
|
|
?PRG6: EQUAL? LVL,P-SRCBOT /?CND8
|
|
GETPT OBJ,P?SYNONYM
|
|
ZERO? STACK /?CND8
|
|
CALL2 THIS-IT?,OBJ
|
|
ZERO? STACK /?CND8
|
|
CALL OBJ-FOUND,OBJ,TBL
|
|
?CND8: EQUAL? LVL,P-SRCTOP \?THN18
|
|
FSET? OBJ,SEARCHBIT /?THN18
|
|
FSET? OBJ,SURFACEBIT \?CND13
|
|
?THN18: FIRST? OBJ >NOBJ \?CND13
|
|
FSET? OBJ,OPENBIT /?THN23
|
|
FSET? OBJ,TRANSBIT /?THN23
|
|
ZERO? MOBY-FLAG /?CND13
|
|
?THN23: FSET? OBJ,SURFACEBIT \?ELS29
|
|
PUSH P-SRCALL
|
|
JUMP ?CND25
|
|
?ELS29: FSET? OBJ,SEARCHBIT \?ELS31
|
|
PUSH P-SRCALL
|
|
JUMP ?CND25
|
|
?ELS31: PUSH P-SRCTOP
|
|
?CND25: CALL SEARCH-LIST,OBJ,TBL,STACK,MOBY-FLAG >FLS
|
|
?CND13: NEXT? OBJ >OBJ /?PRG6
|
|
RTRUE
|
|
|
|
|
|
.FUNCT OBJ-FOUND,OBJ,TBL,PTR
|
|
GET TBL,P-MATCHLEN
|
|
ADD 1,STACK >PTR
|
|
PUT TBL,PTR,OBJ
|
|
PUT TBL,P-MATCHLEN,PTR
|
|
RTRUE
|
|
|
|
|
|
.FUNCT TAKE-CHECK
|
|
GETB P-SYNTAX,P-SLOC1
|
|
CALL ITAKE-CHECK,P-PRSO,STACK
|
|
ZERO? STACK /FALSE
|
|
GETB P-SYNTAX,P-SLOC2
|
|
CALL ITAKE-CHECK,P-PRSI,STACK
|
|
RSTACK
|
|
|
|
|
|
.FUNCT ITAKE-CHECK,TBL,IBITS,PTR,OBJ,TAKEN
|
|
GET TBL,P-MATCHLEN >PTR
|
|
ZERO? PTR /TRUE
|
|
BTST IBITS,SHAVE /?THN8
|
|
BTST IBITS,STAKE \TRUE
|
|
?THN8:
|
|
?PRG10: DLESS? 'PTR,0 /TRUE
|
|
ADD PTR,1
|
|
GET TBL,STACK >OBJ
|
|
EQUAL? OBJ,IT \?CND17
|
|
CALL2 ACCESSIBLE?,P-IT-OBJECT
|
|
ZERO? STACK \?ELS22
|
|
PRINT REFERRING
|
|
CRLF
|
|
RFALSE
|
|
?ELS22: SET 'OBJ,P-IT-OBJECT
|
|
?CND17: CALL2 HELD?,OBJ
|
|
ZERO? STACK \?PRG10
|
|
EQUAL? OBJ,HANDS,HEAD,CLOTHES /?PRG10
|
|
EQUAL? PRSA,V?SGIVE \?ELS33
|
|
EQUAL? WINNER,SPEAR-CARRIER /?PRG10
|
|
?ELS33: EQUAL? OBJ,GUN \?ELS35
|
|
EQUAL? WINNER,SABOTEURS,NATIONAL-GUARDSMAN /?PRG10
|
|
?ELS35: EQUAL? OBJ,SHOWER,BATHROOM-OBJECT,RECORD-BUFFER \?ELS29
|
|
EQUAL? PRSA,V?SGIVE,V?GIVE \?ELS29
|
|
JUMP ?PRG10
|
|
?ELS29: SET 'PRSO,OBJ
|
|
FSET? OBJ,TRYTAKEBIT \?ELS42
|
|
SET 'TAKEN,TRUE-VALUE
|
|
JUMP ?CND40
|
|
?ELS42: EQUAL? WINNER,PLAYER /?ELS44
|
|
SET 'TAKEN,FALSE-VALUE
|
|
JUMP ?CND40
|
|
?ELS44: BTST IBITS,STAKE \?ELS46
|
|
CALL2 ITAKE,FALSE-VALUE
|
|
EQUAL? STACK,TRUE-VALUE \?ELS46
|
|
SET 'TAKEN,FALSE-VALUE
|
|
JUMP ?CND40
|
|
?ELS46: SET 'TAKEN,TRUE-VALUE
|
|
?CND40: ZERO? TAKEN /?ELS53
|
|
BTST IBITS,SHAVE \?ELS53
|
|
GET TBL,P-MATCHLEN
|
|
LESS? 1,STACK \?ELS58
|
|
PRINT NOT-HOLDING
|
|
PRINTI " all those things!"
|
|
CRLF
|
|
RFALSE
|
|
?ELS58: EQUAL? OBJ,NOT-HERE-OBJECT \?CND56
|
|
PRINTI "[You can't see that here!]"
|
|
CRLF
|
|
RFALSE
|
|
?CND56: EQUAL? WINNER,PLAYER \?ELS67
|
|
PRINT NOT-HOLDING
|
|
JUMP ?CND65
|
|
?ELS67: PRINTI "It doesn't look as if"
|
|
CALL ARTICLE,WINNER,TRUE-VALUE
|
|
CALL2 PLURAL,WINNER
|
|
PRINTI " holding"
|
|
?CND65: CALL ARTICLE,OBJ,TRUE-VALUE
|
|
SET 'P-IT-OBJECT,OBJ
|
|
PRINTI "."
|
|
CRLF
|
|
RFALSE
|
|
?ELS53: ZERO? TAKEN \?PRG10
|
|
EQUAL? WINNER,PLAYER \?PRG10
|
|
PRINTI "[taking"
|
|
CALL ARTICLE,OBJ,TRUE-VALUE
|
|
PRINTI " first]"
|
|
CRLF
|
|
JUMP ?PRG10
|
|
|
|
|
|
.FUNCT MANY-CHECK,LOSS=0,TMP,?TMP1
|
|
GET P-PRSO,P-MATCHLEN
|
|
GRTR? STACK,1 \?ELS3
|
|
GETB P-SYNTAX,P-SLOC1
|
|
BTST STACK,SMANY /?ELS3
|
|
SET 'LOSS,1
|
|
JUMP ?CND1
|
|
?ELS3: GET P-PRSI,P-MATCHLEN
|
|
GRTR? STACK,1 \?CND1
|
|
GETB P-SYNTAX,P-SLOC2
|
|
BTST STACK,SMANY /?CND1
|
|
SET 'LOSS,2
|
|
?CND1: ZERO? LOSS /TRUE
|
|
PRINTI "[You can't use multiple "
|
|
EQUAL? LOSS,2 \?CND18
|
|
PRINTI "in"
|
|
?CND18: PRINTI "direct objects with """
|
|
GET P-ITBL,P-VERBN >TMP
|
|
ZERO? TMP \?ELS27
|
|
PRINTI "tell"
|
|
JUMP ?CND25
|
|
?ELS27: ZERO? P-OFLAG \?THN32
|
|
ZERO? P-MERGED /?ELS31
|
|
?THN32: GET TMP,0
|
|
PRINTB STACK
|
|
JUMP ?CND25
|
|
?ELS31: GETB TMP,2 >?TMP1
|
|
GETB TMP,3
|
|
CALL WORD-PRINT,?TMP1,STACK
|
|
?CND25: PRINTI """.]"
|
|
CRLF
|
|
RFALSE
|
|
|
|
|
|
.FUNCT THIS-IT?,OBJ,SYNS,CNT
|
|
GETPT OBJ,P?SYNONYM >SYNS
|
|
ZERO? SYNS /FALSE
|
|
ZERO? P-NAM /?CND4
|
|
PTSIZE SYNS
|
|
DIV STACK,2
|
|
INTBL? P-NAM,SYNS,STACK \FALSE
|
|
?CND4: ZERO? P-ADJ /?CND9
|
|
GETPT OBJ,P?ADJECTIVE >SYNS
|
|
ZERO? SYNS /FALSE
|
|
PTSIZE SYNS
|
|
DIV STACK,2
|
|
INTBL? P-ADJ,SYNS,STACK \FALSE
|
|
?CND9: ZERO? P-GWIMBIT /TRUE
|
|
FSET? OBJ,P-GWIMBIT /TRUE
|
|
RFALSE
|
|
|
|
.ENDI
|