Thread View: comp.sources.apple2
1 messages
1 total messages
Started by Jonathan A. Chandross
Sat, 01 Jun 1991 02:39
v001SRC051: Inmate Parser -- ATN Based, Part01/05
Author: Jonathan A. Chandross
Date: Sat, 01 Jun 1991 02:39
Date: Sat, 01 Jun 1991 02:39
1870 lines
51069 bytes
51069 bytes
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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads