.SEGMENT "0" .FUNCT INIT-STATUS-LINE:ANY:0:0 SPLIT 1 SCREEN S-WINDOW CURSET 1,1 HLIGHT H-INVERSE ERASE 1 HLIGHT H-NORMAL SCREEN S-TEXT RTRUE .FUNCT UPDATE-STATUS-LINE:ANY:0:0,?TMP2,?TMP1 SCREEN S-WINDOW HLIGHT H-INVERSE EQUAL? HERE,OLD-HERE /?CND1 SET 'OLD-HERE,HERE CURSET 1,1 ERASE 1 CURSET 1,1 PRINTD HERE ?CND1: GETB 0,33 >?TMP1 CALL2 DIGITS,SCORE >?TMP2 CALL2 DIGITS,MOVES ADD ?TMP2,STACK SUB ?TMP1,STACK CURSET 1,STACK PRINTN SCORE PRINTC 47 PRINTN MOVES HLIGHT H-NORMAL SCREEN S-TEXT RTRUE .FUNCT DIGITS:ANY:1:1,N,D SET 'D,1 LESS? N,0 \?PRG3 INC 'D SUB 0,N >N ?PRG3: DIV N,10 >N ZERO? N /?REP4 INC 'D JUMP ?PRG3 ?REP4: RETURN D .FUNCT READ-INPUT:ANY:0:0 PRINTC 62 PUTB P-INBUF,1,0 ZERO? DEMO-VERSION? /?CCL4 ICALL READ-DEMO,P-INBUF,P-LEXV JUMP ?CND2 ?CCL4: READ P-INBUF,P-LEXV ?CND2: CALL1 SCRIPT-INBUF RSTACK .FUNCT SCRIPT-INBUF:ANY:0:0,BUF,CNT,N,CHR GETB P-INBUF,1 >N DIROUT D-SCREEN-OFF ADD 1,P-INBUF >BUF ?PRG1: IGRTR? 'CNT,N /?REP2 GETB BUF,CNT >CHR LESS? CHR,97 /?CCL8 GRTR? CHR,122 /?CCL8 SUB CHR,32 PRINTC STACK JUMP ?PRG1 ?CCL8: PRINTC CHR JUMP ?PRG1 ?REP2: CRLF DIROUT D-SCREEN-ON RTRUE .FUNCT SPECIAL-CONTRACTION?:ANY:1:1,PTR RFALSE .FUNCT EXPAND-BE-CONTRACTIONS:ANY:0:0,LEN,PTR,OPTR,N,WD,SPWD,L,?TMP1 GETB P-LEXV,P-LEXWORDS >LEN SET 'PTR,P-LEXV+2 SET 'OPTR,PTR SET 'L,LEN ?PRG1: SET 'SPWD,FALSE-VALUE DLESS? 'L,0 \?CCL5 PUTB P-LEXV,P-LEXWORDS,LEN RTRUE ?CCL5: GET PTR,0 >WD ZERO? WD /?CCL7 GET PTR,P-LEXELEN EQUAL? STACK,W?APOSTROPHE \?CCL7 GET P-QA-WORDS1,0 INTBL? WD,P-QA-WORDS1+2,STACK >N \?PRD12 SUB N,P-QA-WORDS1 DIV STACK,2 >N GET P-QA-WORDS2,N >?TMP1 GET PTR,4 EQUAL? ?TMP1,STACK /?CTR6 ?PRD12: CALL2 SPECIAL-CONTRACTION?,PTR >SPWD ZERO? SPWD /?CCL7 ?CTR6: ZERO? SPWD /?CCL17 PUSH 8 JUMP ?CND15 ?CCL17: PUSH 4 ?CND15: ADD PTR,STACK >?TMP1 MUL L,4 COPYT ?TMP1,PTR,STACK ZERO? SPWD /?CCL20 PUT PTR,0,SPWD DEC 'L DEC 'LEN JUMP ?CND18 ?CCL20: GET P-QB-WORDS-1,N >WD PUT PTR,0,WD GET P-QB-WORDS-2,N >WD PUT PTR,P-LEXELEN,WD ?CND18: DEC 'L DEC 'LEN JUMP ?PRG1 ?CCL7: EQUAL? WD,W?APOSTROPHE \?CCL22 GET PTR,P-LEXELEN EQUAL? STACK,W?S /?CCL22 EQUAL? OPTR,PTR /?CCL22 SUB PTR,4 >WD ZERO? WD /?CCL22 GETB WD,2 ADD -1,STACK >?TMP1 GETB WD,3 ADD ?TMP1,STACK GETB P-INBUF,STACK EQUAL? STACK,115,122 \?CCL22 SUB PTR,P-LEXV DIV STACK,2 ADD P-LEXELEN,STACK ICALL MAKE-ROOM-FOR-TOKENS,1,P-LEXV,STACK PUT PTR,P-LEXELEN,W?S INC 'L INC 'LEN JUMP ?PRG1 ?CCL22: ADD PTR,4 >PTR JUMP ?PRG1 .FUNCT TELL-THE:ANY:1:1,OBJ,TMP EQUAL? OBJ,PLAYER \?CCL3 PRINTI "you" RTRUE ?CCL3: CALL2 GET-OWNER,OBJ >TMP ZERO? TMP /?CCL6 EQUAL? TMP,PLAYER \?CCL9 PRINTI "your " JUMP ?CND4 ?CCL9: EQUAL? TMP,OBJ /?CND4 ICALL2 TELL-THE,TMP PRINTI "'s " JUMP ?CND4 ?CCL6: FSET? OBJ,NARTICLEBIT /?CND4 PRINTI "the " ?CND4: PRINTD OBJ RTRUE .FUNCT TELL-CTHE:ANY:1:1,OBJ,TMP EQUAL? OBJ,PLAYER \?CCL3 PRINTI "You" RTRUE ?CCL3: CALL2 GET-OWNER,OBJ >TMP ZERO? TMP /?CCL6 EQUAL? TMP,PLAYER \?CCL9 PRINTI "Your " JUMP ?CND4 ?CCL9: EQUAL? TMP,OBJ /?CND4 ICALL2 TELL-CTHE,TMP PRINTI "'s " JUMP ?CND4 ?CCL6: FSET? OBJ,NARTICLEBIT /?CND4 PRINTI "The " ?CND4: PRINTD OBJ RTRUE .FUNCT NAKED-DIR?:ANY:0:0,WCNUM,LEN GET TLEXV,0 >LEN ZERO? LEN /FALSE GET LEN,4 >WCNUM ZERO? WCNUM \?CND3 GET LEN,3 >LEN GET LEN,4 >WCNUM ?CND3: BTST WCNUM,32768 /FALSE BAND WCNUM,64 BAND STACK,32767 ZERO? STACK /FALSE EQUAL? P-LEN,1 \?CCL11 RETURN LEN ?CCL11: SUB TLEXV,P-LEXV LESS? STACK,234 /?CND9 RETURN LEN ?CND9: GET TLEXV,P-LEXELEN >WCNUM EQUAL? WCNUM,W?COMMA,W?AND \?CND13 RETURN LEN ?CND13: GET WCNUM,4 >WCNUM BAND WCNUM,32768 EQUAL? STACK,-32768 \FALSE BAND WCNUM,32776 BAND STACK,32767 ZERO? STACK /FALSE RETURN LEN .FUNCT PARSER:ANY:0:0,OWINNER,LEN,N,PV,?TMP1 ZERO? P-DBUG /?CND2 PRINTI "[Reset of PMEM: " PRINTN PMEM-WORDS-USED PRINTI " words used.] " ?CND2: ICALL1 PMEM-RESET SET 'ERROR-PRIORITY,255 SET 'ERROR-STRING,FALSE-VALUE SET 'OWINNER,WINNER GRTR? P-CONT,0 \?CCL6 SET 'TLEXV,P-CONT ZERO? VERBOSITY /?CND7 EQUAL? PLAYER,WINNER \?CND7 CRLF ?CND7: SET 'P-CONT,FALSE-VALUE JUMP ?CND4 ?CCL6: SET 'WINNER,PLAYER ZERO? P-OFLAG \?CND11 GET OOPS-TABLE,O-PTR ZERO? STACK \?CND11 PUT OOPS-TABLE,O-END,FALSE-VALUE ?CND11: LOC WINNER IN? STACK,ROOMS \?CND15 LOC WINNER >HERE ?CND15: ZERO? LIT /?CCL18 EQUAL? HERE,LIT /?CND17 IN? LIT,HERE /?CND17 CALL2 VISIBLE?,LIT ZERO? STACK \?CND17 ?CCL18: CALL1 LIT? >LIT ?CND17: GET 0,8 BTST STACK,F-REFRESH \?CND24 ICALL1 V-$REFRESH ?CND24: ZERO? VERBOSITY /?CND26 CRLF ?CND26: ICALL1 UPDATE-STATUS-LINE ICALL1 READ-INPUT GETB P-LEXV,P-LEXWORDS >LEN ZERO? LEN /?CND29 INTBL? W?QUOTE,P-LEXV+2,LEN,132 >N \?CND29 ICALL FIX-QUOTATIONS,LEN,N ?CND29: ICALL1 EXPAND-BE-CONTRACTIONS GETB P-LEXV,P-LEXWORDS >P-LEN SET 'TLEXV,P-LEXV+2 ?CND4: GET TLEXV,0 EQUAL? STACK,W?PERIOD,W?THEN \?CND33 ADD TLEXV,4 >TLEXV DEC 'P-LEN ?CND33: GET TLEXV,0 EQUAL? STACK,W?YOU \?CND35 ICALL1 IGNORE-FIRST-WORD ?CND35: GET TLEXV,0 EQUAL? STACK,W?GO,W?TO \?CND37 ICALL1 IGNORE-FIRST-WORD ?CND37: ZERO? P-LEN \?CND39 ICALL1 BEG-PARDON RFALSE ?CND39: CALL1 NAKED-DIR? >LEN ZERO? LEN /?CCL43 PUT STATE-STACK,0,20 PUT DATA-STACK,0,20 XPUSH LEN,DATA-STACK /?BOGUS44 ?BOGUS44: ICALL2 RED-SD,1 SET 'P-CONT,FALSE-VALUE SET 'P-OFLAG,0 SET 'P-WORDS-AGAIN,1 PUT OOPS-TABLE,O-END,FALSE-VALUE PUT OOPS-TABLE,O-START,TLEXV PUTB P-LEXV,P-LEXWORDS,P-LEN COPYT P-LEXV,G-LEXV,LEXV-LENGTH-BYTES COPYT P-INBUF,G-INBUF,61 PUT PARSE-RESULT,13,0 DEC 'P-LEN LESS? 0,P-LEN \TRUE ADD TLEXV,4 >TLEXV GET TLEXV,0 >LEN ZERO? LEN /TRUE GET LEN,4 >LEN ZERO? LEN /TRUE BAND LEN,32768 EQUAL? STACK,-32768 \TRUE BAND LEN,32776 BAND STACK,32767 ZERO? STACK /TRUE SET 'P-WORDS-AGAIN,P-WORD-NUMBER DLESS? 'P-LEN,1 /TRUE ADD TLEXV,4 >P-CONT RTRUE ?CCL43: GET TLEXV,0 EQUAL? STACK,W?OOPS,W?O \?CCL55 CALL2 DO-OOPS,OWINNER ZERO? STACK \?CND41 RFALSE ?CCL55: ZERO? P-OFLAG \?CND41 LESS? P-CONT,1 \?CND41 PUT OOPS-TABLE,O-END,FALSE-VALUE ?CND41: SET 'P-CONT,FALSE-VALUE GET TLEXV,0 EQUAL? STACK,W?AGAIN,W?G \?CCL63 CALL2 DO-AGAIN,OWINNER ZERO? STACK \?CND61 RFALSE ?CCL63: PUTB P-LEXV,P-LEXWORDS,P-LEN COPYT P-LEXV,G-LEXV,LEXV-LENGTH-BYTES COPYT P-INBUF,G-INBUF,61 PUT OOPS-TABLE,O-START,TLEXV PUT OOPS-TABLE,O-LENGTH,P-LEN GET OOPS-TABLE,O-END ZERO? STACK \?CND61 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 ?CND61: SET 'P-WON,FALSE-VALUE SET 'P-WALK-DIR,FALSE-VALUE CALL2 PARSE-IT,FALSE-VALUE >PV ?PRG68: ZERO? PV \?CCL72 CALL1 PRINT-PARSER-FAILURE >PV JUMP ?PRG68 ?CCL72: EQUAL? PV,1 /FALSE PUT OOPS-TABLE,O-PTR,FALSE-VALUE GET PV,4 >PRSA CALL1 GAME-VERB? ZERO? STACK \?CND75 SET 'P-OFLAG,0 ?CND75: GET PV,0 >LEN EQUAL? LEN,W?TWICE,W?THRICE \?CND77 GET OOPS-TABLE,O-START INTBL? LEN,STACK,P-WORDS-AGAIN,132 >N \?CND77 ICALL CHANGE-LEXV,N,W?ONCE EQUAL? LEN,W?THRICE \?CCL83 PUSH 2 JUMP ?CND81 ?CCL83: PUSH 1 ?CND81: ICALL2 DO-IT-AGAIN,STACK CALL2 PARSE-IT,FALSE-VALUE >PV JUMP ?PRG68 ?CND77: GET GWIM-MSG,1 ZERO? STACK /?CND84 ICALL1 TELL-GWIM-MSG PUT GWIM-MSG,1,0 ?CND84: GET GWIM-MSG,2 ZERO? STACK /TRUE PRINTI "[""" GET GWIM-MSG,2 ICALL2 NP-PRINT,STACK PRINTI """ meaning " GET GWIM-MSG,3 ICALL2 TELL-THE,STACK PRINTI "] " PUT GWIM-MSG,2,0 RTRUE .FUNCT GAME-VERB?:ANY:0:0 GET GAME-VERB-TABLE,0 INTBL? PRSA,GAME-VERB-TABLE+2,STACK /TRUE EQUAL? PRSA,V?$UNRECORD /TRUE EQUAL? PRSA,V?$RECORD,V?$COMMAND,V?$RANDOM /TRUE RFALSE .FUNCT RED-SD:ANY:0:2,N,TYP,V,SYN,NEW-OBJECT SET 'V,W?WALK PUT PARSE-RESULT,1,V GET V,3 GET STACK,2 ADD STACK,2 >SYN PUT PARSE-RESULT,3,SYN GET SYN,0 PUT PARSE-RESULT,4,STACK PUT PARSE-RESULT,7,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 P-P:ANY:1:1,X CALL2 PMEM?,X ZERO? STACK /?CCL3 GETB X,1 EQUAL? STACK,1 \?CCL6 PRINTI "#ADJS[" ICALL2 ADJS-PRINT,X PRINTC 93 RTRUE ?CCL6: GETB X,1 EQUAL? STACK,2 \?CCL8 PRINTI "#NP[" ICALL2 NP-PRINT,X PRINTC 93 RTRUE ?CCL8: GETB X,1 EQUAL? STACK,3 \?CCL10 PRINTI "#NPP[" ?PRG11: GET X,2 ZERO? STACK /?CND13 GET X,2 ICALL2 P-P,STACK PRINTC 32 ?CND13: GET X,3 ZERO? STACK /?CND15 GET X,3 ICALL2 P-P,STACK PRINTC 32 ?CND15: GET X,1 >X ZERO? X \?PRG11 PRINTC 93 RTRUE ?CCL10: GETB X,1 EQUAL? STACK,4 \?CCL20 PRINTI "#NOUN-PHRASE[" ICALL2 NP-PRINT,X PRINTC 93 RTRUE ?CCL20: GETB X,1 EQUAL? STACK,5 /?CTR21 GETB X,1 EQUAL? STACK,6 \?CCL22 ?CTR21: PRINTI "#PP[" PRINTI "W?" GET X,1 PRINTB STACK PRINTC 32 GET X,2 ICALL2 P-P,STACK PRINTC 93 RTRUE ?CCL22: PRINTI "#PMEM[]" RTRUE ?CCL3: EQUAL? X,PARSE-RESULT \?CCL26 PRINTI "RESULT" RTRUE ?CCL26: LESS? VOCAB,PRSTBL \?PRD30 LESS? VOCAB,X \?PRD30 LESS? X,PRSTBL /?CTR27 ?PRD30: LESS? 0,VOCAB \?CCL28 LESS? PRSTBL,0 \?CCL28 LESS? VOCAB,X /?CTR27 LESS? X,PRSTBL \?CCL28 ?CTR27: PRINTI "W?" PRINTB X RTRUE ?CCL28: PRINTN X RTRUE .FUNCT PARSE-IT:ANY:0:1,V,RES,NUM,W,SAV-LEXV,TMP,TV,T2,?TMP1 SET 'SPLITS,0 PUT SPLIT-STACK,0,0 SET 'ERROR-PRIORITY,255 PUT ERROR-ARGS,1,0 SET 'P-OLEN,P-LEN SET 'OTLEXV,TLEXV SET 'W,WINNER SET 'SAV-LEXV,TLEXV ?PRG1: INC 'NUM ZERO? P-DBUG /?CND3 PRINTI "[PASS " PRINTN NUM PRINTI "] " ?CND3: ICALL2 BE-PATIENT,NUM PUT STATE-STACK,0,20 XPUSH 1,STATE-STACK /?BOGUS5 ?BOGUS5: PUT DATA-STACK,0,20 ZERO? P-DBUG /?CND6 PRINTI "[Reset of PMEM: " PRINTN PMEM-WORDS-USED PRINTI " words used.] " ?CND6: ICALL1 PMEM-RESET SET 'P-WORD-NUMBER,0 SET 'TLEXV,SAV-LEXV SET 'P-LEN,P-OLEN SET 'WINNER,W COPYT GWIM-MSG,0,8 COPYT PARSE-RESULT,0,PARSE-RESULT-LEN CALL2 PARSE-SENTENCE,PARSE-RESULT >RES EQUAL? RES,PARSER-RESULT-AGAIN \?CCL10 PUT SPLIT-STACK,0,0 SET 'ERROR-PRIORITY,255 SET 'P-OLEN,P-LEN SET 'SAV-LEXV,TLEXV JUMP ?PRG1 ?CCL10: LESS? RES,PARSER-RESULT-WON \?REP2 GET SPLIT-STACK,0 ZERO? STACK /?REP2 ZERO? RES /?REP2 ?PRG16: GET SPLIT-STACK,0 >T2 SUB T2,1 GET SPLIT-STACK,STACK >TV BAND TV,65280 ZERO? STACK /?CCL20 GET SPLIT-STACK,T2 >TMP BTST TMP,32768 /?CCL23 ADD TV,6 CALL GET-TERMINAL-ACTION,TMP,STACK,1 >TV JUMP ?CND21 ?CCL23: BAND TMP,32767 >?TMP1 ADD TV,6 CALL GET-TERMINAL-ACTION,?TMP1,STACK,0 >TV ?CND21: ZERO? TV \?CCL26 SUB T2,2 >T2 PUT SPLIT-STACK,0,T2 JUMP ?CND18 ?CCL26: SUB T2,1 PUT SPLIT-STACK,STACK,TV JUMP ?REP17 ?CCL20: GET SPLIT-STACK,T2 >TMP EQUAL? TMP,TV \?CCL28 SUB T2,2 >T2 PUT SPLIT-STACK,0,T2 ?CND18: ZERO? T2 \?PRG16 ?REP17: GET SPLIT-STACK,0 ZERO? STACK /?REP2 ZERO? P-DBUG /?PRG1 PRINTI "[Splits left (SPLIT ptr = " GET SPLIT-STACK,0 PRINTN STACK PRINTI "), trying again...] " JUMP ?PRG1 ?CCL28: ADD 1,TMP PUT SPLIT-STACK,T2,STACK JUMP ?REP17 ?REP2: ZERO? P-RESPONDED /?CND35 SUB 0,NUM ICALL2 BE-PATIENT,STACK ?CND35: EQUAL? RES,PARSER-RESULT-WON \?CCL39 RETURN PARSER-RESULT ?CCL39: ZERO? RES /TRUE RFALSE .FUNCT PARSE-SENTENCE:ANY:1:1,PR,SPLIT-NUM,RES,WCN,CURRENT-TOKEN,OLD-WCN,CAV,OFFS,T2,CURRENT-ACTION,REDUCTION,N,?TMP1 SET 'SPLIT-NUM,-1 GET TLEXV,0 >CURRENT-TOKEN CATCH >PARSE-SENTENCE-ACTIVATION ZERO? CURRENT-TOKEN \?CND1 CALL2 UNKNOWN-WORD,TLEXV >CURRENT-TOKEN ZERO? CURRENT-TOKEN \?CND1 RETURN PARSER-RESULT-DEAD ?CND1: ZERO? P-DBUG /?CND5 PRINTI "[Next token: " PRINTB CURRENT-TOKEN PRINTI "; WCN " GET CURRENT-TOKEN,4 PRINTN STACK PRINTI "] " ?CND5: GET CURRENT-TOKEN,4 >WCN SET 'OLD-WCN,WCN ?PRG7: EQUAL? CURRENT-TOKEN,W?S \?CND9 SUB TLEXV,4 GET STACK,0 EQUAL? STACK,W?APOSTROPHE \?CND9 SET 'OLD-WCN,32 SET 'WCN,OLD-WCN ?CND9: ZERO? WCN \?CCL15 GET CURRENT-TOKEN,3 ZERO? STACK \?CCL18 CALL BUZZER-WORD?,CURRENT-TOKEN,TLEXV ZERO? STACK /?CND19 MUL P-LEXELEN,P-WORD-NUMBER ADD STACK,P-LEXSTART PUT OOPS-TABLE,O-PTR,STACK RETURN PARSER-RESULT-DEAD ?CND19: SET 'CAV,FALSE-VALUE JUMP ?CND13 ?CCL18: GET CURRENT-TOKEN,3 >CURRENT-TOKEN GET CURRENT-TOKEN,4 >OLD-WCN SET 'WCN,OLD-WCN JUMP ?PRG7 ?CCL15: BTST OLD-WCN,32768 /?CCL23 SET 'OFFS,1 JUMP ?CND21 ?CCL23: SET 'OFFS,0 ?CND21: CALL2 PEEK-PSTACK,STATE-STACK GET ACTION-TABLE,STACK GET STACK,0 CALL GET-TERMINAL-ACTION,WCN,STACK,OFFS >CAV ZERO? CAV /?CND24 BAND WCN,32767 >?TMP1 GET CAV,OFFS BCOM STACK BAND ?TMP1,STACK ZERO? STACK /?CND24 ADD CAV,6 CALL GET-TERMINAL-ACTION,WCN,STACK,OFFS ZERO? STACK /?CND24 ADD SPLIT-NUM,2 >SPLIT-NUM ADD SPLIT-NUM,1 GET SPLIT-STACK,0 >T2 GRTR? STACK,T2 \?CCL31 INC 'SPLITS INC 'T2 LESS? T2,21 /?CND32 ICALL1 P-NO-MEM-ROUTINE ?CND32: PUT SPLIT-STACK,0,T2 PUT SPLIT-STACK,T2,CAV INC 'T2 LESS? T2,21 /?CND34 ICALL1 P-NO-MEM-ROUTINE ?CND34: PUT SPLIT-STACK,0,T2 BAND OLD-WCN,32768 BOR STACK,WCN PUT SPLIT-STACK,T2,STACK ZERO? P-DBUG /?CND24 PRINTI "[New split on a" PRINTI " word" PRINTI " (split #" PRINTN SPLITS PRINTI ") at depth " DIV T2,2 PRINTN STACK PRINTI "; word class: " PRINTN WCN PRINTI "; left: " BAND WCN,32767 >?TMP1 GET CAV,OFFS BCOM STACK BAND ?TMP1,STACK PRINTN STACK PRINTI ".] " JUMP ?CND24 ?CCL31: SUB SPLIT-NUM,1 GET SPLIT-STACK+2,STACK >CAV ZERO? CAV /?CND24 ZERO? P-DBUG /?CND40 PRINTI "[Old split on a word (split #" PRINTN SPLITS PRINTI ") at depth " DIV T2,2 PRINTN STACK PRINTI "; word class: " PRINTN WCN PRINTI "; using: " ?CND40: ZERO? P-DBUG /?CND24 ZERO? CAV /?CCL46 BAND WCN,32767 >?TMP1 GET CAV,OFFS BAND ?TMP1,STACK PRINTN STACK JUMP ?CND44 ?CCL46: PRINTN 0 ?CND44: PRINTI "] " ?CND24: ZERO? CAV \?CND47 ZERO? P-DBUG /?CND49 PRINTI "[A parse loses.] " ?CND49: RETURN PARSER-RESULT-FAILED ?CND47: ZERO? P-DBUG /?CND51 BAND WCN,32767 >?TMP1 GET CAV,OFFS BCOM STACK BAND ?TMP1,STACK ZERO? STACK /?CND51 PRINTI "[Current WCN is " GET CAV,OFFS BAND WCN,STACK PRINTN STACK PRINTC 93 CRLF ?CND51: GET CAV,OFFS BAND WCN,STACK >WCN ?CND13: ZERO? CAV /?PST56 GET CAV,2 >CURRENT-ACTION JUMP ?PRG58 ?PST56: SET 'CURRENT-ACTION,0 ?PRG58: ZERO? CAV /?CCL62 BAND CURRENT-ACTION,65280 ZERO? STACK /?CCL62 ADD SPLIT-NUM,2 >SPLIT-NUM ADD SPLIT-NUM,1 GET SPLIT-STACK,0 >T2 GRTR? STACK,T2 \?CCL67 INC 'SPLITS INC 'T2 LESS? T2,21 /?CND68 ICALL1 P-NO-MEM-ROUTINE ?CND68: PUT SPLIT-STACK,0,T2 GETB CURRENT-ACTION,0 PUT SPLIT-STACK,T2,STACK INC 'T2 LESS? T2,21 /?CND70 ICALL1 P-NO-MEM-ROUTINE ?CND70: PUT SPLIT-STACK,0,T2 PUT SPLIT-STACK,T2,1 ZERO? P-DBUG /?CND72 PRINTI "[New split on a" PRINTI "n action" PRINTI " (split #" PRINTN SPLITS PRINTI ") at depth " DIV T2,2 PRINTN STACK PRINTI ", " GETB CURRENT-ACTION,0 PRINTN STACK PRINTI " cases.] " ?CND72: GETB CURRENT-ACTION,1 >CURRENT-ACTION JUMP ?CND65 ?CCL67: GET SPLIT-STACK+2,SPLIT-NUM GETB CURRENT-ACTION,STACK >CURRENT-ACTION ?CND65: ZERO? P-DBUG /?CND60 PRINTI "[Using action " PRINTN CURRENT-ACTION PRINTI ".] " JUMP ?CND60 ?CCL62: ZERO? CAV /?CND60 ZERO? CURRENT-ACTION \?CND60 ZERO? P-DBUG /?CND79 PRINTI "[A parse loses.] " ?CND79: RETURN PARSER-RESULT-FAILED ?CND60: ZERO? CAV /?CTR82 LESS? CURRENT-ACTION,128 \?CCL83 ?CTR82: ZERO? CAV /?CND86 ZERO? P-DBUG /?CND88 PRINTI "[Pushing: " PRINTB CURRENT-TOKEN PRINTI "; new state " PRINTN CURRENT-ACTION PRINTI "] " ?CND88: XPUSH CURRENT-TOKEN,DATA-STACK \?CCL92 XPUSH CURRENT-ACTION,STATE-STACK /?CND86 ?CCL92: ICALL1 P-NO-MEM-ROUTINE ?CND86: DLESS? 'P-LEN,1 \?CCL97 SET 'CURRENT-TOKEN,W?END.OF.INPUT ADD 1,P-WORD-NUMBER >P-WORDS-AGAIN SET 'P-CONT,FALSE-VALUE SET 'P-LEN,0 JUMP ?CND95 ?CCL97: INC 'P-WORD-NUMBER ADD TLEXV,4 >TLEXV GET TLEXV,0 >CURRENT-TOKEN GRTR? TLEXV,OTLEXV \?CND95 SET 'OTLEXV,TLEXV ?CND95: ZERO? CURRENT-TOKEN \?CCL102 CALL2 UNKNOWN-WORD,TLEXV >CURRENT-TOKEN ZERO? CURRENT-TOKEN \?CND100 RETURN PARSER-RESULT-DEAD ?CCL102: EQUAL? CURRENT-TOKEN,W?THEN,W?!,W?PERIOD /?CCL105 EQUAL? CURRENT-TOKEN,W?? \?CND100 ?CCL105: SET 'P-WORDS-AGAIN,P-WORD-NUMBER DLESS? 'P-LEN,1 /?CCL110 ADD TLEXV,4 >P-CONT JUMP ?CND100 ?CCL110: SET 'P-CONT,FALSE-VALUE ?CND100: GET CURRENT-TOKEN,4 >OLD-WCN SET 'WCN,OLD-WCN ZERO? P-DBUG /?PRG7 PRINTI "[Next token: " PRINTB CURRENT-TOKEN PRINTI "; WCN " PRINTN WCN PRINTI "] " JUMP ?PRG7 ?CCL83: GRTR? CURRENT-ACTION,128 \?CCL114 SUB CURRENT-ACTION,129 GET REDUCTION-TABLE,STACK >REDUCTION ZERO? P-DBUG /?CND117 PRINTI "[Reducing " GET REDUCTION,5 PRINT STACK CRLF PRINTI "Args:" GET REDUCTION,0 >N ?PRG119: DLESS? 'N,0 \?CND121 PRINTI " ..." ?CND117: GET REDUCTION,0 >RES ZERO? RES /?CND123 FSTACK RES,STATE-STACK ?CND123: SET 'CURRENT-REDUCTION,REDUCTION SET 'P-RUNNING,TLEXV GET REDUCTION,1 >?TMP1 GET REDUCTION,0 CALL ?TMP1,STACK >RES SET 'TLEXV,P-RUNNING GRTR? TLEXV,OTLEXV \?CND125 SET 'OTLEXV,TLEXV ?CND125: LESS? P-LEN,1 \?CCL129 SET 'CURRENT-TOKEN,W?END.OF.INPUT GET CURRENT-TOKEN,4 >OLD-WCN SET 'WCN,OLD-WCN JUMP ?CND127 ?CND121: PRINTC 32 CALL PEEK-PSTACK,DATA-STACK,N ICALL2 P-P,STACK JUMP ?PRG119 ?CCL129: GET TLEXV,0 EQUAL? CURRENT-TOKEN,STACK /?CND127 GET TLEXV,0 >CURRENT-TOKEN GET CURRENT-TOKEN,4 >OLD-WCN SET 'WCN,OLD-WCN ?CND127: SET 'CURRENT-REDUCTION,FALSE-VALUE ZERO? RES \?CTR132 RETURN PARSER-RESULT-FAILED ?CTR132: XPUSH RES,DATA-STACK /?CND131 ICALL1 P-NO-MEM-ROUTINE ?CND131: CALL2 PEEK-PSTACK,STATE-STACK GET ACTION-TABLE,STACK >?TMP1 GET REDUCTION,4 CALL GET-NONTERMINAL-ACTION,?TMP1,STACK XPUSH STACK,STATE-STACK /?CND136 ICALL1 P-NO-MEM-ROUTINE ?CND136: ZERO? P-DBUG /?PRG7 PRINTI " result: " ICALL2 P-P,RES PRINTI ", new state " CALL2 PEEK-PSTACK,STATE-STACK PRINTN STACK PRINTI "] " JUMP ?PRG7 ?CCL114: POP DATA-STACK >PARSER-RESULT RETURN PARSER-RESULT-WON .FUNCT GET-TERMINAL-ACTION:ANY:3:3,TYPE,STATE,OFFS,V ZERO? STATE /FALSE BAND TYPE,32767 >TYPE SET 'V,STATE ?PRG4: GET V,0 ZERO? STACK \?CND6 GET V,1 ZERO? STACK /FALSE ?CND6: GET V,OFFS BAND TYPE,STACK ZERO? STACK /?CND10 RETURN V ?CND10: ADD V,6 >V JUMP ?PRG4 .FUNCT GET-NONTERMINAL-ACTION:ANY:2:2,STATE,TYPE,V GET STATE,1 ZERO? STACK /FALSE GET STATE,1 >V ?PRG4: GETB V,0 ZERO? STACK /FALSE GETB V,0 EQUAL? STACK,TYPE \?CND6 GETB V,1 RSTACK ?CND6: ADD V,2 >V JUMP ?PRG4 .FUNCT BE-PATIENT:ANY:1:1,NUM,LIM SET 'LIM,16 GETB 0,30 EQUAL? STACK,APPLE-2E,APPLE-2C,APPLE-2GS \?CND1 SET 'LIM,4 ?CND1: LESS? NUM,0 \?CCL5 ZERO? P-DBUG /?CND6 PRINTI "[Total: " SUB 0,NUM PRINTN STACK PRINTI " passes.] " ?CND6: SUB 1,LIM LESS? NUM,STACK \FALSE ZERO? P-RESPONDED /FALSE SET 'P-RESPONDED,0 BUFOUT TRUE-VALUE PRINTR "]" ?CCL5: MOD NUM,LIM ZERO? STACK \FALSE EQUAL? NUM,LIM \?CCL17 SET 'P-RESPONDED,LIM PRINTI "[Please be patient..." JUMP ?CND15 ?CCL17: ZERO? P-RESPONDED /?CND15 PRINTC 46 ?CND15: BUFOUT FALSE-VALUE RTRUE .FUNCT MAIN-LOOP:ANY:0:0,X ?PRG1: CALL1 MAIN-LOOP-1 >X JUMP ?PRG1 .FUNCT MAIN-LOOP-1:ANY:0:0,ICNT,OCNT,NUM,OBJ,V,OBJ1,NP,NP1,XX,CNT,TMP CALL1 PARSER >P-WON ZERO? P-WON /?CCL3 ?PRG4: GET PARSE-RESULT,4 >PRSA EQUAL? PRSA,V?UNDO \?CCL8 SET 'PRSS,FALSE-VALUE SET 'PRSQ,FALSE-VALUE CALL2 PERFORM,PRSA RSTACK ?CCL8: ISAVE >P-CAN-UNDO EQUAL? P-CAN-UNDO,2 \?CND6 EQUAL? PRSA,V?SAVE \?CCL13 ICALL1 CANT-UNDO RFALSE ?CCL13: SET 'P-CONT,-1 ICALL1 V-$REFRESH RFALSE ?CND6: GET PARSE-RESULT,5 >P-PRSO GET PARSE-RESULT,6 >P-PRSI ZERO? P-PRSO /?CCL17 GET P-PRSO,3 EQUAL? INTDIR,STACK \?CCL17 GET P-PRSO,4 GET STACK,2 GETB STACK,6 >P-DIRECTION JUMP ?CND15 ?CCL17: ZERO? P-PRSI /?CND15 GET P-PRSI,3 EQUAL? INTDIR,STACK \?CND15 GET P-PRSI,4 GET STACK,2 GETB STACK,6 >P-DIRECTION ?CND15: GET PARSE-RESULT,1 >P-PRSA-WORD SET 'CLOCK-WAIT,FALSE-VALUE SET 'ICNT,0 SET 'OCNT,0 ZERO? P-PRSI /?CND23 GET P-PRSI,1 >ICNT ZERO? ICNT /?CND23 SET 'P-MULT,ICNT ?CND23: ZERO? P-PRSO /?CND27 GET P-PRSO,1 >OCNT ZERO? OCNT /?CND27 SET 'P-MULT,OCNT ?CND27: ZERO? OCNT \?CCL33 ZERO? ICNT /?CND31 ?CCL33: EQUAL? PRSA,V?WALK /?CND31 ZERO? P-IT-OBJECT /?CND31 ZERO? ICNT /?CND39 ICALL MAIN-LOOP-IT,ICNT,P-PRSI ?CND39: ZERO? OCNT /?CND31 ICALL MAIN-LOOP-IT,OCNT,P-PRSO ?CND31: ZERO? OCNT \?CCL45 SET 'NUM,OCNT JUMP ?CND43 ?CCL45: GRTR? OCNT,1 \?CCL47 ZERO? ICNT \?CCL50 SET 'OBJ,FALSE-VALUE JUMP ?CND48 ?CCL50: GET P-PRSI,3 >OBJ GET P-PRSI,4 >NP ?CND48: SET 'NUM,OCNT JUMP ?CND43 ?CCL47: GRTR? ICNT,1 \?CCL54 GET P-PRSO,3 >OBJ GET P-PRSI,4 >NP SET 'NUM,ICNT JUMP ?CND43 ?CCL54: SET 'NUM,1 ?CND43: ZERO? OBJ \?CND57 EQUAL? ICNT,1 \?CND57 GET P-PRSI,3 >OBJ GET P-PRSI,4 >NP ?CND57: GET PARSE-RESULT,12 >V ZERO? V /?CND63 GET V,1 LESS? 1,STACK \?CND63 GET V,2 ZERO? STACK \?CND63 PUT V,2,1 GET V,3 PRINTD STACK PRINTI ": " ?CND63: GET PARSE-RESULT,15 >V ZERO? V /?CCL70 GET V,0 >PRSQ JUMP ?CND68 ?CCL70: SET 'PRSQ,FALSE-VALUE ?CND68: GET PARSE-RESULT,13 >XX ZERO? XX /?CCL73 GET XX,3 >PRSS JUMP ?CND71 ?CCL73: SET 'PRSS,FALSE-VALUE ?CND71: ZERO? LIT \?CCL76 CALL1 SEE-VERB? ZERO? STACK /?CCL76 ICALL1 TELL-TOO-DARK SET 'P-CONT,-1 JUMP ?CND74 ?CCL76: EQUAL? PRSA,V?WALK \?CCL80 ZERO? P-WALK-DIR /?PRD83 PUSH P-WALK-DIR JUMP ?PEN81 ?PRD83: GET P-PRSO,3 ?PEN81: CALL PERFORM,PRSA,STACK >V JUMP ?CND74 ?CCL80: ZERO? NUM \?CCL85 CALL2 PERFORM,PRSA >V SET 'PRSO,FALSE-VALUE SET 'PRSO-NP,FALSE-VALUE JUMP ?CND74 ?CCL85: GRTR? OCNT,1 \?CCL87 EQUAL? PRSA,V?COUNT \?CCL87 CALL PERFORM,PRSA,ROOMS >V JUMP ?CND74 ?CCL87: SET 'CNT,-1 SET 'TMP,0 ?PRG90: INC 'CNT LESS? CNT,NUM /?CND92 ZERO? TMP \?CND74 ICALL1 MORE-SPECIFIC JUMP ?CND74 ?CND92: MUL CNT,2 ADD NOUN-PHRASE-HEADER-LEN,STACK >XX GRTR? ICNT,1 /?CCL98 GET P-PRSO,XX >OBJ1 ADD 1,XX GET P-PRSO,STACK >NP1 JUMP ?CND96 ?CCL98: GET P-PRSI,XX >OBJ1 ADD 1,XX GET P-PRSI,STACK >NP1 ?CND96: GRTR? NUM,1 /?CCL100 GET NP1,3 EQUAL? STACK,NP-QUANT-ALL \?CND99 ?CCL100: CALL PERF-MANY,OBJ1,OBJ,NP1,STR?220 ZERO? STACK /?PRG90 ?CND99: SET 'TMP,TRUE-VALUE GRTR? ICNT,1 /?CCL107 SET 'PRSO,OBJ1 SET 'PRSO-NP,NP1 SET 'PRSI,OBJ SET 'PRSI-NP,NP JUMP ?CND105 ?CCL107: SET 'PRSO,OBJ SET 'PRSO-NP,NP SET 'PRSI,OBJ1 SET 'PRSI-NP,NP1 ?CND105: EQUAL? IT,PRSI,PRSO,PRSS \?CND108 CALL FIX-HIM-HER-IT,IT,P-IT-OBJECT ZERO? STACK /?PRG90 ?CND108: EQUAL? HER,PRSI,PRSO,PRSS \?CND112 CALL FIX-HIM-HER-IT,HER,P-HER-OBJECT ZERO? STACK /?PRG90 ?CND112: EQUAL? HIM,PRSI,PRSO,PRSS \?CND116 CALL FIX-HIM-HER-IT,HIM,P-HIM-OBJECT ZERO? STACK /?PRG90 ?CND116: EQUAL? THEM,PRSI,PRSO,PRSS \?CND120 CALL FIX-HIM-HER-IT,THEM,P-THEM-OBJECT ZERO? STACK /?PRG90 ?CND120: ICALL2 QCONTEXT-CHECK,PRSO GET PARSE-RESULT,3 GETB STACK,5 >XX ZERO? PRSO /?CND124 BTST XX,128 /?CND124 BTST XX,192 /?CND124 CALL2 META-LOC,PRSO >V ZERO? V /?CND124 IN? V,ROOMS \?CND124 CALL2 META-LOC,WINNER CALL GLOBAL-IN?,PRSO,STACK ZERO? STACK \?CND124 CALL2 META-LOC,WINNER EQUAL? V,STACK /?CND124 ICALL2 NOT-HERE,PRSO JUMP ?PRG90 ?CND124: ZERO? PRSO /?CND133 BAND XX,96 ZERO? STACK /?CND133 BTST XX,128 /?CND133 CALL ITAKE-CHECK,PRSO,XX >V EQUAL? M-FATAL,V /?CND74 ZERO? V \?PRG90 ?CND133: ZERO? PRSI /?CND143 GET PARSE-RESULT,3 GETB STACK,9 >XX BAND 96,XX ZERO? STACK /?CND143 BTST XX,128 /?CND143 CALL ITAKE-CHECK,PRSI,XX >V EQUAL? M-FATAL,V /?CND74 ZERO? V \?PRG90 ?CND143: CALL PERFORM,PRSA,PRSO,PRSI >V EQUAL? M-FATAL,V /?CND74 EQUAL? P-CONT,-1 \?PRG90 ?CND74: SET 'OPRSO,PRSO ZERO? CLOCK-WAIT \?CND157 CALL1 GAME-VERB? ZERO? STACK \?CND157 LOC WINNER >V ZERO? V /?CND161 IN? V,ROOMS /?CND161 GETP V,P?ACTION CALL D-APPLY,STR?1,STACK,M-END >V ?CND161: GETP HERE,P?ACTION CALL D-APPLY,STR?1,STACK,M-END >V EQUAL? M-FATAL,V \?CND165 SET 'P-CONT,-1 ?CND165: SET 'CLOCKER-RUNNING,1 CALL1 CLOCKER >V SET 'CLOCKER-RUNNING,2 EQUAL? M-FATAL,V \?CND157 SET 'P-CONT,-1 ?CND157: GET PARSE-RESULT,12 >V ZERO? V /?CND1 GET V,1 LESS? 1,STACK \?CND1 EQUAL? P-CONT,-1 /?CND1 CALL2 HACK-TELL-1,V >V EQUAL? M-FATAL,V \?CCL177 SET 'P-CONT,-1 JUMP ?CND1 ?CCL177: ZERO? V /?CND1 JUMP ?PRG4 ?CCL3: SET 'CLOCK-WAIT,TRUE-VALUE SET 'P-CONT,FALSE-VALUE ?CND1: SET 'PRSA,FALSE-VALUE SET 'PRSO,FALSE-VALUE SET 'PRSO-NP,FALSE-VALUE SET 'PRSI,FALSE-VALUE RETURN PRSI .FUNCT PERF-MANY:ANY:4:4,OBJ1,OBJ,NP1,STR EQUAL? OBJ1,FALSE-VALUE,NOT-HERE-OBJECT \?CCL3 ICALL2 NP-PRINT,NP1 PRINT STR ICALL2 NP-CANT-SEE,NP1 RFALSE ?CCL3: GET NP1,3 EQUAL? STACK,NP-QUANT-ALL \?CCL5 CALL VERB-ALL-TEST,OBJ1,OBJ ZERO? STACK /FALSE ?CCL5: CALL2 ACCESSIBLE?,OBJ1 ZERO? STACK /FALSE EQUAL? OBJ1,PLAYER /FALSE EQUAL? OBJ1,IT \?CCL14 PRINTD P-IT-OBJECT JUMP ?CND12 ?CCL14: EQUAL? OBJ1,PSEUDO-OBJECT \?CCL16 ICALL2 NP-PRINT,NP1 JUMP ?CND12 ?CCL16: PRINTD OBJ1 ?CND12: PRINT STR RTRUE .FUNCT QCONTEXT-CHECK:ANY:1:1,PER,WHO EQUAL? PRSA,V?TELL-ABOUT,V?SHOW \FALSE EQUAL? PER,PLAYER \FALSE CALL2 FIND-A-WINNER,HERE >WHO ZERO? WHO /?CND7 SET 'QCONTEXT,WHO ?CND7: CALL1 QCONTEXT-GOOD? ZERO? STACK /FALSE EQUAL? WINNER,PLAYER \FALSE SET 'WINNER,QCONTEXT ICALL2 TELL-SAID-TO,QCONTEXT RTRUE .FUNCT LIT?:ANY:0:2,RM,RMBIT,OHERE,LT ASSIGNED? 'RM /?CND1 SET 'RM,HERE ?CND1: ASSIGNED? 'RMBIT /?CND3 SET 'RMBIT,TRUE-VALUE ?CND3: SET 'OHERE,HERE SET 'HERE,RM ZERO? RMBIT /?CCL7 FSET? RM,ONBIT \?CCL7 SET 'LT,HERE JUMP ?CND5 ?CCL7: FSET? WINNER,ONBIT \?CCL11 CALL HELD?,WINNER,RM ZERO? STACK /?CCL11 SET 'LT,WINNER JUMP ?CND5 ?CCL11: PUT SEARCH-RES,1,0 PUT SEARCH-RES,2,FALSE-VALUE PUT FINDER,0,ONBIT PUT FINDER,1,FIND-FLAGS-GWIM EQUAL? OHERE,RM \?CND14 ICALL FIND-DESCENDANTS,WINNER,7 EQUAL? WINNER,PLAYER /?CND14 IN? PLAYER,RM \?CND14 ICALL FIND-DESCENDANTS,PLAYER,7 ?CND14: GET SEARCH-RES,1 ZERO? STACK \?CND20 LOC WINNER IN? STACK,ROOMS /?CND22 LOC WINNER FSET? STACK,OPENBIT /?CND22 LOC WINNER ICALL FIND-DESCENDANTS,STACK,7 ?CND22: ICALL FIND-DESCENDANTS,RM,7 ?CND20: GET SEARCH-RES,1 LESS? 0,STACK \?CND5 GET SEARCH-RES,4 >LT ?CND5: SET 'HERE,OHERE RETURN LT .FUNCT IGNORE-FIRST-WORD:ANY:0:0,NW LESS? 1,P-LEN \FALSE GET TLEXV,P-LEXELEN >NW ZERO? NW /FALSE GET NW,4 >NW ZERO? NW /FALSE BTST NW,32768 /FALSE BAND NW,1 BAND STACK,32767 ZERO? STACK /FALSE ADD TLEXV,4 >TLEXV DEC 'P-LEN RTRUE .FUNCT FIX-QUOTATIONS:ANY:2:2,LEN,PTR,X,QFLAG SET 'QFLAG,FALSE-VALUE ?PRG1: ZERO? QFLAG \?CCL5 SET 'QFLAG,TRUE-VALUE SUB PTR,P-LEXV DIV STACK,2 ADD 2,STACK >X ICALL MAKE-ROOM-FOR-TOKENS,1,P-LEXV,X PUT P-LEXV,X,W?NO.WORD JUMP ?CND3 ?CCL5: SET 'QFLAG,FALSE-VALUE ?CND3: ADD PTR,4 >PTR SUB PTR,P-LEXV DIV STACK,4 >X GETB P-LEXV,P-LEXWORDS SUB STACK,X >LEN ZERO? LEN /TRUE INTBL? W?QUOTE,PTR,LEN,132 >PTR /?PRG1 RTRUE .FUNCT MAIN-LOOP-IT:ANY:2:2,ICNT,PRS,CNT,TOFF ?PRG1: MUL CNT,2 ADD NOUN-PHRASE-HEADER-LEN,STACK >TOFF GET PRS,TOFF EQUAL? IT,STACK \?CCL5 CALL2 ACCESSIBLE?,P-IT-OBJECT ZERO? STACK /?CCL5 PUT PRS,TOFF,P-IT-OBJECT ICALL TELL-PRONOUN,P-IT-OBJECT,IT RTRUE ?CCL5: IGRTR? 'CNT,ICNT \?PRG1 RTRUE .FUNCT P-NO-MEM-ROUTINE:ANY:0:1,TYP PRINTI "[Sorry, but that" EQUAL? TYP,7 \?CCL3 PRINTI "'s too many objects" JUMP ?CND1 ?CCL3: PRINTI " sentence is too complicated" ?CND1: PRINTI ".] " THROW PARSER-RESULT-DEAD,PARSE-SENTENCE-ACTIVATION RTRUE .FUNCT BEG-PARDON:ANY:0:0 PRINTR "[I beg your pardon?]" .FUNCT UNKNOWN-WORD:ANY:1:1,RLEXV,X CALL2 NUMBER?,RLEXV >X ZERO? X /?CCL3 RETURN X ?CCL3: PRINTI "[I don't know the word """ SUB RLEXV,P-LEXV DIV STACK,2 PUT OOPS-TABLE,O-PTR,STACK ICALL2 WORD-PRINT,RLEXV PRINTI ".""]" CRLF THROW PARSER-RESULT-DEAD,PARSE-SENTENCE-ACTIVATION RTRUE .FUNCT WORD-PRINT:ANY:1:3,PTR,LEN,OFFS ASSIGNED? 'LEN /?CND1 GETB PTR,2 >LEN ?CND1: ASSIGNED? 'OFFS /?PRG5 GETB PTR,3 >OFFS ?PRG5: DLESS? 'LEN,0 /TRUE GETB P-INBUF,OFFS PRINTC STACK INC 'OFFS JUMP ?PRG5 .FUNCT DO-OOPS:ANY:1:1,OWINNER,PTR,VAL SET 'PTR,P-LEXSTART GET TLEXV,P-LEXELEN EQUAL? STACK,W?PERIOD,W?COMMA \?CND1 ADD PTR,P-LEXELEN >PTR DEC 'P-LEN ?CND1: GRTR? P-LEN,1 /?CCL5 ICALL1 NAKED-OOPS RFALSE ?CCL5: CALL2 META-LOC,OWINNER EQUAL? HERE,STACK /?CCL7 ICALL2 NOT-HERE,OWINNER RFALSE ?CCL7: GET OOPS-TABLE,O-PTR >VAL ZERO? VAL /?CCL9 SUB P-LEN,1 ICALL REPLACE-ONE-TOKEN,STACK,P-LEXV,PTR,G-LEXV,VAL SET 'WINNER,OWINNER ICALL2 COPY-INPUT,TRUE-VALUE RTRUE ?CCL9: PUT OOPS-TABLE,O-END,FALSE-VALUE ICALL1 CANT-OOPS RFALSE .FUNCT DO-AGAIN:ANY:1:1,OWINNER,N,?TMP1,?TMP2 CALL2 META-LOC,OWINNER EQUAL? HERE,STACK /?CCL3 ICALL2 NOT-HERE,OWINNER RFALSE ?CCL3: LESS? 0,P-OFLAG /?CTR4 ZERO? P-WON /?CTR4 GETB G-INBUF,2 ZERO? STACK \?CCL5 ?CTR4: ICALL1 CANT-AGAIN RFALSE ?CCL5: GRTR? P-LEN,1 \?CND1 SUB TLEXV,P-LEXV LESS? STACK,234 \?CND1 GET TLEXV,P-LEXELEN >N EQUAL? N,W?PERIOD,W?COMMA,W?THEN /?CND1 EQUAL? N,W?AND /?CND1 ICALL1 DONT-UNDERSTAND RFALSE ?CND1: SET 'N,P-WORDS-AGAIN SET 'WINNER,OWINNER EQUAL? N,1 /?CND16 SUB N,1 ADD P-LEN,STACK >P-LEN SUB N,1 >?TMP2 SUB TLEXV,P-LEXV DIV STACK,2 >?TMP1 GET OOPS-TABLE,O-START SUB STACK,P-LEXV DIV STACK,2 ICALL MAKE-ROOM-FOR-TOKENS,?TMP2,P-LEXV,?TMP1,STACK ZERO? P-CONT /?CND16 SUB N,1 MUL STACK,4 ADD P-CONT,STACK >P-CONT ?CND16: GET OOPS-TABLE,O-START SUB STACK,P-LEXV ADD G-LEXV,STACK >?TMP1 MUL N,4 COPYT ?TMP1,TLEXV,STACK RTRUE .FUNCT NP-SAVE:ANY:1:1,ROBJ,TMP COPYT SEARCH-RES,ORPHAN-SR,20 COPYT ROBJ,ORPHAN-NP,20 GET ROBJ,5 >TMP ZERO? TMP /?CCL3 GET TMP,2 COPYT STACK,ORPHAN-NP2,10 PUT ORPHAN-NP,5,ORPHAN-NP2 JUMP ?CND1 ?CCL3: GET ROBJ,4 >TMP ZERO? TMP /?CCL5 COPYT TMP,ORPHAN-NP2,20 PUT ORPHAN-NP,4,ORPHAN-NP2 JUMP ?CND1 ?CCL5: GET ROBJ,6 >TMP ZERO? TMP /?CND1 COPYT TMP,ORPHAN-NP2,20 PUT ORPHAN-NP,6,ORPHAN-NP2 ?CND1: GET ROBJ,1 >TMP ZERO? TMP /?CCL9 COPYT TMP,ORPHAN-ADJS,18 PUT ORPHAN-NP,1,ORPHAN-ADJS GET TMP,2 >TMP GRTR? 0,TMP /?CCL12 GRTR? TMP,LAST-OBJECT /?CCL12 PUT ORPHAN-ADJS,2,TMP RETURN ORPHAN-NP ?CCL12: COPYT TMP,ORPHAN-NP2,20 PUT ORPHAN-ADJS,2,ORPHAN-NP2 RETURN ORPHAN-NP ?CCL9: PUT ORPHAN-NP,1,0 RETURN ORPHAN-NP .FUNCT PARSER-ERROR:ANY:0:5,STR,CLASS,OTHER,OTHER2,OTHER3,RP ZERO? CURRENT-REDUCTION /FALSE GET CURRENT-REDUCTION,2 >RP GRTR? ERROR-PRIORITY,RP /?CCL3 EQUAL? ERROR-PRIORITY,RP \FALSE EQUAL? CLASS,PARSER-ERROR-ORPH-NP /?CCL3 EQUAL? CLASS,PARSER-ERROR-NOUND /FALSE GET ERROR-ARGS,1 EQUAL? STACK,PARSER-ERROR-NOUND \FALSE ?CCL3: SET 'ERROR-PRIORITY,RP SET 'ERROR-STRING,STR ZERO? CLASS /?CCL14 PUT ERROR-ARGS,0,3 PUT ERROR-ARGS,1,CLASS PUT ERROR-ARGS,2,OTHER PUT ERROR-ARGS,3,OTHER2 CALL2 PMEM?,OTHER ZERO? STACK /FALSE GETB OTHER,1 EQUAL? STACK,4 \?CND17 GET OTHER,4 >OTHER ?CND17: GETB OTHER,1 EQUAL? STACK,2 \FALSE CALL2 NP-SAVE,OTHER PUT ERROR-ARGS,2,STACK EQUAL? CLASS,PARSER-ERROR-NOOBJ \FALSE GET OTHER,3 ZERO? STACK \FALSE PUT ERROR-ARGS,3,OTHER3 RFALSE ?CCL14: PUT ERROR-ARGS,0,0 RFALSE .FUNCT BUZZER-WORD?:ANY:2:2,WD,PTR,N GET P-N-WORDS,0 INTBL? WD,P-N-WORDS+2,STACK \?CCL3 PRINTR "[Use numerals for numbers, for example ""10.""]" ?CCL3: GET P-C-WORDS,0 INTBL? WD,P-C-WORDS+2,STACK \FALSE PRINTC 91 CALL2 PICK-ONE,OFFENDED PRINT STACK PRINTR "]" .FUNCT NUMBER?:ANY:1:1,RLEXV,BPTR,SUM,TIM,NEG,CHR,CNT,?TMP1 GETB RLEXV,3 >BPTR GETB RLEXV,2 >CNT ?PRG1: DLESS? 'CNT,0 /?REP2 GETB P-INBUF,BPTR >CHR EQUAL? CHR,58 \?CCL8 SET 'TIM,SUM SET 'SUM,0 JUMP ?CND6 ?CCL8: EQUAL? CHR,45 \?CCL10 ZERO? NEG \FALSE SET 'NEG,TRUE-VALUE JUMP ?CND6 ?CCL10: GRTR? CHR,57 /FALSE LESS? CHR,48 /FALSE GRTR? SUM,3276 /FALSE MUL SUM,10 >?TMP1 SUB CHR,48 ADD ?TMP1,STACK >SUM ?CND6: INC 'BPTR JUMP ?PRG1 ?REP2: ZERO? TIM /?CCL22 GRTR? TIM,23 /FALSE ZERO? NEG \FALSE MUL TIM,60 ADD SUM,STACK >SUM ICALL CHANGE-LEXV,RLEXV,W?INT.TIM,BPTR,SUM RETURN W?INT.TIM ?CCL22: ZERO? NEG /?CND27 SUB 0,SUM >SUM ?CND27: ICALL CHANGE-LEXV,RLEXV,W?INT.NUM,BPTR,SUM RETURN W?INT.NUM .FUNCT CHANGE-LEXV:ANY:2:4,PTR,WRD,BPTR,SUM,X PUT PTR,0,WRD SUB PTR,P-LEXV ADD G-LEXV,STACK >X PUT X,0,WRD ASSIGNED? 'BPTR \FALSE PUT PTR,1,SUM PUT X,1,SUM SET 'P-NUMBER,SUM RETURN P-NUMBER .FUNCT TELL-GWIM-MSG:ANY:0:0,WD,VB PRINTC 91 GET GWIM-MSG,0 >WD ZERO? WD /?CND1 PRINTB WD PRINTC 32 GET PARSER-RESULT,1 >VB EQUAL? VB,W?SIT,W?LIE \?CCL5 EQUAL? WD,W?DOWN \?CND1 PRINTI "on " JUMP ?CND1 ?CCL5: EQUAL? VB,W?GET \?CND1 EQUAL? WD,W?OUT \?CND1 PRINTI "of " ?CND1: GET GWIM-MSG,1 ICALL2 TELL-THE,STACK PRINTR "]" .FUNCT DO-IT-AGAIN:ANY:0:1,NUM,X,TMP ASSIGNED? 'NUM /?CND1 SET 'NUM,1 ?CND1: SUB TLEXV,P-LEXV DIV STACK,2 >X ZERO? P-CONT \?CND3 ADD X,P-LEXELEN >X ?CND3: GET OOPS-TABLE,O-START >TMP ZERO? TMP /?PRG7 SUB TMP,P-LEXV+2 DIV STACK,4 >TMP GETB G-LEXV,P-LEXWORDS ADD STACK,TMP PUTB G-LEXV,P-LEXWORDS,STACK ?PRG7: ICALL MAKE-ROOM-FOR-TOKENS,2,G-LEXV,X PUT G-LEXV,X,W?PERIOD ADD X,P-LEXELEN PUT G-LEXV,STACK,W?AGAIN DLESS? 'NUM,1 \?PRG7 GETB G-LEXV,P-LEXWORDS SUB STACK,TMP PUTB G-LEXV,P-LEXWORDS,STACK ICALL2 COPY-INPUT,TRUE-VALUE SET 'P-OFLAG,0 RTRUE .ENDSEG .ENDI