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