
                               S t o p W a t c h

                                  Version 3.0
                               December 06, 1991

                                      by
                               Christian Danner


                                  M A N U A L
                                  ===========

                                  PRINCIPLES

"StopWatch" is  a stop  watch application, which makes a programmable precision
of more than the by the  system  time  offered  1/50  second  possible  (with a
standard Amiga 500/1000/2000 e.g. a resolution of one millisecond occupies only
little processor time,  with  a  turbo  board  this  value  can  furthermore be
increased).

The program  reacts on  the status of the joystick button. It gets its timebase
from the CIA B timer  A  and  in  the  last  resort  from  the  7.16 MHz system
frequency  by  interrupt  programming.  After  many - by reason of inaccuracy -
frustrating experiments with the CIA A timer A, which ought to be  the only one
available for  free access  according to the Addison Wesley Hardware Manual and
other publications, I  used  this  pretendedly  by  EXEC  continuously occupied
timer. Till  now no  incompatibilities occurred. The interrupt priority level 6
prevents  the  timer  program  from  being  overrun  by  other  interrupts  and
guarantees a high degree of precision.

I tested  the program on different conditions. During car races I'm using it in
the background, where the input data come from a hardware interface producing a
short circuit  to the  according joystick  port wires when the time measurement
beam  of  a  light  barrier  is  interrupted.  At  the  same  time  a Superbase
application is  running on  this machine,  communicating with another Amiga via
the serial  device  for  displaying  the  score  lists  and  serving  a printer
connected to  the parallel  port. In  comparison with a professional stop watch
running simultaneously,  I couldn't  find out  any difference  in the resulting
times. Corresponding  to my  tests, normal Intuition interfacing, file handling
etc. might not corrupt  the timer.  So far  I only  found one  program, a sound
generator, which caused deviations.


                                   FEATURES

The program  displays the  single lap  times and the total times in a window on
the Workbench screen. You can determine  the number  of laps  per race  and the
period of  time, within  which no  incoming signal  is processed  after a valid
event. In an uncomplicated  manner  you  can  adjust  the  measurement  on your
equipment (I  have not  yet tested, whether it's necessary or not, but it might
be required depending on  the  quartz  base).  Optionally  for  the  purpose of
transmitting the results to other applications, the data can be saved to a disk
file in ASCII-format. You can specify the filename freely, a  selection between
only saving  total times  or saving  all lap-times is possible, just as you can
choose whether the file only has to contain the last time or a time  list shall
be generated. Also an ARexx-port for remote control with parameter modification
and a more comfortable result handling  is  implemented.  With  Version  3.0 an
additional screen  can be  opened as  a time display e.g. in combination with a
genlock interface. Text and primitive graphics  can  also  be  written  to this
screen via Rexx-commands.


                                   HARDWARE

As I  explained earlier,  the program  scans the status of the joystick button,
which is a simple switch connecting Pin 6 with Pin 8 of the joystick  plug when
it is  closed. Pressing  the button  is a  valid event  for the  timer. You can
trigger the timer manually or by an interface,  which "presses  the button" for
you  by  a  switch  (mechanic  or  optoelectronic),  e.g. controlled by a light
barrier.

If the signal to detect is active only for a  period of  time shorter  than the
interval  between  two  scans  of  the  input it might be ignored by the timer.
Therefore you have to delay the  release  of  the  switch  (with  an electronic
circuit) for a reliable measurement of such signals.


                                  CALIBRATION

First  you  have  to  select  the  resolution  of  the  timer,  which means the
frequency of timer increase (e.g. 1000 for a resolution of 1/1000 second). This
value should  not be  excessively high,  because you  can slow  down the system
rapidly by the timer interrupts.

Now  you   have   to   tune   the   timer   by   changing   the  VIACYCL-Values
("VIA-Cycles/Timercycle" in  the Workbench window), so that the resulting times
are mostly valid in comparison  with  an  already  calibrated  stopwatch. Doing
this, the "Correction-factor" has to be 0.

For a  fine adjustment  a correction factor can be defined, which is equivalent
to the time deviation divided by the total period of time where it occurred. To
be  able  to  supervise  this  adjustment,  the  resulting  correction value is
displayed in terms of milliseconds with  every measurement  in the  last of the
three columns.


                                  PARAMETERS

All the  parameters can  be transmitted to the program when starting it. I have
implemented certain commands  for  the  startup  from  the  CLI,  ToolTypes for
running  "StopWatch"  from  the  WorkBench  and  Rexx-commands to influence the
already started application.

ToolType             CLI   PrgWindow        Explanation
---------------------------------------------------------------------------
General:
--------
LAPS=number          -l..  Number of Laps   number of laps per race
REFRACT=number       -r..  Refract.-Time    refractory time after a pass
CYCLSEC=number       -s..  Resolution       number of timercycles per second
VIACYCL=number       -v..  VIA-Cycles / Ti. coarse tuning of the timer
CORRECT= number      -c..  Correctionfactor timer fine tuning factor [* 1E-6]
DISPLAY=number       -d..  not implemented  number of result lines in display
BEEP=ON              -b    not implemented  display beep after timer events
FILE=path/filename   -f..  not implemented  filename for saving the results
APPEND=ON            -a    not implemented  generate result-list
PASS=ON              -p    not implemented  save also lap-times

Display Screen:
---------------
SCREEN=number        -o..  not implemented  display screen depth
WIDTH=number         -w..  not implemented                 width
HEIGHT=number        -h..  not implemented                 height
COLORS=hexnumbers    -k..  not implemented                 colors
ACTTIDIG=number      -(..  not implemented  actual   time   digits   after  the
                                            decimal point
TOTTIDIG=number      -)..  not implemented  total /  lap time  digits after the
                                            decimal point
TIFGCOLOR=number     -e..  not implemented  time display color of characters
TIBGCOLOR=number     -g..  not implemented                        background
TIMEFNAME=fontname   -n..  not implemented  time font name (disk font !)
TIMEFSIZE=number     -z..  not implemented            size
TEXTFNAME=fontname   -m..  not implemented  text font name (disk font !)
TEXTFSIZE=number     -q..  not implemented            size
TOTLEFT=number       -t..  not implemented  coordinate time total  left
TOTUP=number         -u..  not implemented                         up
LAPLEFT=number       -i..  not implemented                  lap    left
LAPUP=number         -j..  not implemented                         up
ACTLEFT=number       -x..  not implemented                  actual left
ACTUP=number         -y..  not implemented                         up

Parameter           Valid data range                                 Preset
---------------------------------------------------------------------------
LAPS                    1 .. 99999                                        1
REFRACT                 1 .. 99999                                      500
CYCLSEC                 1 .. 50000                                     1000
CORRECT             -9999 .. 99999                                     -525
VIACYCL                50 .. 50000                                      708
DISPLAY                 2 ..    12                                        5
BEEP                  OFF ..    ON                                      OFF
APPEND                OFF ..    ON                                      OFF
PASS                  OFF ..    ON                                      OFF
SCREEN                  1 ..     4                        no display screen
WIDTH                 640 ..   767                                      640
HEIGHT                400 ..   766                                      400
COLORS                                          66AFFF000D000D000BDD0D0B0DB
ACTTIDIG                0 ..     1                                        1
TOTTIDIG                0 ..     3                                        3
TIFGCOLOR               0 .. number of colors - 1 (1/3/7/15)              1
TIBGCOLOR               0 .. number of colors - 1 (1/3/7/15)              0
~LEFT                   0 .. WIDTH  - TextWidth( "00:00:00.000")        150
~UP                     0 .. HEIGHT - TextHeight
ACTUP                                                                   150
LAPUP                                                                   180
TOTUP                                                                   210
Time-/Text-Font                                            no font selected

Examples:
---------
~FNAME              RUBY (extension ".font" not allowed)
~FSIZE              15
COLORS              00AFFF000C00444DD00D000A...
                    \_/
                    rgb color 0 = blue (hexadecimal Red/Green/Blue-values 0..F)
                       \_/
                       rgb color 1 = white
                          \_/
                          rgb color 2 = black
                             \_/
                             rgb color 3 = red
                                ...

Command line for CLI-Startup:
         StopWatch -l2 -r500 -s1000 -v708 -c-525 -d5 -b -fCLIPS:TimeList  -p -a
                   -o3 -w704 -h460 -k44afff000c00 -x495 -y350 -i250 -j350 -t495
                   -u350 -nstopwatch -z26 -e1 -g2

To modify the parameters in the Workbench window you first have to click on the
"STATE"-button  or  to  select  the  pulldown menu "Project/Parameters". Then a
modification of the values in the parameter field is possible.  When done click
on the  same button  again. This  sets the  new values  and zeroes the timer. A
reset also can be processed simply  by selecting  the according  pulldown menu.
The state  of the  system is displayed in an area above the "STATE"-Button. For
preventing the timer from  analyzing uninteresting  signals a  locking function
can be  activated by  pressing the  "LOCK"-button or  sending the corresponding
Rexx command.  You return  to the  normal timer  action by  pressing the button
again or using the Rexx command "UNLOCK".

Notes:   Even  if  the  continuous  time  display  skips  some  values and runs
         irregular  (not  enough  system  preformance  for  the  defined  timer
         settings)  the  resulting  times  are valid! Time measurement and time
         display are different, parallel running processes.

         A VIACYCL-value < 150 may freeze a system without accelerator  card by
         occupancy of a great amount of calculating time for handling the timer
         interrupts! You could check  this with  a performance  monitor. If you
         intend to  use this program only as a Rexx-controlled display unit set
         VIACYCL to its maximum value (10000)  for the  least possible  loss of
         system preformance.

         To protect  the timer  from being  triggered repeatedly by an instable
         signal when the joystick button is pressed or released, it is possible
         to define  a period of time, during which no check of the input signal
         is performed after an event. E.g. in car races with  longer refractory
         times this  feature can also be useful to prevent the timer started by
         the front wheels from being stopped by the rear wheels.
         The strategy: 1. After a valid event (button  pressed  =  signal  on =
                          pins connected)  the input is scanned for the release
                          of the button.
                       2. At that moment the refractory time,  which determines
                          the period,  during which  a signal is ignored by the
                          timer, is set to  the user-defined  REFRACT-value and
                          counted down.
                       3. If  there  is  another  event  within  this time, the
                          program ignores it and  repeats  the  whole procedure
                          beginning  at  1  (scanning  for  the  release of the
                          button...).
                          This loop is performed  until no  event occurs during
                          the time of delay.
                       4. Subsequently the timer is active for the next event.
         The  power  led  indicates  the  state  of  this feature. If it shines
         brighter, the  input is  inactive. For  a premature  activation with a
         running  timer  you  have  to  lock  /  unlock the input. A reset also
         activates the input, but the actually measured time is lost.

         The format of the  actual  and  total  /  lap  time  displayed  in the
         separate  screen  is  shortened  depending  on  the defined TIMEDIGITS
         values:            3         "00:00:00.000"
                            2         "00:00:00.00"
                            1         "00:00:00.0"
                            0         "00:00:00"
         The time strings transmitted to the stopwatch window,  the output file
         and Rexx are never truncated to make the further processing easier.

         When  using  proportional  fonts  for  time display all digits and the
         characters " ", "." and ":"  must  have  the  same  width  for correct
         output and  deletion. If  necessary modify  the respective font with a
         font-editor.

         The display screen  depth  determines  the  maximum  number  of screen
         colors. Depth  1/2/3/4 means  2/4/8/16 colors  (colors = depth^2). The
         time needed for text-  and graphics  output increases  with the screen
         depth, so  avoid unused bitplanes! Toggle between the "StopWatch"- and
         the Workbench screen with the keys <Amiga>-N and <Amiga>-M.

Caution: On my  Amiga 2000B PAL  with  Agnus 8361 / Denise 8362  some baselines
         (below  line  455)  are  not  shown  on  a  screen  with  the depth of
         4 bitplanes, but they are present and can be dumped to  the printer by
         the use  of a  screen grabber.  Maybe this fault does no longer appear
         in combination with the ECS-Chipset and  1 MB chip  memory, but  I was
         not yet able to check this hardware.


                                 REXX-COMMANDS

The ARexx-port of "StopWatch" can be accessed via its name "RexxStopWatch".

So far the following commands are implemented:

General:
--------

CLOSE          ends the program
                 parameters: none

LOCKEXIT       forbids ending of the program (except via REXX)
                 parameters: none
                 returncode: warn:  LOCKEXIT already active

UNLOCKEXIT     resets the LOCKEXIT-command
                 parameters: none
                 returncode: warn:  LOCKEXIT not active

RESET          resets the timer
                 parameters: none

LOCKTIMER      disconnects the timer from the joystick port
                 parameters: none

UNLOCKTIMER    resets the LOCKTIMER-command
                 parameters: none

LAPS           number of laps per race
                 parameters: <number>
                 returncode: error: no parameter
                                    parameter out of range

REFRACT        refractory (delay) time after a pass
                 parameters: <number>
                 returncode: see "LAPS"

CYCLSEC        number of timercycles per second
                 parameters: <number>
                 returncode: see "LAPS"

VIACYCL        coarse tuning of the timer
                 parameters: <number>
                 returncode: see "LAPS"

CORRECT        timer fine tuning factor [* 1E-6]
                 parameters: < number>
                 returncode: see "LAPS"

BEEP           display beep after timer events
                 parameters: [ON]/[OFF]
                 returncode: error: no / wrong parameter

NEXTTOTAL      returns the next total time
                 parameters: none
                 format of result:  "00:00:00.000"
                                    (depending on "CYCLSEC" filled with "0")
                 returncode: warn:  timer overflow (> "99:59:59.999")
                             error: rexx result handling disabled
                                      (no "OPTIONS RESULTS" command)

NEXTLAP        returns the next additive lap time
                 parameters: none
                 format of result:  see "NEXTTOTAL"
                 returncode: see "NEXTTOTAL"

NEXTSINGLE     returns the next single lap time
                 parameters: none
                 format of result:  see "NEXTTOTAL"
                 returncode: see "NEXTTOTAL"

PREVTOTAL      returns the previous total time
                 parameters: none
                 format of result:  see "NEXTTOTAL"
                 returncode: see "NEXTTOTAL"

PREVLAP        returns the previous additive lap time
                 parameters: none
                 format of result:  see "NEXTTOTAL"
                 returncode: see "NEXTTOTAL"

PREVSINGLE     returns the previous single lap time
                 parameters: none
                 format of result:  see "NEXTTOTAL"
                 returncode: see "NEXTTOTAL"

Display Screen:
---------------

SCREENADDRESS  returns the pointer to the display screen structure for external
               screen manipulations (before using this feature  you should call
               the LOCKEXIT-command  to avoid  a closure of the screen from the
               workbench, which might cause a system crash)
                 parameters: none
                 result:     <address in decimal text format>
                 returncode: warn:  timer overflow
                             error: rexx result handling disabled
                                      (no "OPTIONS RESULTS" command)

TIMEDIGITS     changes the number of  digits following  the decimal  point when
               the actual and total (lap) time is displayed
                 parameters: <digits actual time> <digits total / lap time>
                 returncode: see "LAPS"

TIMEPOS        changes position of actual, total and lap time
                 parameters: <xact> <yact> <xtot> <ytot> <xlap> <ylap>
                 returncode: error: position(s) out of screen range
                                      -> no change
                             warn:  text too large for correct display
                                      -> position(s) shifted

TIMECOLOR      defines foreground- and background color of time display font
                 parameters: <foreground color> <background color>
                 returncode: error: no / wrong parameters

TIMEFONT       changes the  time display  font. It also clears the locations of
               the actual, lap and total time!
                 parameters: <name> <size>
                 returncode: error: no / wrong parameters
                                    diskfont not available

TEXTFONT       changes the text display font used by the ~TEXT~-commands
                 parameters: <name> <size>
                 returncode: see "TIMEFONT"

BOXO           draws an opaque filled box
                 parameters: <left> <up> <width> <height> <color>
                 returncode: error: no / wrong parameters
                                    parameters out of range
                                      (object has to fit into the screen)

BOXT           draws a transparent filled  box  (by  alternation  of  pixels in
               foreground- and background color)
                 parameters: <left> <up> <width> <height> <color>
                 returncode: see "BOXO"

DRAW           draws a dot, line or polygon
                 parameters: for dot      <color> <x-pos.> <y-pos.>
                             for line     <color> <x1> <y1> <x2> <y2>
                             for polygon  <color> <x1> <y1> <x2> <y2> <x3> ..
                 returncode: see "BOXO"

FILL           fills  an  area  with  a  plain color beginning at the specified
               position, delimited by the determined outline color
                 parameters: <x-pos.> <y-pos.> <color>
                 returncode: see "BOXO"

ELLIPSE        draws an opaque filled ellipse
                 parameters: <center x> <ct. y> <radius x> <rd. y> <color>
                 returncode: see "BOXO"

LOGO           displays copyright logo
                 parameters: <left> <up>
                 returncode: see "BOXO"

CLRLOGO        clears copyright logo
                 parameters: <left> <up>
                 returncode: see "BOXO"

TEXTR          text output from the defined position to the right
                 parameters: <left> <up> <textcolor> <backgroundcolor> <text>
                 returncode: see "BOXO"
                             if  necessary  text  is  shortened  without  error
                             message !

TEXTL          text output from the defined position to the left
                 parameters: <left> <up> <textcolor> <backgroundcolor> <text>
                 returncode: see "TEXTR"

TEXTC          text output centered horizontal relative to the position
                 parameters: <left> <up> <textcolor> <backgroundcolor> <text>
                 returncode: see "TEXTR"

CLRTEXTR       clears text written with TEXTR
                 parameters: <left> <up> <text>
                 returncode: see "TEXTR"

CLRTEXTL       clears text written with TEXTL
                 parameters: <left> <up> <text>
                 returncode: see "TEXTR"

CLRTEXTC       clears text written with TEXTC
                 parameters: <left> <up> <text>
                 returncode: see "TEXTR"

SHADOW         sets shadowtext coordinates
               (in pixels relative to normal text position = 0 / 0)
                 parameters: <x-pos shadow 1> <y-pos shadow 1> <x2> <y2> ..
                 preset: "-1 -1 0 -1 1 -1 -1 0 1 0 -1 1 0 1 1 1"
                 restriction: max. 30 shadows (60 x/y-values) allowed
                 returncode: see "BOXO"

TEXTRS         text output to the right with shadows
                 parameters: <left> <up> <textcolor> <shadowcolor> <text>
                 returncode: see "TEXTR"

TEXTLS         text output to the left with shadows
                 parameters: <left> <up> <textcolor> <shadowcolor> <text>
                 returncode: see "TEXTR"

TEXTCS         text output centered horizontal with shadows
                 parameters: <left> <up> <textcolor> <shadowcolor> <text>
                 returncode: see "TEXTR"

CLRTEXTRS      clears text written with TEXTRS
                 parameters: <left> <up> <text>
                 returncode: see "TEXTR"

CLRTEXTLS      clears text written with TEXTLS
                 parameters: <left> <up> <text>
                 returncode: see "TEXTR"

CLRTEXTCS      clears text written with TEXTCS
                 parameters: <left> <up> <text>
                 returncode: see "TEXTR"

The ARexx returncode values are 0 for OK, 5 for WARN and 10 for ERROR.

The  valid  data  range  for  the  commands LAPS, REFRACT, CYCLSEC, VIACYCL and
CORRECT is already described above.

For a correct sizing  of the  CLRTEXT~-commands you  have to  activate the same
text display  font you used for the corresponding TEXT~-command which has to be
wiped out. In the same manner for clearing a text  displayed with  a shadowtext
command (CLRTEXT~S) the shadows must be set to their correct values.

For  further  details  I  refer  to the example program "StopWatch.rexx", which
comes along with this package.

The abortion of NEXTTOTAL, NEXTLAP or  NEXTSINGLE with  "Abort RexxCmd" returns
an error  level 10  in RC.  If the "OPTIONS RESULTS" command is not active when
commands expect a return value (~TOTAL, ~LAP, ~SINGLE, SCREENADDRESS), an error
level 10 is returned.


                                IMPLEMENTATION

Most of  the code is written in M2Amiga Modula 2 V3.1d (really antique version)
by AMSoft. I have  implemented the  interrupt routines  in assembler  using the
Aztec C 3.6a Assembler.  Thanks to CygnusSoft for their excellent editor, which
helped me to keep the source together.


                                    HISTORY

V 2.0  - First released version of  the  program,  which  already  supports the
         different Workbench fonts of AmigaDOS 2.0.

V 3.0  - Continuous time display in the program window.
       - New  timer  REXX-Commands:  PREVTOTAL,  PREVLAP, PREVSINGLE, LOCKEXIT,
         UNLOCKEXIT, LOCKTIMER, UNLOCKTIMER, BEEP.
       - REXX-Commands GET... renamed to NEXT... !!
       - Optional display-beep on all screens with the timer  event. Activation
         by the CLI-Option -b and the ToolType BEEP=ON.
       - Correct 3D-Display also with the color palette of AmigaDOS 2.0.
       - Assembly routines now coded and optimized with the Aztec Assembler, no
         longer with the Data Becker Profimat-Assembler.
       - REXX interface improved (unknown commands are sent back  to the server
         and don't cause Guru Meditations any longer..).
       - Display Screen for genlock interaction.
         Features:  - Up to  16-color screen.  Number of  bit-planes and colors
                      definable by the user.
                    - Variable screen dimensions. Overscan supported.
                    - Free font selection. Color fonts in  combination with the
                      "ColorText"   program   from  the  Calligrapher  software
                      package possible.
                    - Position of actual, lap- and total time not fixed.
                    - Text- and  graphics  output  via  Rexx-commands (TIMEPOS,
                      TIMECOLOR, TIMEFONT, TEXTFONT, BOXO, BOXT, ELLIPSE, DRAW,
                      FILL, TEXTR, TEXTL, TEXTC,  CLRTEXTR, CLRTEXTL, CLRTEXTC,
                      SHADOW,  TEXTRS,  TEXTLS,  TEXTCS,  CLRTEXTRS, CLRTEXTLS,
                      CLRTEXTCS,  LOGO,  CLRLOGO).  SCREENADDRESS  makes screen
                      manipulations by external programs possible.

V 3.0S - Shareware  version  of  StopWatch  V3.0.  The sometimes on the display
         screen appearing "Danner Timing"-logo  reminds you  to order  the full
         version and pay your registration fee.
         The package consists of:
            StopWatch       Version 3.0S of the executable file
            StopWatch.doc   the user manual
            StopWatch.rexx  a demo file for ARexx-interfacing
            StopWatch.pic   a  snapshot  of  the StopWatch screen while running
                            StopWatch.rexx (for those who do not yet use ARexx)


                                   COPYRIGHT

Copyright (c) 1991 by Christian Danner. All rights reserved.

The author is not responsible for any damage caused by  the use  of the program
"StopWatch".

The shareware  versions 2.0  and 3.0S of this program may only be redistributed
on non-commercial base without changes together with their documentation files.
They must  not be  distributed on  commercial base  without my explicit written
permission.  If  you  use  these  versions  more  frequently,  especially  in a
professional manner, I won't refuse a little fee.

Version  3.0,  which  is  neither  in  the public domain, nor shareware, can be
obtained via my  address  for  the  amount  of  50 US$  or  80 DM  (only bills)
including airmail  postage and registration. Already registered users only have
to send me 5 US$  or  10 DM  for  forwarding  expenses  to  receive  the latest
version. Because  of the external generation of the system frequency in genlock
mode I can not  guarantee a  correct time  measurement in  combination with all
kinds of  genlock interfaces.  So please  check your  hardware with  one of the
shareware versions of this program before ordering.

For further improvements please let me know of  all the  bugs you  find and all
the options  you miss. Every attempt will be made to solve your problems within
a reasonable amount of time.


My address:    Christian Danner
               Rißkopfstraße 10
               8106 Oberau
               Germany
               Phone: 08824/8122
