
	 	  	V38, V38, V40 Changes

       (c) 1992-93 Commodore-Amiga, Inc.  All Rights Reserved

------------------------------------------------------------------------
NOTE: This document was written before the release of V39 and therefore
some of the changes noted may have actually ended up in earlier or later
releases, or may not have occurred at all.  However, it is still a very
useful document summarizing changes to the disks and the ROM.
V38 is 2.1, V39 is 3.0, and V40 is 3.1.
------------------------------------------------------------------------

Many changes were made to the system software for V39.  The major
differences are in the graphics subsystem and in Intuition.  There were
also hundreds of changes made to other areas of the system software.  This
document presents the majority of these changes, and explains the possible
impact of these new features on the developer. 

V39 requires both a new disk set, and a new ROM.  V38 is a disk-based
upgrade requiring only a new disk set if your system have 2.04 Kickstart.

The main changes to the contents of the disks in V39 are detailed in
Appendix A and in Appendix B.  Here are the highlights of changes to
system disk organization:

   o The V38/V39 system software is shipped on FFS floppies.  This is
mainly to increase available storage. 

   o Under V38, a Storage drawer was created on the Extras disk.  Under
V39, a separate Storage disk is provided.  Storage contains the same five
drawers as in the Devs drawer.  This is where things that are not
currently used are kept.  To activate a monitor, the user is expected to
drag the desired monitor icon from Storage/Monitors to Devs/Monitors.
Same applies for printer drivers, keymaps, DOS drivers, and datatypes

   o The Fonts disk is now called FONTS instead of AmigaFonts.  This
enables the disk to be used directly whenever fonts are needed by the
system, instead of requiring the user to assign FONTS: to the disk. 

   o Note that there are different specific disk sets shipped with
different machines and packages.  For example, low-end V38 systems do not
get a Locale disk, and instead have a Locale directory on the Workbench
disk. 

   o Deleted Files.  The following system files present under V37 are no
longer included with the system software. 

  Devs/narrator.device    Deleted as part of the removal of speech support.
  Libs/translator.library Deleted as part of the removal of speech support.

  Tools/Colors Removed in V39 because its functionality conflicted with
pen sharing, and was generally not very nice to applications. 
  Utilities/Display This program is replaced under V39 by the more
flexible and powerful MultiView utility. 
  Utilities/More.info This icon has been removed because we want to
encourage users to use MultiView instead of More when running from
Workbench.  The More program itself remains on the disk since it is
referenced by many read me files, and the like. 

   o Speech Support.  The various components supporting synthesized speech
are no longer included with the operating system.  This can be a serious
liability for applications depending on synthesized speech for correct
operation.  The V37 components supporting speech still function correctly
under V38 and V39.  The V38/V39 installation procedures do not remove the
V37 files when updating a system. 

Further etails of how the system disks have changed can be found in
Appendix A and B.  V39 ROM changes are listed in Appendix C and D. 


V38/V39 API Changes
===================
 This section discusses what changes in the programming model can affect
developers. 

Finding Version Information

An important point to mention is how to determine if a system is running
V38 instead of V37.  The recommended approach is to open version.library,
and check its version.  For example:

struct Library *VersionBase;
if (VersionBase = OpenLibrary("version.library",0))   
{
       if (VersionBase->lib_Version >= 38)
       {           /* user is running at least V38 Workbench */       }
       else
       {           /* user is running at most V37 Workbench */       }   
}   
else   
{     /* can't tell what the user is running, assume the minimum version
       * that your application supports        */   
}

The above technique lets you determine which general version is in use for
the disk-based software.  Never assume this is a reflection of every other
library in the system.  For example, if you need features that are only
present in V38 asl.library, you must explicitly check the version of
asl.library before using it.  The same is true for all other system
libraries. 

To determine the general version of the ROM, use
SysBase->LibNode.lib_Version.


GadTools Library
================

Many enhancements were made to GadTools for V39.  Below you will find
short descriptions of some of the new features.  A complete list of all
the new features is provided in Appendix A, and more details can be had in
gadtools.doc. 

Menus.  GadTools fully supports Intuition's NewLook menus.  NewLook menus
can be added to an application by providing the {WA_NewLookMenus, TRUE}
tag to OpenWindowTags(), and providing the {GTMN_NewLookMenus, TRUE} tag
to LayoutMenus().  These two tags will give your application NewLook
menus.  The pens used to render these menus are controllable by the user
through the V39 Palette prefs editor. 

You can now put an arbitrary command string in the right-hand side of a
menu, where the Amiga-key equivalent normally goes.  To do this, point the
NewMenu.nm_CommKey field at the string (e.g., "Shift-Alt-F1), and set the
new NM_COMMANDSTRING flag in NewMenu.nm_Flags. 

GT_GetGadgetAttrs().  GadTools now has a GT_GetGadgetAttrsA() function
which retrieves attributes of the specified gadget, according to the
attributes chosen in the tag list.  For each entry in the tag list, ti_Tag
identifies the attribute, and ti_Data is a pointer to the long variable
where you wish the result to be stored. 
 Here is an example:

     LONG top = 0;
     LONG selected = 0;
     LONG result;
     result = GT_GetGadgetAttrs(listview_gad, win, NULL,
                                GTLV_Top, &top,
                                GTLV_Selected, &selected,
                                TAG_DONE);
     if (result != 2)
     {
         printf( "Something's wrong!" );
     }

Palettes.  GadTools palette gadgets got a major overhaul for V39.  There
are a few new features, some reduction in memory usage, and an increase in
performance. 
 
Palette gadgets no longer display a box filled with the selected color.
The selected color is instead denoted by a box drawn around the color
square in the main palette area.  This change slightly impacts the size of
palette gadgets.  Depending on the conditions, V39 PALETTE_KIND gadgets
can be slightly smaller than the V37 ones. 
 
Another change which can affect the size of the palette gadgets is the
smarter layout of the color squares.  An attempt is now made to keep the
color squares as square as possible, based on the aspect ratio information
obtained from the gfx database.  As many color squares as possible are put
on the screen, until things get too small in which case the upper colors
are thrown away.  The GTPA_ColorTable tag was added in support of sparce
color tables.  It lets you define arbitrary pens to be used to fill-in the
color squares of the palette gadget. 

The GTPA_NumColors tag lets you define the exact number of colors to
display in the palette gadget.  Under V37, the GTPA_Depth tag played the
same role.  The problem with GTPA_Depth is that only multiples of 2 in
number of colors can be specified.  GTPA_NumColors allows any number of
colors. 

Listviews.  GadTools listviews got a major overhaul for V39.  There are a
few new features, some reduction in memory usage, and an increase in
performance. 

The biggest difference that is readily noticeable is the disappearance of
the display box at the bottom of the scrolling list area.  Instead of
showing the selected item in the display box, the selected item remains
highlighted within the scrolling list.  This was done to prepare listviews
for multi-select support.  Multi-selection requires a highlighting scheme
as a display box would not work.  The removal of the display box has a
slight impact on the size of the listview.  Listviews that had a display
box under V37 got slightly smaller vertically under V39. 

The other major addition to GadTools listviews is GTLV_CallBack.  This tag
allows a callback hook to be provided to gadtools for listview handling.
Currently, the hook only gets called to render an individual item.  Every
time GadTools wishes to render an item in a listview, it invokes the call
back function, which can do custom rendering.  This allows GadTools
listviews to be used to scroll complex items such as graphics and images. 

Finally, listviews can now be disabled using {GA_Disabled, TRUE}.


The ASL Library
===============

ASL got rewritten for V38.  Its file requester is now extremely fast and
offers more features to the user, and to the programmer.  Its font
requester now comes up about twice as fast the first time it is displayed,
and instantaneously for subsequent uses.  ASL also now includes a screen
mode requester, which is very useful in the context of AA, and will be
invaluable for AAA and RTG. 

New Names.  V38 <libraries/asl.h> contains new names for most of the
structures, tags, and flag bits used by ASL.  The names are now
consistent, and more descriptive.  We encourage the use of the new names
as much as possible. 

To ensure your code only uses the new names, just define the symbol
ASL_V38_NAMES_ ONLY before including <libraries/asl.h>:

#define ASL_V38_NAMES_ONLY 
#include <libraries/asl.h>

The symbol definition will prevent the old-style names from being defined.
This is the same method used to disable the pre-V37 names in Intuition
header files. 

Don't Trust Me.  The many filtering tags that you can supply to the ASL
requesters are only advisory in nature.  For example, even if you request
that only non-proportional fonts be allowed in the font requester, the
user can still type in the name of a proportional font.  The user can also
enter out-of-bounds values for any numeric parameter.  You must check all
results for sanity prior to using them. 

Common ASL Tags.  The tags for the different requesters are now distinct
from one another instead of being all grouped together.  All options that
could be set via flag bits now have individual tags to control them.  For
example, there is now an ASLFR_DoSaveMode tag that does the same as the
FRF_DOSAVEMODE flag bit. 

Some basic tags are supported by all requester types:

ASLXX_Window.  This indicates the parent window of the requester. You
provide a window pointer, and if you don't specify an ASLXX_Screen tag,
then the ASL requester will open on the same screen as this window. 

ASLXX_PubScreenName.  You provide this tag with the name of a public
screen to open the ASL requester on. 

ASLXX_Screen.  You provide this tag with a pointer to a Screen to open on.
If none of the above three tags are specified, then the ASL requester will
open on the current default public screen.  This will most likely by
Workbench. 

ASLXX_PrivateIDCMP.  By default, ASL requesters use the same IDCMP port as
their parent window (specified using ASLXX_Window).  You can request that
a private IDCMP port be used by setting this tag to TRUE.  If you don't
provide a parent window, then a private port is automatically used and
this tag need not be provided. 

ASLXX_IntuiMsgFunc.  You provide this tag a pointer to a Hook structure,
which indicates a routine to run whenever an IntuiMessage arrives at the
ASL requester's IDCMP port that is not meant for the requester's window.
This happens whenever the ASL requester is sharing the parent's window
IDCMP port, and a message for the parent window arrives at the port.  The
function being called can process the message for the application. 

ASLXX_SleepWindow.  If you set this tag to TRUE, ASL will put the parent
window (specified using ASLXX_Window) to sleep until the ASL requester is
satisfied. This involves blocking all input in the parent window, and
displaying a busy pointer in it. 


ASLXX_TextAttr.  You can provide a pointer to a standard TextAttr
structure which defines the font to use in the ASL requester.  If this tag
is not supplied, the default behavior is to use the font of the screen on
which the requester opens.  Note that just like for Intuition objects, the
font indicated by the TextAttr structure must already be in memory before
using the requester.  There is no guarantee that ASL will actually use the
font you asked for.  If that font is too large, ASL will use a smaller
one.  Also, as of V39, the file requester's file list requires a monospace
font.  So if you provide a proportional font, the file requester will use
the system default font instead for its list of files. 

ASLXX_Locale.  You pass this tag a pointer to a Locale structure, as
obtained from the locale.library/OpenLocale() function.  The locale is
used to determine in which language, and using which country information,
the various requesters should be displayed.  If this tag is not provided,
or its value is NULL, then the default system Locale is used.  This
corresponds to what the user has currently picked in the Locale prefs
editor.  As of V39, certain items such as the dates in the file requester
always use the system default Locale instead of the Locale provided with
this tag. 

ASLXX_TitleText.  Provide this tag a string which will be used for the
title of the requester.  If this tag is not provided, the requester has no
title. 

ASLXX_PositiveText.  Provide this tag a string which will be used for the
label of the positive choice gadget in the requester.  If this string is
not provided, a localized default is used (English default is "OK").  We
recommend using this tag to make the action of the various requesters more
clear to the user.  For example, when a file requester is being displayed
to load a file, it is clearer if the gadget says "Open" instead of simply
"OK". 

ASLXX_NegativeText.  Provide this tag a string which will be used for the
label of the negative choice gadget in the requester.  If this string is
not provided, a localized default is used (English default is "Cancel"). 

ASLXX_InitialLeftEdge, ASLXX_InitialTopEdge, ASLXX_InitialWidth,
ASLXX_InitialHeight.  These four tags let you specify the position and
size of the ASL requester window.  These are only requests that ASL may
decide to ignore.  When an ASL requester is closed, it is easy to
determine the position and size of the requester when the user closed it.
It is a good idea for an application to remember these values and use them
in subsequent invocations of the requester. 

The File Requester.  The file requester supports a number of tags.  Some
of the tags introduced in V38 are discussed here. 

Note that the future holds many changes in the ASL file requester that
will substantially increase its flexibility to both the programmer and the
user.  If you use the ASL file requester in your applications today, you
will automatically get the majority of these new features when they become
available.  Rolling your own file requester means a lot of extra work, and
means that you will not automatically benefit from the new interface when
it becomes available. 

ASLFR_DoSaveMode.  Setting this tag to TRUE indicates the file requester
is being used for saving information.  When in save mode, the file
requester changes slightly.  The most obvious change is the use of a
different set of colors in the file list.  This is a direct queue to the
user that something is being selected for writing, not reading.  Second
change is that if the user enters a directory name which doesn't exist,
ASL will prompt the user to see if the user wishes to create the
directory.  This lets the user create new directories to save files into.
There are likely to be more differences between normal and save mode in
the future.  Please use this tag when appropriate. 

ASLFR_RejectIcons.  When set to TRUE, this tag prevents icons (.info
files) from being displayed in the file requester.  If this tag is not
specified, icons will be displayed by the file requester.  Please use this
tag in all your software.  Workbench users should never have to see .info
files.  The default behavior of the file requester is to display .info
files, which is incorrect. Unfortunately, this default behavior cannot be
changed due to compatibility. 

ASLFR_DoPatterns.  Setting this tag to TRUE causes a Pattern gadget to be
displayed in the file requester, which allows the user to enter AmigaDOS
patterns to filter out files.  The default is to have no pattern gadget. 

ASLFR_DrawersOnly.  Setting this tag to TRUE causes the file requester to
have no File gadget, and to only display directory names in its file list.
This is a useful option if you wish to have the user select a destination
directory for a particular task. 

ASLFR_RejectPattern.  Provide an AmigaDOS pattern to this tag, and any
files matching this pattern will not be displayed in the file requester.
This pattern can never be edited by the user.  Note that the pattern you
provide here must have already been parsed by
dos.library/ParsePatternNoCase(). 

ASLFR_AcceptPattern.  Provide an AmigaDOS pattern to this tag, and only
files matching this pattern will be displayed in the file requester.  This
pattern can never be edited by the user.  Note that the pattern you
provide here must have already been parsed by
dos.library/ParsePatternNoCase(). 

ASLFR_FilterDrawers.  Setting this tag to TRUE causes the
ASLFR_RejectPattern, ASLFR_AcceptPattern, and the Pattern text gadget to
also apply to filter drawer names.  Drawers are normally never affected by
pattern filtering. 

The Screen Mode Requester.  The screen mode requester allows the user to
select amongst the wide range of display modes available on the Amiga.
Future chip sets, and the RTG effort will yield a very large additional
number of display modes.  Using the ASL requester is a good way to ensure
that you benefit from the maximum upwards compatibility possible.  In many
cases, by using the screen mode requester, your applications will
automatically be able to open displays in new modes that are introduced in
future OS revisions. 

An important point to note is that the interface presented to the user by
the screen mode requester is likely to change dramatically in the future.
This is because the increased number of available modes will make the
current interface difficult to use and understand at best.  A new scheme
is being developed that should allow the user to more easily and
accurately pick display modes.  If you use the ASL screen mode requester
in your applications instead of rolling your own version, your application
will automatically get this new interface when it becomes available. 

The ultimate goal of the screen mode requester is to return a graphics
mode id.  The mode ids are used since V37 to distinguish between the
different display modes in the system.  The screen mode requester can also
return additional information including requested display sizes and depth. 

As all other ASL requesters, you get the result of a request by reading
the contents of the requester structure after the AslRequest() calls
return success.  There are two fields worth mentioning in the
ScreenModeRequester structure: sm_BitMapWidth and sm_BitMapHeight.  These
values define the values to pass to AllocRaster() and InitBitMap() when
hand-building a BitMap structure to display the requested width, height,
and depth.  This is useful when running on a V37 ROM.  For V39 use, simply
use the values in sm_Width and sm_Height, and pass those to AllocBitMap()
directly. 

Here are the most important screen mode requester tags.

ASLSM_InitialDisplayID.  This tag sets the initial mode that is selected
in the mode listview.  You provide it a graphics mode id, and that mode
will be initially selected in the file requester. 

ASLSM_InitialDisplayWidth, ASLSM_InitialDisplayHeight,
ASLSM_InitialDisplayDepth.  These tags determine the initial setting of
three gadgets that can optionally be displayed in the requester.  The
default if these tags are not provided are a width of 640, a height of
200, and a depth of 2. 

ASLSM_InitialOverscanType.  This tag determines the initial setting of the
Overscan Type cycle gadget.  This optional gadget lets the user pick which
overscan setting to use for the given mode.  The values you can provide to
this tag are: OSCAN_TEXT, OSCAN_STANDARD, OSCAN_MAXIMUM, and OSCAN_VIDEO.
OSCAN_VIDEO is only available starting with V39, it is not in V38.  The
four OSCAN_XX constants are defined in <intuition/screens.h>. 

ASLSM_InitialAutoScroll.  This tag can be set to TRUE or FALSE and
determines what the initial state of the option AutoScroll checkbox gadget
should be. 



ASLSM_DoWidth, ASLSM_DoHeight, ASLSM_DoDepth, ASLSM_DoOverscanType,
ASLSM_DoAutoScroll.  These tags control which of the optional gadgets is
displayed in the screen mode requester.  The default is to have none of
these present.  Setting any of these tags to TRUE will make the gadget
appear. 

ASLSM_MinWidth, ASLSM_MaxWidth, ASLSM_MinHeight, ASLSM_MaxHeight,
ASLSM_MinDepth, ASLSM_MaxDepth.  These tags let you specify limits to the
values the user is allowed to enter in the requester. 

ASLSM_PropertyFlags, ASLSM_PropertyMask.  These two tags cooperate to
allow a flexible means of filtering out unwanted display modes.  Each
display mode in the graphics database has a given set of properties
associated with it.  These tags allow you to determine which modes to
display in the mode list of the requester based on the properties of the
modes. 

	The mode properties are defined as a ULONG of flag bits.  The
definitions for all supported properties are in <graphics/displayinfo.h>.
Examples include DIPF_IS_WB and DIPF_IS_LACE. 

	ASLSM_PropertyMask defines which properties you are concerned with.
Those are the only bits for which the specific setting matters to you.
The setting of all other property bits doesn't matter to you. 

	ASLSM_PropertyFlags defines exactly in which state the property
flags you are have shown interest in via the ASLSM_PropertyMask tag should
be. 

	The way ASLSM_PropertyMask and ASLSM_PropertyFlags interact is
indentical to how the two flags parameters interact in
exec.library/SetSignal().  This is how ASL uses the tag values internally:

	     if ((displayInfo.PropertyFlags & propertyMask) ==
	        (propertyFlags & propertyMask))
	     {
	         /* Mode accepted */
	     }
	     else
	     {
	         /* Mode rejected */
	     }
 
	An example can help understand the relationship between the two
tags.  If you want to display only screen modes that can be used for the
Workbench screen, and that are not interlaced, you would set
ASLSM_PropertyMask to (DIPF_IS_WB|DIPF_IS_LACE), and ASLSM_PropertyFlags
to (DIPF_IS_WB).  The mask value means you are interested in the state of
the DIPF_IS_WB and DIPF_IS_LACE bits.  The flags value says you want the
DIPF_IS_WB to be set, and the DIPF_IS_LACE bit to be clear. 


The Locale Library
==================
The locale.library provides the core of system localization.
See other readmes about Locale.library.

The Bullet Library
================== 
The bullet.library contains the Compugraphic outline font rendering
engine. 



Color Wheel and Gradient Slider
===============================

The color wheel and gradient slider are two new BOOPSI classes introduced
in V39. Together, they offer a very nice interface to let the user select
or adjust colors.  The V39 Palette prefs uses both classes in its
interface. 

Using either of these classes requires you to first open them as
libraries, and then create new BOOPSI objects using the NewObject()
function:

     if (ColorWheelBase = OpenLibrary("gadgets/colorwheel.gadget",0))
     {
         cw = NewObject(...);
     }

For an introduction to programming the color wheel and gradient slider,
refer to the 3.0 colorwheel example. 

The colorwheel.gadget.  The color wheel class provides the ability to
create gadgets enabling the user to control the hue and saturation
components of an HSB (Hue-Saturation-Brightness) color space.  The
companion gradient slider class enables control of the brightness
component of the color space. 

The color wheel can operate on screens of any depth, and adapts its
rendering to the number of colors available.  The system's pen sharing
system is used in order to maximize the number of colors used by the
wheel.  A color wheel gadget is (normally) responsible for choosing it's
own color pens to draw in (using graphics.library/ObtainBestPen()).
However, the creator of the gadget can "donate" some of its pens to the
gadget, using the WHEEL_Donation tag. 

The reason that the color wheel picks its own colors is because it has the
ability to display several different layouts depending on the number and
variety of colors available.  For example, when opening on a screen of low
depth or when opening on a screen where all the pens have already been
allocated exclusively, the gadget will display a "monochrome" version of
the color wheel, where instead of colored segments, the letters "R" (for
red), "G" (for green), "B" (for blue), "Y" (for yellow), "C" (for cyan)
and "M" (for magenta) will be used as labels. 

You can talk to the color wheel using HSB or RGB, even though the color
wheel only really deals with HSB in its user-interface.  All
communications with applications are performed with full 32-bit color
component values.  Internally everything is currently kept and processed
in 16-bit space, although this might change in the future. 

Here are the main tags supported by the color wheel class:

WHEEL_Hue.  Lets you control the Hue component of the color wheel.  This
is effectively the angle around the wheel where the desired color lies.  A
hue value of 0 is all red, and nothing but red.  Increasing the value
moves the color towards all green at $55555555, full blue at $AAAAAAAA,
and back to red at $FFFFFFFF. 

WHEEL_Saturation.  Lets you control the Saturation component of the color
wheel.  This is effectively the distance from the center of the wheel
where the desired color lies.  A saturation value of 0 puts the knob at
the center of the wheel and always yields white.  Increasing the value
progressively moves the knob farther away from the center.  until the
value $FFFFFFFF is reached in which case the knob is as far as it can go. 

WHEEL_Brightness.  Lets you control the Brightness component of the color
wheel.  The color wheel does not itself have any means of displaying or
editing brightness, but it does maintain this value internally.  Used with
the WHEEL_GradientSlider tag, you can control the value of a
gradientslider object by passing WHEEL_Brightness to a color wheel.  A
brightness value of 0 means all black.  Increasing the value progressively
brightens the current color, until the value $FFFFFFFF is reached in which
case the color is as bright as it gets. 

WHEEL_Red, WHEEL_Green, WHEEL_Blue.  Let you specify new RGB values for
the color wheel.  The values provided are converted into HSB values are
then used. 

WHEEL_Screen.  This is a required tag that lets you specify the screen on
which the color wheel is to be displayed.  Note that once a color wheel is
created, the screen should not be closed until the color wheel object is
discarded using DisposeObject(). 

WHEEL_BevelBox.  If you set this tag to TRUE, a bevel box will be drawn
around the color wheel object. 

WHEEL_GradientSlider.  This tag lets you attach a gradient slider object
to the color wheel.  You give this tag a pointer to a gradient slider
object obtained previously from NewObject().  Once this is done, anytime
the various tags that can affect the brightness component of the current
color is sent to the color wheel, the color wheel automatically changes
the value of the attached gradient slider to match that new brightness
value.  Reading the brightness value from the color wheel returns the
current value indicated by the gradient slider. 

	Using this tag effectively allows you to treat the color wheel and
gradient sliders as a single gadget.  Once things are set up, all
communications occur through the wheel object, and the gradient slider can
pretty much be ignored. 

The gradientslider.gadget.  The gradient slider gadget class is a type of
non-proportional slider.  The primary feature of the gradient slider is
it's appearance.  Unlike normal sliders, a gradient slider can display a
"spread of colors" or "color gradient" in the slider container box.  The
"knob" or "thumb" of the slider appears to slide on top of this color
gradient. 

The color gradient effect is built-up using a combination of multiple pens
and half-tone dithering.  The application must tell the slider exactly
which pens to use in creating the gradient effect, and in what order to
use them. Essentially, it does this by passing an array of pens
(terminated by ~0, just like a PenSpec) to the slider.  The first pen in
the array is used as the color at the top of the slider (or left, if it is
horizontal), and the last color in the array is used at the bottom (or
right).  The other pens will be used at evenly spaced intervals in
between.  Dithering is used to smoothly fade between the pens, allowing
the illusion of a continuous change in color. 

Here are the main tags supported by the gradient slider class:

GRAD_MaxVal.  Lets you set the maximum value supported by the slider.
This must be in the range $0..$FFFF. 

GRAD_CurVal.  Lets you set the current value of the slider.  This should
be in the range 0..GRAD_MaxVal. 

GRAD_PenArray.  Lets you specify an array of pens that the slider should
use to create its gradient background.  The array can contain any number
of pens, and is terminated with a pen value of ~0.  These pens can be
allocated as shared, since their RGB value is not altered by the slider.
The first pen is used on the top or left of the slider, and the last pen
is used on the bottom or right.  All other pens are evenly spaced out and
used in between.  Dithering is used between the pens to enhance the
smoothness of the gradient transition. 

	A NULL pen array causes the background of the slider to be rendered
in the screen's background color.  A pen array containing only a single
pen causes the background to be rendered using that pen. 
 




New File Systems
================
The V39 ROM file system supports 6 different disk formats:

   o DOS\0 This is the traditional Amiga file system.  It has 488 bytes of
data per block.  It offers a high level of redundancy and validation which
makes it very reliable.  It is also fairly slow. 

   o DOS\1 This is the original Fast File System introduced in 1.3.  It
uses a disk layout quite similar to DOS\0, except it forgoes some
redundancy in the name of speed.  It stores 512 bytes per block, and runs
substantially faster than DOS\0. 

   o DOS\2 This is an international flavor of DOS\0.  The only difference
between this format and DOS\0 is the hashing algorithm used to locate the
files and directories on the disk.  DOS\0 has a bug in dealing with making
international characters case-sensitive.  DOS\2 corrects this bug, and is
otherwise identical to DOS\0. 

   o DOS\3 This is an international flavor of DOS\1.  The only difference
between this format and DOS\1 is the hashing algorithm used to locate the
files and directories on the disk.  DOS\1 has a bug in dealing with making
international characters case-sensitive.  DOS\3 corrects this bug, and is
otherwise identical to DOS\1. 

   o DOS\4 This is a directory-caching version of DOS\2.  It has the same
general disk layout, with the addition of special directory cache blocks.
These cache blocks store the contents of each directory.  The advantage of
this is that getting a directory listing can be an order of magnitude
faster than on normal DOS\2 disks.  The directory caches require a slight
amount of disk space, and maintaining them slightly slows down file
creation, deletion, and update.  This file system is mostly meant for
floppies, as it doesn't generate a very noticeable performance increase on
hard drives. 

   o DOS\5 This is a directory-caching version of DOS\3.  It has the same
general disk layout, with the addition of special directory cache blocks.
These cache blocks store the contents of each directory.  The advantage of
this is that getting a directory listing can be an order of magnitude
faster than on normal DOS\3 disks.  The directory caches require a slight
amount of disk space, and maintaining them slightly slows down file
creation, deletion, and update.  This file system is mostly meant for
floppies, as it doesn't generate a very noticeable performance increase on
hard drives. 

Disk Block Format.  Here are some notes concerning changes to the disk
block format required by the new SetOwner() call, and more importantly the
changes present in DOS\4 and DOS\5 to support directory caching.  The
format of root blocks is unchanged under V39. 

The format of file header blocks is slightly different in order to store
owner information.  One of the reserved fields is now being used:

struct FileHeaderBlock
{
    ULONG  fhb_Type;         // T.SHORT
    ULONG  fhb_OwnKey;	     // key of this block
    ULONG  fhb_HighSeq;      // total blocks in file
    ULONG  fhb_DataSize;     // number of data block slots used
    ULONG  fhb_FirstBlock;   // first block in this file
    ULONG  fhb_Checksum;     // checksum of this block

    ULONG  fhb_HashTable[];  // variable number of hash table entries

    ULONG  fhb_Reserved      // always 0
    ULONG  fhb_OwnerXID      // owner UID/GID
    ULONG  fhb_Protect       // protection bits
    LONG   fhb_ByteSize      // total size of file in bytes
    char   fhb_Comment[92];  // comment as a BCPL string
    ULONG  fhb_Days;         // creation date and time
    ULONG  fhb_Mins;
    ULOGN  fhb_Ticks;
    char   fhb_FileName[36]; // filename as BCPL string
    ULONG  fhb_Link;         // pointer to object header is linked to
    ULONG  fhb_BackLink;     // pointer to previous object in link chain
    ULONG  fhb_HashChain;    // next entry with same hash value
    ULONG  fhb_Parent;       // pointer back to parent directory
    ULONG  fhb_Extension;    // 0 or pointer to first extension block
    ULONG  fhb_SecType;      // ST.FILE
};

User directory blocks were modified to add the same owner information as
for file header blocks.  Under DOS\4 and DOS\5, the user directory blocks
also point to the new directory cache blocks. 

struct UserDirectoryBlock
{
    ULONG  udb_Type;         // T.SHORT
    ULONG  udb_OwnKey;       // key of this block
    ULONG  udb_SeqNum;       // highest seq (always 0)
    ULONG  udb_DataSize;     // always 0
    ULONG  udb_NextBlock;    // always 0
    ULONG  udb_Checksum;     // checksum of this block

    ULONG  udb_HashTable[];  // variable number of hash table entries

    ULONG  udb_Reserved;     // always 0
    ULONG  udb_OwnerXID;     // owner UID/GID
    ULONG  udb_Protect;      // protection bits
    ULONG  udb_Junk;         // not used (always 0)
    char   udb_Comment[92];  // comment as a BCPL string
    ULONG  udb_Days;         // creation date and time
    ULONG  udb_Mins;
    ULONG  udb_Ticks;
    char   udb_DirName[36];  // name as a BCPL string
    ULONG  udb_Link;         // pointer (key number) to object linked to
    ULONG  udb_BackLink;     // back pointer to previous hard link header
    ULONG  udb_HashChain;    // next entry with same hash value
    ULONG  udb_Parent;       // pointer back to parent
    ULONG  udb_DirList;      // DOS\4 and DOS\5 use this for the dir cache
    ULONG  udb_SecType;      // ST.USERDIR
};

A new block type added in support of DOS\4 and DOS\5 is the file list
block.  This is where directory information is cached by the file system.
When looking at a file list block, is it critical to check the fhl_Type
field of the block to ensure that it is a known block format.  Unknown
block formats should be ignored.  On a DOS\4 and DOS\5 partitions, the
file system is able to rebuild cache blocks if it finds older versions
present, or if it finds no cache block for a given directory. 

struct FileListBlock
{
    ULONG  fhl_Type;       // T.DIRLIST
    ULONG  fhl_OwnKey;     // key of this block
    ULONG  fhl_Parent;     // key of parent directory
    ULONG  fhl_NumEntries; // amount of data on this block
    ULONG  fhl_NextBlock;  // next block in sequence of file list blocks
    ULONG  fhl_Checksum;   // checksum of this block
};

Following the above structure on a disk block comes the actual cache
information for the directory.  There is one cache entry for every file
and directory within the cache.  These entries vary in size based on the
length of the file name and comment for the entry.  A cache entry looks
like:

struct ListEntry
{
    ULONG fle_Key;	  	      // Key (fhb block) of file
    ULONG fle_Size;	       // size in bytes
    ULONG fle_Protection; // protection bits
    ULONG fle_OwnerXID;	   // owner info
    UWORD fle_Days;	       // date (allows 179 years)
    UWORD fle_Min;	        // 0..(60*24 - 1)
    UWORD fle_Tick;	       // 0..3599
    UBYTE fle_Type;	       // ST.XXXXX (all fit in a byte)
    char  fle_FileName[]; // variable length BCPL string
    char  fle_Comment[];  // variable length BCPL string
};

These are the values for the various constants referred to above:

// block type constants
#define T.DELETED 1
#define T.SHORT   2
#define T.LONG    4
#define T.DATA    8
#define T.LIST    16

DCFS_REV		1
DIRLIST_KEY	32
DIRLIST_MASK	0xffffffe0
T.DIRLIST	(DIRLIST_KEY | DCFS_REV)

ST.FILE     -3
ST.ROOT     1
ST.USERDIR  2



DOS Workarounds
===============

V37 dos.library has a few important bugs.  These bugs are fixed in V39,
and it is easy to work around many of these bugs under V37 to make sure
you don't get into trouble. 
 
AttemptLockDosList().  Under V37, AttemptLockDosList() would sometimes
return 1 on failure instead of NULL.  To check for failure of
AttemptLockDosList(), simply use:

   dl = AttemptLockDosList();
   if (!dl || (dl == (struct DosList *)1))
       /* failed */

FGets().  Under V37, FGets() will overrun the buffer you give it by one
byte, if it doesn't encounter a line feed or EOF before filling up your
buffer.  The work around is very simple: pass buffersize-1 to FGets(). 

ParsePatternNoCase().  Until V39, ParsePatternNoCase() did not correctly
treat character classes as case-insensitive.  That is [a-z] was different
than [A-Z].  The work around for this bug is to simply convert all
characters of the pattern to upper case before passing it to
ParsePatternNoCase().  Just use the utility.library/ToUpper() function to
convert all characters of the pattern to upper case. 

SetVBuf().  Until V39, the SetVBuf() function didn't do anything.
Starting with V39, it actually does in fact set the buffer sizes.  If you
use any of the buffered DOS IO calls, you can get a noticeable increase in
performance by increasing the buffer size of your files.  A good size is
4K.  You can simply add a SetVBuf() call after opening each of your files.
It won't do anything under V37, and will work under V39.  In most cases,
it is not even necessary to check for failure of SetVBuf().  When the call
fails, it just leaves the file handle with the same buffering it had
previously.  That's fine, you just won't get the performance increase for
that run of the program. 

SetVBuf() was not activated in the initial release of 3.0, it only becomes
available with 3.1. 


Commodities Library
===================

The commodities.library underwent a major overhaul in V38.  The result is
a much smaller, much less CPU hungry, and much less memory hungry library.
Many bugs were also found and fixed.  Finally, a few new features were
included.  All of the commodity programs shipped with the system were also
revised. 

ReadArgs().  Commodities now use ReadArgs() instead of the custom
command-line parsing routines in amiga.lib.  This makes them more
consistent with the rest of the system.  We encourage third party
commodity writers to also switch to ReadArgs().  Keyword Synonyms.
ParseIX() now understands many synonyms for keys and qualifiers.  The
intent was to provide more consistent naming, and to decrease the
likelihood the user would make a mistake while entering a key sequence.

Input Events.  A bug that was found in a few applications during V39
development was the incorrect initialization of InputEvents inserted into
the input.device's input stream.  These events can work most of the time,
and suddenly not work with specific applications.  Of specific interest,
the inputEvent->ie_SubClass was found to often contain garbage.  This
field should generally be set to 0.  Another field that is often
incorrectly initialized is the ie_TimeStamp field. Make sure this field
has something meaningful in it.  Note that using the IND_WRITEEVENT
input.device command automatically initializes the ie_TimeStamp field. 

Bugs In commodities.library.  Under V37, input events output by translator
objects were inserted into the input stream after the commodities.library
input handler.  This was contrary to the documentation.  Starting with
V38, events generated are inserted immediately following the translator
object.  This means commodity objects coming after the translator now get
to see the translated events, while in V37, they wouldn't. 

Another bug with translator objects is that they insert their attached
list of input events in reverse order.  This cannot be fixed due to
compatibility problems.  It is easily worked around by arranging the input
events in the reverse order of how you want them to be inserted.  The
InvertString() function in amiga.lib generates an inverted list of input
events, which is just fine for translator objects. 

Starting with V39, input events generated by translator objects are
stamped with the same time as the input event that activated the
translator.  This helps applications that look at the time of input
events. 

In V38, the ParseIX() function has a bug which prevents the following keys
on the numeric keypad from being used in commodities: .  9 ( ) / * +.
This bug is fixed in V39. 

Until V39, input events of type IECLASS_NEWPOINTERPOS never got their
extended tag list data copied when it needed to be.  This can cause
general confusion or crashes if a sender object is used on an event of
that type.  The only solution is to refrain from sending messages of type
IECLASS_NEWPOINTER. 

Until V39, the InvertKeyMap() function never initialized the ie_SubClass
and ie_TimeStamp fields of the input event it created.  The workaround to
this bug is simple:

     inputEvent->ie_SubClass           = 0;
     inputEvent->ie_TimeStamp.tv_secs  = 0;
     inputEvent->ie_TimeStamp.tv_micro = 0;
     if (InvertKeyMap(ansiCode,inputEvent,NULL))     ...


Mount Lists
===========

The Mount procedure got a major overhaul in V38.  The major change from
the user's perspective is that the handlers that get mounted in the system
can now be controlled exclusively through Workbench by dragging icons
around.  This is especially important in light of CrossDOS. 

New File Format.  Although the traditional DEVS:MountList file is still
fully supported, a new method of storing mount information is now
recommended.  The new format involves simply splitting up the various
entries that used to be in a mountlist, into separate files.  Each file
controls a unique handler.  The format for the information in the mount
files is the same as what is used in a traditional MountList with three
exceptions.  For example:

     /* Aux-Handler mount entry */
     Handler   = L:Aux-Handler
     Stacksize = 1000
     Priority  = 5

The differences with old style MountLists are as follows:

   	o Only a single device can be defined per file.
   	o The name of the device is not specified in the file and is
          instead the same as the name of the file. 
	o The # at the end of the entry can now be omitted.

Every parameter that can be specified in a mount file can also be
specified in the tooltypes for the icon of the mount file.  The parameters
in the tooltypes override any equivalent parameter setting present in the
mount file.  The format for the tooltypes is straightforward.  For
example:

	LOWCYL=0
	HIGHCYL=79

 This lets the Workbench user easily control certain attributes associated
with any given mount entry.  For example, the WB user can easily set the
size of RAD from tooltypes. 

 If the user wishes to only use your handler once in awhile, he can drag
the icon for the handler in the Storage drawer.  This prevents the handler
from being mounted on every boot.  If the user wants to use the handler
for a given session, he can then simply double-click on the mount entry
icon to get it mounted. 

 It is fairly simple to create an installation procedure that deals with
both old style and new style mount files:

if (V38)
   {
   /* Create a mount entry file.  If the user indicates he wants to use the
    * handler permanently, put it into DEVS:DOSDrivers.  Otherwise, just put
    * it into SYS:Storage/DOSDrivers.  Don't forget to provide an icon for
    * the mount entry.
    *
    * If the mount entry is in DEVS:DOSDrivers, it will get mounted
    * automatically when the system is rebooted.  The user can also mount
    * it for the current session by double-clicking on it.
    */
   }
else /* V37 or before */
   {
   /* Create an old-style mount entry and append it to DEVS:MountList.
    * Add a Mount statement in the user-startup of the system.
    */
   }

File System Resource List.  Mount now has the ability to fish out file
systems from the FileSystem.resource list.  When mounting a file system,
Mount first look in the FileSystem.resource to see if the system already
contains a file system of the correct DOS type.  If there is such a file
system, its seglist is used for the new handler. 

For example, the CrossDOS file system registers itself in the
FileSystem.resource the first time it is used.  Any subsequent attempts to
mount a handler having the same DOS type as the CrossDOS file system
results in that handler using the same seglist as the original CrossDOS
handler. 

If a file system seglist is reentrant, it should be added to the
FileSystem.resource list of file systems, which will enable it to be used
in the manner described above.  Be sure the seglist is totally reentrant
before doing this (no global variables).  Consult the Rom Kernal manual to
learn how to add a file system to the FileSystem.resource list. 

The new FORCELOAD keyword can be specified in mount entries.  When its
value is set to 1, it tells mount to always load the file system for this
handler from disk, even if it is present in the FileSystem.resource list.
This can be quite handy during the testing phase of a handler. 

Unit Keyword.  Stream handlers have always had the advantage of being able
to let the user provide startup arguments to the handler via the Startup
keyword.  For example:

   Startup = "this is a bunch of options"

The value of the parameter is available to the handler as a BSTR in the
dol_Startup field of the handler DosList structure.  This only works for
stream handlers though, file system handlers make use of the dol_Startup
field as a BPTR to the FileSysStartupMsg created for them by the Mount
command. 

The Unit keyword can now be used to passed textual options to a file
system handler.  If a string is specified in the mount entry, then the
fssm_Unit field of the file system's FileSysStartupMsg will be a C pointer
to the NULL-terminated argument string, instead of being the traditional
unit number.  New Values For GlobVec.  The GlobVec keyword in a mount list
can now be set to -2 and -3 in addition to the other values already
supported.  Here is a table of possible values:

GlobVec
Value	Meaning
  0 	Default global vector, used for handlers written in BCPL.
	Startup packet comes in a register. 
 -1	No global vector, used for C and ASM handlers.
	Process has to wait for startup packet. 
 -2	Same as -3, except for handlers written in BCPL.
 -3	No global vector, used for C and ASM handlers.
	The difference with -1 is that the handler can do DOS IO prior to
	returning its startup packet.  On the flip side, the handler is
	responsible for making sure there is only one instance of itself
	loaded by providing correct arbitration around the poking of the
	dol_Task field of the DosList structure.  With a GlobVec of -1,
	this is taken care of by DOS. 
 
Even though the values -2 and -3 are only allowed starting with the V39
Mount command, the V37 dos.library handles those values correctly.  It's
just that prior to V37, the Mount command would refuse to process these
values. 


Version Command
===============

There has been some confusion about what the format of version strings
are. The exact format is detailled in the Amiga User Interface Style Guide
on page 110.  The format is:

	$VER: <name> <version>.<revision> (dd.mm.yy)

The string starts with $VER: followed by a space, followed by <name>.
<name> is the name of the program.  <name> can NOT contain any spaces.
You can use underscores to achieve a similar effect. 

After <name> comes a single space, followed by <version>.  <version> is
the major version number for the program.  There should be no leading
zeros. 

After <version> comes a single space, followed by <revision>.  <revision>
is the minor version number for the program.  There should be no leading
zeros. 

Following the revision number comes a space, and then the date.  The date
is specified in numeric form only, with no leading zeros on any of the
components.  First comes the day of the month, then the month, then the
two digits year.  In the future, a four digit year format will also be
supported, but not yet. 

Embedding a version string in the exact format described above will let
the C/Version command find the version string.  In the future, there will
be a system call to enable applications, and other system tools, to obtain
the version information from files easily. 

ROM Tags.  The version command not only looks for the $VER: version
strings, it also search executable files for standard ROM tags.  ROM tags
only contain a version number, they have no revision or date fields.  The
recommended approach is to store a pointer to a version string in the
RT_IDSTRING field of the ROM tag. This string should be in the same format
as the normal version string, except without the "$VER: " prefix. 
 
An executable file containing a ROM tag with a properly initialized
RT_IDSTRING field does not need any other version information in it, such
as a separate $VER-style string. 
 
Leading Zeros.  Leading zeros are not supported as part of the version and
revision numbers. So "2.04" is not a valid version/revision pair as far as
the version command is concerned.  The reason this is so is because of the
VERSION and REVISION command-line options of the Version command.  These
allow the version and revision of a file to be checked by a script such
as:

   Version asl.library VERSION 38 REVISION 4

The above command will return 0 if asl.library is greater or equal to
38.4, and 5 if it is not.  Specifying:

   Version asl.library VERSION 38 REVISION 04

Does the same thing.  This means that from the standpoint of the Version
command, 2.04 is the same as 2.4, and thus 2.04 evaluates as being greater
than 2.1, which is not the desired effect.  So, the version and revision
numbers must not be treated as a floating-point number, but as two
separate and distinct integers. 

This brings up the concept of user versions and internal versions.  V37 is
known to the public as Release 2.04, and V39 is known as 3.0.  All the
version strings in the system software use version strings starting with
V39.  The recommended approach is as follows:

   o Assign your products user-space numbers of the form 2.04 and the like. 

   o Assign the various components of your distribution the same version
numbers as for your product.  For example, "2". 

   o Assign each individual components of your distribution their own
unique, monotonically increasing revision numbers.  These numbers have
nothing to do with the user- space number of your product as a whole. 

An example is in order.  Assume a word processor called
"SliceAndDiceWord", which is at version 4.03.  All the files composing the
distribution would have a version number of "4", and a file-specific
revision number:

   Package number : SliceAndDiceWord 4.03
   Main executable: SADW 4.1423
   Support library: SADW.library 4.4129
   README file    : SADW.README 4.6
 
When SliceAndDiceWord 5.0 comes out, all the version numbers of the files
included with the distribution get bumped to 5, and the revision numbers
start at 0 again. 
 

Miscellaneous
=============

This section presents miscellaneous tidbits of information worth noting
when developing applications. 

Overscan Names.  Starting with V38, the two user-settable overscan regions
are known as "Text Size" and "Graphics Size".  Please use the following
names in your user documentation:

	   OSCAN_TEXT      	-->  "Text Size"
	   OSCAN_STANDARD  	-->  "Graphics Size"
	   OSCAN_MAXIMUM   	-->  "Extreme Size"
	   OSCAN_VIDEO     	-->  "Maximum Size"

Audio Beep.  Starting with V38, the system provides standard support for
audio beeps, and complete sampled sounds, as a replacement for
DisplayBeep().  You may wish to rely exclusively on this feature instead
of providing your own application-specific control over an equivalent
feature. 

ToolType Comments.  We strongly encourage you to follow the convention
adopted in V38 with respect to specifying all tooltypes supported by an
application within the icon.  Any tooltypes not in use can be commented
out by putting a set of ( ) around the tooltype.  This causes Workbench to
ignore the tooltype, yet still leaves it there for the user to see and
uncomment. 

Keymap selection.  If you wish to offer application-specific control over
the keymap being used, you have to load the keymaps you wish to use from
disk yourself.  Some applications were using the SetMap command to load
keymaps into memory for them.  SetMap is no longer part of the system, so
this technique will no longer work.  The DevCon disks contain an example
showing how to load keymaps from disk. 

Note that if you wish to offer a list of keymaps to the user, you should
be looking in the KEYMAPS: assign list for the available keymaps.  To work
under V37, If this assign list doesn't exist, you can look in
DEVS:Keymaps. The example code shows how this can be done. 




Appendix A: V39 Disk Changes
============================

Following is a description of most of the important changes made to the
disk-based system software between V38 and the initial release of V39.
This doesn't cover changes made to modules covered in other readmes, such
as datatypes and AmigaGuide. 


C/Install

  o Doing "INSTALL DF0: CHECK" on a disk formatted with dir cache now
    reports the disk as either "DC-OFS" or "DC-FFS" as appropriate.

C/IPrefs

  o Requires Kickstart V39 and handles the new palette, pointer, and
    wbpattern preferences.

  o Is smarter about when it needs to reset the WB screen.  Now sends an
    initial IP_SCREENMODE message to Intuition to force the initial Workbench 
    screen to be interleaved even if there is no screenmode.prefs file.

  o Now uses utility.library 32-bit math routines and uses datatypes.library 
    to load sound samples instead of custom 8SVX code.

  o Causes much less screen flashing when changing fonts.  No longer has the 
    QUIT/S command-line option.  (Removing this option allows a few K of RAM 
    to be saved in every machine.  Gives better error messages when it can't 
    find a font or a picture.


C/Mount

  o Added support for GlobVec of -2 and -3.

  o No longer considers empty strings an error.  This allows something like:

      Device = ""

    to work.  This fix will be helpful to the Envoy software.  Note that this
    bug is in V38, so there will soon be many many Mount commands out there
    that don't support empty strings.

C/RequestChoice

  This is a new C: program that lets AmigaDOS and ARexx scripts use the
  Intuition EasyRequest() feature.  The template is:

    TITLE/A,BODY/A,GADGETS/M,PUBSCREEN/K

    TITLE
    Specifies the title of the requester.

    BODY
    Specifies the text of the requester.  Linefeeds can be embeeded using
    *n. 

    GADGETS
    Specifies the labels for the different gadgets at the bottom of the
    requester.

    PUBSCREEN
    Lets you specify the name of a public screen to open the requester on.

    The number of the selected gadget is printed at the console on exit,
    and is returned as the secondary return value (seen as the Result2
    variable in the Shell).



C/RequestFile

  This is a new C: program that lets AmigaDOS and ARexx scripts use the ASL
  file requester.  The template is:

    DRAWER,FILE/K,PATTERN/K,TITLE/K,POSITIVE/K,NEGATIVE/K,ACCEPTPATTERN/K,
    REJECTPATTERN/K,SAVEMODE/S,MULTISELECT/S,DRAWERSONLY/S,NOICONS/S,
    PUBSCREEN/K

    DRAWER
    Specifies the initial contents of the Drawer gadget.

    FILE
    Specifies the initial contents of the File gadget.

    PATTERN
    Standard AmigaDOS pattern.  Specifies the initial contents of the Pattern
    gadget.  Not providing this option causes the file requester not to have
    any Pattern gadget.

    TITLE
    Specifies the title of the file requester.

    POSITIVE
    Specifies the text to appear in the positive (left) choice in the file
    requester.

    NEGATIVE
    Specifies the text to appear in the negative (right) choice in the file
    requester.

    ACCEPTPATTERN
    Specifies a standard AmigaDOS pattern.  Only files matching this pattern
    will be displayed in the file requester.

    REJECTPATTERN
    Specifies a standard AmigaDOS pattern.  Files matching this pattern will
    not be displayed in the file requester.

    SAVEMODE
    Specifying this option causes the requester to operate in save mode.

    MULTISELECT
    Specifying this option causes the requester to allow multiple files to be
    selected at once.

    DRAWERSONLY
    Specifying this option causes the requester to not have a File gadget.
    This effectively turns the file requester into a directory requester.

    NOICONS
    Specifying this option causes the requester never to display icons (.info)
    files.

    PUBSCREEN
    Lets you provide the name of a public screen to open the file requester on.

  The selected files are printed on the console at exit, enclosed in double
  quotes and separated with spaces.  The command generates a return code of 0
  if the user selected a file, or 5 if the user cancelled the requester.

C/SetFont

  o Now sends ESC-C to the console handler only after doing SetFont() in the
    console window's rastport.  The only reason SetFont ever worked was by
    luck, since the escape sequences were buffered by DOS and flushed only
    after the program exited.

  o No longer crashes when passed a font name with more than 80 characters.
    Now returns with ERROR_BAD_NUMBER if asked for a font < 4 points.
    No longer opens console.device.
C/SetPatch

  o Activates AA chips.

  o On some systems, NMI interrupts could be caused due to hardware
    bugs.  These NMIs can cause software/hardware to perform incorrectly
    and has caused major performance problems in some systems.
    In the V37 ROM, the NMI vector pointed at a generalized routine
    that saved all registers, does some work which ends up doing nothing,
    restores all registers, and exits.  This patch will, under V37 ROMs,
    move that vector to point directly at an RTE.

  o SetPatch no longer will read the longword after the end of each of
    its hunks.

  o Now checks for the CPU type before trying to open the 68040.library
    This is so that the library does not even get loaded if you don't
    need it.  (The 68040.library also does the check.)

  o Does not turn on the caches if the intruction cache is not
    already on.  This is such that the bootmenu option will not
    be "undone" by SetPatch.

C/Version

  o Now does versions of gadget and datatypes classes.

  o Significant change in behavior required when not using the standard
    version string format:

    Junk following the date parameter is printed whenever the FULL option
    is provided on the command line.  Incorrectly formatted components of 
    a version string are printed whenever the FULL option is provided.

    Note that as always, specifying incorrectly formatted version strings
    will cause the VERSION and REVISION command line options of the Version
    command not to work as expected.  Basically, using these keywords,
    will result in output like "2.1 < 2.04", which is not what is usually
    expected.

    The incorrect version string formats are not supported by the
    Installer.  It will behave much like the VERSION and REVISION cmd-line
    options of the Version command.

Classes/Gadgets/colorwheel.gadget

  The colorwheel.gadget is a new BOOPSI class to create color wheels to allow
  color selections by the user.  See colorwheel.doc for more info.

Classes/Gadgets/gradientslider.gadget

  The gradientslider.gadget is a new BOOPSI class to create sliders having a
  gradient background.  This is to be used in combination with the
  colorwheel.gadget.  See gradientslider.doc for more info.

Devs/DataTypes 

  This new directory in V39 is the place where a user puts datatypes.library 
  descriptor files.

Devs/printer.device

  o Added small amount of code to support AA 8-bit HAM mode printing.

  o Also now uses GetBitMapAttr() if running under V39 to obtain dimensions 
    of source BitMap structure.

L/FastFileSystem

  o Equivalent to the V39 ROM file system, including DOS\5 support.  See ROM
    release notes for more info.
Libs/68040.library

  This is a support library for 68040 systems.  It addresses a number of
  issues with that CPU.  There are no publically callable functions in this
  library.

Libs/amigaguide.library

  The amigaguide.library is a new system module providing a means whereby
  developers can easily add on-line help to their applications.  See
  amigaguide.doc for more info.

  The amigaguide.library was previously available for use in commercial
  applications.  This is the first release of the library as a part of the core
  operating system.  Changes since the previous release include:

  o All new V39-only version uses datatypes.library for object handling.

  o Now has an AppWindow, plus an "Open..." menu item.  To open a new
    document, AmigaGuide performs a LINK to it, so that you can RETRACE back
    through the documents that you have opened.

  o Now supports word wrapping and proportional fonts.

  o Now supports font attributes.

  o Now supports embedded objects.  This means that you can
    LINK to any type of object that the user has a DataTypes
    descriptor and class for---such as pictures and animations.

  o Modified how files are located, to search for a localized help file.  Now
    searches in the following order.  For each preferred language

	PROGDIR:Help/<language>/<name>
	HELP:<language>/<name>

        PROGDIR:<name>
        <name>

    This matches how locale.library searches for catalog files.  For
    compatibility, each directory from the AmigaGuide/Path environment
    variable are also searched.

  o Renamed S:help.guide to HELP:<language>/Sys/amigaguide.guide

  o All sub-databases are now opened localized.

Libs/asl.library

  o Added support for the new WA_HelpGroupWindow Intuition tag.  ASL requesters
    now inherit the group id of their parent window.

  o Removed V37 code.  The library now requires V39.

  o Added support for OSCAN_VIDEO in the screen mode requester.

  o Fixed rendering bug with selected items in the file requester.  Depending
    on the size of the requester, sometimes the rendering didn't occur
    correctly.  Fixed font requester layout bug with checkmark labels using 
    certain fonts.

  o Now monitors the Size numeric gadget more closely in the font requester.

  o ASL now uses scaled checkmark imagery in the font and screenmode
    requesters.  Also now uses ROM busy pointer instead of custom one.

Libs/commodities.library

  o Fixed ParseIX() bug introduced in V38 preventing the following keys on
    the numeric keypad from being used in commodities: 9 ( ) / * + .

Libs/datatypes.library

  datatypes.library is a new system module providing transparent data
  handling abilities to applications.  Application developers can register
  their data format with datatypes.library and provide a class library for
  handling their data within other applications.  See datatypes.doc for more
  information.

Libs/diskfont.library

  o Marks DUPLICATE fonts using one of many free bits in the TextFont
    Extension.  These are fonts opened by diskfont, but match some other
    font already on the public font list by name, Y size, relevant style,
    and relevant flags.  The font is only marked as a duplicate if a
    NON-DUPLICATE occurence of this font already exists.

    DUPLICATE fonts are ignored by OpenFont() if the caller is not
    tag aware even if there is a font on the list which has a better
    implied DPI.

  o Tightened up requirements for source font when scaling.  Specifically,
    an already scaled RAM font of an exact Y size match but differing by
    DPI will not be used as the source for a bitmap scaled font (adding
    scale error, to scale error).

  o The code which generates the outline fonts now does comparison for
    OT_DotSize when it calls OpenFont(); essentially honoring the caller's
    request for an OT_DotSize other than the default that diskfont will
    provide when creating outlined fonts.  This makes it possible to have
    multiple outline fonts which differ only by OT_DotSize.

  o Underlined outline fonts are now supported if the engine can manage it
    when rendering the glyphs.  New tags in diskfonttag.[hi] were added for
    this purpose.  V39 diskfont will ask for underlining if requested in the
    TextAttr, or TTextAttr, but if not supported by the engine, then it will
    simply try to open, or create a non-underlined version.  So there is no
    change in behavior for bullet fonts in that it already opens a
    non-underlined version.  The difference is by asking OpenFont() for a
    non-underlined version, it does not decide to create another copy because
    of the result returned from WeighTAMatch().

    Of interest, our own Text() function when used with SetSoftStyle() does a
    broken underline (just one pixel, but its definitely not solid), so
    diskfont.library V39 first asks for broken underlining from the engine,
    and then solid.  If neither form of underlining is supported, then the
    above is true.

  o Tag for algorithmic strike-through added to diskfonttag.[hi]; this
    is another feature supported in Final Copy, and could be requested if
    wrapped in a bullet interface.

  o Underlining off, double solid, and double broken underlining also defined
    for the new OT_UnderLined tag.

    Underlining is not an intrinsic style for outline fonts.  This does not
    actually absolutely have to be the case, but we lack a tag to indicate
    intrinsic underlined style now, so this is not a new behavior, or
    limitation.  The assumption being that underlining is one of those things
    that is probably best done algorithmically by the application, or
    for the purposes of diskfont, by the engine.  Therefore this also leaves
    open the possibility of placing the underlining code within diskfont
    for engines that do not support it should we wish to do so in the
    future.

Libs/iffparse.library

  o Fixed three bugs in the OpenClipboard() function.  First bug was that if the
    clipboard.device couldn't open, two calls to FreeSignal() were made
    with uninitialized values as parameters.  The result of this was a
    corrupt signal mask in the Task field.  Second bug what the OpenDevice()
    was called with an IO request that didn't have a valid MsgPort pointer
    in it.  Finally, the two message ports allocated by the function were
    not being initialized correctly and would cause a system crash if a
    message ever got to either of them.

Prefs/#?

  o Now restore task->tc_UserData on exit of prefs editor.

Prefs/Font

  o Default for WB icon text mode when there is no .prefs file is now JAM2
    instead of JAM1.  This matches the ROM.

Prefs/IControl

  o Added Mode Promotion gadget when running on AA machines

Prefs/Input

  o "Show Double-Click" now operates asynchronously.  That is, while the
    double-click sample is displayed, it is still possible to click on other
    gadgets.

Prefs/Overscan

  o Now bounds check values read from prefs file against what the gfx database
    says.  This avoids problems with V38 overscan prefs files, and with
    running VGAOnly or not.

Prefs/Palette

  o Brand new interface using the colorwheel and gradientslider gadget
    classes.  Also allows pen spec editing.

Prefs/Pointer

  o Now opens on the Workbench screen if it can obtain three exclusive pens.

  o Allows editing of the Normal and Busy pointers and supports Low-Res and 
    High-Res pointer resolutions.

  o Uses datatypes.library for clipboard support.

  o Semaphore around save during Test.  This is to prevent
    confusing error requesters if the user presses the Test button
    several times while waiting for the pointer to appear.

  o Added "Load Image..." menu item in the "Edit" menu.

  o Uses {SA_LikeWorkbench, TRUE} when using a custom screen.

  o Increased width of window by 20 pixels to make room for
    longer strings.

  o Added NOREMAP tooltype and command-line option.  This causes paste
    and import image to not remap.

Prefs/ScreenMode

  o Now skips the default monitor when scanning the mode list instead
    of skipping PAL or NTSC.  This means that the prefs file will never
    contain "default monitor" as a mode, it will always contain an
    explicit mode.

Prefs/Sound

  o Now uses datatypes.library for sound loading and playing.  Also uses
    a DataTypes filter in the load sample requester so that only sounds 
    will be shown.


Prefs/WBPattern

  o Added support for picture backdrops.

  o Added support for Workbench screen backdrop.

  o Defined a more efficient chunk for the preference data.

  o Fully supports the First4/Last4 Workbench color scheme.

  o Uses datatypes.library for clipboard support.

  o All internal bitmaps now max out at a depth of 3 (less memory
    usage).

  o Rearranged the gadgets.

  o Semaphore around save during Test.  This is to prevent
    confusing error requesters if the user presses the Test button
    several times while waiting for the pattern to appear on the
    Workbench.

  o Added "Load Image..." menu item in the "Edit" menu.

  o Added NOREMAP tooltype and command-line option.  This causes paste
    and import image to not remap.

S/Startup-Sequence

  o Removed "Echo" statement.  That means the initial Shell window will no
    longer be displayed on bootup on a standard system.  This means a noticeable
    decrease in bootup time on slower machines (it takes about a second to
    open and close the shell window).  It means even more savings in time
    when the WB has more bitplanes.  Finally, it also looks a heck of a lot
    more professional.

  o Added C: in front of every pertinent command.  This speeds up the S-S
    noticeably on floppy systems, since normally the current directory is
    scanned first for a command, and then C:.  By prefixing C:, it no longer
    checks the current directory making things a whole lot faster.

  o Added deferred assign for HELP:.

  o Added multi-assign of LIBS: to SYS:Classes in support of the new
    disk-based BOOPSI classes.

  o Now runs VGAOnly monitor file if it is installed.

Storage/Monitors/#?

  o Added DblNTSC and DblPAL in support of AA scan doubling.

  o Added VGAOnly monitor.

  o Added AA support throughout.

System/DiskCopy

  o Enabled code to correctly report read errors.  Under V38, read errors are
    reported as write-errors.

System/Format

  o Requires V39.

  o Added directory caching support in the form of an extra gadget in the main
    Format window, and some new command-line options.  Command-line template
    is now:

      DEVICE=DRIVE/K/A,NAME/K/A,OFS/S,FFS/S,INTL=INTERNATIONAL/S,
      NOINTL=NOINTERNATIONAL/S,DIRCACHE/S,NODIRCACHE/S,NOICONS/S,QUICK/S

  o Uses GTLV_MakeVisible tag in its device listview.

  o Fixed bug where long volume names would run off the right edge of the main
    window by using the new GTTX_Clipped gadtools tag.

System/Intellifont

  o Renamed from Fountain to Intellifont.

  o Bare minimum needed to fix visual bug evident when running under V39
    gadtools; no longer uses GTLV_Selected tag, though still does not
    use V39 style selection via GTLV_ShowSelected tag.

Tools/Commodities/MouseBlanker

  This is a mouse blanking commodity.  It blanks the mouse when you start typing
  and unblanks it when the mouse is moved or any of the mouse buttons are hit.

Tools/HDToolBox

  o Brand new GadTools interface.

  o Now determines the version number of a file system automatically instead
    of requiring it to be entered manually.

  o Fixed a great number of bugs.

  o When CD_ROM drive was hooked on the SCSI bus and the disk was inserted,
    HDToolBox hanged up beacause the program assumed only 512 bytes blocks.
    It Now checks the size with the "READ_CAPACITY" command,
    and if it fails, sends "INQUIRY" command and gets device type.
    If it's a CD-ROM device, sets block size to 2048.

Tools/IconEdit

  o Implements the First4/Last4 Workbench color scheme.

  o Uses datatypes.library for clipboard support and picture
    loading/saving.  Therefore, you can now load any picture type
    that you have a class for.  When loading or pasting a
    picture, the colors are mapped to the Workbench GUI colors
    (either 2, 4 or 8 colors).  8 color icons will work with any
    depth Workbench screen.

  o Default clipboard viewer is now "Multiview CLIPBOARD".

  o Checks to see if icon already exists when saving a picture or
    source file and won't overwrite it.

  o File requester's initial position now matches the preference
    editors.

  o Now draws the coordinates in the window title bar using the
    pen spec.

  o Was reloading the icon image after save, even if save failed.

  o Will now properly undo after loading a new icon image.

  o Added NOREMAP tooltype.  This causes paste and import image
    to not remap.

  o Fixes Enforcer hit caused when dropping Drawer icon (without
    a drawer) into the AppWindow.

Tools/ShowConfig

  o Added AA chipset support.


Utilities/MultiView

  This is a generic view-anything utility that uses datatypes.library for its
  object handling.

3.0 Installation Procedure

  o It is no longer necessary to boot from the Install disk.

  o Install Languages no longer exists.  This is now merged into the main
    installation script.

  o Install Printers no longer exists.  The user can easily drag a printer
    driver icon from the Storage disk to DEVS:Printers

  o The disk now includes the 68040.library, which gets copied to the HD when
    performing an install

  o The various Prod_prep scripts were enhanced and work better.

  o There are many little utilities in the C: directory which aid the main
    install script to do a better job.

  Changes to the install script include:

  o Requires V39 ROMs

  o Now integrates the old "Install Languages" script.  When starting the
    main install script, you are now asked whether to perform a complete
    installation, or only update the languages.

  o It now virtually always makes the right decision as to where the WB files
    should be copied.  As a result, if the user picks Novice mode, he will not
    be asked where the files should go.

  o Now preserves the tooltypes of many icons.  This will avoid zapping the
    stuff put there by users, making the update process much more transparent.

  o Now preserves the locations of most files.  For example, if the user moved
    Blanker in WBStartup, it will be correctly updated in WBStartup, and left
    there.  In V38, the copy in WBStartup would be deleted and the new version
    installed in Tools/Commodities.

  o Now preserves left out icons.  The UpdateWBFiles program ensures that the
    contents of the .backdrop file are up to date which removes the need to
    delete the file.

  o Now updates V37 font prefs files to V38/V39 format.

  o Now deals with the "Storage3.0" disk

  o Now asks which keymaps to install.

  o Installs the 68040.library.

  o Knows about systems with MapROM, and installs a special startup-sequence.

  o On an NTSC system, always copies the NTSC monitor to DEVS:Monitors, and
    copies PAL to DEVS:Monitors on PAL systems.

  o When installing languages, deletes languages the user did not choose.  This
    is to remove old V38 files that might be hanging around.

  o Does better sniffing to determine whether an A2090 is present, and displays
    extra info to inform the owner that some files need to be copied.

  o Will optionally reboot the system for the user at the end of the
    installation procedure (after asking permission first, of course).

  o Asks all its questions up front.  Once the questions are answered, it
    starts the actual installation.

  o Now deletes all C= printer drivers and keymaps before starting the
    installation process.  This was previously done right before re-installing
    them.  This is to increase the likelihood that things will fit on the HD
    by deleting obsolete stuff ahead of time.

  o Does slightly better icon positioning to avoid things moving
    "by themselves".

  o Now copies the A2232 port-handler and A2232 aux-handler when needed.

  Changes to the HDSetup script include:

  o Will now partition the HD and format it automatically instead of requiring
    a reboot.

  o The partitions created are now called Workbench (HD0) and Work (HD1).
    HD0: is created as 8M.

  o DOS\3 is now used by default, and the DMA mask is set to 0xfffffffe
    instead of 0xfffffffc

  o The version number for the file system being installed on a machine is now
    extracted from the file system load file instead of being hardcoded in the
    prep scripts

  o After completing the reselection on, reselection off, or update
    superkickstart option, the system is rebooted automatically (after
    asking the user of course).

  o Updating an A3000 super kickstart no longer requires the user to hit
    RETURN.  Errors are also detected now.




Appendix B: Release 3.1 Disk Changes
====================================

Following is a description of some of the important changes made to
the disk-based system software between Release 3 and Release 3.1.
This doesn't cover any changes after December 1992.  Since 3.1 was
still under development as of this writing, more changes are likely
to be made to the software prior to release. 


C/ConClip

  o Now consumes over 3100 bytes less RAM when running.  That means over 3K
    more RAM in every system we ship.

  o Localized

  o Now keeps iffparse.library and clipboard.device closed whenever they
    are not in use.

  o Added CLIPUNIT synonym to existing UNIT command-line option.  This is to
    make it comply with the style guide and be more consistent with other
    programs such as WBPattern.  The template is now:

        CLIPUNIT=UNIT/N,OFF/S

C/Copy

  o Now correctly handles failure of SetProtection(), SetComment(), and
    SetFileDate().  Because SetComment() fails on NFS and on CrossDOS,
    SetFileDate() never was done on files, making the CLONE option not
    fully work.  All three functions are considered failures only if
    IoErr() reports something different than ERROR_ACTION_NOT_KNOWN.

  o In case of error after a call to DupLock(), an error code was being
    set always to ERROR_NO_FREE_STORE instead of using the result of
    IoErr().

  o The default size for the buffers used was always equivalent to (BUF=0)
    which caused the buffers to be the size of the files being copied.
    This was contrary to the docs, and caused problems when copying large
    files through Envoy, as it could easily eat up all the memory in the
    system, not leaving enough for the memory needed by Envoy.  The
    default size is now BUF=128 which gives a 64K buffer.

C/IPrefs

  o Added needed support for the new display position control now offered by
    Overscan prefs.

  o If there is no icontrol.prefs file, IPrefs sets the default for Mode
    Promotion to ON.  That means machines will have mode promotion
    on by default.

  o Now ensures that requested width, height, and depth for Workbench,
    fall within the allowed range as defined in the graphics database.

C/Mount

  o Only change is the version number.  Versions 39.1 and 39.2 of this program
    were accidentally numbered 38.1 and 38.2.

C/Protect

  o Fixed error reporting.  When used with wildcards, it would generate
    errors of the form "Can't set protection for #?" instead of giving a
    descriptive file name, and cause of error.


C/SetPatch

  o Due to a bug fix late in the game, the filesystem broke with ExAll()
    on DCFS file systems if the lock passed in was not Examine()ed first.
    This patch fixes this by forcing an Examine() on a lock before
    the ExAll() is called.  It only does this on systems with V39.22
    dos.library since only that ROM has the problem with DCFS ExAll().

  o ChangeVPBitMap() was not properly doing the bitplane swizzle needed for
    8-bit HAM mode.  The reason that this didn't show up earlier is that
    if the relationship between the bitplane pointers was the same
    in the original and new bitmaps, the bug would correct itself.
    So, you would only see this bug if your memory was fragged, or if
    some other allocations got in between the separate allocations of the
    bitplanes.

  o ScrollVPort() had the same bug as ChangeVPBitMap().

    The patch locks the ActiViewCprSemaphore, swizzles the bitmap,
    calls the old entry point, and unswizzles the bitmap, when called
    on a HAM-8 viewport.

  o The patches for graphics.library/ScrollVPort() and ChangeVPBitMap()
    now bump the graphics revision number to 90 if it is 89.  This
    is so that installing the setpatch on an A1200 or A4000 will not
    break people using work-arounds for the bug.

  o When calling BltBitMap() with both source and destination interleaved,
    and a mask of -1, the low byte of d7 would be changed to the bitmap depth
    on exit.  Patch saves d7, calls old, and restores it.

  o Added the graphics monitor/view association hash patch.

  o BltMaskBitMapRastPort() used to interpret the mask data incorrectly
    if both the source and destination bitmaps were interleaved.

  o Now includes the CP2024 Conner patch from the V37 SetPatch.

C/Version

  o Obtaining the version of printer.device while it is loaded in memory would
    trash memory.  This is because printer.device doesn't initialize its
    lib_IdString.  Although Version was checking for NULL, the lack of
    string was causing problems in the output routines.

  o Fixed the FILE option which was causing the version numbers not to be
    displayed.

Classes/Gadget/colorwheel.gadget

  o Querying the wheel for an explicit red/green/blue value would not get the
    most up to date brightness value from the gradient slider causing things
    to get slightly out of sync.

  o Fixed bug where trying to open the class library under 1.3/2.0 would
    cause a system crash instead of simply failing.

Classes/Gadget/gradientslider.gadget

  o Fixed bug where trying to open the class library under 1.3/2.0 would
    cause a system crash instead of simply failing.

Devs/mfm.device

  o Fixed small problem of the wrong return results when opening a device
    with an invalid unit number.

  o Changed the format function to update the physical track and invalidate the
    in-memory buffer,


L/CrossDOSFileSystem

  o Booting off a CrossDOSFileSystem formatted disk does not crash an IBM
    machine (including CrossPC).  It now presents a message "CrossDOS
    non-bootable disk!".

  o Now supports formatting a compatible MS-DOS hard disk partition.  It
    is still not bootable.

  o Now prevents an MS-DOS hard disk partition to be formatted if not
    properly partitioned first.

  o Fixed problem with method of reporting results when asked to read or
    seek past end or beginning of file.  Now follows V37/V39 FFS method.

  o Fixed problem with parsing a file or directory name with NULLs instead
    of the usual SPACEs for blanks.  This occurs in PC-DOS not in MS-DOS.

  o Fixed bug that translated extended ASCII characters incorrectly when
    either the INTL or DANSK translation tables were selected.

  o Added stack size checking.

  o Fixed a bug that appeared when using the 'assign' command with this FS.
    A DOS deadlock could occur in certain circumstances.  Added a delayed
    volume node addition and deletion algorithm.

  o Fixed a small problem of freeing memory allocated by the process spawned by
    the FileSystem_status process.  This could cause memory shared to be reused
    when it was still needed.  The fix was to add the memory entry list to the
    filesystem_status process which is the last process to exit.  This only
    occurs if the target device could not be opened.

  o Fixed a problem that never showed up yet.  Internally reproduced only.

L/port-handler

  The main reason for this release is to fix problems that PRT: was having
  with Envoy printing.

  o Now has a version string.

  o Now requires V37 ROMs.

  o Now supports ACTION_IS_FILESYSTEM and ACTION_FINDUPDATE.

  o Once loaded, it remains in memory permanently which fixes many problems.
    For example, if any of SER: PAR: or PRT: had been active, double-clicking
    on Format, DiskSalv, or CrossDOS would cause Enforcer hits, or crashes
    on a machine not running Enforcer.  This also fixes "copy foo to PRT:"
    when PRT: is sending data to the envoyprint.device.

  o When first loaded in memory, the handler patches its seglist pointer into
    the DOS device node of other related handlers.  That is, if the handler is
    started as PRT:, it patches its seglist into the DOS nodes for
    SER: and PAR:.  This means that all these devices end up sharing the same
    seglist for the port-handler, which can save memory and disk-loading time.
    It patches its seglist in any device node having "L:port-handler" as
    handler name.

  o This port-handler replaces both the standard port-handler on the Workbench,
    and the A2232 port-handler.  As such, the handler supports being activated
    through a mountlist entry, and will process the BAUD, CONTROL, DEVICE,
    UNIT, and FLAGS keyword from a mountlist.

  o Because this port-handler replaces the A2232 one, it is possible to
    specify the baud rate and control flags when opening a serial unit.  For
    example:  Open("SER:9600/8N1",...);



L/FileSystem_Trans/#?

  o Modified a few values for the INTL and DANSK translation tables to
    default to the SPACE character for untranslatable characters instead of
    NULLs.

  o Added a Mac translation table.  This lets an Amiga read Mac ASCII
    files.  This translation type can be selected from the CrossDOS
    commodity.

Libs/asl.library

  o In screen mode requester, fixed formatting string so that horizontal scan
    rates with a decimal value less than .1 now come out right.  That is,
    29.02 was coming out as 29.2.

  o Fixed bug where trying to open the library under 1.3 would cause a system
    crash instead of simply failing.

  o Selecting Restore in the screen mode requester now correctly resets the
    "Overscan Type" and "AutoScroll" gadgets.

  o Fixed bug where the file requester's drive LED would remain lit after
    creating a new directory when in save mode.

Libs/commodities.library

  o Fixed bug present since V36.  Input events of type IECLASS_NEWPOINTERPOS
    did not get their extended data properly copied in various places,
    including through AddIEvents().  This resulted in the copy of these input
    event containing pointers possibly pointing to garbage.

  o Fixed bug where NEWPOINTERPOS was not considered a valid class by ParseIX().

  o Input events inserted into the input food chain as a result of the action
    of a translator object are now marked with the same time stamp as the
    input event which activated the translator object.

  o DisposeCxMsg() was accessing a global list without proper locking.  This
    was quite nasty, since the list is typically accessed from both the
    commodity input handler, and from commodity programs running
    asynchronously.

  o Now nulls out the ie_NextEvent field of input events it copies.  All
    input events generated by the library are copies of other events, and
    the ie_NextEvent value was left set to the original event's value.
    That means commodity was spewing out a lot of input events with bogus
    ie_NextEvent fields.  This could cause crashes and confusion.

  o InvertKeyMap() now sets the ie_SubClass and ie_TimeStamp fields to 0
    in the input events it generates.  These were being untouched which means
    they could contain garbage.

Libs/iffparse.library

  o Fixed bug where trying to open the library under 1.3 would cause a system
    crash instead of simply failing.

Libs/68040.library

  o During the setup of the MMU tables, if an expansion card was
    0 bytes in size it would cause the MMU table setup to fail.
    68040.library would continue to work but the magic MMU setup
    that would have been needed for the Zorro-III boards would
    not be done.  This has been fixed.

Monitors/#?

  o Now use a new algorithmic approach to generate the database entries.
    The result of this is that the amount of disk space taken up by these new
    monitors is 140 blocks, compared to 176 blocks they used to take.

    More important is that the dimensions of Multiscan, Euro72, Super72,
    DblNTSC and DblPAL are now greater than they used to be.  This is especially
    important for DblNTSC and DblPAL, which are meant to resemble NTSC and PAL
    as closely as possible.  The Dbl....  monitors are now 720 pixels wide for
    MaxOScan, compared to 724 for NTSC/PAL, and the 676 they used to be!

    Also, if not running with VGAOnly, the "dead" part of the display on the
    left hand side of the screen is now useable as VideoOScan.

  o Defined ScanDoubled versions of the Multiscan, Euro72 and Super72 monitors
    for better coercion on AA machines.

  o All these monitors should now work under ECS, and give even greater
    dimensions.

  o No AA modes should be in RAM on non-AA machines.

  o Changed the names of the monitors from DoubleNTSC/PAL.monitor to
    DblNTSC/PAL.monitor to be consistent with the ModeID name strings.

  o All the monitors now work only with graphics.library V39.

  o With Kickstart 39.106 and VGAOnly, DblNTSC/PAL screens can only be 704
    pixels wide max, whilst under the current kickstart they are 720 pixels
    wide.  The DblNTSC/PAL monitor now checks for this.

  o Cleared up an enforcer hit with adding the A2024 after iprefs was run, and
    promotion was enabled.

  o Sprites were not being clipped properly in PAL A2024 modes when they
    crossed the panel boundaries.  This was causing screen trashing when the
    pointer was at certain positions because the pointer would end up in the
    A2024's special control line.

Prefs/IControl

  o Removed "Preserve Colors" gadget.  The "Avoid Flicker" gadget has been moved
    into the "Miscellaneous" gadget group instead of being by itself in the
    "Coercion" group.

  o If there is no prefs file, mode promotion is now turned on by default.

Prefs/Input

  o Now uses GTLV_MakeVisible tag to ensure the currently selected keymap is
    visible in the listview.

Prefs/Overscan

  o On the edit screen, changed the label of the left gadget from "Use" to
    "OK".

  o Added code to support the new display positioning control.  When you enter
    the overscan editing screen, if the mode supports it, there are four arrows
    that cause the entire visible portion of the display to move around.  This
    is a wonderful new feature for DblNTSC, allowing sync-dependant centering
    of display modes.  It is also possible to move the display by using the
    cursor keys.

  o Changed the background color on the edit screen from black to dark grey.
    This makes it much easier to detect when the display is being pushed too
    far off the right edge of the display, as the color of the display turns
    quite dim.

  o Made the edit screen SA_Exclusive in order to avoid folks dragging it down
    and revealing their WB.  Since the program now makes dynamic changes to
    hsync and vsync, the WB can look bad when the edit screen is pulled down.

  o Made the edit screen SA_Interleaved.

Prefs/Palette

  o When incapable of displaying a colored color wheel, the program now puts
    up a gadget labelled "Color Wheel..." in place of the actual color wheel.
    Clicking on this gadget causes the color wheel to come scrolling up from
    the bottom of the screen until it fills the whole display.  This color
    wheel screen lets the user edit the current color using the wheel.
    There is a pair of "OK/Cancel" gadgets to accept or reject the new color
    selection.  Clicking on either gadgets causes the color wheel to scroll
    off the bottom of the display.  Kinda neat :-)

  o The sample section of the program now shows a sample screen title bar.

  o When opening on a custom screen, no longer has a window border and title
    bar.

  o When switching modes from 4 to multicolor and back, will no longer
    present an empty window if it is not capable of creating its new set
    of gadgets.  The program will exit instead.

  o Selecting a color > 4 in the main palette, and switching to 4 Color
    Settings would not correctly redraw the gradient slider to use a color
    within the available selection.

  o Now uses color conversion routines from colorwheel.gadget instead of
    having inline duplicates.

  o Fixed incorrect flags set in some menu items so that click select of
    these items worked incorrectly.

  o Was letting you select between 4 and Multicolor Settings,
    even when running on a 4 color screen incapable of displaying the
    multicolor settings.

  o When running on an A2024 display, it no longer displays a color wheel,
    nor lets you display one.

  o Clicking in the sample section of the program causes the pen associated
    with the item clicked on to become selected in the pen list.  That is,
    clicking on the sample window title bar will automatically select the
    "Active Window Title Bars" pen within the pen listview.

Prefs/Printer

  o Now uses GTLV_MakeVisible tag to ensure the currently selected printer is
    visible in the listview.

Prefs/PrinterPS

  o The default margins for graphics printing are now 1 inch on the left
    and right, instead of 1 inch on the left and 2 on the right (this was
    due to a typo).

  o When in the Graphics Scaling page, selecting "Last Saved" from the menu
    would not cause the sample graphics to be redisplayed with the new values.

Prefs/ScreenMode

  o Fixed formatting string so that horizontal scan rates with a decimal
    value less than .1 now come out right.  That is, 29.02 was coming out
    as 29.2.

System/Format
  o From within the device selection listview, it was possible to double-click
    on two different devices, and have Format accept the selection.  A check
    is now done so that both clicks of a double-click occur on the same device.

  o When formatting from Workbench, Format now ignores any trailing colons in
    the volume name.  It would get all confused if someone tried to name
    a disk "Hello:" instead of simply "Hello".  This fixes the
    most common error automatically.

Tools/Calculator

  o Now gets the window title string from the current catalog instead of
    having it hardcoded to "Calculator".

Tools/Commoditites/ClickToFront

  o Now also filters mouse clicks that come through as IECLASS_POINTERPOS
    and IECLASS_NEWPOINTERPOS, in addition to IECLASS_RAWMOUSE.  This
    fixes the bug where ClickToFront did not work with events generated
    by tablet drivers.

Tools/Commodities/CrossDOS

  o Fixed bug where the window would not open when there was no
    L:FileSystem_Trans directory, or no file within it.

  o Fixed incorrect cleanup path in case of errors while scanning directories.
    The bug would cause a crash the next time the window was opened.

  o Now only notifies CrossDOS handler tasks of changes in settings when
    new settings differ from the old ones.

  o No longer has the CrossDOS semaphore locked when it locks the DOS device
    list.  This could potentially cause deadlocks.

  o Fixed bug where translation files were opened and read, but never closed.

  o Fixed bug that would cause a crash under V37 or harmless Enforcer hits
    under V39.  To reproduce, start the CrossDOS commodity and copy a large file
    to PC0 (devs:Kickstart for example).  While the copy is in progress, pick
    PC0 from the CrossDOS commodity and change its text filtering setting.  Now
    click the close gadget of the commodity program.  The window stays open
    until the large write operation completes.  As soon as this happens, the
    window closes, and a crash occurs under 2.0.

Tools/Commodities/FKey

  o When there was a key sequence in FKey with a command such as "Insert Text"
    with a string associated with it, switching the command to
    something else, and coming back to "Insert Text" would cause the current
    string to be "forgotten".  To get it back, you had to click in the
    text gadget and press RETURN.  This is now fixed.

  o Selecting a command such as "Insert Text", then typing in a string as
    argument would cause that string to be bound to the key sequence forever.
    That is, even if the command was switched to something like "Cycle Windows",
    the string argument would be saved out to disk and reloaded in memory
    the next time the program ran.  This was incorrect as the command didn't
    have anything to do with the string.  String arguments are now discarded for
    those commands that don't support them.

  o The active key sequence is now correctly highlighted in the listview.

Tools/HDToolBox

  o Now supports Host ID in "Partitioning" screen.  Now multiple machines
    can share a single disk using different partitions.

  o Added CHECKBOX_KIND gadget for allowing a block size other than 512 bytes
    in "File System Maintenance".  To change file system block size in
    "File System Characteristics", select this gadget first.

  o Changed from BUTTON_KIND gadget to CYCLE_KIND gadget for "File System
    Type".  They get labelled with their dostype as found in the file system
    resource list.

  o Added CHECKBOX_KIND gadgets for "Fast File System", "International Mode"
    and "Directory Cache".

  o Added CYCLE_KIND gadget for file system block size.

  o Recognizes the "Help" key now.

HDSetup/HDSetup

  o Localized the name of the "Work" partition following request from Germany.

Install/Install

  o No longer copies the A2232 port-handler from the install disk when an
    A2232 card is detected.  The 39.1 port-handler  handles the A2232
    automatically




Appendix C:  V39 ROM Changes


Following is a description of most of the important changes made to the
ROM-based system software between V37 and the initial release of V39.  This
doesn't cover changes made to modules discussed in other talks, such as
graphics and Intuition.


BootMenu

  o Brand new interface featuring 4 different displays:

       Main Page: Lets you select between "Boot Options...",
                  "Display Options..." and "Expansion Board Diagnostic...".
                  Clicking any one of these brings up the corresponding page.
                  The "Boot" gadget resumes the boot operation using the
                  options selected in the other pages, and the "Boot With
                  No Startup-Sequence" gadget does the same, except it doesn't
                  execute the startup-sequence.

       Boot Page: Lets you control boot-related options.  The listview on the
                  left lets you pick which device to boot from.  The one on
                  the right lets you enable/disable devices in the system.
                  There is also a "Disable CPU Caches" gadget.  It turns
                  off the CPU caches for the current boot, which saves a lot
                  of games that break on 68040 processors because of the big
                  caches.  Use or Cancel bring you back to the main page.

       Gfx Page: Lets you pick what mode to boot in, and what chip set to
                 emulate.  Use or Cancel bring you back to the main page.

       Diag Page: Lists all the boards in the system and shows their state
                  (Working or Defective).  This page is automatically brought
                  up during system bootup if a board is defective.

  o Hitting any key toggles the display between NTSC and PAL.  A message on the
    main page indicates this fact.

cia.resource

  o Changed the priority of the interrupt servers to +120 such that
    they don't miss interrupts.

con-handler

  o Fixed a low-memory trashing problem were CON: would signal a NULL task.

  o It no longer will use proportional fonts (or rather fail at trying to use
    them) when opened on a public screen.

  o It is no longer possible to size the window such that the entire
    interior goes away.

  o Fixes the title bars (the parsing routine wasn't skipping over delimiters).
    This also fixes the "funny" results you would get with malformed CON:
    lines (like con:0a/0/640/200/title having a title of "200").

  o Fixes negative sizes in the window spec.  Height < 0 gives you max
    displayable height.

  o Always opens window big enough for one line of text.

console.device

  o CMD_CLEAR fixed, was broken in V37.

  o Uses screen dimensions (rounded off to nearest byte width) to calculate
    maximum character map width instead of using bm_BytesPerRow.  Likewise
    uses screen height instead of bm_Rows.

  o First pass at the scrolling optimizations.  Recalcs scroll mask
    at reset time (set to defaults), at full clear screen time (FF, or
    HOME/CLS), and whenever you set new pen/cell/background colors
    via the standard SGR sequences.

  o Rework how conceal mode works - no longer sets rp_Mask to 0 which also
    disabled ALL output, including scrolling, clearing, etc...  not good for
    character mapped consoles in particular since it causes the display & map
    to lose sync.

  o Scroll DOWN no longer tries to fill in vacated portions of the
    window with text in the off-screen buffer (if any).  This was
    useless as a scrollback feature, could crash if you scrolled down more
    than one window's worth of text (ouch), didn't perform a window
    refresh (thereby leaving hidden characters in the visible map until
    you resized, or revealed), and was inconsistent with SMART REFRESH
    consoles - the application using scroll down would reasonably expect
    that the vacated portion is entirely empty.

  o First pass at breaking up large CMD_WRITEs.  Now unlocks layers
    approx every 256 characters (this is simple, low-overhead code which
    does not try to be exact).  Recalcs everything when layers are relocked.

    Helps quite a bit.  No more locks for the entire file when doing
    COPY foo *.  Makes console much more friendly; you can now resize
    windows (only minor delay) during long writes, click in other windows,
    etc.

    Note this simple code won't work for a long stream of text with
    no control characters; this however is extremely rare.  Even text
    files have LF's, however in any case the problem is no worse than it
    was before.

  o The above feature makes it possible to cheaply break a CMD_WRITE,
    hence making it possible to easily fix the DisplayBeep() deadlock
    bug.  DisplayBeep() is now postponed a few CPU instructions
    until after layers are unlocked.

  o First pass at modifying mouse tracking code (drag selection)
    to use input events instead of PeekQualifier().

    This code change was added so tablet drivers, and commodities
    can be used in character mapped consoles with selection capability.
    PeekQualifier() returns only what input.device thinks the qualifiers
    are; not what's seen by applications which watch/use the input stream.

  o Now supports a new private sequence ("ESC[ s") which sets the
    current SGR settings as your defaults.  This affects ESC[0m
    (reset all SGR settings), ESC[39m (reset default primary pen),
    and ESC[49m (reset default secondary pen [cell color]).

    Text style info, and reverse mode (on/off) are also saved,
    and hence restored when ESC[0m is sent.

    This is intended as a user sequence for use in your shell-startup;
    it allows you to use other colors/settings, and not have these constantly
    reset by programs like MORE, LS, etc.  I'm recommending it not be used by
    applications; only users for their shells.  An application which can
    deal with this problem of SGR settings should continue to do whatever it is
    doing now.  ESCc (reset console) does however reset the default
    SGR settings to their true defaults.

  o Downcoded pack.c.  Is many times faster (if the maps
    are not disorganized; the maps become disorganized as text is
    scrolled off screen, so in these cases an initial resize can
    still take a moment - didn't want to touch that code though).
    For an organized map, resizing even very large windows (e.g.,
    Moniterm size) with 8x8 or smaller fonts (so we have a really
    large map) is virtually instanteous on a 3000, and nearly so
    even on 68000 machines.  It still takes time to redraw
    the text (limited primarly by the Text() function), but the
    time needed to pack, and unpack the map is a fraction of
    what it was.

  o Borderfill code added so ESC[>#m fills to borders if an explicit
    line length and/or page length have not been set.  No change to
    cu_XRExtant or cu_YRExtant in public portion of console unit structure.

    Border refers to the area outside of the normal console rendering area
    up to the window right/bottom borders.  The size of this area is 0-N
    pixels where N is a maximum of the font width-1 or height-1.

  o OpenDevice() now fails if trying to open a character mapped console, but
    memory can not be allocated for the map.  In V37, OpenDevice() returned
    success for this case which left you with a half functioning console
    window - clearly confusing for the user, and virtually worthless because
    of the lack of refresh info needed to fix up damage.

    OpenDevice() still works the same if you have a SIMPLE_REFRESH window,
    but did not ask for a character map (uncommon, but doable).

  o Also fixed a bug which you may never see now that the above code was added;
    clearing a simple refresh window which lacked a character map cleared
    a garbage rectangle; layers prevents this from being a crash, and code
    elsewhere inhibited negative rectangles.  The bug exists in 1.3 also, and
    was partially fixed for 2.0; the bug use to be apparent in SUPER_BITMAP
    windows, and because the case of SIMPLE_REFRESH without a map is rare
    for console.device, the bug has probably never been noticed (found during
    memoration testing).

  o Removed code which checks to see if the application had drawn over the
    cursor in a console.device opened by the application.  The kludge did a
    ReadPixel() of every pixel where the cursor was drawn, and if any bits did
    not match the expected color (also modified by pattern), cursor drawing was
    turned off for that console for as long as that console window was opened.

    Applications (few) which draw over the console cursor, but do not
    explicitly turn it off will now have a patterned rectfill the size
    of the cursor (generally 8x8) in the upper left hand corner of the
    window if the window is deactivated.  This is a minor visual problem,
    though not one which should cause anyone to crash, or not run.  The
    problem will also never be noticed if the console window is not
    deactivated.

dos.library

  o Fixes a bug in Open() where if the path was more than 127 characters long,
    a random byte of memory would be trashed.

  o Has support for fib_OwnerXXX for the networking people.  ExAll() supports
    ED_OWNER.

  o Added ExAllEnd().

  o Added SetOwner().

  o Fixed overrun error in FGets() (if no newline or EOF, it reads one
    byte too many into your buffer - workaround for V36/37 - allocate buffer
    1 byte larger than passed in.

  o HUNK_RELOC32SHORT now works at the right value (1020).  Also added a 32-bit
    PC-relative reference mode, mainly for >= '020-only executables.

  o Added GVF_SAVE_VAR.  For SaveVar(), it will now do the same actions
    for ENVARC:whatever, as well as ENV:.

  o Fixed character classes in ParsePatternNoCase().  The classes weren't being
    promoted to upper case (i.e.  [a-z] should have become [A-Z]).  Note that
    only ParsePatternNoCase() was affected by this bug, not
    MatchFirst()/MatchNext()

  o Fixed FreeDosObject(xxx,DOS_CLI).  It wasn't freeing the strings
    associated with the CLI.

  o FindCliProc(0) now returns NULL, even though it's an invalid
    CLI number.

  o For people passing in an RDArgs structure but no RDA_Buffer to ReadArgs(),
    it now properly clears out RDA_Buffer on FreeArgs(), so you can reuse it
    safely (without having to clear it out yourself).

  o StrToLong() was returning the number of white-space characters if no
    digits were found.  It now properly returns -1.

  o Fixed GVF_DONT_NULL_TERM for global variables.

  o The initial console window on bootup now opens the size of the Workbench
    DClip.

  o Fixes the CliInitNewCLI() open of S:Shell-Startup when no FROM file is
    specified.

  o Fixed "Copy CONSOLE: foo" by making GetDeviceProc() know about CONSOLE:.

  o Localized "Software Failure".

filesystem

  o Added support for DOS\4 and DOS\5 file systems which offer directory
    caching.  DOS\4 and DOS\5 are orders of magnitude faster at directories
    than other file systems, since they keep a cached copy of all the
    ExNext()/ExAll() data appended to the directory.  This does require a few
    extra block accesses on create and delete, and also after modifying the
    file (in Close()).  Create speed dropped about 30%.  However, directory     speed is 7-20 times faster.

    For floppies, this usually means that dir or list take about 3/4-1
    second to start, and then you get most or all of the directory instantly,
    or within 1/2 second or so (it may take 1 or 2 seconds for really big
    directories).

  o Fixed a bug with delete for non-DOS\5 partitions.

  o Fixed a random memory trash in the filesystem in a race condition.
    When two renames hit just the right timing, one has to wait on the
    other, and the wait routine used the wrong (garbage) register to get
    the head of the list.  This trashed 1 longword of semi-random memory,
    and then hung the rename forever.

gadtools.library

  o LayoutMenus() and LayoutMenuItems() recognize some new tags to support
    NewLook menus:

	GTMN_NewLookMenus (BOOL): requests NewLook menu treatment.
	GTMN_Checkmark (struct Image *): checkmark you'll use in menus
	GTMN_AmigaKey (struct Image *): Amiga-key image you'll use in menus

    Basically, if you open your window with WA_NewLookMenus, also lay out your
    menus with GTMN_NewLookMenus.  If the menu-item font will be the screen's
    font, that's all you need to do.  If the menu-item font is something else,
    you must create a checkmark and an Amiga-key image, and pass each one to
    both Intuition (WA_Checkmark and WA_AmigaKey) and to GadTools
    (GTMN_Checkmark and GTMN_AmigaKey).

    GTMN_FrontPen is now recognized.  If GTMN_NewLookMenus is specified, this
    attribute defaults to the screen's BARDETAILPEN, else it defaults to
    "do nothing", which allows the GTMN_FrontPen tag that may have been passed
    to CreateMenus() to still hold.

  o STRING_KIND, INTEGER_KIND, and BUTTON_KIND gadgets now support the
    GA_Immediate tag.
  o You can now put an arbitrary command string in the right-hand side
    of a menu, where the Amiga-key equivalent goes.  To do this, point
    the NewMenu nm_CommKey field at the string (eg.  "Shift-Alt-F1), and
    set the new NM_COMMANDSTRING flag in nm_Flags.

  o If a window has multiple checkboxes or radio buttons, a separate
    image is no longer allocated for each one.

  o The bevel box of the slider and listview now refresh with the gadget,
    instead of with GT_RefreshWindow().

  o Scrollers with GA_RelVerify set weren't sending IDCMP_GADGETUP messages
    when the arrow buttons were released.

  o GadTools now uses SetABPenDrMd() when advantageous.

  o New GTMX_Scaled and GTCB_Scaled tags instruct GadTools to scale the mx
    button and checkmark respectively to the dimensions supplied in the
    NewGadget ng_Width and ng_Height fields.  Under V37, or in the absence of     these tags, the dimensions are fixed.  Added #defines for those dimensions.

  o GadTools now has a GT_GetGadgetAttrsA() function (and a
    GT_GetGadgetAttrs() varargs version).  This function retrieves
    attributes of the specified gadget, according to the attributes chosen
    in the tag list.  For each entry in the tag list, ti_Tag identifies
    the attribute, and ti_Data is a pointer to the long variable where you
    wish the result to be stored.

  o Checkboxes now return their "selected" state in the IntuiMessage->Code
    field.

  o Many new tags for CreateGadgetA() were added:

        GTTX_FrontPen and GTTX_BackPen to let the color of TEXT_KIND
        gadgets be controlled.

        GTNM_FrontPen and GTNM_BackPen to let the color of NUMBER_KIND
        gadgets be controlled.

        GTNM_Format to specify the formatting string to use with
        NUMBER_KIND gadgets.  This is so a localized number format using
        "%lD" instead of "%ld" can be used.

        GTNM_MaxFormatLen to specify the maximum length of the string that
        can be generated by GTNM_Format.

        GTTX_Justification and GTNM_Justification to allow for right
        and center justification on TEXT_KIND and NUMBER_KIND gadgets.

        GTSL_MaxPixelLen lets you specify the maximum pixel length the level
        display of a SLIDER_KIND gadget will occupy.  This allows proportional
        fonts to be used with sliders.

        GTSL_Justification specifies how the level display of a SLIDER_KIND
        gadget is to be justified within the width allocated by
        GTSL_MaxPixelLen.

        GTLV_MakeVisible for listviews.  You pass it an item number and it
        makes sure it is visible within the listview display.

  o Many new tags for GT_SetGadgetAttrsA():

        GTTX_FrontPen, GTTX_BackPen, GTNM_FrontPen, GTNM_BackPen, GTNM_Format
        GTTX_Justification, GTNM_Justification, GTSL_Justification, and
        GTLV_MakeVisible all have the same purpose as described for
        CreateGadgetA() above.

        MX_KIND gadgets now support GA_Disabled.

        GTSL_DispFunc and GTSL_LevelFormat are now changeable via
        GT_SetGadgetAttrs() instead of being create-time only attributes.

  o Added the GTBB_FrameType tag which gives access to the new frame types
    available in Intuition.  You pass the tag to DrawBevelBox() and can specify
    BBFT_BUTTON, BBFT_RIDGE or BBFT_ICONDROPBOX.

  o GT_SetGadgetAttrs() can now safely be called when the gadget being affected
    is not attached to a window, by passing a NULL window parameter

  o Specifying GTTX_CopyText and not GTTX_Text now works for TEXT_KIND gadgets.

  o TEXT_KIND or NUMBER_KIND gadgets that have the GTTX_BackPen or GTNM_BackPen
    tags specified look visually cleaner when changing the gadget text
    using GTTX_Text or GTNM_Number than those without.  Listviews take
    advantage of this when applicable.

  o The value of GTSL_Level is now bounds checked at CreateGadget() time in
    addition of at GT_SetGadgetAttrs() time.

  o Fixed bug where doing GT_SetGadgetAttrs() on a MX_KIND gadget and not
    passing the GTMX_Active tag would reset the active selection to #0 instead
    of leaving it alone.

  o The NewGadget.ng_TextAttr field can now be NULL whenever a gadget is
    created.  In such a case, the screen's TextAttr is used (screen's TextAttr
    is determined from the VisualInfo in the NewGadget structure).

  o The level display of SLIDER_KIND gadgets is now rendered with background
    set to BACKGROUNDPEN instead of 0, which is more "correct".

  o Now uses SetWriteMask() instead of SetWrMsk().

  o Added support for gadget help in all gadget types.

  o GadTools now handles the new ExtIntuiMessage generated by Intuition.

  o Many enhancements to PALETTE_KIND gadgets:

        Palette gadgets no longer display a box filled with the selected color.
        The selected color is instead denoted by a box drawn around the color
        square in the main palette area.

        Palette gadgets now allow strumming, and right mouse button
        cancellation.

        GTPA_ColorTable is a new tag to support sparce color tables in
        gadtools.  Ths tag can be passed at create/set/get time.

        GTPA_NumColors is a new tag to specify the total number of colors to
        display.  This allows amounts of colors that are not powers of 2.  This
        tag is also good at create/get time.

        GTPA_ColorOffset is now supported at get/set time.

        Renders itself much faster, this makes a big difference on 256 color
        screens.

        Now does quite smart layout of the color squares.  An attempt
        is made to keep them as square as possible, based on the aspect ratio
        information obtained from the gfx database.  As many colors as possible
        are put on the screen, until things get too small in which case the
        upper colors are thrown away.

  o MX_KIND gadgets now support ng_GadgetText and will display the label
    in relation to the group of mx gadgets.

  o Added GTMX_TitlePlace tag.  This determines where the title of a MX_KIND
    gadget is displayed.  If this tag is not provided, the title is not
    displayed.  This is required for compatibility.

  o Fixed size calculation errors in listview present since V37.  This
    may cause certain listviews to change in size from their V37 size.

  o Revamp of listviews:

        ListView lines can no longer end up complemented in certain tricky
        situations involving detaching lists.

        ListViews correctly track the selected line when you click in them.

        ListViews were clipping the text four pixels early on the right.

        Added GTLV_CallBack.  This tag allows a callback hook to be provided
        to gadtools for listview handling.  Currently, the hook will only
        be called to render an individual item.  This adds the very useful
        ability to define a callback hook which is used to scroll complex
        items such as graphics, etc.

        Listviews now allow strumming.  That is, holding down the left mouse
        button and moving the mouse up or down causes the active selection
        to track the mouse.  Moving the mouse off the top or bottom of the
        listview causes the list to scroll.

        Listviews that used to have a display or string gadget underneath
        them now have a highlight bar to indicate the selected item.  This is
        in anticipation of listview multi-selection.  If the listview had a
        display gadget, it no longer does as the highlight bar is used.  If
        a listview had a string gadget, it retains it.

        Listviews highlighting is done using the pen-spec method instead of
        the 1.3 complementing method.

        Listviews are much faster at rendering and scrolling, which makes a
        noticeable difference in 8 bit planes

        Added GTLV_MaxPen tag to specify the maximum pen number used by
        a custom rendering callback hook.  This enables more optimal scrolling
        and screen updates.

        {GTLV_Selected, ~0} is now supported at both create and set times.

        {GTLV_Labels, ~0} is now supported at create time.

        Listviews now support GA_Disabled.  This causes the list area to be
        ghosted, but the scroller and arrows remain unghosted.

  o When cloning a rastport for internal use, no longer copies the TmpRas
    field of the original rastport, which should eliminate some potential
    bugs.

  o Changed the definition of TEXTIDCMP and NUMBERIDCMP in gadtools.h to be
    (0) instead of (NULL), to keep the Manx compiler happy.

  o It is now safe to call GT_GetGadgetAttrs() and GT_SetGadgetAttrs() with
    NULL gadget pointers.

  o When GT_SetGadgetAttrs() is called on an active STRING_KIND or
    NUMBER_KIND gadget, the gadget is automatically reactivated after
    its string is changed.  Although this reactivation flickers,
    the functionality is quite useful.

  o Now copies a complete TTextAttr structure when needed to fix potential
    problems with WeightTAMatch().  This is only done to create underlines
    under gadget labels.

  o Fixed example in CreateGadget() autodoc.  Only had a single argument in the
    call to GT_RefreshWindow()

  o BOOPSI images are now allowed in gadtools menus.

  o Added the GTTX_Clipped tag for TEXT_KIND gadgets.


ramdrive.device

  o Uses AllocMem(xxxx,MEMF_REVERSE!MEMF_KICK!MEMF_NO_EXPUNGE) instead
    of private AllocHigh() code.

  o Uses CopyMem() instead of an unrolled loop.  CopyMem()'s MOVEM's are
    faster than the unrolled loop used previously.

  o Protects KickTag/KickMem list with FORBID/PERMIT inside of KillRad()
    vector used by REMRAD.  Fixes possible crash if some other task
    is fiddling with these lists at the same time.

ram-handler

  o Fixes the long standing bug where if the file you were examining with
    ExNext() is deleted, RAM: goes off into never-never land (and your system
    follows).  If the file is deleted, it will restart at the beginning of the
    directory.

  o Disabled softlinks in RAM: to save ROM space.

shell

  o NewShell/NewCLI now open full with (like Shell from WB).

  o NewShell/NewCLI now handle FROM fields up to 255 long (up from 127) and
    errors out if FROM or WINDOW are too long.

  o Resident module handling now properly Forbid()s around seg_UC++/--.

  o Prompt now handles %%.

  o Removed two harmless enforcer hits at boottime.

  o If a "command `command...` ..." fails, it no longer inserts the error
    message and continues (FailAt is used to determine failure).

  o Added evil kludge to solve the problem of 1.3 SetClock crashing on 68040s.

  o Fixes the write to rom on <> redirection.

  o NewShell/NewCLI no longer print error messages if no S:Shell-Startup is
    present.

timer.device

  o Timer keys off new GfxBase flag for determining EClock frequency
    since PAL/NTSC is now software selectable.

trackdisk.device

  o Post-write delay has been moved from 2ms (spec is 1.2ms) to 3ms,
    and side settle delay from 1ms (spec is 0.1ms) to 1.5ms.  This should fix
    most A1010's out there.  In addition, both of those values have been made
    part of the public unit structure like settle delay and step delay, so
    people with REALLY bad A1010's can back it off as far as they need to
    (or setpatch can).

  o Fixes a nasty oversight in the HD floppy handling.  After switching
    from a HD floppy to LD floppy and back to HD floppy, you could never
    safely write to an HD floppy unless you formatted an HD floppy first.

    What happened was that the extra slop area at the front of the write
    wasn't getting set to $aaaaaaaa, it was being left with garbage from the
    last LD read (since LD uses less slop, it's start-read spot is earlier).
    Format re-inits the entire buffer, as does the first switch to an HD
    floppy (only the first, since it switches to a larger buffer then).

  o Fixed a bug where if a track was totally unreadable it returned the number
    of retries as the IO_ERROR instead of TDERR_NoSecHdr (this was causing the
    "Error 11" stuff when you popped a disk while copying from it).
utility.library

  o Downcoded all tag calls from C to assembly which yields substantially
    faster performance.

  o Removed 68020-specific versions of the date conversion routines.

  o Fixed bug in MapTags() where the "includeMiss" parameter didn't work.

  o Cleaned up and expanded autodocs.

  o Cleaned up public include files.

  o Added comments in the autodoc entries for the 4 32-bit math routines,
    to the effect that they preserve address registers, and that A6
    does NOT have to be loaded in order to call the routines.  This is an
    exception to the standard rule, but can avoid register shuffling which
    is important in low-level math routines.

  o Made the math routines several cycles faster on 68000 machines.

  o Added SMult64() and UMult64() which do 32x32=64 bit integer math.

  o Added ApplyTagChanges().

  o Added two new library calls that are mainly here to help intuition get
    smaller.  These are PackStructureTags() and UnpackStructureTags().

  o Added the NameSpace code.

  o Added GetUniqueID().





Appendix D:  Release 3.1 ROM Changes


Following is a description of most of the important changes made to the
ROM-based system software between Release 3 and Release 3.1.  This doesn't
cover changes made to modules not discussed in this talk.  It also doesn't cover
any changes after December 1992.  Since 3.1 is still under development as of
this writing, more changes are likely to be made to the software prior to
release.


BootMenu

  o Fixed bug where the chip type mutual exclude gadget was being displayed
    even on pre-ECS machines.

exec.library

  o Added the full support for the Zorro-III quick interrupts.
    The new LVO (in an old slot) ObtainQuickVector() is used to allocate
    the vector.  There is no deallocation since this is basically
    a configuration issue and not a dynamic thing.

  o On machines with PCMCIA cards, EXEC now makes sure the interface
    is turned on at boot time and then will turn it off before configuration.
    This should let a full 8-meg of RAM be added in the Zorro-II space.
    This change requires an update to the credit card resource/device
    such that it will correctly turn on the interface if needed.

  o The Quick Interrupt vectors that have not yet been added used to
    be -1.  Now they point at an Alert that is the new Unexpected
    Quick Interrupt.

gadtools.library

  o Fixed bugs in clipping code in TEXT_KIND and NUMBER_KIND gadgets.  The
    clipping didn't work correctly on right and center justified text, and
    was under-evaluating the number of pixels available for the text in a
    gadget that didn't have borders.

  o Fixed bug in the calculation of the default value for the GTSL_MaxPixelLen
    tag.  This caused odd clipping of the number display for sliders whenever
    the title of the gadget wasn't on the same side of the slider as the
    display of its current value.

  o Fixed GTJ_CENTER option for the various GTXX_Justification tags.  The way
    centering was done could cause certain characters to get lost.

carddisk.device

  o Now flushes cache during data writes in anticipation of 040 copyback
    cache on A1200 (no hardware support for PCMCIA memory space data
    cache control provided, so the data cache is still potentially
    a problem when programming flash rom; means turning off the
    data cache globally for 030/040 A1200's to support 6-10us
    write/verify timing).

card.resource

  o Now leaves PCMCIA slot disabled if any RAM is configured at $600000;
    this allows use of >4Megs of 24bit RAM on the A1200 at the expense of
    being unable to use the PCMCIA slot.

  o Partial work around for a hardware bug in our PCMCIA implementation
    which presents 2Meg+ addresses everytime we access ATTRIBUTE memory.
    This causes a problem when a >2Meg card which ignores REG is used
    (and a potential problem with any card which tries to decode the entire
    address when REG is set).  The former problem is kludged around by trying
    to sniff out mirroring of 4 bytes at $A00000 and $800000 but not mirrored
    at $600000.
  - Tested with:
	Fujitsu 512K SRAM (ignores REG)
	Fujitsu 128K SRAM (decodes entire address)
	Panasonic 512K SRAM (returns $FF for attribute memory)
	HP 128K SRAM (has 16 bytes of attribute memory)
	NewMedia 2M PSRAM (ignores REG)
	NewMedia 4M PSRAM (ignores REG - this is the card which demonstrates
		the problem)

  o Considerably faster memory sizing for SRAM/DRAM cards (does test of
    every 256 words/long-words) - tested with:

	Fujitsu 512K SRAM (ignores REG)
	Fujitsu 128K SRAM (decodes entire address)
	Panasonic 512K SRAM (returns $FF for attribute memory)
	HP 128K SRAM (has 16 bytes of attribute memory)
	NewMedia 2M PSRAM (ignores REG)
	NewMedia 4M PSRAM (ignores REG - this is the card which demonstrates
        	the problem)

  o CardMemoryMap structure extended for V39 card.resource.  Now has
    COMMON/ATTR/IO Memory Zone size for lookup via structure.  Will be used
    to provide splitting of memory zones in the future if needed.  No change
    for existing software.

  o BVD1/SC, BVD2/DA, and BSY/IRQ status change interrupts can now be
    individually enabled/disabled.  WR (Write-Protect) status change
    interrupts are always enabled (rare), and there is no change in the
    defaults.  This is intended for future use if needed (e.g., Flash-ROM
    which expects software to poll SC during programming; better performance
    can be obtained if interrupts are not generated).  If needed on the A600,
    this can be implemented as documented work around, or SeFunction() of
    CardMiscControl().  No expected change for existing software;
    defaults are the same as they use to be in V37 card.resource.  Spurious
    interrupts (change true, but interrupt disabled) are cleared by the
    resource software, and hidden from the status change callback hook.

  o Secondary callback option for status change interrupts; allows
    high-performance hardware to be serviced via interrupts only (instead of
    signalling a task).

  o Flush Cache when ReleaseCard() is called.  A flush before full release
    ensures that no more writes will occur once the caller returns from
    ReleaseCard().  This is to support the 040 copyback cache when/if an 040
    becomes available for the A1200.  Would prefer control over the data cache
    for PCMCIA space independent of the first 4MEG of 24bit Fast RAM, but we
    don't have this feature.  Lack of Data Cache control for PCMCIA space is
    still potentially problematic for use of FlashROM programming which
    requires disabling the DATA cache for 030/040 equipped A1200's so that fast
    (6-10us) write/read operations can be performed during programming.
    Disabling the DATA cache during FlashROM writes means disabling globally.

dos.library

  o Fixed bug in RemAssignList(): it wouldn't remove the first lock in the
    assign.

  o AttemptLockDosList() was returning NULL or 1 for failure instead of NULL.

  o Made RunCommand() free any memory added to the tc_MemEntryList by
    the command being run.  tc_MemEntry is now saved and emptied before calling
    the command, and restored after any added memory is freed.

  o Fixed ExAll() emulation to not lose 1 file each time the list is broken
    up into multiple ExAll() calls.

  o Removed broken attempted fix for rda_Buffer.  Autodocs now reflect that
    you must restore rda_Buffer before each call to ReadArgs() if you pass
    in an RDArgs structure.  Now always clears rda_Buffer in FreeArgs().

  o SetVBuf() enabled.
  o Changed some prototypes to avoid c++ reserved word "template".  Changed
    VPrintf()/VFPrintf() prototypes to VOID * from LONG * to reduce useless
    compiler warnings/casts.

  o GetDeviceProc() now returns errors better (especially
    ERROR_NO_MORE_ENTRIES).  It used to lose error codes by calling
    UnLock().

  o SetVBuf() now updates the filehandle so it won't overwrite the buffer
    with a smaller one if SetVBuf() is called before doing buffered IO.
    Also it doesn't allocate anything if the new size is the same as the
    old.

  o SetVar() now creates subdirectories as needed (including multiple ones)
    if they do not exist already (in ENV: and in ENVARC: if GVF_SAVE_VAR
    is set).  Also, it now preserves any IoErr() and won't try to save to
    ENVARC if there is an error saving to ENV:.

  o Modified to fix an edge condition which existed when making the mod to
    SetVBuf().

expansion.library

  o New A1200-specific build that can detect CPU Slot RAM ($08000000)
    if you have a 32-bit addressing CPU installed.  The CPU slot area
    is 128meg in size (just like the A3000) but has the addition of
    a wrap check at each 1meg of space in the CPU address space to make
    low-cost RAM expansion possible without jumpers.  (It is now possible
    to get 128Meg SIMMs so a single SIMM on a CPU card could make a
    128Meg of FAST RAM system )

    The reason that this has to be A1200 specific (at least for now)
    is that the behavior of the existing A500/A2000 CPU cards with
    respect to 32-bit addresses is very undefined.  They act very
    strangely and differently making it very difficult to safely figure
    out if these cards are operating correctly or not.

filesystem

  o Fixed deletion of the destination of a hardlink - this was badly
    broken in all versions of the FS, DCFS just made it easier to hit.
    This was causing spurious "Checksum Error on Block 0" errors (and
    potentially others), especially when UUCP was using a DCFS partition.

  o Fixed a return code which would make softlinks not work if a softlink
    to a directory is in the middle of a path.

  o Fixed the buffer overrun on ExAll() with ED_COMMENT if the first
    character was >$80 (and lost the first character of comments).

  o Fixes updating the date of a directory that changes in the parent
    of that directory's dircache.

  o There were old offsetting bugs in the ExAll() filename/comment copying
    code.  When I fixed the code not to copy too many bytes, the clear was
    being done to the wrong byte.

filesysres.resource

  o Now matches the FS version change.

workbench.library

  o Adjusted the sizes of the OK/CANCEL and SAVE/CANCEL gadgets in
    the Workbench requesters to match the rest of the system.

  o Fixed a long standing bug that was just found: The system would crash
    (sometimes) or cause Enforcer hits if files were deleted within
    a drawer that was also selected for deletion.  This one has
    a fundamental flaw in Workbench which had to be patched with some
    rather tricky organization of tests...
