[comp.sources.apple2] v001SRC051: Inmate Parser -- ATN Based, Part01/05

jac@yoko.rutgers.edu (Jonathan A. Chandross) (06/01/91)

Submitted-by: Phil Goetz (goetz@cs.buffalo.EDU)
Posting-number: Volume 1, Source:51
Archive-name: util/parser/inmate/part01
Architecture: ANY_2
Version-number: 1.00

This is the ATN-based parser for Phil Goetz's text adventure "Inmate".

It isn't a stand-alone piece of code, and will likely require some
judicious study before it can be used.

Enjoy.


=Document
-
-
-
-
-
-
-                                 Inmate Parser
-
-
-
-
-     ENGLISH COMMAND PARSING
-
-          Inmate is an adventure game.  Its parser handles objects,
-     sources, destinations, adjectives, prepositions, adverbs, and adver-
-     bial phrases.[1]
-
-
-          The Inmate parser runs on an Apple ][+ in 6502 machine language
-     and currently occupies about 4K of memory, and is an augmented transi-
-     tion network (ATN).  It is supported by an input routine, a lexical
-     analysis routine with 700-word dictionary, 50 verbs, 150 objects, 15
-     adjectives, and about 300 edges indicating properties of objects or
-     relationships between objects.  It has 4 phases: lexical analysis,
-     pre-ATN grammatical transformations, the ATN, and command handlers to
-     manipulate the game world.
-
-
-          If you aren't familiar with ATNs, a good tutorial can be found
-     in:
-
-
-          Author:     Madeleine Bates
-          Title:      "The Theory And Practice of Augmented Transition
-                      Network Grammars"
-          Book Title: Natural Language Communications With Computers
-          Series:     Lecture Notes In Computer Science
-          Number:     63
-          Publisher:  Springer-Verlag
-          City:       New York, NY
-          Date:       1987
-          Editor:     Leonard Bole
-
-
-     Lexical Analysis
-
-          Every word in the dictionary has at least 1 type, and often 2 or
-     3.  Some types have a number associated with them:  nouns, for
-     instance, have an object number.  Analysis produces one word number
-     and 1 to 3 word types for each word, stored in parallel arrays.  There
-     are 3 special types: synonyms, transformationals, and nulls.  Synonyms
-     take the types AND word number of another word in the dictionary.
-     This is so a word and all its synonyms can be identified by the same
-     _________________________
-
-       [1] Note: I removed the adverbial phrases and adverbs
-     because  they  seemed  to  have no purpose in an adven-
-     ture.]  The files in this distribution  contain  every-
-     thing  needed for the parser except for some of the se-
-     mantic network.
-
-
-
-
-
-
-
-
-
-                                - 2 -
-
-
-     word number.  Transformationals are marked for pre-ATN transformation
-     (see below).  Nulls are deleted.  Articles (a, the), demonstratives
-     (i.e. these, those) and intensifiers (i.e. very, extremely) are
-     currently classified as nulls.
-
-
-     Pre-ATN Grammatical Transformation
-
-
-          The transformer scans the parallel arrays of word number and word
-     type for patterns which should be transformed to simpler forms using
-     the basic transformational operations of movement, copying, insertion,
-     and deletion.  These include specific quirks of the language as well
-     as general grammatical transformations.  For instance, you would want
-     to transform VT NP1 NP2 to VT NP2 "TO" NP1 so the ATN can pick up NP2
-     as the object.
-
-
-          Note that the transformer will make a transformation if each word
-     in the input matches sequential words in the pattern using ANY of the
-     3 possible types.  So it is possible that a transformation could be
-     made with a mistaken type assumption.  In practice, this has not been
-     a problem.
-
-
-          Each transformation has a priority level assigned to it.  So
-     high-level priority transforms are tried first.  This prevents an
-     uncommon transformation from taking effect where a common one should
-     have been used.
-
-
-     ATN
-
-
-          A transition network is a set of transitions from one state, or
-     node, to another based on the section of input currently being exam-
-     ineid.  In a nondeterministic net such as this one, there is more than
-     one possible choice at some nodes.  If the program takes the wrong
-     transition and winds up at a dead end, it must be able to trace back
-     to its last decision branch and try another path.  If the input is
-     unparsable, the proram will trace all possible nodes of the network
-     and eventually back out of the original node.  The only other way to
-     leave a transition network is to succeed in parsing the input.  Suc-
-     cess is achieved by reaching the end of the input while in an "accept-
-     ing" node.
-
-
-          A recursive transition network is one that can call entire net-
-     works, including itself, as a node.  An augmented transition network
-     (ATN) is one which can perform special actions during each transition
-     and have special (i.e. semantic) requirements for a transition.  For
-     example, the transition from node 7 to node 8 in my network is invoked
-     if the current word is a preposition of instrument such as "with" or
-     "using".  The transition checks the verb's case frame to see if it
-
-
-
-
-
-
-
-
-
-                                - 3 -
-
-
-     allows an instrument (verbs which do include "hit" and "wash").  If
-     so, it stores the current word in the Prep of Instrument slot, goes on
-     to the next word, and enters node 8.  If not, it returns to node 7.
-     Some transitions leave flags to be checked/used later.  The word "his"
-     in "Get his book" (if Ed is the only man in the room) should be used
-     when finding objects to remove all books from the object list that are
-     not either owned by or presently "in" (carried by) Ed.  It doesn't
-     now.
-
-          This network is not truly recursive in that it cannot normally
-     call independent networks as a node.  It fakes recursive calling of
-     noun phrases (NPs) through tricky manipulations when entering and
-     leaving NPs and by using a special stack to keep track of NP calls.
-     The difficulty of implementing this in machine language is just one of
-     many reasons not to write your parser in machine language.
-
-          Backtracking is handled by associating a node and a transition
-     index with each word.  When a node is entered, its number is stored in
-     an array parallel to the word arrays.  When it is left by a successful
-     transition, the index pointing to the next branch that would have been
-     examined from that node is saved in another parallel array.  If the
-     program fails at the next node, it decrements the word counter,
-     reenters the node it came from, loads the index, and resumes where it
-     left off.
-
-          One great difficulty with this is that ALL data created/changed
-     by the unsuccessful link of transitions must be undone.  This might be
-     one reason to write your parser in ProLog.  It would be better to have
-     registers which are associated with a particular parse path through
-     the network which are then copied into global registers, than to use
-     the same global registers throughout (which I did).
-
-          Jumps are special cases because they involve a transition, yet
-     are not associated with a word.  However, since jumps are always the
-     last transition tested within a node, the node jumped from can be
-     removed from the backtracking list and thus the parallel arrays are
-     not thrown out of sync.
-
-          The purpose of this ATN is to fill in certain slots for the com-
-     mand handler.  These slots contain the verb, object list, preposition
-     of instrument, instrument, prep of destination (ie into, onto), desti-
-     nation, and place (ie "north", "bed" when used in ungrammatical but
-     popular sentence "go bed").
-
-          Say you enter
-          PUT THE BAG IN THE BACKPACK IN THE BIG BLUE BOX
-     The first word is always the verb.  Lexical analysis deletes the THEs:
-          PUT BAG IN BACKPACK IN BIG BLUE BOX
-     Now, a listing of the ATN looks like this (X! means that node X is an
-     accepting node; that is, if the sentence ends when it reaches that
-     node, it is accepted):
-
-
-
-
-
-
-
-
-
-
-
-
-                                - 4 -
-
-
-
-               Current node           Input            Next node
-               _________________________________________________
-                    0         Verb of place                1
-                              Transitive verb              2
-                              Intransitive verb            7
-                    1         Preposition of motion        6
-                              Place                        7
-                    2         Noun Phrase (object)         3
-                    3!        Exclusionary                 4
-                              Jump                         5
-                    4         NP (excluded from obj)       5
-                    5!        Preposition of motion        6
-                              Jump                         7
-                    6         NP (destination)             7
-                    7!        Prep of instrument           8
-
-
-     The noun phrase network looks like this:
-
-                          9    Noun group            10
-                         10!   Prep of no motion     11
-                         11    Noun group            12
-                         12!   Conjunction ("and")   9
-
-
-     The noun group network looks (I think) like this:
-
-                        13    Possessive (ie "his")   14
-                              Jump                    14
-                        14    Number ("7", "all")     15
-                              Jump                    15
-                        15    Adjective               15
-                              Classifier              16
-                              Noun                    17
-                        16    Classifier              16
-                              Noun                    17
-                        17!   Conjunction             14
-
-
-
-          (A classifier is very similar to an adjective, i.e. "sleeping" is
-     a classifier for "sleeping bag".  The only difference to the program
-     is that adjectives are handled using edges, and classifiers modifying
-     an object never change.)
-
-
-          PUT is a transitive verb, and so the ATN enters node 2 and looks
-     for a noun phrase.  The noun phrase network identifies BAG IN BACKPACK
-     IN BOX as a noun phrase in 3 recursive passes.  On the first pass, it
-     identifies BAG as a noun and tries to put it in the object list.  It
-     sees that BAG is a superset containing BAG1 (the plastic bag) and BAG2
-     (the sleeping bag), so it puts both in the object list.  IN tells the
-     NP to call itself using the next NP as a source for the last NP.  When
-     it finds BACKPACK, it removes any bags that are not IN the backpack
-
-
-
-
-
-
-
-
-                                - 5 -
-
-
-     from the object list.  Again, IN instructs the program to reenter the
-     NP network and look for a source for BAG.  (This should really look
-     for a source for BACKPACK, but if a BOX contains the proper BAG and
-     the BACKPACK contains the proper BAG, the BACKPACK is probably in the
-     BOX.  I haven't tried GET BACK IN BOX IN BACKPACK yet; my computer is
-     dismantled.) The NP network places BIG and BLUE in the adjective list.
-     (The adjective list is not used after parsing.)  When it reaches BOX,
-     it puts all boxes in the known world in the object list, then removes
-     all boxes that are not BIG and BLUE.  Then it removes all bags from
-     the object list that are not in the big blue box, and finds it has no
-     objects left.  It concludes that IN BOX must specify the destination
-     of the bag in the object list, and so puts the bags back in the object
-     list and puts BOX1 (big and blue) in the destination slot and IN in
-     the preposition of destination slot (used by the command handler).
-
-
-     Errors, Ellipsis:
-
-
-          If the network is unable to parse a sentence, it tries to inter-
-     pret the sentence as a sentence fragment by inserting it into the last
-     sentence parsed.  So if you say "Take the book" and them "examine", it
-     replaces "take" in "Take the book" with "examine" and tries (success-
-     fully) to parse that.
-
-
-     Pronouns:
-
-
-          The only pronoun with any meaning is "it".  "It" refers to the
-     last single object referenced.  I might also have a "them" for the
-     last group of objects referred to, but I forget.
-
-
-     Post-ATN Processing
-
-
-          I thought of having a post-ATN processor create conceptual depen-
-     dency representations from the information passed on by the ATN, using
-     something like Wilks' semantic primitives or Schanks' primitive ACTS
-     and inferences.  Instead of writing a command handler for each verb,
-     more general handlers could deal with similar verbs (i.e. give, take,
-     sell, buy; eat, drink).  Ideally, this construction should be used
-     during ATN analysis for semantic interpretation and disambiguation of
-     the sentence, but commands in adventures are almost always unambiguous
-     and simple enough for correct parsing by the ATN.
-
-
-          Using semantic primitives is something I think IF requires, but
-     it is not practical until we can write IF which does not depend on
-     ad-hoc rules that are applied to individual verb-object-etc. combina-
-     tions.  It would be, I think, difficult to apply such ad-hoc rules to
-     a conceptual dependency representation of a sentence - not for the
-     computer, but for the human who would have to translate all his ad-hoc
-
-
-
-
-
-
-
-
-
-                                - 6 -
-
-
-     situations into conceptual dependency representations while program-
-     ming.
-
-
-     Command Handlers
-
-
-          The command handlers might be designed for use with a processor
-     as mentioned above.  Currently, however, they are verb-specific com-
-     mand handlers as in most adventure games.  They manipulate the game
-     world by adding and/or deleting edges in the database.  They can also
-     trigger actions/messages/etc under certain conditions.
-
-
-          If a list of more than one object is provided with an action, the
-     action is repeated once for each object.
-
-
-     Source Code
-
-
-          To read the source, first read "inmate" .  That is the root file,
-     which is assembled, and includes all the other files.  The comments in
-     it explain what each file does.  So you can just read the files you're
-     interested in.
-
-
-          The list of files is:
-
-         File                             Contents
-       __________________________________________________________________
-       atn         Augmented transition network (parser)
-       caseframe   Verb case frames
-       cndact      Defines interpreted adventrue language used by verb
-                   handlers and other routines.
-       display30   Print location & happenings each turn
-       edges       Routines for altering
-       handler     Verb handler jumped to after parse completed
-       gennum      ???
-       inmate      the game; glues together all the modules
-       io          Save
-       lex         Lexical analysis: Examine raw string & find words
-       macros      macro definitions
-       monitor2    Call monitor routines in other RAM bank
-       print22     Print messages, strings; including compression routine
-       start       Initialization
-       transform   Grammatical transformations
-       transit     Transitions for the ATN
-       tsub        Subroutines called by the transitions
-       verbs       Verb execution routines
-       voca        Vocabulary, A-I
-       vocj        Vocabulary, J-Z
-
-
-
-
-
-
-
-
-
-
-
-                                - 7 -
-
-
-          The Inmate parser source is for the S-C Macro Assembler.  It
-     includes a lot of assembly directives.  The VOCab files have lines
-     like:
-           .AS -/ORT/
-     which probably means "negative (hi-bit set) ASCII for "ORT".  I think
-     .AT is for terminated ASCII (last character has hi-bit reversed).
-     More directives:
-
-              .DA     Data
-              .OR     Set object code origin address
-              .TF     Set target file name
-              .IN     Include
-              .BS     Data block of certain size
-              .US     User-defined directive, in this case meaning
-                      "write out the compressed version of the ASCII text
-                      given, using my text-compression algorithm".
-              .HS     Hexadecimal string.
-            #SYMBOL   Low byte of symbol's value
-                      SYMBOL
-
-
-
-
-     Phil Goetz
-     4023 Huckleberry Row
-     Ellicott City, MD 21043
-
-     goetz@cs.buffalo.EDU
-
-
=Manifest
-Document
-atn
-caseframe
-cndact
-display30
-edges
-gennum
-handler
-inmate
-io
-lex
-macros
-monitor2
-print22
-start
-transform
-transit
-tsub
-verbs
-voca
-vocj
=atn
-*
-SAVEATN16.1,S6,D1
-*--------------------------------
-* AUGMENTED TRANSITION NETWORK
-*--------------------------------
-* ON ENTRY: WORDS=# OF WORDS
-TNPNT  .EQ $C
-ATN    JSR CHKEY
-       BIT DBGFLG   ? "ATN:"?
-       BPL .4
-       JSR FD8E
-       LDX #0
-.1     LDA WTYPE,X  NUM IS ALWAYS 1ST TYPE
-       CMP #NUM
-       BNE .2
-       LDA WNOUN,X
-       JSR FDDA
-       JMP .3
-.2     LDA WLO,X
-       LDY WHI,X
-       JSR PRWRD
-.3     LDA #$A0
-       JSR FDF0
-       INX
-       CPX WORDS
-       BCC .1
-       LDY /ATNS
-       LDA #ATNS
-       JSR PS
-.4     LDX #33
-       LDA #0
-       STA UCONJ    CONJ NOT USED YET
-       STA JUCONJ
-.5     STA SDEST-1,X  ZERO SLOTS & OBJLIST
-       DEX
-       BNE .5
-       STX WORDNODE
-       STX CURWORD
-       STX NPSP
-       STX PFND
-       LDA #NODE0
-       STA TNPNT
-       LDA /NODE0
-       STA TNPNT+1
-A1     LDY #0
-A2     LDA (TNPNT),Y
-       BEQ A4     END OF NODE
-       STA TEMP     SAVE IN CASE IT'S A JMP
-       BMI A61      JMP
-       CMP WTYPE,X
-       BEQ A6
-       CMP WTYPE2,X
-       BEQ A6
-       CMP WTYPE3,X
-       BEQ A6
-       INY
-       INY
-       INY
-A3     INY
-       BNE A2       ALWAYS
-A4     DEX        FAIL,BACK TO LAST NODE
-       DEC CURWORD
-       BMI ASSUME   NO NODES LEFT=ALL OPTIONS EXPLORED
-       LDA WORDNODE,X  CONTINUE WI NODE X
-       JSR INTONP   IF GOING INTO MIDDLE OF NP, NPSP=NPSP+2
-       JSR GETNODE
-       LDY WORDINDEX,X
-       JMP A2
-A6     STA WTFIN,X  SUCCESS
-A61    INY
-       LDA (TNPNT),Y
-       STA .7+1
-       INY
-       LDA (TNPNT),Y
-       STA .7+2
-       INY
-       LDA (TNPNT),Y  NEXT NODE
-       CMP #EN      ENDNODE
-       BNE .65
-       BIT DBGFLG   PRINT "E"?
-       BPL .63
-       LDA #$A0
-       JSR FDF0
-       LDA #"E
-       JSR FDF0
-.63    INX
-       CPX WORDS
-       DEX
-       BCC A3
-       JMP CHECKSENT  ENDNODE ALWAYS ACCEPTS
-.65    BIT TEMP
-       BMI .67      IF A JMP, SAVE NEXT NODE IN CURRENT NODE
-       PHA
-       INY
-       TYA
-       STA WORDINDEX,X  LIKEWISE SAVE CURRENT INDEX
-       PLA
-       INC CURWORD
-       INX
-.67    STA WORDNODE,X  SAVE NEXT NODE IN CASE YOU MUST COME BACK LATER
-       JSR GETNODE
-.7     JSR 0
-A8     LDX CURWORD
-       CPX WORDS    DONE?
-       BCS .9
-       JMP A1
-.9     LDA WORDNODE,X
-       TAX
-       LDA ACCEPT,X  DOES THIS NODE ACCEPT EOL?
-       PHP
-       LDX CURWORD
-       PLP
-       BEQ A4       NO,BACK UP
-       JMP CHECKSENT  YES,PARSED!
-* ASSUME: TRY TO FIND OBJ,PLACE,OR INSTR FROM ROOM
-ASTRIED .BS 1       1=ALREADY TRIED
-RETRY  .BS 1        1-FF=TRY ATN AGAIN
-ASSUME LDA DQ       IN QUOTES?
-       BEQ .0       NO
-       LDA #0       NOT COMMAND, CHAR NOW DOES THINGS OF OWN WILL
-       STA DQ
-       JMP SPEAK
-.0     LDY ASTRIED
-       BNE .12      ALREADY TRIED
-       LDA LIGHT
-       BEQ .12      NO LIGHT, NO ASSUME
-       STY RETRY
-       STY TNPNT    FOR VT OBJ
-       INC ASTRIED  MARK AS TRIED
-       BIT DBGFLG
-       BPL .8
-       LDY /AS
-       LDA #AS
-       JSR PS
-.8     LDA WTFIN    VERB TYPE
-       CMP #VT+1    VERB?
-       BCC .11      YES
-.12    JMP ELLIPSIS
-.11    CMP #VP
-       BNE .4
-       LDA SDEST
-       BNE .39      AS5
-*VP GIVEN BUT NO PLACE
-       LDA LOC
-       LDX #HOLDS
-       JSR GETOBJ
-.1     DEX
-       BMI .2
-       PLA
-       CMP #LP+1    IS IT A PLACE?
-       BCS .1       NO
-       LDY SDEST
-       BEQ .15
-       JMP .47      MORE THAN 1 PLACE IN THIS LOC,FAILURE
-.15    STA SDEST
-       BEQ .1       ALWAYS
-.2     LDA SDEST
-       BEQ .12      NO PLACE FOUND
-       JMP .48
-.39    JMP AS5
-.4     CMP #VT
-       BNE .39
-       LDX OBJLIST
-.41    BNE .39
-       STX TNPNT    X MUST BE 0 IF GETOBJ ISN'T CALLED
-       STX OBJS     DON'T RETURN FROM ELIM USING STEMP
-       TXA
-       LDX #20
-.98    STA NOUNLIST-1,X
-       DEX
-       BNE .98
-*VT GIVEN BUT NO OBJ
-       LDA CASEFRAME
-       AND #$20
-       BEQ .42      CAN'T BE IN INVEN
-       LDA WVERB
-       CMP #GET     GET ALLOWS PICKING UP OBJS IN INVEN
-       BEQ .42
-       LDA #ME
-       LDX #HOLDS
-       JSR GETOBJ   INVEN
-       STX TNPNT
-.42    BIT CASEFRAME
-       BVC .44      OBJS IN LOC NOT ALLOWED
-       LDA LOC
-       LDX #HOLDS
-       JSR GETOBJ
-       TXA
-       CLC
-       ADC TNPNT
-       TAX
-.44    CPX #20      MAX
-       BCC .45
-       PLA
-       DEX
-       BNE .44
-.45    DEX
-       BMI .46
-       PLA
-       JSR FF4A
-       LDA $45
-       JSR PNTOBJ
-       LDY #5
-       LDA (MISC),Y
-       PHP          WORKS SINCE N IS N-BIT
-       JSR FF3F
-       PLP          PLA WOULD DESTROY #
-       BMI .45      CAN'T ASSUME OBJS WHICH ARE INVISIBLE
-       STA NOUNLIST,X
-       JMP .45
-.46    STX NMSG     DON'T PRINT
-       JSR COMP     CHL ALSO JSRs COMP (AT END)
-       JSR CHL-2
-       INC NMSG
-       LDA NOUNLIST+1    MORE THAN 1 OBJ LEFT?
-.47    BNE ELLIPSIS      YES
-       LDA NOUNLIST
-       BEQ ELLIPSIS
-*      BNE .48
-*      BIT CASEFRAME
-*      BVC ELLIPSIS OBJS IN LOC FORBIDDEN
-*      LDA #ME      ADD ME IF NOTHING ELSE IN LOC
-.48    JSR INSWRD
-       LDA #CN
-*CHANGE TO #PROPER IF HUMAN/ANIMATE
-       STA WTYPE+1
-       STA RETRY
-*AS5    LDA CASEFRAME+1
-*       AND #4
-*       BEQ .9       NO INSTR REQD
-*       LDA SINSTR
-*       BNE .9
-** INSTR REQD,NOT GIVEN
-* CURRENTLY HANDLED BY CHECKSENT
-*.9
-AS5    LDA RETRY
-       BEQ ELLIPSIS NO SUCCESS
-       JMP ATN
-* ELLIPSIS
-* IF UNABLE TO PARSE LINE, TAKE EACH WORD AND SUBSTITUTE IT FOR A WORD
-* OF THE SAME TYPE IN THE LAST SENTENCE, THEN RETRY ATN.
-* NOUN PHRASES CAUSE TROUBLE: MUST SUBSTITUTE ONE NOUN PHRASE OF LENGTH X
-* FOR OLD NOUN PHRASE OF LENGTH Y
-ELTRIED .BS 1       1=ELLIPSIS ALREADY TRIED ON THIS INPUT
-       .MA PN
-       SEC
-       SBC #NUM
-       CMP #EXC+1-NUM    C=0 IF TYPE IN A IS PART OF A NOUN
-       .EM
-SF     JMP SENTFAIL
-ELLIPSIS LDY ELTRIED
-       BNE SF        ALREADY TRIED ELLIPSIS
-       BIT DBGFLG
-       BPL .1
-       LDY /EL
-       LDA #EL
-       JSR PS
-       LDY #0
-.1     LDX #0
-E1     LDA WTYPE,X
-       >PN
-       BCC .3
-       LDA WTYPE2,X
-       >PN
-       BCC .2
-       LDA WTYPE3,X
-       >PN
-       BCC .2
-       JMP NOTNT
-.2     ADC #NUM     RESTORE TYPE
-       STA WTYPE,X
-.3     LDA LWTFIN,Y
-       >PN
-       BCC .35
-       INY
-       CPY LWORDS
-       BCC .3
-       BCS SF       NT NOT FOUND
-.35    STY MISC     POINTS TO 1ST NT
-.4     INY
-       CPY LWORDS
-       BCS .5
-       LDA LWTFIN,Y
-       >PN
-       BCC .4
-.5     TYA          POINTS TO 1ST NON-NT OLD WORD
-       DEY
-       STY TNPNT+1
-       SBC MISC     A=LENGTH OF OLD NT GROUP
-       STA TNPNT
-       STX MISC+1   POINTS TO 1ST NEW NT
-.6     INX
-       CPX WORDS
-       BCS .7
-       LDA WTYPE,X
-       >PN
-       BCC .6
-       LDA WTYPE2,X
-       >PN
-       BCC .65
-       LDA WTYPE3,X
-       >PN
-       BCS .7
-.65    ADC #NUM     RESTORE
-       STA WTYPE,X
-       BCC .6       ALWAYS
-* X POINTS TO 1ST NON-NT NEW WORD
-.7     TXA
-       SBC MISC+1   A=LEN OF NEW NT GROUP
-       SEC
-       SBC TNPNT
-       PHP
-       PHA
-       CLC
-       ADC LWORDS   + OR -
-       STA LWORDS   ADJUST #OLD WORDS
-       PLA
-       PLP
-       BEQ EMOVED
-       BCS .9
-* OLD NTG > NEW NTG
-       SBC #0       SUBTRACTS 1
-       EOR #$FF     CHANGE A FROM - TO +
-       CLC
-       ADC MISC     POINTER TO OLD NT
-       TAY
-       LDX MISC     X POINTS TO 1ST NT
-.8     JSR EMOVE
-       INX
-       INY
-       CPX LWORDS   LWORDS HAS BEEN DECREASED
-       BCC .8
-       BCS EMOVED
-* NEW NTG > OLD NTG
-.9     CLC
-       ADC LWORDS
-       TAX
-       DEX
-       DEX
-       LDY LWORDS
-       DEY
-       DEY
-.10    JSR EMOVE
-       DEX
-       DEY
-       CPY TNPNT+1
-       BCS .10
-EMOVED LDX MISC+1
-       LDY MISC
-.1     LDA WTYPE,X
-       STA LWTFIN,Y
-       JSR NW.OW
-       INX
-       CPX WORDS
-       BCS DONE
-       INY
-       LDA WTYPE,X
-       >PN
-       BCC .1
-NOTNT  LDA LWTFIN,Y
-       CMP WTYPE,X
-       BEQ .2
-       CMP WTYPE2,X
-       BEQ .2
-       CMP WTYPE3,X
-       BNE .3
-.2     CPY LWORDS
-       BCS SENTFAIL
-       JSR NW.OW
-       INX
-       CPX WORDS    DONE?
-       BCS DONE
-.3     INY          NEXT OLD WORD
-       CPY LWORDS
-       BCS SENTFAIL
-       JMP E1
-DONE   LDY #30*4+1  DON'T COPY LWTFIN
-.5     LDA LWLO-1,Y
-       STA WLO-1,Y
-       DEY
-       BNE .5
-       LDX #29
-.6     LDA LWTFIN,X
-       STA WTYPE,X
-       TYA          0
-       STA WTYPE2,X
-       STA WTYPE3,X
-       DEX
-       BPL .6
-       DEC ELTRIED  MARK ELLIPSIS AS ALREADY TRIED
-       JMP ATN
-SENTFAIL LDA #0
-       STA WORDS    DON'T TRY FAILED SENTENCE IN ELLIPSIS
-       BIT DBGFLG
-       BPL .1
-       JSR FD8E     DON'T PRINT ON SAME LINE AS DEBUGGING MESSAGES
-.1     LDY /.2
-       LDA #.2
-       JSR PS
-       JMP PARSE
-.2     .US /I DON'T UNDERSTAND THAT SENTENCE.@=/
-AS     .US /@ASSUMPTION=/
-EL     .US /@ELLIPSIS=/
-INSWRD PHA
-       LDA #"(
-       JSR FDF0
-       LDA WORDS
-       TAX
-       TAY
-       DEY
-       BEQ .3       1 WORD:VP
-.25    JSR TMOVE    MOVE SENT. UP
-       DEX
-       DEY
-       BNE .25      DON'T MOVE VERB
-.3     STY SDEST
-       STY WVERB+1
-       STY WTYPE2+1
-       STY WTYPE3+1
-       PLA
-       STA WNOUN+1  PLACE AFTER VERB
-       DEY
-       STY WHI+1    #$FF
-       INC WORDS
-       JSR PROBJ
-       LDA #")
-       JSR FDF0
-       JMP FD8E
-NW.OW  LDA WLO,X   NEW WORD->OLD SENTENCE
-       STA LWLO,Y
-       LDA WHI,X
-       STA LWHI,Y
-       LDA WVERB,X
-       STA LWVERB,Y
-       LDA WNOUN,X
-       STA LWNOUN,Y
-       RTS
-EMOVE  LDA LWLO,Y
-       STA LWLO,X
-       LDA LWHI,Y
-       STA LWHI,X
-       LDA LWVERB,Y
-       STA LWVERB,X
-       LDA LWNOUN,Y
-       STA LWNOUN,X
-       LDA LWTFIN,Y
-       STA LWTFIN,X
-       RTS
-GETNODE BIT DBGFLG  PRINT NODE?
-       BPL .1
-       PHA
-       LDA #$A0
-       JSR FDF0
-       PLA
-       PHA
-       JSR FDDA
-       PLA
-.1     STA CURNODE
-       ASL
-       TAY
-       LDA NODETAB,Y
-       STA TNPNT
-       LDA NODETAB+1,Y
-       STA TNPNT+1
-       JMP CHKEY
-CURNODE .BS 1       ONLY USED BY INTONP
-INTONP CMP #NP
-       BCC .5
-       CMP #15
-       BCS .5
-       LDY CURNODE  ONLY USE OF CURNODE
-       CPY #NP
-       BCC .45
-       CPY #15
-       BCC .5       UNLESS ALREADY IN NP
-.45    INC NPSP     IF GOING BACK INTO NP,
-       INC NPSP     GIVE IT AN EXIT ROUTINE
-.5     RTS
-*--------------------------------
-ATNS   .US /@A%T%N:=/
-*-------------------------------
-WTYPE  .BS 30
-WTYPE2 .BS 30
-WTYPE3 .BS 30
-OLO    .BS 30       ORIGINAL WORD#: USED FOR STRING SUBST
-OHI    .BS 30       WHEN A CHARACTER REPEATS STRING
-* NEXT 6 MUST BE TOGETHER
-WLO    .BS 30       UP TO 30 WORDS
-WHI    .BS 30
-WVERB  .BS 30
-WNOUN  .BS 30
-WORDS  .BS 1        # OF WORDS
-WTFIN  .BS 30
-WORDNODE .BS 30
-WORDINDEX .BS 30
-* LAST SENTENCE PARSED, USED IN ELLIPSIS
-LWLO   .BS 30
-LWHI   .BS 30
-LWVERB .BS 30
-LWNOUN .BS 30
-LWORDS .BS 1
-LWTFIN .BS 30
-* SLOTS FILLED BY ATN & PASSED TO VERB HANDLERS
-* MODIFY ATN ENTRY IF YOU CHANGE THESE
-SDEST  .BS 1
-SINSTR .BS 1
-SPLACE .BS 1
-SNUM   .BS 1
-SADV   .BS 1
-STIME  .BS 2
-SPI    .BS 2
-SPT    .BS 2
-SPM    .BS 1       USED BY HANDLER
-SPN    .BS 1       USED BY ATN
-OBJLIST .BS 21      1 EXTRA FOR BUFFER
-NOUNLIST .BS 20
-LNL    .BS 20
-SOURCELIST .BS 20
-LOCLIST .BS 20
-CASEFRAME .BS 6
-NPSP   .BS 1        POINTER INTO NP STACK
-NPSTACK .BS 20
-ADJLIST .BS 8
-*
-* ACCEPT:00=LINE CAN'T END IN THIS NODE
-ACCEPT .HS 000000FF00FF00FF00FF0000000000FF00
-*
-*      .DA #PART OF SPEECH REQD FOR TRANSITION,TRANSITION SUBROUTINE,#DEST NODE
-JMP    .EQ $80
-NODE0  .DA #VI,TV,#7
-       .DA #VP,TV,#1
-       .DA #VT,TV,#2
-       .DA #VI,TV,16
-NP     .EQ 11
-NODETAB .DA NODE0,.1,.2,.3,.4,.5,.6,.7,.8,.9,0,.11,.12,.13,.14,.15,.16
-.1     .DA #PLACE,TPLACE,#7
-       .DA #PM,TPM,#6
-       .DA #PRT,TPRT,#1
-       .DA #JMP,TPOBJ,NP
-.2     .DA #PRT,TPRT,#2
-       .DA #JMP,TOBJ,NP  NP OBJ & SOURCE
-.3     .DA #EXC,TRTS,#4
-       .DA #JMP,TRTS,5
-.4     .DA #JMP,TEXC,NP  NP.EXC
-.5     .DA #PM,TPM,#6
-       .DA #PRT,TPRT,#5
-       .DA #JMP,TRTS,7
-.6     .DA #JMP,T6.7,NP  NP.DEST
-*7     .DA #ADJ,TADV,#9
-.7     .DA #PI,T7.8,8
-*      .DA #JMP,TRTS,9
-.8     .DA #JMP,TINSTR,NP  NP.INSTRUMENT
-.9     .DA #0
-*9     .DA #PT,T9.10,#10
-*      .DA #TB,T9.E,EN
-*10    .DA #TIME,T9.E,EN
-.11    .DA #POS,TRTS,#12  POSSESSIVE IGNORED
-       .DA #JMP,TRTS,12
-.12    .DA #NUM,TNUM,#13
-       .DA #JMP,TRTS,13
-.13    .DA #ADJ,TADJ,#13
-       .DA #CN,TNOUN,#14
-       .DA #CNP,TNOUN,#14
-       .DA #PRN,TPRN,#14
-       .DA #PROPER,TNOUN,14
-.14    .DA #PN,TPN,#NP
-       .DA #CONJ,TCONJ,#NP
-       .DA #JMP,TLEAVENP,15
-.15    .DA #0       FAKE NODE FOR NP TO END AT
-.16    .DA #PRT,TPRT,7  ACTUALLY RESTARTS ATN
-EN     .EQ 17
=caseframe
-*
-SAVECASEFRAME
-*      .DA CASEFRAME,DATA TABLE
-* CASEFRAME:
-*   7=OBJ MAY BE ABSENT
-*   6=OBJ MAY BE ROOM/IN ROOM
-*   5=OBJ MAY BE IN/ON PERSON
-*   4=PERMISSIBLE OBJLIST GIVEN
-*   3=FORBIDDEN OBJLIST GIVEN
-*   2=HUMAN OBJ ALLOWED
-*   1=ANIMATE OBJ ALLOWED
-*   0=INANIMATE OBJ ALLOWED
-*   7=SIZE MUST BE <X
-*   6=SIZE MUST BE >=Y
-*   5=OBJ MUST HAVE PROPERTIES F
-*   4=CAN HAVE BURNT/BROKEN OBJ
-*   3=INSTR ALLOWED,LIST GIVEN
-*   2=INSTR REQUIRED
-*   1=DEST ALLOWED
-*   0=DEST REQ'D
-*   7=DEST LIST GIVEN
-*   6=PREP LIST GIVEN
-*   5=VERB PART PERMITTED
-*   4=VERB PART REQUIRED
-*   3=CHAR WILL DO VERB IF TOLD
-*   0=FAILURE IF OBJ NOT GOTTEN
-*   7=GET OBJ IF POSSIBLE AND NOT CARRIED
-*   6=SPECIAL ACTIONS
-*   5=JSR
-*   4=ADD EDGE
-*   3=DELETE EDGE
-*   2=REPLACE EDGE
-*   1=ZERO OBJ BITS
-*   0=SET OBJ BITS
-*
-* FOR VP SUBST PLACE FOR OBJ
-* WHEN PLACE IS NOUN (NOT NSEW..)
-* VP WON'T PARSE IF NO DEST
-* GIVEN, SO DON'T REQUIRE DEST
-* FOR VP WHICH PERMIT SPLACE
-*
-* PARTS
-* DON'T REUSE # ANOTHER PART MAY HAVE IN DATA, IE ON=4
-FOR    .EQ 40
-OFF    .EQ 41
-OUT    .EQ 42
-AWAY   .EQ 43
-* UP prt# = UV
-*
-VERBS
-ATT    .EQ 0
-       .DA $371,$4C8,TATT
-BRE    .EQ 1
-       .DA $BC61,$4500,TBRE 
-BRU    .EQ 2
-       .DA $C71,$4000,TBRU
-BUR    .EQ 3
-       .DA $3C61,$500,TBUR
-CHEC   .EQ 4
-       .DA $1071,$C030,TCHEC
-CHEOUT .EQ 5
-       .DA $1071,$C100,TCHEOUT
-CHEW   .EQ 6
-       .DA $2061,$4000,TCHEW
-CLE    .EQ 7
-       .DA $8C71,$400,TCLE
-CLI    .EQ 8
-       .DA $300,$4440,TCLI
-CLOS   .EQ 9
-       .DA $2061,$2208,TCLOS
-CLOT   .EQ 10
-       .DA $C66,$4000,TCLOT
-COM    .EQ 11
-       .DA $C66,$4000,TCOM
-CUT    .EQ 12
-       .DA $C71,$500,TCUT
-DV     .EQ 13
-       .DA 0,$2000,TD
-DAM    .EQ 14
-       .DA $1077,$4000,TDAM
-DEB    .EQ 15
-       .DA 0,$2000,TDEB
-DEV    .EQ 16
-       .DA $71,$4000,TDEV
-DIE    .EQ 17
-       .DA 0,$4000,TDIE
-DRIB   .EQ 18
-       .DA $71,$8008,TDRIB
-DRI    .EQ 19
-       .DA $2061,$6000,TDRI
-DRO    .EQ 20
-       .DA $1227,$4000,TDRO
-DRY    .EQ 21
-       .DA $9C6F,$4800,TDRY
-DUM    .EQ 22
-       .DA $8061,$4000,TDUM
-DUN    .EQ 23
-       .DA $8271,$40C8,TDUN
-EV     .EQ 24
-       .DA 0,$2000,TE
-EAT    .EQ 25
-       .DA $2061,$E001,TEAT
-ELL    .EQ 26
-       .DA 0,$4000,TELL
-END    .EQ 27
-       .DA $F1,$4000,TEND
-ERA    .EQ 28
-       .DA $1071,$4008,TERA
-EXA    .EQ 29
-       .DA $1067,$E008,TEXA
-EXI    .EQ 30
-       .DA $1041,$2000,TEXI
-EXT    .EQ 31
-       .DA $1861,$4000,TEXT
-FAS    .EQ 32
-       .DA 0,$2000,TFAS
-FIL    .EQ 33
-       .DA $2C67,$408,TFIL
-FIN    .EQ 34
-       .DA $10E7,$4008,TFIN
-FLU    .EQ 35
-       .DA $71,$4200,TFLU
-FOL    .EQ 36
-       .DA $46,$4008,TFOL
-GET    .EQ 37       GET, TAKE OFF
-       .DA $9063,$C221,TGET SPECIAL ACTION ELIMINATES OBJS IN ME
-GIV    .EQ 38
-       .DA $9321,$C40,TGIV
-GO     .EQ 39
-       .DA $4041,$2440,TGO
-HEA    .EQ 40
-       .DA $67,$6000,THEA
-HEL    .EQ 41
-       .DA $1856,$2008,THEL
-HIT    .EQ 42
-       .DA #%01100111,%00011100,#$40,THIT
-IV     .EQ 43
-       .DA 0,$2000,TI
-JUM    .EQ 44
-       .DA 0,$4000,TJUM
-KIL    .EQ 45
-       .DA #%01000110,#%00001100,#0,#$40,TKIL
-LIG    .EQ 46
-       .DA $2061,$C500,TLIG
-LOA    .EQ 47
-       .DA #%11110111,#$10,#0,#$20,TLOA
-LOCV   .EQ 48       SYMBOL LOC TAKEN
-       .DA $2C69,$4208,TLOC
-LOI    .EQ 49
-       .DA 0,0,0
-LOO    .EQ 50
-       .DA $12E7,$2048,TLOO  LOOK NORTH?
-LOW    .EQ 51
-       .DA 0,$4000,TLOW
-MOV    .EQ 52
-       .DA $9263,$4000,TMOV
-NV     .EQ 53
-       .DA 0,$2000,TN
-NOD    .EQ 54
-       .DA 0,$2000,TNOD
-NOE    .EQ 55
-       .DA 0,$4000,TNOE
-OPE    .EQ 56
-       .DA $3861,$6100,TOPE
-PIC    .EQ 57       PICK UP
-       .DA #$E7,#$10,#%00111000,#0,TPIC
-PLA    .EQ 58
-       .DA $A71,$40C8,TPLA
-PHO    .EQ 59
-       .DA $C67,$4000,TPHO
-POK    .EQ 60
-       .DA $1866,$4000,TPOK
-POU    .EQ 61
-       .DA #%01100001,#%00110010,$4048,TPOU
-PRY    .EQ 62
-       .DA #$71,#$1C,#$20,#$A,TPRY
-* PULL=MOVE
-PUS    .EQ 63
-       .DA $9061,$4000,TPUS
-PUT    .EQ 64
-       .DA $9363,$C428,TPUT  PUT,PUT DOWN,PUT OUT
-REA    .EQ 65
-       .DA $2061,$C001,TREA
-REC    .EQ 66
-       .DA $300,$40C8,TREC
-REM    .EQ 67
-       .DA $8067,$C400,TREM  DOESN'T GET IN GET ROUTINE, JUST CHECKS FOR SPCACT
-RET    .EQ 68
-       .DA #$71,$100,#%11000010,TRET
-REW    .EQ 69
-       .DA $C71,$4100,TREW
-RIP    .EQ 70
-       .DA $71,$820,TRIP
-SV     .EQ 71
-       .DA 0,$2000,TS
-SAL    .EQ 72
-       .DA $1C71,$8,TSAL
-SAU    .EQ 73
-       .DA 0,$4000,TSAU
-SAV    .EQ 74
-       .DA #%11110111,#$10,#0,#$20,TSAV
-SAY    .EQ 75
-       .DA $3F7,$6040,TSAY
-SCO    .EQ 76
-       .DA 0,$2000,TSCO
-SCR    .EQ 77       SCREW
-       .DA $F71,#$C0,#%01010101,TSCR
-SHOO   .EQ 78
-       .DA #%01000111,#%10011100,$4000,TSHOO
-SHOW   .EQ 79
-       .DA $200,$4CC0,TSHO
-SIT    .EQ 80
-       .DA $300,$4C0,TSIT
-SLE    .EQ 81
-       .DA 0,$4400,TSLE
-SLOW   .EQ 82
-       .DA 0,$2000,TSLO
-SME    .EQ 83
-       .DA $67,$E008,TSME
-SPR    .EQ 84
-       .DA 0,8,0
-STA    .EQ 85
-       .DA #$71,0,#$40,TSTA
-STI    .EQ 86
-       .DA #$71,#$13,#$C1,#$84,TSTI
-STO    .EQ 87
-       .DA $77,$4008,TSTO
-SWA    .EQ 88
-       .DA $A061,$6000,TSWA
-SWI    .EQ 89
-       .DA $200,$2000,TSWI
-THR    .EQ 90
-       .DA $9221,$4060,TTHR
-TAW    .EQ 91       THROW AWAY
-       .DA $9221,$40C0,TTAW
-TIC    .EQ 92
-       .DA $66,$4000,TTIC
-TUR    .EQ 93
-       .DA #$61,#0,#%00110000,#0,TTUR
-TUROFF .EQ 94
-       .DA #$61,0,#$40,TOF
-TURNON .EQ 95
-       .DA #$61,0,#$40,TON
-TYP    .EQ 96
-       .DA $13F1,$40C8,TTYP
-UV     .EQ 97
-       .DA 0,$2000,TU
-UNLI   .EQ 98
-       .DA $2061,$4A00,TUNLI
-UNLO   .EQ 99
-       .DA $2C69,$4100,TUNLO
-UNS    .EQ 100
-       .DA $C71,#0,#%01001000,TUNS
-USE    .EQ 101
-       .DA $71,$4000,TUSE
-VOC    .EQ 102
-       .DA 0,$2000,TVOC
-WV     .EQ 103
-       .DA 0,$2000,TW
-WEA    .EQ 104
-       .DA $2061,$D00,TWEA
-WIN    .EQ 105
-       .DA $F1,$4000,TWIN
-WIND   .EQ 106
-       .DA $71,$4000,TWIND
-YEL    .EQ 107
-       .DA 0,$4000,TYEL
-PV     .EQ 108      FAKE VERB FOR PUTTING INTO VENT
-       .DA $63,$4000,TPV
-SCRI   .EQ 109      SCRIPT
-       .DA 0,$4000,TSCRI
-NOSC   .EQ 110
-       .DA 0,$2000,TNOSC
-*--------------------------------
-* IN MOST ADVENTURES,SOME VERBS SHOULD SPECIFY THAT THE SCREEN NOT BE
-* UPDATED AFTER THEM. NOT SO HERE,BECAUSE OBJS CAN WANDER AROUND
-* INDEPENDENT OF THE PLAYER.
=cndact
-*
-SAVECNDACT26
-* CONDITION#,COND PARMS,[AND,COND,CP]/[ACTION#,ACT PARMS,0(/,#$80,CND,..)]
-* CONDITIONS AND ACTIONS
-* OBJWASIN,ISEDG,ITIN CAN BIND VAR IN FINAL BYTE
-NULL   .EQ 1
-OBJIS  .EQ 2
-LOCIS  .EQ 3
-PEEK   .EQ 4
-SLOTIS .EQ 5
-INROOM .EQ 6
-OBJIN  .EQ 7
-OBJWASIN .EQ 8
-PRIMED .EQ 9
-ZERO   .EQ 10
-BITSET .EQ 11
-JSR    .EQ 12
-ISEDG  .EQ 13
-ITIN   .EQ 14
-ACTME  .EQ 15
-CZ     .EQ 16
-INME   .EQ 17
-CNDTAB .DA .0,.5,.10,.15,.20,.25,.30,.35,.40,.45,.50,.55,.60,.65,.70,CA75,CA80
-* CONDITIONS ENTERED WI 1ST PARM IN A
-* ON EXIT:Z=1 IF SUCCESS
-* NO CONDITION
-.0     LDA VDAT+1
-       BNE .1
-       DEC VDAT+2
-.1     DEC VDAT+1   NO PARMS
-       LDA #0       SUCCESS
-       RTS
-* OBJ=X
-.5     JSR GEDGE+3
-       CMP CUROBJ
-       RTS
-* ACLOC=X
-.10    CMP ACLOC
-       RTS
-* MEMLOC=X
-.15    JSR RDADR+3
-       JSR VDAT
-       CMP (MISC),Y
-       RTS
-* SLOT=X
-.20    JSR GEDGE+3
-       STA MISC
-       JSR VDAT
-       CMP MISC
-       RTS
-* ITEM IN ROOM
-.25    JSR GEDGE+3
-       LDX #0
-       STX ILOC
-       JSR CHECKLOC
-       LDA ILOC
-       CMP ACLOC
-       RTS
-* OBJ IN X
-.30    JSR GEDGE+3
-       STA $1A
-       LDA CUROBJ
-       LDX #IN
-       JSR GETOBJ
-       DEX
-       BMI .31
-       PLA
-       CMP $1A
-.31    RTS
-* OBJ WAS IN X BEFORE GOTTEN
-.35    JSR GEDGE+3
-       CMP #$FF     UNBOUND VAR
-       BNE .37
-       LDA OLDLOC
-       JSR BIND
-.37    CMP OLDLOC
-       RTS
-* OBJ PRIMED
-.40    JSR .0       DEC VDAT
-       LDA CUROBJ
-       JSR PNTOBJ
-       LDY #4
-       LDA (MISC),Y
-       AND #$10
-       EOR #$10
-       RTS
-* PEEK (X) = 0
-.45    JSR RDADR+3
-       LDA (MISC),Y
-       RTS
-* ITEM BIT SET
-.50    JSR GEDGE+3
-       JSR PNTOBJ
-       JMP TBIT
-* MACHINE-LANGUAGE SUB WHICH DETERMINES Z
-.55    JSR RDADR+3
-       JMP (MISC)
-* EDGE V V _ V EXISTS
-.60    JSR GEDGE+3
-       PHA
-       JSR GEDGE
-       TAX
-       JSR GEDGE
-       STA TEMP+1
-       PLA
-       JSR GETOBJ
-.61    DEX
-       BMI .64      FAIL
-       PLA
-       CMP TEMP+1
-       BEQ .63      SUCCEED
-       LDY TEMP+1
-       CPY #$FF     UNBOUND VAR
-       BNE .61
-       JSR BIND     BIND,SUCCEED
-       .HS A9       (LDA #$68) PULL REST OFF STACK
-.62    PLA
-.63    DEX
-       BPL .62
-       INX          Z=1
-.64    RTS
-* ITEM IN X
-.65    JSR GEDGE+3
-       LDX #IN
-       JSR GETOBJ
-       JSR GEDGE    DOESN'T CHANGE X
-       DEX
-       BMI .67      NOT IN ANYTHING,FAIL
-       STA TEMP+1
-       PLA
-       STA MISC
-       LDA TEMP+1
-       CMP #$FF     UNBOUND VAR
-       BNE .66      NO
-       LDA MISC
-       JSR BIND     BIND,SUCCEED
-.66    CMP MISC
-.67    RTS
-* I'M ACTOR
-.70    JSR .0
-       LDA ACTOR
-       CMP #ME
-       RTS
-* ITEM COUNTER 0
-CA75   JSR GEDGE+3
-       JSR PNTOBJ
-       LDY #4
-       LDA (MISC),Y
-       AND #7
-       RTS
-* ITEM IN ME
-CA80   JSR GEDGE+3
-CINME  LDX #IN
-       JSR GETOBJ
-       DEX
-       BMI .1
-       PLA
-       CMP #ME
-       BNE CINME
-.1     RTS
-OLDLOC .BS 1
-RDADR  JSR VDAT
-       STA MISC
-       JSR VDAT
-       STA MISC+1
-       LDY #0
-       RTS
-AMSG   .EQ 1
-ARPL   .EQ 2
-AJSR   .EQ 3
-SKIP   .EQ 4
-POKE   .EQ 5
-AINC   .EQ 6
-NOTH   .EQ 7
-GOTO   .EQ 8
-MAKVIS .EQ 9
-ASBIT  .EQ 10
-AZBIT  .EQ 11
-MOVETO .EQ 12
-ADEC   .EQ 13
-DECC   .EQ 14
-DO     .EQ 15
-CHMAP  .EQ 16
-AREP   .EQ 17
-AMAK   .EQ 18
-ADEL   .EQ 19
-SPAWN  .EQ 20
-TRANS  .EQ 21
-ADIE   .EQ 22
-DELIT  .EQ 23
-UPSCR  .EQ 24
-DESTR  .EQ 25
-ASWI   .EQ 26
-UNBIND .EQ 27
-CGO    .EQ 28       CONVERSATION GOTO
-ACTLEN .DA #1,#1,#2,#0,#3,#2,#0,#2,#1,#4,#4,#1,#2,#1,#7,#3,#3,#3,#3,#3,#3,#0,#1,#1,#1,#2,#0,#1
-ACTTAB .DA .0,.3,.5,.10,.15,.20,.25,.30,.35,.40,.45,.50,.55,.60,.65,CA1,DOREP,MAK,DEL,SPW,TRN,ADI,DLO,UPS,DES,SW,UB,CG
-* PRINT MESSAGE
-.0     JSR NOK
-       JSR VDAT
-       JMP PMSG
-* PRINT REPLY
-.3     JSR NOK
-       JSR VDAT
-       JMP PRPL
-* JSR
-.5     JSR RDADR
-       JMP (MISC)
-* SKIP OBJECT
-* WHEN CALLED FROM INLINE, SKIPS THE REST OF THE AL CODE INLINE
-* & RETURNS TO THE GIVEN INLINE ADDRESS (IE DRT)
-.10    PLA          POP SPCACT
-       PLA
-       PLA          POP ROUTINE WITH JSR SPCACT
-       PLA
-       RTS
-* POKE
-.15    JSR RDADR
-       JSR GEDGE    NOTE YOU CAN'T POKE A VALUE = A VAR#
-       LDY #0
-       STA (MISC),Y
-       RTS
-* INC
-.20    JSR VDAT
-       STA .21+1
-       JSR VDAT
-       STA .21+2
-.21    INC $FFF
-* NOTHING:NORMALLY FOLLOWED BY AN ELSE
-.25    RTS
-* GOTO
-.30    JSR RDADR
-       LDA MISC
-       STA VDAT+1
-       LDA MISC+1
-       STA VDAT+2
-       RTS
-* MAKE OBJ VISIBLE
-.35    JSR GEDGE
-       JSR PNTOBJ
-       LDY #5
-       LDA (MISC),Y
-       AND #$7F
-       STA (MISC),Y
-       RTS
-* SET BITS OF ITEM
-.40    JSR GEDGE
-       JMP SBIT
-* ZERO BITS
-.45    JSR GEDGE
-       JMP ZBIT
-* MOVE ME INTO X
-.50    JSR GEDGE
-       TAY
-       LDA #ME
-       LDX #IN
-       JMP REPEDG
-* DEC BYTE
-.55    JSR VDAT
-       STA .57+1
-       JSR VDAT
-       STA .57+2
-.57    DEC $FFF
-       RTS
-* DEC ITEM COUNTER
-.60    JSR GEDGE
-       JSR PNTOBJ
-       LDY #4
-       LDA (MISC),Y
-       SEC
-       SBC #1
-       STA (MISC),Y
-       RTS
-* EXECUTE SENTENCE AFTER THIS EXECUTION IS DONE
-* WON'T WORK IF OBJ IS SKIPd
-.65    LDX #6
-.67    JSR GEDGE
-       >PHA DOSTK,DOPNT
-       DEX
-       BPL .67
-NOK    LDY /.1
-       LDA #.1
-       JMP OMSG     DON'T PRINT OK
-.1     .AS -/=/
-* VERB,OBJ,PM,DEST,INSTR,PLACE
-DOSTK  .BS 6*8
-DOPNT  .BS 1
-* CHANGE MAP: LOC DIR->LOC
-CA1    JSR VDAT
-       PHA
-       JSR VDAT
-       TAY
-       JSR VDAT
-       TAX
-       PLA
-* CHANGE MAP:A Y X = LOC DIR->LOC
-CHM    STA ALOC
-       TXA
-       PHA
-       LDA ALOC
-       JSR PNTALOC
-       PLA
-       STA (TEMP),Y
-       RTS
-* REPLACE EDGE
-DOREP  JSR GEDGE
-       PHA
-       JSR GEDGE
-       TAX
-       JSR GEDGE
-       TAY
-       PLA
-       JMP REPEDG
-* MAKE EDGE (FOR WHEN AREP WOULD COVER DIFFERENT EDGE, IE OWNING
-MAK    JSR GEDGE
-       PHA
-       JSR GEDGE
-       PHA
-       TAX
-       JSR CLCPNT
-       PHA
-       JSR GEDGE
-       PHA
-       JSR MAKEDG   CAN'T JMP
-       RTS
-* DELETE EDGE
-DEL    LDX #3
-.1     JSR GEDGE
-       PHA
-       DEX
-       BNE .1
-       STX GCALLD   FOR GETEDG
-       TAX          DEF Z
-       BNE DE2
-       PLA
-       PLA
-       TAX
-       PLA
-* DELETE LAST EDGE A X _ _
-DELAX  STA EDGCMP+1
-       JSR JG
-       BCS DE3      NO EDGE
-       LDA #DE3
-       STA MISC     RETURN TO .3 FROM DEL EXIT
-       LDA /DE3
-       STA MISC+1
-       JMP DELEXT
-DE2    JSR DELEDG   DON'T JMP SINCE DATA IS ON STACK
-DE3    RTS
-* SPAWN PLAN
-SPW    >CRL NXTPLN,#2    USE PNTR FOR ACTOR
-       LDA #1
-       STA SPWD     CALLED BY SPAWN
-SP1    JSR GEDGE    ACTOR
-       PHA
-       LDY #$FE
-       STA (TEMP),Y
-       JSR GEDGE    PLAN#
-       LDY #$FD     GEDGE WIPES Y
-       STA (TEMP),Y
-       JSR GEDGE    OBJ
-       LDY #$FC
-       STA (TEMP),Y
-       PLA
-       LDY SPWD
-       BEQ .4       TRANS WORKS EVEN IF PERSON BUSY
-* SPWD HOLDS 1, SO DOES Y
-.2     CMP PATBUS,Y
-       BEQ .5       BUSY
-       DEY
-       BPL .2
-.4     JSR PNTOBJ   WIPES TEMP
-       LDY #5
-       LDA (MISC),Y
-       AND #$10     ANIMATE (ALIVE)?
-       BEQ .5       NO
-       JSR FNPN     FANCY INC NXTPLN
-       CLC
-       RTS
-.5     LDA NXTPLN   PLAN MADE
-       JSR DELLST
-       SEC
-       RTS
-SPWD   .BS 1        1=SP1 CALLED BY SPAWN
-* TRANSFER CONTROL TO NEW PLAN
-TRN    >CRL NXTPLN,#3
-       LDA #0
-       STA SPWD     CALLED BY TRN
-       LDY #$FB
-       LDA CURPLN   RETURN TO PLAN#
-       ORA #$40     WILL BE SUSPENDED
-       STA (TEMP),Y
-       JSR SP1
-       BCS .5       CHAR DEAD
-       LDA CURPLN   RETURN TO PLAN#
-       PHA
-       JSR LL       SETS Y
-       PLA
-       ORA #$40     SUSPEND CURRENT PLAN
-       STA EDGETOP,Y
-.5     RTS
-* KILL CURPLN
-ADI    LDA CURPLN
-       PHA
-       JSR LLL
-       CMP #3       LEN
-       BCC .3       SPAWNED; NO PLAN TO REACTIVATE
-       LDY #$FB
-       LDA (TEMP),Y PLAN TO REACTIVATE
-       JSR LL
-       LDA EDGETOP,Y
-       AND #%10111111    REACTIVATE
-       STA EDGETOP,Y
-.3     PLA
-       JMP DELLST
-* DELETE ITEM: DELETE ALL EDGES INVOLVING IT
-* DELETE ALL ITEMS PART OF IT
-* CAN'T DELETE EVERY EDGE WI. OBJ#,
-* SINCE OBJ#S ARE ALSO ADJ#S.
-DLO    LDA CUROBJ
-       PHA
-       JSR GEDGE
-       STA CUROBJ
-       JSR INLINE
-       .DA .5,#NULL,#ADEL,#VOBJ,IN,#ADEL,#VOBJ,ON,#ADEL,#VOBJ,PARTOF
-.1     .DA #$80,#ISEDG,#VOBJ,#HOLDS,#VX,#$80,#ISEDG,#VOBJ,#PART,#VX,#DELIT,#VX,#GOTO,.1
-.2     .DA #$80,#ISEDG,#VOBJ,#UNDER,#VX,#ADEL,#VX,#ON,#VOBJ,#GOTO,.2,#0
-.5     PLA
-       STA CUROBJ
-       RTS
-UPS    JSR VDAT     SCORE #:0-255
-UP2    TAY
-       LDA #$FF
-       EOR KSC,Y
-       BEQ .3       POINTS ALREADY GIVEN
-       STA KSC,Y     MARK AS GIVEN
-       LDA .7,Y
-       CLC
-       ADC SCORE
-       STA SCORE
-.3     RTS
-.7     .DA #2,#5,#1,#1,#5,#4,#5,#5,#4,#4,#5,#5,#5,#5,#4,#5,#5,#10,#5,#5
-* SCREAM,GUARD DRINK,BRUSH TEETH,CLIMB SHELF,PUSH PANEL,REMOVE BAR,PHOT MARK,PLAY TAPE2,TYPE "SESAME",REMOVE VENT,READ ID,SHOOT BULB,BURN OUT BATTERY,LEAVE,REMOVE HINGE,PUT SUGAR IN PAIL,KILL PROF,LEAVE WI PROF,OPEN TC,TOWEL
-* DESTROY AN OBJECT: DON'T REMOVE FROM ROOM,
-* BUT SET & ZERO A BUNCH OF BITS, ADD ADJEC DEAD/BROKEN
-* LIQUID SPILLS OUT IF IN IT
-DES    JSR GEDGE
-       STA CUROBJ   NOTE!! CHANGES VOBJ
-       JSR INLINE
-       .DA TRTS,#BITSET+$40,#VOBJ,#$80,0,#SKIP,#$80,#OBJIS,#ME,#AINC,GAMOVR,#$80,#OBJIS,#PROF,#$80,#OBJIS,#INT,#UPSCR,#16,#$80,#BITSET,#VOBJ,0,#$10,#AREP,#VOBJ,#ADJEC,#DEAD,#ELSE,#AREP,#VOBJ,#ADJEC,#BROKEN
-       .DA #$80,#NULL,#ASBIT,VOBJ,$4000,#AZBIT,#VOBJ,#$FF,#%10110111,%11100110
-* SWITCH OBJ X WITH Y: MAKE Y LIKE X: BROKEN, CONTENTS, ETC, & AREP IT IN LOCATION
-SW     JSR GEDGE
-       STA .3+1
-       JSR PNTOBJ
-       LDY #5
-.0     LDA (MISC),Y
-       STA .8,Y
-       DEY
-       BPL .0
-       JSR GEDGE
-       STA .5+1
-       JSR PNTOBJ
-       LDY #5
-       LDA (MISC),Y SAVE ONLY Y's NOUN TYPE
-       AND #6
-       STA .9
-.1     LDA .8,Y
-       STA (MISC),Y
-       DEY
-       BPL .1
-       LDY #5
-       LDA (MISC),Y
-       AND #%11111001
-       ORA .9
-       STA (MISC),Y
-* REPLACE ALL X WITH Y IN EDGES
-       LDA #2
-       STA .9       COUNTER
-       LDA #EDGES
-       LDY /EDGES
-.2     STA MISC
-       STY MISC+1
-       LDY #0
-.3     LDA #1       X
-       CMP (MISC),Y
-       BNE .6
-.5     LDA #2       Y
-       STA (MISC),Y REP X WITH Y
-.6     JSR IM       NOT INY FOR COMPARE TO (VB)
-       JSR IM
-       JSR IM
-       JSR IM
-       LDA MISC
-       CMP VB
-       LDA MISC+1
-       SBC VB+1
-       BCC .3       (MISC)<(VB)
-       DEC .9
-       BEQ .7       DONE BOTH PASSES
-       LDA #EDGES+3 2ND PASS, GET OTHER END OF EDGES
-       LDY /EDGES+3
-       BNE .2
-.7     RTS
-.8     .BS 6        TEMP STORAGE OF OBJ X ATTRIBUTES
-.9     .BS 1
-* UNBIND X
-UB     LDA #$FF
-       STA VAR
-       RTS
-* CONVERSATION GOTO: SET DEFAULT STARTING PATTERN FOR CHAR Y TO A
-CG     JSR GEDGE
-       TAY
-       JSR VDAT
-CGO2   STA MME+1    COUNTER USED IN FKN
-       PHA
-       STY LISNR
-       JSR FCN
-       JSR FKN      FIND KEY #
-       JSR INY      POINT TO BEG OF PATTERN
-       TYA
-       CLC
-       ADC MISC
-       BCC .5
-       INC MISC+1
-.5     PHA
-       LDA CHRNUM
-       TAX
-       ASL
-       TAY
-       PLA
-       STA KEYSTRT,Y
-       LDA MISC+1
-       STA KEYSTRT+1,Y
-       PLA
-       STA RNSTRT,X
-       LDA #$FF
-       STA CHRNUM   DON'T FALSELY THINK WE'VE LOADED XXX.RPL
-       RTS
-*--------------------------------
-* BIND 1ST UNBOUND VAR
-* ONLY CALLED IF AT LEAST 1 VAR IS UNBOUND
-BIND   LDY VAR
-       INY
-       BEQ .1       1ST VAR UNBOUND
-       LDY #1       BIND 2ND VAR
-.1     STA VAR,Y    BIND APPROPRIATE VAR
-       RTS
+ END OF ARCHIVE