
[1m[32m        ____     ___        ___     ___ ___ ___ ___ ____      ___ ___ ___[0m
[1m[32m         /  /__//_         /__ /  //_ //__ /  //_    /  / / //_ //__//_  [0m
[1m[32m        /  /  //__        ___//__//__/___//__//     /  /_/_//  //  \/__  [0m

[1m[32m------------------------------------------------------------------------------[0m
   - FOR ABO'S CONTACT US AT:   BP:28 1170 WATERMAEL-BOITSFORT 1 BELGIUM!!...

[1m[32m------------------------------------------------------------------------------[0m
                           - DON'T SEND ANY DISKS -

[1m[32m------------------------------------------------------------------------------[0m



                       [33m THE LEGENDARY >> SUBSOFTWARE << IN 87/88/89/90/91!!...
                       [1m[32m ------------------------------------------------------



-------------------------------------------------------------------------------
        *******      ****         ******        *     *          *******
         * * *      **  **          **          **   **           * * *
          *****     ***             **          *** ***          *****
           * *       ***            **          *******           * *
            ***        ***          **          ** * **          ***
             *      **  **   **     **     **   **   **   **      *
              *      ****    **   ******   **   **   **   **     *


                           System-Independent Monitor
               Copyright © by Stefan Walter, ALL RIGHTS RESERVED
-------------------------------------------------------------------------------

              The User Manual, refering to version 1.51 of S.I.M.
                      Released on the 27th of January 1991
                                 --------------
                                 READ IT OR DIE
                                 --------------

                                    CONTENTS
                                    ========

 1. Introduction
         1.1  Welcome to SIM
         1.2  About this Documentation

 2. Getting aquainted with SIM
         2.1  What is SIM?
         2.2  Qualifications, Requirements and Limitations
         2.3  The SIM Program

 3. Some words about...
         3.1  The Display
         3.2  Breakpoints
         3.3  Trace
         3.4  The Keyboard
         3.5  Disk Access
         3.6  Files
         3.7  Breaking
         3.8  The Actual Address
         3.9  The Matchbuffer
         3.10 Command History
         3.11 Traps
         3.12 Functionkeys
         3.13 SIM and the Hardware

 4. Communication between YOU and SIM    
         4.1  The SIM Environement
         4.2  The Monitor
         4.3  The Commands and Their Syntax
         4.4  The Debuger Window
         4.5  Debugger Window Shortcuts

 5. Additional Information
         5.1  Assembler and Calculator Syntax
         5.2  Line Forms
         5.3  The Debug Server Entrance
         5.4  The SIM Base
         5.5  Errors

 6. Greetings, Thanks, Support and about Future Releases
         6.1  Thanks
         6.2  Greetings
         6.3  Support
         6.4  About Future Releases

*******************************************************************************
 1. Introduction
*******************************************************************************

 1.1 Welcome to SIM
 ==================


  Congratulations dear user. You have just become owner of the second release
  of 'S.I.M.', the high performance monitor and debugger for the Commodore
  Amiga, probably the best, the mightiest and the only of its kind.

  Version 0.50 of 'S.I.M.' was freeware. This version of 'S.I.M.' is now a
  shareware program. This means that it can be used, copied and distributed
  freely, provided that:

    1)   No fee is charged for copying and distribution.
    2)   It is distributed ONLY in its original, unmodified state.
    3)   This document is copied along with the program.

  If you don't respect these three rules I wish you all the bad things you'd
  wish somebody that steals, adds to or misuses something created by yourself
  in hours of hard work. So be fair! Only happy programers are good
  programers.

  If you copied this version from somebody else and you like it and keep using
  it, you should send me (if you did not yet) 20 SFr or 20DM or 15$ (well, 1g
  gold or half a barrel of oil will also be accepted) shareware fee. This has
  for you the advantage that I will send you the final version on another disk
  as soon as it's finished.


  Note: The entire risk of using SIM is to the user himself. In NO event
        will the author be liable for direct or indirect damage or loss
        resulting from the use of this program.

 1.2 About this Documentation
 ============================

  There exist two very good reasons why you must at least have a look at
  this text:

  1. I do not question your qualifications and your knowledge of the Amigas
     hardware. But SIM bases on a new concept that offers an universe of
     possibilities but also demands a lot of the user. There are a lot of
     details that will get important at a certain moment, details you'll never
     find out about on your own. It is in your own interest if you read this
     manual. You will then be able to use 90% of the possibilities this
     program offers (sorry, the only one that knows everything about this
     tool, that's me).

  2. It was fun programming SIM, but it was HELL writing this damn manual.
     Writing it in german would have been hard enough, but writing it in
     a foreign language made it a torture. Good old Woodbird (my former english
     teacher) may forgive me all the bad mistakes I did in this text. So you
     may honour my sacrifice by reading this, since I do not like to do write
     manuals that no one reads.

*******************************************************************************
 2. Getting aquainted with SIM
*******************************************************************************

 2.1 What is SIM?
 ================


  A good question, isn't it? Well, it's not as easy to give a straight answer
  then to ask the question. As you could read in the title, 'S.I.M.' stands
  for (S)ystem (I)ndependent (M)onitor. I presume that nearly every programer
  working on the AMIGA (intromakers excluded) knows what a 'monitor' is (I do
  not mean the device you stare at in this moment!).

  There have been several before, like good old C-Monitor, A-Mon, RomCrack and
  a lot more. During the developement of SIM they served as examples for how to
  do it and how not to do it and how to do it better. I hope that does not
  cause any trouble with copyrights and so on. The result of this compiling
  is an unmatched variety and complexity of commands. This is only a short
  selection of the more spectacular features of SIM:

        - comfortable command editing
        - integrated assembler, disassembler and calculator
        - very powerfull findmechanisms
        - superb breakpoint and trace possibilities
        - parallel printer support
        - freely defineable functionkeys
        - exception control
        - DOS-track and sector read/write operations
        - one-bitplane graphic searcher
        - diskformat
        - file LOAD, SAVE, DELETE and DIR operation
        - copperlist finder and disassembler

  Additionally to the monitor commands, this version disposes of what I call
  'Debugger Window'. People that are used to Monam2 will welcome it because
  it provides a similarly easy and effective way to overview a program.

  So far nothing new. What makes SIM so powerfull is the way it interacts
  with the AMIGAs hardware and system. SIM tries to be as discreete and as
  independent as it is possible.

  On one hand this means that SIM will run under all circumstances. It
  does not need anything, no exec, no DOS, no nothing. This capability leaves
  a wide field of usages. You could use SIM as last hope to salvage data from
  the memory before reset. Or for virus-secure diskoperations since SIM
  does it without DOS.

  On the other hand discreetion means that S.I.M. will do as less changes in
  the software environement (ram, custom registers etc.) as it can. It does
  neither use blitter nor copper. This 'invisibility' of SIM makes it
  possible to monitor and track a programs to unknown depthts. You can debug
  directly into graphic routines, interrupt handlers, diskroutines, task
  and memory handling routines without any difficulties and resulting problems.

  I have made some bonebreaking tests with SIM, but it passed them all.
  There is no absolute protection from SIM, it can only be made very hard
  to keep control of a program with SIM, but if you are clever enough, you
  will allways find a way around the problem.

 2.2 Qualifications, Requirements and Limitations
 ================================================

  To use SIM efficiently, detailed knowledge of the AMIGAs hardware,
  the 68000 processor and assembler language is ABSOLUTELY neccessary.
  SIM is designed to be used by professionals.

  SIM will work on practically every normal machine, as long as its
  processor is a Motorola 68ooo/7.14 MHz. Other processors (68010/20/30/...)
  are not supported yet, I am sorry about that. These processors are much more
  comlicated in their assembler language and exception handling and I do not
  have one of them.

  Different memory configurations and Big/Fat Agnus do not bother SIM.
  Theoretically you'd not even need a kickstart ROM/WOM to run SIM.

  I recommend a fastmem memory expansion of at least half a megabyte at $200000
  or $c00000. This gets usefull when you want to debug a program that uses the
  entier chip ram. You can then put SIM in fastram which you have disabled
  with one of those resetting nofastmems.

 2.3 The SIM Program
 ===================

  SIM is not a conventional program (it has no hunkstructure, so you cannot
  simply start it from the CLI or workbench) but a simple PC-relative file
  that can be loaded somewhere into the memory or included in one of your
  own programs.

  When you work with SIM you must change your way of thinking. The Amiga has
  multitasking. Most debuggers are 'taskoriented'. This means that they debug a
  certain task, and only that one. If another task crashes, they do not notice
  this. SIM is a monotasking debugger. In the eyes of SIM there is only one
  program running on your machine. This one program may splitt up into several
  seperated programs that are 'switched' (the tasks), but it is still one whole
  program. This concept enables you to debug different tasks at a time, and
  even newly generated ones i.e. by createproc().

*******************************************************************************
 3. Some words about...
*******************************************************************************

 3.1 The Display
 ===============


  The display creates some of the more tricky problems for SIM and you.
  As you know, you need 20480/$5000 bytes of chipmem for a medres bitplane
  you want to display. SIM uses a medres bitplane for it's display. But at a
  certain moment, there may be no 20480 bytes chipmem available.

  The solution is the backup. When you have an area of $5000 free chipmem
  that will stay free for sure (that means it is allocated with allocmem or
  will never be used), you simply set the display address to the start
  of that area and the backup address to zero (this means no backup). SIM will
  then concider these $5000 bytes its own and use it as display. When you enter
  SIM, the data in this area are then destroyed.

  In case there is not enough free chipmem or the chipmem will be used entierly
  in near future and you have enough (that means $5000 bytes) unused fastmem
  that won't be used for sure (disable fastmem...), you set the backup address
  to the start of a free $5000 block of fastmem and the display address just to
  somewhere in the chipmem. When SIM is activated, It copies the content of the
  $5000 bytes display- to the backupmem and uses the displaymem. When you leave
  SIM again, it copies the $5000 bytes back from the backup- to the displaymem.
  That way, the chip ram is unchanged.

  SIM does not have an memory manager that 'ghosts' the display. This means
  that when you have a display at $70000 and a backup at $c50000 and you want
  to change or view memory or find something at $71000, you either transfere
  the display to another location in the chipmem or you have to look or edit
  in the backup (at $c51000 in our example).

  Because the interrupt vectors are used, you may not specify a display below
  $70 or above $7b000 when you have the normal amount of chipmem (the chipmem
  is reflected at $80000, except if you have fastmem there).

  Both the display- and the backupaddress are entered in the SIM-basearea
  before starting SIM or set by the 's' command while working.


 3.2 Breakpoints
 ===============


  A breakpoint is basically a change in the program that is monitored that
  stops it and gives control to the debugger that set it. In other terms, you
  can run the program at full speed until it arrives at a certain instruction.
  This is a very important feature when you have to control the flow of a
  program. Therefore the breakpoint system of SIM is very sophisticated. SIM
  can handle three kinds of breakpoints:

        - ILLEGAL breakpoints
        - JSR breakpoints
        - STACK breakpoints

  Each kind is used for different problems and has its advantages and
  disadvantages.

  SIM is able to handle 16 different breakpoints at a time. When you enter
  SIM, it removes the breakpoints from the memory, so the memory looks like it
  would look with no breakpoints set. That enables you to change instructions
  that are at a breakpoint without first removing the breakpoint before
  changeing and putting it back afterwards.

  A critical situation occurs when the breakpoint is overwritten by a
  program (i.e. by a copyroutine). Such a breakpoint is in 'modified' state
  When SIM removes the breakpoints at entry, it checks if they are still there.
  Modified breakpoints are not removed and not restored, when you leave SIM
  again. If you want to have the modified breakpoint set again, you must first
  'forget' it (this means that SIM simply frees the place in the breakpoint
  list but does not put the original opcode or words back). Then you can set
  it again.

  You cannot set breakpoints everywhere. SIM tests if there is ram at the
  location where you want to set a breakpoint. If there is none, this causes
  an error. SIM also prohibits to set breakpoints in the SIM codesegment.


  1. ILLEGAL breakpoints
  ----------------------

  Illegal breakpoints are normally the most used ones and offer the most
  possibilities. When you set an ILLEGAL breakpoint at a certain instruction,
  SIM replaces the opcode word of that instruction by the ILLEGAL opcode $4afc.
  When the ILLEGAL instruction is executed instead of the original instruction,
  an ILLEGAL INSTRUCTION exception happens.

  Therefore it is neccessary that the ILLEGAL INSTRUCTION vector somehow jumps
  to SIM, either directly, set by the 'w' command, or indirectly by the task
  traphandle, set by 'SIM-BUG' or another SIM-loader. If this is not so, your
  machine crashes.

  Illegal breakpoints have the advantage that they can be 'conditioned'.
  This means that this breakpoint only forces entry when one or one of several
  conditions are fullfilled. The follwoing criterias can decide whether or
  not the breakpoint forces entry:


    - condition term:

      You can specify a formula that is calculated each time when the program
      arrives at the breakpoint. When the result of the term is zero, the
      program continues, if it is nonzero, SIM is entered.

      You can use that feature to i.e. break a program at a certain point if
      a register contains a certain value.


    - counter breakpoint:

      A counter breakpoint will enter SIM if the program has passed the
      breakpoint a certain number of times.

      This way you can i.e. break a subroutine after it was called a certain
      number of times.


    - button breakpoint:

      When the program arrives at a button breakpoint, SIM will look if the
      left or right mousebutton or the firebutton of a joystick in port 1 is
      pressed and enter SIM if one is pressed. You can specify what buttons
      are concidered.

      Button breakpoints can i.e. be set in a vertical blanking interrupt.
      every fiftieth/sixtieth of a second, SIM can check if you want to enter
      or not.


  Additionally you can make resident Illegal breakpoints. A nonresident
  breakpoint will be removed after it caused entry. A resident breakpoint
  will stay active until you remove it. A resident breakpoint can be used
  in situations when you want to stop a program several times at the same
  address.

  SIMs breakpoint system enables to combine all these elements, to make
  resident breakpoinst that break at SEVERAL conditions. You can set a resident
  breakpoint at $70000 that either breaks when d3 is 3245 or the left or right
  mousebutton is pressed and that is limited to 1000 passes. The command line
  to set that breakpoint would look like that: 'b 70000 * ?d3=3245 lr 1000'.

  You may ask the question how to go over a breakpoint. SIM does this in three
  steps:

    - remove the Illegal opcode and put back the original one.

    - do a tracestep to execute the instruction.

    - remember the (possibly new) opcode and set the $4afc again.

  As you see, SIM uses the TRACE vector to ignore a breakpoint. This means
  that you must not only set the ILLEGAL INSTRUCTION vector but also the
  TRACE vector. This is neccessary as soon as you have set a conditioned or
  a resident breakpoint.


  2. JSR breakpoints
  ------------------

  The second type of breakpoint is a rather a 'heavy duty' one. When you
  set a JSR breakpoint, SIM remembers the 6 bytes at the breakpoint address
  and puts a JSR instruction there that jumps absolutely into SIM (i.e.
  'JSR $c50726'). When the breakpoint is reached, the program jumps
  directly into SIM which then puts back the 6 bytes.

  This breakpoint has two advantages. The first is that you do not need any
  vectors to be set. The second is that a JSR breakpoint can be transfered.
  When you have an Illegal breakpoint in a routine and that routine is
  transfered to another location and the breakpoint is reached in the
  copied routine, SIM will not know that that illegal is a breakpoint
  because it is not at any of the addresses at which a breakpoint was set,
  so it will not be replaced by the original opcode.

  JSR breakpoints are recognized at their entrance, because each of the 16
  possible JSR breakpoints has another entrance. That way, SIM can recognize
  that breakpoint whereever it is. But be carefull, never enter SIM by
  these entrances on your own. You must also see to it that after the
  transfered breakpoint forced entry and was removed, the original one is
  NOT reached too.

  Because of these two advantages, you can use JSR breapoints in delicate
  situations, where you are not sure if the vectors are not changed.

  A disadvantage of JSR breakpoints is that they use not one but three
  words. The minimum size for an instruction is a word, an Illegal
  breakpoint can be set at any instruction because the instruction ILLEGAL
  uses one word. A JSR breakpoint may replace three instructions. Therefore
  you have to set the JSR breakpoint in a 'linearly' executed part of the
  program. Here are two examples where the JSR breakpoint is not set
  correctly. The breakpoint is always set at the label 'bkpt':

  1. .
     .
     .
     bsr.s label      ;this bsr would jump in the middle of the breakpoint!
    bkpt:
     bra.s label2     ;JSR opcode
    label:
     nop              ;HIword of entrance
     nop              ;LO word of entrance
     .
     .
     .


  2. .
     .
     .
    bkpt:
     moveq #1,d0      ;JSR opcode
    label:
     moveq #0,d1      ;HI word of entrance
     rts              ;LO word of entrance
     .
     .
     .
     moveq #-1,d0
     bra.s label      ;again in the middle...


  3. Stack breakpoints
  --------------------

  Contrarily to the Illegal and JSR breakpoint, the Stack breakpoint is
  not a change in the program but a change on the Stack. When SIM sets a
  Stack breakpoint, it replaces a returnaddress on the stack by the address
  of an entrance of SIM. When the appropriate rts, rtr or rte that would
  return to that address is reached, it returns to SIM instead. SIM sets the
  pc to the returnaddress and replaces the SIM entrance address on the stack
  (should now be at a7-4!) by the original address for security.

  For SIM, it does not differe, if the Stack breakpoint is set in the
  supervisor or userstack (in earlier versions it did, this is no longer
  so).

  Use this feature wisely! SIM cannot test if the Stack breakpoint you set
  is put in a stack and is taken off stack by a rts. Its upon you to set Stack
  breakpoints at the right position.

  Stack breakpoints are also used by for the nextstep and the leave
  subroutine command.



 3.3 Trace
 =========


  Tracing is the second way of keeping a program under control. SIM can
  singlestep a program. Therefore you must see that the TRACE exception caused
  by that somehow ends up in SIM, either set it directly or set the
  tasktraphandle. It can also let a program run step by step and stop when
  one or several conditions are fullfilled, much like the illegal breakpoints:


    - condition term:

      You can specify a formula that is calculated after each step. When the
      result of the term is zero, the trace continues, if it is nonzero,
      SIM is entered.

      You can use that feature to i.e. break a program as soon as a certain
      register is changed.


    - counter trace:

      You can specify a maximum number of steps to do. When that amount of steps
      is done, SIM is entered.

      Counter trace is mostly use to just get back after a routine is done.


    - button trace:

      After each step, SIM will look if the left or right mousebutton or the
      firebutton of a joystick in port 1 is pressed and enter SIM if one is
      pressed. You can specify what buttons are concidered.

      Button trace can i.e. be used for stoping a program by hand at any moment.


    - trace breakpoint:

      You can define an address that is compared to the PC after each step.
      If the program has arrived at that address, SIM is entered.

      This feature is used when you cannot use breakpoints for some reasons.


    - 68020 emulation:

      This is also a condition. SIM is only entered when a change in the flow
      would happen, this means that the pc points on a BRA, JMP etc.

      I do not know what this is for, but people like it.


  SIM uses the trace flag to do single steps. What some people do not know is
  that you can trace over some instructions that may clear that flag. These are

   RTE
   MOVE to SR
   ORI #x,SR
   EORI #x,SR
   ANDI #x,SR

  Additionally you can enter the TRAP #x exception routines with the trace.

  Tracing has one weak spot: if you are tracing and an interrupt happens that
  somehow causes entry in SIM (i.e. by a breakpoint), SIM loses the control
  over the trace. When you exit SIM again and the interrupt ends, a TRACE
  exception happens. You must then start to trace again or clear the trace flag
  by hand.



 3.4 The Keyboard
 ================


  The most difficult problems are imposed by the keyboard. The Amigas keyboard
  hardware cannot tell you which keys are pressed at a certain moment, it
  reports only key changes. This makes it difficult for systemindependent
  programs. When you press a key under system and release it in a program
  that has its own keyboardhandler, the system will never know that you
  released that key, it will report repeats of that key all the time until you
  press another key. To prevent this, SIM will look that all keys are in the
  same state when you leave SIM as they were in when you entered SIM. When you
  leave SIM and a key is not in the same state, SIM will ask you to either
  press that key or to release it. Therefore, in the headline you will find the
  keys rawkey number and if in the keymap there is a printable char, that char
  too. You can only exit SIM if you press or release all keys that it wants
  you to.

  If you leave SIM by accident (hit wrong key?) and you are requested to
  press/release a key, you can do the following operation to return to the
  monitor:

  - press another key that is not a qualifier (shift etc.), not 'r', 'e', 't',
    'u', 'n' or one that you must press to exit (esc is a good choice).

  - release all other keys

  - type 'return'

  - release the keys you pressed for that operation

  If you are tired to press keys again and again to exit, you can use the
  flush keystatefield shortcut. SIM will then clear the internal list of
  keys that were pressed when SIM was activated.

  As you know, the keyboard can store upto ten rawkeys on its own if
  the CPU has no time or need to get keyboard events. It is possible
  that several key hits are waiting to be replied. When SIM is activated
  then, it would recieve all those old keys that may invoke shortcuts or
  commands that are not desired. Similar problems occur when you link SIM
  in the CIA-A interrupt and it is invoked before the key is replied. The
  keyboardbuffer killer is used to reply to all possibly waiting keys and
  to flush the keyboard buffer. This feature can be toggled on or off.



 3.5 Disk Access
 ===============


  Because ram is a too transitory datacarier, SIM can read and write
  DOS-tracks and sectors. It does this by directly accessing the hardware.
  Unfortunately, I know only one way to find out if a drive is running or
  not: To activate the drive and look if its on full speed with no delay.
  This system is only working when the running drives have a disk inserted.
  If no disk is in a running drive and you access disk, it will be stoped
  after disk access.

  When SIM is writing or reading, the display is used as buffer. You still
  see it, but it contains chaos. The top line is used to give you status
  information about the track that is operated or errors occured.

  When an error occures, you can either break with CTRL, retry with SHIFT
  or ignore the error with ALT (when file operation, ALT=CTRL).

  When a track is not correct, SIM tries to read it three times. Then it
  reports the error but displays also which sectors were okay. It is
  possible that only one sector is damaged, press SHIFT several times, SIM
  may find some sectores more that are okay and simply were after the damaged
  sector last time.

  SIM is tollerant concerning the integrity of the sectors. Checksums are
  calculated and SIM reports an error if one is wrong, but it decodes the
  sector anyway. This enables SIM to reapair partially destroyed tracks.



 3.6 Files
 =========


  The capabilitys of SIM to read, list and write files are some of its newest
  and most usefull features. You can load any files of a DOS disk, also
  from user directories to memory. You can list the files and their length
  contained in any directory. And you can save any area of memory as a file
  on a disk.

  The file save system is quite sophisticated. It writes files in a way
  that they can be loaded and listed fast. Info- and extension blocks are
  located on track 79 and higher, data blocks from 79 down to 0 and from 159
  to 79. Additionally, SIM will first look if a file fits the disk before
  it begins to save. The bad sideeffect of this is that saving takes some time.

  One thing you must remember is to be carefull with saving files when you
  work with the normal operating system afterwards. When you save a file,
  the bitmap on the disk is changed. The system keeps its own copy of the
  bitmap of a disk in memory. When it accesses that disk again, it possibly
  discovers a totally different bitmap. When it comes to the worst, the DOS
  crashes with the guru 07000007 (bitmap corrupt). To prevent this, you
  simply remove that disk from its drive and put it back again. The DOS
  then rereads the bitmap and everything's okay.



 3.7 Breaking
 ============


  In certain situations, it may be neccessary to break an operation or to
  pause it. SIM can both. You can break the dump commands, find and compare
  by shortly hitting CTRL. If you press it longer, SIM only pauses and
  continues when you release CTRL. When you press SHIFT-CTRL or additionaly
  hit the SHIFT key when you pause, SIM locks until you release, press and
  relese CTRL again. This enables you i.e. to take notes without holding
  CTRL all the time.

  While locked or paused, you can press the ALT key. When you release CTRL
  (if locked, press it first), SIM breaks also. This is used when you have
  paused and want to stop immediately.

  ALT-CTRL is used to break command execution in general. Before SIM looks
  for a new command in a command line, it tests for ALT-CTRL. If that's so,
  it breaks. This enables you to break a commandline like 'P0:X' since you
  cannot break the 'P' and 'X' commands.

  An exception to this rules are the disk operation and the list directory
  command. These commands can only be broken. Therefore simply keep the CTRL
  key pressed until SIM gets it.



 3.8 The Actual Address
 ======================


  The dump and edit commands share a default address variable that is used
  each time, you do not give a startaddress. This address has the name '@'
  for the calculator. It contains the endaddress of the last dump or edit
  command or it is set by find and compare.



 3.9 The Matchbuffer
 ===================


  The matchbuffer is used to collect addresses. You can force the find and
  compare commands to put the addresses they report into this buffer. Well,
  this is nothing special. But you can also say under what conditions an
  address is put in the buffer or one that is allready in buffer stays there.
  There are three possible conditions:


  - old:     If an address that was allready in buffer did not match with any
             reported by the find or compare command, it only stays in the
             buffer when you enable oldies.

  - match:   If an address that is reported is allready somewhere in the buffer,
             it stays only when you enable matches.

  - new:     If an address is new, it is only put in the buffer when you enable
             new ones.

  You can combine the three conditions in any way (there are eight possible),
  some may make not much sence.

  This feature enables you to search for counters or changes.

  To show the addresses in the buffer, the 'k' command is used.

  An example: you are searching for the livecounter in a game. You have five
  lives:

  1. define matchbuffer, i.e. 'k c00000 c10000'
  2. search for 5, i.e. 'f 0 20000 !n 05'
  3. exit and die once
  4. search for 4, i.e. 'f 0 20000 !m 04'
     If you are lucky, one address stays in the matchbuffer
  5. list addresse(s) in matchbuffer, i.e. 'k 0'
  6. if neccessary go to step 3 and search for one live less



 3.10 Command History
 ====================


  SIM remembers the last commands executed in the monitor. I reserved 128 bytes
  for that. These 128 bytes contain the last packed command lines that fit.
  If you get an old command line back by the command history shortcuts and
  execute it, it is not remembered as the newest executed command.



 3.11 Traps
 ==========


  The traps are one of the major connections of sim to the outer world. They are
  used for breakpoints and to handle crashes. You can set the ten basic
  exception vectors directly. When you enter SIM, it puts back the original
  vectors, so you can edit them. When exited, SIM sets the set traps again.

  Problems occure when the program that is debugged sets the traps itself.
  When the program changes a vector previously set by SIM, this is handled the
  same way as it is done with changed breakpoints.

  Additionally you can force SIM to set traps again if they are modified by
  toggeling 'Auto Unmodify Traps' on.



 3.12 Functionkeys
 =================


  You can define all ten functionkeys with a text or command line. If you define
  a text, it is copied at the location of the cursor. If you define a command
  line, it is executed directly.

  The system used bases much on the one used by the Sharp PC-1500, thanks to
  Sharp for that.

  The functionkeys share 300 bytes of 'intelligent' textbuffer with the
  condition breakpoints and linkterms.



 3.13 SIM and the Hardware
 =========================


  SIM does only use a very limited part of the hardware registers, the ones
  that are indispensable or must be set on fix values to provide security.
  Some of these registers can be read, some not. The values of the readable
  ones are remembered in a special part of SIM called 'SIM base' when SIM is
  activated. The SIM base is located, as its name says, at the start of SIM.
  In chapter 6.1 you find the structure of the base.

  These are the registers that are read out and stored in the base at entry.
  When you exit SIM, it copies the remembered values back:


  - DMACON
  - INTENA
  - INTREQ *)

  - Level 2 interrupt
  - Level 3 interrupt

  - CIA-A: CRA
  - CIA-A: CRB
  - CIA-B: CRA
  - CIA-B: CRB

  - CIA-A: PRA write buffer
  - CIA-A: PRB write buffer
  - CIA-A: DDRA
  - CIA-A: DDRB

  - CIA-B: DDRA

  - CIA-A: SR write buffer

  - VPOS **)


  All these registers are used by SIM when working. If you have to know
  what vaule was in one of those, you have to look in the SIM base where SIM
  remembered them.


  *) This register is handled in a special way. While SIM is active, it leaves
  the disk-DMA switched on. If it wouldn't, this would possibly destroy your
  disks. Now since the disk-DMA is left on, remember that when the disk-DMA is
  terminated, bit 1 in the INTREQ is set. But this may happen during SIM is
  active because the DMA was still transfering when the INTREQ was read. Therefore
  you will find only the interrupt requests in the backup that were waiting
  when SIM was activated. If you want to know abaout the actual ones, you must
  read out INTREQR using the calculator command '?[$dff09c].w'.

  When you exit and didn't edit the INTREQ backup, SIM does not restore
  the bits EXTER, DSKSYN, RBF, AUDX, DSKBLK and TBE from the backup. If you
  edited the backup, the bits that are changed are restored , even if they
  contain some of the bits named above.

  **) This value is not written back. SIM rather waits for the rasterbeam
  to be aproximately at that position that it was on when the register was
  read. The register is read at a late point of time when SIM is activated,
  quite some instructions have been executed then, so it is not very precise.
  I hope I can improve that.


  As I quoted, some of the custom register contain information that is lost
  because SIM cannot read from these registers. For the more important
  ones, SIM disposes of an editable list of 'reentry' values it puts back when
  exiting. Those registers are:


  - DIWSTRT
  - DIWSTOP
  - DDFSTRT
  - DDFSTOP
  - BPLCON0
  - BPLCON1
  - BPLMOD1
  - COLOR00
  - COLOR01


  As you see, these registers all concern the display. In most cases, they
  are reset anyway by a copperlist. If not, you have to look in the program
  where it sets them for the initial value and enter it in the base or decide
  on your own what value to use.

  Some of the registers are modified but do not have a reentry value,
  because they are either too temporary (DSKPTX for example) or compleetely
  unimportant (BPL1PTX). If it becomes neccessary, you can edit some with
  the 'e' command:


  - CLXDAT
  - DSKBTR *)
  - DSKPTX *)
  - DSKLEN *)
  - DSKSYNC *)
  - BPL1PTX
  - BPL1DAT
  - SPRXDATA/B
  - CIAA: ICR state and mask


  *) these registers are only used and changed when you read or write from or
  to disk.





*******************************************************************************
 4. Communication between YOU and SIM    
*******************************************************************************



 4.1 The SIM Environement
 ========================


  As I quoted in the chapter about the display, SIM provides its own. It is
  basically used for all output SIM produces (leave alone the printer and
  disk).

  You have a PAL display of 256*640 pixels or 32 lines and 80 rows. The
  screens colors are green and dark blue but may be set by you to any colors
  you like. The screen is devided in header, worktable/debugger window and
  footer, all seperated by a line of '­'.

  The header normally contains the title and copyrights but serves also as
  statusline when accessing disk and keyboard cleanup.

  The worktable and the debugger window share 28 lines.
   - In the worktable, actually the monitor, you can move the cursor around
     and enter commands and get output.
   - The debugger window shows you one or two views of the memory in different
     forms at different addresses, read more about that feature in the
     appropriate chapter.

  The footer contains the cause of SIM's entry, a status and result field
  and the addresses of SIM itself, the display- and backupaddresses.



 4.2 The Monitor
 ===============


  On the worktable, several basic features are provided:

   - What you see on the monitor (the text) is stored in SIM, when you leave
     and enter again, the display will be the same.

   - SIM has two entier keymaps for not qualified,
     shifted, alternated and shifted+alternated keys, one USA and one custom.
     In the original version, the custom one is Swiss.

   - Ctrl+chars with ascii values from $40-$60 will cause a char from
     $0-$20 (i.e. 'J' (=$4a) => <CR> (=$a))

   - Ctrl+chars with ascii values from $60-$80 will cause a char from
     $80-$a0

   - The cursor can be moved around one char by pressing the cursor keys.

   - The cursor can be moved to the extreme positions by pressing
     <SHIFT>+cursor keys (i.e. <SHIFT>+cursor right => cursor in row 79)

   - <DEL> will delete the char above the cursor and shift all chars right
     of the cursor one row left, inserting a space at row 79

   - <BACKSPACE> will clear the char left of the cursor and shift all chars
     above and right of the cursor one row left.

   - <SHIFT>+<DEL> will insert a space at the cursor position and shift all
     chars above and right of the cursor one row right.

   - <SHIFT>+<BACKSPACE> will clear the char above the cursor move the
     cursor one row left

   - <ALT>+<DEL> will clear the monitor part and put the cursor in the left
     upper corner next to a point.

   - <ALT>+<BACKSPACE> will clear the line in which the cursor is, put a '.' in
     row 1 and the cursor in row 2.

   - <HELP> prints the first helppage, starting in the line below the line the
     cursor is in actually.

   - <SHIFT+HELP> prints the second helppage.

   - <F1-F10>: you can freely define the ten function keys.

   - <SHIFT>+<ESC> copies the last executed command in the line of the
     cursor.

   - <ALT>+<ESC> copies the line of the cursor in the command
     buffer. It can then be inserted anywhere by <SHIFT>+<ESC>.

   - <CR> will execute the commands in the actual line (the one in which
     the cursor is).

   - <ALT+CURSOR UP> goes one step back in command history and fill the actual
     line with the actuall command in history.

   - <ALT+CURSOR DOWN> goes one step forth in command history.


   You can execute commands by entering them in one line and pressing
   return. When all commands are executed, SIM looks if a point '.' is in
   row 0 of the actual line. If so, the cursor is set left of it and the
   line is not cleared. If no point is found there, SIM puts one there
   and clears the rest of the line. That way, the point signals wheather or
   not a line is a previous command line. That enables to use again the
   commands that  have been entered earlier and are still visible on the
   screen.


 4.3 The Commands and Their Syntax
 =================================

  As mentioned earlier, SIM understands a vast number of commands.
  While working in SIM, you can get a little overview of them in the two
  helppages:

    n (s)(i) :assemble    | t [s][e][t] :transfer mem | ? [n] :calculate
    e (s)(d) :edit mem    | o [s][e][d] :occupy mem   | w (x) :CPU traps
    d (s)(e) :disassemble | c (s)(e)(t) :compare mem  | v (x) :create trap
    a (s)(e) :show ascii  | f (sejd)(m) :find data    | h (n) :history
    m (s)(e) :show hex    | f (sej'i'i) :find disasm  | g [s] :go sub
    l (s)(e) :show copper | s (p)(b)(c) :set SIM-adrs | i (n) :leave out
    r (rs)   :edit regs   | F (n)(c){@} :edit F-keys  | u     :next step
    k (s)(e) :matchbuffer | z (n*n?cb)  :trace steps  | q/Q   :quit prog
    P (s)(m) :show plane  | b (s)(*n?b) :breakpoints  | x/X   :exit and go

  and

    <s [s][s](n) :read secs   | L [f][s] :load file
    >s [s][s](n) :write secs  | D (n)    :set drive
    <t [s][t](n) :read tracks | D?(n)    :find head
    >t [s][t](n) :write tracks| B [s]    :bootchksum
    >f (n)       :format disk | K [s]    :blockchksum
    S  [f][s][e] :save file   | V (path) :directory

   In the helppage and the explanations, the following shortenings are used for
   options:

  s: (start)address          e: endaddress         t: targetaddress/track
  i: assembler instructions  d: dataline           c: a text or SIM commands
  n: decimal number          x: hexadecimal number m: mask/modulo
  r: register                p: plane              b: backup/breakmode/block
  ?: condition term          f: file               j: jokers

  Options in '[]' are neccessary.
  Options in '()' are optional.
  Chars in '{}' serve as sign or flag.

  Because space in SIM is limited, these helppages tell only the basic
  syntax of a command. Here comes a short but detailed list of all commands
  and what they do:


 Dump Commands
 -------------

    m (s)(e) : print memory as hexdump
    a (s)(e) : print memory as asciidump
    d (s)(e) : disassemble memory
    l (s)(e) : interprete memory as copperlist

   Dump commands have all the same options, only the output changes:

     command (startaddress) (endaddress)

   If you give both addresses, SIM starts to dump from the startaddress and
   stops when the endaddress is reached or passed over.

   If you give only the startaddress, SIM starts to dump from that address
   and calculates an endaddress. That endaddress will be:

    for 'm': start+128
    for 'a': start+512
    for 'd': start+32
    for 'l': start+32

   If you do not give any address, SIM takes the actual address as
   startaddress.

   Do not try to dump the customregisters area.

   In the disassembly, the instructions BSR,JSR and TRAP #x are indented
   and after the instructions JMP, BRA, ILLEGAL, RTS, RTE, RTR and RESET a
   line of '-' is printed for seperation. Additionally, breakpoints are
   marked by an asterix.


   EXAMPLES:

    m 0 100
    a 100
    d
    l 51236 !+60


 Edit Commands
 -------------

    e (s)(d) : edit memory
    n (s)(n) : assemle

   You can modify the memory with these two commands.
   The edit command can write data at a location in the memory (see chapter
   'line forms' for details)

   The assemle command can assemble one or more instructions seperated by a
   ',' at a location in memory (see chapter 'Assembler and Calculator' for
   info)

   If you give both startaddress and data/instructions, SIM simply edits
   the memory.

   If you only give the startaddress, SIM will start to assemble or edit in
   a continuous mode where it allways prepares the next line for further data
   or instructions. To stop this simply give no instruction or data. The
   system is as clever as it recognices if in the line it prepares for a new
   data or assemble line, there is already a data or assemble line that was
   prepared for continuous mode. If that is so, it only updates the address
   but does not clear the line. That enables you to i.e. correct a program
   assembled in continuous mode and to insert instructions.

   If you do not give any option, SIM starts to edit/assemble in continuous
   mode at the actual address.


   EXAMPLES:

    e 70000
    e>00070000: 0121
    n 100 nop


 Transfer and Occupy
 -------------------

   t (s)(e)(t) : Transfer memory
   o (s)(e)(d) : Occupy memory

   Transfer:

   This command simply copies a part of the memory to another location smartly.
   This means that SIM uses as- or descending mode for copying, not to destroy
   the memory:

   - t [s][e][t] : Transfers memory from s to e at new address t


   Occpuy:

   Occupy is generaly used to clear the memory or to fill it with repeated data:

   - o [s][e][d] : Occupy memory from s to e with data d


   EXAMPLES:

   t 0 10000 c00000
   o 12564 !+60 nnop


 Find and Compare
 ----------------

   f (s)(e)(j)(d)(m) - find data
   f (s)(e)(j) i (i) - find disassembly
   c (s)(e)(t)(j)    - compare memory
   k {@}(s)(e)       - show/set matchbuffer

   SIM disposes of a sophisticated find and compare system. For any of the
   three you can specify some jokers:

   - +/-n : Sets a step, only at every nth address is searched or compared.

   - '*'  : To say that all addresses where nothing was found or two bytes
            are the same are reported.

   - '@'  : When you do not want a list of addresses but to have them reported
            one by one, set this joker. SIM will then execute F9 each time
            something is reported and put the active view of the debugger
            window at that address.

   - '!'  : If you want to collect and filter addresses with the matchbuffer,
            set this flag. After the '!' you can enter an 'o' to say that old
            ones stay, a 'm' to say that same addresses stay, or a 'n' to say
            that new ones stay.


   Find data:

   You can search in a defined area in the memory for a certain bytecombination
   with this command. Depending of how many options you enter, the command does
   different things:

   - f [s][e](j)[d][m] : Starts to find from s to e with the jokers j for
     the bytes d that are masked by the mask m. only the bits that are set in m
     are concidered when comparing. If the mask is shorter than the data, the
     rest of the mask will be set to $ff

   - f [s][e](j)[d] :Starts to search for data with all bits set in the mask.

   - f [s][e](j) : Starts to find for the same data with the same mask as last
     time in the area from s to e with new jokers j.

   - f [s][e] : Searches again in the area from s to e.

   - f [s] : Starts to search from s to the last e.

   - f : Continues to find after the last address reported.


   Find disassembly:

   You can find an instruction or a fragment of it in a defined are in the
   memory. Like find data, find disassembly does not need all options:

   - f [s][e](j) i [i] : Starts to find from s to e with jokers j for the
     instruction i.

   - f [s][e](j) : Starts to find for the same instruction in the area
     from s to e with new jokers j.

   - f [s][e] : Searches again in the area from s to e.

   - f [s] : Starts to search from s to the last e.

   - f : Continues to find after the last address reported.

   The instruction i can be only a fragment like '4(a6)' or an entier
   instruction like 'moveq #3,d0'. Several things must be made right:

   - When you have entered a space, SIM will concider what is before the
     space to be the mnemonic. Because the disassembler leaves an eight
     chars large field for the mnemonic where the rest is filled with
     spaces, SIM does tabulate your entries. 'clr.l d0' will internally
     made to 'clr.l   d0'.

   - The char '*' is used as joker. It says that this char is not compared.
     I.e. '(a*)' searches for all indirect accesses with any address register.

   - The char '_' is replaced by a space. I.e. '_d0' searches for
     all accesses on d0 as source ea.

   - The char '@' at the start or the end of your fragment limits the
     search on the start or end of the fragment. I.e. '@st' finds only
     'st.b d0' but not 'tst.l d3'.


   Compare:

   You can compare two areas in the memory. Different amount of options for
   different results:

   - c [s][e][t](j) : Compares area from s to e with area t to (t+(e-s)) with
     jokers j.

   - c [s][e][t] : Compares with no jokers.

   - c [s][t] : Continues to compare from s with t.

   - c [s] : Compares from s to last e with last t

   - c : Continues to compare after last address reported.


   Matchbuffer:

   You can read out or define the matchbuffer:

   - k [s][e] : Defines a new matchbuffer from s to e and clears it.

   - k * : Clears matchbuffer.

   - k ? : Shows you where the matchbuffer is.

   - k @ [s] : Shows all matchbuffer entries larger than s by reporting
     them one by one over F9.

   - k [s] : Lists all entries higher than s

   - k : Lists or shows next entrie(s)


   EXAMPLES:

    f 0 100 00
    f 10000 20000 !nm 05
    f 0 20000 @ imoveq #*,d*
    c 0 100 200 *
    k 100
    k@ 0


 Processor Commands
 ------------------

   r (r)(x) : set/view registers
   w (x)    : set/view traps
   v (x)    : create trap

   Registers:

   The 'r' command is used to either set a register d0-d7, a0-a7, ssp, usp, pc,
   sr, m0-m7 or to view them:

   - r [r][x] : Sets register r vith new value x
   - r        : Views registers
   - r?       : Views memories m0-m7


   Trapsetting:

   The 'w' command is used to either set or clear the ten basic CPU exception
   vectors or to view their status:

   - w [x] : Sets or clears Vector x
   - w     : Lists status of vectors
   - wk    : Clears all traps

   You can set or clear several vectors at a time by seperating the vector
   numbers by kommas. The vector numbers correspond to the exception numbers, 2
   for bus error upto $b for linef.


   Trapcreating:

   The 'v' command is used to simulate the occurence of an exception or to
   remove one from the stack:

   - v [x]  : Simulates exception x
   - v [-x] : Removes exception x from stack
   - v      : Simulates occurence of same exception that forced entry
   - v?     : Gives information about trap that forced entry

   SIM can simulate exceptions 2 upto $40. When you simulate an address or bus
   error, SIM takes either the ssw, ir and aa from the last bus or address
   error or zero for all when none happened yet.

   When you simulate an exception 2 upto $b, which is set by the 'w' command,
   SIM takes the old vector as new pc.

   When you simulate an interrupt, the sr will also contain the interrupt
   level.

   The 'v' command without options is used to put an exception back on the
   stack when i.e. you want the old vector to handle the problem. This works
   only if SIM was entered by one of the exceptions.

   You can only remove traps from the stack when you are in supervisor mode.
   The vector number is only used to know how much has to be taken from the
   stack (14 bytes when 2 or 3, 6 for the rest).

   The 'v?' command is used to know more about the exception, especially
   address and bus errors.


   EXAMPLES:

   r pc pc+20
   r m7 d0
   r?
   w 4,9
   wk
   v 3
   v -3
   v?


 Breakpoints and Trace
 ---------------------

   b (s)(j)  : set/clear breakpoints
   u         : nextstep
   z (j)     : tracestep
   i (n)     : leave out instructions

   Breakpoints:

   The 'b' command is used to handle breakpoints. Different options are
   available:

   - b [s][j] : Sets a breakpoint at address s with the options:

     - 'l' or 'r' or 'f' : button breakpoint
     - [n]               : counter breakpoint
     - '?' [n]           : condition breakpoint
     - '*'               : resident breakpoint

   - b [s] : Sets a simple breakpoint

   - b : Lists all breakpoints

   - bj [s] : Sets a JSR breakpoint at s

   - bs [s] : Sets a STACK breakpoint at s

   - bk : Kills all breakpoints

   You can seperate several breakpoints at a time by seperating the next
   address from the previous address or options by a komma.


   Trace:

   The 'z' command executes tracesteps. It either stops after one step or when
   a certain condition is fullfilled:

   - z [j] : Does trace until:

     - 'l' or 'r' or 'f' : trace until button pressed
     - [n]               : trace n steps
     - '?' [n]           : trace until n not zero
     - '*' [s]           : trace until pc=s
     - 'c'               : emulate 68020 trace

   - z : Does one tracestep


   Nextstep:

   The 'u' command does either one tracestep or when it is done at a JSR, BSR
   or TRAP #x, it does also a tracestep and sets a stack breakpoint at a7
   (or a7+2 when TRAP) and exits:

   - u : Do one nextstep


   Leave Out:

   This simply leaves instructions away:

   - i [n] : Leaves out n instructions

   - i : Leaves out one instruction


   EXAMPLES:

    b 100 *j100 ?[4]<>$c00276
    bj 100,200
    bssp
    z *pc
    z j
    n
    i 2


   Flow
   ----

   x     : Exit
   X     : Exit directly
   q     : Quit
   Q     : Quit directly
   g [s] : go to subroutine
   h (n) : history

   Exit:

   The 'x' or 'X' commands are used to simply continue the program at full
   speed. 'x' asks first if you are sure, 'X' simply exits:

   - x : Exits, but asks for confirmation first

   - X : Exits directly


   Quit:

   The 'q' or 'Q' commands are used to return control to the debug server.
   'q' asks first if you are sure, 'Q' simply returs directly:

   - q : Quits, but asks for confirmation first

   - Q : Quits directly


   Gosub:

   The 'g' command is used to execute a little program from SIM:

   - g [s]  : goes to subroutine at s

   - gw [s] : goes to subroutine at s but does not exit yet

   When SIM goes to subroutine, it first pushes the old pc on the stack and then
   the return address for the rts.

   The 'gw' command does only prepare the stack for the operation but does not
   exit yet. This is i.e. used to trace a subroutine.


   History:

   SIM remembers the last five sets of registers as they were when SIM was left
   for the last five times. The list is also updated after each step when doing
   conditioned trace:

   - h [n] : Print nth last history

   - h : Print all five histories

   SIM does not only remember the registers d0-a6, usp, ssp, sr and pc but
   also the instruction at the pc because of selfmodifying code.


   EXAMPLES:

   h 3
   X
   q
   g 100
   gw 200


   Diskoperations
   --------------

   D  (n)       : set drive
   <t (s)(s)(n) : read track
   >t (s)(s)(n) : write track
   <s (s)(s)(n) : read sector
   >s (s)(s)(n) : write sector
   >f (n)       : format disk


   Set Drive:

   The 'D' command is used to set the drive number that is used for further
   diskoperations (tracks, sectors or format, but not fot file operations!)
   or to ask for the actually used drive or to ask for the position of the
   head of a drive:

   - D [n] : Takes drive n (0-3) as actual drive

   - D : Shows actual drive

   - D? [n] : finds position of head of drive n

   - D? : finds position of head of actual drive

   The headposition is reported as logical track, the sideselect bit will be
   concidered when calculating the position. Well, in most cases (DOS included)
   the sideselect bit will be set directly before DMA access and put to an
   undefined state afterwards. If that is so when you use this command, you
   must find the side that is used on your own, analyze the diskroutines.


   Read Track:

   The '<t' command simply reads entier logical tracks (0-159) somewhere into
   memory:

   - <t [s][t][n] : Reads n tracks starting with t to s

   - <t [s][t] : Reads one track t to s

   Well, SIM does not test where the data is read, you simly should not
   'overread' the display or SIM.


   Write Track:

   The '>t' command writes an area of the memory as logical tracks on disk:

   - >t [s][t][n] : Writes n tracks starting with t, data start at s

   - >t [s][t] : Writes one track t, data start at s


   Read Sector:

   With the '<s' command you can now read single sectors from disk to memory:

   - <s [s][b][n] : reads n sectors starting with b to s

   - <s [s][b] : reads one sector b to s


   Write Sector:

   With the '>s' command you can write single sectors from disk to memory:

   - <s [s][b][n] : writes n sectors starting with b, data start at s

   - <s [s][b] : writes one sector b, data start at s

   The sector writeroutine is clever enough. If you only write some
   sectors of a track, it reads the rest of them from disk to complete the
   track and writes the track afterwards.


   Format Disk:

   Because you can now save files, you may have to make a datadisk first.
   The '>f' command is used to format and initialize a disk:

   - >f [n] : Formats disk in drive n

   - >f : Formats disk in actual drive

   You can't yet enter a name for the disk, it will automatically be
   'DATA-DISK'. The creation date is zeroed too. But the DOS cannot seperate
   disks with the same name and same date. So never keep two datadisks
   in two drives simultaneously, your machine would crash if you do so.

   If you format a disk that was previously in a drive and you return to DOS,
   remove and reinsert that disk for the DOS must know the new name and new
   bitmap.


   EXAMPLES:

    <t c00000 0 80
    >t c00000 0 80
    >s 70000 0 2
    <s 60000 880
    D1
    D? 2
    >f 0


   Fileoperations
   --------------

   L [f][s]    : Load file
   S [f][s][e] : Save file
   V (path)    : List directory


   Paths and filenames can either be given plainly or between ' or ".
   The only devices known are DF0:, DF1:, DF2: and DF3:, disknames
   are not supported.


   Load File:

   This command loads a file directly into memory:

   - L [f][s] : Loads file f to s

   Just make sure that you don't load files over SIM or the display.


   Save file:

   With this command you can save an area of the memory as file:

   - S [f][s][e] : Saves memory from s to e as file f

   This command is also used to delete files. To do so simply save a file
   with the name of the file you want to delete and the same start- and
   endaddress (filelength=0).

   List Directory:

   This command is used to list the directory of a disk or a user directory.

   - V [path] : Lists directory of directory specified by path.

   - V : Lists directory of last drive used for fileoperations.

   SIM reads the directory page by page because the display is used as buffer.
   If a page is full or the directory is read, it displays it. If there stays
   stuff to be displayed, SIM writed 'more' in the footer. You can then continue
   by pressing <SPACE>


   EXAMPLES:

    L 'df0:c/dir' 60000
    S df1:data 0 100
    V df0:c


   Miscellaneous
   -------------

   ? [n]{,}(n) : Calculate
   F (n)(c){@} : Define functionkeys
   P (s)(m)    : Start graphic searcher
   s (p)(b)(c) : Set display, backup and program addresses
   l*          : Show copperlist
   l? (s)(e)   : Find active copperlist
   l= [n]      : Find copperlist one or two


   Calculator:

   If you need to calculate something, you can do it with the '?' command.
   SIM will calculate the result of one or several terms and return the
   result(s) as hexadecimal, signed hexadecimal, decimal and binary number
   and as ascii chars:

   - ? [n] : calculate result of n

   You can calculate the result of several terms at the same time by seperating
   the terms by a komma.


   Functionkeys:

   The 'F' command is used to set and view the functionkeys functions:

   - F [n][c] @ : Occupys Fkey n with commandline c that is executed directly
   - F [n][c]   : Occupys Fkey n with text c
   - F [n]      : Clears Fkey n
   - F          : Lists Fkeys

   When you set a functionkey, the entier rest of the commandline will be
   taken for the command or text.

   When you list the functionkeys, the ones that are locked by Amiga-Fx are
   marked by an asterix, the directly executable have an '@' at the end.


   Graphic Searcher:

   The 'p' command starts the graphic searcher:

   - P [s][m] : Starts at address s with modulo m
   - P [s]    : Starts at address s with last modulo
   - P [s]    : Starts at last address with last modulo

   When you activated the graphic searcher, several keys are used for
   display modifications:

   Cursor up:         Scrolls plane one line down

   Cursor down:       Scrolls plane one line up

   Cursor left:       Scrolls plane one line right

   Cursor right:      Scrolls plane one line left

   Shift+Cursor up:   Scrolls plane one screen down

   Shift+Cursor down: Scrolls plane one screen up

   Help:              Modulo=modulo+2

   Del:               Modulo=modulo-2

   Shift+Help:        Modulo=modulo+16

   Shift+Del:         Modulo=modulo-16

   Backspace:         Modulo=0

   Return:            Switches between hires and lores

   Control:           Ends graphic searcher

   The graphic searcher should recognize additional chipmem at $80000


   SIM Addresses:

   The 's' command is used to transfer the display and backup and the SIM
   code itself:

   s [p][b][c] : New display at p, new backup at b and SIM copied to c
   s [p][b]    : New display at p, new backup at b and SIM stays where it is
   s [p]       : New display at p, backup and program stay where they are
   s           : Repaints the display

   The 's command will mostly be used to transfere the display at another
   location when you want to look at the memory where the display is.

   Be carefull when you transfer the SIM code. SIM does adjust breakpoint and
   traps to the new address. But a possible debug server will only know
   about the new location when you quit. The old copy of SIM will still work,
   but its breakpoint and trap system will be confused. Use it only when the
   system is dead. Also do not copy SIM below $70!


   Copperlist:

   The 'l' command is basically used to disassemble a copperlist. The
   following variations are used for different actions:

   - l*        : Shows the active copperlist

   - l? [s][e] : Starts to search for the copperlist from s to e

   - l? [s]    : Starts to search for the copperlist from s to $80000

   - l?        : Starts to search for the copperlist from $70 to $80000

   - l= [n]    : Starts to search quickly for copperlist 1 or 2

   To end copperlist display or searching, press <CTRL>.

   When you search quickly, the copperlist you are looking for will be
   activated. If this one is not the running one, search again for the other to
   set the other copperlist again.


   EXAMPLES:

   ? 256*5,52*56
   F10 r:dpc pc@
   F
   P 12356 52
   s 70000 c50000 c40000
   l*
   l=1
   l? 20000


 Debugger Window Support
 -----------------------

  A [s]    : Set new startaddress
  T [s]{@} : Set linkterm


  These two commands are used to set new startaddresses for the views of
  the debugger window.


  Startaddress:

  With this command you can directly set the startaddress of the active view:

  - A [s] : Set new startaddress of view to s


  Linkterm:

  To set a linkterm for a view, you use the 'T' command. SIM will calculate
  the result of this formula and use it as new startaddress each time it is
  entered:

  - T [s] @ : Set smart linkterm for active view

  - T [s] : Set simple linkterm for active view

  When SIM calculates a simple linkterm, it takes the result as new
  startaddress. The result of a smart linkterm is only used as new startaddress
  if it is not in the frame of the view. Normally this is only used to link
  a view to the PC.


  EXAMPLES:

  A a0+56
  T a0+d0
  T pc @



 4.4 The Debugger Window
 =======================


  This is one of the later achievements done. You can switch it on or off by
  pressing <esc>. When you do so, a part of the wortable is locked for the
  cursor and used to print out the registers and one or two different
  views of the memory in different forms (hex, ascii etc.). The window is
  updated as soon as you execute a command that may change the memory and
  at entry of SIM.

  The two views have two startaddresses that are stored in m0 and m1.
  m1 is unused when you did not splitt the window and use only one view.

  You can link the two views to two formulas, the socalled 'linkterms'.



 4.5 Debugger Window Shortcuts
 =============================


  If you have to deal with the window, you do this by use of shortcuts that
  are qualified by either left or right Amiga. If you splitted the window,
  you can select the view that recieves the command by pressing <TAB>.


 Window Handling
 ---------------

  <cursor up>     Decreases the views startaddress and scrolls the
                  content one line down. How much the startaddress is decreased
                  depends on what the window output form is:

                   - disassembly: the length of the instruction above the
                     startaddress.
                   - hexdump:     16 bytes.
                   - asciidump:   64 bytes.
                   - copperdump:  4 bytes.

  <cursor down>   Increases the views startaddress and scrolls the
                  content one line up. How much the startaddress is decreased
                  depends on what the window output form is:

                   - disassembly: the length of the instruction at the
                     actual startaddress.
                   - hexdump:     16 bytes.
                   - asciidump:   64 bytes.
                   - copperdump:  4 bytes.

  <cursor left>  Decreases the views startaddress one or two bytes:

                   - disassembly: two bytes.
                   - hexdump:     one byte.
                   - asciidump:   one byte.
                   - copperdump:  two bytes.

  <cursor right> Increases the views startaddress one or two bytes:

                   - disassembly: two bytes.
                   - hexdump:     one byte.
                   - asciidump:   one byte.
                   - copperdump:  two bytes.

  <shift cu>     Decreases the views startaddress and moves back to last
                 page, depending on the output form:

                   - disassembly: the sum of instruction lengths of the number
                     of instructions fitting the window back from the actual
                     startaddress.
                   - hexdump:     <number of lines>*16 bytes.
                   - asciidump:   <number of lines>*64 bytes.
                   - copperdump:  <number of lines>*4 bytes.

  <shift cd>     Increases the views startaddress and moves to next
                 page, depending on the output form:

                   - disassembly: sets startaddress to the address of the
                     instruction following the last one visible.
                   - hexdump:     <number of lines>*16 bytes.
                   - asciidump:   <number of lines>*64 bytes.
                   - copperdump:  <number of lines>*4 bytes.

  <alt cu>       Decreases the size of the debugger window by one line.
                 The minimum size is one line. The space that becomes free
                 for the monitor is cleared with spaces.

  <alt cd>       Increases the size of the debugger window by one line.
                 The maximum size is as large as there stays one line for the
                 monitor. If the cursor was in the line now belonging to the
                 debugger window, it is moved to the line below which is then
                 initialized.

  <shift alt cu> Works only when you splitted the window. This moves the bar
                 seperating the two views one line up, which decreases the
                 upper view and increases the lower view one line.

  <shift alt cu> Works only when you splitted the window. This moves the bar
                 seperating the two views one line down, which increases the
                 upper view and decreases the lower view one line.

  <s>            Splitts or unsplitts the window into two views. When you
                 unsplitt, the startaddress and linkterm of the active view
                 are taken as the one of the now single view, the ones of the
                 inactive view are stored and taken as the ones for the second
                 view when you splitt again.

  <r>            This recalculates the linkterm(s) and sets the
                 views startaddresses again.


  Output Form Selection
  ---------------------

  <a>            Selects asciidump for the active view.

  <m>            Selects hexdump for the active view.

  <l>            Selects copperdump for the active view.

  <m>            Selects disassembly for the active view.


  Breakpoints
  -----------

  <b>            Sets a simple Illegal breakpoint at the startaddress of
                 the active view.

  <v>            Sets a resident Illegal breakpoint at the startaddress of
                 the active view.

  <B>            Sets a JSR-breakpoint at the startaddress of the active view.


  Flow
  ----

  <z>            Does a tracestep.

  <u>            Does a nextstep that does not follow into subroutines.

  <i>            Leaves out one instruction/puts pc to next instruction.

  <x>            Exits SIM.

  <q>            Exits SIM and goes back to debug server.

  <g>            Leaves a subroutine. Therefore SIM puts a STACK-breakpoint at
                 the actual stackpointer and exits. Do not use this when the
                 subroutine has allready put more data on the stack.

  <j>            Sets the pc to the startaddress of the active view.


  Edit
  ----

  <e>            Starts to edit in loopmode at the startaddress of the
                 active view.

  <n>            Starts to assemble in loopmode at the startaddress of the
                 active view.

  <N>            Replaces the Instruction at the startaddress of the active
                 view by NOPs.


  Indirects
  ---------

  <[>            Goes to next higher indirectlevel and takes the longword
                 at the startaddress of the active view as the new
                 startaddress and stores the old one.

  <]>            Goes to last indirectlevel and takes the stored
                 startaddress as the new one.

  <{>            Same as <[> but the longword will be taken as BCPL and
                 multilied by four.

  <}>            Goes to next higher indirectlevel and takes the stored
                 address of that one as the new startaddress.


  Find
  ----

  <f>            Continues to search at the startaddress of the active
                 view.

  <c>            Continues to compare. The source address will be the
                 startaddress of the first view , the destination address
                 the  startaddress of the second view.


  Miscellaneous
  -------------

  <p>            Toggles the printer on/off. The printer can only be
                 activated if there is an active one connected to the parallel
                 port.

  <h>            Makes a hardcopy of the actual display by printing it as
                 text.

  <k>            Toggles between US keymap and custom keymap (originally CH)

  <!>            Flushes keystatefield, see chapter 'the keyboard'.

  <?>            Toggles keyboardbuffer killer, see chapter 'the keyboard'

  <\>            Toggles Auto-Unmodify Traps. When this feature is switched
                 on, all modified traps are set again when you leave SIM.

  <F1-F10>       Toggles availability of funktionkeys.

  <0-9>          Takes one of the ten position memories as the startaddress
                 of the active view.

  <shift 0-9>    Works only with the keypad! Stores the startaddress of the
                 active view in one of the ten position memories.


  Most of these shortcuts are only functioning when the debugger window is
  activated. Only  <h>,<p>,<!>,<?>,<F1-F10>,<k>,<z>,<u>,<i>,<q> and <x>
  are allways functioning.





*******************************************************************************
 5. Additional Information
*******************************************************************************



 Assembler and Calculator Syntax
 ===============================


  The assembler used in SIM is entierly home-made and is fully
  motorola compatible. Anyway, some special features have been added
  to increase userfriendlyness:

  - You can use 'add' instead of 'addi', 'adda' and 'addx -(ax),-(ay)'
    This is also valuable for 'sub'.

  - 'cmpm', 'cmpi' and 'cmpa' can be replaced by 'cmp'

  - You can use 'eor' instead of 'eori'. This also works with 'and' and 'or'

  - Bcc xxxx, DBcc Dx,xxxx, xxxx(PC) and xx(PC,Rx) use absoulute addresses.
    This means that when you want to have a code like

            60010: bra $60000

   you can enter 'bra $60000'. If you want to give the offset directly,
   you have to put a '+' or a '-' in front of it:

            60010: bra -$12

    But remember: The Offset has allways to be:

            (targetaddress-instructionaddress+2)

  - If no size is given, Bcc will be short if possible.

  - If no size given, direct addresses are word if possible.

  - DC.W or DC.L can be used, but only one value is allowed.

  - If you do not give an instruction size, the default size is
    taken, which in most cases is WORD.

  - The interpreter is very tollerant, even a line like

        move.l    (  $75 ) (   PC  , D7.l  )  , ( $4 ).w

    will be accepted and assembled correctly.



                             -------------------



  The calculator used in SIM is also entierly home-made. It disposes
  of several very useful operations and value forms. The calculator is used
  when you have to enter a number. Just have an overview of the operations
  supported, sorted by their priority:

   -   - Prefix change: Changes a positive value to a negative and vice
         versa.

   ~   - Logical NOT: Changes the state of all 32 bits of the value.
         For example: ~5 is -6.

   .s  - Size a value: Any value will be extended to LONG from the size you
         define. For example: $89.b will then be made to $ffffff89.

         The size given is also important for the assembler when using direct
         long or short address.

   []  - A value in these brackets will be used as an address and the
         content of the memory at that address will be taken.

         A size directly after the closing bracket will define if
         the value will be taken as a BYTE, WORD or LONG and extended
         to LONG. For example: [4].l gets the execbase ($676 or $c00276)
         [$dff002].w reads out the actual DMACON as a WORD.

   *,/ - Multiply or divide long, considering if the values are positiv
         or negativ. For example: -$56*5 is fffffe52.

   \   - Gets the modulo of a long division. For example: 11\4 is 3.

   +,- - Addition or Subtraction, allways long.

   <<  - Shift value left: this corresponds to a multiplication with 2
         to the nth power, whereas n is the numer of bits to be shifted.
         For example: $20<<8 is $2000.

   >>  - Shift value right: this corresponds to a division by 2
         to the nth power, whereas n is the numer of bits to be shifted.
         For example: $2000>>8 is $20.

   &   - Logical AND.

   !   - Logical Exlusive OR

   |   - Logical OR

   <>  - Not equal: If the two values are not equal, this returns true
         (=$ffffffff), otherwise false (=0).

   =   - Equal: If two vales are equal, this returns true.

   <=  - Less or equal: Returns true, if the first value is less than
         the other or at least equal.

   =>  - Higher or equal: Returns true, if the first value is higher than
         the other or at least equal.

   >   - Higher: Returns true, if the first value is higher than the other.

   <   - Less: Returns true, if the first value is less than the other.


   As for the forms of values, SIM understands these:


   $x  - Hexadecimal number: A number in hexadecimal form
                             consisting of max. 8 digits 0-9 and a-f.

   #x  - Decimal number: A number in decimal form
                         consisting of digits 0-9.

   %x  - Binary number: A number in binary form
                        consisting of max. 32 digits 0 and 1.

   "/' - ASCII chars: A number consisting of max. 4 ASCII chars.
         f.e.: "SIM!" or '!MIS'

   !   - Stands for the last result. This enables you to do things
         like: m 61f35 !+39dc = "Show memory from $61f35 to $61f35
         plus 39dc".

   @   - Stands for the actual address. This is the address, SIM uses as
         standart workaddress for dump commands.

   SIM - The program and base address of SIM

   D0-D7,A0-A7,PC,SP,SSP,USP,SR,CCR and M0-M7 - The registers. The calculator
         can directly use the content of these registers. SSP is the supervisor
         stack pointer, USP the userstack pointer SP and A7 the actual stack
         pointer. I.E. when you are tracing a program, and you want to know,
         what is at the address  56(a0,d7.w), you can use 'm 56+a0+d7.w'.


  The end of a term is usualy set by a space, a komma, a semikolon, a
  doubble point or a <CR>. Actually, when you have opened a bracket, you
  can have spaces between operators and values, but ONLY then. Otherwise, the
  end of the term will not be there where you wanted.

  Not to forget: some 120 brackets are allowed, more than you will ever use.

  Actually the calcualtor can work in decimal or hexadecimal mode.
  In decimal mode you do not have to write the '#' before a decimal number,
  but for hexadecimal numbers, the '$' is neccessary.
  In hexadecimal mode you do not have to write the '$' before a hexadecimal
  number, but for decimal numbers, the '#' is neccessary.

  Hexadecimal mode is usually used to get addresses (s,e,t,b,p)
  or hexnumbers (x). For all other cases decimal mode is used, also for
  assembler.



 5.2 Line Forms
 ==============


  There are two types of lines you have to differe: the command line
  and the data line.

  - The command line is the one that contains the different commands
    you want to execute. This line has usualy that form:

              .<command> <options> (: <command> <options> ...)

    You see, you can enter several commands in one line, seperated by a
    doubble point. The doubble point is needed, except if the next char is
    the same as of the last executed command (i.e. 'mmmm' is allowed and shows
    $200 bytes at once, starting at the actual address).


  - The data line is of another kind. Whenever you have to enter datas
    directly, for edit, find, occupy etc., you enter a data line. This
    dataline can consist of this four elements, allways seperated by a komma:

   - Hexnumbers: Are introduced with or without '$'. They can be as long as
     you want. The hexnumber is ended by a char that is no number and
     not 'A','B','C','D','E' or 'F' (lower case letters also included)
     If you enter an odd number of digits, the last digit will be taken as
     byte, its higher nibble zeroed. Spaces are allowed between digits.

   - Assembler instructions: Are initiated by a 'n', then the instruction
     follows.

   - Calculator terms: Are initiated by a '?', then the term follows.
     The size of the result will be considered (LONG=4 bytes,WORD=2 bytes
     and BYTE=1 byte).

   - Ascii chars: Are either initiated by ' or " and closed with the
     same or a <CR>.


     Now an example, using all the elements from above. You enter:

       45,"BDH",njmp $60000,?[$fc0000].w,6666

     And the result are these 14 bytes:

       45  42 44 48  4e f9 00 06 00 00  11 11        66 66
       |-  |-------  |----------------  |----        |----
       |   |         |                  |            |
       45  "BDH"     jmp $60000         [$fc0000].w  6666


   A dataline ends at a space or an illegal char. Between the komma that
   seperates two datatypes and the next datatype there can be spaces. also
   between hexdigits (only when editing, not find and occupy).



 5.3 The Debug Server Entrance
 =============================


  The debug server entrance is specially concieved for the cooperation
  between SIM and another debugger or loader, i.e. SIM-BUG. It enables
  The debug server to give control over a program to SIM and SIM to return
  control to the debug server.

  How this is done? Well, in a part of the SIM base, there is space to store
  the registers d0-a6, USP and SSP, SR and PC of the program that is
  monitored. The debug server can fill in this table. Additionally, It can
  specifie a reentry PC, SR, USP and SSP. When it enters SIM by the debug
  server entrance, SIM takes the registers out of the table and copies them
  into the workregister buffer. SIM has now the control over the program.

  Now, when you are in SIM and want to give control back to the debug
  server, you can use the 'q' command (or 'Q' or AMIGA-q). SIM does then
  copy the workregisters back into the base area and takes the reentry PC, SR
  USP and SSP as the actual ones. To be sure that the debug server is still
  there, SIM looks at the address <reentrypc-4> if the longword $4f4b4159
  ("OKAY") is there. If the longword is there, it exits. That way, it returns
  to the address specified by the reentry PC with reentry stacks and a reentry
  SR. The registers do not contain sencefull information, appart a6 which
  contains the base/codeaddress of SIM. In case you transfered SIM, the
  debug server knows where you put it.

  The debug server can now read out the table with the registers and use
  them for itself.



 5.4 The SIM Base
 ================


  At the start of the SIM program, the differente entrances are located,
  the backups and reentry values and the debug server datastructure. The
  structure of this base is documented here. The offsets described won't
  be changed in higher versions, I hope, but I feel free to extend it at
  the upper end.


--------------------------------------------------------------------------------
 The S.I.M. Base Structure
--------------------------------------------------------------------------------

;--- Base ---------

 struct toolbase       ;+0  The startadress of S.I.M. in memory


;--- Display ------

 aptr  plane           ;+0  The startaddress of the $5000 bytes display ram
                            (must be chipmem!)
 aptr  backup          ;+4  The startaddress for the backup of the display.
                            When not zero, S.I.M. will copy what is in the
                            memory of the future display to this part of memory
                            when entered and copy it back when left.


;--- Entrances ----

 jmp   entrance1       ;+8  Entrance for JSR. Here you can simply enter S.I.M.
                            by a 'JSR to this address.
 jmp   entrance2       ;+12 Entrance for Exec's traphandle. When you want to
                            use S.I.M. as traphandler of your task, write this
                            address to <taskstruct+50>.
 jmp   entrance3       ;+16 Debug server entrance.

 long  0               ;+20 *** RESERVED FOR EXPANSION ***


;--- Our Traps ----    ;When a trap is set directly, its vector is set to
                        the corresponding entrance in here.

 jmp   entrance22      ;+24 Bus error
 jmp   entrance23      ;+28 Address error
 jmp   entrance24      ;+32 Illegal instruction
 jmp   entrance25      ;+36 Divide-by-zero
 jmp   entrance26      ;+40 CHK instruction
 jmp   entrance27      ;+44 TRAPV instruction
 jmp   entrance28      ;+48 Privilege violation
 jmp   entrance29      ;+52 Trace
 jmp   entrance2a      ;+56 Op Code 1010
 jmp   entrance2b      ;+60 Op Code 1111


;--- Signal -------

 long  "SIM!"          ;+64 This Long signals that this is S.I.M.
 long  version         ;+68 Version of S.I.M. as 4 ASCII chars


;--- Backups ------    ;when S.I.M. is entered it backups some customregisters
                        and vectors here.

 word  dmacon          ;+72 $DFF096/002
 word  intena          ;+74 $DFF09A/01C
 word  intreq          ;+76 $DFF09C/01E
 long  level2          ;+78 $68
 long  level3          ;+82 $6C

 byte  ciaacra         ;+86 $BFEE01
 byte  ciaacrb         ;+87 $BFEF01
 byte  ciabcra         ;+88 $BFDE00
 byte  ciabcrb         ;+89 $BFDF00
 byte  ciaapra         ;+90 $BFE001
 byte  ciaaprb         ;+91 $BFE101
 byte  ciaaddra        ;+92 $BFE201
 byte  ciaaddrb        ;+93 $BFE301
 byte  ciabddra        ;+94 $BFD200
 byte  ciaasp          ;+95 $BFEC01
 long  vpos            ;+96 $DFF004

;--- Reentry ------    ;Reentry values of things that can't be saved.
                        When S.I.M. is left, it inits the registers named
                        with the values in this list.

 word  $2981           ;+100 DIWSTRT
 word  $29c1           ;+102 DIWSTOP
 word  $0038           ;+104 DDFSTRT
 word  $00d0           ;+106 DDFSTOP
 word  $5200           ;+108 BPLCON0
 word  $0000           ;+110 BPLCON1
 word  $0000           ;+112 BPLMOD1
 word  $0000           ;+114 COLOR00
 word  $0000           ;+116 COLOR01

;--- ICR Special --    ;The ICR data and mask.

 byte  lasticr         ;+118 $BFED00 read
 byte  reentryicrmask  ;+119 $BFED00 write

;--- Distances ----    ;Distances to internal structures.

 long  disasscalc-base ;+120 Distance to disasscalc module
 long  preferences-base;+124 Distance to preference structure

;--- Debug --------    ;Debug server structure for entrance 3.

 long  0               ;+128 Offset from base to end of inited part
 long  "????"          ;+132 Sign of server

;--- Program ------    ;The registers of the program that is debugged.

 long  0               ;+136 Register d0
 long  0               ;+140 Register d1
 long  0               ;+144 Register d2
 long  0               ;+148 Register d3
 long  0               ;+152 Register d4
 long  0               ;+156 Register d5
 long  0               ;+160 Register d6
 long  0               ;+164 Register d7
 long  0               ;+168 Register a0
 long  0               ;+172 Register a1
 long  0               ;+176 Register a2
 long  0               ;+180 Register a3
 long  0               ;+184 Register a4
 long  0               ;+188 Register a5
 long  0               ;+192 Register a6
 long  0               ;+196 User stack pointer
 long  0               ;+200 Supervisor stack pointer
 long  0               ;+204 PC of program
 word  0               ;+208 SR of program

;--- Server data --

 long  0               ;+210 Reentry routine of server
 long  0               ;+214 Reentry usp of server
 long  0               ;+218 Reentry ssp of server
 long  0               ;+222 Reentry sr of server

;--- Extension ----

 aptr  0               ;+224 Pointer to zero ended list of aptrs that point
                             to zero ended texts. The texts in this list are
                             printed and the pointer is cleared
 aptr  0               ;+228 Pointer to task structure, currently unused
 aptr  0               ;+232 Segmentlist, currently unused
 aptr  0               ;+236 Symbollist with labels, currently unused

;--- End ----------    ;+240 This is the end of the actual structure

--------------------------------------------------------------------------------


 5.5 Errors
 ==========


 SIM is a flexible tool. Therefore the user can do many mistakes.
 In this chapter, all errors are explained. When an error occurs that
 bases on an error in the command line (which in fact is in most cases so)
 SIM prints the error text in the line of the cursor and copies the command
 line in the next line. The cursor is in the line of the copied command line
 below the char or the word that probably caused the error.


 Assembler errors:

   illegal instruction:
     The assembler does not know this instruction.

   illegal value:
     An number is higher or less than it should be.

   illegal ea:
     This 'effective address' is not allowed. In fact it has not allways
     to be an effective address for the assembler uses the same routine for
     all source- and destinationterms.

   illegal size:
     An instruction has either no size at all or does not support the
     one you have given.

   illegal operator:
     An operator is not just as it should be.

   line malformed:
     Something is undefinably wrong.

   too few info:
     Some part of this instruction is missing.

   illegal sea:
     An illegal effective address as source.

   illegal tea:
     An illegal effective address as destination.

   illegal char:
     The assembler is suprised to find that char.

   illegal condition:
     The condition of a Bcc, DBcc or Scc is inexistent.

   illegal direction:
     The direction for bitshifting is neither left nor right.


 Calculator errors:

   bracketerror:
     You have opened more brackets than you closed or vice versa.

   overflow:
     The result is larger than $ffffffff or ±$8000000, or you
     have divided by zero or you do more than 30 operations.

   illegal value:
     The calculator cannot interprete that as a number.

   illegal operator:
     This is no operator for mathematical operations supported by the
     calculator.

   no value given:
     You have forgotten to give a term, or the very first value of an
     expected term is of an unknown type.


 SIM errors:

   too much:
     The startaddres given for a command is higher than the endaddress.

   breakpointerror:
     SIM has no more breakpoints free or it could not set a breakpoint there,
     either because ROM is read only or it is not possible to put breakpoints
     in the memory presently occupied by the SIM code.


 Diskaccess errors:

  disk error:
    Something went wrong with the diskaccess, either the track that is read
    is damaged or the disk was writeprotected. In most cases you will get a
    warning in the statusline of the diskaccess display.

  file not found:
    SIM could not locate the file you want to load or a directory in its path.

  not enough space:
    When you want to save a file, SIM first checks if the file would fit.
    If it wouldn't, this error is returned.

  disk full:
    That error should not occure.

  directory error:
    If something goes wrong in the line of the listing of the directory,
    i.e. bad hashes or disk damaged, this error is returned.

  illegal path:
    SIM cannot locate the directory you want to list.


*******************************************************************************
 6. Greetings, Thanks, Support and about Future Releases
*******************************************************************************


 6.1 Thanks
 ==========


  Big thanks must go to my friend Daniel Weber for continuous testing of all
  new features I inserted, some good and some bad ideas and severe criticism
  of all the work I did.

  Thanks must also go to all the other people who reported me their ideas
  and gave bugreports:  Christian Schneider, André Dietisheim, Oliver Fehrlin,
  Stefan Strasser.

  Also to Yello, Depeche Mode, Kitaro, Star Inc., Mike Oldfield, Guru Josh,
  Enigma, New Order, Vangelis, J.M. Jarre, Harold Faltermeyer, Art of Noise,
  Alan Parson Project, Die Toten Hosen and Megatron for cool background music.


 6.2 Greetings
 =============


  Greetings go to all members of my crew, to my few contacts, to the makers of
  Amiga Action Replay (especially Lord Olaf), to SCA (for the RomCrack),
  to Graftgold for converting Rainbow Islands and to all Beerbrewers (for
  beeing).


 6.3 Support
 ===========


  The following is a short list of products supporting SIM.

        - FlyMon (assembler monitor)

        - NOG2   (trap- and exceptionhandler)

        - ProAsm (integrated editor/assembler/debugger)

        - SIMBUG (SIM loader)

  You are welcome to contact me if you want detailed information about how to
  support SIM correctly in your own programs. If you code a program that will
  support SIM, you are also welcome to tell me so, not only because the list
  would become longer, but also because the tools that may dispose of SIM
  support are surely of a kind I like and will use.


 6.4 About Future Releases
 =========================


  Version 1.51 is definitely not the ultimate release of SIM, there is a lot
  of room for improvements and new features. My intention is to make a version
  2.00, a realy final one that will be PERFECT. Unfortunately, I will not have
  much time for that until July 1991, it may take quite some time for it to be
  released. The People who send me the money for this version, and only those,
  will get it as soon as its finished.

  If you have questions, bugreports, ideas for new features or complaints or
  if you simply want to contact me, write to:

                               Stefan Walter
                            Finsterruetistr. 57
                               8135 Langnau
                                SWITZERLAND

  Or dial Switzerland/01/713 01 46, from 18.oo to 20.oo.


                                               Enjoy!

                                                 Stefan Walter      27.Jan.1991


