.SEGMENT "0" .FUNCT RED-FCN,N,TYP ZERO? N /TRUE EQUAL? N,1 \FALSE POP DATA-STACK RSTACK .FUNCT RED-PART,N,TYP,WD ZERO? N /TRUE POP DATA-STACK >WD EQUAL? WD,TRUE-VALUE,W?OF /?CCL5 CALL WORD-TYPE?,WD,P-PARTICLE-CODE ZERO? STACK /FALSE ?CCL5: EQUAL? N,1 \?CCL9 RETURN WD ?CCL9: POP DATA-STACK RSTACK .FUNCT GET-SYNTAX,VA,NUM,PREP,GWIM,LEN,CT,S2,P2,GWIM-NOW,SYN EQUAL? PREP,1 \?CND1 SET 'PREP,0 ?CND1: EQUAL? NUM,1 \?CCL5 SET 'LEN,6 JUMP ?CND3 ?CCL5: SET 'LEN,10 ?CND3: GET VA,0 >CT GET PARSE-RESULT,8 >P2 SET 'GWIM-NOW,FALSE-VALUE ADD VA,2 >SYN ?PRG6: GET SYN,1 EQUAL? PREP,STACK \?CCL10 EQUAL? NUM,1 /?CTR9 GET SYN,3 >S2 EQUAL? P2,S2 /?CTR9 ZERO? S2 \?PRD16 EQUAL? P2,1 /?CTR9 ?PRD16: ZERO? GWIM-NOW /?CCL10 EQUAL? NUM,1 \?CND22 SET 'S2,PREP ?CND22: ZERO? S2 /?CCL10 PUT GWIM-MSG,0,S2 ?CTR9: PUT PARSE-RESULT,3,SYN GET SYN,0 PUT PARSE-RESULT,4,STACK PUT PARSE-RESULT,7,PREP RETURN SYN ?CCL10: DLESS? 'CT,1 \?CCL26 ZERO? GWIM /FALSE ZERO? GWIM-NOW \FALSE GET VA,0 >CT SET 'GWIM-NOW,TRUE-VALUE ADD VA,2 >SYN JUMP ?PRG6 ?CCL26: ADD SYN,LEN >SYN JUMP ?PRG6 .FUNCT RED-SV,N,TYP,SYN,VERB,PART,DATA,OBJ POP DATA-STACK >PART POP DATA-STACK GET PARSE-RESULT,1 CALL2 ROOT-VERB,STACK >VERB ZERO? VERB /FALSE GET VERB,3 >DATA EQUAL? PART,1 \?CCL6 GET DATA,0 GRTR? 0,STACK /?CCL6 GET DATA,0 PUT PARSE-RESULT,4,STACK RTRUE ?CCL6: GET DATA,2 >SYN ZERO? SYN /?CCL10 CALL GET-SYNTAX,SYN,1,PART,TRUE-VALUE >SYN ZERO? SYN /?CCL10 CALL DETERMINE-OBJ,FALSE-VALUE,1 >OBJ ZERO? OBJ /?CCL10 PUT PARSE-RESULT,5,OBJ RTRUE ?CCL10: GET DATA,3 >SYN ZERO? SYN /FALSE CALL GET-SYNTAX,SYN,2,PART,TRUE-VALUE >SYN ZERO? SYN /FALSE CALL DETERMINE-OBJ,FALSE-VALUE,1 >OBJ ZERO? OBJ /FALSE PUT PARSE-RESULT,5,OBJ GET OBJ,3 PUT ORPHAN-S,O-OBJECT,STACK CALL DETERMINE-OBJ,FALSE-VALUE,2 >OBJ ZERO? OBJ /FALSE PUT PARSE-RESULT,6,OBJ RTRUE .FUNCT ROOT-VERB,VERB,DATA,X,?TMP1 ADD WORD-FLAG-TABLE,2 >?TMP1 GET WORD-FLAG-TABLE,0 INTBL? VERB,?TMP1,STACK,132 >X \?CCL7 GET X,1 JUMP ?CND5 ?CCL7: PUSH FALSE-VALUE ?CND5: ZERO? STACK /?CND1 GET VERB,3 >DATA ZERO? DATA /?CND1 SET 'VERB,DATA ?CND1: RETURN VERB .FUNCT RED-SVN,N,TYP,SYN1,SYN2,VERB,PART,DATA,OBJ,OBJ1,OBJ2 POP DATA-STACK >OBJ POP DATA-STACK >PART POP DATA-STACK GET PARSE-RESULT,1 CALL2 ROOT-VERB,STACK >VERB ZERO? VERB /FALSE GET VERB,3 >DATA GET PARSE-RESULT,8 ZERO? STACK \?CCL6 GET DATA,2 >SYN1 ZERO? SYN1 /?CCL6 CALL GET-SYNTAX,SYN1,1,PART >SYN1 ZERO? SYN1 /?CCL6 CALL DETERMINE-OBJ,OBJ,1 >OBJ1 ZERO? OBJ1 \?CCL12 CALL PARSER-ERROR,0,PARSER-ERROR-NOOBJ,OBJ,PART RSTACK ?CCL12: GET OBJ1,3 EQUAL? INTDIR,STACK \?CCL14 GET PARSE-RESULT,1 CALL DIR-VERB-WORD?,STACK ZERO? STACK /?CCL14 GET OBJ,2 XPUSH STACK,DATA-STACK \?CCL14 CALL RED-SD,1,TYP RSTACK ?CCL14: PUT PARSE-RESULT,5,OBJ1 RETURN PARSE-RESULT ?CCL6: GET DATA,3 >SYN2 ZERO? SYN2 /FALSE CALL GET-SYNTAX,SYN2,2,PART,TRUE-VALUE >SYN2 ZERO? SYN2 /FALSE CALL DETERMINE-OBJ,OBJ,1 >OBJ1 ZERO? OBJ1 \?CCL24 CALL PARSER-ERROR,0,PARSER-ERROR-NOOBJ,OBJ,PART RSTACK ?CCL24: PUT PARSE-RESULT,5,OBJ1 GET OBJ1,3 PUT ORPHAN-S,O-OBJECT,STACK CALL DETERMINE-OBJ,FALSE-VALUE,2 >OBJ2 ZERO? OBJ2 /FALSE PUT PARSE-RESULT,6,OBJ2 RETURN PARSE-RESULT .FUNCT RED-SVNP,N,TYP,PART,OBJ POP DATA-STACK >PART POP DATA-STACK >OBJ XPUSH PART,DATA-STACK /?BOGUS1 ?BOGUS1: XPUSH OBJ,DATA-STACK /?BOGUS2 ?BOGUS2: CALL RED-SVN,N,TYP ZERO? STACK \TRUE GET PARSE-RESULT,1 XPUSH STACK,DATA-STACK /?BOGUS6 ?BOGUS6: XPUSH TRUE-VALUE,DATA-STACK /?BOGUS7 ?BOGUS7: PUT PARSE-RESULT,8,PART XPUSH OBJ,DATA-STACK /?BOGUS8 ?BOGUS8: CALL RED-SVN,N,TYP RSTACK .FUNCT RED-SVNPN,N,TYP,OBJ2,OBJ1 POP DATA-STACK >OBJ2 POP DATA-STACK PUT PARSE-RESULT,8,STACK POP DATA-STACK >OBJ1 XPUSH OBJ1,DATA-STACK /?BOGUS1 ?BOGUS1: XPUSH OBJ2,DATA-STACK /?BOGUS2 ?BOGUS2: DEC 'N CALL RED-SVPNN,N,TYP RSTACK .FUNCT RED-SVPNN,N,TYP,N1,N2,PART,OBJ1,OBJ2,SYN,?TMP1 POP DATA-STACK >N2 GET PARSE-RESULT,8 ZERO? STACK \?CND1 GET GWIM-MSG,0 >?TMP1 ZERO? ?TMP1 /?PRD5 PUSH ?TMP1 JUMP ?PEN3 ?PRD5: PUSH 1 ?PEN3: PUT PARSE-RESULT,8,STACK ?CND1: POP DATA-STACK >N1 EQUAL? N,4 \?CND6 POP DATA-STACK >PART ?CND6: GET PARSE-RESULT,1 CALL2 ROOT-VERB,STACK >SYN ZERO? SYN \?CCL10 CALL PARSER-ERROR,0,PARSER-ERROR-NOUND RSTACK ?CCL10: GET SYN,3 GET STACK,3 >SYN ZERO? SYN \?CCL12 CALL PARSER-ERROR,0,PARSER-ERROR-TMNOUN RSTACK ?CCL12: CALL GET-SYNTAX,SYN,2,PART >SYN ZERO? SYN \?CCL14 CALL PARSER-ERROR,0,PARSER-ERROR-NOUND RSTACK ?CCL14: CALL DETERMINE-OBJ,N1,1 >OBJ1 ZERO? OBJ1 \?CCL16 CALL PARSER-ERROR,0,PARSER-ERROR-NOOBJ,N1,PART RSTACK ?CCL16: CALL DETERMINE-OBJ,N2,2 >OBJ2 ZERO? OBJ2 \?CCL18 CALL PARSER-ERROR,0,PARSER-ERROR-NOOBJ,N2,PART RSTACK ?CCL18: CALL DIR-VERB-PRSI?,OBJ2 ZERO? STACK /?CCL20 CALL PARSER-ERROR,0,PARSER-ERROR-NOUND RSTACK ?CCL20: POP DATA-STACK PUT PARSE-RESULT,5,OBJ1 PUT PARSE-RESULT,6,OBJ2 RTRUE .FUNCT RED-SVPNPN,N,TYP,N2 POP DATA-STACK >N2 POP DATA-STACK PUT PARSE-RESULT,8,STACK XPUSH N2,DATA-STACK /?BOGUS1 ?BOGUS1: SUB N,1 CALL RED-SVPNN,STACK,TYP RSTACK .FUNCT RED-SD,N,TYP,V,NEW-OBJECT SET 'V,W?WALK PUT PARSE-RESULT,1,V GET V,3 GET STACK,2 ICALL GET-SYNTAX,STACK,1,FALSE-VALUE POP DATA-STACK GETB STACK,6 >P-WALK-DIR CALL DO-PMEM-ALLOC,4,NOUN-PHRASE-MIN-LENGTH >NEW-OBJECT PUT NEW-OBJECT,1,1 PUT NEW-OBJECT,3,P-WALK-DIR PUT PARSE-RESULT,5,NEW-OBJECT RTRUE .FUNCT RED-SVD,N,TYP,DIR POP DATA-STACK >DIR GET PARSE-RESULT,1 CALL DIR-VERB-WORD?,STACK ZERO? STACK /FALSE POP DATA-STACK XPUSH DIR,DATA-STACK /?BOGUS4 ?BOGUS4: SUB N,1 CALL RED-SD,STACK,TYP RSTACK .FUNCT RED-SP,N,TYP,A,?TMP1 POP DATA-STACK >A DEC 'N EQUAL? N,2 \?CND1 EQUAL? TRUE-VALUE,A /?CND1 GET A,3 >?TMP1 ZERO? ?TMP1 /?PRD7 PUSH ?TMP1 JUMP ?PEN5 ?PRD7: PUSH A ?PEN5: PUT PARSE-RESULT,0,STACK ?CND1: FSTACK N,DATA-STACK RETURN PARSE-RESULT .FUNCT IREDUCE-EXCEPTION,ENP,NP GET ENP,2 EQUAL? STACK,W?ONE \?CND1 GET NP,2 PUT ENP,2,STACK ?CND1: GET ENP,3 ZERO? STACK \?CND3 PUT ENP,3,NP-QUANT-ALL ?CND3: SET 'SEARCH-FLAGS,31 CALL DETERMINE-NP,0,0,ENP RSTACK .FUNCT REDUCE-EXCEPT-IT,PHR,NP GET PHR,1 EQUAL? 1,STACK \FALSE GET PHR,3 EQUAL? IT,STACK \FALSE ZERO? P-IT-OBJECT \?CCL8 CALL PARSER-ERROR,0,PARSER-ERROR-NOOBJ,NP RSTACK ?CCL8: PUT PHR,3,P-IT-OBJECT RTRUE .FUNCT REDUCE-EXCEPTION,PP,NP,ENP,NOUN-PHRASE,NEW-OBJECT,NNP,GOOD,BAD GET PP,2 >ENP GETB ENP,1 EQUAL? STACK,2 \?CCL3 CALL IREDUCE-EXCEPTION,ENP,NP >NOUN-PHRASE ZERO? NOUN-PHRASE /FALSE ICALL REDUCE-EXCEPT-IT,NOUN-PHRASE,ENP CALL DO-PMEM-ALLOC,3,3 >NEW-OBJECT PUT NEW-OBJECT,2,ENP PUT NEW-OBJECT,3,NOUN-PHRASE PUT NP,6,NEW-OBJECT RETURN NP ?CCL3: SET 'NNP,ENP SET 'GOOD,FALSE-VALUE ?PRG7: GET NNP,2 >BAD CALL IREDUCE-EXCEPTION,BAD,NP >NEW-OBJECT ZERO? NEW-OBJECT /?CND9 SET 'GOOD,TRUE-VALUE ICALL REDUCE-EXCEPT-IT,NEW-OBJECT,BAD PUT NNP,3,NEW-OBJECT ?CND9: GET NNP,1 >NNP ZERO? NNP \?PRG7 ZERO? GOOD /?CCL15 PUT NP,6,ENP RETURN NP ?CCL15: CALL PARSER-ERROR,0,PARSER-ERROR-NOOBJ,BAD RSTACK .FUNCT REDUCE-LOCATION,PP,SYN,WHICH,SEARCH,TEST,PREP,NP,RLOC,BIT,MSG,OLD-OBJECT,NEW-OBJECT ZERO? SYN \?CCL3 SET 'SEARCH,0 JUMP ?CND1 ?CCL3: EQUAL? WHICH,1 \?CCL6 GETB SYN,5 >SEARCH JUMP ?CND1 ?CCL6: GETB SYN,9 >SEARCH ?CND1: ZERO? SYN \?CCL9 SET 'TEST,0 JUMP ?CND7 ?CCL9: EQUAL? WHICH,1 \?CCL12 GETB SYN,4 >TEST JUMP ?CND7 ?CCL12: GETB SYN,8 >TEST ?CND7: GET PP,1 >PREP GET PP,2 >NP ZERO? SEARCH \?CND13 SET 'SEARCH,5 ?CND13: COPYT PREP-BIT,0,6 EQUAL? PREP,W?BUT,W?EXCEPT /FALSE EQUAL? PREP,W?IN,W?INSIDE \?CCL19 SET 'BIT,CONTBIT SET 'MSG,P-NO-INSIDE JUMP ?CND15 ?CCL19: EQUAL? PREP,W?ON,W?OFF \?CCL21 SET 'BIT,SURFACEBIT SET 'MSG,P-NO-SURFACE JUMP ?CND15 ?CCL21: EQUAL? PREP,W?FROM \FALSE SET 'BIT,SURFACEBIT PUT PREP-BIT,1,PERSONBIT PUT PREP-BIT,2,CONTBIT SET 'MSG,P-NOTHING ?CND15: PUT PREP-BIT,0,BIT GETB NP,1 EQUAL? STACK,2 \FALSE GET NP,5 >RLOC ZERO? RLOC /?CND27 GET RLOC,2 GET STACK,3 >RLOC ?CND27: SET 'OLD-OBJECT,FINDER PUT OLD-OBJECT,0,TEST PUT OLD-OBJECT,1,0 PUT OLD-OBJECT,2,FALSE-VALUE PUT OLD-OBJECT,3,FALSE-VALUE PUT OLD-OBJECT,4,0 GET NP,1 PUT OLD-OBJECT,5,STACK GET NP,2 PUT OLD-OBJECT,6,STACK PUT OLD-OBJECT,7,FALSE-VALUE PUT OLD-OBJECT,8,FALSE-VALUE PUT OLD-OBJECT,9,SEARCH-RES CALL2 NUMERIC-ADJ?,NP PUT OLD-OBJECT,10,STACK ZERO? RLOC \?CCL31 PUSH SEARCH JUMP ?CND29 ?CCL31: PUSH 0 ?CND29: CALL FIND-OBJECTS,STACK,RLOC >SEARCH ZERO? SEARCH /?CCL34 CALL DO-PMEM-ALLOC,4,NOUN-PHRASE-MIN-LENGTH >OLD-OBJECT PUT OLD-OBJECT,1,1 GET SEARCH-RES,4 PUT OLD-OBJECT,3,STACK PUT OLD-OBJECT,4,NP SET 'RLOC,OLD-OBJECT CALL DO-PMEM-ALLOC,6,2 >NEW-OBJECT PUT NEW-OBJECT,1,PREP PUT NEW-OBJECT,2,RLOC RETURN NEW-OBJECT ?CCL34: GET SEARCH-RES,1 ZERO? STACK \?CCL36 CALL PARSER-ERROR,0,PARSER-ERROR-NOOBJ,NP,PREP RSTACK ?CCL36: CALL2 READY-TO-DISAMBIGUATE?,NP ZERO? STACK /FALSE GET PARSE-RESULT,1 CALL PARSER-ERROR,0,PARSER-ERROR-ORPH-NP,NP,STACK RSTACK .FUNCT DETERMINE-OBJ,OBJ,NUM,PICK,VAL,RES,COUNT,SYN,S-FLAGS,SEARCH-ACT,OLD-OBJECT,NO,CT,PTR,CNT,TMP GET PARSE-RESULT,3 >SYN EQUAL? NUM,1 \?CCL3 GETB SYN,5 >S-FLAGS JUMP ?CND1 ?CCL3: GETB SYN,9 >S-FLAGS ?CND1: EQUAL? NUM,1 \?CCL6 GETB SYN,4 >SEARCH-ACT JUMP ?CND4 ?CCL6: GETB SYN,8 >SEARCH-ACT ?CND4: ZERO? OBJ \?CCL9 SET 'OLD-OBJECT,FINDER PUT OLD-OBJECT,0,SEARCH-ACT PUT OLD-OBJECT,1,FIND-FLAGS-GWIM PUT OLD-OBJECT,2,FALSE-VALUE PUT OLD-OBJECT,3,SYN PUT OLD-OBJECT,4,NUM PUT OLD-OBJECT,5,FALSE-VALUE PUT OLD-OBJECT,6,FALSE-VALUE PUT OLD-OBJECT,7,FALSE-VALUE PUT OLD-OBJECT,8,FALSE-VALUE PUT OLD-OBJECT,9,SEARCH-RES PUT OLD-OBJECT,10,0 ZERO? PICK /?CND10 PUT FINDER,2,NP-QUANT-ALL ?CND10: EQUAL? SEARCH-ACT,ROOMSBIT \?PRD16 PUT SEARCH-RES,4,ROOMS JUMP ?CTR13 ?PRD16: ZERO? S-FLAGS /?CCL14 CALL2 FIND-OBJECTS,S-FLAGS ZERO? STACK \?PRD21 ZERO? PICK /?CCL14 GET SEARCH-RES,1 ZERO? STACK /?CCL14 ?PRD21: EQUAL? NUM,1 \?CCL29 GET SYN,1 JUMP ?CND27 ?CCL29: GET SYN,3 ?CND27: PUT GWIM-MSG,0,STACK GET SEARCH-RES,4 PUT GWIM-MSG,1,STACK ?CTR13: CALL DO-PMEM-ALLOC,4,NOUN-PHRASE-MIN-LENGTH >OLD-OBJECT PUT OLD-OBJECT,1,1 GET SEARCH-RES,4 PUT OLD-OBJECT,3,STACK SET 'RES,OLD-OBJECT RETURN RES ?CCL14: GET PARSE-RESULT,1 PUT ORPHAN-S,O-VERB,STACK ZERO? P-LEN \?CCL32 ADD TLEXV,4 JUMP ?CND30 ?CCL32: PUSH TLEXV ?CND30: PUT ORPHAN-S,O-LEXPTR,STACK GET PARSE-RESULT,3 PUT ORPHAN-S,O-SYNTAX,STACK PUT ORPHAN-S,O-WHICH,NUM GET PARSE-RESULT,7 PUT ORPHAN-S,O-PART,STACK GET PARSE-RESULT,5 GET STACK,3 PUT ORPHAN-S,O-OBJECT,STACK GET PARSE-RESULT,12 >VAL ZERO? VAL /?CND33 GET VAL,3 >VAL ?CND33: PUT ORPHAN-S,O-SUBJECT,VAL GET PARSE-RESULT,5 CALL PARSER-ERROR,0,PARSER-ERROR-ORPH-S,STACK RSTACK ?CCL9: GETB OBJ,1 EQUAL? STACK,4 \?CCL36 RETURN OBJ ?CCL36: GETB OBJ,1 EQUAL? STACK,2 \?CCL38 SET 'SEARCH-FLAGS,S-FLAGS CALL DETERMINE-NP,0,NUM,OBJ RSTACK ?CCL38: BTST S-FLAGS,16 /?CCL40 GET PARSE-RESULT,1 CALL PARSER-ERROR,0,PARSER-ERROR-NOMULT,NUM,STACK RSTACK ?CCL40: SET 'SEARCH-FLAGS,S-FLAGS SET 'NO,OBJ SET 'CT,FALSE-VALUE ?PRG41: CALL DETERMINE-NP,0,NUM,NO,TRUE-VALUE >PTR ZERO? PTR /FALSE GET NO,3 GET STACK,1 ADD COUNT,STACK >COUNT ZERO? CT \?CND46 ADD PTR,6 >PTR SET 'CNT,COUNT ?PRG48: DLESS? 'CNT,0 /?CND46 GET PTR,0 EQUAL? NOT-HERE-OBJECT,STACK /?CCL54 SET 'CT,TRUE-VALUE ?CND46: GET NO,1 >NO ZERO? NO \?PRG41 ZERO? CT /FALSE MUL COUNT,2 ADD STACK,2 CALL DO-PMEM-ALLOC,4,STACK >CNT PUT CNT,1,COUNT SET 'RES,CNT SET 'NO,OBJ ADD RES,6 >PTR ?PRG59: GET NO,3 >CT GET CT,1 MUL 4,STACK >TMP ADD CT,6 COPYT STACK,PTR,TMP ADD PTR,TMP >PTR GET NO,1 >NO ZERO? NO \?PRG59 RETURN RES ?CCL54: ADD PTR,4 >PTR JUMP ?PRG48 .FUNCT CHECK-DIR-ADJS,ADJS,AV,CT,ADJ,PT ADD ADJS,10 >AV GET ADJS,4 >CT ?PRG1: DLESS? 'CT,0 /TRUE GET AV,CT >ADJ CALL WORD-TYPE?,ADJ,P-DIR-CODE ZERO? STACK /?PRG1 GETB ADJ,6 GETPT HERE,STACK >PT ZERO? PT /?PRG1 PTSIZE PT EQUAL? STACK,DEXIT \?PRG1 PUT AV,CT,W?NO.WORD GET PT,DEXITOBJ CALL MATCH-OBJECT,STACK,FINDER,TRUE-VALUE ZERO? STACK \?CND10 PUT AV,CT,ADJ RTRUE ?CND10: PUT AV,CT,ADJ JUMP ?PRG1 .FUNCT NUMERIC-ADJ?,NP,ADJS,VAL,AV,CT,ADJ,VV GET NP,1 >ADJS ZERO? ADJS /FALSE ADD ADJS,10 >AV GET ADJS,4 >CT ?PRG4: DLESS? 'CT,0 /?REP5 GET AV,CT >ADJ EQUAL? ADJ,W?INT.NUM \?PRG4 GET NP,8 >VV ?PRG10: GET VV,0 EQUAL? ADJ,STACK \?CCL14 GET VV,1 >VAL JUMP ?PRG4 ?CCL14: SUB VV,P-LEXELEN >VV GRTR? P-LEXV,VV /?PRG4 JUMP ?PRG10 ?REP5: RETURN VAL .FUNCT DETERMINE-NP,SEARCH-ACT,WHICH,OBJ,MULTI,SYN,ROBJ,RLOC,QUANT,OWNER,RES,COUNT,OLD-OBJECT,NEW-OBJECT,?TMP1 ?FCN: ZERO? WHICH \?CCL3 SET 'SYN,FALSE-VALUE JUMP ?CND1 ?CCL3: GET PARSE-RESULT,3 >SYN ?CND1: SET 'ROBJ,OBJ GETB OBJ,1 EQUAL? STACK,3 \?CND4 GET OBJ,2 >ROBJ ?CND4: GET ROBJ,5 >RLOC ZERO? RLOC /?CND6 GET RLOC,2 >RLOC GET RLOC,3 >RLOC ?CND6: GET ROBJ,3 >QUANT ZERO? QUANT /?CND8 GRTR? QUANT,NP-QUANT-A \?CND8 BTST SEARCH-FLAGS,16 /?CND8 GET PARSE-RESULT,1 CALL PARSER-ERROR,0,PARSER-ERROR-NOMULT,WHICH,STACK RSTACK ?CND8: GET ROBJ,4 >OWNER ZERO? OWNER \?PRD16 GET ROBJ,1 >OWNER ZERO? OWNER /?CND13 GET OWNER,2 >OWNER ZERO? OWNER /?CND13 ?PRD16: CALL2 PMEM?,OWNER ZERO? STACK /?CND13 SET 'OLD-OBJECT,FINDER PUT OLD-OBJECT,0,SEARCH-ACT PUT OLD-OBJECT,1,0 PUT OLD-OBJECT,2,FALSE-VALUE PUT OLD-OBJECT,3,SYN PUT OLD-OBJECT,4,WHICH GET OWNER,1 PUT OLD-OBJECT,5,STACK GET OWNER,2 PUT OLD-OBJECT,6,STACK GET OWNER,4 PUT OLD-OBJECT,7,STACK PUT OLD-OBJECT,8,FALSE-VALUE PUT OLD-OBJECT,9,SEARCH-RES CALL2 NUMERIC-ADJ?,OWNER PUT OLD-OBJECT,10,STACK PUT SEARCH-RES,1,0 PUT SEARCH-RES,2,FALSE-VALUE ICALL2 FIND-OBJECTS,15 COPYT SEARCH-RES,OWNER-SR-HERE,20 PUT SEARCH-RES,1,0 PUT SEARCH-RES,2,FALSE-VALUE ICALL2 FIND-OWNERS,OWNERS COPYT SEARCH-RES,OWNER-SR-THERE,20 ?CND13: GET ROBJ,2 EQUAL? STACK,W?HIMSELF \?CND21 EQUAL? 2,WHICH \?CCL25 GET PARSE-RESULT,5 >COUNT ZERO? COUNT /?CCL25 GET COUNT,3 >COUNT ZERO? COUNT /?CCL25 FSET? COUNT,PERSONBIT \?CCL25 SET 'RES,COUNT JUMP ?CND21 ?CCL25: SET 'RES,P-HIM-OBJECT ?CND21: ZERO? RES /?CND30 CALL DO-PMEM-ALLOC,4,NOUN-PHRASE-MIN-LENGTH >OLD-OBJECT PUT OLD-OBJECT,1,1 PUT OLD-OBJECT,3,RES PUT OLD-OBJECT,4,ROBJ RETURN OLD-OBJECT ?CND30: SET 'OLD-OBJECT,FINDER PUT OLD-OBJECT,0,SEARCH-ACT PUT OLD-OBJECT,1,0 PUT OLD-OBJECT,2,QUANT PUT OLD-OBJECT,3,SYN PUT OLD-OBJECT,4,WHICH GET ROBJ,1 PUT OLD-OBJECT,5,STACK GET ROBJ,2 PUT OLD-OBJECT,6,STACK GET ROBJ,4 PUT OLD-OBJECT,7,STACK GET ROBJ,6 PUT OLD-OBJECT,8,STACK PUT OLD-OBJECT,9,SEARCH-RES CALL2 NUMERIC-ADJ?,ROBJ PUT OLD-OBJECT,10,STACK ICALL FIND-OBJECTS,SEARCH-FLAGS,RLOC GET SEARCH-RES,1 ZERO? STACK \?CND34 GET ROBJ,1 ZERO? STACK /?CND34 GET ROBJ,1 ICALL2 CHECK-DIR-ADJS,STACK ?CND34: GET SEARCH-RES,1 >COUNT ZERO? COUNT \?CCL40 GET ROBJ,2 >RLOC ZERO? RLOC /?CCL40 ADD WORD-FLAG-TABLE,2 >?TMP1 GET WORD-FLAG-TABLE,0 INTBL? RLOC,?TMP1,STACK,132 >OLD-OBJECT \?CCL46 GET OLD-OBJECT,1 JUMP ?CND44 ?CCL46: PUSH FALSE-VALUE ?CND44: BTST STACK,16 \?CCL40 PUT ROBJ,3,NP-QUANT-ALL GET RLOC,3 PUT ROBJ,2,STACK JUMP ?FCN ?CCL40: ZERO? COUNT \?CCL48 ZERO? MULTI \?CCL50 GET PARSE-RESULT,4 CALL NOT-HERE-VERB?,STACK ZERO? STACK /?CND38 ?CCL50: CALL DO-PMEM-ALLOC,4,NOUN-PHRASE-MIN-LENGTH >NEW-OBJECT PUT NEW-OBJECT,1,1 PUT NEW-OBJECT,3,NOT-HERE-OBJECT PUT NEW-OBJECT,4,ROBJ SET 'RES,NEW-OBJECT JUMP ?CND38 ?CCL48: EQUAL? COUNT,1 /?CTR53 ZERO? QUANT \?CTR53 GET SEARCH-RES,4 GETP STACK,P?GENERIC CALL STACK,SEARCH-RES,FINDER >RES ZERO? RES /?CCL54 ?CTR53: EQUAL? RES,NOT-HERE-OBJECT \?CCL60 CALL PARSER-ERROR,0,PARSER-ERROR-NOOBJ,OBJ RSTACK ?CCL60: ZERO? RES /?CND58 SET 'COUNT,1 PUT SEARCH-RES,1,1 PUT SEARCH-RES,2,FALSE-VALUE EQUAL? RES,HERE \?CCL64 PUSH GLOBAL-HERE JUMP ?CND62 ?CCL64: PUSH RES ?CND62: PUT SEARCH-RES,4,STACK ?CND58: MUL COUNT,2 ADD STACK,2 CALL DO-PMEM-ALLOC,4,STACK >NEW-OBJECT PUT NEW-OBJECT,1,COUNT SET 'RES,NEW-OBJECT GET ROBJ,4 >SYN ZERO? SYN \?CCL66 GET ROBJ,1 >SYN ZERO? SYN /?CND65 GET SYN,2 >SYN ZERO? SYN /?CND65 ?CCL66: LESS? 0,SYN \?CCL72 GRTR? SYN,LAST-OBJECT \?CND65 ?CCL72: GET SEARCH-RES,3 >SYN GET ROBJ,4 ZERO? STACK /?CCL77 PUT ROBJ,4,SYN JUMP ?CND65 ?CCL77: GET ROBJ,1 PUT STACK,2,SYN ?CND65: ADD RES,6 CALL DETERMINE-NP-XFER,COUNT,ROBJ,SEARCH-RES,STACK >SYN ZERO? SYN /?CND38 SUB COUNT,SYN PUT RES,1,STACK ?CND38: ZERO? RES \?PRD84 RETURN RES ?CCL54: CALL2 READY-TO-DISAMBIGUATE?,ROBJ ZERO? STACK /?CND38 GET PARSE-RESULT,1 CALL PARSER-ERROR,0,PARSER-ERROR-ORPH-NP,ROBJ,STACK RSTACK ?PRD84: GETB OBJ,1 EQUAL? STACK,3 /?CCL82 RETURN RES ?CCL82: PUT OBJ,3,RES RETURN RES .FUNCT FIND-OWNERS,TBL,OOBJ,LEN GET TBL,0 >LEN ?PRG1: LESS? LEN,1 /TRUE GET TBL,LEN >OOBJ LESS? 0,OOBJ \?CCL7 GET TBL,LEN >OOBJ GRTR? OOBJ,LAST-OBJECT /?CCL7 CALL MATCH-OBJECT,OOBJ,FINDER,TRUE-VALUE ZERO? STACK \?CND3 RTRUE ?CCL7: ICALL2 FIND-OWNERS,OOBJ ?CND3: DEC 'LEN JUMP ?PRG1 .FUNCT READY-TO-DISAMBIGUATE?,NP,PTR,NOUN GET NP,8 >PTR ZERO? PTR /FALSE GET NP,2 >NOUN ZERO? NOUN /FALSE ?PRG6: GET PTR,0 EQUAL? NOUN,STACK \?CCL10 RETURN PTR ?CCL10: SUB PTR,4 >PTR GRTR? P-LEXV,PTR \?PRG6 RFALSE .FUNCT DETERMINE-NP-XFER,COUNT,ROBJ,SRES,DV,CT,V,TMP,NUM GET SRES,0 >CT ADD SRES,8 >V GRTR? CT,COUNT \?CND3 SET 'CT,COUNT ?CND3: SUB COUNT,CT >COUNT SET 'NUM,0 ?PRG5: GET V,0 >TMP ZERO? TMP /?CCL9 PUT DV,0,TMP PUT DV,1,ROBJ JUMP ?CND7 ?CCL9: INC 'NUM ?CND7: ADD DV,4 >DV ADD V,2 >V DLESS? 'CT,1 \?PRG5 GET SRES,2 >SRES ZERO? SRES \?CND12 RETURN NUM ?CND12: SET 'CT,FIND-RES-MAXOBJ ADD SRES,8 >V GRTR? CT,COUNT \?CND14 SET 'CT,COUNT ?CND14: SUB COUNT,CT >COUNT JUMP ?PRG5 .FUNCT RED-O-ADJ,N,TYP ZERO? P-OFLAG /FALSE COPYT O-LEXV,G-LEXV,LEXV-LENGTH-BYTES COPYT O-INBUF,G-INBUF,61 GET OOPS-TABLE,O-AGAIN PUT OOPS-TABLE,O-START,STACK POP DATA-STACK ICALL2 INSERT-ADJS,STACK ICALL2 COPY-INPUT,TRUE-VALUE THROW PARSER-RESULT-AGAIN,PARSE-SENTENCE-ACTIVATION RTRUE .FUNCT RED-O-PP,N,TYP,PP,A,PREP LESS? P-OFLAG,0 \?CCL8 SUB 0,P-OFLAG >PP JUMP ?CND6 ?CCL8: SET 'PP,P-OFLAG ?CND6: ZERO? PP /FALSE GET O-LEXV,PP EQUAL? W?NO.WORD,STACK \FALSE SUB PP,P-LEXELEN GET O-LEXV,STACK >A ZERO? A /FALSE POP DATA-STACK >PP ZERO? PP /FALSE EQUAL? N,1 /?CCL3 POP DATA-STACK >PREP ZERO? PREP /FALSE ?CCL3: COPYT O-LEXV,G-LEXV,LEXV-LENGTH-BYTES COPYT O-INBUF,G-INBUF,61 GET OOPS-TABLE,O-AGAIN PUT OOPS-TABLE,O-START,STACK EQUAL? A,PREP \?CCL18 PUSH 1 JUMP ?CND16 ?CCL18: PUSH 0 ?CND16: ICALL2 INSERT-NP,STACK ICALL2 COPY-INPUT,TRUE-VALUE THROW PARSER-RESULT-AGAIN,PARSE-SENTENCE-ACTIVATION RTRUE .FUNCT INSERT-NP,NUM,NP,GPTR,PPTR,TMP,?TMP1 LESS? P-OFLAG,0 \?CCL3 SUB 0,P-OFLAG >GPTR JUMP ?CND1 ?CCL3: SET 'GPTR,P-OFLAG ?CND1: GET PARSE-RESULT,2 >TMP ZERO? TMP /?CCL6 MUL NUM,4 ADD TMP,STACK >PPTR SUB TLEXV,TMP DIV STACK,4 ADD 1,STACK >TMP JUMP ?CND4 ?CCL6: GET OOPS-TABLE,O-START >PPTR GET OOPS-TABLE,O-LENGTH >TMP MUL NUM,4 ADD PPTR,STACK >PPTR ?CND4: SUB TMP,NUM >NUM ADD -1,NUM ICALL MAKE-ROOM-FOR-TOKENS,STACK,G-LEXV,GPTR ?PRG8: DLESS? 'NUM,0 /TRUE GETB PPTR,2 >?TMP1 GETB PPTR,3 MUL GPTR,2 ADD 3,STACK >TMP ICALL INBUF-ADD,?TMP1,STACK,TMP GET PPTR,0 >TMP PUT G-LEXV,GPTR,TMP EQUAL? TMP,W?INT.NUM,W?INT.TIM \?CND12 ADD 1,GPTR >?TMP1 GET PPTR,1 PUT G-LEXV,?TMP1,STACK ?CND12: ADD GPTR,2 >GPTR ADD PPTR,4 >PPTR JUMP ?PRG8 .FUNCT TEST-SR,NP,A,CT,LEN,NEW-OBJECT,SZ,REM,?TMP1 GET ORPHAN-SR,1 >LEN ZERO? LEN /FALSE GET NP,2 >A CALL WORD-TYPE?,A,P-QUANT-CODE ZERO? STACK /?CCL5 RETURN A ?CCL5: GET NP,1 >A ZERO? A \?CCL7 CALL DO-PMEM-ALLOC,1,8 >NEW-OBJECT GET NP,7 PUT NEW-OBJECT,1,STACK SET 'A,NEW-OBJECT JUMP ?CND1 ?CCL7: GET A,4 >CT GRTR? ADJS-MAX-COUNT,CT \FALSE ?CND1: ADD A,10 >?TMP1 GET NP,2 PUT ?TMP1,CT,STACK ADD 1,CT PUT A,4,STACK PUT FINDER,5,A CALL2 NUMERIC-ADJ?,NP PUT FINDER,10,STACK GET ORPHAN-NP,2 PUT FINDER,6,STACK PUT SEARCH-RES,1,0 PUT SEARCH-RES,2,FALSE-VALUE SET 'NEW-OBJECT,ORPHAN-SR+8 GET ORPHAN-SR,0 >SZ SET 'REM,LEN ?PRG9: GET NEW-OBJECT,0 CALL MATCH-OBJECT,STACK,FINDER,TRUE-VALUE ZERO? STACK \?CND11 RETURN A ?CND11: DLESS? 'REM,1 /?REP10 DLESS? 'SZ,1 /?REP10 ADD NEW-OBJECT,2 >NEW-OBJECT JUMP ?PRG9 ?REP10: ZERO? CT /?CND19 PUT A,4,CT ?CND19: GET SEARCH-RES,1 ZERO? STACK /FALSE RETURN A .FUNCT RED-O-NP,N,TYP,A,NP,PP,A1,PTR,WD,?TMP1,?TMP2 EQUAL? N,2 \?CND1 POP DATA-STACK >PP ?CND1: POP DATA-STACK >NP GETB NP,1 EQUAL? STACK,4 \?CND3 GET NP,3 EQUAL? STACK,INTQUOTE \?CND3 GET NP,4 >NP ZERO? P-OFLAG \?CND3 GET NP,7 SUB STACK,P-LEXV DIV STACK,2 >PP ICALL MAKE-ROOM-FOR-TOKENS,1,G-LEXV,PP PUT G-LEXV,PP,W?SAY ICALL1 COPY-INPUT THROW PARSER-RESULT-AGAIN,PARSE-SENTENCE-ACTIVATION ?CND3: ZERO? P-OFLAG /FALSE ZERO? PP \?CND12 GET NP,2 CALL WORD-TYPE?,STACK,P-ADJ-CODE ZERO? STACK /?CND12 GET NP,3 ZERO? STACK \?CND12 CALL2 TEST-SR,NP >A ZERO? A /?CND12 XPUSH A,DATA-STACK /?BOGUS18 ?BOGUS18: ICALL RED-O-ADJ,1,TYP RFALSE ?CND12: COPYT O-LEXV,G-LEXV,LEXV-LENGTH-BYTES COPYT O-INBUF,G-INBUF,61 LESS? P-OFLAG,0 \?CCL21 SUB 0,P-OFLAG >N JUMP ?CND19 ?CCL21: SET 'N,P-OFLAG ?CND19: GET G-LEXV,N EQUAL? W?NO.WORD,STACK \?CCL24 ICALL INSERT-NP,0,NP JUMP ?CND22 ?CCL24: SET 'A1,FALSE-VALUE GET NP,2 >A ZERO? A /?CND27 PUT G-LEXV,N,A GET NP,8 >A GETB A,2 >?TMP2 GETB A,3 >?TMP1 MUL N,2 ADD 3,STACK ICALL INBUF-ADD,?TMP2,?TMP1,STACK ?CND27: GET NP,1 >A ZERO? A /?CND29 ICALL2 INSERT-ADJS,A ?CND29: ZERO? PP /?CND31 ADD N,P-LEXELEN ICALL MAKE-ROOM-FOR-TOKENS,2,G-LEXV,STACK ADD N,P-LEXELEN >?TMP1 GET PP,1 PUT G-LEXV,?TMP1,STACK GET PP,2 >A GETB A,1 EQUAL? STACK,4 \?CCL35 GET A,4 >A JUMP ?CND33 ?CCL35: GETB A,1 EQUAL? STACK,3 \?CND33 GET A,2 >A ?CND33: ADD N,4 >?TMP1 GET A,2 PUT G-LEXV,?TMP1,STACK ?CND31: GET NP,3 >A ZERO? A /?CND22 SET 'PTR,N ?PRG42: SUB PTR,P-LEXELEN >PTR GRTR? 0,PTR \?CCL46 ZERO? A1 /?PRD49 SET 'PTR,A1 JUMP ?PEN47 ?PRD49: SET 'PTR,N ?PEN47: ICALL MAKE-ROOM-FOR-TOKENS,1,G-LEXV,PTR JUMP ?REP43 ?CCL46: GET G-LEXV,PTR >WD EQUAL? WD,W?THE /?REP43 CALL WORD-TYPE?,WD,P-QUANT-CODE ZERO? STACK \?REP43 CALL WORD-TYPE?,WD,P-ADJ-CODE ZERO? STACK /?CCL55 SET 'A1,PTR JUMP ?PRG42 ?CCL55: ZERO? A1 /?PRD58 SET 'PTR,A1 JUMP ?PEN56 ?PRD58: SET 'PTR,N ?PEN56: ICALL MAKE-ROOM-FOR-TOKENS,1,G-LEXV,PTR ?REP43: CALL2 GET-QUANTITY-WORD,A PUT G-LEXV,PTR,STACK ?CND22: GET OOPS-TABLE,O-AGAIN PUT OOPS-TABLE,O-START,STACK ICALL1 COPY-INPUT THROW PARSER-RESULT-AGAIN,PARSE-SENTENCE-ACTIVATION RTRUE .FUNCT RED-PERS,N,TYP,X EQUAL? N,2,3 \TRUE POP DATA-STACK >X EQUAL? X,W?COMMA \?PRD7 EQUAL? N,2 /?CCL5 ?PRD7: EQUAL? X,W?TO \FALSE ?CCL5: POP DATA-STACK >X EQUAL? N,3 \?CND11 GET P-RUNNING,0 CALL WORD-TYPE?,STACK,P-VERB-CODE ZERO? STACK /FALSE ?CND11: CALL2 HACK-TELL,X RSTACK .FUNCT HACK-TELL,X,NP PUT PARSE-RESULT,1,W?TELL GET W?TELL,3 GET STACK,2 ICALL GET-SYNTAX,STACK,1,FALSE-VALUE CALL DETERMINE-OBJ,X,1 >NP ZERO? NP \?CND1 CALL PARSER-ERROR,0,PARSER-ERROR-NOOBJ,X RSTACK ?CND1: PUT PARSE-RESULT,2,TLEXV PUT PARSE-RESULT,12,NP GET NP,3 >X EQUAL? X,WINNER,PLAYER,ME /TRUE ICALL2 IGNORE-FIRST-WORD,W?YOU LESS? P-LEN,1 \?CCL8 SET 'P-CONT,FALSE-VALUE JUMP ?CND6 ?CCL8: SET 'P-CONT,TLEXV ?CND6: CALL2 HACK-TELL-1,NP EQUAL? M-FATAL,STACK /?CCL10 ZERO? P-CONT \TRUE ?CCL10: SET 'P-CONT,-1 THROW PARSER-RESULT-DEAD,PARSE-SENTENCE-ACTIVATION RTRUE .FUNCT HACK-TELL-1,NP,X,NUM,CT,?TMP1 GET NP,4 >PRSO-NP GET NP,3 >X GET NP,1 >CT LESS? 1,CT \?CND1 GET NP,2 >NUM GRTR? CT,NUM \FALSE ADD 1,NUM PUT NP,2,STACK ADD NP,8 >?TMP1 MUL 2,NUM GET ?TMP1,STACK >PRSO-NP ADD NP,6 >?TMP1 MUL 2,NUM GET ?TMP1,STACK >X ICALL2 DPRINT,X PRINTI ": " ?CND1: CALL PERFORM,V?TELL,X >X PUT PARSE-RESULT,4,0 RETURN X .FUNCT RED-VP,N,TYP,VERB,A1,A2,?TMP1 SET 'A1,TRUE-VALUE SET 'A2,TRUE-VALUE GRTR? N,2 \?CND1 POP DATA-STACK >A1 ?CND1: POP DATA-STACK >VERB GRTR? N,2 \?CND3 POP DATA-STACK >A2 EQUAL? N,4 \?CND3 POP DATA-STACK ?CND3: PUT PARSE-RESULT,1,VERB PUT PARSE-RESULT,2,TLEXV EQUAL? A1,TRUE-VALUE /?CCL9 GET A1,3 >?TMP1 ZERO? ?TMP1 /?PRD12 PUSH ?TMP1 JUMP ?PEN10 ?PRD12: PUSH A1 ?PEN10: PUT PARSE-RESULT,0,STACK RTRUE ?CCL9: EQUAL? A2,TRUE-VALUE /TRUE GET A2,3 >?TMP1 ZERO? ?TMP1 /?PRD16 PUSH ?TMP1 JUMP ?PEN14 ?PRD16: PUSH A2 ?PEN14: PUT PARSE-RESULT,0,STACK RTRUE .FUNCT RED-NP,N,TYP,NAME,QUANT,LEXB,LEXE,ADJ,NEW-OBJECT SET 'QUANT,NP-QUANT-NONE SET 'LEXE,TLEXV POP DATA-STACK >NAME EQUAL? NAME,1 \?CND1 SET 'NAME,FALSE-VALUE ?CND1: GET LEXE,0 CALL WORD-TYPE?,STACK,P-COMMA-CODE,P-EOI-CODE ZERO? STACK /?CND3 SUB LEXE,4 >LEXE ?CND3: POP DATA-STACK >ADJ EQUAL? ADJ,1 \?CCL7 SET 'LEXB,LEXE SET 'ADJ,FALSE-VALUE JUMP ?CND5 ?CCL7: GET ADJ,1 >LEXB GET ADJ,3 ZERO? STACK /?CND5 GET ADJ,3 >QUANT ?CND5: CALL DO-PMEM-ALLOC,2,9 >NEW-OBJECT PUT NEW-OBJECT,2,NAME PUT NEW-OBJECT,1,ADJ PUT NEW-OBJECT,7,LEXB PUT NEW-OBJECT,8,LEXE PUT NEW-OBJECT,3,QUANT RETURN NEW-OBJECT .FUNCT RED-OF,N,TYP,ONP,NP,TMP,A POP DATA-STACK >ONP POP DATA-STACK EQUAL? STACK,W?OF \FALSE POP DATA-STACK >NP GET NP,3 ZERO? STACK /?CCL6 GET NP,2 ZERO? STACK \?CCL6 GET NP,1 ZERO? STACK \?CCL6 GET NP,3 PUT ONP,3,STACK RETURN ONP ?CCL6: PUT NP,4,ONP RETURN NP .FUNCT RED-QT,N,TYP,Q,NEW-OBJECT POP DATA-STACK >Q EQUAL? Q,W?A,W?AN /FALSE CALL DO-PMEM-ALLOC,2,9 >NEW-OBJECT CALL2 GET-QUANTITY,Q PUT NEW-OBJECT,3,STACK PUT NEW-OBJECT,7,TLEXV PUT NEW-OBJECT,8,TLEXV RETURN NEW-OBJECT .FUNCT GET-QUANTITY-WORD,Q,TBL INTBL? Q,NP-QUANT-TBL,NP-QUANT-TBL-LEN,132 >TBL \FALSE GET TBL,1 RSTACK .FUNCT GET-QUANTITY,Q,TBL INTBL? Q,NP-QUANT-TBL+2,NP-QUANT-TBL-LEN,132 >TBL \FALSE SUB TBL,2 GET STACK,0 RSTACK .FUNCT RED-QN,N,TYP,NP,Q POP DATA-STACK >NP GET NP,7 SUB STACK,4 PUT NP,7,STACK POP DATA-STACK CALL2 GET-QUANTITY,STACK PUT NP,3,STACK RETURN NP .FUNCT RED-NPP,N,TYP,NPP,ONPP,PP,NP,RLOC,X1,X2,KLUDGE-FLAG,OONPP,?PR-NP,NN,TEMP EQUAL? N,1 \?CCL3 POP DATA-STACK RSTACK ?CCL3: EQUAL? N,2 \?CCL5 POP DATA-STACK >PP POP DATA-STACK >ONPP GET PP,1 EQUAL? STACK,W?BUT,W?EXCEPT \?CCL8 GETB ONPP,1 EQUAL? STACK,2 /?CCL11 CALL PARSER-ERROR,0,PARSER-ERROR-NOUND RSTACK ?CCL11: GET ONPP,3 ZERO? STACK \?CCL13 GET DATA-STACK,0 EQUAL? 20,STACK /?CND14 POP DATA-STACK >X1 GET DATA-STACK,0 EQUAL? 20,STACK /?CND16 POP DATA-STACK >X2 CALL2 PMEM?,X2 ZERO? STACK /?CND18 GETB X2,1 EQUAL? STACK,2 \?CND18 GET X2,3 ZERO? STACK /?CND18 CALL REDUCE-EXCEPTION,PP,X2 ZERO? STACK /?CND18 SET 'KLUDGE-FLAG,TRUE-VALUE ?CND18: XPUSH X2,DATA-STACK /?CND16 ?CND16: XPUSH X1,DATA-STACK /?CND14 ?CND14: ZERO? KLUDGE-FLAG \?CND6 CALL PARSER-ERROR,0,PARSER-ERROR-NOUND RSTACK ?CCL13: CALL REDUCE-EXCEPTION,PP,ONPP ZERO? STACK \?CND6 RFALSE ?CCL8: CALL2 REDUCE-LOCATION,PP >RLOC ZERO? RLOC /FALSE ?CND6: ZERO? RLOC \?CCL32 RETURN ONPP ?CCL32: GETB ONPP,1 EQUAL? STACK,2 \?CCL34 GET ONPP,5 ZERO? STACK /?CCL37 GET RLOC,1 CALL PARSER-ERROR,0,PARSER-ERROR-TMNOUN,STACK RSTACK ?CCL37: PUT ONPP,5,RLOC RETURN ONPP ?CCL34: SET 'OONPP,ONPP ?PRG38: GET OONPP,2 >?PR-NP GET ?PR-NP,5 ZERO? STACK \?CND40 PUT ?PR-NP,5,RLOC ?CND40: GET OONPP,1 >OONPP ZERO? OONPP \?CCL44 RETURN ONPP ?CCL44: GETB OONPP,1 EQUAL? STACK,2 \?PRG38 PUT OONPP,5,RLOC RETURN ONPP ?CCL5: POP DATA-STACK >NP POP DATA-STACK EQUAL? STACK,W?AND,W?COMMA \FALSE POP DATA-STACK >NPP GETB NPP,1 EQUAL? STACK,2 \?CND49 GET NPP,6 ZERO? STACK \FALSE ?CND49: CALL DO-PMEM-ALLOC,3,3 >?PR-NP PUT ?PR-NP,2,NP SET 'NP,?PR-NP GETB NPP,1 EQUAL? STACK,2 \?CCL55 CALL DO-PMEM-ALLOC,3,3 >OONPP PUT OONPP,1,NP PUT OONPP,2,NPP RETURN OONPP ?CCL55: SET 'NN,NPP ?PRG56: GET NN,1 >TEMP ZERO? TEMP \?CND58 PUT NN,1,NP RETURN NPP ?CND58: SET 'NN,TEMP JUMP ?PRG56 .FUNCT RED-PP,N,TYP,TMP,NOUN,PREP,NEW-OBJECT POP DATA-STACK >NOUN EQUAL? N,2 \?CCL3 POP DATA-STACK >PREP JUMP ?CND1 ?CCL3: POP DATA-STACK >TMP EQUAL? TMP,W?OF \?CCL5 POP DATA-STACK >PREP EQUAL? PREP,W?OUT \FALSE SET 'PREP,W?FROM JUMP ?CND1 ?CCL5: EQUAL? TMP,W?NOT \?CND1 POP DATA-STACK >PREP EQUAL? PREP,W?BUT,W?EXCEPT \FALSE ?CND1: ZERO? PREP /FALSE CALL DO-PMEM-ALLOC,5,2 >NEW-OBJECT PUT NEW-OBJECT,1,PREP PUT NEW-OBJECT,2,NOUN RETURN NEW-OBJECT .FUNCT RED-POSS,N,TYP,OBJ,WD,A EQUAL? N,3 \FALSE POP DATA-STACK EQUAL? STACK,W?S /?CCL6 CALL PARSER-ERROR,0,PARSER-ERROR-NOUND RSTACK ?CCL6: POP DATA-STACK EQUAL? STACK,W?APOSTROPHE /?CCL8 CALL PARSER-ERROR,0,PARSER-ERROR-NOUND RSTACK ?CCL8: POP DATA-STACK RSTACK .FUNCT RED-ADJ,N,TYP,A1,A2,CT,AD,NEW-OBJECT,VV,TCT,?TMP1 ZERO? N /TRUE POP DATA-STACK >A1 EQUAL? A1,1 \?CND4 CALL DO-PMEM-ALLOC,1,8 >NEW-OBJECT PUT NEW-OBJECT,1,TLEXV SET 'A1,NEW-OBJECT ?CND4: POP DATA-STACK >A2 CALL2 PMEM?,A2 ZERO? STACK /?CCL8 PUT A1,2,A2 RETURN A1 ?CCL8: EQUAL? A2,W?MY \?CCL10 PUT A1,2,PLAYER RETURN A1 ?CCL10: EQUAL? A2,W?YOUR \?CCL12 PUT A1,2,WINNER RETURN A1 ?CCL12: EQUAL? A2,W?HIS \?CND6 GET PARSE-RESULT,5 >AD ZERO? AD /?CCL17 GET AD,3 >AD ZERO? AD /?CCL17 FSET? AD,PERSONBIT \?CCL17 PUT A1,2,AD RETURN A1 ?CCL17: PUT A1,2,P-HIM-OBJECT RETURN A1 ?CND6: EQUAL? A2,W?ITS \?CCL23 GET PARSE-RESULT,5 >AD ZERO? AD /?CCL26 GET AD,3 >AD ZERO? AD /?CCL26 FSET? AD,PERSONBIT /?CCL26 PUT A1,2,AD RETURN A1 ?CCL26: PUT A1,2,P-IT-OBJECT RETURN A1 ?CCL23: ADD WORD-FLAG-TABLE,2 >?TMP1 GET WORD-FLAG-TABLE,0 INTBL? A2,?TMP1,STACK,132 >NEW-OBJECT \?CCL34 GET NEW-OBJECT,1 JUMP ?CND32 ?CCL34: PUSH FALSE-VALUE ?CND32: BTST STACK,16384 \?CCL31 GET A2,3 PUT A1,2,STACK RETURN A1 ?CCL31: EQUAL? A2,W?A,W?AN \?CCL36 PUT A1,3,NP-QUANT-A RETURN A1 ?CCL36: EQUAL? A2,W?THE /?CND21 CALL WORD-TYPE?,A2,P-ADJ-CODE ZERO? STACK /FALSE SET 'AD,A2 GET A1,4 >CT LESS? CT,ADJS-MAX-COUNT \?CND21 ADD A1,10 >VV GET A1,4 >TCT ?PRG44: ZERO? TCT \?CND46 PUT VV,0,A2 ADD CT,1 PUT A1,4,STACK RETURN A1 ?CND46: GET VV,0 EQUAL? AD,STACK /?CND21 ADD VV,2 >VV DEC 'TCT JUMP ?PRG44 ?CND21: RETURN A1 .FUNCT RED-QUOTE,N,TYP,NP,NEW-OBJECT POP DATA-STACK EQUAL? W?QUOTE,STACK \FALSE CALL DO-PMEM-ALLOC,2,9 >NEW-OBJECT PUT NEW-OBJECT,2,W?QUOTE SUB P-RUNNING,4 PUT NEW-OBJECT,7,STACK SET 'NP,NEW-OBJECT ?PRG4: GET P-RUNNING,0 >N DLESS? 'P-LEN,0 /?CCL7 EQUAL? N,W?QUOTE,W?END.OF.INPUT \?CND6 ?CCL7: EQUAL? N,W?QUOTE \?CCL12 PUT NP,8,P-RUNNING ADD P-RUNNING,4 >P-RUNNING JUMP ?CND10 ?CCL12: SUB P-RUNNING,4 PUT NP,8,STACK ?CND10: GET OOPS-TABLE,O-START SUB P-RUNNING,STACK DIV STACK,4 >P-WORDS-AGAIN CALL DO-PMEM-ALLOC,4,NOUN-PHRASE-MIN-LENGTH >NEW-OBJECT PUT NEW-OBJECT,1,1 PUT NEW-OBJECT,3,INTQUOTE PUT NEW-OBJECT,4,NP RETURN NEW-OBJECT ?CND6: ADD P-RUNNING,4 >P-RUNNING JUMP ?PRG4 .ENDSEG .ENDI