                        ADDENDUM FOR FREEWARE RELEASE
        These files are being uploaded to metalworking.com on 1 April 1998.
Anyone may use these files in any manner, but I will not accept responsibil-
ity for any accidents or damage.

        These files have some known problems. Backlash compensation during
arcs doeas not work, so the backlash distances should be set to Zero. Arcs in
the XZ and YZ planes have not been tested. The optional control panel has not
been tested.
        The SetPort.exe program works correctly but many users have
trouble correctly assigning the correct LPT pins to the appropriate motor
drive. If you have a situation where 2 of your motors move correctly and the
third will move in one direction only, you can be sure this is the problem.
It has happened so often I must accept full responsibility.

                                   NOTE
        Only THIS version of stepper motor CNC control is freeware, all other
versions, present and future, written by me are still my property and I
reserve all rights to them.



                                 Beta  979
                              by Kevin Carroll

                                Introduction
        Thank you for testing this beta version of my CNC operating system for
stepper motors. You help is greatly appreciated as this project is an amature
effort and testing all the possible combinations of machines and computers
against all the G-codes is beyond my capability. Your comments on the CNC and
this manual are greatly appreciated.


                                Known Issues

        The two biggest problems concern speed. The feedrate command and
feedrate overide are much improved from earlier versions, but are still not
in inches per minute and are not linear.
        The other speed problem is that a powerful computer is required to
generate fast motion, a 486-100 is the recomended minimum for motors geared
.001 per step. Very small machines, say 4" x 6" can tolerate a slower rapid
travese rate, and a slower computer.
        The reason that such fast computer is required is that many features
have been inserted into the "move loops". The feedrate overide, motor
acceleration and deceleration, realtime update of the XYZ display and multiple
coordinate systems and other features greatly add to the processor load, all
together they probably slow the program by 90%
        Other PC based operating systems either use a special step generator
card or leave out most or all of these features. One competing project leaves
out the capability to do arcs, they are approximated as a series of streight
lines!

        The program is written in compiled BASIC. The source code is man
readable (more or less), but is then compiled to machine language. Use this
editor to open Stepster.exe and compare it to any other .exe file. What you
are seeing is a garbled translation of machine language to ASCII. I believe a
version written in C++ BY A TEAM OF EXPERTS might be ten percent faster, but
implementing the special display features & hot keys would be very difficult
in C, these commands are built in to BASIC. The best of the competing products
requires the file ANSI.SYS to be in the config.sys file just to display
standard tiny text on the screen, and the machine has to be in Hold to adjust
the feedrate overide, and there is no incremental jog, just fast & slow.



                            Windows Compatibility
        The program is being written under Windows95, and the mill I have is
running Windows 3.1.
        The program will multitask under Windows95 (the motors will continue
to run even when the program is minimized) but for safety reasons you should
not do this unless you have the optional control panel or an Emergency Stop
switch that turns off the drive motors. You can put the control in Hold,
then safely switch tasks.

        The program will not multitask under Windows 3.1 The motors will stop
instantly if you switch back to Windows so you should put the program in Hold
(F1) before you switch back to Windows. The main advantage to Windows 3.1 is
that File Sharing is not mandatory, and you can modify a part file as it is
being executed. (Look in your config.sys file for a line containing share.exe,
remove it to enable this feature).

        It is recomended that you run the program under Windows, so that you
can write & modify part files without shutting down the CNC (and losing your
X0 Y0 Z0 positions)



                       Program Setup and Operation
                        

                           Setport.exe Program

     The current version supports a text setup file, EXEC.DAT named for the
executive tapes used by early CNC controls to set up a control for a given
machine. The file can be modified using Setport.exe. You should make a backup
file before you modify any of the parameters, so if the worst happens you
will still have a format quide.

                                Line 1
       Specifies the printer port the signals will output to. 378 is normally
Lpt1, 278 is normally Lpt 2, and 3BC is normally LPT 3. 

                             Line 2 Not Used

                             Lines 3,4 and 5
      The length of the motor steps. This is a function of Motor, Lead screw
and driver. Metric mode is accomplished by putting metric values here.

                             Lines 6,7, and 8

     The amount of backlash or "play" in each lead screw. It is suggested
that you leave these values at zero until you have the rest of the control
funtioning O.K., then start with a value that is half the measured backlash,
then trial & error from there.
      Backlash compensation is a poor substitute for good leadscrews, as
climb cuts & heavy drilling can "throw" the table, causing an innacurate part
and / or a broken tool.

                                   Line 9
     If the Control Panel is present this value should be 1, otherwise it
should be 0. If set to 1 when no panel is present the program will not
function. The control panel functions are barely tested at this point,
contact me at stepper@npcc.net for the schematic and pinout.

                                  Line 10
    If you want the control to start up in the G90.1 mode enter 0.
If you want the control to start up in G90 mode enter 1. In the G90.1
mode I and J specify the X and Y coordinates of the arcs directly, as
absolute values. G90 mode specifies the arc center as incremental offsets
from the arc start point. This only affects the start up condition, you can
switch between modes with the G90 and G90.1 codes in you part file or in
MDI mode.

                             Lines 11 through 18
  These lines concern which pin carries which signals.

     Values of 0 to 255 are sent to the printer port during moves.
The pins of the printer port that carry this data are 2 through 9. When a
value of 1 is sent to the port pin 2 is turned on. When a value of 2 is sent,
pin 3 is turned on. When a value of 4 is sent, pin 4 is turned on. When a
value of 8 is sent pin 5 turns on. When a value of 16 is sent pin 6 turns on.
    To turn all the pins on, 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 is sent.(255)
In order for the software to work with a variety of translators (stepper
driver boards) the functions for X, Y, Z, and the Relays are assigned
values that equate to the desired pin.
     The control is written for "active low" signals to the motors: the pin
will be "high" (near 5 volts) until a command is issued, then it will go
"low" (near 0 volts) for a very short time. Your translater MUST be built
this way. (All comercial boards are).
      The relays, on the other hand, are "active high" to prevent them from
turning on when power is removed from the control and not from the relay
board.


                       Summary of Setport.exe

     Because a variety of computers will be connected to a variety of
motors connected to a variety of machines, no specific recommendations can be
made. As a user base is generated, specific examples will be made available.
The bottom line is that you will need to work in the trial and error mode for
a while, in order to achieve optimal performance.


                                SetSpeed.exe

    SetSpeed is a program used to set up Stepster's feedrate and accel-
eration / deceleration parameters.

    The feedrates in the current release range between F100 and F0 (F0 will
still allow the machine to move, although if the program is set up correctly
this will be VERY slow.)
       If correctly set up the feedrates will still not be linear, F10 will
not be 10% of F100, but it will be close.

   A fair amount of trial & error will be required to get the feed number cor-
rect, this will be solved in later releases as a database of installed
machines is generated.


        You should begin the tuning proceedure with Line 4, then Line 2 and
Line 3, then retune Line 4, then tune Line 1.

                                Line 1
        The Computer speed value is used to make the various feedrates more
linear. If there is not much difference in speed between F100 and F1 then
Computer Speed needs to be increased. If there is too much difference between
F100 and F90 then Computer Speed needs to be decreased. Begin by changing
this value in increments of 500. This value is also used in the Feedrate
Overide, so you can test it by commanding a G0 move & manipulating the
overide. An overide of 1% applied to rapid move should be Very slow, an
overide of 99% should make only a small difference.

                                Line 2
       The Accel / Decel Factor is a timing variable used to correct the accel
and decel rates. The best way to tell if this variable is correct is to listen
to the motors as they accelerate (use a large variable in Accel / Decel
Distance for this test). The motors should accelerate smoothly, too large a
value will cause a jump in speed at the end of the acceleration ramp, to small
a value will cause overly rapid acceleration.

                                Line 3
        The length of the acceleration and deceleration ramps is a factor of
the feedrate times the step length times the accel / decel length.
        If the step length is .001 and the accel / decel length factor is 1,
and the feedrate is 100, the control will take .1 inch to accelerate to speed.
        You should be conservitive when setting this variable, it must be set
for the heaviest part at the heaviest feedrate. A heavy table with small
motors will require a large value here, even larger if the motors are geared
.0001 per step.
        When properly set up the accel / decel parameters can raise the top
speed of small motors considerably.

                               Line 4
        Rapid Traverse Limiting. This value limits the maximum speed of your
motors. If you have high performance motors and drives and a slow computer
this value will be zero. If you have a fast computer this variable will
prevent motor stalls caused by overspeeding. To set this value go to Manual
Mode, set the jog distance at 1.0000 and jog each motor back and forth.
        If the motor stalls increase the Rapid Traverse Limiting value
(by 500) and try again. Once you have arrived at the maximum speed repeat
the test for the other axis'.
        Note: my mill is geared .0002 for X and Y, and .0005 for Z.
The rapid rate had to be set lower than I wanted to make sure the Z axis
did not stall, since it moves much faster per step than the other axis'.



                           Operating The NC

     Operation of the NC program will be described screen by screen.


                            The Menu Screen

     The screen displayed on power-up is the Menu screen. Only 4 choices
are possible:
F1. Pressing the F1 key will bring up the Automatic screen. 
F2. Pressing the F2 key will bring up the Manual Jog screen.
F3. Pressing the F3 key will bring up the Manual Data Input Screen.
F4. Pressing the F9 key will end the program, and return to the DOS prompt
(or Windows).


                            The Auto Screen

     Initially, the Auto screen asks "File to run?" . You will enter the
name of the G-code file you wrote. This file must be in ASCII dos format.
We suggest you use the MSDOS editor "Edit", but any plain (ASCII) text
editor should work. If the file is not in the same directory as the NC
program, type in the complete path and file name, for instance
"C:\files\4c_head.cnc"
     If you press Enter before you type a file name, you will be returned to
the Menu screen. If you type a filename that doesn't exist, or an invalid path
the file name you typed will disapear, and you may type in a correct filename. 
     Once you have entered a valid filename the file name prompt will disapear,
 and many new items will appear on the screen. Starting at the top and
working down, displayed items are:

     The X, Y, and Z readouts. "T" appears to the right of the Z axis display,
followed by the number of the currently selected tool.

     Under the axis displays and to the left, the current feedrate "F" is
displayed. Since no feedrate has been read in yet, there is no number
displayed yet. Note: The first line containing a move MUST have a feedrate.

     Under the Feedrate is the Feedrate Override "%". You can press F2 and
F3 now, or at any time, to change the override value.

     On the right side of the screen "Normal Mode" is displayed. Press F4
to cycle between the single "Block Mode" and the "Normal Mode". When in
Block mode the start button, F5, must be pressed to execute each line, when
in the Normal mode the start button is only pressed once. Block mode is very
useful when learning how to write NC files, and when test running a file.
You can press F4 now, and / or during file execution. Lines containing tool
setting data such as "/ T1 O .734", and lines that cause no motion, such as
G51, G54, G92 etc, will be read without pressing F5 Start when in block mode.


     Above "Normal Mode" is a blank space. After you press the start
button this will change to "Run". If you press F1 now the display will show
"Hold".

     In the center of the screen are the values the NC has read from your
file. This may show more data than you entered. For instance, if the first
(non tool setting) line of code was "N10 G1 X5.005 F40" you will also see
data for Y and Z, reflecting the current commanded positions of those axis.

     At the bottom of the screen the active "hot" key descriptions are shown.
They are:

F1 Hold. Pressing this key cycles between hold and run(able) modes. Note
that the control will decelerate to a stop, this distance is determined by
the current feedrate, override, and SetSpeed.exe variables. Stopping
instantly could damage the power train, and would almost certainly cause
one or more of the stepper motors to "jump out of synch".

F2 and F3 Feedrate Override. This allows real time modification of the
programed feedrate.

F4 Block. Cycles between single block and continuous modes.

F5 Start. Pressing this key begins file execution. If motion does not begin,
check to see that the control is not in the hold mode.

F6 Stop. Motion halts instantly, possibly causing one or more axis' to "jump
out of synch", so the control will switch back to the Menu screen. Restarting
the file after a stop is not possible, so you should use F1 Hold instead, if
you want to restart. The X, Y and Z axis' should be rezeroed to the part
after a hard stop or inacurate parts could result.



                        The Manual Jog Screen


     The Manual Jog screen contains many items. Starting at the top they are:

     The X, Y, and Z readouts. "T" appears to the right of the Z axis display,
 followed by the currently selected tool.

     Under the axis displays and to the left, the current feedrate "F" is
displayed. In manual mode the feedrate is fixed at the Rapid rate, but the
feedrate override can be used to set the jog speed.

     Under the Feedrate is the Feedrate Override. You can press F2 and
F3 now, or at any time, to change the override value.

     The right side of the screen shows the run / hold status.

     The current jog distance is shown under the run / hold display. Press
F7 to cycle between .0001 and 1.0 jog distances.

NOTE: if your motor step length is greater than .0001 the jog distance is
set to .0001 the jog distance will change to the step length the first time a
jog is commanded.


     The remainder of the screen shows user prompts for the active keys.
IMPORTANT:  the Caps Lock and Num Lock lights must be OFF or the
keys will not be read! The functional keys are:

                           X,Y and Z
      Pressing one of these keys sets that axis display at zero. Note that
when you zero the Z axis, you are really zeroing the currently selected tool.
Tool 0 should be set to zero when the spindle is furthest away from the work.
That way, you can call a tool change like this:

T0          (call tool 0 offset)
G0 Z0       (raise the spindle)
M5          (stop the spindle)
M2         (put the program into Stop mode, press F5 to restart)
T2          (call tool 2 offset, the display will change to reflect this)
G0 Z.05     (tool 2 moves to a point .05 above the work piece

                     The Arrow Keys and + and -

     These keys cause the respective axis to move by the amount selected
by F7 Jog Distance. Note: - and + are the gray keys on the numerical key pad
section of your keyboard.

                                    T

     Pressing the T key cycles through the 10 tool offsets available. Try
this: press T till tool 3 is selected. Jog the control until the tool is just
touching the workpiece. Remember the number shown on the axis display.
Press Z ( the Z axis display will now show 0). Now cycle the T to 5, load
another tool, touch it to the work piece and press Z. You can, if you want,
cycle to tool 3 and the display will show the difference in length between
the two tools. Using this feature, your G-code files are easier to write, the
top of the work piece is always Z zero, regardless of which tool you are
working with. You can set tool lengths this way (in manual mode) or in MDI
mode or embed the tool length offsets in your program. NOTE: your machine must
have some type of tool holders that allow you to remove and reinstall a tool
with out changing its length, or you won't be able to use multiple tools in
the same file. (If you don't have quick change tooling you could have multiple
files, 1 for each tool, and rezero between files, it just takes a little
longer.)

                                    F7
     Pressing the F7 keys cycles the jog distance, the distance an axis will
move each time the jog keys are pressed. Note: no specific continuos jog is
provided in this version, but holding down the key while the jog distance is
.001 will act as a (slow) continuous jog.

                                    F4
     Pressing F4 causes an immediate move back to the X and Y zero point.
Be sure to raise the spindle first!

                                    F5
     Pressing F5 causes the Z axis to switch to the offset for tool 0, then
commands a move to Z 0. This is another reason to zero T0 when the spindle
is fully away from the work piece.


     
                             The MDI Screen

     MDI stands for Manual Data Input, and is a cross between manual and
automatic operation. Blocks of G-code are typed to the screen, and execute
as soon as the return key is pressed.  F1 Hold is available, and pressing
F6 Stop while any axis is moving will return the NC to the Menu screen.
        To exit the MDI mode press return without entering any data.

     The possibility of catastrophe is great when using the MDI mode!
One decimal point omitted and you can have a broken tool or a hole in your
table! MDI was developed way back when it was so tedious to write a file
(on a teletype machine to a paper tape punch, with no quick way of even
knowing if you had a typing error) that it seemed like an attractive option.
If you work in the Windows environment you can hop quickly between the
editor and the NC, and have no need of the MDI mode. I seriously thought of
not implementing the MDI mode because it is so treacherous, but as a beginner
you might want to lower the table , or retract the spindle, or disable the Z
axis, and use MDI as an immediate trainer: Type a line and observe the
result.

     Pressing return without entering any data will return the NC to the
Menu screen.


                       Codes Read by the Control

        This version of CNC control is intended for hobby use, and does not
include support for many of the higher CNC functions, for reasons of cost
and performance, however, ANY shape can be described using the functions
included. The control is programmable to four decimal places, but actual
precision of your machine is determined by the step lengths of your
motors' gear train. The move routines' math is optimized for step lengths of
.0001 and .001. Other step lengths may cause very small math errors to
accumulate.

        G-code files must be in ASCII format. Capital and non capitalised
letters can be read. Numbers are in decimal format, leading and trailing
zeroes can be omitted. G-codes do not require leading zeroes. I use the
MS-DOS Edit program that ships with DOS 5 and above. Windows95 has an
improved version.

        With some exceptions, only one G-code per line is permitted, and only
one M-code per line should be used.

                            G00 Rapid traverse.

        The control moves each axis from it's present location to the
coordinates specified at the rapid rate (F100). Motion is coordinated, so all
axis' will arrive at the same time.
      
                           G01 Linear Feed Move.

        Same as G00 except motion is accomplished at the last specified
feedrate (F).

                             G02 Clockwise arc.

        In g90.1 mode I and J are the absolute location of the center point.
        In G90 mode I and J are incremental SIGNED distances from the start
point to the center point. If the start point is to the left and below the
center point I and J will be positive. It is not neccesary to use the + sign.
        If the arc start point is to the right and above the center point
I and J will both be negative.

        Backlash take-up occurs at each quadrant boundary (3, 6, 9, and
12 o'clock).
        Three axis circular interpolation is supported, in G17 mode this means
the mill will describe a helix. Example:

        N120 G90.1 G0 X2 Y2 Z2
        N130 G2 X2 Y-2 Z0 I0 J0 F10 (arc center is X0 Y0 absolute coords)

 As the mill describes the 180 degree arc in the X-Y plane it will feed down
 to Z0.

                          G03 Counter Clockwise arc.

        Same rules as G02 apply.

                          G04 P##.# Dwell in seconds.

        Resolution is in tenths of a second. Note the use of the non-standard
P variable. (Think "Pause")

                          G17 Arcs in X-Y plane.

        This is the power-on default. I and J specify the center point.

                         G18 Arcs in the X-Z plane.

        Once called, this stays in effect until canceled with G17 or G19.
I and K specify the center point.

                         G19 Arcs in the Y-Z plane.

        Once called, this stays in effect until canceled with G17 or G18.
J and K specify the center point.

                             G50 Cancel Scaling.
     SPECIAL NOTE: Scaling is as yet not well tested, and has known problems.
      At this time it is recomended that you return to the point that scaling
was initially called, then issue the G50 command, then issue a G92 command
using the same XYZ. The G92 helps by preloading the XYZ registers with the
correct data. G50 in effect resets the step lenth to that set in the SetPort
program. Example:

N1000 G0 X0 Y0 Z0   (Place where scalling was started)
N1010 G50           (set scaling to 1:1)
N1020 G92 X0 Y0 Z0  (make sure registers have correct data)

                              G51 Call Scaling.

      SPECIAL NOTE: Scaling is as yet not well tested, and has known problems.
        Scaling in effect restates the step length of each motor, causing
the macine to move a greater or lesser distance than it would otherwise.
        U, V, and W are used so as not to overwrite the current X, Y, and Z.
Scaling is a ratio, so if you want the machine  to move 1/2 as far as it
normally would in the X axis the command would be G51 U.5 V1 W1
        Never use zero as a scaling value, if you do the program will reset
the zero to 1 to prevent a division by zero error.
        At this time negative scaling values are not allowed. In the future
negative values will enable "mirroring".
        Scaling example:

N1000 G0 X0 Y0 Z0    (move to point where scaling should start)
N1010 G51 U.5 V2 W1  (result X is half, Y is twice, Z is same)
N1020 G92 X0 Y0 Z0   (saftey command, won't be required in later releases)

        Because scaling is related to step lengths at a very basic level, arcs
will also be scaled. By scaling the X and Y axis' differently elipses WILL
be created. 


                       G53 Machine Coordinate System.

        This is normally set to zero with a homing routine (not yet
implemented), it can also be set with the G92 command like this:

G53 (switch to the machine coordinate system)
G92 X0 Y0 Z0 (any values can be used for X, Y, and Z)

       If G53 is reset with a G92 command G54 and G55 will be affected, since
they are based on offsets from G53.
      You may want to use this coordinate system to position for tool changes.


                       G54 Work Coordinate System #1.

        When set with G92 this coordinste system is set offset from the
machine coordinate system.

                       G55 Work Coordinate System #2.

        The purpose of multiple work coordinate systems is to aid in multiple
fixture machining. A part file can be run in G54 then G55 called, then the
SAME file run, but now the machine will move to the second fixture. The same
thing could be done with the G92 command, but if the control is stopped in
the middle of the program the correct zero would be lost.
        Another, special, use is where a grinding stone is used (possibly in
an auxilliary spindle). G54 is used to dress the stone against a diamond,
G55 is re-zeroed after every pass to grind more matierial, or to allow for
variation in part size. Again, this could be done without multiple coordinate
systems, but it is more convienient to use them.


                         G90 Absolute Positioning.

        Moves are to an imaginary grid centered at X0 Y0 Z0. I and J (and K)
are signed incremental offsets from the start point to the center point of
arcs. Modal, it stays in effect until canceled with G90.1 or G91.

        G90.1 Absolute Positioning with I and J (and K) as absolute values.

        I and J are the X and Y absolute (grid) locations of the arc center
point. Modal, it stays in effect until cancelled with G90 or G91.

                      G91 Incremental Positioning.

        Moves are from the current tool location. This command is modal, it
stays in effect until canceled with G90. I, J, and K will be incremental.

                    G92 Relocate Absolute Zero.

        Relocates the origin to a point X, Y, and Z away from the current
tool location. The G92 command MUST be on a separate line. Examples:

        N90 G54             (G92 only affects the current coordinate system)
        N100 G92 X0 Y0 Z0   (the display shows X0.0000 Y0.0000 Z0.000)
        N110 G92 X0 Y0      (same as above, but Z unchanged)
        N120 G92 X2 Y3      (display shows X2.0000 Y2.0000, Z unchanged)

       G92 is handy when using multiple fixtures, but the machine must be
re-zeroed for the next run unless the tool is returned to a known point and
a second G92 commanded.
        G92 is also used to set X0 Y0 Z0 without moving the tool to that point.
This can be handy when X0 Y0 Z0 is inaccesable because it is outside the
machine's physical envelope or blocked by a clamp, or when zero is to be set
from a location on the part that is not X0 Y0 Z0.

        SPECIAL NOTE: G53 G92 resets the machine coordinates, affecting the
offsets of G54 and G55 in an incorrect manner, so G53 G92 should be set one
time only, then G92 commands for G54 and G55 can be set & reset at will.

        Many users will not bother with multiple coordinate systems, and will
work entirely in G53. In this case G53 g92 commands can be issued as often as
desired.
        


                                Other Letters Read

       \T## L#.####  Specify tool length offset. 11 tools are supported,
though T0 should be reserved for spindle full retract (for tool changes,
rapid moves, program end, etc.). Each tool offset command must be on a
separate line. Tool offsets are based on G53, the machine coordinate system.
        Tool offsets can be set in manual mode, MDI mode, or imbedded in a
part file.

        T## Call Tool Offset. To avoid confusion this command should be on a
seperate line.

        F### Feedrate Command. Feedrates are .1 to 100, and the current
feedrate stays in effect until a new feedrate is read. The first G01 command
MUST include a feedrate command or the control will default to F1.
        Backlash takeup is at F100, but the default accel/ decel parameters
are in effect so large amounts of backlash will cause a noticible dwell.

        S#### Spindle Speed Command. This has no effect, though the value will
be displayed and can be used to alert the operator to change speeds.

        M## Machine Codes. Only a few machine codes are supported. Each
M-code must be on a separate line. They are:

        M00 Program Halt. Program execution stops, and coolant and spindle are
turned off. Program execution resumes when the start button is pressed, or
control can be transfered to the menu screen by pressing the stop button. Use
M00 in the middle of a file to safely change tools or check dimensions.

        M02 Program End. Program execution stops, coolant and spindle are
turned off, program execution jumps to the menu screen. Restart is not
possible, lines after an M02 can not be executed.

        M03 Start Spindle. Turns on relay A.

        M05 Stop Spindle.

        M06 Stops spindle, turns off coolant, stops program execution. Useful
for tool changes.

        M08 Coolant On. Turns on relay B.

        M09 Coolant Off.

        M30 Program End & Re-wind. Program execution stops, coolant and
spindle are turned off, program execution goes to the beginning of the
current part file. Use M30 to make multiple parts without having to
re-enter the part's name.

        M98 and M99, Go To and Return From Subroutine are not supported, use
cut and paste in your text editor to accomplish the same thing.

        

                                   END
