1007 lines
20 KiB
Plaintext
1007 lines
20 KiB
Plaintext
|
|
.SEGMENT "0"
|
|
|
|
|
|
.FUNCT TOO-MANY-NEW,WHAT
|
|
PRINTI "[Warning: there are too many new "
|
|
PRINT WHAT
|
|
PRINTR "s.]"
|
|
|
|
|
|
.FUNCT NAKED-OOPS
|
|
PRINTR "[Please type a word(s) after OOPS.]"
|
|
|
|
|
|
.FUNCT CANT-OOPS
|
|
PRINTR "[There was no word to replace in that sentence.]"
|
|
|
|
|
|
.FUNCT CANT-AGAIN
|
|
PRINTR "[What do you want to do again?]"
|
|
|
|
|
|
.FUNCT CANT-USE-MULTIPLE,LOSS,WD
|
|
SET 'CLOCK-WAIT,TRUE-VALUE
|
|
PRINTI "[You can't use more than one object at a time with """
|
|
ICALL2 PRINT-VOCAB-WORD,WD
|
|
PRINTR """!]"
|
|
|
|
|
|
.FUNCT MAKE-ROOM-FOR-TOKENS,CNT,LEXV,WHERE,LEN,?TMP2,?TMP1
|
|
GETB LEXV,0
|
|
MUL 2,STACK >LEN
|
|
MUL P-LEXELEN,CNT
|
|
ADD WHERE,STACK
|
|
LESS? LEN,STACK \?CND1
|
|
SUB LEN,WHERE
|
|
DIV STACK,P-LEXELEN >CNT
|
|
ICALL2 TOO-MANY-NEW,STR?23
|
|
?CND1: GETB LEXV,P-LEXWORDS >LEN
|
|
ADD CNT,LEN
|
|
PUTB LEXV,P-LEXWORDS,STACK
|
|
MUL 2,WHERE
|
|
ADD LEXV,STACK >LEXV
|
|
MUL CNT,4
|
|
ADD LEXV,STACK >?TMP1
|
|
MUL 2,LEN >?TMP2
|
|
SUB WHERE,P-LEXSTART
|
|
SUB ?TMP2,STACK
|
|
MUL 2,STACK
|
|
COPYT LEXV,?TMP1,STACK
|
|
RTRUE
|
|
|
|
|
|
.FUNCT REPLACE-ONE-TOKEN,N,FROM-LEXV,PTR,TO-LEXV,WHERE,CNT,X,?TMP1,?TMP2
|
|
SUB N,1 >CNT
|
|
ZERO? CNT /?CND1
|
|
ICALL MAKE-ROOM-FOR-TOKENS,CNT,TO-LEXV,WHERE
|
|
?CND1: SET 'CNT,N
|
|
?PRG3: DLESS? 'CNT,0 /TRUE
|
|
ADD PTR,P-LEXELEN >PTR
|
|
GET FROM-LEXV,PTR
|
|
PUT TO-LEXV,WHERE,STACK
|
|
MUL PTR,P-LEXELEN
|
|
ADD STACK,2 >X
|
|
GETB FROM-LEXV,X >?TMP2
|
|
ADD X,1
|
|
GETB FROM-LEXV,STACK >?TMP1
|
|
MUL WHERE,P-LEXELEN
|
|
ADD STACK,3
|
|
CALL INBUF-ADD,?TMP2,?TMP1,STACK
|
|
ZERO? STACK \?CND7
|
|
ICALL2 TOO-MANY-NEW,STR?24
|
|
RTRUE
|
|
?CND7: ADD WHERE,P-LEXELEN >WHERE
|
|
JUMP ?PRG3
|
|
|
|
|
|
.FUNCT PRINT-LEXV,QUIET,X,LEN,WD,IN-QUOTE,OWD
|
|
ASSIGNED? 'X /?CND1
|
|
MUL QUIET,4
|
|
ADD TLEXV,STACK >X
|
|
?CND1: ASSIGNED? 'LEN /?CND3
|
|
SUB P-LEN,QUIET >LEN
|
|
?CND3: ZERO? QUIET /?CCL6
|
|
GRTR? 0,P-OFLAG \?CND5
|
|
?CCL6: PRINTI "[In other words:"
|
|
?CND5: SET 'IN-QUOTE,FALSE-VALUE
|
|
EQUAL? QUIET,-1 \?CCL11
|
|
SET 'OWD,W?APOSTROPHE
|
|
JUMP ?PRG12
|
|
?CCL11: SET 'OWD,0
|
|
?PRG12: GET X,0 >WD
|
|
EQUAL? WD,W?PERIOD,W?COMMA,W?APOSTROPHE /?CND14
|
|
EQUAL? WD,W?NO.WORD /?CND14
|
|
EQUAL? OWD,W?APOSTROPHE /?CND14
|
|
EQUAL? OWD,W?QUOTE \?CCL22
|
|
ZERO? IN-QUOTE \?CCL22
|
|
SET 'IN-QUOTE,TRUE-VALUE
|
|
JUMP ?CND14
|
|
?CCL22: EQUAL? WD,W?QUOTE \?CCL26
|
|
ZERO? IN-QUOTE /?CCL26
|
|
SET 'IN-QUOTE,FALSE-VALUE
|
|
JUMP ?CND14
|
|
?CCL26: PRINTC 32
|
|
?CND14: EQUAL? WD,W?NO.WORD /?CND29
|
|
EQUAL? WD,0,W?INT.NUM,W?INT.TIM /?CCL33
|
|
ICALL2 PRINT-VOCAB-WORD,WD
|
|
JUMP ?CND29
|
|
?CCL33: ADD X,P-WORDLEN
|
|
ICALL BUFFER-PRINT,X,STACK,FALSE-VALUE,TRUE-VALUE
|
|
?CND29: DLESS? 'LEN,1 /?REP13
|
|
EQUAL? WD,W?NO.WORD /?CND36
|
|
SET 'OWD,WD
|
|
?CND36: ADD X,4 >X
|
|
JUMP ?PRG12
|
|
?REP13: ZERO? QUIET /?CCL40
|
|
GRTR? 0,P-OFLAG \FALSE
|
|
?CCL40: PRINTR "]"
|
|
|
|
|
|
.FUNCT COPY-INPUT,QUIET,LEN,?TMP1
|
|
COPYT G-LEXV,P-LEXV,LEXV-LENGTH-BYTES
|
|
GETB P-LEXV,P-LEXWORDS >P-LEN
|
|
GET OOPS-TABLE,O-START >TLEXV
|
|
COPYT G-INBUF,P-INBUF,61
|
|
GETB P-LEXV,P-LEXWORDS
|
|
MUL 4,STACK >LEN
|
|
DEC 'LEN
|
|
GETB TLEXV,LEN >?TMP1
|
|
DEC 'LEN
|
|
GETB TLEXV,LEN
|
|
ADD ?TMP1,STACK
|
|
PUT OOPS-TABLE,O-END,STACK
|
|
ZERO? QUIET \?CND1
|
|
ICALL2 PRINT-LEXV,QUIET
|
|
?CND1: SET 'P-OFLAG,FALSE-VALUE
|
|
RETURN P-OFLAG
|
|
|
|
.ENDSEG
|
|
|
|
.SEGMENT "HINTS"
|
|
|
|
|
|
.FUNCT V-$NUDGE
|
|
SET 'CLOCK-WAIT,TRUE-VALUE
|
|
PUT TLEXV,0,W?SHOULD
|
|
PRINTC 91
|
|
CALL1 TELL-SAMPLE-COMMANDS
|
|
RSTACK
|
|
|
|
|
|
.FUNCT COUNT-ERRORS,NUM,THRESH
|
|
ASSIGNED? 'NUM /?CND1
|
|
SET 'NUM,1
|
|
?CND1: FSET? GREAT-HALL,TOUCHBIT \?CCL5
|
|
SET 'THRESH,10
|
|
JUMP ?CND3
|
|
?CCL5: SET 'THRESH,2
|
|
?CND3: ADD NUM,P-ERRS >P-ERRS
|
|
GRTR? P-ERRS,THRESH \FALSE
|
|
SET 'P-ERRS,0
|
|
PRINTI "[I'm having trouble understanding you. Maybe it's because you're not used to the rules for commands. "
|
|
FSET? GREAT-HALL,TOUCHBIT /?CCL11
|
|
ZERO? PROLOGUE-NOVICE-COUNTER /?CCL11
|
|
PRINTI "Here's the command you should type now:
|
|
"
|
|
GET NOVICE-MOVES,PROLOGUE-NOVICE-COUNTER
|
|
PRINT STACK
|
|
PRINTR "
|
|
Please try that.]"
|
|
?CCL11: CALL1 TELL-SAMPLE-COMMANDS
|
|
RSTACK
|
|
|
|
|
|
.FUNCT FIND-UEXIT-STR,P
|
|
?PRG1: NEXTP HERE,P >P
|
|
LESS? P,LOW-DIRECTION /FALSE
|
|
GETPT HERE,P
|
|
PTSIZE STACK
|
|
EQUAL? STACK,UEXIT \?PRG1
|
|
CALL2 DIR-TO-STRING,P
|
|
RSTACK
|
|
|
|
|
|
.FUNCT TELL-SAMPLE-COMMANDS,VERB,SYN,OBJ,NUM,CT,N
|
|
PRINTI " Commands tell the computer what you want to do in the story. Here are some commands that you can type right now, although they may or may not be useful:
|
|
"
|
|
GET SAMPLE-COMMANDS-TABLE-0,0 >CT
|
|
ZERO? PRSO /?CCL3
|
|
SET 'N,CT
|
|
JUMP ?PRG4
|
|
?CCL3: SET 'N,TELL-SAMPLE-COMMANDS-NUMBER
|
|
?PRG4: ZERO? PRSO /?CCL8
|
|
PUSH N
|
|
JUMP ?CND6
|
|
?CCL8: RANDOM CT
|
|
?CND6: GET SAMPLE-COMMANDS-TABLE-0,STACK >VERB
|
|
DLESS? 'N,0 /?REP5
|
|
EQUAL? VERB,W?GO \?CCL12
|
|
CALL1 FIND-UEXIT-STR >OBJ
|
|
ZERO? OBJ /?PRG4
|
|
?CCL12: INC 'NUM
|
|
PRINTC 9
|
|
ICALL2 PRINT-VOCAB-WORD,VERB
|
|
ZERO? OBJ /?CND15
|
|
PRINTC 32
|
|
PRINT OBJ
|
|
?CND15: CRLF
|
|
ZERO? PRSO \?PRG4
|
|
?REP5: GET SAMPLE-COMMANDS-TABLE-1,0 >CT
|
|
ZERO? PRSO /?CCL21
|
|
SET 'N,CT
|
|
JUMP ?PRG22
|
|
?CCL21: SET 'N,TELL-SAMPLE-COMMANDS-NUMBER
|
|
?PRG22: ZERO? PRSO /?CCL26
|
|
PUSH N
|
|
JUMP ?CND24
|
|
?CCL26: RANDOM CT
|
|
?CND24: GET SAMPLE-COMMANDS-TABLE-1,STACK >VERB
|
|
DLESS? 'N,0 /?REP23
|
|
GET VERB,3
|
|
GET STACK,2 >SYN
|
|
ZERO? SYN /?PRG22
|
|
CALL GET-SYNTAX,SYN,1,0,TRUE-VALUE
|
|
ZERO? STACK /?PRG22
|
|
CALL DETERMINE-OBJ,FALSE-VALUE,1,TRUE-VALUE >OBJ
|
|
ZERO? OBJ /?PRG22
|
|
GET OBJ,3 >OBJ
|
|
ZERO? OBJ /?PRG22
|
|
INC 'NUM
|
|
PRINTC 9
|
|
ICALL2 PRINT-VOCAB-WORD,VERB
|
|
PRINTC 32
|
|
ICALL2 DPRINT,OBJ
|
|
CRLF
|
|
ZERO? PRSO \?PRG22
|
|
?REP23: GET SAMPLE-COMMANDS-TABLE-2,0
|
|
DIV STACK,2 >CT
|
|
ZERO? PRSO /?CCL39
|
|
SET 'N,CT
|
|
JUMP ?PRG40
|
|
?CCL39: SET 'N,TELL-SAMPLE-COMMANDS-NUMBER
|
|
?PRG40: ZERO? N /?REP41
|
|
ZERO? PRSO /?CCL46
|
|
PUSH N
|
|
JUMP ?CND44
|
|
?CCL46: RANDOM CT
|
|
?CND44: MUL STACK,2
|
|
SUB STACK,1 >VERB
|
|
GET SAMPLE-COMMANDS-TABLE-2,VERB >SYN
|
|
GETB SYN,8
|
|
BTST STACK,128 /?CCL51
|
|
GETB SYN,8
|
|
JUMP ?CND49
|
|
?CCL51: GETB SYN,8
|
|
BAND STACK,127
|
|
SHIFT STACK,7
|
|
?CND49: ZERO? STACK \?CND47
|
|
GET SYN,3 >SYN
|
|
?CND47: DLESS? 'N,0 /?REP41
|
|
GET SYN,3
|
|
GET STACK,3 >SYN
|
|
ZERO? SYN /?PRG40
|
|
ADD 1,VERB
|
|
GET SAMPLE-COMMANDS-TABLE-2,STACK
|
|
PUT PARSE-RESULT,8,STACK
|
|
CALL GET-SYNTAX,SYN,2,0,TRUE-VALUE
|
|
ZERO? STACK /?PRG40
|
|
CALL DETERMINE-OBJ,FALSE-VALUE,1,TRUE-VALUE >OBJ
|
|
ZERO? OBJ /?PRG40
|
|
GET OBJ,3 >OBJ
|
|
ZERO? OBJ /?PRG40
|
|
CALL DETERMINE-OBJ,FALSE-VALUE,2,TRUE-VALUE >SYN
|
|
ZERO? SYN /?PRG40
|
|
GET SYN,3 >SYN
|
|
ZERO? SYN /?PRG40
|
|
INC 'NUM
|
|
PRINTC 9
|
|
GET SAMPLE-COMMANDS-TABLE-2,VERB
|
|
ICALL2 PRINT-VOCAB-WORD,STACK
|
|
PRINTC 32
|
|
ICALL2 DPRINT,OBJ
|
|
PRINTC 32
|
|
ADD 1,VERB
|
|
GET SAMPLE-COMMANDS-TABLE-2,STACK
|
|
ICALL2 PRINT-VOCAB-WORD,STACK
|
|
PRINTC 32
|
|
ICALL2 DPRINT,SYN
|
|
CRLF
|
|
ZERO? PRSO \?PRG40
|
|
?REP41: ZERO? P-WON \?CCL66
|
|
RANDOM 2
|
|
EQUAL? STACK,1 \?CND65
|
|
?CCL66: PRINTI " say """
|
|
GETB VOCAB,0
|
|
ADD 1,STACK
|
|
ADD VOCAB,STACK >SYN
|
|
GETB SYN,0 >CT
|
|
?PRG69: ADD SYN,1
|
|
GET STACK,0
|
|
RANDOM STACK
|
|
SUB STACK,1
|
|
MUL CT,STACK
|
|
ADD 3,STACK
|
|
ADD SYN,STACK >N
|
|
LESS? N,W?A /?PRG69
|
|
GETB N,8
|
|
BTST STACK,128 /?CCL78
|
|
GETB N,8
|
|
JUMP ?CND76
|
|
?CCL78: GETB N,8
|
|
BAND STACK,127
|
|
SHIFT STACK,7
|
|
?CND76: ZERO? STACK /?PRG69
|
|
EQUAL? N,W?END.OF.INPUT,W?NO.WORD,W?INT.NUM /?PRG69
|
|
EQUAL? N,W?INT.TIM /?PRG69
|
|
ICALL2 PRINT-VOCAB-WORD,N
|
|
PRINTI """
|
|
"
|
|
?CND65: IN? JESTER,HERE \?CND81
|
|
PRINTI " jester, give me the key
|
|
"
|
|
?CND81: PRINTR "Now you can try again.]"
|
|
|
|
.ENDSEG
|
|
|
|
.SEGMENT "0"
|
|
|
|
|
|
.FUNCT BUFFER-PRINT,BEG,END,CP,NOSP,WRD,NW,FIRST??,PN,TMP
|
|
SET 'FIRST??,TRUE-VALUE
|
|
?PRG1: EQUAL? BEG,END /TRUE
|
|
ZERO? NOSP \?CTR6
|
|
EQUAL? NW,W?PERIOD,W?COMMA,W?APOSTROPHE \?CCL7
|
|
?CTR6: SET 'NOSP,FALSE-VALUE
|
|
JUMP ?CND5
|
|
?CCL7: PRINTC 32
|
|
?CND5: GET BEG,0 >WRD
|
|
ADD BEG,P-WORDLEN
|
|
EQUAL? END,STACK \?CCL12
|
|
SET 'NW,0
|
|
JUMP ?CND10
|
|
?CCL12: GET BEG,P-LEXELEN >NW
|
|
?CND10: EQUAL? WRD,W?NO.WORD \?CCL15
|
|
SET 'NOSP,TRUE-VALUE
|
|
JUMP ?CND13
|
|
?CCL15: EQUAL? WRD,W?MY \?CCL17
|
|
PRINTB W?YOUR
|
|
JUMP ?CND13
|
|
?CCL17: EQUAL? WRD,W?ME \?CCL19
|
|
PRINTB W?YOU
|
|
SET 'PN,TRUE-VALUE
|
|
JUMP ?CND13
|
|
?CCL19: EQUAL? WRD,W?ONE \?CCL21
|
|
PRINTI "object"
|
|
JUMP ?CND13
|
|
?CCL21: EQUAL? WRD,FALSE-VALUE,W?ALL,W?PERIOD /?CCL23
|
|
GETB WRD,8
|
|
BTST STACK,128 /?CCL32
|
|
GETB WRD,8 >TMP
|
|
JUMP ?CND30
|
|
?CCL32: GETB WRD,8
|
|
BAND STACK,127
|
|
SHIFT STACK,7 >TMP
|
|
?CND30: ZERO? TMP \?CCL23
|
|
GET WRD,3
|
|
ZERO? STACK \?CCL23
|
|
BTST TMP,4 /?CCL23
|
|
BTST TMP,2 /?CCL23
|
|
SET 'NOSP,TRUE-VALUE
|
|
JUMP ?CND13
|
|
?CCL23: CALL2 CAPITAL-NOUN?,WRD
|
|
ZERO? STACK /?CCL35
|
|
ICALL2 CAPITALIZE,BEG
|
|
SET 'PN,TRUE-VALUE
|
|
JUMP ?CND13
|
|
?CCL35: ZERO? FIRST?? /?CND36
|
|
ZERO? PN \?CND36
|
|
ZERO? CP /?CND36
|
|
EQUAL? WRD,W?HER,W?HIM,W?YOUR /?CND36
|
|
PRINTI "the "
|
|
?CND36: EQUAL? WRD,W?IT \?CCL45
|
|
CALL2 VISIBLE?,P-IT-OBJECT
|
|
ZERO? STACK /?CCL45
|
|
ICALL2 DPRINT,P-IT-OBJECT
|
|
JUMP ?CND43
|
|
?CCL45: EQUAL? WRD,W?HER \?CCL49
|
|
ZERO? PN \?CCL49
|
|
ICALL2 DPRINT,P-HER-OBJECT
|
|
JUMP ?CND43
|
|
?CCL49: EQUAL? WRD,W?HIM \?CCL53
|
|
ZERO? PN \?CCL53
|
|
ICALL2 DPRINT,P-HIM-OBJECT
|
|
JUMP ?CND43
|
|
?CCL53: EQUAL? WRD,W?INT.NUM,W?INT.TIM \?CCL57
|
|
GET BEG,1
|
|
PRINTN STACK
|
|
JUMP ?CND43
|
|
?CCL57: ICALL2 WORD-PRINT,BEG
|
|
?CND43: SET 'FIRST??,FALSE-VALUE
|
|
?CND13: ADD BEG,P-WORDLEN >BEG
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT CAPITALIZE,PTR,?TMP1
|
|
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,PTR,?TMP1,STACK
|
|
RSTACK
|
|
|
|
|
|
.FUNCT PRINT-PARSER-FAILURE,CLASS,OTHER,OTHER2,TMP,PR,N,X,?TMP1
|
|
GET ERROR-ARGS,1 >CLASS
|
|
GET ERROR-ARGS,2 >OTHER
|
|
GET ERROR-ARGS,3 >OTHER2
|
|
EQUAL? CLASS,PARSER-ERROR-ORPH-S \?CCL3
|
|
GET ORPHAN-S,O-LEXPTR
|
|
SUB STACK,P-LEXV
|
|
DIV STACK,2 >P-OFLAG
|
|
COPYT G-LEXV,O-LEXV,LEXV-LENGTH-BYTES
|
|
COPYT G-INBUF,O-INBUF,61
|
|
GET OOPS-TABLE,O-START
|
|
PUT OOPS-TABLE,O-AGAIN,STACK
|
|
ICALL MAKE-ROOM-FOR-TOKENS,1,O-LEXV,P-OFLAG
|
|
PUT O-LEXV,P-OFLAG,W?NO.WORD
|
|
PRINTI "[Wh"
|
|
GET ORPHAN-S,O-VERB
|
|
CALL DIR-VERB-WORD?,STACK
|
|
ZERO? STACK /?CCL8
|
|
PRINTI "ere"
|
|
JUMP ?CND6
|
|
?CCL8: GET ORPHAN-S,O-WHICH
|
|
EQUAL? STACK,1 \?CCL13
|
|
GET ORPHAN-S,O-SYNTAX
|
|
GETB STACK,4
|
|
JUMP ?CND11
|
|
?CCL13: GET ORPHAN-S,O-SYNTAX
|
|
GETB STACK,8
|
|
?CND11: EQUAL? PERSONBIT,STACK \?CCL10
|
|
PRINTI "om"
|
|
JUMP ?CND6
|
|
?CCL10: PRINTI "at"
|
|
?CND6: PRINTC 32
|
|
GET ORPHAN-S,O-SUBJECT >PR
|
|
ZERO? PR /?CCL16
|
|
GET ORPHAN-S,O-VERB >TMP
|
|
ADD WORD-FLAG-TABLE,2 >?TMP1
|
|
GET WORD-FLAG-TABLE,0
|
|
INTBL? TMP,?TMP1,STACK,132 >X \?CCL21
|
|
GET X,1
|
|
JUMP ?CND19
|
|
?CCL21: PUSH FALSE-VALUE
|
|
?CND19: BTST STACK,512 \?CCL16
|
|
PRINTI "did "
|
|
ICALL2 TELL-THE,PR
|
|
PRINTC 32
|
|
JUMP ?CND14
|
|
?CCL16: PRINTI "do you want "
|
|
EQUAL? WINNER,PLAYER /?CND22
|
|
ICALL2 DPRINT,WINNER
|
|
PRINTC 32
|
|
?CND22: PRINTI "to "
|
|
?CND14: GET ORPHAN-S,O-VERB
|
|
CALL2 ROOT-VERB,STACK
|
|
ICALL2 PRINT-VOCAB-WORD,STACK
|
|
GET ORPHAN-S,O-PART >TMP
|
|
EQUAL? TMP,0,1 /?CND24
|
|
PRINTC 32
|
|
ICALL2 PRINT-VOCAB-WORD,TMP
|
|
?CND24: GET ERROR-ARGS,2 >TMP
|
|
ZERO? TMP /?CND26
|
|
PRINTC 32
|
|
GET ORPHAN-S,O-OBJECT >PR
|
|
ZERO? PR /?CCL30
|
|
ICALL2 TELL-THE,PR
|
|
JUMP ?CND28
|
|
?CCL30: ICALL2 NP-PRINT,TMP
|
|
?CND28: GET ORPHAN-S,O-SYNTAX >TMP
|
|
ZERO? TMP /?CND26
|
|
GET ORPHAN-S,O-WHICH
|
|
EQUAL? STACK,1 \?CCL35
|
|
GET TMP,1 >TMP
|
|
JUMP ?CND33
|
|
?CCL35: GET TMP,3 >TMP
|
|
?CND33: ZERO? TMP /?CND26
|
|
GETB O-LEXV,P-LEXWORDS >N
|
|
SUB P-OFLAG,P-LEXELEN
|
|
GET O-LEXV,STACK >PR
|
|
GETB PR,8
|
|
BTST STACK,128 /?CCL42
|
|
GETB PR,8
|
|
JUMP ?CND40
|
|
?CCL42: GETB PR,8
|
|
BAND STACK,127
|
|
SHIFT STACK,7
|
|
?CND40: ZERO? STACK \?CND38
|
|
GET PR,3 >PR
|
|
?CND38: EQUAL? TMP,PR /?CND43
|
|
INC 'N
|
|
PUTB O-LEXV,P-LEXWORDS,N
|
|
PUT O-LEXV,P-OFLAG,TMP
|
|
ADD P-OFLAG,P-LEXELEN >P-OFLAG
|
|
?CND43: PUT O-LEXV,P-OFLAG,W?NO.WORD
|
|
MUL P-WORDLEN,N
|
|
ADD 1,STACK
|
|
ICALL INBUF-PRINT,TMP,O-INBUF,O-LEXV,STACK
|
|
PRINTC 32
|
|
ICALL2 PRINT-VOCAB-WORD,TMP
|
|
?CND26: PRINTR "?]"
|
|
?CCL3: EQUAL? CLASS,PARSER-ERROR-ORPH-NP \?CND1
|
|
SET 'X,OTHER
|
|
GET X,8 >N
|
|
GET X,2 >PR
|
|
?PRG46: GET N,0
|
|
EQUAL? PR,STACK \?CCL50
|
|
SUB N,P-LEXV
|
|
DIV STACK,2 >P-OFLAG
|
|
COPYT G-LEXV,O-LEXV,LEXV-LENGTH-BYTES
|
|
COPYT G-INBUF,O-INBUF,61
|
|
GET OOPS-TABLE,O-START
|
|
PUT OOPS-TABLE,O-AGAIN,STACK
|
|
ICALL2 WHICH-PRINT,X
|
|
RTRUE
|
|
?CCL50: SUB N,4 >N
|
|
GRTR? P-LEXV,N \?PRG46
|
|
?CND1: EQUAL? CLASS,PARSER-ERROR-NOMULT \?CCL54
|
|
ICALL CANT-USE-MULTIPLE,OTHER,OTHER2
|
|
RTRUE
|
|
?CCL54: EQUAL? CLASS,PARSER-ERROR-NOOBJ \?CCL56
|
|
ICALL CANT-FIND-OBJECT,OTHER,OTHER2
|
|
RTRUE
|
|
?CCL56: EQUAL? CLASS,PARSER-ERROR-TMNOUN \?CCL58
|
|
GET PARSE-RESULT,1
|
|
ICALL2 TOO-MANY-NOUNS,STACK
|
|
RTRUE
|
|
?CCL58: SET 'OTHER2,OTLEXV
|
|
ZERO? P-LEN \?PRD62
|
|
GET OTHER2,0
|
|
CALL2 NAKED-ADJECTIVE?,STACK
|
|
ZERO? STACK \?CCL60
|
|
?PRD62: SUB OTLEXV,4 >OTHER2
|
|
LESS? P-LEXV,OTHER2 \?CND59
|
|
LESS? 0,P-LEN \?CND59
|
|
GET OTHER2,0
|
|
CALL2 NAKED-ADJECTIVE?,STACK
|
|
ZERO? STACK /?CND59
|
|
GET OTLEXV,0
|
|
CALL WORD-TYPE?,STACK,P-EOI-CODE,P-COMMA-CODE
|
|
ZERO? STACK /?CND59
|
|
?CCL60: SUB OTHER2,P-LEXV
|
|
DIV STACK,2
|
|
ADD P-LEXELEN,STACK >CLASS
|
|
ICALL MAKE-ROOM-FOR-TOKENS,1,P-LEXV,CLASS
|
|
ICALL MAKE-ROOM-FOR-TOKENS,1,G-LEXV,CLASS
|
|
ADD OTHER2,4
|
|
ICALL CHANGE-LEXV,STACK,W?ONE
|
|
GETB P-LEXV,P-LEXWORDS >P-LEN
|
|
GET OOPS-TABLE,O-START >TLEXV
|
|
CALL2 PARSE-IT,FALSE-VALUE
|
|
RSTACK
|
|
?CND59: GRTR? P-LEN,0 \?CCL71
|
|
SUB OTLEXV,4 >OTHER2
|
|
CALL2 CHANGE-AND-TO-THEN?,OTHER2
|
|
ZERO? STACK \?CTR70
|
|
SET 'OTHER2,OTLEXV
|
|
CALL2 CHANGE-AND-TO-THEN?,OTHER2
|
|
ZERO? STACK /?CCL71
|
|
?CTR70: ICALL CHANGE-LEXV,OTHER2,W?THEN
|
|
GET OOPS-TABLE,O-LENGTH >P-LEN
|
|
GET OOPS-TABLE,O-START >TLEXV
|
|
ICALL1 PRINT-LEXV
|
|
CALL2 PARSE-IT,FALSE-VALUE
|
|
RSTACK
|
|
?CCL71: CALL1 DONT-UNDERSTAND
|
|
RSTACK
|
|
|
|
|
|
.FUNCT NAKED-ADJECTIVE?,WD
|
|
CALL WORD-TYPE?,WD,P-ADJ-CODE
|
|
ZERO? STACK /FALSE
|
|
CALL WORD-TYPE?,WD,P-DIR-CODE
|
|
ZERO? STACK \FALSE
|
|
EQUAL? WD,W?ONE /FALSE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT CHANGE-AND-TO-THEN?,PTR,?TMP1
|
|
GET PTR,0
|
|
EQUAL? STACK,W?AND,W?COMMA \FALSE
|
|
ADD PTR,4 >PTR
|
|
GET PTR,0
|
|
CALL WORD-TYPE?,STACK,P-VERB-CODE,P-DIR-CODE >?TMP1
|
|
ZERO? ?TMP1 /?PRD6
|
|
RETURN ?TMP1
|
|
?PRD6: GET PTR,0
|
|
CALL WORD-TYPE?,STACK,P-EOI-CODE
|
|
RSTACK
|
|
|
|
|
|
.FUNCT DONT-UNDERSTAND
|
|
SET 'CLOCK-WAIT,TRUE-VALUE
|
|
GETB P-LEXV,P-LEXWORDS
|
|
EQUAL? 1,STACK \?CND1
|
|
GET P-LEXV,P-LEXSTART
|
|
CALL WORD-TYPE?,STACK,P-NOUN-CODE,P-ADJ-CODE
|
|
ZERO? STACK /?CND1
|
|
ICALL2 MISSING,STR?25
|
|
RTRUE
|
|
?CND1: CALL2 COUNT-ERRORS,1
|
|
ZERO? STACK \TRUE
|
|
PRINTR "[Sorry, but I don't understand. Please say that another way, or try something else.]"
|
|
|
|
|
|
.FUNCT MISSING,NV
|
|
PRINTI "[I think there's a "
|
|
PRINT NV
|
|
PRINTR " missing in that sentence!]"
|
|
|
|
|
|
.FUNCT CANT-FIND-OBJECT,NP,PART,TMP
|
|
GET NP,3
|
|
ZERO? STACK \?CCL3
|
|
CALL2 NP-CANT-SEE,NP
|
|
RSTACK
|
|
?CCL3: PRINTI "[There isn't anything to "
|
|
GET PARSE-RESULT,1 >TMP
|
|
ZERO? TMP /?CCL6
|
|
ICALL2 PRINT-VOCAB-WORD,TMP
|
|
EQUAL? PART,0,1 /?CND4
|
|
PRINTC 32
|
|
ICALL2 PRINT-VOCAB-WORD,TMP
|
|
JUMP ?CND4
|
|
?CCL6: PRINTI "do that to"
|
|
?CND4: PRINTR "!]"
|
|
|
|
|
|
.FUNCT NP-CANT-SEE,NP,TMP
|
|
ASSIGNED? 'NP /?CND1
|
|
CALL1 GET-NP >NP
|
|
?CND1: GET NP,2 >TMP
|
|
ZERO? TMP /?CCL5
|
|
PRINTC 91
|
|
ICALL2 TELL-CTHE,WINNER
|
|
PRINTI " can't see "
|
|
CALL2 CAPITAL-NOUN?,TMP
|
|
ZERO? STACK \?CTR7
|
|
GET NP,1 >TMP
|
|
ZERO? TMP /?CCL8
|
|
GET TMP,2
|
|
ZERO? STACK /?CCL8
|
|
?CTR7: ICALL NP-PRINT,NP,TRUE-VALUE
|
|
JUMP ?CND6
|
|
?CCL8: PRINTI "any "
|
|
ICALL2 NP-PRINT,NP
|
|
?CND6: PRINTC 32
|
|
GET NP,5 >TMP
|
|
ZERO? TMP /?CCL15
|
|
GETB TMP,1
|
|
EQUAL? STACK,4 \?PRD19
|
|
PRINTI "in"
|
|
JUMP ?CTR14
|
|
?PRD19: GETB TMP,1
|
|
EQUAL? STACK,6 \?CCL15
|
|
GET TMP,2 >TMP
|
|
ZERO? TMP /?CCL15
|
|
GET TMP,1
|
|
CALL2 PRINT-VOCAB-WORD,STACK
|
|
ZERO? STACK /?CCL15
|
|
?CTR14: PRINTC 32
|
|
GET TMP,3
|
|
ICALL2 TELL-THE,STACK
|
|
JUMP ?CND13
|
|
?CCL15: PRINTI "right "
|
|
PRINTI "here"
|
|
?CND13: PRINTR ".]"
|
|
?CCL5: CALL1 MORE-SPECIFIC
|
|
RSTACK
|
|
|
|
|
|
.FUNCT WHICH-LIST?,NP,SR,CT,V,?TMP1
|
|
GET SR,1 >CT
|
|
ADD SR,8 >V
|
|
GET SR,0
|
|
GRTR? CT,STACK /FALSE
|
|
INTBL? PSEUDO-OBJECT,V,CT >NP \?PRG7
|
|
ADD NP,2 >?TMP1
|
|
SUB NP,V
|
|
ADD 2,STACK
|
|
DIV STACK,2
|
|
SUB CT,STACK
|
|
INTBL? PSEUDO-OBJECT,?TMP1,STACK /FALSE
|
|
?PRG7: DLESS? 'CT,0 /FALSE
|
|
GET V,0
|
|
CALL2 ACCESSIBLE?,STACK
|
|
ZERO? STACK \TRUE
|
|
ADD V,2 >V
|
|
JUMP ?PRG7
|
|
|
|
|
|
.FUNCT WHICH-PRINT,NP,SR,LEN,SZ,REM,VEC
|
|
SET 'SR,ORPHAN-SR
|
|
GET SR,1 >LEN
|
|
GET SR,0 >SZ
|
|
EQUAL? WINNER,PLAYER /?CCL3
|
|
PRINTI """I don't understand "
|
|
CALL WHICH-LIST?,NP,SR
|
|
ZERO? STACK /?CCL6
|
|
PRINTI "if"
|
|
JUMP ?CND1
|
|
?CCL6: PRINTI "which"
|
|
ZERO? NP /?CND1
|
|
PRINTC 32
|
|
ICALL2 NP-PRINT,NP
|
|
JUMP ?CND1
|
|
?CCL3: PRINTI "[Which"
|
|
ZERO? NP /?CND9
|
|
PRINTC 32
|
|
ICALL2 NP-PRINT,NP
|
|
?CND9: PRINTI " do"
|
|
?CND1: PRINTI " you mean"
|
|
CALL WHICH-LIST?,NP,SR
|
|
ZERO? STACK /?CND11
|
|
EQUAL? WINNER,PLAYER \?CND13
|
|
PRINTC 44
|
|
?CND13: SET 'REM,LEN
|
|
ADD SR,8 >VEC
|
|
?PRG15: PRINTC 32
|
|
GET VEC,0
|
|
ICALL2 TELL-THE,STACK
|
|
EQUAL? REM,2 \?CCL19
|
|
EQUAL? LEN,2 /?CND20
|
|
PRINTC 44
|
|
?CND20: PRINTI " or"
|
|
JUMP ?CND17
|
|
?CCL19: GRTR? REM,2 \?CND17
|
|
PRINTC 44
|
|
?CND17: DLESS? 'REM,1 /?CND11
|
|
DLESS? 'SZ,1 /?CND11
|
|
ADD VEC,2 >VEC
|
|
JUMP ?PRG15
|
|
?CND11: EQUAL? WINNER,PLAYER /?CCL31
|
|
PRINTR "."""
|
|
?CCL31: PRINTR "?]"
|
|
|
|
|
|
.FUNCT NP-PRINT,NP,DO-QUANT,LEN,OBJ,CT,?TMP1
|
|
LESS? 0,NP \?CCL3
|
|
GRTR? NP,LAST-OBJECT /?CCL3
|
|
CALL2 TELL-THE,NP
|
|
RSTACK
|
|
?CCL3: GETB NP,1
|
|
EQUAL? STACK,4 \?CCL7
|
|
GET NP,1 >LEN
|
|
ZERO? LEN /FALSE
|
|
DEC 'LEN
|
|
?PRG11: MUL CT,2
|
|
ADD NOUN-PHRASE-HEADER-LEN,STACK
|
|
GET NP,STACK >OBJ
|
|
ZERO? OBJ /?CND13
|
|
ICALL2 TELL-THE,OBJ
|
|
?CND13: IGRTR? 'CT,LEN /TRUE
|
|
PRINTI ", "
|
|
JUMP ?PRG11
|
|
?CCL7: ZERO? DO-QUANT /?CND18
|
|
GET NP,3 >LEN
|
|
ZERO? LEN /?CND18
|
|
CALL2 GET-QUANTITY-WORD,LEN
|
|
PRINTB STACK
|
|
GET NP,2
|
|
ZERO? STACK /?CND18
|
|
PRINTC 32
|
|
?CND18: GET NP,1 >LEN
|
|
ZERO? LEN /?CND24
|
|
ICALL2 ADJS-PRINT,LEN
|
|
?CND24: GET NP,8 >LEN
|
|
ZERO? LEN /?CCL28
|
|
GET LEN,0 >?TMP1
|
|
GET NP,2
|
|
EQUAL? ?TMP1,STACK /?CTR27
|
|
GET LEN,0
|
|
GETB STACK,8
|
|
BTST STACK,128 /?CCL37
|
|
GET LEN,0
|
|
GETB STACK,8
|
|
JUMP ?CND35
|
|
?CCL37: GET LEN,0
|
|
GETB STACK,8
|
|
BAND STACK,127
|
|
SHIFT STACK,7
|
|
?CND35: BTST STACK,8192 \?CCL28
|
|
SUB LEN,4 >LEN
|
|
LESS? P-LEXV,LEN \?CCL28
|
|
GET LEN,0 >?TMP1
|
|
GET NP,2
|
|
EQUAL? ?TMP1,STACK \?CCL28
|
|
?CTR27: ADD LEN,P-WORDLEN
|
|
ICALL BUFFER-PRINT,LEN,STACK,FALSE-VALUE,TRUE-VALUE
|
|
JUMP ?CND26
|
|
?CCL28: GET NP,2 >LEN
|
|
ZERO? LEN /?CND26
|
|
ICALL2 PRINT-VOCAB-WORD,LEN
|
|
?CND26: GET NP,4 >LEN
|
|
ZERO? LEN /?CND40
|
|
CALL2 PMEM?,LEN
|
|
ZERO? STACK /?CND40
|
|
GETB LEN,1
|
|
EQUAL? STACK,2 \?CND40
|
|
PRINTI " of "
|
|
ICALL2 NP-PRINT,LEN
|
|
?CND40: GET NP,6 >LEN
|
|
ZERO? LEN /FALSE
|
|
CALL2 PMEM?,LEN
|
|
ZERO? STACK /FALSE
|
|
GETB LEN,1
|
|
EQUAL? STACK,2 \FALSE
|
|
PRINTI " except "
|
|
CALL2 NP-PRINT,LEN
|
|
RSTACK
|
|
|
|
|
|
.FUNCT ADJS-PRINT,ADJT,LEN,WD,CT,TMP
|
|
GET ADJT,2 >LEN
|
|
ZERO? LEN /?CND1
|
|
EQUAL? LEN,PLAYER,ME \?CCL5
|
|
PRINTI "your "
|
|
JUMP ?CND1
|
|
?CCL5: ICALL2 NP-PRINT,LEN
|
|
PRINTI "'s "
|
|
?CND1: GET ADJT,4 >LEN
|
|
ZERO? LEN /FALSE
|
|
ADD ADJT,10 >ADJT
|
|
GRTR? LEN,ADJS-MAX-COUNT \?CND9
|
|
SET 'LEN,ADJS-MAX-COUNT
|
|
?CND9: DEC 'LEN
|
|
MUL 2,LEN
|
|
ADD ADJT,STACK >ADJT
|
|
?PRG11: GET ADJT,0 >WD
|
|
EQUAL? WD,W?MY \?CCL15
|
|
PRINTI "your "
|
|
JUMP ?CND13
|
|
?CCL15: EQUAL? WD,W?INT.NUM,W?INT.TIM \?CCL17
|
|
PRINTN P-NUMBER
|
|
PRINTC 32
|
|
JUMP ?CND13
|
|
?CCL17: EQUAL? WD,W?NO.WORD /?CND13
|
|
CALL2 CAPITAL-NOUN?,WD
|
|
ZERO? STACK /?CCL21
|
|
GETB P-LEXV,P-LEXWORDS >TMP
|
|
ZERO? TMP /?CCL21
|
|
INTBL? WD,P-LEXV+2,TMP,132 >TMP \?CCL21
|
|
ICALL2 CAPITALIZE,TMP
|
|
JUMP ?CND19
|
|
?CCL21: ICALL2 PRINT-VOCAB-WORD,WD
|
|
?CND19: PRINTC 32
|
|
?CND13: IGRTR? 'CT,LEN /TRUE
|
|
SUB ADJT,2 >ADJT
|
|
JUMP ?PRG11
|
|
|
|
|
|
.FUNCT TOO-MANY-NOUNS,WD
|
|
PRINTI "[I can't understand that many nouns with "
|
|
ZERO? WD /?CCL3
|
|
PRINTC 34
|
|
ICALL2 PRINT-VOCAB-WORD,WD
|
|
PRINTC 34
|
|
JUMP ?CND1
|
|
?CCL3: PRINTI "that verb"
|
|
?CND1: PRINTR ".]"
|
|
|
|
|
|
.FUNCT INBUF-ADD,LEN,BEG,SLOT,DBEG,TMP,?TMP1
|
|
GET OOPS-TABLE,O-END >TMP
|
|
ZERO? TMP /?CCL3
|
|
SET 'DBEG,TMP
|
|
JUMP ?CND1
|
|
?CCL3: GET OOPS-TABLE,O-LENGTH
|
|
MUL P-WORDLEN,STACK >TMP
|
|
GETB G-LEXV,TMP >?TMP1
|
|
ADD TMP,1
|
|
GETB G-LEXV,STACK
|
|
ADD ?TMP1,STACK >DBEG
|
|
?CND1: SUB LEN,1
|
|
ADD DBEG,STACK
|
|
LESS? INBUF-LENGTH,STACK /FALSE
|
|
ADD DBEG,LEN
|
|
PUT OOPS-TABLE,O-END,STACK
|
|
ADD P-INBUF,BEG >?TMP1
|
|
ADD G-INBUF,DBEG
|
|
COPYT ?TMP1,STACK,LEN
|
|
PUTB G-LEXV,SLOT,DBEG
|
|
SUB SLOT,1
|
|
PUTB G-LEXV,STACK,LEN
|
|
RTRUE
|
|
|
|
|
|
.FUNCT INBUF-PRINT,WD,INBUF,LEXV,SLOT,DBEG,CTR,TMP,LEN,?TMP1
|
|
SET 'LEN,11
|
|
GET OOPS-TABLE,O-END >TMP
|
|
ZERO? TMP /?CCL3
|
|
SET 'DBEG,TMP
|
|
JUMP ?CND1
|
|
?CCL3: GET OOPS-TABLE,O-LENGTH
|
|
MUL P-WORDLEN,STACK >TMP
|
|
GETB LEXV,TMP >?TMP1
|
|
ADD TMP,1
|
|
GETB LEXV,STACK
|
|
ADD ?TMP1,STACK >DBEG
|
|
?CND1: GETB INBUF,0 >?TMP1
|
|
SUB LEN,1
|
|
ADD DBEG,STACK
|
|
LESS? ?TMP1,STACK /FALSE
|
|
ADD INBUF,DBEG
|
|
DIROUT D-TABLE-ON,STACK
|
|
ICALL2 PRINT-VOCAB-WORD,WD
|
|
DIROUT D-TABLE-OFF
|
|
ADD 1,DBEG
|
|
GETB INBUF,STACK >LEN
|
|
ADD 2,DBEG >DBEG
|
|
ADD DBEG,LEN
|
|
PUT OOPS-TABLE,O-END,STACK
|
|
PUTB LEXV,SLOT,DBEG
|
|
SUB SLOT,1
|
|
PUTB LEXV,STACK,LEN
|
|
RTRUE
|
|
|
|
|
|
.FUNCT SETUP-ORPHAN,STR,A,B
|
|
DIROUT D-TABLE-ON,O-INBUF
|
|
PRINT STR
|
|
ZERO? A /?CND1
|
|
LESS? 0,A \?CCL5
|
|
GRTR? A,LAST-OBJECT /?CCL5
|
|
ICALL2 DPRINT,A
|
|
JUMP ?CND3
|
|
?CCL5: PRINT A
|
|
?CND3: ZERO? B /?CND1
|
|
LESS? 0,B \?CCL12
|
|
GRTR? B,LAST-OBJECT /?CCL12
|
|
ICALL2 DPRINT,B
|
|
JUMP ?CND1
|
|
?CCL12: PRINT B
|
|
?CND1: DIROUT D-TABLE-OFF
|
|
PUTB O-INBUF,0,INBUF-LENGTH
|
|
LEX O-INBUF,O-LEXV
|
|
GETB O-LEXV,P-LEXWORDS >A
|
|
ZERO? A /FALSE
|
|
INTBL? 0,O-LEXV+2,A,132 /FALSE
|
|
GETB O-LEXV,P-LEXWORDS
|
|
MUL P-LEXELEN,STACK
|
|
ADD 1,STACK >P-OFLAG
|
|
ICALL MAKE-ROOM-FOR-TOKENS,1,O-LEXV,P-OFLAG
|
|
PUT O-LEXV,P-OFLAG,W?NO.WORD
|
|
SUB 0,P-OFLAG >P-OFLAG
|
|
PUT OOPS-TABLE,O-AGAIN,P-LEXV+2
|
|
RTRUE
|
|
|
|
|
|
.FUNCT INSERT-ADJS,E,CT,PTR,WD
|
|
LESS? P-OFLAG,0 \?CCL3
|
|
SUB 0,P-OFLAG >PTR
|
|
JUMP ?CND1
|
|
?CCL3: SET 'PTR,P-OFLAG
|
|
?CND1: EQUAL? E,FALSE-VALUE,TRUE-VALUE /FALSE
|
|
GET E,2 >CT
|
|
ZERO? CT /?CND7
|
|
CALL2 PMEM?,CT
|
|
ZERO? STACK /?CCL11
|
|
GET CT,2 >CT
|
|
JUMP ?CND9
|
|
?CCL11: GETPT CT,P?SYNONYM
|
|
GET STACK,0 >CT
|
|
?CND9: GETB VOCAB,0
|
|
ADD 1,STACK
|
|
ADD VOCAB,STACK
|
|
GETB STACK,0
|
|
ADD CT,STACK >CT
|
|
CALL INSERT-ADJS-WD,PTR,CT >PTR
|
|
?CND7: GET E,4 >CT
|
|
ZERO? CT /FALSE
|
|
ADD E,10 >E
|
|
?PRG16: DLESS? 'CT,0 /TRUE
|
|
GET E,CT >WD
|
|
GET ERROR-ARGS,3
|
|
EQUAL? WD,STACK /?PRG16
|
|
CALL INSERT-ADJS-WD,PTR,WD >PTR
|
|
JUMP ?PRG16
|
|
|
|
|
|
.FUNCT INSERT-ADJS-WD,PTR,WD
|
|
ICALL MAKE-ROOM-FOR-TOKENS,1,G-LEXV,PTR
|
|
PUT G-LEXV,PTR,WD
|
|
ADD PTR,P-LEXELEN >PTR
|
|
MUL 2,PTR
|
|
SUB STACK,1
|
|
ICALL INBUF-PRINT,WD,G-INBUF,G-LEXV,STACK
|
|
RETURN PTR
|
|
|
|
.ENDSEG
|
|
|
|
.ENDI
|