[comp.sys.apple] System Disk 3.2 Release Notes

keith@Apple.COM (Keith Rollin) (09/14/88)

Considering the number of requests that I have recieved and seen here on the
net, I have obtained the release notes for System Disk 3.2. They look kind of
ugly, as they were formatted in MS-Word, but they should be legible. The
formatting is all munged up, and the picture/figures are missing, but there
is a lot of useful information. If you need a clearer set of documenation,
order a set from APDA.

Also, there are some references to other documents, such as ERS's for Sound
Tools and Custom Windows. I don't have those, so can't upload them. However,
they are also available from APDA.


Keith Rollin                                               amdahl\
Developer Technical Support                           pyramid!sun !apple!keith
Apple Computer                                             decwrl/
"You can do what you want to me, but leave my computer alone!"

=============================================================================
Apple IIgs System Disk 3.2
Release Notes

Contents
Operating System        2
Setup Files             3
Toolbox                 3
Drivers                 27
Utilities               31
Finder                  31
Launcher                32
Start             32
System Utilities        32
AppleTalk Utilities           32
Chooser                 32
Namer             32


Operating System
BASIC.SYSTEM v1.2
(The ProDOS AppleSoft Command Interpreter)
Bug fixes:
There were discrepancies between TOTENT, the word specifying 
the number of entries in the ProDOS directory, and the actual 
number of entries. This has been fixed by making the following 
changes:
CATALOG in <CMDS2>, B076      changed from BEQ ENDCAT to NOP/NOP
B07C                    changed from BCS CCATERR to BCC
B0A1                    changed from BPL to BCC
Control S on a CATALOG prematurely terminated if a subsequent 
<space> was pressed. This has been fixed.
ProDOS 8 v1.6 (P8)
Bug fixes:
Previously, on occasion, the mliactiv flag was left on after 
finishing an mli call. To correct this problem, and 'asl' has 
been changed to an 'lsr'.
ProDOS 8 now returns "#POSNERR" if the 32 MB limit is exceeded.
"ESC" cleared from the keyboard strobe when booting on a IIc.
Interrupts are turned off during a status call.
ProDOS 16 v1.6 (ProDOS)
A number of pieces of code have been added to ProDOS 16, making 
it possible to boot over an AppleTalk network.
SetUp files and DeskAccs will not be loaded if bit 15 of their 
AUX_TYPE is set.
ProDOS 16 v1.6 (P16)
Get_Dir_Entry will refresh its directory buffer if it is 
preceded by any other P16 call.
A call to FORMAT will now cause a switch to emulation mode 
before calling the SCSI driver. Previously a call to FORMAT 
caused the system to hang.
In order to be more descriptive, Get_Dir_Entry now returns End-
of-File errors ($4C) instead of End-of-Directory ($61).
If CREATE is called with an invalid pathname, it now returns 
Path-Not-Found instead of File-Not-Found.
System Loader v1.6
Bug fixes:
There were several bugs which interfered with proper operation 
of the Loader. These include:
% A problem in the buffering scheme which made it impossible 
to load some files with large segments
% Improper alignment of a load segment with an align of 
exactly $10000
% Inability to load a segment of exactly one byte
% Incorrect returns from LoaderShutDown, LoaderVersion, and 
LoaderStatus (carry bit clear, accumulator non-zero)
% Subroutine Dispatcher wrote two bytes into random memory
% Loader's buffers moved during Restart without informing 
the Loader

Setup Files
AppleTalk INITs v1.0
There are eight AppleTalk INIT files with System Disk 3.2. These 
are:
ATINIT      Contains user configuration information
ATPATCH     Implements the RPM, PAP, EP, and ZIP 
AppleTalk  protocols. Also contains the 
code needed to patch the bugs in ROM. A 
list of patches in this version follows.
SPLoad      Implements ASP, which allows up to eight 
open network sessions at once
PFILoad     Implements the ProDOS Filing Interface, 
which allows ProDOS calls to be made 
transparently over the network
ATStart     Starts AppleTalk 
ATSetup     Determines if AppleTalk is active, and 
loads appropriate files
ATROM Contains new code replacing ROM AppleTalk 
ATResponder Registers user-name on the AppleTalk 
network

Tool.Setup v2.3
The current version of Tool.Setup is actually three files, 
while on previous releases it was only one. The three files are 
TOOL.SETUP, TS1, and TS2. TOOL.SETUP examines the version of 
the ROM to determine which of the other setup files to load. It 
loads TS1 with the original ROM, and TS2 with the newer ROM.  
If it finds a ROM that is not one of the first two versions, it 
will load neither file. This change saves between 8 and 10 
seconds of boot time. 
TS1 and TS2 also contain patches to the SysBeep routine so that 
if the control panel volume is zero, a SysBeep will flash the 
screen border.

Toolbox
Audio Compression and Expansion Tool Set
The A.C.E. Tool Set provides a fast, reliable set of routines 
for compressing and decompressing digitized sounds. For 
detailed information on how to use the A.C.E. Tools, see the 
A.C.E. Tools ERS which accompanies these release notes.
Control Manager v2.5
JControls are now drawn in the port of the window in which they 
appear. This undoes a change introduced in version 2.1 of the 
control manager.
This rule has always been true, but needs to be clarified:
Controls are drawn in the grafPort of the window that owns the 
controls. This means that the appearance of the controls is 
determined by the state of the window's grafPort.For example, 
if the grafPort's font is changed to something other than the 
system font, then text in controls will be drawn in the 
window's font, not in the system font.
This also means that the grafPort cannot be left in any old 
state, because the state of the grafPort will determine how 
controls are drawn. For instance, if  the pen mask is changed, 
then controls will be drawn using the new mask. Thus, if you 
are drawing in a window which has controls, make sure the 
grafPort is left in the state in which you want your controls 
drawn
Controls which are created by TaskMaster are drawn in the 
Window Manager's port, not in a window's. Therefore, the state 
of a window's grafPort will not affect controls drawn by 
TaskMaster.
The font ID is saved and restored when switching to and from the 
icon font.
Colors in control tables now use all four color bits in both 
modes; they formerly used only bits 0 and 1 in 640 mode. There 
shouldn't be any applications using color controls in 640 mode, 
but for any that do the effect will be that controls will be a 
different color.This change was made so that dithered colors can 
be used with controls.
The barArrowBack entry in the scroll bar table was never 
implemented as first intended, and is now no longer used. It was 
intended to allow the arrow to be drawn with three colors: the 
interior of the arrow, the arrow's outline, and the surrounding 
color. Since arrows are drawn as text characters, only two 
colors are possible.
The high word of the parameter passed to the draw command is now 
set to zero in some cases, to help some code that did not 
conform to documented requirements.
The Control Manager will preserve the current port across calls 
to the Control Manager, including those that are passed through 
other tools, such as the Dialog Manager.
The Control Manager now calls PenNormal before drawing controls 
in a window. This may affect the state of the window's grafPort.
The Control Manager now saves and restores text mode across 
calls to the Control Manager which affect standard controls. 
Custom controls may still change text modes without a save and 
restore.
From now on the Control Manager will not change the following 
fields in the port of a window that contains controls:
bkPat background pattern
pnLoc pen location
pnSize      pen size
pnMode      pen mode
pnPat pen pattern
pnMask      pen mask
pnVis pen visibility
fontHandle  handle of current font
fontID      ID of current font
fontFlags   font flags
txSize      text size
txFace      text face
txMode      text mode
spExtra     value of space extra
chExtra     value of char extra
fgColor     foreground color
bgColor     background color
When a the enclosing RECTs of radio button and check-boxes were 
larger than the icons, the controls' titles were not vertically 
centered. This has been fixed.
EraseControl expands the bounds RECT of certain controls before 
erasing. This is because a simple button has a surrounding 
border when it is drawn bold (when it is the default button), 
and may have a drop shadow. These characteristics are drawn 
outside the bounds RECT of the control, so EraseControl expands 
the bounds RECT to erase them correctly. Formerly, EraseControl 
was expanding the bounds RECT in cases where it was not 
necessary. This has been fixed.
The Control Manager will now use the state of the window port to 
compute the size of control bounds RECTs when creating a 
control. Previously some of the state information was saved from 
startup time.
The SpecialRect call was added to QD Aux to replace calls to 
FrameRect and FillRect. The Control Manager now calls 
SpecialRect if it is available, instead of making separate calls 
to FrameRect and FillRect. 
TrackControl now pushes an extra word on the stack before 
calling the action procedure. This word is provided only because 
some action procedures return a value where none is expected, 
and should not be used by an application.
When drawing simple buttons and when drawing page regions in 
scroll bars, the Control Manager was not using the outline color 
from the controls' color tables. This has been fixed.
If a radio button was turned on, but was hidden, the Control 
Manager would erroneously redraw it if another button in the 
family was turned on. This has been fixed so that the hidden 
button remains hidden instead of being redrawn as it is turned 
off.
When the Control Manager called application code, such as a 
custom control defProc, the call would not work if the code was 
located at the first byte of a bank. This has been fixed.
Bug fixes:
TestControl will now return a zero if an invisible or inactive 
control is selected.
MoveControl no longer makes invisible controls visible when 
moving them.
DisposeControl returned an incorrect error code. This has been 
fixed.
SetCtlTitle did not redraw the titles of radio buttons and 
check-boxes. This has been fixed.
The icons for radio buttons, check-boxes, and arrows in scroll 
bars were not drawn correctly if the item was not as high as the 
icon to be drawn. This has been fixed.
CtlStatus, CtlVersion, and CtlBootInit now return zero in the A 
register.They formerly returned non-zero values with the carry 
bit clear.
HiliteControl formerly returned an incorrect error code if it 
was called with a control was hilight flag was already set to 
the given value. This has been fixed.
GetCtlRefCon and SetCtlRefCon formerly returned an incorrect 
error code if a null handle was passed. This has been fixed.
HideControl, EraseControl and ShowControl formerly returned an 
incorrect error code if the specified control was already 
visible. This has been fixed.
DrawControl formerly returned an incorrect error code if the 
window was visible. This has been fixed.
The grow box control now has its own color table. Formerly this 
control shared the simple button default color table, which had 
the effect that a hilighted size box was drawn as a single black 
box. The hilighted grow box now appears as a white icon in a 
black box.
Previous grow box default color table:
$0000 Black outline for box
$00F0 Not hilighted: black outline in white interior
$0000 Hilighted: black outline in black interior
New grow box default color table:
$0000 Black outline for box
$00F0 Not hilighted: black outline in white interior
$000F Hilighted: white outline in black interior
The color table for the size box control in the Apple 
IIgsToolbox Reference is incorrect. The correct table follows, 
with information that was omitted from the reference in 
boldface:
growOutline  WORD Color of size box's outline:
      Bits 8-15   = zero
      Bits 4-7    = outline color
      Bits 0-3    = zero
growNorBack  WORD Color of interior when not hilighted
      Bits 8-15   = zero
      Bits 4-7    = background color
      Bits 0-3    = icon color
growSelBack  WORD Color of interior when hilighted
      Bits 8-15   = zero
      Bits 4-7    = background color
      Bits 0-3    = icon color
Desk Manager v2.4
Bug fixes:
SystemTask used CLI instead of SEI to access certain data with 
interrupts off.
The GetNumNDAs now works correctly.
The SystemEvent call now allows CDAs to be activated while an 
NDA window is active on-screen.
Dialog Manager v2.2
Bug fixes:
GetItext formerly always stored at least 3 bytes of data into 
the resultPtr passed to it. This was a problem if the editline 
item was only one character, because there should only be two 
bytes stored: one for the length, and one for the character 
itself. This has been fixed.
GetNewModalDialog no longer crashes when passed a non-zero 
refcon value.
IsDialogEvent now correctly claims all window control events.
HideDITem, ShowDItem, GetDItemValue, EnableDItem and 
DisableDItem no longer crash with invalid item IDs.
There was a minor problem with paramtext characters (^0 through 
^3). When they were used at the end of a line, garbage 
characters were appended. They will now work correctly.
Several Dialog Manager calls failed if given invalid item IDs. 
This has been fixed. The calls affected are:
SetDItemValue
GetDItemType
SetDItemType
DialogStatus formerly returned a value of 'active' after the 
Dialog Manager had been shut down. This has been fixed.
Certain Dialog Manager and LineEdit calls assumed that 
foreground and background colors in the applicable grafPort 
were correctly set. This is actually only true if other color 
controls have previously been drawn. This problem has been 
fixed. The affected calls are:
StatText
LongStatText
LineEdit drawing routines.

Font Manager v2.3
The current version of the Font Manager incorporates several 
changes. In previous versions, FMStartUp opened each font file 
in the FONTS folder, and constructed lists of information for 
all available fonts. These lists contained font IDs, font 
names, and so forth for every font in every file in the FONTS 
folder.
The present version of the Font Manager does this same work the 
first time it starts up, but caches all the information it 
compiles in a file called FONT.LISTS in the FONTS folder. The 
next time the Font Manager starts up, it checks all the font 
files' creation and modification dates and times against the 
information in FONT.LISTS. Only if it finds new font files or 
other evidence of change will it compile new FONT.LISTS 
information. Otherwise, it simply starts up with the 
information stored in the LISTS file. In most cases, since it 
doesn't have to open every font file, the Font Manager can 
start up much more quickly.
New call:
$1C1B       InstallWithStats  
                  returns: none     Input parameters:
                                    desiredID: LONG
                                    scaleWord:WORD
                                    ResultPtr: LONG
Installs a font and returns information about that font. When 
an application requests the installation of a font, the Font 
Manager attempts to install the requested font, but it may not 
be available. In such cases, the Font Manager will install the 
closest match it can find to the requested font.
InstallWithStats installs a font just as if the application had 
called InstallFont, but it returns a FontStatRec in the buffer 
pointed to by ResultPtr. This record contains the ID of the 
installed font, which may be different from the font requested. 
It also contains the purge status the font had before it was 
installed. Since purge status can be changed by installation, 
this information can make it easier to restore a font's purge 
status. The font's purge status may not be the same after 
installation. If you need to know an installed font's purge 
status, use FindFontStats.
Bug fixes:
A handle to the parameter block was not locked down at the 
correct point during the call to FixFontMenu. As a result, 
memory compaction caused the parameter block to move, and 
invalidated the handle to the parameter block. This has been 
fixed.
Handles were not being locked down during scaling routines. 
This has been fixed.
Line Edit v2.1
Bug fixes:
LETextBox2 now locks its handles to prevent the allocated 
blocks from being moved during the call's execution.
List Manager v2.3
The IIgs Toolbox Reference incorrectly states that a disabled 
item of a list cannot be selected. In fact, a disabled item can 
be selected, it simply may not be hilighted. The List Manager 
provides the ability to selected disabled (un-hilighted) items 
so that it is possible, for instance, to allow a user to select 
a disabled menu choice as part of a help dialog. There may be 
other reasons to allow a user to select a disabled item, as 
well, so the List Manager will allow it.
Further clarification:
List manager definitions:
disabled:   Bit 6 of the list-item's memFlag field is 
set. Disabled items appear dimmed and cannot 
be hilighted.
enabled:    Bit 6 of the list-item's memFlagfield is 
clear. Enabled items appear normal and can be 
hilighted.
selected    Bit 7 of the item's memFlag field is set. 
This bit is set when a user clicks on the 
list-item, or the item is within a range of 
selected items. A selected item will only 
appear hilighted if it is also enabled.
hilighted   A member of a list will only appear hilighted 
when it is both selected and enabled. This 
means that bit 7 of the memFlag field is 1 
and bit 6 is 0. A hilighted member is drawn 
using the highlight colors.
Bug fixes:
The List Manager uses a custom control defProc. The Control 
Manager passes a handle to this defProc for the 'record size' 
operation. The List Manager was locking the passed handle,  but 
not checking to ensure that it was valid before using it. As a 
result, changes were being written to unknown locations in 
memory. This has been fixed.
The List Manager now correctly handles member record arrays 
larger than 64K.
The List Manager was updating lists incorrectly when the thumb 
was dragged. The number of members scrolled times the height of 
the members was greater than 64K pixels. This has been fixed.
Member text is now drawn in 16 colors in both 320 and 640 mode.
MemList sometimes updated the list scroll bar incorrectly. This 
has been fixed.
Memory Manager v2.1
New Call:
$2F02 RealFreeMem returns: Long     
No inputs
Returns the number of bytes in memory that are free, plus the 
number that could be made free by purging. FreeMem only returns 
the number of bytes which are actually free, ignoring memory 
which is occupied by unlocked purgeable blocks, so RealFreeMem 
provides a more accurate picture of available memory.
Bug fix:
During the call SetHandleSize, if memory was compacted while 
its handle was resized, and the original handle moved before 
the new memory was found, and if another handle was moved into 
the original handle's old location, then the data in the 
resized handle was incorrect. In order to correct this problem, 
the Memory Manager now dereferences the original handle after 
compaction.
Menu Manager v2.1
The NewMenuBar call will now automatically set bit 31 of the 
CtlOwner field in the menu bar record, if the designated 
menubar is a window menu bar, and the value passed for the 
window is not zero.
The menu manager's justification procedures now adjust for menu 
bars in windows. Menus will be moved to the left if they would 
otherwise appear to the right of the menu bar's right end.
The default menu bar has the following coordinates: top = 0; 
left = 0; height = 13; width = the width of the screen.
The Menu Manager now locks menu and menu bar handles during any 
call that accesses those records. This prevents the records 
from being moved during accesses.
Empty menus are now drawn with the QD Aux call SpecialRect, 
unless it is unavailable. In this case, the calls FillRect and 
FrameRect are used.
Some Menu Manager calls to an application did not work if the 
routine being called was located at the first byte of a bank. 
This has been fixed.
MenuShutDown no longer returns an error if the Menu Manager has 
already been shut down.
The call CalcMenuSize uses the parameters newWidth and 
newHeight to compute the menu's size. These parameters may 
contain the width and height of the menu, or may contain the 
values $0000 or $FFFF. A value of $0000 tells CalcMenuSize to 
calculate the parameter automatically. A value of $FFFF tells 
it to calculate the parameter only if the current setting is 
zero.
The effect of all three uses:
1) Pass the new value:  The value passed will become the 
menu's size. Use this method when a 
specific menu size is needed.
2) Pass $0000     The size value will be automatically 
computed. This is useful if menu items are 
added or deleted, rendering the menu's 
size incorrect. The Menu's height and 
width can be automatically adjusted by 
calling CalcMenuSize with newWidth and 
newHeight equal to $0000.
3) Pass FFFF      The width and height of a menu is zero 
when it is created. FixMenuBar calls 
CalcMenuSize with newWidth and newHeight 
equal to $FFFF to calculate the sizes of 
those menus with heights and widths of 
zero.
Using SetMenuBar to change the menu bar color now changes the 
dynamic default menu color table and leaves the static menu 
color table unchanged. If SetMenuBar is called to change the 
color of a menu which uses the default color table, then the 
colors of all menu bars which use the default color table will 
be changed. To change the color of a single menu bar without 
affecting other menu bars, set the menu bar's CtlColor field to 
a new color table.
Menu Caching

This version of the Menu Manager introduces new Menu Caching 
features. Menu caching is designed to provide faster display of 
menus under certain circumstances. When a menu is drawn on the 
screen, the area of the screen that it covers is copied into a 
buffer. Then, when the menu  goes away, the contents of the 
buffer is simply copied back to the screen.
In the current version of the Menu Manager, when the saved 
screen image is copied back to the screen, the menu that goes 
away is copied into the buffer. In other words, the Menu 
Manager swaps the menu image with the screen image. That way, 
the next time that menu is pulled down, the Menu Manager can 
copy it from the buffer instead of drawing a new image.  
Of course, if the menu image changes, for example, if an item 
is disabled, or the items on the menu change, then the cached 
image is inaccurate, and the Menu Manager must redraw the menu. 
Nevertheless, in those cases when a menu image does not change, 
the menubar will respond to the user more quickly.
Table 1
Calls that can change a menu image
CalcMenuSize      CheckMItem  DeleteMItem DisableMItem
EnableMItem FixMenuBar  InsertMItem MenuNewRes
SetBarColors      SetMenuFlag SetMItem    SetMItemFlag
SetMItemMark      SetMItemName      SetMItemStyle
Menu caching should not increase memory requirements, since menu 
images are purgeable when not displayed on the screen.
This menu caching scheme should work properly with all existing 
standard menus. Custom menus, however, will have to be altered 
to work correctly with menu caching. Custom menus will still 
function normally, as long as they do not change the menu record 
directly, they just will not be able to take advantage of the 
menu caching scheme to speed up display.
Caching does not work with menus in windows, so the InsertMenu 
call automatically disables caching for such menus.
Caching with custom menus
Bit 3 of the MenuFlag field in a menu record indicates whether a 
menu's definition procedure knows about caching. A value of 1 
indicates that the menu in question works correctly with 
caching. A custom menu which uses caching must define a menu 
record which sets this flag, and allocates an extra field, a 
handle to the cache in which the menu image will be stored. (See 
Table 2)
Table 2
Fields in a cacheable menu record
MenuID            WORD
MenuWidth         WORD
MenuHeight  WORD
MenuProc          LONG
MenuFlag          BYTE        ; Bit 3 = 1 to enable caching
MenuRes           BYTE
FirstItem         BYTE
NumOfItems  BYTE
TitleWidth        WORD
TitleName         LONG
MenuCache         LONG        ; New field in cacheable menu 
records
                              ; Handle to cache

The FixMenuBar call will automatically allocate a cache for the 
defined menu if the caching flag is set.

Bug fixes:
CalcMenuSize has been modified so that it takes text styles into 
account when calculating the width of a menu.
Display of menu titles has been corrected so they will be 
arranged properly relative to the left side of the menu bar 
RECT.
The CtlOwner flag of a menu inside a window must be negative 
(bit 31 must be set). This has always been true, but has been 
undocumented. NewMenuBar now sets that flag if the value passed 
for the window is not zero, and the menu bar is a window menu 
bar.
Menus in windows can now display the Apple character (ASCII 
$14).
Menus now use their outline color for lines which separate menu 
items.
MIDI Tool Set
The MIDI Tool Set is a set of utilities for use with the 
Musical Instrument Digital Interface data transfer protocols. 
With a MIDI interface and the correct driver, the MIDI Tools 
enable a developer to write applications which can control 
MIDI-compatible synthesizers. For a detailed explanation of how 
to use the MIDI Tools, see the MIDI Tools ERS which accompanies 
these release notes. 
Known bugs:
If you use the Note Sequencer with the CARD6850.MIDI driver, 
either the Note Sequencer or the driver will crash, because 
they step on each other's memory. This problem will be fixed 
with a patch to the driver which is available from Developer 
Tech Support.

Miscellaneous Tools v2.1
Bug fixes:
The SetHeartBeat call sometimes allowed heartbeat interrupts to 
accidentally clear the quarter second timer interrupt. 
SetHeartBeat has been patched to  install a different heartbeat 
interrupt routine, which should prevent this problem.
Note Sequencer v1.1
The Note Sequencer Tool Set provides numerous routines for 
controlling MIDI -compatible sequencing in the Apple IIgs. For 
detailed information on how to use the Note Sequencer, see the 
Note Sequencer ERS which accompanies these release notes.
Known bugs:
If the Note Sequencer was not started up and Note Sequencer 
calls are made, no error is returned.
If the MIDI  Tools were not started up and a program calls 
StartSeq specifying that it wants to use the MIDI Tools, no 
error is returned, and the carry bit is not set. StartSeq will 
quit, but no error is posted to explain why.
The same problem occurs if StartSeq is called specifying that 
MIDI is to be used, but no output buffer has been allocated for 
it. Once again, StartSeq quits, but does not return an error or 
set the carry bit.
An update which fixes these bugs is available from Developer 
Tech Support.
Note Synthesizer v1.2
The Note Synthesizer is a set of routines which control the 
generation of musical notes and sounds on the Apple IIgs.For 
detailed information on how to use the Note Synthesizer, see 
the Note Synthesizer ERS which accompanies these release notes.
Print Manager v2.1
The call PrChooser has been completely redesigned. It now has a 
new user interface, and supports printing over AppleTalk  
zones.
Printer.Setup now saves separate settings for direct and 
network connections to printers, and saves the User Name for 
use on a network. Old version of the Printer.Setup file are 
incompatible with these changes, so the Print Manager will 
delete such files and create a new one in the correct format. 
Unfortunately, the old settings and default settings are lost, 
and the default settings are used to create the new setup file.
If the System disk is locked, the Print Manager will not be 
able to save changes in Chooser settings, and will display a 
dialog to warn the user of this fact. It will, however, save 
any changes to the Chooser settings in RAM, so the new settings 
will remain in effect until the current application quits.
If the Print Manager attempts to load a driver and finds that 
it is missing, it will pass control to a routine that 
determines what call was being made to the driver, pops the 
parameters off the stack, and returns a Missing Driver error. 
It will also display an alert asking the user  to make sure a 
printer and port driver are selected.
PMStartup no longer loads any drivers into memory. It does not 
require that the Drivers folder be present, and if it is 
present, does not require that there be any drivers in it.
PMStartup checks to see whether the List Manager has been 
loaded. Since PrChooser uses List Manager calls, PMStartup will 
load the List Manager if it has not already been loaded.
New calls:
$3413 PMUnloadDriver    returns:none parameters:driver:WORD
Unloads the current port driver, printer driver, or both, 
depending on the input parameter.The current driver is 
determined from the settings in the Printer.Setup file. Legal 
values for the driver parameter:    
                                    0 = unload both drivers
                                    1 = unload printer driver
                                    2= unload port driver.
The a register is zero if the call was successful. If an 
illegal input parameter is passed then the error code BadParam 
($1308) is returned. Any other value is an error returned by 
the Loader call UserShutDown.
$3513 PMLoadDriver      returns: none     parameters:
      driver:WORD
Loads the current printer driver, port driver, or both, 
depending on the input parameter. The current driver is 
determined by the settings saved in the Printer.Setup file. 
Legal values for the driver parameter:    0 = load both drivers
      1 = load printer driver
      2= load port driver.
The a register is zero if the call was successful.If an illegal 
input parameter is passed then the error code BadParam ($1308) 
is returned. Any other value is an error returned by the Loader 
call InitialLoad.
Bug fixes:
The Chooser will now correctly display more than twelve driver 
files.
Alert messages now appear properly in 320 mode.

QuickDraw Auxiliary v2.3
New Call
$0C12 SpecialRect returns: none     parameters:     rectPtr 
: LONG
                                          FrameColor: WORD
                                                 FillColor: WORD
SpecialRect frames and fills a rectangle in a single call, 
making separate calls to FrameRect and FillRect unnecessary. 
The single call to SpecialRect is considerably faster than 
separate calls to FrameRect and FillRect.
Bug fixes:
DrawPicture was formerly initializing the pen size incorrectly 
when the specified picture was scaled. This has been fixed.
When a picture that contained text was recorded, the recording 
feature did not work correctly, and the Font Manager was not 
used to install the font. This has been fixed.
When stretching and shrinking images, CopyPixels formerly 
initialized an internal error term incorrectly, causing the 
left side of the image to be adjusted incorrectly, and the 
right side to the image to contain garbage. This has been 
fixed.
Formerly, if the source bounds RECT in PPToPort's LocInfo 
parameter was smaller than the SourceRect parameter, then too 
many bytes would be stored in the picture, and redrawing it 
could cause a crash. This has been fixed.
The QD Aux call DrawPicture assumed that the Font Manager was 
available, but the Finder calls DrawPicture without using the 
Font Manager. To make this work, the font manager calls must 
all look for dispatcher errors, and keep the stack clean. 
SetPurgeStat failed to do this required maintenance. This has 
been fixed.
QuickDraw II v2.3
Bug fix:
InsetRgn failed to create a valid region when joining two 
points into one. This has been fixed.
Scrap Manager v1.3
The Scrap Manager has been updated, and will now run from ROM.
Sound Tools v2.3
The current version of the Sound Tools is required to support 
the MIDI Tools, Note Synthesizer, and Note Sequencer.
The Sound Tools now return the same version number and behave 
identically whether running with old or new versions of the 
Apple IIgs ROM.
Further information on the Sound Tools is provided in the Sound 
Tools ERS which accompanies these release notes. This ERS adds 
information which was not included in the IIgs Toolbox 
Reference.
A patch to FFStopSound, which was in its own file, has been 
incorporated in TS2,the patch file for ROM 2.
The Sound Tools' BootInit call to initialize the RMidiInitPollS 
vector ($E11DD89) has been changed to an RTL.
Bug fix:
The Sound Tools set up the data bank register incorrectly, 
which caused it to write garbage into bank $00 memory. The 
offending code has been removed.
The call StopSound was not switching off the sound generators. 
This has been fixed.
Standard File v2.2
Standard File now uses the GetDirEntry call instead of reading 
directories itself.
Bug fixes:
A common exit routine was calling DisposeHandle with a random 
value, which can occasionally crash the system. This has been 
fixed.
Tool Locator v2.2
The Tool Locator uses a new algorithm to load tools from disk. 
It will only load tools from disk if a tool in ROM does not 
have a high enough version number. The Tool Locator makes no 
assumptions about what tools are in ROM and what are on the 
System disk.
For every tool that is to be loaded, the Locator makes a 
version call. If the version call returns an error because the 
tool is not present, or the resulting version number is too 
low, then the tool is loaded form the System disk.
The Tool Locator no longer unloads all RAM-based tools every 
time TLShutDown is called. Instead, it returns the system to a 
default state, set by a new call in the Tool 
Locator,SetDefaultTPT. This call can make any collection of RAM 
and ROM tools the default state. The system returns to the 
default state when TLShutdown is called.
New call:
$1601 SetDefaultTPT
Sets the default Tool Pointer Table to the current TPT. Used to 
permanently install a tool patch.An application should not make 
this call.
Window Manager v2.2
There are numerous significant changes to the Window Manager, 
notably in the definition of a Window Record. For a complete 
explanation of the Window Manager's new support for custom 
windows, see the Designing Your Own Windows documentation which 
accompanies these release notes.
There is one known bug in Window Manager v2.2:
CloseWindow will leave the top visible window unhilighted if 
an invisible window is in front of two or more visible windows 
in the window list. When CloseWindow closes the top visible 
window it leaves the next visible window unhilighted because 
it thinks that the invisible window is the next visible 
window. The problem apparently only occurs if you use 
invisible windows and SendBehind.
This bug will be fixed in the future. In the meantime,here is 
a work-around that will also work after the bug is fixed:
After CloseWindow, execute the following code:
pea   1           Pass TRUE to hilight
pha               Space for result from FrontWindow
pha               
_FrontWindow            Pass front visible window to HiliteWindow
_HiliteWindow           Make sure front window is hilighted.
Because HiliteWindow does nothing if a window is already 
hilighted, this will work after this bug has been fixed.
If you discover other situations in which the front visible 
window remains un-hilighted, this work-around should work with 
them as well.
TaskMaster now brings a window to the front after dragging is 
complete. TaskMaster previously brought windows to the front 
before dragging.
Standard windows will now draw their titles in sixteen colors 
regardless of mode.
The Grid parameter has been renamed to DragFlag. Its new 
definition is detailed in Fig.1.
Figure 1
                                                   

It is no longer possible to specify Grid values of 256 or 512. 
Alert Windows
The new call AlertWindow (see below) can be used to create 
Alerts for presenting the user with important messages. The 
call does all the work of creating and displaying the window 
and contents for the Alert, and returns the ID of the button  
that the user chooses.
AlertWindow accepts a pointer to a string which contains its 
message, and a pointer to an array of substitution strings. The 
substitution strings can be any of seven standard strings (such 
as "OK", "Continue", and so on) or can be specified by the 
application and stored in the buffer to which the substitution-
string pointer refers.
Format of Alert String
Size Character
Character 1 is the size of the alert window.  The character can 
be 0-9 where:
Character   Approximate max number of characters.
0           (Character followed by 4 integers that are size and 
position.)
1           30
2           60
3           110
4           175
5           110
6           150
7           200
8           250
9           300
Since AlertWindow provides a limited number of standard sizes, 
it is possible to create alerts which will display properly 
whether the Apple IIgs is in 320 or 640 mode. It is necessary, 
however, to design the text and buttons carefully in order to 
make this work.
The following table shows the dimensions of the standard alert 
windows.  This is to give an idea of the size of each window.  
Application code should not rely on the exact widths, heights, 
or position of standard windows.
Character   Height 320  Width 320   Height 640  Width 640
1           46          152         46          200
2           62          176         54          228
3           62          252         62          300
4           90          252         72          352
5           54          252         46          400
6           62          300         54          452
7           80          300         62          500
8           108         300         72          552
9           134         300         80          600
Icon Number
Next character is the icon number.  The icon number can be 0-9 
where:
0     No icon.
1     custom icon, followed by:
      LONG  Pointer to image data.
      WORD  Number of bytes image data is wide.
      WORD  Number of scan lines image data is high.
2     Stop icon.
3     Note icon.
4     Caution icon.
5     Disk icon.
6     Disk swap icon.
7-9 are reserved - DON'T USE THEM.
Separator Character
      The next character is a separator character.  The separator 
can be any character you would like and cannot appear in the 
message text or button strings.  The separator is used to 
separate the message from the first button string and each 
button string from each other.  For purposes of standardization 
the / character might be a good choice.
Message Text
Following the separator character comes the message text.  Any 
characters allowed by LETextBox2 are allowed in the message 
text.  See "Special Characters" for additional functions of 
message text.  The total size of message text, after 
substitution of strings is limited to 1000 characters.
Button Strings
The first character after the message termination character is 
the beginning of the first button's title.  The title can then 
be followed with either another message termination character 
and button title, or a string termination character (zero) to 
end the alert string.  A total of three button titles may be 
included at the end of the alert string.  These buttons will be 
evenly spaced and centered at the bottom of the alert window.  
The width of each button will be the same size and be set 
according to the widest button title.    The total size of 
button text, after substitution of strings is limited to 80 
characters.
Termination of Alert String
After the last button title is a zero (0) to end the alert 
string.
Special Characters
The following special characters can be embedded in the message 
text and button strings of an alert.  In order to have a 
special character appear in the text of a button or message, 
enter it twice in the string. For example, if you want '^' to 
appear in an Alert message, you must enter it in the message 
string as '^^'.
^     If ^ is the first character in a button string the button 
will be considered the default button.  The default button is 
the the button selected if the user presses the return key on 
the keyboard.  This button will also appear bold on the screen.  
Only one button can be the default button.  After the ^ 
character the button title must follow as in  any other button. 
Other special characters may also appear after the '^'.  A 
single ^ character in message text has no affect and is deleted 
from the message.
#     Substitute standard string.  The # character must be 
followed by an ASCII decimal number.  Numbers 0-6 can be 
used . 7-9 are reserved and should not be used. The standard 
substitution strings are:
#0          OK
#1          Cancel
#2          Yes
#3          No
#4          Try Again
#5          Quit
#6          Continue
*     Substitute given string.  The * character followed by an 
ASCII decimal number from 0 through 9 denotes a substitution 
string to be inserted at that point.  The * character and the 
following number will be replaced by the corresponding string 
in the specified substitution array.  A pointer to the 
substitution array is passed to AlertWindow. The substitution 
array is defined as an array of LONG pointers where:
LONG[0]     Pointer to string that will substitute for *0.
LONG[1]     Pointer to string that will substitute for *1.
LONG[2]     Pointer to string that will substitute for *2.
LONG[3]     Pointer to string that will substitute for *3.
LONG[4]     Pointer to string that will substitute for *4.
LONG[5]     Pointer to string that will substitute for *5.
LONG[6]     Pointer to string that will substitute for *6.
LONG[7]     Pointer to string that will substitute for *7.
LONG[8]     Pointer to string that will substitute for *8.
LONG[9]     Pointer to string that will substitute for *9.
Substitution strings can be a C type, Pascal type, or RETURN 
terminated.  C type and RETURN terminated strings are selected 
by passing 0 to AlertWindow as the string flag.  Pascal strings 
are selected by passing 1.  
Elements do not need to be defined if they are not referenced 
in the alert.
Here are some examples of alert strings that can be passed to 
AlertWindow in APW 65816 assembler syntax.
                                                         

A more complex alert string:
                                                   
Window Records
The Window Record data structure has been redefined. The new 
definition is illustrated below.
                                                            

The wReserved field is a new data field reserved by Apple for 
future expansion.
The wFrame field is illustrated below. The shaded bits in the 
diagram are for use by window defProcs. The values named in the 
diagram are those used by the standard document window defProc. 
Unshaded bits are reserved by the Window Manager and are the 
same for all windows.
                                                     
Bug fixes:
GetFrameColor now works as documented.
SetDataSize was using incorrect minimum values. This has been 
fixed.
Some call the Window Manager made to application code did not 
work if the code was located at the first byte of a bank. For 
example, the window content-drawing routine would not work in 
this situation. This has been fixed.
Calling BringToFront and SelectWindow with an invisible window 
no longer erases the contents of windows under the invisible 
one.
The width of vertical lines in alert window frames has been 
changed. The vertical lines are now 2 pixels wide instead of 3, 
so that their dithered color will be the same as the content.
The manual's description of SetZoomRect is incorrect. The 
correct description is:
SetZoomRect sets the fZoomed bit of the window's wFrame record 
to zero. The RECT passed to SetZoomRect then becomes the 
window's zoom RECT. The window's size and position when 
SetZoomRect is called becomes the window's unzoomed size and 
position, regardless of what the unzoomed characteristics were 
before SetZoomRect was called.
The standard document window positioned the info bar one pixel 
too high when created without a title bar. This has been fixed.
Correction to the Toolbox Reference:
Apple IIgs Toolbox Reference page 25-126, third line:
      If wmTaskMask bit tmInfo (bit 15) = 1
should read:
      If wmTaskMask bit tmInfo (bit 15) = 0
GetFirstWindow returned a pointer to the first window's Window 
Record, and not to its grafPort as documented. This has been 
changed so that the call now behaves as documented.
The calls FromDesk, ToDesk, and SetDeskTop have been fixed so 
that they will now recompute the visRgn of every window.
When used with a window which does not have scroll bars, the 
call WindNewRes will call the window's defproc to recompute 
window regions. A call to SizeWindow is no longer necessary 
under these circumstances.
DragRect has been fixed so that when TaskMaster calls DragWindow 
(and thus, DragRect) in 640 mode, the x position will remain on 
the specified Grid.
The Window Manager had some problems displaying close-boxes and 
Titles, which have been fixed. Specifically, a long title 
sometimes conflicted with the close box when a window was 
resized to a narrow shape, and the close box was not correctly 
clipped by the menubar.

New Calls:

$580E GetWindowMgrGlobals     returns: LONG     parameters: 
none
Returns a pointer to the Window Manager global data 
area.
$5A0E StartFrameDrawing returns: none     parameters: 
                                          windowPtr: LONG
Sets up to draw a window frame. Should only be called 
by window definition procedures. Must be balanced by a 
call to EndFrameDrawing when drawing is completed.

$5B0E EndFrameDrawing   returns: none     parameters: none
Restores Window Manager variables after a call to 
StartFrameDrawing.

$5C0E ResizeWindow      returns: none     parameters:
                                    hiddenFlag: WORD
                                    rectPtr: LONG
                                    grafPortPtr: LONG
Moves, re-sizes, and draws the window specified by 
grafPortPtr. rectPtr is a pointer to the window's 
content region. hiddenFlag is a Boolean parameter. A 
TRUE value specifies that  portions of the window 
which are covered should not be drawn. If the value is 
FALSE, the entire content of the window is drawn.

$550E DrawInfoBar returns: none     parameters: 
                                    grafPortPtr: LONG
Redraws the info bar of the window specified by 
grafPortPtr. The method used to redraw the info bar 's 
interior is the routine specified by the wInfoDefProc 
field of the paramList passed to NewWindow when the 
window is created. The Window Manager will 
automatically clip info bar drawing to the dimensions 
of the info bar , and to the visible region of the 
window.
$590E AlertWindow returns: Word     parameters:
                                    stringType: Word
                                    subStrPtr:  Long
                                    alertStrPtr: Long
Creates an alert window which displays a message pointed to by 
alertStrPtr. The message can be either a C or Pascal string, as 
specified by stringType. A value of 0 signifies that the 
message is a C string, and a value of 1 that it is a Pascal 
string. subStrPtr points to an array of substitution strings 
for use with substitution characters. See the Window Manager 
section "Alert Windows" for a more detailed description of the 
use of Alert Windows.

Drivers
ImageWriter LQ Driver
      This is a new file in System Disk 3.2. It is not a special 
driver for the ImageWriter LQ, but simply allows the Apple IIgs 
to find the ImageWriter LQ on an Apple Talk network. It does 
not support the ImageWriter LQ's special features.
ImageWriter Driver v2.1
      The ImageWriter driver has been completely re-written. It 
contains faster imaging routines, determines more quickly when 
no image is to be printed, and will not clear buffers which 
have already been cleared. Low level routines have been 
modified, restructured, and eliminated. Low level routines that 
were undocumented have been removed.
The new driver incorporates faster imaging routines and faster 
determination of when no image is to be printed, and does not 
clear buffers which have already been cleared.
iVres now supports vertical condensed printing.
The procedure PrintCheck and its corresponding routines have 
been commented out. None of the code was being used, and it 
caused problems when printing to a spooler.PrintCheck sent a 
query on AppleTalk to determine the configuration to the 
ImageWriter it was printing to. The code then never made a PAP 
read to retrieve this information (whether  the printer had a 
color ribbon, the printer's ID, and so forth). A spooler would 
then wait for the imagewriter to do a PAP read so that it could 
do a PAP write of the information form the initial query.
Bug fixes:
320 mode landscape printing was imaging too high on the page, 
This has been fixed.
Insertion point and editing now work correctly in the job 
dialog's FROM LineEdit box.
The driver did not update choices selected in the style dialog 
and the print dialog due to internal version number 
inconsistencies. This has been fixed.
The printer intermittently skipped print lines when the 'Best 
Text' quality was selected. This has been fixed.
The portRect of the grafPort is now the page RECT.
Landscape mode with gaps between pages did not work correctly 
with version 2.0 of the driver. This has been fixed.
The driver startup routine now initializes the serial port. 
This fixes a problem in which the first control code was lost 
when printing in draft mode.
The driver now has added filtering for the c cedilla character 
in LLDText. This allows it to be printed in draft mode.
The driver formerly crashed if you attempted to print when the 
printer was off-line or the cable was disconnected. This has 
been fixed.
LaserWriter 
No prep file is necessary, making this driver compatible with 
all Macintosh LaserWriter drivers.
Insertion point and editing now work correctly in the job 
dialog's FROM LineEdit box.
Command-F (Open-Apple-F) redirects PostScript printing to a 
disk file. The resulting file contains the PostScript text for 
the redirected print job. The file will be named POSTSCRIPT.GS, 
and is created in the */SYSTEM/DRIVERS folder.The current 
version of the LaserWriter file can print LaserWriter Plus 
fonts, and supports downloading bitmap fonts. The driver now 
supports printing with the following LaserWriter Plus fonts:
Font IDs    (all values are decimal)
Zapf Dingbats           13
Bookman           14
Helvetica Narrow  15
Palatino          16
Zapf Chancery           18
Avant Garde       33
New Century Schoolbook  34
The LaserWriter driver can process the following PostScript 
picComments:
Name  Kind  Size  Handle
PostScriptBegin   190   0     NIL
PostScriptEnd     191   0     NIL
PostScriptHandle  192   -     PSData
PostScriptFile    193   -     FileName
TextIsPostScript  194   0     NIL
picComments allow a program to send PostScript commands 
directly to a LaserWriter. This ability gives applications 
access to the advanced capabilities of PostScript, and allows 
them to create needed effects without using more general 
QuickDraw II routines. A picComment must begin with 
PostScriptBegin and end with PostScriptEnd.
There are three different ways to send PostScript commands to a 
LaserWriter.
1)    The application may pass a PostScriptHandle to the 
LaserWriter. This handle identifies a buffer containing 
PostScript commands in the form of ASCII data.
2)    The application can pass a FileName, which points to 
the pathname of a file containing PostScript commands.
3)    The application can use the TextIsPostScript command 
to send PostScript in the form of QuickDraw StdText calls.
The size fields of the PostScriptHandle and PostScriptFile 
commands must contain the size of the data to be read.
picComments do not take the place of normal Print Manager 
calls. From the point of view of the Print Manager, a 
picComment is simply data sent to the printer, just like any 
other data. An application should make all the Print Manager 
calls normally whether it uses picComments or not.
A few rules for the use of PostScript picComments:
The LaserWriter driver does not check for PostScript errors, 
so the data sent to the LaserWriter must be correct. 
Always terminate PostScript text with a return character.
The transformation that the driver uses will flip text and 
print it upside down on the page. Applications should set up 
their own transformation matrices to serve their needs.
Never nest PostScript Begins and Ends.
Never use the LaserWriter's userdict. Instead, define a 
local dictionary for you application's use.
See chapter 3 of the LaserWriter Reference Manual for examples 
of how to use picComments.
The following PostScript commands can alter certain conditions 
that the driver sets up for the print job. Applications should 
therefore not use these calls:
exitserver
initgraphics
grestoreall
erasepage
showpage

Bug fixes:
The driver now consistently reports error conditions returned 
by the printer, such as 'out of paper', or 'font not found'.
Safeguards are now provided against pixel maps whose width is 
not on a byte boundary.
Printer Port Driver v1.1
Color selection escape code 5 caused problems with the 
ImageWriter I. This has been fixed.
Modem Port Driver v1.2
Some files could not be printed without initializing the 
printer. Code has been added to DevOpen to fix this problem.
Color selection escape code 5 caused problems with the 
ImageWriter I. This has been fixed.
AppleTalk Port Driver v2.0
The AppleTalk port driver now supports printing over zones.
DevPrChanged has been modified. It now just checks whether the 
AppleTalk Port has been selected in the Control Panel. If not, 
it displays an alert box with the message RAppleTalk is not 
selected in the Control PanelS.
DevStartup formerly accepted one parameter, which had to be a 
correctly formed network name for a printer on the AppleTalk 
network. The call now accepts three parameters:
% pointer to a printer name
% device name
% zone name
The call concatenates these names, leaving out any unnecessary 
characters at the end of each one, to form the correct network 
name.
Strings, printer names, device names, and zone names may now be 
up to 31 characters long.
The auxiliary file type of the AppleTalk Port driver has been 
changed from 2 to 3.
AppleTalk IWEM v1.2.1
The IWEM file has been reduced in size by removing comments and 
white space.
There was a bug which occurred in graphic printing in the 
ImageWriter Emulator .1.1.2 on LaserWriters with ROM versions 
3.0 or higher. This has been fixed.
Line wrapping has been added to allow for long strings of data.
The ESC-S command, which is the equivalent of an ESC-G command, 
did not generate graphics properly in IWEM v1.2. This has been 
fixed.
AppleMIDI (drivers) v1.0
This system disk includes MIDI device drivers for the MIDI Tool 
Set, the Apple MIDI Interface, and the Passport MIDI interface 
card (card6850.MIDI).

Utilities
Finder 1.1
Bug Fixes:
The Finder has been altered so that its handle remains fixed 
while another application is running. Formerly the Finder could 
be moved during memory compaction, causing crashes.
Program Launcher v2.2
Four new tools have been added to the  list of versions 
retrieved.
029   Audio Compression and Expansion tools (A.C.E.)
030   Reserved for future use
031   Reserved for future use
032   MIDI Tools
Start
Start will  not run the Finder unless it finds at least 375K of 
free memory.
System Utilities v3.1
Numerous bugs have been fixed.
AppleTalk Utilities
Chooser v1.2
A number of bugs have been fixed.
Namer v1.2
A number of bugs have been fixed.
Bug fixes:
The device type window and the names window no longer scroll 
simultaneously.

Keith Rollin                                               amdahl\
Developer Technical Support                           pyramid!sun !apple!keith
Apple Computer                                             decwrl/
"You can do what you want to me, but leave my computer alone!"