







   AAAAAAAA  RRRRRRR  CCCCCCC TTTTTTTTTT  OOOOOO    OOOOOO  LL      SSSSS
   AA    AA  R     R  CC   CC T   TT   T OO    OO  OO    OO LL     SS   S
   AAAAAAAA  RRRRRRR  CC          TT     OO    OO  OO    OO LL     SS
   AA    AA  R  RR    CC          TT     OO    OO  OO    OO LL      SSSS 
   AA    AA  R  RR    CC          TT     OO    OO  OO    OO LL         SS
   AA    AA  R   RR   CC   CC     TT     OO    OO  OO    OO LL     S   SS
   AA    AA  R    RR  CCCCCCC    TTTT     OOOOOO    OOOOOO  LLLLLL SSSSS 




                              Version  0.72


                Written by:  Mohsen Alshayef  27 Oct 1992

                  Copyright (C)  Mohsen Alshayef 1992




            *************************************************
            *   This version of ARCTOOLS is Public Domain   *
            *************************************************




 ARCTOOLS is a complex program which is under continuous development and,
 while every effort is made to ensure it functions as detailed in this
 manual, I cannot accept any liability for any loss or damage resulting
 from the use of ARCTOOLS or the information in this manual.



                *****************************************
                *   For further information contact:    *
                *                                       *
                *     Mohsen Alshayef,                  *
                *     PO BOX 50217,                     *
                *     AL-Hidd,                          *
                *     Bahrain,                          *
                *****************************************                                        




Manual contents
===============
  Introduction:
      Important Notice
      System Requirements
      Starting ARCTOOLS

  The *Commands:
      Commands summary
      Disc and file commands
      Memory commands
      General commands

  The memory editors

  The disc editors:
      Using the disc editors with non-standard discs.
      Recovering deleted files using the disc editors.

  The Commands Menu

  Keys used in the editors:
      Keys summary
      Keys discription

  The dis-assembler

  The single-line assembler

  Calling the assembler from BASIC

  Using the dis-assembler to recover lost ARM code source files

  ARM 3 instructions assembly and disassembly


                     *****************************
                     *       Introduction        *
                     *****************************

ARCTOOLS is a utility module which adds many *Commands that most of you
will find very valuable.Some are seldom used, but they are there when you
need them. ARCTOOLS tries to add commands that are valuable to users
(beginners and experienced) as well as facilities that many advanced
ARM code programmers need.

ARCTOOLS differs from other utility modules in that most of its commands
are accessible from within the various memory and disc editors. An area
of memory or disc can be marked and then various operations can be
performed on it using a simple and efficient menu system.
ARCTOOLS also provides many facilities built into its editors with the
promise of more in future vesrions.

ARCTOOLS is not a multi-tasking application. Speed and ease of use is
what all matters to real users of ARCTOOLS. Fast scrolling colourful
text in the mnemonic or dis-assembler with automatic search for defined
labels every time an instruction is decoded out of memory has to be
done with no delays. This, however, does not mean that I am not thinking
of a Desktop version. ARCTOOLS has a built in 'Commands' menu, accessible
from any disc or memory editor. With few simple key strokes you can achieve
what takes ages with the mouse. Experienced users always use keyboard
shortcuts in any application.

The number of *Commands provided will be extended in the future.
Please feel free to contact me on the address given above if you need a
customized version with say certain *Commands added or others removed or
you want different keys to be used in the different editors.
Also, if you have any suggestions, comments, bugs discovered etc., I will
be pleased to here from you.
If you have a utility that YOU have written or an idea of a utility, please
contact me, I'll be happy to add your code to your customized ARCTOOLS.

ARCTOOLS is in a continuous development. New versions are coming up in every
two to three weeks, so please send suggestions and comments.

                      ****************************
                      *    Important Notice      *
                      ****************************
 
It is the user's responsibility to ensure that ARCTOOLS is used lawfully
and you are not permitted to use it in violation of Copyright Law.

You may NOT change ARCTOOLS utility or use ANY part of it in other products
without my approval. You may spread it freely with ALL files included,
but not for any profit. This software is provided 'as is'. Using it is
entirely at your own risk.

You are not allowed to distribute ARCTOOLS as an 'extra' in any commercial
product.
This version of ARCTOOLS is public domain. Future versions will remain
public domain until I decide otherwise.
If you are interested in ARCTOOLS as a commercial product, you are kindly
invited to contact me to discuss financial details. 

                       *************************
                       *  System Requirements  *
                       *************************

ARCTOOLS has been assembled using the BBC BASIC assembler and the ARM
BASIC EDITOR on an A5000 with 4 M bytes of memory and 120 M bytes Hard
Disc under RISC OS 3.10.

ARCTOOLS requires RISC OS 3 or higher to run. You may find that some
of ARCTOOLS commands will work on RISC OS 2 systems, but the memory
and disc editors will not. ARCTOOLS uses some of the new RISC OS 3
SWIs.




                        ***********************
                        *  Starting ARCTOOLS  *
                        ***********************

ARCTOOLS can be loaded into your system (as a module):

 1. From the Desktop: Click twice on the ARCTOOLS icon.
 2. From the line command: type  *ARCTOOLS

ARCTOOLS will take 63 K bytes from the RMA for its code and 39 K bytes
for its workspace. Additionally it will claim 32 Kbytes for the labels
buffers.

Future versions of ARCTOOLS will allow the user to specify the size of
the different ARCTOOLS buffers.




                           ARCTOOLS *Commands
                           ==================

Using the *Commands:
====================

ARCTOOLS provides three categories of *command:
- Disc and file commands.
- Memory commands.
- General commands.

To issue *Commands from wihin the desktop: press F12 and then type the
required command.

To enter any of the disc or memory editors from within the desktop you
should use the command line by pressing F12. Do not use the task window.
The memory and disc editors use direct screen access and will mess up the
desktop windows if entered from the task window.


*Commands summary:
==================

 1: *BList <filename> [<line number>][,[<line number>]] [<LISTO number>]
 2: *Clear <start> <end>|+<length>
 3: *Dedit <drive> [<address>] [<format>]
 4: *Dget <drive> <disc addrs> <end>|+<length> <memory addrs>
 5: *DLock [<ON|OFF>]
 6: *DMap [<drive>]
 7: *Dput <drive> <memory addrs> <end>|+<length> <disc addrs>
 8: *Event [<event number> <ON|OFF>]
 9: *Fcompare <1st file> <2nd file> [<max diff>]
10: *Fcount <filename> <string> [C]
11: *Fdump <filename> <format> [<offset>]
12: *Files 
13: *FillH <start> <end>|+<length> <Hex list>
14: *FillT <start> <end>|+<length> <string>
15: *FillW <start> <end>|+<length> <words list>
16: *FindB <start> <binary number> [Q|N|E|F]
17: *FindC <start> <word|%binary|mnemonic string>
18: *FindH <start> <Hex list> [Q|N|E|F]
19: *FindM <start> <Mnemonic string> [Q|N|E|F]
20: *FindN <start> <32-bit number> [Q|N|E|F]
21: *FindT <start> <string> [[C] [Q|N|E|F]]
22: *FindW <start> <word> [Q|N|E|F]
23: *Fjoin <1st file> <2nd file> [<target file>]
24: *FMcompare <filename> <addrs> [<max diff>]
25: *Freplace <srs filename> <srs string> <trgt filename> <trgt string> [C]
26: *Heap [<address>]
27: *Index 
28: *Labels 
29: *LoadLabels <filename>
30: *Mcommands [<relocatable module name>]
31: *Mcompare <start> <end>|+<length> <with> [<max diff>]
32: *Mdump <f/rmat> <start> [<end>|+<length> [<offset>]]
33: *Medit [[<address>] [<format>]] | [<label>]
34: *Mmap 
35: *Move <start> <end>|+<length> <to>
36: *MPage [<page number>]
37: *Reverse <start> <end>|+<length>
38: *SaveArc <filename>
39: *SaveLabels <filename>
40: *Slow [<value>]
41: *Swap <start> <end>|+<length> <with>
42: *SwiC [<SWI chunck>]
43: *SwiM <relocatable module name>
44: *SwiN <SWI name>
45: *SwiS <SWI number>
46: *System
47: *Timing <start> [<end>|+<length> [<offset>]]
48: *Tools [G|D|M]
49: *Vector [<vector number>]
50: *Where <address>


              *****************************************
              *       Disc and file commands          *
              *****************************************


 General Notes:

  -   Where <drive number> is given, this identifies the drive number
      as 0 to 7 or A to H, not a disc name.
  -   <format> means the editor format (B,H,W,T,M,N or Y) not the disc
      format.
  -   The *Dput and *Dget commands allow unrestricted length of data
      to be specified, they are not limited to a sector aligned lengths
      or addresses.   
  -   All disc and memory addresses are assumed to be hexadecimal values
      unless the address is proceeded with base number.
  -   It is best to use the commands menu built into the memory and disc
      editors to perform the equivalent *Dget and *Dput operations. This
      makes it easier and safer because you can see where data is copied
      from or copied to.
  
  WARNING: You should know what you are doing when using any of the
           disc commands.

    =======================================================================
 1: *Dedit <drive number> [<address>] [<format>]
    =======================================================================

    Enters any one of the 7 disc editors at the given address.
    If no address or format is given then the last visited address
    will be seeked and the last remembered disc editor is entered.
    The drive number must be given. This must be a drive number, not
    a disc name.
    The disc editors can edit any disc recognized by the Operating
    System including all ADFS formats, RAM disc, DOS and ATARI discs.
    As well as custom known disc formats. See the section on the
    Disc Editor.

    Parameters:
    ===========

    <Drive number>    can be any of the values 0 to 7 or A to H.

    <address>         optional disc address.

    <format>          optional editor format.


    Examples:
    =========

             *Dedit  0  0  T      Enter the disc Text editor at
                                  address 0 reading from drive 0.

             *Dedit  4  H         Enter the disc Hex editor at the
                                  last visited disc address on drive
                                  number 4 (Hard Disc 1).

    Possible errors: Bad drive
    ================ Bad number
                     Unknown ARCTOOLS editor

    Related commands: *Dput, *Dget.
    =================



    =======================================================================
 2: *Dget <drive number> <disc adrs> <end>|+<length> <memory adrs>
    =======================================================================

    Purpose: Copy a block of data from disc to memory.
    ========

    *DGET CAN GET DATA FROM ANY ADDRESS AND OF ANY LENGTH.

    Note: The memory area that the disc data will be copied to must
          lie in logical Ram.

    Parameters:
    ===========

    <drive>             :drive number 0-7 or A-H
    <disc adrs>         :start address of data on disc
    <end>|+<length>     :marker of data on disc. This can be given
                         as the end address or the length of data.
    <memory adrs>       :start address of memory to copy data to.

    Examples:
    =========

    *Dget 0 0 +400 60000        Copy 1024 bytes starting at disc address
                                0 to memory starting at 60000

    *Dget 0 1A +10 60005        Copy 10 bytes starting at disc address
                                1A to memory starting at 60005.
                                This actually copies the disc name to RAM!

    Possible error: Bad drive
    =============== Bad memory
                    Non writable memory

    Related commands: *Dput, *Dedit.
    ================

    =======================================================================
 3: *Dlock [<ON|OFF>]
    =======================================================================

    Purpose: To software write-protect ALL drives.
    ========

    Examples:
    =========
    *Dlock         Reports the status of the Dlock command, This
                   will show either:
                   'All drives are write-enabled', or
                   'All drives are write-protected'.

    *Dlock ON      Write protects all drives.

    *Dlock OFF     Removes the *Dlock protection.

    When Dlock is ON, an attempt to write to a drive will produce the
    error message: 'Protected drive'


    Possible errors: Bad parameter
    ================

    Related commands:  None.
    =================


    =======================================================================
 4: *Dmap [<drive>]
    =======================================================================

    Purpose: Display the free disc space map.
    ======== This command provides a neat way of display the free
             space map on disc by intercepting the OS *MAP command.

    This command shows the map number, its start address and its size
    together with the total free space map on the specified disc.

    Example:  *Dmap 4     Displays the free space map on the Hard disc.
    =======

    Possible errors: Bad drive
    ================

    Related commands: None.
    ================

    =======================================================================
 5: *Dput <drive> <memory adrs> <end>|+<length> <disc adrs>
    =======================================================================

    Purpose: Copy data from memory to disc directly.
    ========

    *DPUT CAN COPY DATA TO ANY ADDRESS AND ANY LENGTH OF DISC.

    The memory block must lie in a logical Ram area.

    Parameters:
    ===========

    <drive>             :drive number 0-7 or A-H
    <memory adrs>       :start adrs of data in memory
    <end>|+<length>     :marker of memory data. This can be given
                         as an end address or data length.
    <disc adrs>         :start address on disc to copy data to.

    Examples:
    =========

    *Dput 0 8F00 900 2800       Copies 256 bytes from memory address
                                8F00 to disc starting at address 2800.

    *Dput 0 60000 +10 1A        Copies 10 bytes starting at memory
                                address 60000 to disc starting at
                                address 1A

    Possible Errors: Bad drive
    ================ Bad memory

    Related commands: *Dget, *Dedit.
    =================


    =======================================================================
 6: *Fcompare <first file> <second file> [<max difference>]
    =======================================================================

    Purpose: Perform byte comparison of two files.
    ========

    This command compares two files byte for byte.
    If the <max difference> is ommited, the comparison will stop
    after 10 differences.
    To display all difference: give a max difference value of 0.
    Any difference will be shown as:

    Different at <address>: 1st file = <Byte> / 2nd file = <Byte>

    The 'different at address' is the offset within the files.

    If the two files compare okay, then the message "Comparion OK"
    will be shown.

    MOTE: This command performs a byte for byte comparison. It does
          not check to see if the two files have identical lengths.
          The comparison stops when either file end is reached.

    Examples:
    =========

    *Fcompare Document  Manual 0    Lists all differences between
                                       the two files.

    *Fcompare File1 File2   5       Compare 'File1' with 'File2', stopping
                                    after 5 differences.


    Possible errors: File not found.
    ================

    Related commands:  *FMcompare, *Mcompare.
    ================= 

    =======================================================================
 7: *Fcount <filename> <string> [C]
    =======================================================================

    Purpose: Counts the number of occurences of a string in the given
    ======== filename.
             String containing a number of spaces must be enclosed in
             quotes.
             The number of occurences is echoed on the screen dynamically.

    Parameters:
    ===========

    <filename>       The name of file to search in.
    <string>         The string to count.
    [C]              Optional switch which when included allows the
                     counting of strings to be case insensitive.

    Examples:
    =========

    *Fcount TextFile  "The"        Counts the number of occurences of the
                                   string 'The' in the file 'TextFile'

    *Fcount MyFile |M              Counts the number of occurences of the
                                   string |M (i.e. character ASCII code 13)
                                   in the file 'MyFile'

    *Fcount Prog ". This is" C     Counts the number of occurrences of the
                                   string '. This is' in the file 'Prog'.
                                   The search is case insensitive.

    The message 'No match found' will be reported if command can not find
    the requested string.

    Related errors: Bad parameter
    ===============

    Related commands: *Freplace
    =================


    =======================================================================  
 8: *Fdump <filename> <format> [<offset>]
    =======================================================================

    Purpose: Dump a file to screen using any of the 7 dump formats.
    ========

    This command allows a file stored on disc to be dummped into the
    screen, or printer if VDU 2 or CTRL+B has been issued.
    Using the optional <offset> address you can dump a file as though
    it was stored in a particular address. In the Mnemonics dump
    format, any reference to offset addresses in instructions will
    be taken care of.

    Parameters:
    ===========

    <filename>             A valid filename.
    <format>               Editor format: B, H, M, N, T, W or Y.
    <offset>               Optional offset address to be used in place
                           of the zero offset address.

    Examples:
    =========

    *Fdump myfile M 3800000   Dump 'myfile' using the dis-assembler
                              showing addresses as though the file was
                              in the system ROM address space.

    *Fdump Doc T              Dump the file 'Doc' using the Text dump
                              format.
    

    Possible errors: Unknown ARCTOOLS editor
    ================ Bad number

    Related commands: *Mdump
    =================

    =======================================================================
 9: *Files
    =======================================================================

    Purpose: List details of all currently open files.
    ========

    The command takes no parameters and prints out the following
    information on each currently open file:

    1. The handle number. The OS assigns a handle number for each
       file at time of opening which programs use to access the
       data in the file or to write data to the file.
    2. The read/write status. The read/read status indicates the type
       of access method used when the file was opened as follows:
       a) Read Only :  OPENIN used.
       b) Read/Write:  OPENOUT or OPENUP used.
    3. The file extent. This is the size of the file.
    4. The current pointer position in the file. The pointer position
       is controlled by the OS or by the user and is used as a mark
       to indicate where the data is read from or written to in the
       file.

    If there are no open files. The message 'No open files' is displayed.


    Possible errors: None.
    ===============

    Related commands: None.
    ================

    =======================================================================
10: *Fjoin <first file> <second file> [<target file>]
    =======================================================================

    Purspoe: To join two files.
    ========

    This command may be used to append one file to another, or
    make a new file out of two different files by appending
    them two each other.
    Note: Different filenames should be given to the three files.

    Parameters:
    ===========

    <first file>            Name of the first file.
    <second file>           Name of the second file.
    <target file>           Optional target file.


    Examples:
    =========

    *Fjoin Doc1 Doc2  New     Makes a new file called 'New' out of
                              the two files; 'Doc1' and 'Doc2'.
                              The new file will be stamped with the
                              file type 'Data'.

    *Fjoin File1 File2        Appends File2 to File1. In this case File1
                              will have File2 added to it. File1 will
                              maintain its old File Type.


    Possible errors: File open
    ================

    Related commands: None.
    =================


    =======================================================================
11: *FMcompare <filename> <address> [<max difference>]
    =======================================================================

    Purpose: Compares the content of a file with that of the given
    ======== memory area.

    This command compares a file with the content of memory.
    If the <max difference> is ommited, the comparison will stop
    after 10 differences.
    To display all difference: give a max difference value of 0.
    Any difference will be shown as:

    Different at <address>: file = <Byte> / memory = <Byte>

    The 'different at address' is the offset within the file, not
    the memory address, and always starts at zero. Bytes values
    are shown in hexadecimal.

    Parameters:
    ===========

    <filename>                 Valid filename.
    <address>                  Start of memory to compare with.
    <maximum difference>       Optional max difference allowed.

    Examples:
    =========

    *FMcompare MyProg  8f00      Compares the content of the file
                                 'MyProg' with the content of memory
                                 starting at address &8F00.

    *FMcompare Text 8F00 0       Compare the content of file 'Text'
                                 with memory starting at &8F00, listing
                                 all differences.


    Possible errors: Bad number
    ================ Bad memory
                     None logical ram address


    Related commands: *Fcompare, *Mcompare.
    =================

    =======================================================================
12: *Freplace <srs filename> <srs string> <trgt filename> <trgt string> [C]
    =======================================================================

    Purpose: To replace or delete a string in a file.
    ========

    This command replaces the given <srs string> with the given
    <trgt string>. Any reference to the <srs string> in the <srs filename>
    is replaced by the <trgt string> and placed in the new file
    <trgt filename>.
    If the <srs string> is to be deleted, then the use '-d' for the
    <trgt string>.
    When the 'C' switch is included, the search for the string becomes
    case insensitive.

    Parameters:
    ===========

    <srs filename>     Filename to search for string inside.
    <srs string>       String to search for in the <srs filename>.
    <trgt filename>    New file to be created.
    <trgt string>      String which will replace the <srs string>.
    [C]                When included the search becomes case insensitive.

    Examples:
    =========

    *Freplace Documnt1 "Roger" Documnt2 "Mike"
                           Replaces all references to the string 'Roger'
                           in the file Documnt1 by the string "Mike", and
                           places the result in Cocumnt2.

    *Freplace ReadMe |M  ReadMe2  |M|J
                           Replaces all references to <CR> in the file
                           'ReadMe' by the ASCII code <CR><LF>, creating
                           a new file called 'ReadMe2'.
                           This example shows how a text file under RISC
                           OS system can be converted to a file readable
                           under MS DOS.

    *Freplace MyProg |J  NewFile -d
                           Creates a file called 'NewFile' identical to
                           file 'MyProg' but removing any ASCII codes 12
                           (Line feed).

    Possible errors: File not found
    ================ Bad parameter

    Related commands: *Fcount
    =================




                  +++++++++++++++++++++++++++++++++
                  +       Memory Commands         +
                  +++++++++++++++++++++++++++++++++

    General Notes:
    ==============

    - Extreme caution should be exercised when using the memory commands
      as most of them have a destructive effect on data in memory.

    - To be able to write into an area of memory, the memory block must
      exist in logical or physical Ram. No write operation is allowed
      into the the ROM address space (above &3400000).

    - The memory commands have been optimized for speed and efficiency.




    =======================================================================
 1: *Clear <start> <end>|+<length>
    =======================================================================

    Purpose: Wipe clean a block of memory.
    ========

    Parameters:
    ===========

    <start>               The start address of memory area
    <end>                 The end address of memory area
    +<length>             The length of memory area

    Examples:
    =========

    *Clear 9000 +100      Clears 256 bytes starting at address &9000
    *Clear 9000 9100      same as above command

    Note: The memory area to be cleared must be writable.
          If the end address of the area to be cleared lies in
          a memory area different than that of the start address,
          ARCTOOLS will clear up to the end of the current memory
          area.

    Possible errors:
    ================

    Related commands: *FillH, *FillT, *FillW.
    =================


    =======================================================================
 2: *FillH <start> <end>|+<length> <hex list>
    =======================================================================

    Purpose:  Fill memory area with a sequence of bytes.
    ========

    This command allows a region of memory to be filled with
    specified data.
    The given sequence of bytes is repeatedly written to bytes in the
    given memory area until the entire block has been filled.

    Parameters:
    ===========

    <start>           Start address of the memory block.
    <end>             End address of the memory block.
    +<length>         Length of the memory block.
    <hex list>        List of space separated hexadecimal bytes
                      to fill the requested memory area with.

    Examples:
    =========

    *FillH 10000 +200 FF          Fills &200 bytes of memory area starting
                                  at address &10000 with the hex byte &FF.

    *FillH 20000 +100 "0 0 1 1"   Fill &100 bytes of memory area starting
                                  at address &20000 with the bytes
                                  0 0 1 1. 


    Possible errors:  None logical ram address
    ================  Non-writable memory
                      Bad memory
                      Bad number

    Related commands: *FillT, *FillW
    =================

    =======================================================================
 3: *FillT <start> <end>|+<length> <string>
    =======================================================================

    Purpose: Fill memory area with a string.
    ========

    The given string is repeatedly written to bytes in the given
    memory range until the entire block has been filled.

    Parameters:
    ===========

    <start>           Start address of the memory block.
    <end>             End address of the memory block.
    +<length>         Length of the memory block.    
    <string>          String to fill memory with. The Operating System
                      GSTranslate convention for specifying control
                      characters may be used within the string.

    Examples:
    =========

    *FillT  45000 +1000 "Risc"   This would fill the memory range &45000
                                 to &46000 with the string "Risc"

    *FillT  45000 46000 "Risc"   Similar to the above.

    *FillT  20000 +100 "|M"      Fill the memory area with the ASCII code
                                 given by CTRL+M, i.e. character with
                                 ASCII code 13.


    Possible errors:  None logical ram address
    ================  Non-writable memory
                      Bad memory

    Related commands: *FillH, *FillW
    =================


    =======================================================================
 4: *FillW <start> <end>|+<length> <words list>
    =======================================================================

    Purpose: Fill memory area with 32-bit numbers.
    ========

    The memory block must be word aligned.

    Parameters:
    ===========

    <start>           Start address of the memory block.
    <end>             End address of the memory block.
    +<length>         Length of the memory block.
    <word list>       List of 32-bit numbers space separated.

    Examples:
    =========

    *FillW 19000 21000 "10203040 1234 1 2"

                       Fill memory area &19000 to &21000 with the 32-bit
                       numbers:
                       10203040, 00001234, 00000001, 00000002

    *FillW 21400 +200 "1 2 3 4"

                       Fill memory area &21400 to &21600 with the 32-bit
                       numbers:
                       00000001, 00000002, 00000003, 00000004



    Possible errors:  None logical ram address
    ================  Non-writable memory
                      Bad memory
                      Non aligned address
                      Bad number

    Related commands: *FillH, *FillT
    =================



              ===========================================
              General notes on the memory search commands
              ===========================================

   The memory search commands are: *FindB, *FindC, *FindH, *Find, *FindM
   *FindN and *FindT.

   These commands search all memory starting at the given address for
   the given data.
   All of the search commands except *FindC, have optional switches
   which are Q, N, E or F. The meaning of each switch is:
   Q : Quit after first match.
   N : Go for Next match. This gives a list of all matching addresses.
   E : Enter the appropriate editor at the first match.
   F : Full search. This is a count option which will give the number
       of matches found.
   If no Q, N, E or F switch is given then, the message:
   "Found at address &xxxxxxxx (Quit/Next/Edit) (Q/N/E)?" will
   be shown. Press Q to quit, N for next match or E to enter the
   memory editor at the shown address. At any time pressing Escape
   key stops the search. Once in the memory editors, use the key
   combination CTRL+Back Space to search for the next match. The
   Back Space key is the key to the right of the Pound key. You can switch
   to another editor and continue the search.

   At any time, the Escape key can be used to abandon the search.


   NOTE: It is possible that the search commands will report matches
         found in memory locations, that upon entering the editors,
         the contents of these locations have changed.
         The search routines will report that a 32-bit number or a
         mnemonic string is found at say &1C00010, but the content of
         that location is different!!!. The reason behind this is that
         this area (starting at &1C00000) is used as the OS heap and
         Supervisor stack were registers are stored when pushed on the
         stack. The same applies to area starting at &1F00000 which is
         used for the cursor, OS space and the sound DMA.
         ARCTOOLS stores the numbers to search for in registers
         which are pushed into the stack when sub-routines are called.
         The search routine will find the register content pushed into
         the stack, but as soon as the search routine exits to report to
         you that a match is found, the registers would have been pulled
         out of the stack and the stack has been replaced by other values.
         This is the reason behind this strange behaviour. This is considered
         normal and is not a bug.


    =======================================================================
 5: *FindB <start> <binary number> [<Q|N|E|F>]
    =======================================================================

    Purpose: Memory search for a binary number.
    ========

    This command is used to search all the machine memory starting
    at the given address for a binary number.
    Characters allowed in the binary number are 0, 1 and #. The
    entered number is considered a 32-bit binary number.
    If the entered binary number is 11, then this will translate into:
    00000000000000000000000000000011

    The command will list all memory addresses that have the same
    number.

    Parameters:
    ===========

    <start>                 Memory start address.
    <binary number>         A binary number. Single wildcards
                            allowed.
    <Q>                     Quit after first found match.
    <N>                     Show Next address. This causes all
                            all matching memory addresses to be
                            listed into the screen.
    <E>                     Enter the editor at first match address.
    <F>                     Full. This performs a count of the
                            number of matches found.

    Examples:
    =========

    *FindB  0   11          Lists all addresses that contain the binary
                            number %11.

    *FindB  0  ####1111000000000000000000000000  F
                            Count all matches of the given binary number.
                            This actually counts all SWI instructions
                            in the machine.


    Possible errors: Bad memory
    ================ Bad parameter
                     Bad number

    Related commands: *FinH, *FindM, *FindT, *FindC, *FindN, *FindW
    =================


    =======================================================================
 6: *FindC <start> <word|%binary|Mnemonic string>
    =======================================================================

    Purpose: Provide a mnemonic screen dump of all occurrences of
    ======== the given match code.

    This command will dump to the screen in the current dis-assembler
    display format all occurrences of the given code.
    The code to search for can be given as a 32-bit number (Word),
    a 32-bit binary number or as a mnemonic string.
    If the code is enclosed in quotes then it is assumed to be a
    mnemonic string, if it is proceeded by the % sign then it is
    assumed to be a binary number, otherwise it is a 32-bit hex
    number.
    Single wildcards are only allowed in the word or binary number
    code.

    Parameters:
    ===========

    <word>                   A 32-bit hex number. Single wild cards
                             allowed
    <%cinary>                A 32-bit binary number, proceeded by the
                             % sign. Single wildcards allowed.
    <Mnemonic string>        A string of assembly code.

    Examples:
    =========

    *FindC 3800000 "SWI OS_WriteS"    Dump to screen all references to the
                                      SWI OS_Find instruction starting at
                                      address &3800000 (System ROM area).

    *FindC 1800000 #F######      Dump to screen all reference of SWI
                                 instructions starting at address &1800000.

    *FindC 0 %####00010###########00001001###
                                 Dump to screen all references to the
                                 ARM3 SWP instruction.

    *FindC 3800000 %####1110000#########111100010000
                                 Dump to screen all reference to the
                                 ARM3 cache control register operations in
                                 the system ROM.


    Possible errors: Bad memory
    ================ Bad parameter
                     Bad number

    Related commands: *FinH, *FindM, *FindT, *FindW, *FindN, *FindB
    =================


    =======================================================================
 7: *FindH <start> <hex list> [<Q|N|E|F>]
    =======================================================================

    Purpose: Search memory for a list of hex bytes.
    ========

    Parameters:
    ===========

    <start>                 Memory start address
    <hex list>              A list of hexadecimal byte numbers
                            Single wildcards allowed.
    <Q>                     Quit after first found match.
    <N>                     Show Next address. This causes all
                            all matching memory addresses to be
                            listed into the screen.
    <E>                     Enter the editor at first match address.
    <F>                     Full. This performs a count of the
                            number of matches found.

    Examples:
    =========

    *FindH &8F00 "0D FF"    Search memory for the bytes &0D followed by
                            by &FF starting at address &8F00. This finds
                            the end address of a BASIC program in
                            memory.

    *FindH 0 "FF ## FF 00"  Search for the bytes sequence which has the
                            first byte &FF, third byte &FF, fourth byte
                            &00, don't care about second byte.

    *FindH 3800000 "1#F"    Similar to search for "1# 0F", starting at
                            address &3800000.

    *FindH 0 "#A 20 F# ## 34"  Search for the bytes sequence with the
                               following criteria:
                               1st byte: low nibble = &A
                               2nd byte: &20
                               3rd byte: high nibble = &F
                               4th byte: don't care
                               5th byte: &34

    Possible errors: Bad memory
    ================ Bad parameter
                     Bad number

    Related commands: *FinB, *FindM, *FindT, *FindC, *FindN, *FindW
    =================

    =======================================================================
 8: *FindM <start> <Mnemonic string> [<Q|N|E|F>]
    =======================================================================

    Purpose: Search memory starting at the given address for
    ======== mnemonics.

    This command allows the search of a line of assembly code
    to be performed. The mnemonic must be enclosed in quotes.
    Any string which ARCTOOLS can assemble can be searched for.
    The current version of ARCTOOLS does not allow wildcards in
    the given mnemonic string.

    Parameters:
    ===========

    <Start>                 Memory start address.
    <Mnemonic string>       Valid mnemonic string.
    <Q>                     Quit after first found match.
    <N>                     Show Next address. This causes all
                            all matching memory addresses to be
                            listed into the screen.
    <E>                     Enter the editor at first match address.
    <F>                     Full. This performs a count of the
                            number of matches found.
    
    Examples:
    =========

    *FindM   0  "STMFD R13!,{R14}"    Search memory starting at address
                                      &0000 for the mnemonic string
                                      "STMFD R13!,{R14}"
                                     
    *FindM 3800000 "SWI OS_ReadC"     Searches the ROM for the all
                                      occurrences of SWI "OS_ReadC".

    *FindM 3800000 "SWI OS_ReadC" F   Counts the number of occurrences
                                      of the SWI "OS_ReadC"

    *FindM 3800000 "LDRB R0,[R1]" E   Search for the given assembly
                                      code in the system ROM, entering
                                      the Mnemonics editor at the first
                                      Match found. Use CTRL+Back Space
                                      for next match search.

    Possible errors: Bad memory
    ================ Bad parameter

    Related commands: *FinH, *FindB, *FindT, *FindC, *FindN
    =================

    =======================================================================
 9: *FindN <stirt> <32-bit number> [<Q|N|E|F>]
    =======================================================================

    Purpose: Search for a 32-bit number in memory.
    ========

    This command searches for a 32-bit decimal number. The sign
    can be given. Wildcards are not allowed.

    Parameters:
    ===========

    <start>                 Memory start address
    <32-bit number>         A 32-bit decimal number.
    <Q>                     Quit after first found match.
    <N>                     Show Next address. This causes all
                            all matching memory addresses to be
                            listed into the screen.
    <E>                     Enter the editor at first match address.
    <F>                     Full. This performs a count of the
                            number of matches found.

    Examples:
    =========

    *FindN  0  -1 N         List all occurrences of the decimal number
                            -1

    *FindN  3800000 -1 F    Count all occurrences of the number -1 in
                            the system ROM area.

    *FindN  3800000 123 E   Search for the number 123 in the system
                            ROM, entering the Numbers editor at the
                            first match found. Use CTRL+Back Space for
                            the next match.


    Possible errors: Bad memory
    ================ Bad parameter
                     Bad number

    Related commands: *FinH, *FindM, *FindT, *FindC, *FindB, *FindW
    =================

    =======================================================================
10: *FindT <start> <string> [<Q|N|E|F>]
    =======================================================================

    Purpose: Search for a string in memory
    ========

    The operating system GSTranslate convention for specifying control
    characters may be used within the search string.

    Parameters:
    ===========

    <start>                 Memory start address
    <string>                A valid string which is GSTranslated.
                            Single wildcards allowed.
    <Q>                     Quit after first found match.
    <N>                     Show Next address. This causes all
                            all matching memory addresses to be
                            listed into the screen.
    <E>                     Enter the editor at first match address.
    <F>                     Full. This performs a count of the
                            number of matches found.

    Examples:
    =========

    *FindT 3800000 "Acorn"        Search the OS ROM for the string "Acorn".

    *FindT 3800000 "System" F     Count the number of occurrences of the
                                  string "System" in the OS ROM.

    *FindT 3800000 "System" C F   Similar to the above but the search is
                                  now case insensitive.

    *FindT 0 "|M|J" N             List all addresses that contain the
                                  control codes 13 followed by 10. These
                                  are the control codes for a carriage return
                                  and a line feed.


    Possible errors: Bad memory
    ================ Bad parameter

    Related commands: *FinH, *FindM, *FindW, *FindC, *FindN, *FindB
    =================    


    =======================================================================
11: *FindW <start> <word> [<Q|N|E|F>]
    =======================================================================

    Purpose: Search memory for a given 32-bit hexadecimal number.
    ========

    Parameters:
    ===========
    
    <start>                 Memory start address
    <word>                  A 32-bit hexadecimal number. Single
                            wildcards allowed.
    <Q>                     Quit after first found match.
    <N>                     Show Next address. This causes all
                            all matching memory addresses to be
                            listed into the screen.
    <E>                     Enter the editor at first match address.
    <F>                     Full. This performs a count of the
                            number of matches found.

    Examples:
    =========

    *FindW  0 "######12"      Search memory starting at address &00000 for
                              the hex 32-bit number which has the LSB byte
                              of &12.

    *Find 1800000 "6A######"  Search memory starting at address &1800000 for
                              any 32-bit number with the msb byte equal to
                              &6A. This actually searches for all Branch
                              instructions with 'V' condition code set.
                              If you select to enter the editor, then you
                              are placed in the WORDs editors, however, you
                              can continue the search for the next match
                              from within any editor.


    Possible errors: Bad memory
    ================ Bad parameter
                     Bad number

    Related commands: *FinH, *FindM, *FindT, *FindC, *FindN, *FindB
    =================

    =======================================================================
12: *Heap [<address>]
    =======================================================================

    Purpose: Examine the structure of a heap memory.
    ========

    Parameters:
    ===========

    [<address>]            Heap start address.
                           If no address is given the RMA area is examined.

    This command provides the following information:

    - Heap memory start address
    - Heap size
    - Total number of blocks
    - Total area used in the heap
    - Total free area in the heap
    - Largest free block

    The command also provides the following information on each block in
    the heap:

    - Block position
    - Start address in heap area
    - Size
    - Status (Claimed or free)

    If the Heap address is &1800000 (i.e. the RMA area), then this command
    provides more information on whether the heap block is a module code
    or a module buffer.

    Examples:
    =========

    *Heap          Displays the structure of the RMA heap

    *Heap 10000    Displays the structure of heap area starting at memory
                   address &10000

    Related error: 'Bad or corrupted heap'
    ==============

    Related commands: None.
    =================



    The block size shown is the one setup by the OS Heap Manager and not
    necessarily the one requested by the program. ie. the size includes
    the 4 bytes allocated at the start of each block which contains the
    block size. Additionally the Heap manager forces the block size to
    be a multiple of eight. Therefore, the minimum size of a block is 8
    bytes including the 4 bytes allocated to the size.
    Example: if a block size of 1022 was requested then the Heap Manager
             aligns the length to a word boundary becoming 1024 bytes, then
             adds 4 bytes to it making it 1028 bytes, then forces it to
             a multiple of eight making the length 1032 bytes.
    Using the above example it can be seen that although the user requested
    1022 bytes, the Heap Manager allocated 1032 bytes for the block.
    ARCTOOLS displays the Heap Manager's block size, not the user's requested
    size.
    Released blocks are highlighted by the word 'free'. The last block if any
    is the unused area in the heap.
    The *Heap command is very useful when developing programs that make use
    of the heap system as it is important for the program to release any
    memory area not being used and to be written in such a way as not to
    cause many holes to appear in the heap memory.
    RISC OS makes extensive use of a number of different heaps, the re-
    locatable module area (RMA) is used by the OS as one large heap. Other
    heap areas known to the author is the one starting at address &1C02000
    which is used to store system variables.



    =======================================================================
13: *Mcompare <start> <end>|+<length> <with> [<max diff>]
    =======================================================================

    Purpose: Compares the content of two memory blocks byte for
    ======== byte.

    This command compares the content of two memory areas byte for
    for byte listing any differences on the screen.
    If the <max difference> is ommited, the comparison will stop
    after 10 differences.
    To display all difference: give a max difference value of 0.
    Any difference will be shown as:

    Different at <address> = <Byte> / <address> = <Byte>

    If the two memory blocks contain the same data, the message
    'Comparion OK' will be shown.

    Parameters:
    ===========

    <start>            Start address of the first memory block.
    <end>              End address of the first memory block.
    +<length>          Length of the first memory block.
    <with>             Start address of the second memory block.
    <max diff>         Optional maximum difference.

    Examples:
    =========

    *Mcompare 8F00 +1000 10000      Compare memory 8F00 to 9F00 with
                                    memory starting at 10000.

    *Mcompare 20000 +200 30000 0    Compare &200 bytes of memory starting
                                    at address &20000 with that starting
                                    at address &30000. List all possible
                                    differences.


    Possible errors:  None logical ram address
    ================  Non-writable memory
                      Bad memory

    Related commands: *FMcompare.
    =================

    =======================================================================
14: *Mdump <format> <start> [<end>|+<length> [<offset>]]
    =======================================================================

    Purpose: Dump memory content in the specified dump format.
    ========

    When the memory is dumped into the screen, the memory addresses
    shown are those where the data comes from. However, using the
    <offset> address you can cause the result to show the dump of
    an area of memory as though it has come from another address.
    NOTE: To give the <offset> address, you should specify the <end> or
          +<length> parameter.
    If no <end> or +<length> parameter is given then a full screen dump
    is given. This depends on the current screen mode.

    Parameters:
    ===========

    <format>               Editor format: B, H, M, N, T, W or Y.
    <start>                Start address of the memory block.
    <end>                  Optional memory block end address.
    +<length>              Optional length of the memory block.
    <offset>               Optional offset address to be used in place
                           of the actual memory address.

    Examples:
    =========

    *Mdump M 3800000 +100 0    Dump &100 bytes starting at &3800000 using
                               the Mnemonic format. Show as though code
                               was at address &0000

    *Mdump T 8f00 20000        Dump memory area &8F00 to &20000 using the
                               Text format.



    Possible errors:  None logical ram address
    ================  Non-writable memory
                      Bad memory
                      Unknown editor format

    Related commands: *Fdump, *medit, *Dedit.
    =================

    =======================================================================
15: *Medit [[<address> [<format>]] | [<label>]
    =======================================================================

    Purpose: Enter one of the 7 memory editors.
    ========

    This is the heart of ARCTOOLS commands. Any of the 7 memory
    editors can be accessed using this command.
    The address given is aligned to the next word-aligned address in
    the Mnemonic, Word, Numbers and Binary editors.

    Parameters:
    ===========

    *Medit                     Enter the last visited editor at the last
                               visited address.
    *Medit <address>           Enter the last visited editor at the given
                               memory address.
    *Medit <address> <format>  Enter the given editor at the given address.
    *medit <format>            Enter the given editor at the last visited
                               memory address.
    *medit <label>             Enter the Mnemonics editor at the given
                               label address.

    Examples:
    =========

    *medit 3800000 m           Enter the Mnemonics editor at the start of
                               system ROM space.

    *medit my_code             Enter the Mnemonics editor at the label
                               my_code. If the label is not defined, then
                               the error message 'Bad number' is given.

    *medit T                   Enter the text editor at the last visited
                               address.


    Possible errors: Bad number
    ================ Unknown editor format

    Related commands: *Mdump, *Fdump, *Dedit.
    =================


    =======================================================================
16: *Mmap
    =======================================================================

    Purpose: Display the memory map of the machine.
    ========

    This command gives useful information on the logical memory
    mapping of the machine. The command shows the memory area
    name, its start address, its end address and its current
    size. The command also shows the total physical ram in the
    machine.
    The sizes of the IOC devices, the Low ROM and the High ROM areas
    are the maximum size available.

    On ARM 3 machines, the cache state of each memory area is displayed.
    Memory areas can be cacheable, uncacheable, cacheable and updateable,
    or cacheable and disruptive.


    Possible errors: None.
    ================

    Related commands: None.
    =================


    =======================================================================
17: *Move <start> <end>|+<length> <to>
    =======================================================================

    Purpose: Copy a block of memory from one location to another.
    ========

    This command performs a copy of an area of memory to another
    location leaving the original area intact.

    Parameters:
    ===========

    <start>             Start address of memory to be copied.
    <end>               End address of the memory to be copied.
    +<length>           Length of the memory block to be copied.
    <to>                Target address.

    Examples:
    =========

    *Move  3800000 +2000  20000    Copies the first &2000 bytes from
                                   the memory area starting at address
                                   &3800000 to the area starting at
                                   address &20000.

    *Move 2004000  +1000 20000     Copies &1000 bytes from physical ram
                                   starting at &2004000 to address &20000.



    Possible errors:  None logical ram address
    ================  Non-writable memory
                      Bad memory

    Related commands: *Swap, *Reverse.
    =================

    =======================================================================
18: *Mpage [<page number>]
    =======================================================================

    Purpose:  Displays the logical to physical memory mapping used by
    ========  the MEMC.

    Parameters:
    ===========

    [<page number>]         MEMC page number 0-255
                            If no page is given all pages are shown

    Information provided are:

    - Total pages in machines
    - Page size
    - Total mapped out pages (see below)
    - Page number, with its corresponding physical and logical memory
      addresses, its protection level number, its accessibility level and
      the memory area allocated to.

    The ARM can address 64 Mbytes of memory. This 64 Mbytes is divided
    into three areas. 16 Mbytes for physical RAM, 16 Mbytes for I/O and ROM,
    and 32 Mbytes for logical RAM. Address &0000000 to  &1FFFFFF is assigned
    to logical RAM and addresses &2000000 to &2FFFFFF are assigned to
    physical RAM. The I/O and ROM addresses start from &3000000 to &3FFFFFF.
    RISC OS uses the MEMC to map the 16 Mbytes of physical memory into
    16 Mbytes of logical memory. Using the current ARM-MEMC interface, the
    maximum RAM an ARM machine can support is 16 Mbytes.
    The mapping performed by the MEMC is achieved through a so called paging
    structure. The available physical memory is divided into pages. The
    max number of pages the current MEMC can support is 128. In a 1 Mbytes
    machine, each MEMC page is 8 Kbytes in size (1 Mbytes divided by 128).
    In a 4 Mbytes machines, the page size is 32 Kbytes. Each page has its
    own descriptor entry held in a so called CAM (Content-Addressable Memory)
    area in the MEMC. This MEMC structure allows fast logical to physical
    address translation without increase in memory access time.
    Each MEMC page can have its own protection level; 0, 1 or 2.

    The protection levels are defined as follows:
    Level 0 : The least privileged mode. This level allows read and
              write operation by everybody.
    Level 1 : This is read only in User mode. You must enter a Supervisor
              mode (SVC, IRQ or FIQ) to write into such page.
    Level 2 : This is not accessible in User Mode. You must switch into
              a Supervisor mode to read or write into such page.

    RISC OS provides two SWIs to enable reading and/or setting the MEMC
    memory map entry parameters together with protection levels.
    Using these SWIs, one can perform the following operation on memory
    pages:
           1. Un-map a page
           2. Map a page onto one page of logical memory
           3. Map a page onto several pages of logical memory

    The last operation (mapping one page into several pages of logical
    memory) is very unique in the sense that once several pages of
    logical Ram are mapped from one physical page, RISC OS will not
    be able to read or write from such pages. RISC OS can only read
    and write from pages that have a one-to-one mapping. The program
    that performed such map translation is the only one which could
    read and write those pages as it the one that has the old mapping
    parameters before being re-mapped.
    The Desktop uses this technique (one-to-many mapping) to hide
    pages of applications away when several applications are being
    multi-tasked and are sharing the same address (&8000).
    Such pages are referred to as mapped-out or hidden pages.

    In ARCTOOLS *Mpage command, mapped out pages are annotated 'Mapped out'
    and have the minimum accessibility. These pages are mapped to address
    &1F08000 which is part of the Cursor, OS space and Sound DMA area.
    All mapped out pages are mapped into this address, hence ARCTOOLS can not
    display the contents of such pages, however, if the machine contains
    mapped out pages, ARCTOOLS memory editors will allow display and editing
    of the memory page at address &1F08000 which will be one of the mapped
    out pages. Remember that ARCTOOLS memory editor allow editing of physical
    RAM and hence all pages of the machine are accessible.
    The mapping out technique is used extensively by the Desktop to hide
    programs and memory areas in a multi-tasking environment.
    Using *Mpage from within the Desktop will show all mapped out pages
    available.
    Memory pages may be hidden or mapped out by using the OS SWI call
    'OS_SetMemMapEntries' setting the page address to a value above
    32 Mbytes (&2000000).


    =======================================================================
19: *Reverse <start> <end>|+<length>
    =======================================================================

    Purpose: Reverse the data in a block of memory.
    ========

    Parameters:
    ===========

    <start>             Start address of first memory block.
    <end>               End address of the first memory block
    +<length>           Length of the first memory block.


    Examples:
    =========

    *Reverse   8000 +100      Reverses 256 bytes of data starting
                              at memory address &8000

    *Reverse 10000 11000      Reverses the given memory block.


    Possible errors:  None logical ram address
    ================  Non-writable memory
                      Bad memory

    Related commands: *Swap, *Move.
    =================


    =======================================================================
20: *Swap <start> <end>|+<length> <with>
    =======================================================================

    Purpose: Swaps to blocks of memory.
    ========

    Parameters:
    ===========

    <start>             Start address o& first memory block.
    <end>               End address of the first memory block
    +<length>           Length of the first memory block
    <with>              Start address of the second memory block

    Examples:
    =========

    *Swap  8000 +1000 9000    Swaps 4096 bytes (&1000) from the
                              memory area starting at &8000 with that
                              starting at &9000

    *Swap 8000 9000 9000      Similar to the above, using an end address
                              example of &9000.

    Possible errors:  Memory overlaps.
    ===============   None logical ram address
                      Non-writable memory
                      Bad memory


    Related commands: *Move, *Reverse.
    ================


    Note: The two memory blocks should not overlap, as this will
          generate an error. Swapping overlapped memory blocks causes
          the data in both blocks to be corrupted.

    =======================================================================
21: *Timing <start> [<end>|+<length> [<offset>]]
    =======================================================================

     This command is similar to *Mdump with an 'M' format, however, the dump
     also includes the ARM instruction timing.
     It is informative to know how quickly you can expect instructions to
     execute. This command gives the timing of all ARM instructions.
     As different ARM machines have different clock frequencies, the timing
     is not given in actual nano- or micro-seconds, instead it is given in
     terms of 'instruction cycles'. The 'clock cycle' is one tick of the
     crystal oscillator which drives the ARM.
     There are 3 types of instruction cycles used in an ARM machine:

     1. Sequential (s) cycles:
        Used when the ARM fetches instructions in a sequential order.
        For example, when the ARM is executing instructions with no
        interruption from branches and load/store operation.
        These cycles are one clock cycle per instruction cycle for RAM
        and two clock cycles for ROM.
     2. Non-sequential (n) cycles:
        Used when the ARM fetches instructions in a non-sequential order.
        For example, the first instruction fetched after a branch
        instruction.
        These cycles need two clocks cycles per instruction cycle for RAM
        and ROM.
     3. Internal (i) cycles:
        Used when the ARM is performing an internal operation and not
        accessing memory to fetch an instruction.
        These instruction cycles always take one clock cycle.

     The actual time for each instruction to execute depends on the type
     of instruction and on the machine clock speed.

     The clock cycles timings are as follows:

      8 MHz machine: one clock cycle is 125 nano-seconds
     12 MHz machine: one clock cycle is 83.3 nano-seconds
     24 MHz machine: one clock cycle is 41.7 nano-seconds
     32 MHz machine: one clock cycle is 32.75 nano-seconds

     One nano-second equals one thousands of a micro-second.

     On an 8 MHz machine one 's' instruction cycle takes 125 nano-seconds,
     one 'n' cycle takes 250 nano-seconds.
     On a 16 MHz machine one 's' instruction cycle takes 65.5 nano-seconds.
     On 25 MHz and above machines the 's' and 'n' instruction cycle timing
   0 will be affected by the memory access time as the processor will be
     using wait states when accessing the slow memory. However, the 'i'
     cycles are not affected by memory access time.


    =======================================================================
22: *Where <address>
    =======================================================================

    Purpose: Display the area of memory to which the given address 
    ======== belongs.


    Examples:
    =========

    *where 0            The command output will be 'OS workspace'

    *where 3400000      The command output will be 'Low ROM/VIDC'

    

   Possible errors: 'Bad number'
   ================ 'Bad memory'

   Related commands: *Mpage
   =================



                  ++++++++++++++++++++++++++++++++
                  +     General Commands          +
                  ++++++++++++++++++++++++++++++++


    =======================================================================
 1: *BList <filename> [<1st line>][,[<2nd line>]] [<LISTO number>]
    =======================================================================

    Purpose: Lists a tokenised BASIC file. Output is sent to the
    ======== screen but if VDU2 was issued output will also be sent to
             the printer.

    Parameters:
    ===========

    <filename>          the name of a BASIC tokenised file
    [<LISTO number>]    this is a number from 0-31. This is similar
                        to BASIC's LISTO option number except that
                        bit 1 (i.e. ident structure) is not used.
                        The default number is zero.

    LISTO option bits mean:
    bit 0: Space after line
    bit 1: Not used
    bit 2: Split lines at :
    bit 3: Don't list line numbers
    bit 4: List tokens in lower case

    Examples:
    ========

    *BList Prog          Lists file 'Prog' in default LISTO option.

    *BList Prog 1000     Lists line 1000 of file 'Prog'

    *Blist Prog 5000,    Lists file 'Prog' starting at line 5000.
                         Note: There should be no space between the
                         number and the comma.

    *Blist Prog 10,1000  Lists lines 10 through 1000 of file 'Prog'.
                         Note: There should be no space between the
                         the two numbers and the comma.

    *Blist Prog ,1000    Lists file 'Prog' from start up to line 1000.

    *Blist Prog ,1000 8  Lists file 'Prog' from start up to line 1000
                         without line numbers.

    NOTE: To specify the LISTO option, the 2nd line number must also be
          given otherwise the LISTO number is interpreted as the 1st line
          number.


    Possible errors: 'Not a BASIC file'
    ===============  'Bad BASIC file'
                     'Bad parameters'

    Related commands: None.
    ================


    =======================================================================
 2: *Event [<event number> <ON|OFF>]
    =======================================================================

    Purpose: Allow control and display of events status.
    ========

    Parameters:
    ===========

    <event number>         Decimal number 0 to 17

    <ON|OFF>               Enable or disable.

    Examples:
    =========

    *Event                Lists all events numbers, names and
                          status.

    *event 0 ON           Enable the output buffer empty event.

    *event 0 OFF          Disable the output buffer empty event.


    Possible errors: Bad parameter
    ================ Number too big

    Related commands: None.
    =================

    Generating events all the time uses a lot of processor time. To
    avoid this, events are disabled by default.
    In RISC OS 3, event number 11 (A key has been pressed or released
    event) is normally enabled. This is enabled by the Screen blanker
    module.



    =======================================================================
 3: *Index
    =======================================================================

    Purpose: Show the speed index of the machine.
    =======

    This command measures the speed index of the machine relative
    to an Archimedes A310 computer fitted with ARM 2 processor and
    a normal MEMC chip (i.e. not MEMC1a) operating in screen mode 0.
    In other words; this index gives a relative measure of how fast
    your computer is compared to a very early module of the
    Archimedes (in fact the first produced type 1987).

    NOTE:  This test will be extended in the future to cover other
    =====  aspects of the machine.





    =======================================================================
 4: *Labels
    =======================================================================

    Purpose: List all defined labels in memory.
    ========

    This command will list all currently defined labels in memory.
    This command will not list any defined remarks.

    The list shows the label address and name.


    Possible errors: No defined labels
    ================

    Related commands: *SaveLabels, *LoadLabels
    =================

    =======================================================================
 5: *LoadLabels <filename>
    =======================================================================

    Purpose: Loads a previously saved Labels file.
    ========

    This command is a complement to the *SaveLabels command, and
    allows you load any saved labels into ARCTOOLS buffer.
    If the file is larger than the current size of the Labels
    buffer, ARCTOOLS will try to extend the buffer area by claiming
    the adjacent free slot in the RMA. If this fails the file will
    not be loaded and an error message will be generated.

    Warning: Loading a Labels file will delete any currently
             defined labels in memory.


    Possible errors: Not a labels' file
    ================ Unable to extend due no room in RMA

    Related commands: *SaveLabels, *Labels.
    =================


    =======================================================================
 6: *Mcommands [<relocatable module name>]
    =======================================================================

    Purpose: List a given module *Command entry addresses.
    ========

    This command is used to list all commands in a given module
    together with their entry addresses.
    If no module name is given then all commands in the machine
    are listed.


    Parameters:
    ===========

    [<relocatable module name>]      Optional module name.

    Examples:
    =========

    *Mcommands ARCTOOLS          Lists all entry addresses of ARCTOOLS
                                 commands.

    *Mcommands Utility.          Lists all entry addresses of the Utility
                                 Module commands.

    *Mcommands                   Lists all entry addresses of all commands
                                 in the machine.

    Possible errors: Module not found
    ================

    Related commands: None.
    =================


    =======================================================================
 7: *SaveArc <filename>
    =======================================================================

    Purpose: Save ARCTOOLS module together with current
    ======== configurations.

    This command is used to save ARCTOOLS module to disc together
    with any configurations that you have made. Once loaded, the
    new ARCTOOLS module will remember the last disc and memory editors,
    the last memory address, the last disc address, the last flags
    setup in any editor.
    This is the easiest way of configuring your ARCTOOLS to suit your
    requirement. No fiddling with *Configure commands.
    
    
    Possible errors: None.
    ================

    Related commands: None.
    =================

    =======================================================================
 8: *SaveLabels <filename>
    =======================================================================

    Purpose: Save all defined labels in memory as a Data file.
    ========

    Once you have defined any labels in the memory editors, you
    can save them to disc as a Data file so that you will not
    have to write them all over again.
    It is also advisable to save any defined labels you have
    created before issuing any of the destructive modules
    *commands such as *Tidy, *Rmkill or *Rmclear.

    The saved labels can be loaded into ARCTOOLS buffer using the
    *LoadLabels command.

    Note: This command will also save any defined line comments.


    Possible errors: No defined labels
    ================

    Related commands: *LoadLabels, *Labels.
    =================



    =======================================================================
 9: *Slow [<value>]
    =======================================================================

    Purpose: Slow down program execution speed.
    ========

    This command slows down the machine by a given delay. Although
    this might seem strange thing you want your computer to do,
    you may need this command when you want to see things that are
    too quick for the eye to catch. Examples are, slowing down games
    so that you can play them at your own pace, watching the desktop
    window drawing order, debugging a program which outputs to the
    screen.
    Routines or programs that disable interrupts will not be slowed
    down, for example, you will not be able to actually see in slowmotion
    how a character is drawn on the screen pixel-by-pixel.

    Parameters:
    ===========

    [<value>]          This is the only parameter, which gives the
                       delay value in decimal numbers.
                       Acceptable values are 0 to 5120.
                       A value of 0 restores the machine to its own
                       speed.
    Examples:
    =========

    *Slow 200          Slow down the machine by a value of 200.

    *Slow 3000         Slow down by 3000. Very sluggish.


    Possible errors:  'Bad number'
    ================  'Number too big'

    Related commands:  None.
    =================


    =======================================================================
10: *SwiC [<SWI chunck>]
    =======================================================================

    Purpose:  List all Software Interrupts in a given SWI Chunck
    ========  Identification number.

    The Operating System provides a total of 16 million different
    Software Interrupts or SWI. A SWI Chunck Identification
    number identifies a block of 64 consecutive SWIs. Acorn
    assigns a Chunck Identification number to each module or
    application on  request.
    The *SwiC command will list all SWIs in the given chunck
    identification number.
    If the number given is not a SWI chunck ID number it will be
    rounded to the related Chunck ID number.
    Because not every number in a SWI chunck is utilized, this
    command will only list used SWIs that have a SWI name.

    Examples:
    =========

    *SWIC 0            Lists all SWI numbers from 0 to 63

    *SWIC 40080        Lists all Font SWIs.

    *SWIC 43040        Lists all Territory SWIs.

    *SWIC 44B00        Lists all DOS filing system SWIs.

    Possible errors: Bad number
    ================

    Related commands: *SwiM, *SwiN, *SwiS
    =================

    =======================================================================
11: *SwiM <relocatable module name>
    =======================================================================

    Purpose: List all Software Interrupts in a given module.
    ========

    Parameters:
    ===========

    <relocatable module name>    The module name, abbreviated if
                                 required.

    Examples:
    =========

    *SwiM  ADFS           Lists all SWIs in the ADFS module.

    *SwiM  Hour.          Lists all SWIs in the Hourglass module.    

    *SwiM  Squash         Lists all SWIs in the Squash module.

    *SwiM  UtilityModule  Lists all the Operating System SWIs.

    If the module does not have any SWIs then the 'No SWIs in module'
    message will be shown.

    Although the UtilityModule does not have SWIs, this commands will
    show all the Operating System SWIs (i.e SWIs with bits 18 and 19
    clear).

    Possible errors: Module not found
    ================

    Related commands: *SwiC, *SwiN, *SwiS.
    =================


    =======================================================================
12: *SwiN <SWI name>
    =======================================================================

    Purpose: Convert a SWI name into a SWI number.
    ========

    Parameters:
    ===========

    <SWI name>         A valid SWI name.

    Examples:
    =========

    *SwiN   OS_Write0

    *SWIN   XOS_ReadC


    Note: The SWI name is case sensitive, and must be entered correctly.


    Possible errors: SWI name not known.
    ================

    Related commands: *SwiC, *SwiM, *SwiS
    =================

    =======================================================================
13: *SwiS <SWI number>
    =======================================================================

    Purpose: Convert a SWI number into a SWI name.
    ========
                
    Parameters:
    ===========

    <SWI number>         Hexadecimal SWI number.

    Examples: 
    =========

    *SWIS  0

    *SWIS  40

    *SWIS  80682


    Possible errors: Bad number
    ================

    Related commands: *SwiC, *SwiM, *SwiN
    =================


    =======================================================================
14: *System
    =======================================================================

    Purpose: Display information on the current system and
    ======== program environment.

    The command displays information on the current system and the current
    environment, such as the processor type, memory used, memory limits, and
    all environment handlers codes addresses and buffers.
    The command also displays the application start time and the
    keyboard handler address. If an ARM3 or higher is fitted, then the
    current content of the cache control registers is shown.
    the *System command provides information on the following:

    - Processor type
    - Cache state (ON or OFF)
    - Cache ID register content
    - Cache Control register content
    - Cache Cacheable register content
    - Cache Updateable register content
    - Cache Disruptive register content
    - Memory limit address        
    - Undefined instructions handler address
    - Prefetch abort handler address
    - Data abort handler address
    - Address exception handler address
    - Error handler address
    - Error buffer address
    - CallBack handler address
    - CallBack register save area address
    - BreakPoint handler address
    - BreakPoint register save area address
    - Escape handler address
    - Event handler address
    - Exit handler address
    - Unused SWI handler address
    - Exception registers buffer address
    - Application space
    - Currently active object address
    - UpCall handler address
    - Current MEMC state
    - *Command string address
    - Keyboard handler address
    - Application start time

    =======================================================================
15: *Tools [G|D|M]
    =======================================================================

    Purpose: Display a summary of all ARCTOOLS *Commands names
    ======== and their correct syntax.

    Examples:
    =========

    *Tools        Lists all ARCTOOLS commands.

    *Tools D      Lists all ARCTOOLS disc and file commands.

    *Tools G      Lists all ARCTOOLS general commands.

    *Tools M      Lists all ARCTOOLS memory commands.

    Possible errors: None
    ===============

    Related commands: None
    ================


    =======================================================================
16: *Vector [<vector number>]
    =======================================================================

    Purpose: Display information on the routines claiming the Software
    ======== Vectors.

    The information displayed are address of the routines, routine
    workspace start address (R12) and where the routine is located
    i.e. OS kernel, ADFS, etc. The display also gives the vector name.

    The allowed vectors numbers are 0 to 47.

    The Operating System keeps track of the vector chains in its workspace
    (the first 32 Kbytes of memory). The chain structure contains pointers
    to the vector claimants code and workspace.

    *Vector with no parameter will list all the vectors available.

    Examples:
    =========

    *Vector 1                 gives information on the errorV

    *Vector                   gives information on all vectors



    Possible errors: 'Number too big'
    ===============

    Related Commands: None
    ================





                      ===========================
                           The Memory Editors
                      ===========================

 A total of 7 different memory editors are provided in ARCTOOLS allowing
 limitless possibilities or editing different memory areas. The most power-
 ful of these is the Mnemonics editor or dis-assembler, see the sections
 on the assembler and disassembler for more details.

  There are two methods to enter the memory editors:

  1. from the line command using the *Medit command.
  2. from the disc editors using the CTRL-E key combination.

 The cursor keys are used for navigate around memory. Facilities are provided
 to navigate really quickly using the 'Memory Area' jump. 'Memory Area' jumps
 can be achieved using the Up and Down cursor keys while holding the CTRL
 and SHIFT keys.

 The information bar (the top line of the screen) provides information on
 the current area and the current system as well as the current editor.
 The different information provided by the information bar can be viewed
 using the CTRL-Copy keys.

 Data can be entered in different formats depending on the editor type.
 The 'Text Editor' allows any character to be entered. In the 'Numbers'
 editor, only numbers are allowed. In the 'Hex', 'Bytes', 'Binary' and
 'Words' editors, you have the option of entering data using Hex, Binary,
 Decimal or Text formats, the different formats are selectable using the
 CTRL-Insert key.

 Two memory areas can not be edited; the ROM and the IO space. Other areas
 including the physical ram area can be edited.




 


                      ===========================
                            The DISC Editors
                      ===========================

  ARCTOOLS provides a number of powerful tools to manipulate data stored
  on discs directly. The *Dget and *Dput commands are one example of
  an improved method of moving data between disc and memory which removes
  the Operating System limitations of having to work with sector aligned
  start addresses and sizes. The most powerful tool provided by ARCTOOLS
  is the disc editor. The disc editor manipulates data stored on discs
  directly using disc addresses rather than sector and track numbers.
  Seven different display formats are provided, similar to those in the
  memory editors, this gives a total of seven disc editors. The disc editors
  provide additional information on the currently editted disc which is
  displayed at the top line of the screen using the CTRL-Copy key
  combination.
  
  There are two methods to enter the disc editors:

  1. from the line command using the *Dedit command.
  2. from the memory editor using the CTRL-E key combination.

  The disc editors work with any disc format known to the Operating System.
  Under RISC OS this includes:
  - ADFS disc formats L, D, E and F.
  - DOS 1.44M, 720M, 1.2M and 360K discs.
  - Atari 720K and 360K discs.
  - RAM discs.
  - IDE hard discs.
  - ST506 hard discs.
  - SCSI hard discs.

  The disc editors will automatically support any new filing systems added
  to the FileCore modules.

  WARNING:     Extreme care must be observed when using the disc editors.
  ========     The entire disc can be accessed and any data can be changed
               without restriction. Changing data on the disc particularly
               directory or map data can render large number of files and
               or the entire disc inaccessible.


  Using the Disc Editors with non-standard discs:
  ===============================================

  The disc editors also support non-standard or protected format discs. The
  format of these discs must be described to ARCTOOLS disc editors. To
  achieve this a simple method is used.

  When any of the disc editors is entered, ARCTOOLS asks the Operating
  System to identify the disc format. If the Operating System or its
  extension modules fail to identify the disc and error message will be
  produced which prevents you from using the disc editors.
  To allow non-standard discs to be edited, ARCTOOLS must first be told
  that the format is non-standard. Do this proceed as follows:

  1. Insert a known format disc in the required drive.
  2. Enter the disc editor.
  3. Remove the known format disc and insert the non-standard disc.
     At this time the sector content shown on the screen is still
     that of the previous known format disc.
  4. Press CTRL-SHIFT-I (Hold down CTRL and SHIFT keys and press I).
     A simple menu on the bottom of the screen is shown. This menu
     shows the previous disc format total tracks, sectors per track,
     sector size, total heads and disc density.
     Use the right and left cursor keys to move through the different
     parameters, and the Up and down keys to modify these parameters.
  5. Once you have setup the new format press the RETURN key. The disc
     will now be accessed using the format that you have just setup.


  Recovering deleted files using the Disc Editors:
  ================================================

  Unlike other filing system, the ADFS is one of the most difficult when
  it comes to recovering deleted files. Accidently deleting files is
  a common mistake many users do. On some filing system, for example,
  the DOS filing system it is much much easier to recover these files.
  The reason behind this is in the way the ADFS deletes the files.
  When you request a file to be deleted using the *Delete or *Wipe command,
  the ADFS removes the file name and its information from the directory
  space on the disc, then it returns the space allocated to it to the
  disc free space map so that this free space can be used for storing
  other files. The data in the free space is not destroyed as long as
  it is not overwritten by another file. What makes recovering deleted
  files difficult on the ADFS is that the file name and its information
  are wiped out. The DOS filing system, for example, does not wipe out
  the filename or its information data. It simply replaces the first
  character of the filename with a control code &E5.
  Given the above information it is impossible to write programms that
  provide facilites such as the 'UnErase' Norton Utility on DOS systems.

  Recovering deleted files on the ADFS is unfortunately a manual method.
  Geared with information on the lost file, the user has to search the
  disc to locate the start and end addresses of the file. On a disc with
  an E or F format, the file could be fragmented and its content is
  scattered all over the disc surface.

  ARCTOOLS provides the following manual methods:

  - You can search for a given string in the lost file. This speeds up the
    search process.
  - You can use the 'Nex Free Map' option. Using the CTRL-SHIFT-UP cursor
    or Down cursor, you can search for the deleted file in the free sectors.
    This is the place where your deleted file resides.
  - Once identified you can use the disc marks to mark the start and end
    addresses of the file, then copy this data to memory using the
    'Command menu'.
  - Once in memory the data can be saved to file using the 'Commands Menu'.

  With fragmented files, each fragment has to be saved seperately and then
  using the *Fjoin command the files can joined together (in the correct
  order).


  Writing back edited data:
  =========================

  When editing sector data, the data is written into a copy of the sector
  in memory and not immediately stored on disc. After a sector's data has
  been changed, moving onto another sector or track or exiting the editor
  will cause the message 'Save Sector [Y/N] ?' to appear. Pressing the
  'Y' key will cause the sector data to be written back to disc. Any other
  key will skip the sector saving routine.

  Errors when reading a disc:
  ===========================

  If errors are encountered when ARCTOOLS is reading data from a disc,
  an error message will be generated. The sector content displayed on the
  screen will be shown as a text message 'Bad'.
  


                     ============================     
                          The commands Menu
                     ============================

The commands menu is built into all memory and disc editors. The menu
can be called by pressing the key combination CTRL+C providing both
memory marks (in the memory editors) or disc marks (in the disc editors)
have been set.
The commands menu shows a list of itmes which can be selected using the
UP and Down cursor keys.
The two memory marks are used for various operations. Some operations
require a third address, for example, the MOVE MEMORY command. The 3rd
address will be the current memory address before the commands menu
is entered. The 3rd address can be changed.
Some commands will execute when you simply hit the return key, for example,
the 'Wipe memory' option. Other options require a string or numbers to
be entered. In this case you should enter the required parameter and hit
return.
At any time while entering a value, you can use the UP and DOWN cursors
to ignore the current command and go to the next command or option.
The commands menu will be exited if you hit the Escape key, or after a
command is executed.

Commands menu options:
======================

 1. Move Memory:  Move address1 address2 to [address3]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    address3 is the current memory address. This can be changed.
    This will move the marked area to the address given in address3.
    
 2. Swap Memory:  Swap address1 address2 with [address3]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    address3 is the current memory address. This can be changed.
    This will swap the marked area with the area starting at address3.


 3. Wipe      : Wipe address1 address2 ? <Return to execute>
                Wipe current sector? <Return to execute>

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    Hitting the Return key will cause the area to be wiped clean.
    In the disc editors this menu option will wipe the current sector.

 4. Memory ---> File : Save address1 address2 filename: [_              ]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    Enter the filename to save under, then press Return. This will save
    the content of the memory area as a 'Data' file.


 5. File ---> Memory : Load to address1 address2 filename: [_           ]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    This command will load a file into the given memory area. If the file
    size is larger then the size of the memory area, then the following
    message will be shown:
    File too large by xxxx bytes. <Load/Insert> (L/I)?
    You are offered the option whether to Insert the file or to Load the
    complete file. Inserting the file into the given memory area will
    load only the part which will fit into the given area.



 6. Fill Bytes : Fill address1 address2 with bytes [_                   ]
                 Fill current sector with bytes [_                    ]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    This command is similar to the *FillH command. You can enter the
    sequence of bytes (hex) to fill memory with.
    In the disc editors, this option will fill the current sector with
    a sequence of bytes.


 7. Fill Words : Fill address1 address2 with words [_                   ]
                 Fill current sector with words [_                    ]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    This command is similar to the *FillW command. You can enter the
    sequence of words to fill memory with.
    In the disc editors, this option will fill the current sector with
    a sequence of words.

 8. Fill String : Fill address1 address2 with string [_                 ]
                  Fill current sector with string [_                   ]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    This command is similar to the *FillT command. You can enter the
    string to fill memory with.
    In the disc editors, this option will fill the current sector with
    the given string.

 9. Fill Mnemonic: Fill address1 address2 with mnem. [_                  ]
                   Fill current sector with mnem. [_                    ]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    This command will fill the given memory with the entered Mnemonic
    string.
    In the disc editors, this option will fill the current sector with
    the given mnemonic string.

10. Disc ---> Memory: Get disc address1 address2 to memory [address3]

    address1 and address2 are the start and end addresses of the Disc
    area set using mark1 and mark2 when in the disc editors.
    If the commands menu was called from a disc editor then address3
    will be the start of the memory area. If it was called from within
    the memory editors, then address3 will be the current memory address.
    This command will copy the disc area marked by address1 and address2
    to the memory area starting at address3.

11. Memory ---> Disc: Put memory address1 address2 to disc [address3]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    If the commands menu was called from a disc editor then address3
    will be the current disc address. If it was called from within the
    memory editors, then address3 will be the start of the disc area.
    This command will copy the memory area marked by address1 and address2
    to the disc area starting at address3.


12. Invert Memory: Invert address1 address2 ? <Return to execute>

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.    
    This command will reverse the memory area when Return key is pressed.
    It is similar to the *Reverse command.

13. Label Area: Label area address1 address2 with [Label            ]

    address1 and address2 are the start and end addresses of the memory
    area set using mark1 and mark2.
    This command will auto label the area given in address1 and address2.
    Label names will start with the string 'Label', however this can
    be changed to any string. All labels will be counted from 0 and
    attached to label names. For example, Lable_0, Label_1, Label_2...
    If ARCTOOLS can not find any labels in the given area, the message:
    'No labels in this area' will be generated.


                         ====================
                         Keys used in Editors
                         ====================

ARCTOOLS EDITOR KEYS Summarys:
==============================

Escape                :Abandon current operation, return to last activity.
CTRL+Escape           :Exit the editor, dumping the current line to screen.
CTRL+B                :Enter BINARY editor
CTRL+H                :Enter HEX editor
CTRL+W                :Enter WORDS editor
CTRL+N                :Enter NUMBERS editor
CTRL+M                :Enter MNEMONIC editor
CTRL+T                :Enter TEXT editor
CTRL+Y                :Enter BYTEs editor

CTRL+J                :JUMP to branch-to address (MNEMONIC editor only)
CTRL+SHIFT+J          :JUMP to address in current memory address
                       or to address in current memory address plus offset
                       in Mark1 if Mark1 is set
CTRL+R                :Return to previous address
CTRL+G                :Goto address

CTRL+F                :Find data. Search for data in memory.
CTRL+Back space       :Continue search from current address
CTRL+SHIFT+Back space :Continue search from last found address
CTRL+TAB              :Toggle text search case sensitivity

CTRL+L                :Label the current memory address
CTRL+SHIFT+L          :Comment on the current memory address


CTRL+X                :Toggle top bit of ASCII codes
CTRL+P                :Dump screen to PRINTER
CTRL+D                :Toggle between Active and Passive screen DISPLAY

CTRL+S                :In BINARY editor: Toggle between 8 or 32 bit
                                         position count
                      :In NUMBERS editor:Change SIGN of number
CTRL+COPY             :Change Screen Information Bar.
CTRL+INSERT           :Change Data entry format
                      :In NUMBERS editor:Change number padding ASCII code

CTRL+keypad 1         :Set Mark No.1
CTRL+keypad 2         :Set Mark No.2
CTRL+HOME             :Goto Mark
CTRL+Delete           :Delete all marks

CTRL+C                :Enter Commands menu
CTRL+E                :Toggle between Memory and Disc EDITORS
CTRL+I                :Install new disc (DISC editors only)
CTRL+SHIFT+I          :Install user defined disc
CTRL+keypad *         :Enter *Command line

Right Cursor          :Move cursor one place right
Left Cursor           :Move cursor one place left
Up Cursor             :Move cursor up one line
Down Cursor           :Move cursor down one line

SHIFT+Right Cursor    :Move cursor to rightmost position.
SHIFT+Left Cursor     :Move cursor to leftmost position.
SHIFT+Up Cursor       :Move cursor Up 29 lines (one full screen).
SHIFT+DOWN Cursor     :Move cursor DOWN 29 lines (one full screen).

CTRL+Right Cursor     :In Memory Editors: Move cursor to rightmost position.
                       In Disc Editors  : Increment address by One SECTOR.
CTRL+Left Cursor      :In Memory Editors: Move cursor to leftmost position.
                       In DISC Editors  : Decrement address by One SECTOR.
CTRL+Up Cursor        :In Memory Editors: Go to start of previous memory
                                          page.
                       In Disc Editors  : Decrement address by One TRACK.
CTRL+DOWN Cursor      :In Memory Editors: Go to start of next memory page.
                       In Disc Editors  : Increment address by One TRACK.

CTRL+SHIFT+Up Cursor  :In Memory Editors:Go to start of previous memory area.
                       In Disc Editors  :Go to start of previous free disc
                                         space map area.

CTRL+SHIFT+DOWN Cursor:In Memory Editors:Go to start of next memory area.
                       In Disc Editors  :Go to start of next free disc space
                                         map area.


                   ARCTOOLS EDITORS KEYS description:
                   ==================================

Escape key:
-----------
The Escape key is used to abandon the current operation and return to the
last operation. Use Escape to:
 - exit the memory or disc editors, or
 - exit the commands menu, or
 - abandom any current operation.


CTRL+Escape (Exit the editor showing current address data on screen)
--------------------------------------------------------------------
Somtimes you may want to exit the editor after you have searched for
certain data. May be, you wanted to use this data in your BASIC program,
to do so, press CTRL+Escape keys, this will exit the current editor but
your data will be on the screen. Now you can copy it into a BASIC program
line or do some mathematical calculations on it using the BASIC
keywords.


CTRL+J  (Jump to address)
-------------------------
In the mnemonics editor, this key combination allows the user to perform
a "jump to address" which can be used to follow the structure of a
program. The address that the editor jumps to is the one at the current
cursor position and only when one of the following instructions is being
highlighted:

 B     {Address/Label}
 BL    {Address/Label}
 ADR   Rx,{Address/Label}
 ADRL  Rx,{Address/Label}
 STR   Rx,{Address/Label}
 LDR   Rx,{Address/Label}
 STF   Fx,{Address/Label}
 LDF   Fx,{Address/Label}
 STC   Cp#x,Cx,{Address/Label}
 LDC   Cp#x,Cx,{Address/Label} 

Example of CTRL+J use:
----------------------
The following example allows you to examine the Operating System
Software Interrupt routine.

1. Enter the mnemonic editor at location &00000008 which is the SWI
   hardware vector by typing: *MEDIT 8 M
2. The instruction at memory location &8 is a branch instruction to
   the SWI decode routine. Press CTRL+J to go to the start of that
   routine.

Pressing CTRL+R will return you to the previous memory location where the
jump was made from. Jumps to addresses can be nested up to 255 jumps.
CTRL+J is only valid in the mnemonic editor. If you try to use it in any
other editor it will be ignored.

CTRL+R    (Return to last jumped from address)
----------------------------------------------
This key combination allows you to return to the last jumped from address.
A beep is emitted if their are no more return addresses.


CTRL+SHIFT+J  (Jump to word address)
------------------------------------
This key combination is only valid in the mnemonic editor.
This key combination allows the user to jump to a memory location which
is stored in the current highlighted memory location.
example: if the cursor is at the following location,

 01F033FC  .1..  03803104  ORREQ    R3,R0,#1

then pressing CTRL+SHIFT+J will cause the editor to jump to the memory
address at location store at &01F033FC which is in this case &03803104.

Another example:
The following example allows you to examine the Operating System SWIs
routines.
1. Enter the mnemonic editor at location &00000008 which is the SWI
   hardware vector by typing: *MEDIT 8 M
2. The instruction at memory location &8 is a branch instruction to
   the SWI decode routine. Press CTRL+J to go to the start of that
   routine.
3. Move the cursor down 15 lines to move to the start of the Operating
   System Software Instructions Jump Table.
   The table contains jump addresses for all SWI routines used by the
   OS Kernel, i.e. SWI 0 through &1FF
   Memory address &1F033FC contains the value &3803104 which is the
   address for the "OS_WriteC".
4. To jump to the "OS_WriteC" code which starts at &3803104, position
   the cursor to address &1F033FC, then ensure that Mark 1 is clear by
   pressing CTRL+Delete (See Offset Jumps). Once Mark 1 is cleared, press
   CTRL+SHIFT+J to jump to address &3803104. This is the 'OS_WriteC'
   Code.

Offset Jumps:
-------------
An additional feature of CTRL+SHIFT+J key combination is OFFSET jump.
The offset jump is automatically selected if MARK 1 is set. In this case,
before jumping to the address at current memory location, the editor will
add the address of MARK 1 to it.
This offset jump can be very helpful when examining module tables.
Example of offset jump:
The following example will take you the SWI handler code used in the
'PDriver' module.

type the following:

*medit 391773C M
This will enter Mnemonic Editor at start of 'PDriver' module.

Note: The 'PDriver' module start address can be obtained by using the
      OS command '*Modules'

Press CTRL+ Keypad 1  to set mark no. 1. Mark 1 would be set to 391773C.
Move the cursor down until address 391775C is reached. This address
contains the value &1B0 which is the offset from the start of the module
to the module SWI handler code.
To jump to the SWI handler code simply press CTRL+SHIFT+J. The editor
will add the offset value (&1B0) contained at current memory location to
the address value stored in Mark 1 and jump to the result address.


NOTE: The above example of CTRL+J and CTRL+SHIFT+J assume a RISC OS 3
      operating system is fitted on an A5000.


CTRL+G    (Go to address or label)
----------------------------------
This key combination allows you to move to another memory area very
quickly by giving the address or the label name. The given address
is assumed to be a hexadecimal number, any number base can be given.
ARCTOOLS remembers the memory address you have left, so to return to the
previous address after this command, press CTRL+R.


CTRL+F  (Find or Data Search)
-----------------------------
This key combination is used to locate data in memory or on disc.
The data type depends on the type of editor in use.
1. In the TEXT editor:
   Searches for a string. single wildcards are allowed
2. In the Binary editor:
   Searches for a binary number. single wildcards are allowed
3. In the Hex editor:
   Searches for hex numbers. single wildcards are allowed
4. In the Word editor:
   Searches for a word. single wildcards are allowed
5. In the Numbers editor:
   Searches for a decimal number. No wildcards allowed
6. In the Mnemonic editor:
   Searches for an ARM, FPU or CO-PRO instruction. No wildcards allowed

The search starts at the current memory address. Once data is found,
use CTRL+Back Space for the next match.
You can switch to a different editor and continue the search.


CTRL+Back Space (Continue search from current address)
------------------------------------------------------
Continues the search for the data from the current memory address.
The 'Back Space' key is located to the right of the Pound sign key.


CTRL+SHIFT+Back Space (Continue search from last found address)
---------------------------------------------------------------
Continues the search for the data from the last found address.


CTRL+TAB  (Toggle string search CASE)
-------------------------------------
Toggle between Case sensitive and case insensitive string search.
The CASE status can be viewed using the information title at the top
display screen using CTRL+Copy.
CASE: OFF  means case insensitive
CASE: ON  means case sensitive


CTRL+L (Label address)
----------------------
This function is only available in the Mnemonic memory editor.
Used to label an address of memory. The current memory address is labelled.
If the current address already has a defined label, then, when this function
is entered, the label name will be displayed at the cursor position so
that this can be changed or deleted.
Maximum label string length is 23 characters.

To delete a previously defined label you should press CTRL+L at the
current label address, then use CTRL+U or the delete key to remove the
label name, then press enter. 

NOTE: Ensure that the assembler 'labels and remarks' flag is ON, so
      that the assembler can display any defined labels or remarks.

NOTE: If your enter a label name which is already defined, then that
      label name is removed and the current address is assigned to it.

NOTE: See the section on the Line Editor.


CTRL+SHIFT+L (Place a remark at an address)
-------------------------------------------
This function is only available in the Mnemonic memory editor.
The message 'Enter comment' will be shown at the current memory address.
Enter the remark or comment and press return.
A remark can be deleted by using CTRL+SHIFT+L on the remark address,
deleting the whole line, then pressing enter.


NOTE: See the section on the Line Editor.


CTRL+X    (Toggle ASCII top-bit)
--------------------------------
This key combinations is used to toggle the top-bit of ASCII characters
displayed on screen. With top bit clear, text strings are easy to read.


CTRL+P    (Print screen)
------------------------
Sends the contents of the screen to printer. All Ascii characters are
sent to the printer with their top-bit clear.
You should have your printer on-line before pressing CTRL+P.

NOTE: ARCTOOLS (current version) does not check to see if your printer
      is on-line. The program will hang if your printer is not on line.
      This is to be corrected in the next version.


CTRL+D    (Toggle Display type)
-------------------------------
Toggles between active and passive display. When the display status is
ON, the locations of memory are constantly read and updated on the screen.
This type of active display allows the user to examine memory locations
which are constantly changing.
The status of display is displayed at the top of the screen using CTRL+Copy.
For example, try to examine memory area starting at &9A8 with active
display switched ON.


CTRL+S
------
This key combination is only used in the Binary and the Numbers Editors.
In the Numbers editor: It is used to modify the memory content from a
                       a signed into unsigned number.
In the Binary editor : This is used to toggle between 32-bit or 8-bit
                       position count. The bit position count is
                       shown on the top right corner of the screen, so
                       that you can move the cursor to the required bit
                       position without having to count using your fingure!
                       This is normally 32-bit count (from 0 to 31), but
                       can be 8-bit count considering the 32-bit number
                       is split into four 8-bit bytes.


CTRL+Copy  (Information Bar display)
------------------------
Cycles through the information bar which is shown at the top of the screen.

In the memory editors the following information is provided:

1. ARCTOOLS Version number and author name
2. Current memory area name and its size
3. Current memory page information
4. Machine total RAM size, total pages and page size
5. Memory and Disc marks
6. Display status, case status, Top bit status and current editor type

In the disc editors the following information is provided:

1. ARCTOOLS Version number and author name
2. Drive information:
   -Current drive number and type (Floppy or Hard),
   -Current head number,
   -Current sector number,
   -Current track number,
3. Sectors information:
   -Total sectors per track,
   -Current sector number,
   -Sector size,
   -Sector start address
4. Tracks information:
   -Total tracks per head,
   -Current track number,
   -Track size,
   -Track start address
5. Drive information:
   -Total heads,
   -Total sectors per track,
   -Total tracks per head,
   -Density,
   -Root directory address
6. Drive information:
   -Disc name,
   -Disc ID,
   -Disc size
7. Memory and disc marks
8. Display status, case status, Top bit status and current editor type.


The Memory and Disc marks are automatically displayed if any marks is
set or the Commands menu is entered.


CTRL+Insert  (Data Input)
-------------------------
Selects the type of data input format used when editing memory or disc.
The Data Input depends on the editor type as follows:

Binary Editor  : Binary, Hex, Decimal, Text.        Default: Binary
Hex Editor     : Binary, Hex, Decimal, Text.        Default: Hex
Text Editor    : Text only
Words Editor   : Binary, Hex, Decimal, Text.        Default: Hex   
Mnemonic Editor: Set or unset the current shown display format flag.
Numbers Editor : Numbers only
Byte Editor    : Binary, Hex, Decimal, Text.        Default: Decimal

In the Numbers editor CTRL+Insert is used to change the leading padding
character from zeros to spaces.


CTRL+Keypad 1 (Set Mark 1)
--------------------------
Sets Mark no.1 to the current memory address if in memory editors or
to to current disc address if in disc editors.
Mark 1 address is displayed on the top of the screen as "Memory: {address}"
or "Disc: {address}"

CTRL+Keypad 2 (Set Mark 2)
--------------------------
Sets Mark no.2 to the current memory address if in memory editors or
to to current disc address if in disc editors.
Mark 2 address is displayed on the top of the screen as "To: {address}"
or "To: {address}"


CTRL+Home (Go to set mark)
--------------------------
Pressing CTRL+Home keys will allow you to go to the address in the
set marks. First press takes you to mark1 address, the second press,
to mark2 address.


CTRL+Delete
-----------
Removes memory Mark1 and Mark2 if in memory editors.
Removes discs Mark1 and Mark2 if in disc editors.


CTRL+C   (Commands menu)
------------------------
Enters the commands menu.
The commands menu can be entered from any memory or disc editor providing
both memory marks are set. See the Section on the Commands Menu for more
details.


CTRL+E   (Toggle between Memory and Disc editors)
-------------------------------------------------
This key combination is used to toggle between memory and disc editors.
In any memory editor, pressing CTRL+E will enter the Disc editor on
the last disc address viewed. Pressing CTRL+E in any disc editor will
take you back to the last visited memory address. This provides a quick
method of switching between the different editors without having to
revert to the *Medit and *Dedit commands.


CTRL+I (Install disc)
---------------------
This key combination is only available in the disc editors.
This causes a new disc to be read by the editor. This allows the user
to examine a new disc without leaving the disc editor.
The editor will read information from the currently selected drive.


CTRL+SHIFT+I (Install user defined disc)
----------------------------------------
This key combination is only available in the disc editors. This allows
the user to install a disc with a format that he only knows. When
the key combination is used, the format menu is entered which contains
information on the previous disc format. The user can change this data
using the cursor keys. Pressing return will install the new disc using
the new defined format.


CTRL+Keypad * (Line command)
----------------------------
Enters the supervisor mode, so that you can issue *Commands.
Press Escape to return to the editor.
NOTE: You should not issue *Commands such as *Dedit or *Medit that cause
      the editors to entred. This re-entry will cause ARCTOOLS to
      loose track of data.


Right Cursor:
-------------
In the BINARY editor  : Move cursor right by one bit position.
In the HEX editor     : Move cursor right by one byte position.
In the WORD editor    : Move cursor right by one word (4 bytes).
In the NUMBER editor  : Inactive.
In the MNEMONIC editor: Show next display format flag status.
In the TEXT editor    : Move cursor right by one byte position.
In the BYTES editor   : Move cursor right by one byte position.


Left Cursor:
------------
In the BINARY editor  : Move cursor left by one bit position.
In the HEX editor     : Move cursor left by one byte position.
In the WORD editor    : Move cursor left by one word (4 bytes).
In the NUMBER editor  : Inactive.
In the MNEMONIC editor: Show previous display format flag status.
In the TEXT editor    : Move cursor left by one byte position.
In the BYTES editor   : Move cursor left by one byte position.


Up Cursor:
----------
This key is used to scroll the screen down. This decrements the current
highlighted address by:

In the BINARY editor  : 4 bytes.
In the HEX editor     : 16 bytes.
In the WORD editor    : 16 bytes.
In the NUMBER editor  : 4 bytes.
In the MNEMONIC editor: 4 bytes.
In the TEXT editor    : 64 bytes.
In the BYTES editor   : 8 bytes.


Down Cursor:
------------
This key is used to scroll the screen up. This increments the current
highlighted address by:

In the BINARY editor  : 4 bytes.
In the HEX editor     : 16 bytes.
In the WORD editor    : 16 bytes.
In the NUMBER editor  : 4 bytes.
In the MNEMONIC editor: 4 bytes.
In the TEXT editor    : 64 bytes.
In the BYTES editor   : 8 bytes.


SHIFT+<Right Cursor> (Move cursor to rightmost position)
--------------------------------------------------------
This key commbination is used to move the cursor to the right most position
on the screen. However, in the Binary editor its used to move the cursor
to the right by one byte (8 bits).


SHIFT+<Left Cursor> (Move cursor to leftmost position)
------------------------------------------------------
Move the cursor to the left most position on the screen. In the Binary
editor, this key combination is used to move the cursor to the left by
one byte (8 bits).


SHIFT+<Up Cursor> (Scroll down to previous screen)
--------------------------------------------------
This key combination is used to decrement the currently highlight address
by a value which depends on the type of editor;

In the BINARY editor  : 116 bytes.
In the HEX editor     : 464 bytes.
In the WORD editor    : 464 bytes.
In the NUMBER editor  : 116 bytes.
In the MNEMONIC editor: 116 bytes.
In the TEXT editor    : 1856 bytes.
In the BYTES editor   : 232 bytes.


SHIFT+<Down Cursor> (Scroll up to next screen)
----------------------------------------------
This key combination is used to increment the currently highlight address
by a value which depends on the type of editor;

In the BINARY editor  : 116 bytes.
In the HEX editor     : 464 bytes.
In the WORD editor    : 464 bytes.
In the NUMBER editor  : 116 bytes.
In the MNEMONIC editor: 116 bytes.
In the TEXT editor    : 1856 bytes.
In the BYTES editor   : 232 bytes.

This key combination together with CTRL+<Up Cursor> provide a quick way of
scrolling through memory.


CTRL+<Right Cursor>
-------------------
In the Memory Editors: (Advance cursor to most right position)

This provides similar results to the SHIFT+<Right Cursor), except that in
the BINARY Editor, it advances the cursor to the most right position on the
screen.

In the Disc Editors: (Next sector)

Provide sector increment facility. If the sector has been modified, you
are offered to save the sector back to disc before you go to the next
sector.

CTRL+<Left Cursor>
------------------
In the Memory Editors: (Advance cursor to most left position)

This provides similar results to the SHIFT+<Left Cursor), except that in
the BINARY Editor, it advances the cursor to the most left position on the
screen.

In the Disc Editors: (Previous sector)

Provide sector decrement facility. If the sector has been modified, you
are offered to save the sector back to disc before you go to the previous
sector.


CTRL+<Up Cursor>
----------------
In the Memory Editors: (Go to memory page start address)

This provides a jump to the current memory page start address. If you are
already at the memory page start address, then the previous memory start
address is jumped to. The page size depends on the total ram in the
machine. In a 1 Mbytes machine, this is 8 Kbytes. In a 4 Mbytes machine
or higher, this is 32 Kbytes.

In the Disc Editor: (Go to previous disc track)

This provides a track decrement facility.


CTRL+<Down Cursor>
------------------
In the Memory Editors: (Go to next memory page start address)

This provides a jump to the next memory page start address.
The page size depends on the total ram in the machine.

In the Disc Editor: (Go to next disc track)

This provides a track increment facility.


CTRL+SHIFT+<Up Cursor>
----------------------
In the Memory Editors: (Go to current memory area start address)

This key combination provides a quick and easy method of moving from one
memory area to another. In addition if you are in the Relocatable Module
Area (RMA) or in the ROM area, then this key allows you to move to the
start of the module code. If you are already at the start of a memory area
or the start of a module code, this key will take you to the start address
of the previous memory area or module code.

In The Disc Editor: (Go to start of previous free disc map area)

Provide a facility to quickly identify non used area of the disc. This
where deleted files can be found!


CTRL+SHIFT+<Down Cursor>
------------------------
In the Memory Editors: (Go to next memory area start address)

This key combination will take you to the start of the next memory area.
If the area contains modules, then it will take you to the start of the
next module. Using this key combination you can quickly browse through
all module without having to remember their start addresses.

In The Disc Editor: (Go to start of nex free disc map area)

Provide a facility to quickly identify non used area of the disc. This
where deleted files can be found!


                The dis-assembler (Mnemonics Editor)
                ====================================

This is the most powerfull memory editor provided by ARCTOOLS. It is an
essential tool when writing assembly code. The dis-assembler allows ARM,
FPU and co-processor instructions held in memory to be converted back into
the mnemonic form used by common ARM assemblers. The dis-assembler tends
to closely follow the BASIC assembler conventions.
ARCTOOLS does not use the built-in debugger dis-assembler SWI instruction
provided by RISC OS as this SWI has many limitations. ARCTOOLS provides
its own routines to disassemble ARM code.


The disassembler can be entered by typing:

*Medit <address> M     Enter the disassembler at <address>
*Medit <Label> M       Enter the disassembler at <Label>
*Medit M               Enter the disassembler at last visited address
*Medit                 Enter the disassembler at last visited address
                       if the disassembler was the last visited editor

or if already in any other editor pressing CTRL+M

Once entered, the disassembler screen contains one line per disassembled
instruction. Each display line contains five fields. The first field is
the memory address where the instruction is stored. This memory address
is always word aligned. The second field is the content of the memory
address in ASCII format. This is very useful, since some codes contain
text embedded between ARM instructions, an example is the OS SWI instruction
"OS_WriteS" which is always followed by a zero terminated, word aligned
text string. The third field is the memory word content displayed in
hexadecimal numbers. Not all assembly code is ARM or FPU instructions,
certain areas of memory contain data used as constants, data tables of
colour definitions, jump addresses as so on. In this case the third field
is the one of interest. The fourth and fifth fields are the data
interpreted as an ARM, FPU or co-processor instruction.
An instruction consists of two parts an OPCODE and an OPERAND. These
are fields four and five respectively.


The dis-assembler provides a large number of display formats which are
controlled by the user. The display formats are instant in effect.

How to change the dis-assembler display format?
===============================================

When in the dis-assembler, the display format flags are shown at the
bottom of the screen, only one flag will be shown at any time, to
display the rest of the options flags, use the right and left cursor
keys. This will cycle through the whole set of flags, showing the
option number, its purpose and its status, for example:

 0:[SWI numbers              ]:[OFF]

This shows flag no. zero, which is the SWI numbers flag. The [OFF]
indicates that its currently OFF. To switch to ON, press CTRL + Insert
key combinations. This will cause the 'SWI numbers' flag to become
active causing all SWI instruction names to be replaced by numbers.
The effect is instant re-disassembly of all the code on the screen to
reflect the new flags status.

There are currently a total of 18 flags (0-17), these are as follows:

 0: SWI numbers.
    ON : All SWI instructions are shown as SWI numbers.
    OFF: All SWI instructions are shown as SWI names. [Default]

 1: Shifted immediate numbers.
    ON : Immediate numbers are shown as number<<shift. [Default]
    OFF: Immediate numbers shown the normal way.

    This flag allows easy interpretation of instructions that try to
    set or clear certain bits in a number, for example, it is much
    easier when you see the difference between these two instructions:

    BICNE   R0,R0,#&8000000

    BICNE   R0,R0,#1<<27

    It is very clear in the second line that the instruction is trying
    to clear bit 27 of R0.
    This conversion is carried out only for numbers that are shifted by
    more than 3 places and are higher than 255.

 2: Immediate number ---> ASCII chars.
    ON : Immediate numbers shown as ASCII characters when possible.
    OFF: No ASCII character display. [Default]

    When set to on, this flag allows immediate numbers in the ASCII
    character set to be shown as ASCII characters. For example:

    MOV  R1,#65   becomes   MOV  R1,#ASC"A"


 3: FEDA stack type.
    ON : Use the Full/Empty, Ascending/Descending stack type. [Default]
    OFF: Use the Increment/Decrement, Before/After stack type.

    This flag is used to select between the two types of stack notations.
    This notation is used with the LDM/STM type instructions.

    The most common stack type notation used by programmers is the
    FEDA type, for example:

    STMFD  R13!,{R14}
    LDMFD  R13!,{PC}^

    Using the IDBA notation, the above two instructions will be shown
    as:

    STMDB  R13!,{R14}
    LDMIA  R13!,{PC}^

 4: PC relative Load/Store.
    ON : PC relative addressing notation is shown. [Default]
    OFF: PC relative addressing display switched off.

    When this flag is on, the following instruction:

    LDR  R0,[PC,#12], becomes   LDR R0,address

 5: SWI names quotes.
    ON : All SWI names are enclosed in quotation marks.
    OFF: All SWI names are displayed without quotation marks. [Default]

 6: HS/LO condition codes.
    ON : The CC and CS condition codes are replaced by HS and LO. [Default]
    OFF: The condition codes CC and CS are used.

 7: ADR directive.
    ON : The ADR directive is used. [Default]
    OFF: The ADR directive is not used.

    When this flag is on, any instructions which use reference to the
    PC with ADD and SUB opcodes together with immediate numbers are
    replaced by the ADR directive.

 8: LSL/LSR ---> */DIV.
    ON : LSL and LSR shifts are converted into * and DIV keywords.
    OFF: Shifts using LSL and LSR are displayed as normal. [Default]

    When on, this flag allows the display of instructions using the
    LSL and LSR to be shown as * (multiply) and DIV (divide)
    instructions. Examples:

    MOV  R0,R1,LSL #2     becomes    MOV  R0,R1*4
    ADD  R1,R2,R3,LSR #3  becomes    ADD  R1,R2,R3 DIV 8

    Remember that the single-line dis-assembler accepts these new
    keywords.

 9: Decimal numbers only.
    ON : All immediate numbers are shown as decimal numbers.
    OFF: All immediate numbers are shown in the default format. [Default]

    When on, this flag causes all immediate numbers to be shown as
    decimal numbers. This does not affect the the display of addresses
    used in instructions such as B and BL, as these are always shown
    as hexadecimal numbers.

10: Signed decimal numbers.
    ON : All decimal numbers are shown as signed numbers.
    OFF: All decimal numbers are shown as unsigned numbers. [Default]

    For this flag to be effective, flag no. 9 (Decimal numbers only) must
    also be on.

11: MVN/CMN/CNF ---> MOV/CMP/CMF.
    ON : Allow conversion of above instruction.
    OFF: Switch off conversion. [Default]

    When on, this flag allows the MVN instruction to be shown as MOV,
    CMN as CMP, and CNF as CMF. For example:

    MVN  R0,#1  becomes  MOV  R0,#-2
    CMN  R0,#1  becomes  CMP  R0,#-1

    Do not format to turn the 'Decimal numbers only' and the 'Signed
    decimal numbers' flags on to see the result in signed decimal numbers.

12: Co-processor instructions.
    ON : All co-processor instructions disassembled. [Default]
   !OFF: no co-processor instructions shown.

    This flag must be on to allow both the co-processor and FPU instructions
    to be disassembled.
    When set to OFF, all co-processor instructions are replaced by the
    message: "Co-processor instruction", including all FPU instructions.

13: FPU instructions.
    ON : All Floating Point co-processor instructions shown. [Default]
    OFF: No FPU instruction disassembled.

    To disassemble FPU instructions both the 'FPU instructions' and the
    'Co-processor instructions' flags must set to ON. If the 'FPU
    instructions' flag is set to OFF, then all FPU instructions will be
    disassembled as co-processor instructions.

14: Power multiply.
    ON : Use the 'power multiply' notation.
    OFF: Use normal display. [Default]

    When on, this flag allows the following conversion to take place:

    MOV R0,R1,LSL #1     becomes   MOV  R0,R1*2
    ADD R0,R1,R1,LSL #2  becomes   MOV  R0,R1*3
    RSB R0,R1,R1,LSL #3  becomes   MOV  R0,R1*7
    SUB R0,R1,R1,LSL #2  becomes   MOV  R0,R1*-3    
    
15: Labels and remarks.
    ON : Allows any defined labels and remarks to be shown. [Default]
    OFF: Disables labels and remarks display.

16: Long ADR directive.
    ON : Disassembles the ADRL directive. [Default]
    OFF: Disables ADRL directive disassembly.

17: Show bad instructions.
    ON : Bad instructions are flagged. [Default]
    OFF: Bad instruction flagging disabled.

    Bad instructions are those which are (normally) not created by
    assemblers. They are normal instructions which the CPU will in
    many ways accept but have certain bit set or clear. ARCTOOLS
    defines the following as Bad instructions:

    1. Bad MUL: Bits set.

       This is a MUL or MLA instruction with either or both bits 5 and 6 set.

    2. Bad MUL: Rd=PC.

       This is a MUL or MLA instruction with the destination register equal
       to the PC (R15).

    3. Bad MUL: Rd=Rm

       This is a MUL or MLA instruction with the Destination Register set
       to the same number as the Rm register.

    4. Bad MUL: Rn set.

       This is a MUL instruction with bits 12 to 15, used only in the MLA
       instruction as the accumulate instruction number, not clear.

    5. Bad Comparison.

       This is a comparison instruction (CMP, CMN, TST or TEQ) with the
       S-bit (bit 20) clear. All comparison instructions must have the
       set condition code bit set to function as expected.

    6. Bad MOV/MVN.

       This is a MOV or MVN instruction, with any of bits 16 to 19 set.
       The MOV and MVN instructions do not have <Rn> register. The
       <Rn> register field must be zero.

    7. Bad shift.

       This is a shift operation of LSR or ASR with the shift number
       equal to zero.

    

Colours used in the dis-assembler:
==================================

The dis-assembler uses colors to provide an easy way of identifying
pieces of code or sub-routines.

The colors used are:

 - Orange :  Branch instructions and addresses.
 - Red    :  Undefined and Bad instructions.
 - Magenta:  Co-processor instructions.
 - Cyan   :  FPU instructions and ARM3 co-processor instructions.
 - Brown  :  STM and LDM instructions.
 - Yellow :  SWI instructions, labels and remarks.

    



                       The Single Line Assembler
                       =========================

The single line assembler is built into both memory and disc Mnemonic
editors or dis-assemblers.
To enter the single line assembler simply press CTRL+M when in any
of the other editors. This automatically selects the Mnemonic editor.
The editor in this mode will try its best to interpret the contents
of memory or disc and produce the corresponding instruction.
The Mnemonic editor or disassembler can disassemble all instructions.

There are 3 types of instructions:
1. ARM Instructions
2. Floating Point Instructions
3. Co-processor Instructions

The dis-assembler will disassemble all of the above types of instructions.
The Single-Line_Assembler will assemble all of the above instructions, and
hence it covers all possible instructions.

There are some Undefined instructions, and are at the moment of two types:

1. Undefined ARM Instructions
2. Undefined FPU Instructions

These are referred to by Acorn as Reserved or Undefined instructions.

There are no illegal Co-processor instructions. All 16 possible co-
processor instructions will be assembled and disassembled!!!

Co-processors are numbered 0-15. Number 1 being the Floating point
co-processor. Therefore, you can assemble FPU instructions using
co-processor instruction with the co-processor number set to 1 or
simply use the best and logical way: using FPU instructions.

This manual will not teach how to write assembly code. And the following
information assumes that you are familiar with both the ARM and FPU
instruction sets.

How to enter the Single-Line-Assembler?
======================================

In the Mnemonic editor by pressing the first character of your new line.
This causes the message "Enter Instruction:" to be displayed followed
by the character typed. You can now continue typing the instruction.
Pressing Return, Cursor Up or Cursor Down causes ARCTOOLS to assemble
the new line of code. If the line of code is acceptable the assembled
opcode is put into memory and the memory cursor advanced in a direction
determined by the terminating key.
If the terminating key was Cursor Up the memory cursor moves up. Return,
Enter or Cursor Down keys causes it to move down to the next memory address.


Small changes to existing code:
===============================

You may sometimes want to change only a small part of the Instruction
already displayed, possibly the condition code part or the "S" suffix.
To do so, press CTRL+Return. This will enter the Single-Line-Assembler
with the cursor position on the first character of the line. You can
now move the cursor left or right and modify the line.

Example:
Instruction at Cursor is:  MOVS PC,R14
Target Instruction is: MOV PC,R14
Action: Press CTRL+Return, move cursor right to the letter "S", press
the space key, Press return.

If the assembler could not assemble the code for any reason, an error
message is displayed for a short time (time delay can be overridden by pressing
the ESCAPE key). After this time delay, you are put back on the same
line of text you have typed with the cursor at the character which
causes the error. This makes it easy for you to identify the part that
caused the error. You can now correct the error or press Escape to exit
the Single-Line Assembler.

At any time, pressing the Escape key exits the assembler without assembling
the new line of code.

The single line assembler will ignore any irrelevant text or data after
the instruction. The exception is when assembling immediate numbers or
reference to addresses. This is because in these two cases the Operating
System 'EVAL' function is used which tries to evaluate the whole string
of text.




HOW TO USE THE SINGLE-LINE ASSEMBLER
====================================

The single-line assembler is compatible with the BBC BASIC's assembler.
There are however exceptions. Being only a single line assembler, you
can not use variables, except labels if already defined, as in a fully
blown assembler.
It can be generally said that any instruction that the dis-assembler
can display, the assembler will accept.
If you are familiar with any ARM assembler then you will find no problems
with this assembler.
The use of the FPU instructions is described in the Programmers Reference
Manual. The co-processors instructions set is describes in the excellent
book " ARM Assembly Language programming" by Peter Cockerell.


                   The Single-Line-Assembler Features:
                   ===================================
 1. Assemble all ARM instructions.

 2. Assemble all FPU instructions.

 3. Assemble all co-processor instructions.

 4. Text entered is case insensitive. (except SWI name).

 5. Automatic use of complement instructions:
    MOV  R0,#-1    will be assembled as  MVN  R0,#0
    ADD  R0,R1,#-2 will be assembled as  SUB  R0,R1,#2
    The complement instruction conversion will be carried out with the
    following instructions:
    MOV-MVN, BIC-AND, ADD-SUB, ADC-SBC, CMP/CMN
    The assembler will try to convert into a complement instruction if
    the immediate number can not be encoded into the instruction. If it
    fails the second time it will generate an error.

 6. Accepts PC-relative addressing.
    example:  LDR   R0,&20000
              STRB  R1,&21000
              STFS  F0,&10000
    The offset of the address given in the instruction should not be more
    than 4095 bytes from the current memory address for ARM instructions,
    and 1020 for FPU instructions. The FPU offset address must be word-
    aligned.

 7. Accepts the BBC BASIC's ADR directive.
    Limits imposed by the use of the ADR directive are the same as those
    in ARM BBC BASIC.

 8. Accepts the ADRL (long ADR) directive. Creating two instructions to
    cover an offset of 64 Kbytes.
    Note: An error message will be generated if you try to assemble the
          ADRL directive at the end of a memory boundary.

 9. Accepts the BBC BASIC's ASC keyword.
    example:SUB   R0,R0,#ASC"0"   equivalent to SUB  R0,R0,#48
            CMP   R2,#ASC" "      equivalent to CMP  R0,#32
 
            An alternative method is to omit the "ASC" word.
 
    Example: MOV   R0," "    equivalent to MOV  R0,#ASC" "
             MOV   R0,""     same as above
             MOV   R0,"""    equivalent to MOV  R0,#34

10. Accepts many forms of Software Instructions.
    Example: SWINE   "OS_WriteC"
             SWI     XOS_Write0
             SWI     0
             SWIPL   256+7
             SWI     "OS_WriteI"+7
             SWI     256+ASC"0"
             SWI     256+"0"
             SWI     2+1      equivalent to SWI  3
             SWI     OS_WriteI+ASC"a"
             SWI     256+""
 
  Note: There are Software Instructions that can not be assembled.
        They are:
        "User", "OS_Undefined"
        This is because, these two SWIs cover a wide range of SWI
        instruction numbers, and hence The Operating System can
        not tell which number you want.

11. Ignores irrelevant spaces in entered instruction.
    Example: MOVR0,R1           = MOV R0,R1 
             ADDR2,R5,R3        = ADD R2,R5,R3
             andR3,R4,R2LSL#2   = and R3,R4,R2,LSL #2
    The exception is with the 'SWI' opcode as a space between the opcode
    and operand is necessary

12. Understands the following for register numbers:
    ARM Instructions         : (0-14,15|PC) or (R0-R14,R15|PC)
    FPU Instructions         : (0-7) or (F0-F7)
    Co-processor Instructions: (0-15) or (C0-C15)
    ARM3 co-processor        : (0-5) or (C0-C5) or register name:
                               ID, Flush, Control, Cacheable,
                               Updateable, Disruptive.

13. Uses the OS 'EVAL' function to evaluate integers, so any mathematical
    expression is allowed in immediate numbers.
    Examples:AND     R2,R3,#-2
             BICS    PC,R14,#1<<29
             ORREQ   R1,R2,#-1<<20
             MOV     R0,#NOT 1
             ADD     R3,R2,#30+4*25
             SUB     R0,R0,#1 OR (1<<5)
             SUBNE   R1,R2,#ASC"0"
             ADDPL   R2,R2,"a"

14. Understands power multiply instructions.
    Example: MOV  R0,R1*2    becomes   MOV  R0,R1,LSL #1
             MOV  R0,R1*3    becomes   ADD  R0,R1,R1,LSL #2
             MOV  R0,R1*7    becomes   RSB  R0,R1,R1,LSL #3
             MOV  R0,R1*-3   becomes   SUB  R0,R1,R1,LSL #2

15. Understands '*' and 'DIV' as alternatives for 'LSL' and 'LSR'.
    Example: MOV  R0,R1*4     becomes   MOV  R0,R1,LSL #2
             ADD  R0,R1,R2*32 becomes   ADD  R0,R1,R2 LSL #5
             MOV  R0,R1 DIV 8 becomes   MOV  R0,R1,LSR #3

16. Accepts labels previously defined in place of any reference to
    a memory address.


17. Assembles the new ARM3 SWP instruction.

18. Assembles the ARM3 cache control instructions.

The Single-Line Assembler conventions:
======================================

1. The instruction  STR  R0,[R1] is assembled into STR R0,[R1,#0]
2. The instruction  STR  R0,[R1]! is assembled into STR R0,[R1,#0]!
3. The instruction  STRT  R0,[R1] is assembled into STRT R0,[R1],#0


The single-line assembler errors:
=================================

 1. Unknown opcode
 2. Bad shift
 3. Bad multiply, <Rd>=PC
 4. Bad multiply, <Rn>=<Rd>
 5. Bad register
 6. Bad ASCII
 7. Missing ' '    : This is produced when an expected char is missing.
 8. Bad number
 9. Bad address/label
10. Can't encode number
11. Non aligned address
12. Bad operation
13. Bad immediate operand
14. No 'T' with pre-indexed or PC-relative addressing
15. Bad offset
16. Bad Co-processor operation
17. Precision needed



                    Calling the assembler from BASIC
                    ================================

 ARCTOOLS provides a single SWI which can be used from your own BASIC
 assembly code. This allows assembly of all FPU instructions, all
 co-processor instructions, the new ARM3 SWP instruction and all Cache
 control instructions, from within the BASIC assembler.

 To allow this you need to add a simple function in your BASIC program
 which will be called from within the assembly lines.

 Here is an example of the BASIC function:
 =========================================

 DEF FNass(A$)
 SYS "ARCTOOLS_Assemble",A$,P% TO !P% : P%+=4 : =TRUE


 The following is an example of the use of the cache control instruction
 assembly. Two routines are provided, one to switch ON the cache, and the
 other to switch it OFF.
 NOTE: The example given will only work on ARM 3 processors.

 DIM code 1000
 FOR pass= 0 TO 2 STEP 2
 P%=code
 [OPT pass

 .CacheON
 STMFD  R13!,{R0,R14}           ;Push regs on the stack
 MOV    R0,#3                   ;Value to write into cache control reg
 B      Do_It
 .CacheOFF
 STMFD  R13!,{R0,R14}           ;Push regs on the stack
 MOV    R0,#2                   ;Value to write into cache control reg
 .Do_It
 SWI    "XOS_EnterOS"           ;Enter SPV mode, so we can write to cache
 FNass(" CHSW  R0,Control")     ;Write R0 into cache 'Control' register
 TEQP   PC,#0                   ;Return to user mode
 LDMFD  R13!,{R0,PC}^           ;Pull regs and preserve flags
 ]
 NEXT
 END

 The above example demonstrates the use of ARCTOOLS single-line assembler
 from a BASIC program. Of course, any valid instruction that ARCTOOLS
 understands can be assembled. See above for full assembler syntax.
 There are however some limitations:

 1. You should not use variables when ARCTOOLS_Assemble SWI.
 2. You should not call the ARCTOOLS ADR directive with a label or variable.
 3. You should not call ARCTOOLS ADRL directive.



         Using the dis-assembler to recover lost source code files
         =========================================================

   This section will be given in detail in the next version of ARCTOOLS.
   If your are an experienced ARM programmer, you will have no problem
   using the dis-assembler together with the automatic labelling feature
   and the *Mdump command to get back your lost files.

   Next versions of ARCTOOLS will make the conversion process as
   intelligent as possible. This will include automatic Modules
   conversions. A simple of way of marking memory areas as Data items
   or strings, so that these will be converted into DCB, DCD or EQUS
   equivalents.

   The current version of ARCTOOLS allows the instruction "SWI OS_WriteS",
   when dumped to the screen to be followed by the string which would be
   printed. The string is shown in EQUS and DCB keywords, followed by the
   keyword 'ALIGN'.

                 ARM 3 instructions assembly and disassembly
                 ===========================================

 The SWP instruction:
 ====================

 The SWP instruction is used to swap a byte or word between register
 and memory. It is used as a form of LDR/STR in multi-processor installation.
 During the execution of this instruction, the bus interface LOCK signal
 is asserted so that other processors will not gain access to the bus.

 The instruction syntax is:

 SWP<cond><B>  Rd,Rm,[Rn]

 The SWP instruction performs the following operations:
 1. Copy the content of <Rn> address into <Rd>,
 2. Store <Rm> into <Rn> address.

 The SWP instruction is only executed in a supervisor mode.

 ARCTOOLS will assemble and disassemble the SWP instruction. Examples are:

   SWPNE   R0,R3,[R10]
   SWPB    R1,R0,[R2]
   SWPPLB  R0,R1,[R7]



 The cache control register operations:
 ======================================
 ARM 3 processors contain within them a cache memory. The cache caches
 virtually addressed data. For efficiency the cache does not cache
 everything. To control the various operations of the cache, 6 control
 registers are provided. These are:

 0 : ID register
 1 : Flush register
 2 : Control register
 3 : Cacheable register
 4 : Updateable register
 5 : Disruptive register

 The cache control instructions use the co-processor register transfer
 instructions (MRC and MCR instructions) with the co-processor number set
 to 15.
 Two instructions are provided to communicate with the cache registers;
 the MRC instruction which copies the content of the ARM register to the
 cache control register and the MCR which copies the content of the cache
 control register to the ARM register.

 ARCTOOLS can assemble and disassemble all co-processor instructions and
 hence communication with the cache can be performed using the MCR and MRC
 instructions. The MCR and MRC instructions syntax is very complex and
 difficult to remember, example:

 To read the cache ID register into R4:

 MCR  Cp#15,Op#0,R4,C0,C0,0

 this can be abbreviated into:

 MCR  15,0,R4,0,0,0

 However, ARCTOOLS provides a new instrcution syntax to handle these
 instrcutions.

 Instruction sysntax:  CSHR<cond>  Rd,Cx
 ====================  CSHW<cond>  Rd,Cx

 where:
       CSHR : opcode to read the cache register into ARM register.
       CSHW : opcode to write the ARM register into the cache register.
       Rd   : ARM register R0 - R15
       Cx   : cache control register C0 to C5.

 ARCTOOLS also understands cache register name so that:

 C0 = ID
 C1 = Flush
 C2 = Control
 C3 = Cacheable
 C4 = Updateable
 C5 = Disruptive

 Examples:
 =========

 CSHREQ  R4,C0                 ;Read cache ID register into R4.
 CSHR    R0,Cacheable          ;Read cacheable register into R0.
 CSHW    R7,Control            ;Write R7 into cache control register.

 Note: The cache control insructions are only executed in supervisor mode.
       In other processor modes, these instructions will fail as 'Undefined
       instructions'!!
