home *** CD-ROM | disk | FTP | other *** search
- From: jac@yoko.rutgers.edu (Jonathan A. Chandross)
- Newsgroups: comp.sources.apple2
- Subject: v001SRC051: Inmate Parser -- ATN Based, Part01/05
- Message-ID: <May.31.22.39.39.1991.10987@yoko.rutgers.edu>
- Date: 1 Jun 91 02:39:40 GMT
- Approved: jac@paul.rutgers.edu
-
-
- 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
-