Document is being converted to HTML by Pete Robinson, please send HTML corrections to me.


PAW
TECHNICAL
GUIDE

A Technical guide to:
The Professional Adventure Writer
A graphic adventure writing system for the Sinclair Spectrum computers


Converted to Word Format by Pablo Contreras
If Gilsoft want to sue me for this, please don't because:
  1. I'm a great fan of your product and want to encourage its use
  2. Nobody would buy it now anyway
  3. I did buy PAW when it came out
  4. I'm very skint

Although I've tried to keep errors out, I am only human so please e-mail me any corrections you may find - my e-mail address is pablo@patrol.i-way.co.uk.








¸ 1986 Gilsoft International Ltd.
Program: T.J. Gilberts, G.Yeandle and P.Wade
Graphics: D.Peeke, K.Maddocks and A.Williams
Manuals: T.J. Gilberts

All Rights reserved.  No part of this publication may be copied, loaned, hired or reproduced in any form 
whatsoever including electronic retrieval systems without the prior written consent of the authors and 
Gilsoft International Ltd.

The above notice does not apply to the 'run time' routines appended to, and which form a part of, a 
saved game which you are free to distribute any way you wish in that form.  All we would request is that 
you credit the use of the Professional Adventure Writer somewhere within the game.

Acknowledgement

Thanks to Howard and Pam for their forbearance.  Phil for his 'comments', Greame for his ideas, Dicon 
et al for the graphics and all our customers for their support and suggestions.

Overview
PAW can be divided into three main functional areas thus:

1/  The Database

The database is the collection of tables organised in a logical manner, which contain all the information 
to define an adventure game.  This database is initially set up to contain a minimum of entries which 
will probably be needed in every game.  There is usually one entry in a table to simplify the operations 
of the system.  The database may utilise the additional sideways RAM pages of a 128K Spectrum.

2/  The Editor

This consists of a two level menu system i.e. most functions on the main menu present a sub-menu from 
which all facilities can be selected.  All facilities are set either from a command line as part of the sub-
menu option or in response to a prompt.  This combination of menu and command line has been found 
to be the most efficient both for the beginner and the more experienced user.

3/  The Interpreter

The real heart of PAW is contained in this section of the program.  The next chapter deals with the 
operation of the interpreter in detail, but it essentially fetches commands from the player and uses the 
information contained in the database to decode and respond to those commands.

The sheer size of PAW precludes it being held entirely within the main memory area.  On a 128K 
Spectrum the majority of the code is held as overlays on a sideways RAM page and transferred into the 
main area whenever required.  A similar system is used on a 48K Spectrum by holdin three of the 
overlays in free memory until the area of memory used is overwritten.  If the sideways RAM page is 
initialised on a 128K or the memory area overwritten on a 48K, an attempt to select an option not in the 
current overlay will result in PAW attempting to lead the requisite overlay from cassette (or disc).  The 
main menu and overlay system gives an overhead of approximately 4K which is unavailable to PAW for 
the database.  About 10K is consumed by the interpreter and its workspace (e.g. Ramsave buffer, input 
and wordwrap buffers etc.)  This leaves approximately 27K for the database, plus 5 pages of 16K each, 
on a 128K Spectrum (a total of about 117K).  This is maximised by the inclusion of a text compressor 
which introduces an overhead of 222 bytes (for an expansion dictionary) this giving about 40% effective 
text compression.  On an average text only game on the 48K Spectrum this provides an effective 
addition of 8K of database space (i.e. a total of 35K).
The Interpreter
The following description of the interpreter should be read in conjunction with the flowcharts provided 
overleaf.

Initialise
The background colours and character set are selected - the screen isn't cleared as this always occurs 
upon describing location zero.  The flags are all zeroed except for; flag 37, the number of objects 
conveyable, which is set to 4; flag 52, the maximum weight of objects conveyable, which is set to 10; 
flags 46 & 47, the current pronoun ("IT" usually), which are set to 255 (no pronoun) and glag 1 which 
is set to be the number of objects carried but not worn.  Note that clearing the flags has the effect that 
the game always starts at location zero.  This is because flag 38, the current location of the player, is 
now zero.

Describe Current Location
If flag 2 is non zero it is decremented (reduced by 1).  If it is dark (flag 0 is non zero) and flag 3 is non 
zero then flag 3 is decremented.  If it is dark, flag 4 is non zero and object 0 (the source of light) is 
absent, then flag 4 is decremented.

The screen is cleared if the current screen mode (contents of flag 40) is not 1.

If it is dark, and Object 0 is absent, then System message 0 (referred to as SM0 - "It's too dark to see 
anything") is displayed.  Otherwise any picture present for the location is drawn and the location 
description displayed without a NEWLINE.

Search Process Table 1
Flowchart 2 and the next section describe the scanning of a process table.  Process table 1 is used 
mainly to contain the entries to add extra information to the current location description.  E.g. details of 
open doors, objects present etc.  It will also contain a PROTECT action, when using screen mode 4, to 
set the screen line for text to scroll under.

We now enter the main loop of the interpreter which deals with teach time fame (i.e. each phrase 
extracted or each timeout on input which occurs) and the response to players commands.

Search Process Table 2
This contains the main control for PAW's turn at the game.  It is used to implement the movements and 
actions of PSI's, the uncontrolled events such as bridges collapsing, and so on.

Get Phrase
If flags 5 to 8 are non zero they are decremented.  If it is dark (Flag 0 is non zero) and flag 9 is non zero 
then it is decremented.  If it is dark and flag 10 is non zero is is decremented if object 0 is absent.

The parser is called to extract a phrase and convert it into a logical sentence - LS.  If the input buffer is 
empty, a new input line is obtained from the player by printing a prompt and making a call to the input 
routine.  The prompt will be the system message whose number is contained in flag 42 - a value of 0 will 
select one of the system messages 2,3,4 or 5 in the ration 30:30:30:10 respectively.

If the timeout option is selected, by making flag 48 contain a value greater than zero, then the input 
routine might time out.  In this case SM35 ("Time passes.") is displayed and a return made to scan 
process 2 again.

A phrase is extracted and converted into the logical sentence; by converting any words present, that are 
in the vocabulary, into their word value and placing them in the required flags.

If no valid phrase can be found then SM6 ("I couldn't understand any of that") is displayed, and a 
return made to scan process 2.

Search Response Table
Turns (flag 31 and 32), which is the number of valid phrases extracted by the parser, is increased by 
one.  Two flags area used to allow 256 lots of 256 turns (i.e. 65536).

The Response table is then scanned, for an entry which matches the Verb and Noun1 of the current LS, 
using the process table routines detailed below.

If it is successful in carrying out an action (i.e. If PAW executes at least one action other than 
NOTDONE) then a return is made to scan process table 2.

Search the Connections Table
A search is made of the connections table entry for the current location, for a word which matches the 
current LS Verb.  If one is found then the players current location (flag 38) is set to be the number 
associated with the word.  Then a return is made to describe the current location.  Otherwise PAW 
prints SM8 ("I can't go in that direction") if the current LS Verb has a word value less than 14 or SM7 
("I can't do that") if it does not.  In both cases a return is made to scan process table 2.

Flowchart 1

                      /-------\
                      | Start |
                      \-------/
                          |
                      +----------+
                      |Initialise|
                      +----------+
                          |
        +---\             |
        |D   >------------+---------------------------------------+
        +---/             |                                       |
                      +-----------+                               |
                      |Describe   |                               |
                      |Location   |                               |
                      |Process 1  |                               |
                      +-----------+                               |
                          |                                       |
+-------------------------|                                       |
|                         |                                       |
|                     +-----------+                               |
|                     |Process 2  |                               |
|                     |Get Phrase |                               |
|                     +-----------+                               |
|                         |                                       |
|                        /-\                                      |
|               No  /----   ----\  Yes                            |
^           +------<    Found?   >-------+                        |
|           |       \----\-/----/        |                        ^
|           |                            |                        |
|          /-\                      +-----------+                 |
|  No /----   ----\  Yes            |TURNS+1    |                 |
|  +-<   Timeout?  >----+           |Search     |                 |
|  |  \----   ----/     |           |Response   |                 |
|  |       \-/          |           +-----------+                 |
|  |                    |                |                        |
| /------------/   /----------/          |                        |
| |SM6         |   |SM35      |          |                        |
| |"I don't    |   |"Time     |          |                        |
| |"Understand"|   |Passes.." |          |                        |
| /------------/   /----------/         /-\                       |
|      |                |      Yes /----   ----\  No              |
+------+----------------+--<------<    Done?    >-----+           ^
|                                  \----\-/----/      |           |
|                                                     |           |
|                                                +-----------+    |
|                                                |Search     |    |
|                                                |Connection |    |
|                                                |Table      |    |
|                                                +-----------+    |
|                                                     |           |
|                                                    /-\          |
|                                           No  /----   ----\ Yes |
|                      +-----------------------<    Found?   >----+
|                      |                        \----\-/----/
|                     /-\
|                /----   ----\
|      +--------<  Verb<14?   >-----------+
|      |         \----\-/----/            |
|      |                                  |
|  /----------/                      /-----------/
|  |SM8       |                      |SM7        |
|  |"Can't    |                      |"Can't go  |
|  |do that"  |                      |that way"  |
|  /----------/                      /-----------/
|      |                                  |
+------+---------------<------------------+

Flowchart 2

                      /-------\
                      | Start |
                      \-------/
                          |
                          +-------------------------------------+
                          |                                     |
                         /-\                                    |
                No  /----   ----\                               |
+------------------<More Entries?>                              |
|                   \----\-/----/                               ^
|                         | Yes                                 |
|                   /----/-\----\ Yes                           |
|                  <In Response? >----------------+             |
|                   \----\-/----/                 |             ^
|                         | No              /----/-\----\ No    |
|                         |                < Verb Match? >------+
|                         |                 \----\-/----/       |
|                         |                       | Yes         ^
|                         |                 /----/-\----\ No    |
|                         |                < Noun Match? >------+
|                         |                 \----\-/----/       |
|                         |                       | Yes         ^
|                         +-----------------------+----<--------+-+
|                         |                                     | |
|                   /----/-\-----\ No                           | |
|                  <More CondActs?>-----------------------------+ |
|                   \----\-/-----/                              ^ |
|                         | Yes                                 | |
|                         |                                     | ^
|               No  /----/-\-----\ Yes                          | |
|        +---------<  Condition?  >---------------+             | |
|        |          \----\-/-----/                |             ^ |
|        |                                        |             | |
|   +-----------+                           /----/-\----\ No    | |
|   | Do Action |                          <   Succeed?  >------+ |
|   +-----------+                           \----\-/----/         |
|        |                                        | Yes           |
|  /----/-\----\ Yes    +---\                     |               |
| <    DESC?    >-------+ D  >                    |               |
|  \----\-/----/        +---/                     |               |
|        | No                                     |               |
|  /----/-\----\ No                               |               |
+-<    Exit?    >---------------------------------+---------------+
|  \----\-/----/                                                   
|
+--------+
         |
     /-------\
     |  End  |
     \-------/

Scan a Process Table
Response is a process table (Note that any sub-processes which are called from within Response exhibit 
the same features), so it will also be scanned by this section of PAW>  The difference of course is that 
PAW tries to match the Verb and Noun1 of the logical sentence in a Response table.

Essentially PAW will look at each entry in the table until it is exhausted - the table of entries, not 
PAW!  Assuming there is an entry, it will, if in Response, ensure the Verb and Noun match those of the 
LS.  The use of the words "*" and "_", as either the Verb or the Noun, will cause a match with any word 
in that part of the logical sentence.  Thus entries in Response of "* *", "_ _", and combinations of same, 
will cause a trigger of the entry no matter what the LS.  This feature must be used in any table which 
will be called by both a Response and a Process table.  If in a Process the Verb and Noun will match 
anyway, no matter what the logical sentence.

PAW will then look at each CondAct in turn; if it is a condition, which succeeds, then PAW will look 
at the next condact.  Otherwise it will drop out of the current condact list and look at the next entry, if 
present, in the table - an exception to this is the CondAct QUIT which, if it fails, will drop out of the 
table completely - this is not shown in flowchart 2 for clarity.  If it is an action it will be carried out.  
Actions can be divided into five main groups:

1/ Desc; which will completely exit the execution of all tables (i.e. even if in a 10th level sub-process) 
and jump to describe the current location.

2/ END: (a group on its own) which will completely exit the execution of all tables and jump to 
initialise a new game.

3/ Exit; any action which will stop processing of the current table and exit to the calling table (or back 
to the main loop if in Response, Process 1 or 2).  E.g. INVEN, DONE etc.

4/ Conditional Exit; any action which will stop processing of the current table and exit to the calling 
table (or back to the main loop if in Response, Process 1 or 2) if it fails to do its required function.  E.g. 
GET, PUTIN etc.  Otherwise it will continue with the next CondAct.

5/ Normal; any action which carries out its function, and allows PAW to continue looking at the next 
CondAct in the current entry.  E.g. COPYFF, PLUS etc.

It may be seen that QUIT acts like a type 4 action, but is still a condition, so its a CondAct!  The 
summary of CondActs at the end of this book shows which type each Action is.

The CondActs
There now follows a detailed description of each CondAct.  They are divided into groups according to 
the subject they deal with in PAW; such as flags, objects etc and give some hints as to a possible use.

Several abbreviations are used in the descriptions as follows.

locno. Is a valid location number.

locno+ is a valid location number or; 252 (not-created), 253 (worn), 254 (carried) and 255 which is 
converted into the current location of the player.

mesno. is a valid message.

sysno. is a valid system message

flagno. is any flag (0 to 255).

procno. is a valid sub-process number.

word is word of the required type, which is present in the vocabulary, or "_" which ensures no-word - 
not an anymatch as normal.

value is a value from 0 to 255.

Conditions
There are four conditions which deal with testing the location of the player as follows;

AT locno.
Succeeds if the current location is the same as locno.

NOTAT locno.
Succeeds if the current location is different to locno.

ACGT locno.
Succeeds if the current location is greater than locno.

ATLT locno.
Succeeds if the current location is less than locno.

There are eight conditions which deal with the current location of an object;

PRESENT objno.
Succeeds if Object objno. is carried, worn, or at the current location.

ABSENT objno.
Succeeds if Object objno. is not carried, not worn and not at the current location.

WORN objno.
Succeeds if object objno. is worn.

NOTWORN objno.
Succeeds if Object objno. is carried.

CARRIED objno.
Succeeds if Object objno. is carried.

NOTCARR objno.
Succeeds if Object objno. is not carried.

ISAT objno. locno+
Succeeds if Object objno. is not at Location locno.

ISNOTAT objno. locno+
Succeeds if Object objno. is not at Location locno.

There are eight conditions which deal with the value and comparison of flags;

ZERO flagno.
Succeeds if Flag flagno. is set to zero.

NOTZERO flagno.
Succeeds if Flag flagno. is not set to zero.

EQ flagno. value
Succeeds if Flag flagno. is equal to value.

NOTEQ flagno. value
Succeeds if Flag flagno. is not equal to value.

GT flagno. value
Succeeds if Flag flagno. is greater than value.

LT flagno. value
Succeeds if Flag flagno. is set to less than value.

SAME flagno1 flagno2
Succeeds if Flag flagno1 has the same value as Flag flagno2.

NOTSAME flagno1 flagno2
Succeeds if Flag flagno1 does not have the same value as Flag flagno2.

There are five conditions to check for an extended logical sentence.  It is best to use these conditions 
only if the specific word (or absence of word using "_") is needed to differentiate a situation.  This 
allows greater flexibility in the commands understod by the entry.

ADJECT1 word
Succeeds if the first noun's adjective in the current LS is word.

ADVERB word
Succeeds if the adverb in the current LS is word.

PREP word
Succeeds if the preposition in the current LS is word.

NOUN2 word
Succeeds if the second noun in the current LS is word.

ADJECT2 word
Succeeds if the second noun's adjective in the current LS is word.

The following condition is for random occurrences.  You could use it to provide a chance of a tree 
falling on the player during a lightning strike or a bridge collapsing etc.  Do not abuse this facility, 
always allow a player a way of preventing a problem; such as rubber boots for the lightning, or similar.

CHANCE percent
Succeeds if percent is less than or equal to a random number in the range 1-100 (inclusive).  This a 
CHANCE 50 condition would allow PAW to look at the next CondAct only if the random number 
generated was between 1 and 50, a 50% chance of success.

A single condition to test for a timeout;

TIMEOUT
Will succeed if the last request for input from the player was allowed to timeout.  For example an entry 
in Process table 2 of; TIMEOUT MESSAGE 0 (where message 0 read "Come on sleepy") could be 
created, perhaps with a CHANCE or a count of time outs to make it less monotonous!

The true CondAct;

QUIT
SM12 ("Are you sure") is printed and the input routine called.  Will succeed if the player replies with 
the first letter of SM30 ("Y") to the prompt.  If not then Actions NEWTEXT and DONE are performed.

Actions

There are nineteen actions to deal with the manipulation of object positions;

GET objno.
If Object objno. is worn or carried, SM25 ("I already have the _.") is printed and actions NEWTEXT 
DONE are performed.

If Object objno. is not at the current location, SM26 ("There isn't one of those here.") is printed and 
actions NEWTEXT DONE are performed.

If the total weight of the objects carried and worn by the player plus Object objno. would exceed the 
maximum conveyable weight (Flag 52) then SM43 ("The _ weighs too much for me.") is printed and 
actions NEWTEXT DONE are performed.

If the maximum number of objects is being carried (Flag 1 is greater than, or the same as, Flag 37) ("I 
can't carry any more things.") is printed and actions NEWTEXT DONE are performed.  In addition any 
current DOALL loop is cancelled.

Otherwise the position of Object objno. is changed to carried, Flag 1 is incremented and SM36 ("I now 
have the _.") is printed.

DROP objno.
If Object objno. is worn then SM24 ("I can't.  I'm wearing the _.") is printed and actions NEWTEXT 
DONE are performed.

If Object objno. is at the current location (but neither worn nor carried), SM49 ("I don't have the _.") is 
printed and actions NEWTEXT DONE are performed.

If Object objno. is not at the current location then SM28 ("I don't have one of those.") is printed and 
actions NEWTEXT DONE are performed.

Otherwise the position of Object objno. is changed to the current location, Flag 1 is decremented and 
SM39 ("I've dropped the _.") is printed.

WEAR objno.
If Object objno. is at the current location (but not carried or worn) SM49 ("I don't have the _.") is 
printed and actions NEWTEXT DONE are performed.

If Object objno. is worn, SM29 ("I'm already wearing the _.") is printed and action NEWTEXT DONE 
are performed.

If Object objno. is worn, SM29 ("I'm already wearing the _.") is printed and actions NEWTEXT DONE 
are performed.

If Object objno. is not carried, SM28 ("I don't have one of those.") is printed and actions NEWTEXT 
DONE are performed.

If Object objno. is not flagged as Wearable (WR option in the object weight menu) then SM40 ("I can't 
wear the _.") is printed.

Otherwise the position of Object objno. is changed to worn, Flag 1 is decremented and SM37 ("I'm 
now wearing the _.") is printed.

REMOVE objno
If Object objno. is carried or at the current location (but not worn) then SM50 ("I'm not wearing the 
_.") is printed and actions NEWTEXT DONE are performed.

If Object objno. is not worn, SM23 ("I'm not wearing one of those.") is printed and actions NEWTEXT 
DONE are performed.

If Object objno. is not flagged as wearable (and thus removable) then SM41 ("I can't remove the _.") is 
printed and actions NEWTEXT DONE are performed.

If the maximum number of objects is being carried (Flag 1 is greater than, or the same as, Flag 37), 
SM42 ("I can't remove the _.  My hands are full.") is printed and actions NEWTEXT DONE are 
performed.

Otherwise the position of Object objno. is changed to carried.  Flag 1 is incremented and SM38 ("I've 
removed the _.") printed.

CREATE objno
The position of Object objno. is changed to the current location and Flag 1 is decremented if the object 
was carried.

DESTROY objno.
The position of Object objno. is changed to not-created and Flag 1 is decremented if the object was 
carried.

SWAP objno1 objno2
The positions of the two objects are exchanged.  Flag 1 is not adjusted.  The currently referenced object 
is set to be Object objno2.

PLACE objno. locno+
The position of Object objno. is changed to Location locno.  Flag 1 is decremented if the object was 
carried.  It is incremented if the object is placed at location 254 (carried).

PUTO locno+
The position of the currently referenced object (i.e. that object whose number is in flag 51), is changed 
to be Location locno.  Flag 54 remains its old location.  Flag 1 is decremented if the object was carried.  
It is incremented if the object is placed at location 254 (carried).

PUTIN objno. locno.
If Object locno. does not exist or is not flagged as a container (option C on the object weight menu) 
then a run time error is generated of "Illegal Argument".

If Object objno. is worn then SM24 ("I can't.  I'm wearing the _.") is printed and actions NEWTEXT 
DONE are performed.

If Object objno. is at the current location (but neither worn nor carried), SM49 ("I don't have the _.") is 
printed and actions NEWTEXT DONE are performed.

If Object objno. is not at the current location, but not carried, then SM28 ("I don't have one of those.") 
is printed and actions NEWTEXT DONE are performed.

Otherwise the position of Object objno. is changed to Location locno. Flag 1 is decremented and SM44 
("The _ is in the"), a description of Object locno. and SM51 (".") is printed.

TAKEOUT objno. locno.
If Object locno. does not exist or is not flagged as a container (option C on the object weight menu) 
then a run time error is generated "Illegal Argument".

If Object objno. is worn or carried, SM25 ("I already have the _.") is printed and actions NEWTEXT 
DONE are performed.

If Object objno. is at the current location, SM45 ("The _ isn't in the"), a description of Object locno. 
and SM51 (".")is printed and actions NEWTEXT DONE are performed.

If Object objno. is not at the current location and not at Location locno. then SM52 ("There isn't one of 
those in the"), a description of Object locno. and SM51 (".")is printed and actions NEWTEXT DONE 
are performed.

If Object locno. is not carried or worn, and the total weight of the objects carried and worn by the player 
plus Object objno. would exceed the maximum converyable weight (Flag 52) then SM43 ("The _ 
weighs too much for me.") is printed and actions NEWTEXT DONE are performed.

If the maximum number of objects is being carried (Flag 1 is greater than, or the same as, Flag 37), 
SM27 ("I can't carry any more things.") is printed and actions NEWTEXT DONE are performed.  In 
addition any current DOALL loop is cancelled.

Otherwise the position of Object objno. is changed to carried, Flag 1 is incremented and SM36 ("I now 
have the _.") is printed.

Note: No check is made, by either PUTIN or TAKEOUT, that Object locno. is actually present.  This 
must be carried out by you if required.

DROPALL
All objects which are carried or worn are created at the current location (i.e. all objects are dopped) and 
Flag 1 is set to 0.  This is included for compatibility with older writing systems.  Note that DOALL 254 
will carry out a true DROP ALL, taking care of any special actions included.

The next six actions are automatic versions of GET, DROP, WEAR, REMOVE, PUTIN and 
TAKEOUT.  They are automatic in that instead of needing to specify the object number, they each 
convert Noun (Adjective)1 into the currently referenced object - by searching the object word table.  The 
search is for an object which is at one of several locations in descending order of priority - see 
individual descriptions.  This search against priority allows PAW to 'know' which object is implied if 
more than one object with the same Noun description (when the player has not specified an adjective) 
exists; at the current location, carried or worn - and in the container in the case of TAKEOUT.

AUTOG
A search for the object number represented by Noun (Adjective)1 is made in object word order of 
location priority; here, carried, worn.  i.e. The player is more likely to be trying to GET an object that is 
at the current location than one that is carried or worn.  If an object is found its number is passed to 
GET action.  Otherwise if there is an object in existence anywhere in the game if Noun1 was not in the 
vocabulary then SM26 ("There isn't one of those here.") is printed.  Else SM8 ("I can't do that.") is 
printed (i.e. It is not a valid object but does exist in the game).  Either way actions NEWTEXT DONE 
are performed.

AUTOD
A search for the object number represented by Noun (Adjective)1 is made in object word in order of 
location priority; carried, worn, here.  i.e. The player is more likely to be trying to DROP a carried 
object than one that is worn or here.  If an object is found its number is passed to the DROP action.  
Otherwise if there is an object in existence anywhere in the game or if Noun1 was not in the vocabulary 
then SM28 ("I don't have one of those.") is printed.  Else SM8 ("I can't do that.") is printed (i.e. It is 
not a valid object but does exist in the game).  Either way actions NEWTEXT DONE are performed.

AUTOW
A search for the object number represented by Noun (Adjective)1 is made in object word in order of 
location priority; carried, worn, here.  i.e. The player is more likely to be trying to WEAR a carried 
object than one that is worn or here.  If an object is found its number is passed to WEAR action.  
Otherwise if there is an object in existence anywhere in the game or if Noun1 was not in the vocabulary 
then SM28 ("I don't have one of those.") is printed.  Else SM8 ("I can't do that.") is printed (i.e. It is 
not a valid object but does exist in the game).  Either way actions NEWTEXT DONE are performed.

AUTOR
A search for the object number represented by Noun (Adjective)1 is made in object word in order of 
location priority; worn, carried, here.  i.e. The Player is more likely to be trying to REMOVE a worn 
object than one that is carried or here.  If an object is found its number is passed to the REMOVE 
action.  Otherwise if there is an object in existence anywhere in the game or if Noun1 was not in the 
vocabulary then SM23 ("I can't do that.") is printed (i.e. It is not a valid object but does exist in the 
game).  Either way actions NEWTEXT DONE are performed.

AUTOP locno.
A search for the object number represented by Noun (Adjective)1 is made in object word in order of 
location priority; carried, worn, here.  i.e. The plyaer is more likely to be trying to PUT a carried object 
inside another than one that is worn or here.  If an object is found its number is passed to the PUTIN 
action.  Otherwise if there is an object in existence anywhere in the game or if Noun1 was not in the 
vocabulary then SM28 ("I don't have one of those.") is printed.  Else SM8 ("I can't do that.") is printed 
(i.e. It is not a valid object but does exist in the game).  Either way actions NEWTEXT DONE are 
performed.

AUTOT locno.
A search for the object number represented by Noun (Adjective)1 is made in object word in order of 
location priority; in container, carried, worn, here.  i.e. The player is more likely to be trying to get an 
object out of a container which is actually in there than one that is carried, worn or here.  If an object is 
found its number is passed to the TAKEOUT action.  Otherwise if there is an object in existence 
anywhere in the game or if Noun1 was not in the vocabulary then SM52 ("There isn't one of those in 
the "), a description of Object locno. and SM51 (".") is printed.  Else SM8 ("I can't do that.") is printed 
(i.e. It is not a valid object but does exist in the game).  Either way actions NEWTEXT DONE are 
performed.

Note: No check is made, by either AUTOP or AUTOT, that Object locno. is actually present.  This must 
be carried out by you - if required.

COPYOO objno1 objno2
The position of Object objno2 is set to be the same as the position of Object Objno1.  The currently 
referenced object is et to be Object objno2.

There ae four actions which allow various parameters of objects to be; placed in flags, set fro flags - for 
comparison or manipulation.

COPYOF objno. flagno.
The position of Object objno. is copied into Flag flagno.  This could be used to examine the location of 
an object in a comparison with another flag value. e.g. COPYOF 1 11 SAME 11 38 could be used to 
check that object 1 was at the same location as the player - although ISAT 1 255 would be better!

COPYFO flagno. objno.
The position of Object objno. is set to be the contents of Flag flagno.  An attempt to copy from a flag 
containing 255 will result in a run time error of "Invalid Argument".  Setting an object to an invalid 
location will still be accepted as it presents no danger to the operation of PAW.

WHATO
A search for the object number represented by Noun (Adjective)1 is made in object word in order of 
location priority; carried, worn, here.  This is because it is assumed any use of WHATO will be related 
to carried objects rather than any that are worn or here.  If an object is found its number is placed in flag 
51, along with the standard current object parameters in flags 54-57.  This allows you to create other 
auto actions (the tutorial gives an example of this for dropping objects in the tree).

WEIGH objno. flagno.
The true weight of Object objno. is calculated (i.e. if it is a container, any objects inside have their 
weight added - don't forget that nested containers stop adding their contents after ten levels) and the 
value is placed in Flag flagno.  This will have a maximum value of 255 which will not be exceeded.  If 
Object objno. is a container of zero weight, Flag flagno. will be cleared as objects in zero weight 
containers, also weigh zero!

Now ten actions to manipulate the flags;

SET flagno.
Flag flagno. is set to 255.

CLEAR flagno.
Flag flagno. is cleared to 0.

LET flagno. value
Flag flagno. is set to value.

PLUS flagno. value
Flag flagno. is increased by value.  If the result exceeds 255 the flag is set to 255.

MINUS flagno. value
Flag flano. is decreased by value.  If the result is negative the flag is set to 0.

ADD flagno1 flagno2
Flag flagno2 has the contents of Flag flagno1 added to it.  If the result exceeds 255 the flag is set to 
255.

SUB flagno1 flagno2
Flag flagno2 has the contents of Flag flagno1 subtracted from it.  If the result is negative the flag is set 
to 0.

COPYFF flagno1 flagno2
The contents of Flag flagno1 is copied to Flag flagno2.

RANDOM flagno.
Flag flagno. is set to a number from the Pseudo-random sequence from 1 to 100.  This could be useful 
to allow random decisions to be made in a more flexible way than with the CHANCE condition.

MOVE flagno
This is a very powerful action designed to manipulate PSI's.  It allows the current LS Verb to be used to 
scan connections table for the location given in Flag flagno.  If the Verb is found then Flag flagno. is 
changed  to be the location number associated with it, and the next condact is considered.  If the verb is 
not found, or the original location number was invalid, then PAW considers the next entry in the table - 
if present.  This you could consider that PAW carries out the following imaginary entries on exit from 
Response if no action has been done;

	_	_	MOVE	38	; Attempt to move player
			DESC		; Describe this new loc.

	_	_	LT	33 14	; Movement word?
			SYSMESS 7	; "Can't go that way.."
			DONE

	_	_	SYSMESS 8	; "I can't do that"

This feature could be used to provide characters with Random movement in valid directions; by setting 
the LS Verb to a random movement word and allowing MOVE to decide if the character can go that 
way.  Note that any special movements which are dealt with in the Response for the player, must be 
dealt with separately for a PSI as well.


Three actions to manipulate the flags dealing with the player;

GOTO locno.
Changes the current location to locno.  This effectively sets flag 38 to the value locno.

WEIGHT flagno.
Calculates the true weight of all objects carried and worn by the player (i.e. any containers will have the 
weight of their contents added upto a maximum of 255) this value is then placed in Flag flagno.  This 
would be useful to ensure the player was not carrying too much weight to cross a bridge without it 
collapsing etc.

ABILITY value1 value2
This sets Flag 37, the maximum number of objects conveyable, to value1 and Flag 52, the maximum 
weight of objects the player may carry and wear at any one time (or their strength), to be value2.  No 
checks are made to ensure that the player is not already carrying more than the maximum.  GET and so 
on, which check the values, will still work correctly and prevent the player carrying any more objects, 
even if you set the value lower than that which is already carried!


There are seven actions which deal with the manipulation of the flags for the screen mode, format and 
input etc;

MODE mode option
There are five screen modes each controlled by Flag 40 and set using the MODE action thus:-

Mode 0
If a picture (other than 'subroutine') is present in the database, the screen is cleared to the default 
colours and the picture drawn.  Once a key is pressed the original colours are restored, and the location 
is described.

Mode 1
Text Only.  Full screen scroll.  Text is output to the screen continuously.  CLS is not active on describe.

Mode 2.
If a picture (other than 'subroutine') is present in the database, the screen is cleared to the default 
colours and the picture drawn.  The original colours are restored, the area below the line given in Flag 
41 is cleared and text printed from the same line.

Mode 3
As Mode 2 above but the picture does not scroll away.

Mode 4
A text only mode which protects the location description as if it were a picture, all other text scrols 
under.  You will probably need a PROTECT action at a suitable point in Process 1 (e.g. after 
LISTOBJ?) as otherwise only as far as the last but one line of text will be protected.

In all graphic modes above; option 2 forces the border NOT to be set to the Paper colour - it's best to 
select this in modes 2 & 3 as the border is reset as soon as the picture is fully drawn causing an 
annoying flicker.  Option 1 makes SM32 ("More.") appear when the screen area fils (unlike "Scroll?" 
you cannot breakout - will, in the editor you can!).  Option 3 of course provides both options and option 
0 neither!  e.g. MODE 4 1 will select a fixed text window with a "More." prompt.

LINE lineno.
This sets the line that text should be printed from in the split screen graphic modes, and in the case of 
mode 2 the top line of the area to be cleared.  Be careful when using a lower screen input (see INPUT 
action) to allow at least four spare lines in the upper screen (not forgetting to account for the number of 
lines used by the prompt and marker) or a runtime error will occur if a full input line is entered.

GRAPHIC option
This allows the way in which pictures are dealt with by PAW to be modified, there are three valid 
options;

0 - Normal, any picture present for a location is drawn when the player first visits that location, and then 
only if pictures are turned ON or a temporary redraw is requested.

1 - OFF, any pictures are completely ignored by PAW, even if a temporary redraw is requested.

2 - ON, any picture present for a location is drawn every time the player visits that location.

There is an option 3 (option = 2+1) but pictures OFF takes priority anyway, so it is redundant.  The 
current picture for a location can be redrawn by adding 128 to flag 29, this is a temporary redraw, which 
can be used for when the player requests the picture in Normal mode.  i.e. PLUS 29 128 DESC would 
be required entry in Response.

PROMPT sysno.
Causes System message sysno. to be displayed whenever PAW obtains a command line from the player.  
A value of 0 (default) will cause PAW to select one of SM2, SM3, SM4 or SM5 in the ratio 
30:30:30:10 respectively.  Note this does not affect the prompts displayed by the END or QUIT 
condacts.

TIME duration option
Allows input to be set to 'time-out' after a specific duration in 1.28 secon intervals, i.e. the Process 2 
table will be called again if the player types nothing for the specified period.  'option' allows this to 
also occur on ANYKEY and "More." prompt.  In order to calculate the number to use for the option 
just add the numbers hown next to each item to achieve the required combination;

1 - While waiting for the first character of Input only.
2 - While waiting for the key on the "More." prompt.
4 - While waiting for the key on the ANYKEY action.

e.g. TIME 5 6 (option = 2+4) will allow 6.4  seconds of inactivity on behalf of the player on input, 
ANYKEY or "More." and between each keypress.  Whereas TIME 5 3 (option = 1+2) allows it only 
on the first character of input and on "More.".

Time 0 0 will stop timeouts (default).

INPUT options
This action allows the way the input routine operates to be changed by selecting options.  Some 
combinations are of no use but are a by product of the way PAW works.  To calculate the number to use 
for the option just add the numbers shown next to each item to achieve the required combination;

1 - Will cause the input prompt, marker and cursor to be displayed in the lower screen area.  This is the 
preferred input mode for time out games, where timeout can occur between keypresses, as the input line 
is not left partially printed if timeout occurs part way through.

2 - will cause PAW to print a copy of the input line when ENTER is pressed, this is for use mainly with 
item 1 to allow the final input line to be displayed on screen so that the player knows what has been 
typed.

4 - This will cause the reprint of any text input so far, when input is resumed after a timeout.  Again 
mainly for use with item 1 when timeout can occur between keypresses.

A default of INPUT 0 (no options) is assumed by PAW.

PROTECT
Used in conjunction with MODE 4 mainly.  This action sets the current print line as the top of the 
scrolling text window.  It should only be used within Process 1 (it will be allowed elsewhere but has no 
meaning) after any text you want protected has been printed.  This is usually before / after a LISTOBJ 
action as objects are usually the last thing printed.

It also has uses in other modes to allow say a picture and part of the location description to be 
protected, with the remainder of the text scrolling underneath!


Three actions to deal with the printing of flag values on the screen;

PRINT flagno.
The decimal contents of Flag flagno. are displayed in the current temporary colours without leading or 
trailing spaces.  This is a very useful action.  Say flag 100 contained the number of coins carried by the 
player, then an entry in a process table of MES 10 ("You have ") PRINT 100 MESSAGE 11 (" gold 
coins."), could be used to display this to the player.

TURNS
SM17-20 "You have taken x turn(s)." is printed where x is Flag 31 + 256 * Flag 32.

SCORE
SM21-22 "You have scored x%" is printed where x is Flag 30.


Thirteen (!) actions to deal with screen output and control;

CLS
Clears the screen to current background colours.  Also clears the current print position and SAVEAT 
position to 0,0.

NEWLINE
Prints spaces to the end of the current line and then resets the colours & character set to the current 
background colours.

MES msno.
Prints Message mesno. in the current temporary colours, then carries out a NEWLINE action.

SYSMESS sysno.
Prints System Message sysno. in the current temporary colours.

PICTURE locno.
Draws graphics picture locno. regardless of whether it is a subroutine or main picture.  Note: the screen 
and colours are not cleared first as with describe location.  This could be used to add (or take away if 
you PRINTAT and MES to remove with spaces) parts of a picture.  The sample game TEWK uses this 
feature several times.  Note that a picture will be drawn from the last point used by the previous picture 
drawn!

PAPER n
Where n ranges from 0 to 9.  Changes background paper colour.

INK n
Where n ranges from 0 to 9.  Changes background ink colour.

BORDER n
Where n ranges from 0 to 7.  Changes screen border colour.

CHARSET value
Changes main character set to value given if valid, otherwise no action is taken.

The next three screen control actions allow a section of text to be printed on the screen away from the 
current print position.  This could be used to provide an information line on top of the current picture, 
or a section of text in a small window on the picture etc etc.  TEWK uses this facility to provide its drop 
down window inventory in response to the STATUS command.

SAVEAT
Flushes the current wordwrap buffer thus restoring the current background colours.  Then saves the 
current print position, overwriting any previously saved position.

BACKAT
Flushes the current wordwrap buffer thus restoring the current background colours.  Then restores the 
print position last saved by SAVEAT.

PRINTAT lineno. colno.
The current print position is changed to the specified value.  note this will also flush the wordwrap 
buffer and restore the temporary colours to the background colours.


Three actions dealing with listing objects on the screen.  The first two are controlled by / set the value 
of Flag 53 as desribed in the chapter on objects.

LISTOBJ
If any objects are present then SM1 ("I can also see:") is printed, followed by a list of all objects present 
at the current location.  If there are no objects then nothing (as in null, not the word!) is printed.

LISTAT locno+
If any objects are present then they are listed.  Otherwise SM53 ("nothing.") is printed - note that you 
will usually have to precede this action with a message along the lines of "In the bag is;" etc.  It would 
be possible to create an alternative to the INVEN action described next by using 254 & 254 as 
parameters for LISTAT.

INVEN
This action is not affected by the continuous object list flag for compatibility with older writing 
systems.

SM9 ("I have with me:") is printed.  If no objects are carried or worn SM11 ("Nothing at all.") is 
printed.  Otherwise the object text for each object that is carried or worn is printed on a separate line.  If 
an object is worn its object text is followed by SM10 (" (worn)"), right aligned on the next line if it will 
not fit on the same one.  Action DONE is then performed.

The two actions which completely exit Response / Process execution;

DESC
Will cancel any DOALL loop, any sub-process calls and make a jump to describe the current location.

END
SM13 ("Would you like to play again?") is printed and the input routine called.  Any DOALL loop an 
sub-process calls are concelled.  If the reply does not start with the first character of SM31 a jump is 
made to Initialise.  Otherwise a jump is made to the Editor (if it is present) or to the BASIC NEW 
command.

Three exit table actions;

DONE
This action jumps to the end of the process table and flags to PAW that an action has been carried out.  
i.e. no more condacts or entries are considered.  A return will this be made to the previous calling 
process table, or to the start point of any active DOALL loop.

NOTDONE
This action jumps to the end of the process table and flags to PAW that no action has been carried out.  
i.e. no more condacts or entries are considered.  A return will this be made to the previous calling 
process table or to the start point of any active DOALL loop.  This will cause PAW to print one of the 
"I can't" messages if needed.  i.e. if no other action is carried out and no entry is present in connections 
for the current Verb.

OK
SM15 ("OK") is printed and action DONE is performed.


Four actions to allow the current state of the game to be saved and restored;

SAVE
The standard start tape message for the spectrum is printed at the bottom of the screen.  When a key is 
pressed the game position is saved to tape, then action DESC is performed.  If BREAK is pressed 
during the save a jump is made to Initialise.  The save includes all information required to allow the 
restoration of the game to the exact same as it was before the save, including the values of flags, 
positions of objects, picture drawn flags etc.

LOAD
Loads data (which should be a game position) from tape, then action DESC is performed.  If BREAK is 
pressed during the load or a tape error is detected a jump is made to Initialise.  If data is loaded which is 
not a game position, a tape error will normally be detected.

RAMSAVE
In a similar way to SAVE this action saves all the information relevant to the game in progress not onto 
tape but into a memory buffer.  This buffer is of course volatile and will be destroyed when the machine 
is turned off which should be made clear to the player.  In addition it will also be cleared when you 
return to the editor section of PAW - in case you then change the design of the game!

RAMLOAD flagno.
This action is the counterpart of RAMSAVE and allows the saved buffer to be restored.  The parameter 
specifies the last flag to be reloaded which can be used to preserve values over a restore, for example an 
entry of:

RAMLO	_	COPYFF	30	255
			RAMLOAD	254
			COPYFF	255	30
			DESC

could be used to maintain the current score, so that the player can not use RAMSAVE / LOAD as an 
easy option for achieving 100%.

Note: unlike SAVE and LOAD the RAM actions allow the next Condact to be carried out.  They 
should normally always be followed by a DESC in order that the game state is restored to an identical 
position.

The actions could be used to implement an OOPS command that is common on other systems to take 
back the previous move; by creating an entry in Process 2 (or Response) which does an automatic 
RAMSAVE every time the player enters a move.


Two actions to allow the game to be paused to a time or until a key is pressed;

ANYKEY
SM16 ("Press any key to continue") is printed at the bottom of the screen and the keyboard is scanned 
until a key is pressed or until the timeout duration has elapsed if enabled.

PAUSE value
Pauses for value / 50 secs.  However, if value is zero then the pause is for 256/50 secs.  Note that the 
keyboard is disabled for the duration of the pause.

Two actions to deal with control of the parser;

PARSE
This action was designed to deal with speech to PSIs.  Any string (i.e. a further phrase enclosed in 
quotes [" "]) that was present in the players current phrase is converted into a LS - overwriting the 
existing LS formed originally for that phrase.  If no phrase is present or it is invalid, then PAWW will 
look at the next condact.  Otherwise the next entry is considered with the new LS of the speech made to 
the PSI.  Because it overwrites the current LS it must be used only in a sub-response table, the table will 
have form of:

*	*	PARSE			; Always do this entry
		MESSAGE x		; "They don't understand"
		DONE

word	word	CondAct list		; Any phrase PSI understands

_	_	MESSAGE x		; as above or different message

there will be two or more calling entries which will be similar to:

	SAY	name	SAME		pos 38	; Are they here?
			PROCESS y		; Decode speech..
			DONE			; LS destroyed so always DONE.

	SAY	name	MESSAGE	x	; "They are not here!"
			DONE

NEWTEXT
Forces the loss of any remaining phrases on the current input line.  You would use this to prevent the 
player continuing without a fresh input should something go badly for his situation. e.g. the GET action 
carries out a NEWTEXT if it fails to get the required object for any reason, to prevent disaster with a 
sentence such as:

	GET SWORD AND KILL ORC WITH IT

as attacking the ORC without the sword may be dangerous!


One action to deal with sound

BEEP duration pitch
Both duration and pitch may range from 0 to 255.  Duration is in units of one hundredth of a second.  
The value of itch is obtained by taking the value you would use in a BASIC BEEP command, adding 60 
then dividing by 2.


Several actions which are more difficult to classify;

PROCESS procno.
This powerful action transfers the attention of PAW to the specified Process table number.  This sub-
process will exhibit the same features as the table which called it.  i.e. if called by Response, PAW will 
match the Verb and Noun1 of the LS against the word entries as with the main table.  Note that it is a 
true subroutine call and any exit from the new table (e.g. DONE, OK etc) will return control to the 
condact which follows the calling PROCESS action.  A sub-process can call (nest) further process' to a 
depth of 10 at which point a run time error of "Limit reached" will be generated.

DOALL locno+
Another powerful action allows the implementation of an 'ALL' type command.

1 - An attempt is made to find an object at Location locno.  If this is unsuccessful the DOALL is 
cancelled and action DONE is performed.

2 - The object number is converted into the LS Nound1 (and Adjective1 if present) by reference to the 
object word table.  If Noun (Adjective)1 matches Noun (Adjective)2 then a return is made to step 1.  
This implements the "Verb ALL EXCEPT object" facility of the parser.

3 - The next condact and / or entry in the table is then considered.  This effectively converts a phrase of 
"Verb All" into "Verb object" which is then processed by the table as if the player had typed it in.

4 - When an attempt is made to exit the current table, if the DOALL is still active (i.e. has not been 
cancelled by an action) then the attention of PAW is returned to the DOALL as from step 1; with the 
object search continuing from the next highest object number to that just considered.

The main ramification of the search method through the object word table is; objects which have the 
Same Noun (Adjective) description (where the game works out which object is referred to by its 
presence) must be checked for in ascending order of object number, or one of them may be missed.

Use of DOALL to implement things like OPEN ALL must account for the fact that doors are often flags 
only and would have to be made into objects if they were to be included in a DOALL.

RESET locno+
This action is designed to allow the implementation of multi-part games where the objects which are not 
carried forward are reset to their starting location.

All objects which can be carried between parts must be present (with the same description) in each part.  
Any others may be reused within each part at will.

Any objects which are present at the current location are moved to Location locno.  And the current 
location is set to be locno.  Any other objects are set to the locations given by the Initially At table.  No 
effect on flags.  Action DESC is performed when complete.

The suggested method of its use is given in the chapter on multi-part games.

EXTERN value
Calls external routine with parameter value.  There is a special chapter dealing with this subject.

Detailed Description of the Database
The database consists of a number of inter-related tables and also contains an area of miscellaneous 
information e.g. values of background colours, number of objects conveyable, character sets etc.  On a 
128K machine the main data areas and pointers are present for each RAM page.  Effectively each page 
is an independent database.  The tables present (in the order they appear in memory) are:

UDG's
This table, which is 152 bytes long, contains the User Defined Graphics.  The UDG's can be changed 
with the character editor described later.  Codes 144-162.

Shades
This table is 128 bytes long and contains the graphics Shade patterns.  These can be changed with the 
character editor as described later.  Codes 0-15.

The above two tables are saved / loaded as a pair and are termed character set 0.  (although the ROM set 
provides codes 32-127).

Miscellaneous
Several small tables and values, 50 bytes in total.

Character Sets
This table is empty until a character set is inserted using the character editor.  768 bytes are used then 
by each character set inserted.

Dictionary
This table contains only one byte until the compressor is used for the first time on the database.  After 
that it contains 222 bytes of expansion dictionary to allow the tokens 165-255 to be converted into the 
letter groupings they represent.

The Process tables
These tables form the heart of the database providing the main game control.

The Response Table
Each entry contains the word values of the Verb and Noun for the LS the entry is to deal with followed 
by any number of condacts.  When the adventure is played, if there is an entry in the table which 
matches the Verb and Noun1 of the LS entered then the condacts are performed.  The condacts that may 
be present and the effect that they have is fully specified in the description of the Interpreter.  The order 
of entries in the table is in ascending order of the Verb value.  Entries which have the same Verb value 
are held in ascending order of the Noun value.  Entries with the same Verb and Noun value are held in 
the order they were inserted into the database.  The word "_" has a word of value 255 while the word 
"*" has a word value of 1.  An example of the order of the table, with word value shown in brackets, is 
as follows:

	*	(1)	*	(1)
	LOOK	(30)	UP	(10)
	LOOK	(30)	DOWN	(11)
	LOOK	(30)	_	(255)
	GET	(100)	*	(1)
	GET	(100)	KEY	(16)
	GET	(100)	LAMP	(26)
	GET	(100)	LAMP	(26)
	_	(255)	_	255

The other process tables are held in the same format, but the words are ignored by PAW when they are 
scanned, unless the process is called from within Response using a PROCESS action.

Process 1
Is canned by PAW after a location is described, to allow any additional information which forms a part 
of the location description to be displayed.

Process 2
Is scanned by PAW after every time frame.  That is after every phrase extracted from the player's input, 
or after every time-out on input.

Any further sub-processes follow the initial three when begun on the Process option of the main menu.

The Verb and Noun used for each entry in Process 1 and 2 (and any sub-processes called from them) 
have no meaning as they are ignored but can be used to provide a note as to the function of that entry 
within the table.

Every process table has an overhead of seven bytes (21 are used in a null database as three - including 
Response - are already present.)  Each entry subsequently uses 5 bytes and each condact uses 1, 2 or 3 
bytes depending on the number of parameters.

Note: If a word is deleted from the vocabulary, and no synonyms of it are present, then all entries in the 
process tables (including Response) which contain that word, are also deleted.

The Object Text table
This table, which has an entry for each object, contains the text which is printed when an object is 
described.  Each entry uses 3 bytes plus the length of the text.  An object is anything in the adventure 
which may be manipulated and objects are numbered from 0 upwards.  Object 0 is assumed by the 
Interpreter to be a source of light.  Whenever a new object text is inserted an entry of not-created is 
made for that object in the Initially at table, an entry of "_ _" in object word and a weight of 1 unit 
without a container or wear / remove attribute is inserted into the object weight table.

The Location Text table
This table, which has an entry for each location, contains the text which is printed when a location is 
described.  Each entry uses 3 bytes plus the length of the text.  The entries are numbered from 0 
upwards and location 0 is the location at which the adventure starts.  Whenever a new location is 
inserted a null entry for that location is also made in the connections table.


The Message Text table
This table contains the text of any messages which are needed for the adventure.  The messages are 
numbered form 0 upwards and each one uses 3 bytes plus the length of the text.

The System Messages
This table contains the messages used by the Interpreter.  Each entry uses 3 bytes plus the length of the 
text.  The description of the Interpreter shows when these messages are used.  In addition extra 
messages can be inserted by the writer to provide messages for the game if so required.

The Connections table
This table has an entry for each location and each entry may either be empty (null) or contain a number 
of 'movement pairs'.  A movement pair consists of a word value of a Verb (or conversion Noun) from 
the vocabulary followed by a location number.  This means that any Verb (or conversion Noun) with 
that word value causes movement to that location.  A typical entry could be SOUTH 6 EAST 7 LEAVE 
6 NORTH 5 which means that SOUTH or LEAVE or their synonyms cause movement to location 6, 
EAST or its synonyms to location 7 and NORTH or its synonyms to location 5.  Each entry uses 3 bytes 
plus 2 bytes for each movement pair.

Note 1.  The movement pairs contain the word value not the actual word.  If a word value is deleted from 
the vocabulary then all movement pairs which contain that word value are also deleted.

Note 2.  When the adventure is being played it is only the LS Verb which will cause movement.

Note 3.  If a movement is performed by an entry in the Response table using the GOTO action, then it 
may not be needed in the Connections table, unless that entry is required for a PSI who can move 
unconditionally.

The Vocabulary
Each entry in the table uses 7 bytes and contains a word (or the first five characters, if the word is 
longer than five characters) a word type from 0 to 6 and a word value in the range 2-254.  The types are:

	0 -	Verb
	1 -	Adverb
	2 -	Noun
	3 -	Adjective
	4 -	Preposition
	5 -	Conjugation
	6 -	Pronoun

Words with the same word value are called synonyms.  The entries are held in ascending order of word 
value and within each word value, entries with more spaces come first e.g.

	U
	UP
	CLIMB
	ASCEN(D)

where entries with the same word value also have the same number of spaces the entry inserted first 
comes earlier e.g. CLIMB was inserted before ASCEN(D).

Note 1.  Whenever the editor has to convert from a word value to a word it takes the first word with that 
value of the required type.

Note 2.  Verbs and Conversion Nouns with values less than 14 should be reserved for movement words.

The Object Initially At table
This table has a 1 byte entry for each object, which specifies the location at which the object is situated 
at the beginning of the adventure.  An object can also start the adventure being worn, carried or not-
created.

The Object Word table
This table has a 2 byte entry for each object, which holds the Noun and Adjective word values 
associated with that object.

The Object Weight and Attribute table
This table has a one byte entry for each word.  Bit 7 is used to show if the object can be Worn / 
Removed (i.e. the WR option).  Bit 6 is used to show that the object is a container (the C option) and 
Bits 0 to 5 define the weight of the object (giving a range from 0-63).

The graphics area of the database grows DOWN from the top of memory:

The Location Flags
This table has a 1 byte entry for each picture; Bit 7 specifies if the picture can be drawn when that 
location is reached (i.e. if the location is not a 'subroutine'), bits 0 to 5 describe the start PAPER & 
INK for the picture while bite 6 is unused.

The Picture Table
Each entry in the table uses 3 bytes plus the length of the Drawstring.  There are always the same 
number of entries as locations in the adventure.  The Drawstring is encoded as a variety of various 
length commands which minimise the amount of memory needed to produce the drawing.

The Pointers
The main database pointers.

Detailed Description of the Editor
Each menu option is described in the order it appears;

Vocabulary
Insert I word No. Type

No. is in the range 2-254 and Type is in the range 0-6.

If word is not already present in the vocabulary it is inserted with a word value of No. and a type of 
Type.

Delete D word
If word is present in the vocabulary, it, its type and its word value are deleted.  If synonyms of the word 
deleted are present in the vocabulary no further action is taken.  However, if no synonyms are present, 
then:

a)  all entries in the process tables which use this word value (in respect of type also) are also deleted.
b)  b) if the word value is less than 14 then all movements in the connection table which use this word 
value are also deleted.
c)  c) all entries in the Object Word Table which use this word value (in respect of type also) are set to 
null.

Show synonyms S word
If word is present in the vocabulary, it and all other words with the same word value and type are 
displayed.  (Note that for Conversion Nouns - those less than 20 - any synonymous Verbs will also be 
shown and vice-versa).

Print P (Type) or L (Type)
Printing is either to the screen using P or to the printer using L.  If Type is specified only words of that 
type are listed.

Note 1. Be careful using delete as it can also affect the process, connections and object word tables.  It 
can also take a long time (minutes) if the database is large.

Note 2. Verbs and Nouns with a word value of less than 14 are assumed to be movement words by the 
Interpreter and cause SM7 (I can't go in that direction.") to be printed instead of SM8 ("I can't do 
that").

Note 3.  Word values from 2 to 254 can be used for each word type.  The words will not be synonymous 
because they are of a different type.  This allows over 250 words of each type - even without synonums - 
to exist in the vocabulary!

Location Text
Insert I
If the maximum number of locations has been inserted then the error "Limit Reached" is generated.  
Otherwise the next available location number on the highest used RAM page (shown on the Free 
Memory option) is allocated and a null entry is made for it in the graphic location text table.  Processing 
then continues with an automatic call to the amend routine to allow the writer to amend the null text 
entry already set up in the location text table.

Begin new Page B
If all RAM pages have been used or the maximum number of locations have been inserted the error 
"Limit Reached" is generated.  Otherwise the next available RAM page has a null database created on it 
an the next available location number is assigned.  Processing then continues with an automatic call to 
the amend routine to allow the writer to amend the null text entry in the new page.

Amend A locno.
The existing text for Location locno. is copied to the input buffer and displayed at the bottom of the 
screen for amending.  When ENTER is pressed the existing entry is replaced with the contents of the 
input buffer.

Print P (locno.) or L (locno.)
Printing is either to the screen using P or to the printer using L.  Printing starts with the text for 
Location locno. or at the beginning if locno. is not specified.

Note 1.  The start of an adventure is always at Location 0.
Note 2.  There is a limit of 252 locations.
Note 3.  You will be unable to begin a new page if all available location numbers have been previously 
allocated.

Connections
Amend A locno.
The existing entry for Location locno. is decoded, copied to the input buffer and displayed at the 
bottom of the screen for amending.  When ENTER is pressed the input buffer is vetted to be empty or to 
contain word locno. repeated any number of times.  word must be a Verb (or Conversion Noun) which 
is present in the vocabulary and locno must be present in the location text table.

If there are no syntax errors the existing entry is replaced with an encoded copy of the input buffer (i.e. 
words changed to word values).

Print P (locno.) or L locno.
Printing is either to the screen using P or to the printer using L.  Printing starts with the entry for 
Location locno. or at the beginning if locno. is not specified.

Note 1.  A location text must be present for a Location before connections can be present.
Note 2.  Any Verbs (or conversion Nouns) in the Vocabulary may be used in the Connections table not 
only movement words.
Note 3.  When an entry is decoded (for Amend or Print) the word value is changed into the first Verb 
(or conversion Noun) in the Vocabulary with that word value.

Graphics
Amend A picno.
The graphic database is expanded to provide a gap at the end of the reruired picture.  The main loop of 
the Graphics Editor described below is then entered.  When return is pressed any gap still remaining is 
removed.  n.b. unlike editing text the database itself is changed, this you cannot abandon an edit with 
CAPS SHIFT & 6 (it does a NEXT command for a start!).

Size S
The number of bytes between the start of the drawstring and the start of the next is calculated and 
printed on the screen.

Print, Copy and Dump.  P picno., C picno. and D picno.
picno. must be specified.

If D was selected a filename is requested.

The required picture is drawn on the screen.

If C was selected the printer COPY is called (see printer section for details).

If D was selected a SCREEN$ file is saved with the filename given (i.e. a code block of the screen 
16384,6912), this file could then be used as a loading screen for the game or edited using another art 
package.

Note 1.  You cannot reload a SCREEN$ file into the database.

Default Colours
Amend A picno (Paper Ink)
A flag is set to indicate that picture picno. is a subroutine unless PAPER and INK valued are specified, 
in which case they are stored as the default colours for the picture.  All locations in the adventure which 
do not require a picture should be Amended as a subroutine.

Print P or L
Printing is either to the screen using P or the printer using L.  If the location is not a subroutine the 
colours are printed.

Messages
Insert I
The next available message number is allocated and a null entry is made for it in the mesage text table 
on the highest used RAM page (shown on the Free Memory option).  An automatic call to the amend 
routine is then made to allow the user to amend the null entry.

Begin new Page B
The next available message number is allocated to the null message on the next RAM page if it has ben 
initialised on the location text menu.  Otherwise the error "Page not initialised" is generated.  
Processing countinues with an automatic call to the amend routine to allow the user to amend the null 
entry.

Amend A mesno.
The existing text for message mesno. is copied to the input buffer and displayed at the bottom of the 
screen for amending.  When ENTER is pressed the existing text is replaced with the contents of the 
input buffer.

Print P (mesno.) or L (mesno.)
Printing is either to the screen using P or to the printer using L.  Printing starts with the text for 
message mesno. or at the beginning if mesno. is not specified.

Note 1.  There is a limit of 255 messages, but as system messages can be inserted and printed they can 
also be used in the game providing 510 messages (although some are used!)
Note 2.  You cannot begin a new page of messages without first initialising the page by inserting a 
location on it.

System Messages
Insert
The next available system message number is allocated and a null entry made for it in the system 
messaeg table on RAM page 0.  An automatic call is then made to the amnd routine to allow the writer 
to amend the null entry.

Amend A mesno.
The existing text for system message mesno. is copied to the input buffer and displayed at the bottom of 
the screen for amending.  When ENTER is pressed, the existing text is replaced with the contents of the 
input buffer.

Print P (mesno.) or L (mesno.)
Print is either to the screen using P or to the printer using L.  Printing starts with the text for system 
message mesno. or at the beginning if mesno. is not specified.

Note 1.  The description of the Interpreter shows where these messages are used.  They may be changed 
to use "You" instead of "I" if you prefer, i.e. "You're not wearing it", or even into different languages, 
but be careful to maintain their meaning.

Note 2.  Messages 30 and 31 are not really messages but contain the positive and negative replies used 
in the QUIT and END condacts.  Therefore be very careful changing these as action END is the main 
way back to the Editor from the Interpreter.  You shoudn't make them more than one character in 
length, or the compressor may tokenise them!

Note 3.  SM10 (" (worn") has its length calculated by INVEN.  This means it should not include any 
control codes, and must be re-entered if the compressor is used to remove any tokens.  In addition, for 
the calculation of screen position to work, it should start with a space.

Note 4.  SM34 (the cursor) may contain any number of control characters, but, must not move the print 
position more than one character space or input will become confused.  Any input character will be in 
the temporary colours in force at the end of this message.

Note 5.  A further 202 messages may be inserted for your own use, but as there is no equivalent of the 
MESSAGE action a NEWLINE action must be carried out explicitly if needed.

Note 6.  CPM PAW uses messages 54 to 60.  This should be borne in mind if you intend transferring a 
game to another system.

Object Text
Insert I
The next available object number is allocated and a null entry is made for it in the object text atble.  An 
entry of not-created is made for it in the object initially at table, an entry of "_ _" in the object word 
table and a weight of 1 unit without any attributes in the object weight table.  Processing then continues 
with an automatic call to the amend routine to allow the user to amend the null text entry already set up 
in the object text table.

Amend A objno.
The existing text for Object objno. is copied to the input buffer and displayed at the bottom of the 
screen for amending.  When ENTER is pressed the existing text is replaced with the contents of the 
input buffer.

Print P (objno.) or L (objno.)
Printing is either to the screen using P or to the printer using L.  Printing starts with the text for Object 
objno. or at the beginning if objno. is not specified.

note 1.  Object 0 is considered by the Interpreter to be a source of light.

Note 2.  There is a limit of 255 objects.

Object Initially At table
Specifies the location at which an object is situated at the start of the adventure.

Amend A objno. locno.
The existing entry for Object objno. is replaced with locno. which must either be present in the location 
text table or be one of the special locnos.  252 not-created, 253 worn or 254 carried.

Print P or L
Printing is to the screen using P or to the printer using L.

Note 1.  An object text must be present for an object before a start location can be present.

The Object Word table
Amend A objno. Noun Adjective
The existing entry for Object objno. is replaced with the values of Noun and Adjective which must be 
present in the Vocabulary (or be an underline to set the entry to null).

Print P or L
Printing is to the screen using P or to the printer using L.

The Object Weight table
Amend A objno. Weight Option
The existing entry of Object objno, is replaced with the weight and option specified.  The weight may 
range from 0 to 64.  The option specifies the object attributes and may take the values:

	0 -	No attributes
	1 -	The object is a container.
	2 -	The object is wearable / removable
	3 -	The object is a wearable / removable container!

Print P or L
Printing is to the screen using P or to the printer using L.  The weight can be followed by "C" to 
indicate a container an / or "WR" to indicate wearable / removable.

Note 1.  You may only select the container attribute for an object, if a location with the same number 
exists.  This is because PAW trets this location as the "inside"!

Note 2.  A container of weight 0 will not have the weight of its contents added to any calculation.  This 
could be used to create a magic sack or a levitation transporter etc.

The Process (including Response) tables
Two options are available only on the main Process sub-menu:

Begin new Table B
The next available process number is allocated and null table is created.  Processing continues with a 
call to the Select table option with the new table number.

Select table S No.
The specified table is made the currently selected table and the sub-menu is redisplayed.

The other options are available on both the Response and Process sub-menus:

Amend A Verb Noun (n)
If an entry number n is not specified the first entry in the table of Verb and Noun is copied to the input 
buffer and displayed at the bottom of the screen for amending.  Otherwise the entry number specified is 
used (ranging from 0 to the number of entries inserted - 1).  When ENTER is pressed the input buffer is 
vetted to be empty, in which case the existing entry is deleted, or to contain any number of valid 
condacts.  If there are no syntax errors the existing entry is replaced with the contents of the input 
buffer.  Any following entries in the table with the same word values (i.e. Verb and Noun) are then 
displayed in turn for amending in the same way.

Insert I Verb Noun (n)
Verb and Noun must be underline characters, asterisk characters or words which are in the vocabulary.  
The word values of Verb and Noun (underline has a word value of 255, asterisk a word value of 1) are 
used to find the correct place in the table for the new entry to be created. If any entries already exist for 
Verb Noun and no entry number n is specified then the new entry will be created after the existing 
entries.  Otherwise the new entry will be created before the entry number specified.  A null entry is 
created at the appropriate place and an automatic call made to the amend routine to allow the user to 
amend the null entry.

The condacts that may be used are shown in the description of the Interpreter and in the summary at the 
end of this guide.

Print P (Verb (Noun)) or L (Verb (Noun))
Printing is either to the screen using P or to the printer using L.  Printing starts at the first entry with 
word values of Verb Noun.  If Verb or Noun are not specified then a word value of 0 is assumed.  This 
P or L by itself starts at the beginning of the table.

Note 1.  To delete an entry; amend it, so that no conditions or actions remain.

Note 2.  There is a limit of 255 process tables.  Calls can be nested to maximum of 10, after which an 
error occurs.

Extra Options
Selects the other display for the main menu.

Test Adventure
"Do you require disgnistics?" is printed and any reply that doesn't start with "Y" is assumed to be 
negative.  A jump is then made to the Interpreter.  If diagnostics were requested then whenever the 
Interpreter's input routine is used, pressing ENTER without typing anything will result in the value of a 
flag being displayed in the lower screen along with an input prompt.  You can at this point type in the 
number of another flag to display that flag's value or an "=" folowed by a number to set the flag 
displayed to that value.  Pressing ENTER returns to the input.

The main way back to the Editor from the Interpreter is by performing the action END in a process 
table.

Free Memory
The number of unused bytes on each page are printed.  Pages which have not yet been initialised are 
shown as "unused" and if Page 7 currently contains the overlays this fact is also displayed. Following 
the unused memory list will be lists of the last message and last location used on each page to allow you 
to monitor them.

Note that on a 48K spectrum only page 0 will be displayed - as that's all there is!

Background Colours
The BORDER, PAPER & INK colours may be set to any valid values.  INK 9 (i.e. contrast) is 
recommended but please note that INK 9 behaves differently in the bottom part of the screen.

In addition if any character sets have been inserted into the database you will be able to select them as 
the primary set.

Characters
Characters consist of an 8 by 8 pixel grid and define the way letters, numbers, punctuation, UDG's and 
shades look on the screen.  Initially only one character set is present, the one that is contained within 
the spectrum ROM.  This set is also considered to contain the 16 shade patterns (codes 0 to 15) and 19 
UDG's (codes 144 to 162) and is termed Set 0.

Insert I
If the maximum number of character sets has not been reached the next available set number is 
allocated.  A 768 byte entry is inserted in the character table and a copy of the designs for 96 characters 
(codes 32 to 127) in the ROM are copied into the entry.  Otherwise an error of "Limit Reached" is 
generated.

Amed A set character
The character specified from the set specified is presented on screen for possible amending.  Only 
characters 0 to 15 and 144 to 162 may be amended from set 0, whereas only characters 32 to 127 may be 
amended from any other set.

The editor provides three areas of screen:

1/ The Grid
The bit patterns of a particular character are shown on a much enlarged (x8) grid of yellow and white 
squares, any set bits being shown by a black square.  Also present on the grid is a flashing red square 
showing the current cursor position.

2/ The Test Patterns
To the right of the Grid are two test patterns of the current character as if it was a shade in both normal 
& Inverted forms.  This does not change as you change the Grid but it can be updated by pressing R for 
Redraw.

3/ Status Area
This shows the current character, set and a summary of the commands available.

In order to modify the pattern use the cursor keys (CAPS SHIFT 5 to 8 on a 48K spectrum) to move the 
flashing cursor.  The state of the bit under the cursor can be changed at any time using the SPACE key.  
ENTER will store the amended character back in the database.  Q will abandon the edit leaving the 
character unchanged.

Print and Copy sets P or C
The currently defined UDG's, Shades and inserted character sets are printed on the screen.

If C was selected then the printer COPY is called - see printer section for details.

Load and Save sets L set or S set

If set has been inserted a prompt is printed for a filename, the tenth letter is converted to a (c) sign and 
the required set loaded or saved as specified.  Saving / Loading set 0 acts on the 286 bytes of UDG's 
and Shades.

Note 1.  You cannot amend a character from a set or load a set until it has been inserted.

Note 2.  The files for sets other than 0 are a standard 768 bytes spectrum character set.  They could thus 
be loaded into / defined with, a different designer as long as the filename ends in position 10 with a (c) 
symbol.

Compress Text
"Compress database (Y/N)?" is displayed and any reply which dosn't start with "Y" is assumed to be 
negative and causes a return to the main menu.  Otherwise a 222 byte dictionary is inserted into the 
databse.  The database is then scanned for occurences of each of 90 common letter groupings which are 
replaced with a signle byte token in the range 154 to 255.  This method of compression reduces any text 
in the game by approximately 40%.  This could on a text only 128K game provide an equivalent of 
160K of memory for the game!

Note 1.  When editing text after compression the cursor will skip 2, 3, 4, or 5 characters due to the 
tokenisation.  Corrections should be typed in full as they will be re-compressed the next time the 
compressor is used.

Save Database
The database area is saved to tape as a sequence of files, two per page.  Then tenth position of the 
filename is set by PAW as the latters A to L is sequence for each file.

Verify Database
The files for a databse previously saved to tape are checked for differences against the database curently 
in memory.

Load Database
The files for a database previously saved to tape are loaded overwriting any database currently in 
memory.

Very Important
If BREAK is pressed or a tape error is detected during a load then the database held in memory will be 
corrupt and should not be used as it may corrupt the Editor and Interpreter.  Under these curcusmtances 
the only Editor option which may be used safely is Load Database and this should be used until a 
database is loaded successfully.

Save Adventure
The Interpreter and database are saved to tape as a sequenceof files using the filename specified.  They 
are saved in such a way that the Adventure will auto run when loaded from BASIC  using LOAD "" - 
without the PAW Editor being present.

Verify Adventure
Verifies that an Adventure has been saved correctly.

Detailed description of the Graphic Editor
This section of PAW allows a variety of operations to be carried out on the drawstring for a location.  
When editing, the string is laid out in memory as follows;

	+----------+
	| END      |	The end of string marker
	+----------|
	|          |
	| NEXT     |	Any commands still undrawn
	+----------+
	|          |
	|          |
	| SPARE    |	Available memory
	|          |
	|          |
	+----------+
	| END      |	Temporary end marker
	+----------+
	|          |
	|          |
	|          |
	| DRAW     |	The main drawstring
	+----------+

A rubber banded line is used for drawstring; in the base point of the line (Known as 'point') shows the 
last point plotted, moved to etc, the rubber banded end of line shows the next position of point or the 
start point for a fill / shade etc.

The Editor provides four groups of commands.  Any which insert a command into the drawstring require 
a SYMBOL SHIFT key to be held down;

1) Drawstring Commands
ABS MOVE		A
Moves  point to the x,y position of end of the line setting only the attributes.  This is coded as a PLOT 
with Inverse and Over set on.

PLOT			P
Sets the pixel at the end of the line according to Inverse and Over, then moves point to that position.

REL MOVE		R
Moves point to the end of the line without affecting the screen.  This is coded as a relative offset from 
the old point.

LINE			L
Draws (or fixes) a straight line from point to the end of line according to Inverse and Over, then moves 
point to end of the line.  The line is coded as a relative offset from the old point.

FILL			F
The area from the end of line (relative) is filled using solid pixels.  Fill works by passing a pattern to the 
SHADE routine so the notes on SHADE apply also.

All the above use 3 bytes in the database.

SHADE			S
The area from the end of lne (relative) is shaded with one of a large number of patterns.  The database 
contains 16 patterns (0-15) which can be changed using the Character Editor.

The pattern used for shading is determined as follows:
a)  You are asked for 2 pattern numbers in the range 0 to 15.  If you only want the one pattern then 
specify the same number for both patterns.
b)  b) The 2 patterns specified are OR'd together i.e. they are placed on top of each other.
c)  c) If INVERSE was 'on' the resultant pattern is inverted, i.e. SET / RESET pixels are swapped.

Note 1.  The shade first works in a downward direction and then in an upward direction.  For speed, 
when it is going down it doesn't look up and vice versa.  Any areas the shade misses must be shaded 
separetely, although careful choice of the start position for the shade will minimise this.

Note 2.  If the area to be shaded is too complex, then the shade will be abandoned.  It has to do this to 
enable it to detect when it comes across an area which has already been shaded.  This an area can only 
be shaded once as an already shaded area will be too complex to shade again.  You should not shade an 
area then try to fill in the background with a fill command, use the Inverse option!

TEXT			T
If any character sets have been inserted in the database, a set number is requested.  Then a character 
code in the range 32 to 162 is requested.  This character is placed on screen in the character square (as 
shown by the Grid command) that the tip of line is contained within.  It is mainly designed to allow "the 
fiddly bits" of a picture to be drawn using the character editor - thus using less memory than lots of 
lines!

Text and Shade use 4 bytes in the database each.

BLOCK			B
Causes a block of the currently selected colours to fill the rectangle of attribute squares which the line 
defines the diagonal of.

Block uses 5 bytes in the database.

2) Colour Commands
INK			X
The current ink is set to the value selected.  INK 8 as in BASIC causes all ink to be taken from the 
existing screen attributes.

PAPER			C
Sets the current paper to the value selected.  PAPER 8 as in BASIC.

FLASH			V
The new value of Flash is requested (0,1 or 8)

BRIGHT		Z
The new value of Bright is requested (0,1, or 8)

all the above use one byte in the databse.

INVERSE		I
The state of Inverse (on/off) is toggled.

OVER			O
The state of Over (on/off) is toggled.

Neither Inverse nor Over use any memory but their state is encoded as part of each future instruction 
which is affected by them

3) Subroutine Command
GOSUB			G
A picture number is requested which must be in the range 0 to locno.  A scale value for the picture is 
then requested. This can be from 0 to 7 where the number indicates the size of the picture in eighths - 0 
means 'no scale' (i.e. 8/8).

Please note;

a)  Scale only affects certain commands, these are MOVE RELATIVE, LINE, FILL and SHADE.  
MOVE ABSOLUTE, PLOT, BLOCK and TEXT commands will note be scaled or relocated and 
should generally not be used in subroutines (although they will work and can be used usefully 
sometimes).
b)  You may only nest subroutine calls to a level of ten.  (nesting means calling a subroutine from 
within a subroutine).
c)  Scale does not affect GOSUB commands, i.e. if a GOSUB is used within a subroutine the string 
drawn will be a fixed size and not scaled.
d)  Calling the same routine you are drawing will cause a "Limit Reached" error as the limit of 10 
subroutine levels will have been reached.

Gosub uses two bytes in the database.

4) Editing commands
START		>
Puts the Drawstring pointer at the start of the drawstring.

NEXT		\/
Executes next available drawstring command: if there isn't one the command is ignored.

PREVIOUS	/\
Moves the drawstring pointer back one command and updates the screen.

DELETE
(CAPS SHIFT & 0 ON 48K) deletes the previous command in the drawstring and updates the screen.

DELETE NEXT
GRAPH(ICS) (CAPS SHIFT & 9 on 48K) deletes the next command if there is one.

GRID		Y
Has a toggle action for a character grid of INK 0, PAPER 7 and PAPER 6.  This allows exact positions 
of colour boundaries to be taken into account while drawing.

JOYSTICK	J
Toggles the Kempston (tm) joystick option on and off.

The keys around S move the end of line around one pixel at a time (this can be accelerated to eight 
pixels a time by holding down the CAPS SHIFT key) thus:

	Q	W	E

	A		S

	Z	X	C

The joystick should be plugged into Port 2 of Interface 2 or the Spectrum Plus 2.  Alternatively it can be 
plugged into a Kempston (tm) interface in which case SYMBOL SHIFT & J should be used to enable 
PAW to read it.  CAPS SHIFT will also accelerate the rate of movement on the joystick.  The Fire 
button will act like SYMBOL SHIFT and L to draw a line.

Editor Error Messages and their meanings
Due to the complex nature of PAW many features can generate errors.  Whenever an error is discovered 
a message describing the error is printed in the lower section of the screen.  PAW then waits for a key to 
be pressed before returning to the menu on which that error occurred.  There are two exceptions to this:

1/  After an error during editing a drawstring; the Drawstring pointer is positioned just before the 
command which caused the error (i.e. a NEXT command will cause the error again).  If you are unable 
to correct the problem then DELETE NEXT can be used to delete the erroneous command.  Note that 
this may still leave further commands undrawn (which may cause another error).

2/  While an adventure is running; If the PAW editor is not present then a jump is made to initialise a 
new game after the error report.  Otherwise a diagnostic line is printed on the bottom line of the screen.  
This displays the Process table, Verb and Noun of the entry and the condact in which the error 
occurred. You are then provided with the flag diagnostics to help confirm where the error occurred.  
When ENTER is pressed the normal error report is printed and a return made to the main menu of 
PAW.

When using your own programs in conjunction with the EXTERN command any of the standard BASIC 
errors can occur.  Note though that the line and statement number are not printed - so test your program 
thoroughly without the adventure present!

PAW also generates several errors of its own which are:

BREAK
BREAK was pressed during a peripheral operation or while a game was running.

STOP in INPUT
CAPS SHIFT & 6 pressed.

Tape loading error
as BASIC.  Note that a tape error during a load database means that the database is corrupt and only 
reloads should be attempted.

Database full
There is not enough room in the database for what you were attempting.

Limit reached
The maximum number of locations, messages, objects, process tables or RAM pages are already present.  
Alternatively the maximum subroutine or sub-process depth has been reached - 10.  This can also occur 
if an attempt is made to DOAL while a DOALL loop is active.

Integer our of range
While drawing a picture a LINE command has gone out of range.  This is usually due to a change of 
position of the starting point while editing.

Out of memory
This indicates that the entry for a process or connection entry was to large for the buffer (unliketoly to 
occur).  Also occurs when attempting to start a new RAM page on a 48K spectrum, loading a 128K 
game on a 48K spectrum or if insufficient workspace has been left e.g. by setting up fixed channels 
before loading or by writing too big a program for use with EXTERN.

Invalid Argument
This error is printed when a condact discovers an illegal value.  e.g. An attempt to set flag 38 to an 
illegal location, an attempt to PUTIN / TAKEOUT on a non container object or to set an object at 
location 255 (COPYFO only).  But see point 2 above for diagnostic information.

Note 1.  During input the Spectrum will emit a RASP if the screen and / or input buffer is full.

Note 2.  If an entry is present in the database which is too big to fir on one screen, the Spectrum will 
give out a RASP when the entry is displayed at the bottom of the screen for amending.

Note 3.  If an abnormally large entry is inserted in the connections table using abbreviations e.g. N 1 W 
6 S 4 etc and the abbreviations are deleted from the vocabulary, the movement entry (when decoded) i.e. 
NORTH 1 WEST 6 SOUTH 4 etc could be too big for the input buffer.  If this happens an out of 
memory message will be produced.  The remedy is to reinsert the abbreviations in the vocabulary.

PAW and printers
PAW prints to the printer using channel #3 (usually "P").

Should this be a ZX thermal printer (or the Alphacom equivalent) then all printout is directed to the 
required ROM routines.  The Thermal printers only work in 48k mode on a 128K spectrum and will 
print exactly what is on screen including new character sets and so on.  The "C" option on the 
characters and graphics menus will COPY the screen as normal.

On a 128K spectrum the printer channel defaults to the RS232 port and again PAW will sense this.  All 
printout is directed through the port having filtered the character set thus:

0 - 31 are surpressed except for 7 & 13 which print a CR (13) and 6 (TAB) which prints as a space
32 - 127 are printed as a space.
128 - 162 are printed as a question mark ("?")
163 and 164 are expanded to be the keywords PLAY & SPECTRUM.
165 - 255 are expanded either to the standard keywords in an uncompressed database, or to the correct 
letter groupings in a compressed one.

If you have Interface 1, it is possible to use the RS232 to print to a printer by opeding the "t" channel 
with the command:

	OPEN #3, "t"

before loading the PAW program.  The channel will then operate as described above for the 128K 
RS232.

In general it should be possible to use any printer interface which redirects channel #3 correctly - with 
one proviso; it does not mind having its output address redirected.

Failing that if you are nifty with the old m/c you can write a specific printer driver.  PAW prints an 
address when it loads called PRTADD.  This gives the address of the vectors within PAW for the 
printer system defined as follows (character is in A):

	PRTADD	DEFW	PRTRET	; Address of character output
	COPVEC	JP	DOCOPY	; Make this your screen copy
	PRTRET	RET			; Put your driver here.

There is free memory up to 29504 decimal for this to be expanded into.  Save your driver code from the 
correct address with a filename with character position 10 set to "A" along with a file of no bytes with 
the same name ending in "B".  You must redirect channel #3 (to anything) to fool PAW that there is a 
non thermal printer connected before you load it.  Then use the Load database option from the main 
menu to load your driver (PAW thinks it's a database an loads both files, one of which is your driver).

The Essays
There now follows a discussion of nine topics which rely on several features of PAW in combination 
and are thus not so easy to describe under any one heading:

128K Considerations for those lucky 128K spectrum owners.
Colour Boundaries deals with the spikey problem of attributes.
The parser gives a little English lesson.
Screen Output starts a newline in descriptions.
Objects will be more flexible after reading this.
Multi-part games for when memory just isn't big enough.
Light & Dark throws some light on the matter?
EXTERN and SCREEN$ are just made for each other.
PSIs add a bit of character to your games!

Enough of the frivolity there are pages to fill...

128K Considerations
When loaded, only page 0 is in use and has about 25500 bytes spare.  Pages 1, 3, 4, 6 & 7 are unused 
but can hold 16K each.

Message & Location text, Connections, Graphics & Default Colours can use pages 1-7, all the other 
tables only use page 0.  All table entries for a location will be held within the same page.

When a location text is inserted null entries are made in the Connection, Graphics & Default Colour 
tables for that location.  The I option on the Location Text menu always inserts in the highest used page.  
Option B on that menuis used to begin a new page i.e. it inserts on the next page.  You have to decide 
when to use B to start a new page but we would suggest that you use the compressor to gain all memory 
available before starting another page as you cannot insert extra messages etc onto a page once a new 
one has been started - only amend existing entries.

The start database supplied has location 0 on page 0 and youy will need to consider whether location 1 
should be on a new page bearing in mind that ll the other tables can only use page 0.  We would advise 
all messages and locations are on pages 1 and up, as page 0 can soon become filled with vocabulary etc.

A similar thing applies to the message text table; I inserts on the highest selected page, B begins another 
page if it has been initialised by putting a location on it!

If you want your game to run on a 48K spectrum then you must not use any page other than 0.

Colour Boundaries
Probably one of the most difficult aspects of using graphics on the Spectrum is the problem of the 
attribute colour system.

This essentially means that only two colours can be used in any one 8x8 pixel group.  The areas are 
shown by the GRID option in the graphics editor.  The two colours are the PAPER and INK, the colours 
of reset and set pixels respectively.  Both Paper and Ink can be any of eight values for each 8x8 pixel 
group.

The fill and shade routines fill in a defined area with a pattern of set and reset pixels.  So if you use 
different INK and / or PAPER colours for two adjacent fills or shades, you will get a coarse stepping 
effect.  This is due to the colours for the second fill affecting pixels in the groups which were set by the 
first.

This effect can be overcome in one of four main ways:

1 / Ignore it!  This system is used on some pictures in the TEWK game.  The effect is minimised by not 
having shaded or filled areas directly adjacent to each other.

2 / Use shade fully.  The shade system can be used along with just two colours to create very effective 
pictures using varying densities of shade.

3 / Careful positioning as used in the tutorial manual.  All areas are defined on exact attribute 
boundaries.  This has the effect of creating very cubist pictures.

4 / Alternate colour.  This allows two areas of solid colour (not shades) to be adjacent to each other.  It 
sounds complicated but in principle is fairly straightforward: the diagram shows this far more simply 
than reams of text.

[See separate graphic file, either COLBOUND.GIF or COLBOUND.BMP] 

The outlines of area A and B are drawn.  Area A is filled using an INK of the first colour required.  Area 
B is filled using an INK of the second colour required.  The block command is used on the rectangle (C) 
with the PAPER set to be the second colour required and an INK of 8.  This leaves area A and B 
unchanged.  The colouring of the PAPER makes the join look continuous.

The Parser
The parser works by scanning an input line (up to 125 characters) for words which are in the 
vocabulary, extracting 'Phrases' which it can turn into Logical sentences.

When a phrase has been extracted, the Response and Connections tables are scanned to see if the 
Logical Sentence is recognised.  If not then system message 8 ("I can't do that") or system message 7 ("I 
can't go in that direction") will be displayed depending on the Verb value (i.e. if less than 14 then 
system message 7 will be used) and a new text input is requested.  A new text input will also be 
requested if an action fails in some way (e.g. an object too heavy) or if the writer forces it with a 
NEWTEXT action.  The results might otherwise be catastrophic for the player.  e.g. GET AXE AND 
ATTACK TROLL, if you don't have the axe you wouldn't really want to tackle the Troll!

If the LS is successfully executed then another phrase is extracted or new text requested if there is no 
more text in the buffer.

Phrases are separated by conjugation ("AND" & "THEN" usually) and by any punctuation.

A Pronoun ("IT" usually) can be used to refer to the Noun/Adjective used in the previous Phrase - even 
if this was a separate input.  Nouns with word values less than 50 are Proper Nouns and will not affect 
the Pronoun.

The Logical Sentence format is as follows:

(Adverb) Verb (Adjective1 (Noun1)) (preposition) (Adjective2 (Noun2))

where bracketed types are optional, i.e. the minimum phrase is a Verb (or a Conversion Noun - which is 
a Noun with a word value < 20 - which if no Verb is found in a phrase will be converted into a Verb e.g. 
NORTH).  If the verb is omitted then the LS will assume the previously used verb is required.  i.e. GET 
SWORD AND SHIELF will work correctly! - the pronoun will be the first object in a list like this, 
SWORD in the example.

Note that the phrase does not strictly have to be typed in by the player in this format.  As an example:

	GET THE SMALL SWORD QUICKLY
	QUICKLY GET THE SMALL SWORD
	QUICKLY THE SMALL SWORD GET

are all equivalent phrases producing the same LS.  Although the third version is rather dubious English.

A true sentence could be:

	GET ALL.  OPEN THE DOOR AND GO SOUTH THEN GET THE BUCKET AND LOOK IN 
IT.

which will become five LS's:

	GET ALL
	OPEN DOOR		(because THE is not in the vocabulary)
	SOUTH			(because GO is not in the vocabulary)
	GET BUCKET
	LOOK BUCKET		(from IT) IN (preposition)

Note that DOALL will not generate the object described by Noun(Adjective)2 of the Logical sentence.  
This provides a simple method of implementing EXCEPT.  e.g. GET ALL EXCEPT THE FISH, it has 
the side effect of not allowing PUT ALL EXCEPT THE FISH IN THE BUCKET, as this has three 
nouns!

Screen Output
Character sets are selected in text by selecting a colour 0-5 then a single DELETE to generate ESCCs 0-
5, and will only take effect if a corresponding set has been inserted.

ESCC 7 is a true newline (but does not reset colours as it is part of a message).

ESCC 6 works as a TAB but should be used with care as it will often be suppressed by the text 
formatter when printing.

Colours and character sets selected within text will stay in force until a NEWLINE action.  e.g. To print 
the number of coins carried by the player (held in flag 100 say); If message 1 contains a RED PAPER 
control code then an entry in Response (or a Process table) of:

	COINS				MES	1	; "<RED>You are carrying"
			_		PRINT 100
					MESSAGE 2	; " coins."
					DONE

will result in the entire message being printed in red.  This is called a compound message and can be 
used successfully to create neat displays.

Objects
Underlines in text will be converted during gameplay into a description of the last object referenced by 
GET, DROP, DESTROY etc.  This is mainly to deal with the fact that GET, DROP etc report their 
success (or failure!) but can be used usefully for examining objects and other automatic reports.

Flag 53 is used to control the way objects are displayed when the LISTOBJ and LISTAT actions are 
used.  If the flag is set to 64 (i.e. Bit 6 is set) then objects will be listed without newlines between them, 
forming a valid English sentence - compound listing.

The formats are as follows:

	SM53 ("nothing") - can only occur with LISTAT
	object SM48(".")
	object SM47(" and ") object SM48(".")
	object SM46(", ") object SM47 (" and ") object SM48(".")

In addition, Bit 7 of flag 53 will be set (i.e. flag will be grater than 127) if any objects were printed.  
This allows you to determine whether or nor a NEWLINE is required to reset colours.

A LISTAT action will usually be preceded by a message.

The description of object is constructed from the full description given in the object text table.  The 
preferred format for an object description is:

	indefinite.article (adjective) noun . extra text

where; the indefinite article is "A" or adjectives "An" or "Some".  The Adjective and the Noun should 
have a lower case letter e.g. "A small key", "Some sand" or "An orange.  Rather mouldy'.  PAW extracts 
a description of the object in two ways:

1/ For GET, DROP etc (i.e. "_") the indefinite article is skipped and the description printed upto (but 
not including) the first full stop, e.g. "I now have the small key."

2/  For a compount list of objects the indefinite article is forced to start with a lower case letter and the 
description printed upto (but not including) the first full stop.  e.g. "In the bag is a small key.".

Obviously if you don't use underline or compound listings, then you are free to describe objects any 
way you like.

Important: If an object is to be a container; there must be an unused location with the same number for 
PAW to use as the "inside"! i.e. Object objno. 1 would need Location locno. 1 - Not forgetting to mark 
it as a container ("C") on object weight!

Creating Multi-Part Adventures
In order to create a larger (and thus more interesting) play area in an adventure, without sacrificing the 
quality of the description, you can split the game into smaller sections.  It is best to do this with a game 
that lends itself to having several areas, with only one join between each, this is called a bottleneck.  e.g. 
a game where setting sail on a boat is the final task in the first part.

To allow the score, turns taken and other information to be carried forward into the next game you must 
use the LOAD / SAVE game position actions.  In order to load a game position into a different game to 
ahat which it was saved from, you need the same number of locations and objects in each part.  In 
addition, all objects which may possibly be carried forward by the player, must have the same 
description in all parts.

Let's take a game with 120 locations, that is to be split in half, thus requiring 60 locations in each part.  
Actually location 60 will exist in both games as the transition location (where the player starts and 
finishes) and a spare flag (say 26) will be used to indicate which part of the game a position is from.  So 
when the player completes part 1 they are moved to location 60 and flag 26 is set to 1 to show it.

The setup for part 1 would be:

Location 60
End of Part 1 - Prepare a tape to save your position.  (You may save more than one copy if you like).  
Please LOAD part 2 and follow the onscreen prompts.

Process 1

	END		_		AT	60		; End of game?
			_		LET	25	1	; Valid position from part 1.
					SAVE

And in part 2:

Location 0
Part 2 - Prepare to load tape with saved position

Location 60
Any introduction wanted for Part 2.

Process 1

	START		_		AT	0	; Just starting?
					LOAD		; Will then be at another location

	START		_		NOTEQ 26	; Not a valid position from part 1
					GOTO 0		; So request another load
					DESC

	START		_		AT 60		; Just loaded a valid position
					ANYKEY	; Wait until introduction read
					RESET 1	; Start game properly at location 1

The RESET action does a DESC of the new start location automatically, after setting all objects that 
aren't carried, worn or at location 60 to their starting position.  Note that you should insert any CLEAR 
actions for flags between the ANYKEY and the RESET as the flags are not affected by the RESET.

Light and Dark
Darkness is becoming something of a cliche in adventures these days, but used correctly it can add to 
the sense of realism considerably.

Within PAW, darkness is created by setting flag 0 to a value other than 0.  This must be done whenever 
the player moves into and out of darkness, i.e. the move must be done with a GOTO in the Response 
table, to allow the SET or CLEAR action to occur.

If the player is being provided with a source of light then object 0 is the easiest way of implementing it.  
A source of light does not have to be a torch or candle, with a little imagination it can be infra-red 
glasses or a wide beam laser!

Take for example the creation of a night and day cycle, over 24 time frames which we will assume are 
equivalent to 1 hour.

The entries required in Process 2 are:

	_	CYCLE		EQ		5	0	; End of cycle
				LET		5	24	; Start the counter again

	_	NIGHT		EQ		5	18	; Nightfall
				SET		0
				MESSAGE	X

	_	DAY		EQ		5	6	; Daybreak
				CLEAR		0
				MESSAGE	y


Importantly if part of the game is underground, or inside a building, don't forget to determine if the 
player can actually see nightfall and daybreak from where they are, before printing the messages.

EXTERN and Loading screens
The EXTERN command can be used to call either your own machine language programs or a section of 
a BASIC program.  This feature can be utilised only in a final game, as the 4K of memory previously 
occupied by the main menu becomes available (the other 2K is PAW's workspace so hands off!)  The 
important address is the value printed when PAW loads called EXTVEC.  You must use the value given 
on the copy of PAW you save the final game from, or chaos will ensue.

For machine coders only: In order that EXTERN can execute machine code routines you must POKE 
the three bytes at EXTVEC with a JP to our start address.  Register IX must be preserved as it points at 
Flag 0.  All others may be destroyed, but SP must be balanced.  Register A on entry contains the 
parameters to the EXTERN command.  If you save the two bytes at EXTVEC+1 they point to the 
routine which calls a BASIC program - the line number must be in A.

For BASIC users: a POKE extvec,195 - after loading the interpreter file - will enable any EXTERN 
actions to execute the BASIC line (100+parameter) e.g. EXTERN 10 will goto line 110 in BASIC.  To 
return to the next condact a STOP command in BASIC is required.  You cannot use CLS in BASIC (or 
m/c), but address EXTVEC+3 contains a routine to do this.  i.e. RANDOMIZE USR EXTVEC+3 will 
clear the screen.  In addition EXTVEC+12 contains the line number to print the filenames of the 
database files on and EXTVEC+9 is the load database and start game entry point.

As an example the following program (without the REM's) must be saved to a fresh tape with SAVE 
"gamename" LINE 10:

	10	REM load game
	15	BORDER 0: PAPER 0: INK 0: REM so filenames are invisible
	20	CLEAR 29856: REM this is maximum value for RAMTOP.
	25	LET extvec=?????: REM whatever it is...
	30	LOAD ""SCREEN$: PRINT AT 19,0;: REM stops damage to pic!
	40	LOAD ""CODE: REM load interpreter file
	50	POKE extvec,195: REM enable EXTERN
	60	POKE extvec+12,20: REM filenames on line 20
	70	RANDOMIZE USR (extvec+9): REM load database and start game
	100	REM line that is called by EXTERN 0
	110	PRINT "hello from BASIC": STOP
	355	REM line that is called by EXTERN 255!

Lines 100-355 could contain GOTO statements if required.

Save your SCREEN$ immediately after the program on the tape.  Then from within PAW save the 
Adventure (using option A) after that.

Important there must be at least 2000 bytes spare for PAW's workspace or your BASIC program will 
start to disappear!  RAMTOP may be lowered to contain your machine code but 2K must be spare!

Pseudo-Intelligence
The main thing to remember is that a character (or PSI) is a word in the Vocabulary (usually a Noun 
with a value less than 50 so as to be a Proper Noun).  Some flags, a series of messages and some entries 
in one or more Process tables.  One flag shows where they are, the messages provide information about 
their actions and the process table entries tie it all together.

So imagine a character called Sanec who can walk around independently.  He is described in the 
vocabulary as SANEC (word value 25, Noun).  Flag number 20 is used to give his location.  Process 
table 3 will deal with speech to him.  While Process table 4 will deal with his movements and actions.  
The following entries allow him to move around when you ask him to.  After a short time he will get 
"bored" and vanish in a puff of smoke!

Message 1
Sanec did not seem to understand what you said.

Message 2
No one of that name here!

Message 3
Sanec replies "hello" in a gruff voice.

Message 4
Sanec wanders that way as he has nothing bettern to do.

Message 5
Sanec the wizard is here.

Message 6
Sanec 'politely' ignores what you say.

Message 7
Sanec turns to face you and in his gruff voice announces; "I'm bored with all this, I'm off to a bigger 
game" and promptly vanishes in a puff of green smoke!

First; Sanec's presence at a location must be announced.  So in Process 1 (which is called after every 
describe of a location) we check if he is here i.e. flag 20 (his location) is the same as flag 38 (our 
location).  Note that we ensure we are not at location 0 as this is always an introduction screen.

SANEC		_		SAME		20	38	; Ensure Sanec is here
		_		NOTAT		0		; Player is not in location 0
				MESSAGE	5		; Say Sanec is here

To deal with speech to Sanec, we need entries in Response as follows:

SAY		SANEC		PREP		TO		; This could be imitted to allow
								; Short Verb Noun sentences
								; to be understood
				SAME		20	38	; Make sure Sanec is here
				PROCESS	3		; Deal with any speech
				DONE

SAY		_		PREP		TO
				MESSAGE	2		; no one of that name here!
				DONE

The following entries in Process 3:

*		*		PARSE				; This entry always carried out
								; convert the input string to a
								; LS
				MESSAGE	1		; PARSE comes here if it fails
								; to find a valid phrase
				DONE				; Note that the LS is corrupt
								; and no further table entries
								; must be executed

HELLO				MESSAGE	3		; Assuming HELLO is a verb in
								; vocab
				DONE				; so that SAY TO SANEC
								; "HELLO" works

_		_		LT		34	14	; A movement word said to
								; Sanec?
				MOVE		20		; See if a connection for that
								; way
				MESSAGE	4		; Come here and tell player if
								; so

_		_		MESSAGE	6		; He ignores you (i.e. nothing
								; else)

Obviously many more entries would be required to give Sanec an appearance of understanding speech, 
but with a few clever entries he can give a wide variety of responses.

Finally; to give Sanec a chance of disappearing when  bored, we need an entry in Process 4 of:

SANEC		_		EQ		20	2	; At location two?
				CHANCE	10		; 10% chance
				SET		20		; Location 255 does not exist
				AT		2		; are we where he was?
				MESSAGE	7		; POOFF! - tell player he
								; disappears

And an entry in Process 2 to call table 4 regularly:

SANEC		_		PROCESS	4

In this way a very convincing character can be built up.  They add a great deal to the sense of relism in 
games.  Especially if interaction with them is required as part of the solution.

Graphic Editor Commands
Occasionally when moving the line at speed it will disappear, this is due to a beat frequency of update 
with screen flyback.

Moving the end of the rubber banded line is achieved with:

	Q	W	E
	A		D
	Z	X	C

at 1 pixel per move.  Alternatively use Interface 2 / Plus 2 joystick port 2 or Kempston(tm) interface 
(SYMBOL SHIFT & J).

Hold down the CAPS SHIFT key to accelerate to eight pixels per move.

The drawstring editing commands:

Cursor Right		(CAPS SHIFT & 8) - Start of drawstring
Cursor Down		(CAPS SHIFT & 6) - Next command
Cursor Up		(CAPS SHIFT & 7) - Previous command
DELETE		(CAPS SHIFT & 0) - Delete previous command
GRAPHICS		(CAPS SHIFT & 9) - Delete next command

All the following commands require SYMBOL SHIFT to be held down unless otherwise specified.

The toggles:

I	Inverse Toggle
O	Over Toggle
Y	Grid Toggle
J	Kempston(tm) joystick toggle

The next commands all insert into the database:

A	Absolute Move (a PLOT with I and O selected)
B	Block in rectangle attribute area.  Diagonal defined by line.
F	Fill area from end of line.  (See footnote)
G	Gosub to location number with scale
X	Ink (produces prompt for Ink selection)
L	Line fix (draws rubber banded line)
C	Paper Select
P	Plot point at end of line
R	Relative Move point to end of line
S	Shade an area of screen from end of line with pattern
V	Flash Select
Z	Bright Select
T	Text character on screen, selects character and set no.

Note: Fill and Shade are not completely re-entrant.  Fill is a shade with all pixels in pattern set.

ENTER on its own to finish editing session.

The System Messages
The majority of system messages contain ESCC 7's to allow correct spacing on the screen.

SM0 - is used instead of the location description when it is dark.
SM1 - is printed by LISTOBJ if at least one object is present.
SM2 to SM5 - are the four input prompts which are selected randomly unless flag 42 is set to be a valid 
message number.
SM6 - is produced by the parser when no further phrase can be understood.
SM7 - is produced if no action was carried out (or NOTDONE was) in Response when the Verb is < 14
SM8 - is produced if no action was carried out (or NOTDONE was) in Response when the Verb is > 13
SM9 to SM11 - are printed by the END action.
SM12 - printed by QUIT
SM13 and 14 - are printed by the END action
SM15 - the OK action message.
SM16 - the ANYKEY action message.
SM17 to SM20 - are the TURNS action messages.
SM21 and SM22 - are the SCORE action messages.
SM23 and SM29 - are the first of many messages produced by the object manipulating actions.
SM30 - the positive response expected by END and QUIT.
SM31 - the negative response expected by END and QUIT.
SM32 - produced when a screen full of text has appeared.
SM33 - the input marker.
SM34 - the cursor.
SM35 - displayed when a timeout occurs
SM36 to SM45 - are more messages produced by the object manipulating actions.
SM46 - the link between objects when listing continuously
SM47 - the final link between the last two objects when listing
SM48 - the termination of a list of objects (printed by both LISTOBJ and LISTAT, so take care.)
SM49 and SM50 - yet more object messages
SM51 - the termination for a compound sentence on PUTIN / TAKEOUT (and AUTOP / AUTOT)
SM52 - a final object message
SM53 - message for LISTAT action if no objects found.

SM54 onwards are free to be inserted for your own use.  PAW on other machines may use more 
messages, so bear this in mind if you intend transferring the adventure to another version.  E.g. PAW 
under CPM uses messages 54 to 60!

Function of PAW Flags
The normal flags are free for use in any way in games.  The auto decrement flags (2 to 10) are also free 
for use, but be sure you know in which situations they are reduced before using them.  Other flags 
should mostly only be set using the appropriate action, but useful tests can be carried out on their 
contents.

Flag 0 - When non zero indicates game is dark (see also object 0)
Flag 1 - Holds quantity of objects player is carrying (but not wearing)

The following flags are decremented if non zero by PAW:
Flag 2 - When a location is described
Flag 3 - When a location is described and it's dark (Flag 0 not 0)
Flag 4 - When a location is described, it's dark and object 0 is absent.
Flag 5 to 8 - Every time frame (i.e. every phrase / timeout)
Flag 9 - Every time frame that it's dark
Flag 10 - Every time frame that it's dark and object 0 is absent

Flag 11 to 28 are free for use in your own games

Flag 29 holds Picture Control flags
	Bit 7 - Set this to force picture to be drawn (LOOK)
	Bit 6 - Set this to always draw picture (PICS ON)
	Bit 5 - Set this to never draw picture (PICS OFF)
	this is set by using the GRAPHIC action

Flag 30 - Score flag
Flag 31 / 32 (LSB/MSB) holds number of turns player has taken (actually this is the number of phrases 
extracted from the player's input).

Flag 33 - holds the Verb for the current logical sentence
Flag 34 - holds the first Noun in the current logical sentence
Flag 35 - holds the Adjective for the first Noun
Flag 36 - holds the Adverb for the current logical sentence
Flag 37 - holds maximum number of objects conveyable (initially 4).  Set using ABILITY action.
Flag 38 - holds current location of player.
Flag 39 - holds current top line of screen
Flag 40 - holds screen mode (range 0 to 4..) set with MODE action.  Also bit 7 - Forces no change of 
Border, Bit 6 Produces "More.." when screen fills.
Flag 41 - holds line number for split (if not in range 4-24 then 12 used) this is set by the PROTECT 
action to be the current screen line.
Flag 42 - holds prompt to use (a system message number - 0 selects one of four randomly.  Set by the 
PROMPT action).
Flag 43 - holds the Preposition in the current logical sentence.
Flag 44 - holds the second Noun in the current logical sentence.
Flag 45 - holds the Adjective for the second Noun
Flag 46 - holds the current pronoun ("IT" usually) Noun
Flag 47 - holds the current pronoun ("IT" usually) Adjective

Flag 48 holds Timeout duration required
Flag 49 holds Timeout Control flags
	Bit 7 - Set if timeout occurred last frame
	Bit 6 - Set if data available for recall (not of use to writer)
	Bit 5 - Set this to cause auto recall of input buffer on timeout
	Bit 4 - Set this to print buffer on exit, (for use with Bit 3)
	Bit 3 - Set this to take input from lower screen
	Bit 2 - Set this so timeout can occur on ANYKEY
	Bit 1 - Set this so timeout can occur on "More..."
	Bit 0 - Set this so timeout can occur at start of input only

Set using INPUT and TIME (as is flag 48), TIMEOUT tests bit 7 of this flag.

Flag 50 - holds locno. for DOALL loop. i.e. value following DOALL
Flag 51 - holds last object referenced by GET / DROP / WEAR / WHATO etc.  This is the number of 
the currently referenced object as printed in place of any underlines in text.
Flag 52 - holds player's strengths (maximum weight of objects carried and worn - initially 10)
Flag 53 - holds object print flags
	Bit 7 - Set if any object printed as part of LISTOBJ or LISTAT
	Bit 6 - Set this to cause continuous object listing i.e. LET 53 64 will make PAW list objects 
on the same line forming a valid sentence.
Flag 54 - holds the present location of the currently referenced object
Flag 55 - holds the weight of the currently referenced object
Flag 56 is 128 if the currently referenced object is a container
Flag 57 is 128 if the currently referenced object is wearable
Flag 58 & 59 should be avoided as they will be used for expansion.
Flag 60 to 255 are available for your own use.

The Condacts
Conditions:

AT		locno			; ensure player at specific location
NOTAT		locno
ATGT		locno			; higher location than specified
ATLT		locno			; lower...

PRESENT	objno
ABSENT	objno
WORN		objno
NOTWORN	objno
CARRIED	objno
NOTCARR	objno
ISAT		objno		locno+
ISNOTAT	objno		locno+

ZERO		flagno
NOTZERO	flagno
EQ		flagno		0-255
NOTEQ		flagno		0-255
GT		flagno		0-255
LT		flagno		0-255
SAME		flagno		flagno
NOTSAME	flagno		flagno

ADJECT1	word
ADVERB	word
PREP		word
NOUN2		word
ADJECT2	word

CHANCE	0-99				; random possibility of success
TIMEOUT

QUIT

Actions (Those marked 4 are type 4, 3 are type 3, 1 are type 1)

GET		4	objno
DROP		4	objno
WEAR		4	objno
REMOVE	4	objno
CREATE		objno
DESTROY		objno
SWAP			objno		objno
PLACE			objno		locno+
PUTO			locno+
PUTIN		4	objno		locno.
TAKEOUT	4	objno		locno.
DROPALL
AUTOG		4
AUTOD		4
AUTOW	4
AUTOR		4
AUTOP		4	locno
COPYOO		objno		objno

COPYOF		objno		flagno		; copy position of object to flag
COPYFO		flagno		objno

WHATO						; convert Noun1(Adjective1) to
							; current object
WEIGH			flagno		objno		; weight of object is put in flag

SET			flagno
CLEAR			flagno
PLUS			flagno		0-255		; add value to flag
MINUS			flagno		0-255
LET			flagno		0-255
ADD			flagno1		flagno2		; contents of flagno1 added to flagno2
SUB			flagno1		flagno2		
COPYFF		flagno1		flagno2
RANDOM		flagno				; set to random number from 0-99
MOVE			flagno				; adjust contents of flag according to
							; the LS Verb and the Connection
							; table entry for location, that the
							; contents specify.  (Allows movement
							; of PSI's)
GOTO			locno
WEIGHT		flagno				; Weight of objects carried & worn
							; are put in flag
ABILITY		0-255		0-255		; Set conveyable objects and strength

MODE			0-4		0-3
LINE			0-20				; Set screen line to split picture
GRAPHIC		0-3
PROMPT		sysno				; Prompt on input.  0 is random
INPUT			0-7
TIME			0-255		0-7
PROTECT

PRINT			flagno				; display contents of flag on screen
TURNS
SCORE
CLS
NEWLINE
MES			mesno				; message without a newline
MESSAGE		mesno				; message with a newline
SYSMESS		sysno				; system message without newline
PICTURE		locno				; Display picture (without CLS)
PAPER			0-9
INK			0-9
BORDER		0-7
CHARSET		0-255				; Select character set (if inserted)
SAVEAT						; Save current print position
BACKAT						; return to it
PRINTAT		0-20		0-31		; Set a new print position

LISTOBJ						; List objects at current location
LISTAT			locno+				; List objects at specified location
INVEN		3

DESC		1

END							; Type 2, Exits table to restart game

DONE		3
NOTDONE	3
OK		3

SAVE		1
LOAD		1
RAMSAVE
RAMLOAD		flagno

ANYKEY
PAUSE			0-255				; Delay program for n/50 of a second

PARSE							; Convert input string to valid LS
NEWTEXT						; Force the loss of remaining phrases

BEEP			0-255		0-255

PROCESS		procno

DOALL			locno+				; Generate Noun(Adjective)1 for each
							; object at Location locno.

RESET		1	locno				; Move player and present objects,
							; reset others to initially at - used
							; to chain games with LOAD

EXTERN		0-255				; Call external program

Where:
locno. is a valid location number.
locno+ also allows the use of; 252 (not created), 253 (worn), 254 (carried) and 255 which is converted 
into the current location of the player.
mesno. is a valid message.
sysno. is a valid system message.
flagno. is any flag (0 to 255)
procno. is a valid sub-process number.
word; is a word of the required type, which is present in the vocabulary, or "_" which ensures no-word - 
not an anymatch as normal.