Apple IIgs System Software Release Notes Version 6.0.1 May 21, 1993 These release notes detail changes made from version 6.0 to 6.0.1 of the Apple IIgs System Software. Much of the material here is intended for programmers. For information affecting users, read the Whats.New and Shortcuts files on the SystemTools2 disk. This document does not describe new 6.0.1 toolbox and GS/OS features in detail. See the 6.0.1 addendum to Programmer's Reference For System 6.0. Sys.Resources Changes: Changed the rVersion resource ID=1 string to read "System Software" instead of "System" (this is important for the Finder's reorganized About box). Updated rErrorString resources to say "disk" instead of "volume." Fixed the standard window color table resource to have a white info bar fill color (the byte at offset 8 is now $F0 instead of $00). The Icon Button control now supports "sticky" icon controls. If bit 4 of the ctlFlag field is set and the mouse button is released when the cursor is inside the control, the control stays highlighted to show that it is "selected." The ctlValue field contains $0001 when the icon is in the selected state, and $0000 when it is not. An extra parameter, #12, has been added to the control template to allow for an initial value word for this type of control. Setting a thermometer control's value no longer draws anything if the control is invisible. The Launcher now zeros the BUSY flag (this makes Option-Open work in the Control Panels NDA). The Launcher sets the noResourceMgr bit in StartUpTools (to avoid a duplicate startup, which StartUpTools now checks for). ToolBox Changes: Window Manager v3.4 Tool014 Added a new call, UpdateWindow, to help redraw other people's windows safely. AlertWindow now uses UpdateWindow. DoModalWindow now uses UpdateWindow. If the mwUpdateAll bit is clear, it passes flags of $0000 for the dialog window, but $8000 (background update) for other windows--so the other windows update only if it's safe for them to background- update. If the mwUpdateAll bit is set, it always passes flags of $0000. It returns an error ($0E05, cantUpdateErr) for a background update of a System window, since System windows should always get updated from inside SystemEvent. Changed DoModalWindow so it doesn't invalidate controls on an activate if the window's fCtlTie bit is set, saying that the control states are independent of the window state. After DoModalWindow does an LECut, LEPaste, TECut, or TEPaste, it returns the ID of the control that was just edited. HandleDiskInsert duplicate-disk dialog now uses the Note alert icon instead of the 3.5" disk icon, since the dialog also appears for disks that look nothing like 3.5" floppies. HandleDiskInsert now treats error $51 (directory damaged) like error $5A (damaged bitmap); it puts up "This disk is damaged and can't be used. Eject/Initialize". Bits 31-24 of the updateProc to HandleDiskInsert are now honored even if the rest of the pointer is NIL. This way you can flag your window as not needing GS/OS for its update. HandleDiskInsert never replaces a window's existing wContDraw procedure, if it has one (we give it a wContDraw on the first call if it doesn't have one). Menu Manager v3.4 Tool015 In AllocateCache, we now clip the menu height to 200 for computing the size handle needed to save the screen. We were overflowing the computation for tall pop-up menus. See also TS3. When the pop-up control defproc handles a do_event message, now it only sends keyDown and autoKey events to MenuKey, not any old event. It also preserves the menu bar around the MenuKey call, so we don't accidentally leave the menu bar set to the pop-up menu control. DeleteMItem now properly shrinks the menu handle by twelve bytes (was ten). Not worth patching for ROM 3 (you get the bytes back when the menu goes away anyway). Pop-up proc uses DrawStringWidth to draw non-popped-up pop-up controls (it truncates long items in the middle). Control Manager v3.4 Tool016 Added four new calls: SetCtlValueByID, GetCtlValueByID, InvalOneCtlByID, and HiliteCtlByID. CtlStartUp removes the RefreshDesktop run queue routine, so the desktop doesn't refresh an extra time when starting an application in a different resolution from the one you used last (the scroll bars thought they had to redraw in 6.0, even though they really didn't). The Static Text control now supports a new ctlFlag bit. If bit $10, fSquishText, is set as well as fBlastText, the control will draw the text with DrawStringWidth to compress and truncate on the right. Replaced one GetSysPrefs call and two SetSysPrefs calls with two DoSysPrefs calls, which should significantly speed up every CMLoadResource call. (DoSysPrefs has lower overhead; it does not call GS/OS internally.) QuickDraw II Auxiliary v3.5 Tool018 Added three new calls: DrawStringWidth, UseColorTable, and RestoreColorTable. DrawStringWidth draws a string to fit in a specified horizontal width, compressing and/or truncating the string as necessary. The string can be Pascal, C, or GS/OS, and you can reference it by pointer, handle, or resource. The truncation is an ellipsis on the left, on the right, in the center, or no truncation. Compression is optional. UseColorTable preserves SCBs and sets them to use a color table you specify. It also preserves the old contents of that color table and sets the color table to the data you specify, or to a standard color table. UseColorTable returns a handle that you later pass to RestoreColorTable to put things back how they were. Generally, you will call UseColorTable on an activate event and RestoreColorTable on a deactivate event. Added several new icons to GetSysIcon: text ($04), source file ($B0), Applesoft BASIC program ($FC), archive ($E0), and binary file ($06). GetSysIcon now calls SendRequest with a new request code, systemSaysGetSysIcon, to allow utilities and applications to provide a replacement icon. Print Manager v3.2 Tool019 Fixed bad-parameter error code from PMLoadDriver & PMUnloadDriver to be $1309, as documented (was returning $1308 before). Line Edit v3.4 Tool020 Added a new call, LEClassifyKey, which classifies a keystroke as some combination of digit, letter, hex digit, editing key, and non-control-character. Added a new field to the Edit Line control template. Parameter number 9 is a word called keyMask. The control accepts keys only if the LEClassifyKey result has some bits set in common with the keyMask parameter. Changed interpretation of the Edit Line template pwChar field: A value of $FFFF now means the control is not for password entry. (Previously, the legal values were $0000 [default password character] and $0001 through $00FF [specific password character]. The parameter's presence implied that the control was for password entry, which is no good with the new optional ninth parameter.) Made LESetText erase the gap between the destination and view rectangles at the left edge of a scrolled field. Dialog Manager v3.5 Tool021 Fixed a bug that caused a crash if you made a SetDAFont to the FastFont handle (returned by GetSysFont), and then caused the Dialog Manager to beep. (This affected ROM 1 systems only.) Scrap Manager v3.2 Tool022 Added one new call, ShowClipboard, which creates a System window that takes care of the clipboard display for you (it's used in Finder and Teach, for example). It displays Text, Picture, and Sound scraps. If you copy a Sound to the clipboard (using the Sound control panel, for example), you can click on the Speaker icon on the clipboard to hear the sound. It also calls SendRequest with a new request code, systemSaysDoClipboard, to allow utilities and applications to customize or extend the clipboard display. PutScrap now changes the scrap count, as returned by GetScrapCount (for polling to see if the clipboard contents changed). Standard File v3.4 Tool023 Uses DrawStringWidth to draw standard items (allows compression and truncates on the right with an ellipsis). Added three new key equivalents. Command-Shift-UpArrow is the same as a Command-D or a clicking the Disks button. Command-RightArrow is the same as Command-Tab; it moves forward to the next drive in the list. Command-LeftArrow moves backward to the previous drive in the list. SFReScan now makes a DInfo and Volume call on the volume in prefix 8 and updates all of the controls accordingly. SFReScan now works in the volumes list as well as the files list. Fixed a hanging problem on SFGetFile (not SFGetFile2) when prefix zero was empty. Fixed a bug when closing the dialog where if the prompt string was a resource, it was being treated like a handle. Standard File windows now update behind modal windows and try to update back windows using UpdateWindow. Changed the way Standard File handles multiple edit line items in PutFile dialogs, so that there can be more than just the single edit line item. Fixed a bug in the check that was trying to restrict the promptRefDesc to values 0-2 but wasn't returning an error if it was out of range. It now returns badPromptDesc ($1701) as documented. Now passes a real auxiliary type to GetSysIcon (was always passing zero in 6.0). Volume name comparison in NextDrive routine is now insensitive to case, so if your prefix doesn't match the actual case of your disk, Command-Tab now takes you to the next disk instead of staying at the same one (but fixing the prefix). Simplified no-volumes message to read "No disks are available. Please insert a disk." Changed "volume" to "disk" in several messages. Now shows "zero K" instead of "0K" in space-on-disk messages (the guts of this change are in Long2Dec in Integer Math). Font Manager v3.4 Tool027 Expanded the size list in ChooseFont to 96 members. Added code to strip out duplicate sizes from the size list in ChooseFont. Duplicates of the same size would show up if two or more real fonts in the same family had the same size (but different styles). List Manager v3.4 Tool028 CompareStrings flag bit 15 now makes it compare GS/OS strings instead of Pascal strings. ListKey takes Clear and Delete to mean "zap the prefix" (just like waiting 2/3 of a second before typing). Fixed a bug affecting ListKey, CompareStrings, and SortList/SortList2 with compareProc of 1. Characters $20 to $3F (including digits), and $60 were being accidentally "uppercased." For example, in 6.0 "5" would map into right- arrow, which moved down one item. The standard item-draw procedure uses DrawStringWidth, with flags allowing horizontal compression and truncation on the right with an ellipsis. Text Edit v1.4 Tool034 TEPaintText now properly fully-justifies text. Fixed a problem with non-targetable Text Edit controls. They could start out active (with a usable scroll bar for example), and then become inactive when the window became inactive, but the control would not get reactivated when the window came back to the front. FMStatus call now pushes pre-zeroed result space, in case Font Manager is not loaded (the result is that you get an error reliably now, instead of just sometimes, if the Font Manager isn't available). Resource Manager v1.3 Resource.Mgr Added two new calls: OpenResourceFileByID and CompactResourceFile. OpenResourceFileByID starts the Resource Manager for you if it isn't already started under your ID (and it makes you the current resource application if it was already started for your ID). Then it uses LGetPathname2 to find pathname for the specified ID and calls OpenResourceFile for you on that file. Returns errors from LGetPathname2 and OpenResourceFile. oldResApp is valid even if you get an error. CompactResourceFile removes all free blocks (except the last special EOF free block) from a given file by moving chunks around in the file. Added some error checking code to OpenResourceFile that absolutely makes sure that the map was entirely read; if what is read doesn't equal what we asked for, it returns a GS/OS eofEncountered error. Added a new bit to mapFlag. Bit 0 is now defined as fileReadWrite. When a file is opened, it gets set to 1 if the file is opened read/write. If it's opened with read-only access, then the bit is set to 0. This bit is for examination only. AddResource, RemoveResource, WriteResource, and MarkResourceChange now verify that the target file can be written to before actually doing anything. They all return a GS/OS invalidAccess error if the file cannot be written to. The exception to this is MarkResourceChange when the resource in question is being marked unchanged; it is allowed as it won't eventually cause a write. Fixed WriteResource to write the size of the resource as it appears on disk, rather than the size of the resource's handle in memory. This properly allows for converters to write resources that are smaller than their in-memory size without destroying the file. CloseResourceFile returns error resFileNotFound ($1E07) instead of no error, on a nonzero argument that doesn't match an open file ID. Fixed string-comparison bug in RMFindNamedResource (and RMLoadNamedResource, which calls RMFindNamedResource). Sometimes in 6.0 you could wind up loading a resource whose name began with the name you asked for but was longer. TOOL.SETUP Tool.Setup contains patches that are needed for both ROM 1 and ROM 3. Tool Locator Optimized SendRequest (25% speed improvement in some cases). Optimized AcceptRequests and GetMsgHandle, too. StartUpTools now returns any error from ResourceStartUp. When we would have returned garbage for the result, we return NIL. StartUpTools and LoadTools now skip the message "This application needs ToolXXX" for tools that are present but too old (like ROM-based tools!). They still return an error code to the caller. ShutDownTools checks for a NIL input and behaves sanely. ResourceShutDown is now in the error-exit path, so it shuts down the Resource Manager even if you get some other error. ShutDownTools tolerates errors from SFShutDown (for compatibility with errant NDAs that shut down Standard File during Desk Shutdown even if they did not start it). ShutDownTools no longer calls HideCursor if QuickDraw is not active (in 6.0, it can crash if an application calls ShutDownTools with QD inactive). If the new-for-6.0 "no resource manager" flag bit is set, there is no problem (it was already skipping the HideCursor then). Misc Tools Added two new calls: DoSysPrefs and AlertMessage. DoSysPrefs clears and sets the specified bits in the GS/OS system preferences word, and then returns the previous value (error $0301 if GS/OS is not the current OS). AlertMessage provides access to code inside GS/OS that is smart enough to put an alert on either the text screen or the Super Hi-Res screen, depending on the environment. SysBeep2 now sends a new SendRequest code, systemSaysForceUndim, for all codes except $006x (screen blanking, screen unblanking). ShowBootInfo now "wraps up" to a new row if you have more than one row of icons. If you wrap off the top of the screen, it starts over at the bottom left, without erasing the screen. (It used to keep recycling the bottom row, wiping it to periwinkle blue every time it filled up.) Desk Manager Setting bit 31 of an action procedure pointer (for NDA or system window) does stack-based dispatch. function MyActionProc(code: integer; data: longint): integer; CDA menu checks ROM version before using ReadKeyMicroMemory to check for the control-panel-disable jumper. Was misbehaving on upgraded IIe ROM 1 machines. ROM 01 Patch TS2 If Battery RAM byte $59 bit 7 is set, TS2 installs Memory Peeker and Visit Monitor (just like ROM 3 does). Event Manager EMStartUp uses (26,17) (or (13,17) in 320 mode) for the initial mouse position if there is no message #6 specifying a position. This prevents top-left screen dimmers from dimming right away. Integer Math Int2Dec and Long2Dec return "zero " if the number being converted is zero, bit 31 of stringPtr is set, and the buffer length is at least 5. ROM 03 Patch TS3 Desk Manager DeskShutDown zaps $07FC if slot 4 is internal. This stops the mouse from freezing in desktop applications after visiting the CDA menu, when you have previously run an application that left a nonzero value in $07FC. This was a problem on ROM 3 systems only. OpenNDA sends reOpenAction to action routine of an already- open NDA, to give the NDA a chance to do something other than just have the window come to the front. Integer Math Int2Dec and Long2Dec return "zero " if bit 31 of stringPtr is set and the buffer length is at least 5. Patched Multiply to fix Menu Manager bug: AllocateCache was multiplying the bytes-per-line by the menu height, without clipping the height to 200 (screen height), as it does when it really uses the memory it allocates. Misc Tools SysFailMgr now provides useful default messages for common errors: $27: "Could not read or write disk. The disk may be damaged." $201: "Out of memory (or required memory area was already in use)." $308, $681, $682: "Detected trashed memory. Software bug or (less likely) bad RAM." SANE Fixed a problem in the ElemNum call FXPWRI where the source integer exponent was never being classified (whether it was zero, normalized, etc.), but we were still checking Src_Class to see if we should proceed. This could make really strange things happen in some applications. (For example, the AppleWorks GS spreadsheet could get stuck in an infinite loop if certain values were left over in bank zero.) Scrap Manager So that we can use the disk-based scrap later, undo what the ROM-based ScrapBootInit did before GS/OS was available (dispose all $4201 memory and set the Scrap Manager's WAP to NIL). Window Manager Fixed TaskMaster to handle the tmNoGetNextEvent bit correctly (it was treating the bit as reserved). This bit has existed since 5.0.3, but until now it worked only on ROM 1. Fixed a HandToHand call in WindStartUp which was copying data from a small handle to a big handle, using the size of the big handle (this was not harmful, but it was unclean). AppleTalk Port Driver v3.2 Reworked significant pieces of the driver to try much harder to establish a connection without error, and to write data to the PAP connection successfully. Also made PAPStatus try harder to get a response. Changed PrDevOpen to wait forever for the PAPOpen to complete, or until the user hits Command-Period. It always retries on $0808 error (server too busy to respond). Retries ten times on $0805 error (name not found). Changed PrDevWrite to wait forever for the PAPWrite to complete, or until the user hits Command-Period. Removed some completely unused code (driver is now 6 blocks on disk instead of 8). Changed the algorithm used to determine if AppleTalk is running. It used to check to see if a slot was set to "AppleTalk". It now checks for the presence of the AppleTalk main driver (which is the supported way anyway). LaserWriter Printer Driver v3.3 The driver appears to work with the LaserWriter Pro 600 and 630, but this combination has not been fully tested. Changed PostScript definition of /spf (the spotting function) to get it defined correctly on level 2 printers, using a hard-coded default spot function for when the dictionary isn't of HalfToneType 1. When we bypass the code that sets up the name tables and sends queries to the printer (because we're creating a PS file), we now explicitly set the LWType variable to 1, indicating a LaserWriter Plus or II. Now the code can find all the standard 35N fonts in the built-in name tables, instead of just the four faces used in LaserWriters plus Sonata, Carta and Shaston. This means you can now dump PostScript files that work correctly with the 35N fonts. (The "35N" fonts are included in the LaserWriter II and later.) Changed drawing of job dialog to include a call to PrGetNetworkName so we can draw the chosen printer's name in the job dialog. If there is no network printer (PrGetNetworkName returns NIL), it draws "No network - not supported". Added 3 lines in CkPrinterStatus to avoid a possible infinite loop. If our session timed out we start getting error $0806 from ReadLaser, but we didn't care. When printing to a PostScript file, there may be no user name. If PMGetUserName returns NIL, we now cleanly don't put a user name into the file. It used to insert garbage from $00/0000 in the file. IWEm 1.6 The test for the Personal LaserWriter NT (in order to fix the smaller imaging area) now checks that the product name contains the string "Personal", so it will also match the Personal LaserWriter NTR. GS/OS Changes: ProDOS (The Boot Stub, not ProDOS 8) If the user hits the "8" key before we run, then we load and run System/P8 instead of System/Start.GS.OS. Added code to compensate for a ROM 3 bug where the RAM5 RAM disk does not get created if you have 8 Megs of RAM. The ProDOS file now creates it for you and restarts the system (even if you hit "8" to boot into ProDOS 8). This means you get an extra beep on boot IF you have an 8 Meg ROM 3 and a nonzero RAM5 size. GS/OS (composed of the files GS.OS, GS.OS.Dev, and Start.GS.OS): SCM Added code to put a $4C at $BF00 at the beginning of every GS/OS call, so the Vulcan without a loaded driver will be happy. Two changes in the interrupt dispatcher: * Returns CLC if and only if at least one interrupt handler claimed the interrupt (was previously clearing carry when the LAST handler claimed it). * Restores MSLOT after dispatching to an IRQ.OTHER handler. OSShutDown was accidentally skipping the DeskShutDown call if flag bit 2 was clear. Changed SysBeep2 call in s_mount_msg to clean up stack on error (in case Tool.Setup isn't loaded yet). Was causing incoherent "yes/no/cancel" text dialogs during boot, if it tries to ask for the boot disk before Tool.Setup time. Restart no longer changes memory at $0300. GS/OS sends systemSaysForceUndim before deciding whether to put a message on the text screen or the Super Hi-Res screen. GLoader/GQuit After you press a key to continue (from "pause mode"), it erases the message so you know something happened. On a switch to ProDOS 8, instead of zeroing UNIT ($43), we store a $50 there. Zero was doing horrible things when left in DEVNUM and later fed to ON_LINE (returns much more data than expected). This was only left at zero in the somewhat strange case that you network-booted into GS/OS, and then switched to P8 but have so many devices online that your boot volume wasn't in DEVLST. Device Dispatcher Implemented a new driver characteristics bit to let us add new subcalls to DStatus and DControl. Drivers have always been required to validate all call requests that are sent to them, and return an error if they do not support the call. This includes the main driver commands as well as all subcalls. Unfortunately, some driver authors didn't feel that the guidelines needed to be followed, and they do random things if given a call they don't know about (some also crash). If this bit ($0010) is set in a device's characteristics word, the driver indicates that it properly follows the driver guidelines in the GS/OS reference and Device Driver reference. If this bit is not set, drivers will never receive a call that is not documented in the GS/OS reference (except device-specific calls, which are always passed on to the drivers). Initialization Manager Fixed a problem where supplying a non-editable volume name for the Format or EraseDisk calls, and the name was not syntactically acceptable to the chosen FST, the system went to the GS/OS version of system death. Limited the supplied volume name to 32 characters to ensure that the 36-byte buffers used internally are not overflowed. Changed the default disk name from Untitled to untitled. System Loader Filetypes $0030 to $003F (all auxiliary types) are now allowed for load files. Filetype/auxiliary type combinations must be assigned by Developer Technical Support, as usual. System Error Messages Added error message #66: "The selected AppleTalk connection could not be found. Be sure it is installed and the slot settings in the Control Panel are correct." Added error message #67: "A driver for the selected AppleTalk connection could not be found. Be sure it is installed and then restart." Added error message #68 for the RAM5 driver (used on ROM 1 if the minimum and maximum sizes are different). In Error.Msg, changed "volumes" to "disks" in the message "ProDOS 8 applications can only be launched from ProDOS and AppleShare disks." SCC Manager Added more error checking and two new error messages in case the AppleTalk hardware couldn't be found, or no drivers were loaded. SCSI HD Driver Added support for the new Apple-defined DStatus subcall. Call $4000, GetSCSITargetPriority, returns a word indicating the SCSI ID of a given GS/OS SCSI device. SCSI CD Driver: Added support for the new Apple-defined DStatus subcall. Call $4000, GetSCSITargetPriority, returns a word indicating the SCSI ID of a given GS/OS SCSI device. Changed default command bitmap to match the Apple CD-300, which does not return a command bitmap in the Inquiry call. Compatibility with Apple CD 300 * With the 6.0.1 SCSI CD Driver, you can read data, but you can't play audio tracks, and you can't take advantage of the drive's ability to read audio tracks as data. * With the 6.0 SCSI CD Driver, you can read data if and only if a CD was online when you booted. You can't play audio tracks. * Under P8, the Apple CD 300 works just as well as the previous models, for data. Playing audio tracks is not supported. SCSI Tape Driver Added support for the new Apple-defined DStatus subcall. Call $4000, GetSCSITargetPriority, returns a word indicating the SCSI ID of a given GS/OS SCSI device. SCSI Scanner Driver Added support for the new Apple-defined DStatus subcall. Call $4000, GetSCSITargetPriority, returns a word indicating the SCSI ID of a given GS/OS SCSI device. Console Driver Fixed reset_trap to store the correct addresses in the fast- I/O vectors; they don't work in 6.0. AppleDisk 3.5 Driver Changed the SuperDrive case of DStatus(get_format_options) to behave better. Now it returns as much data as it can and returns a real transfer count. It used to return a transfer count of zero (and return no data) if the user's buffer was not big enough. Driver no longer puts 'A', 'B', ... over the last character of its device names during a warm start. So now you can rename your 3.5 devices and not get the names mutilated on return from P8. AppleDisk 5.25 Driver During startup we now clear the internal/external slot number in our DIBs as we scan each slot. On return from ProDOS 8, the driver was looking for the Disk II card's ID bytes at the wrong address, like $CE00 instead of $C600. There was no problem for the internal Disk Port, only for Disk II cards. The drives did not show up in GS/OS after visiting ProDOS 8. Removed driver startup time check for drive being present. For some people, it was deciding they had no drive when they actually did. RAM5 Driver: New for 6.0.1. Replaces the generated driver and is much faster. On ROM 1, Minimum and Maximum RAM disk sizes must be set to the same value. If the RAM disk has never been formatted, we now create an empty ProDOS directory, like the ROM does. On startup, if RAM5 is an empty Pascal volume, we reformat it as an empty ProDOS volume. This covers a semi-obscure case where you have no 3.5 drives on the SmartPort, but the startup process scans past slot 5, touching the RAM disk before a ProDOS-like environment is set up and fooling it into formatting itself as Pascal. If you have a nonempty Pascal RAM5, we leave it alone. A2.RAMCard (aka Slinky) Driver Added format options so if you have 1024K on your card you can choose between 800K and 1024K. Formatting your RAM card card to 800K means you can do block copies between 800K floppies and the RAM card (block copies are generally faster than file-by-file copies). AppleShare FST The 10-second volume change timer completion routine calls the GS/OS system service vector os_event. However, this really isn't legal since we're in an interrupt environment and GS/OS may have been what we just interrupted. Since os_event modifies a few variables on the GS/OS direct page, we now save and restore them around the service call. This should fix random $4x errors during intensive file manipulations. If we get a network error back from our SPWrite handler, it now loads the protocol error word from its parameter block, rather than the SPCommand one. Fixed an icky little bug in our panic completion routine. It was incrementing its panic counter without setting its data bank. This caused a semi-random byte in bank $E1 to be incremented by one each time the panic timer completed. This also meant that our quarter-second interrupt handler never knew when one or more of our volumes were in danger of being lost due to missing tickle packets from the server. Shortcut the QDStatus and GetWAP calls to save doing one or two toolbox calls on every call to the FST. If the arrows get drawn on the Super Hi-Res screen, they get UNdrawn there, even if a screen dimmer kicked in & displayed the text screen. (If the SHR screen is off and non-linear, it doesn't touch the SHR screen.) Fixed volume-changed notification to pass correct device number instead of garbage. Now we send volume-changed notifications even if there are no folders open on a volume. Changed JudgeName syntax string to read "Disk names..." instead of "Volume names...." DOS 3.3 FST Ignores zero-length filename entries (GetDirEntry does not count them and does not return them). Internally, the FST treats a filename field of all blanks (30 $A0 bytes) just like a deleted catalog entry. Added an entry to the end of fcr_to_pblk so that Open will stop when pcount is 15 instead of trashing a variable amount of memory past the end of the parameter block. FST name (visible in Finder, etc.) is "Apple II DOS 3.3" instead of just "DOS 3.3". No change in file name. Changed Open, GetFileInfo, and GetDirEntry to return zero for resourceEOF and resourceBlocks fields for non-extended files (when the fields are present). These values were previously undefined, and this was confusing the Finder. HFS FST Added a STZ newline_flag to fix bug where Write stops prematurely after transferring 512 bytes, if the most recent Read call stopped because it hit a newline character. Changed JudgeName string to say "Disk names..." instead of "Volume names...." Optimized much of the computation-intensive code in the FST. Namely, the B-tree register push/pop routines which use the pseudo stack are much faster, and the multiply and divide routines handle common cases more quickly. An unaccelerated GS with fast hard disks should do large folder copies between HFS volumes in the Finder about 18.4% faster. Other configurations will have less of an improvement. Pascal FST Now recognizes RAM disks (device_id $000E). HS.FST (High Sierra FST) FSTSpecific map_enable and set_map_table now post volume- changed notifications for all of our online volumes (High Sierra and ISO 9660). Changed volume control records to have a Memory Manager handle to the path table, so we can allow path tables larger than 8K (the GS/OS Memory Manager limit). MS-DOS FST: New for 6.0.1. The MS-DOS FST is a read-only implementation, similar to the existing DOS 3.3, Pascal, and High Sierra FSTs. Added support for resource forks as defined and implemented by the Macintosh PC Exchange Control Panel. This is done by placing the resource fork of a given file into a normal MS- DOS file of the same name as the original file in a subdirectory named "RESOURCE.FRK" at the same directory level as the original file. The "RESOURCE.FRK" subdirectory will never appear to an application during a directory search on the GS, though it will appear normally on an MS-DOS platform. The calls affected are Open, GetFileInfo, and GetDirEntry. ProDOS FST Fixed a bug in slow_read that made multiple-character newline mode unreliable. Each time it moved to a new block of data it was forgetting about one more character off the end of the newline list. ProDOS 8 Version 2.0.3 Updated the Thunderclock year table for 1993-1998. When we don't have a 65C02, instead of saying "relocation / configuration error" we put a message below the P8 version line so it looks like this: Apple II ProDOS 8 V2.0.3 06-May-93 REQUIRES ENHANCED APPLE IIE OR LATER Apple II Plus users will not be able to read the lowercase, but they can read the REQUIRES part. Removed the message "** Unable to find a ".System" file **". We always use the Quit code if there is no .System file. The old check was flawed anyway--it was invalid after running the ATINIT file. Changed copyright message at $BF40 to start with a $00, to prevent applications from crashing when they remove the /RAM volume and the device table is full. Changed NMI vector to be initialized to be BRK, $40, $00 rather than JMP $FF59. Removed slot 3 drive 2 from the SmartPort remapping table, so the /RAM disk can never be overwritten by a remapped device. (It was already the last resort.) Clock.Patch (new on SystemTools2) Supports patching ProDOS 8 2.0.3, just like 2.0, 2.0.1, 2.0.2. Uses 0 for 2000, not 100 (fixed off-by-one error in line 1560). Applications, Utilities, Other: Control Panels AppleShare Control Panel v2.1 Added range check on tracking checkboxes next to items in the volume list. If there were fewer than 4 volumes listed, we were tracking checkboxes that were not there. Now forces an arrow cursor on closing the Connect As dialog (you could be left with an I-Beam in 6.0). DC Printer Control Panel Note that starting with System Software 6.0, DC Printer lets you choose LaserWriter, which is potentially useful for "printing" to PostScript files. Apple tests and supports the LaserWriter driver using AppleTalk only. If you can get useful results with other configurations, that's great, but you're on your own. Monitor Control Panel v1.2 Rewrote the control panel in assembly. Made window wider and realigned the pop-up menus. Added "Smoother Mouse Cursor" checkbox that sets Battery RAM location $5F bit 2. It kills the cursor flicker that is especially noticeable with a Video Overlay card or an accelerator. This Battery RAM bit has been present since 6.0, but there was no Apple-supplied human interface to set it. Namer Control Panel v1.1 Made window 80 pixels wider. Changed the Help text slightly. Removed custom listDraw routine, since the standard one now uses DrawStringWidth. Set bit 30 to ModalDialog for I-beam cursor. Fixed Rename Printer... button to have a valid key equivalent (Command-R). NetPrinter Control Panel v1.1 Made window 80 pixels wider (it's like AppleShare now). The Printer pop-up now has a pop-down triangle. No longer uses a custom listDraw routine (the standard list draw proc now uses DrawStringWidth). Removed some dead data (left over from when Namer was not a separate control panel). Typing a colon or slash in the printer name gives SysBeep2(sbBadKeypress) instead of just SysBeep. Changed completion routine to properly jump to the completion routine return address (returned by the GetInfo call) rather than assume it can just RTL. Network Control Panel v1.1 Added keyboard equivalents: "P" for ProDOS, "G" for GS/OS. RAMDisk Control Panel v1.2 Rewrote the help text, mainly to mention that the "Resize after reset" checkbox is only on ROM 3. SetStart Control Panel v1.1 New checkbox: "Show icons during startup" (provides a human interface to the Battery RAM bit that disables the ShowBootInfo icons...the bit has been there since 6.0). New checkbox: "Enable programmer CDAs" (does not show up if ROM 3 Control Panel disable jumper is present). Provides a human interface to the Battery RAM bit that asks for Visit Monitor and Memory Peeker to show up in the CDA menu. ROM 3 checks this bit, and 6.0.1 checks it during boot for ROM 1 machines. Added a pop-down triangle in the menu. Edited some error messages. Edited the help to say "This control panel lets you choose what application will start up automatically when you start (boot) your Apple IIgs. The checkboxes let you control whether icons appear while the computer is starting up, and whether Classic Desk Accessories such as Visit Monitor and Memory Peeker appear." Sound Control Panel v2.1 Added a new request code, srqConvertRelPitch, to convert a relPitch value into a freqOffset. Sound control panel no longer gets confused on a redundant startup (like if somebody installs a second copy of the Control Panels NDA, giving us a second BootCDEV message). The Shutdown notify proc now checks a flag properly, so sounds don't get cut off when the system shuts down (in 6.0 they get cut off sometimes, because it accidentally loads the flag value from bank zero instead of the bank the Sound CP permanent code is in). NDAs and Inits: Control Panels NDA v2.1 Command-Shift-Esc works while the Control Panels window or a control panel window is in front (with and without Option). -- That is, you can use Command-Shift-Esc to bring the main window to the front even if a control panel is already in front, and you can use Option-Command-Shift-Esc to open (or bring to front) the CDevs Finder window when the main window or any control panel window is in front. Uses new calls OpenResourceFileByID and InvalOneCtlByID to save a few bytes and exercise the new calls. Now accepts reOpenAction. If Option is down when you open the CP & it's already open, now it opens the CDevs window instead of bringing the NDA window forward. When overwriting an existing CDev.Data file, the Control Panels NDA now makes sure to unlock it first. The old Control Panel created the file with no Write access, so we were failing to overwrite it (added one SetFileInfoGS call). When trying to open CDev.Data for writing, if we got an error we were doing a Close with a stale reference number. Fixed. Added WhooshRect to the main window opening and closing. Fixed a bug that would trash some memory if there were NO active control panels available in the CDevs folder. Moved the code that handles color table switching into the new QuickDraw II Auxiliary calls UseColorTable and RestoreColorTable. Made the color tables not be schizophrenic when you switch between control panel windows in an application using nonstandard colors. Now checks daylight savings stuff whenever the user closes a control panel. This makes the right thing happen sooner if you turn on the Auto Daylight Savings checkbox in the Time control panel. When calling HiliteMenu to highlight or unhighlight the Apple menu, passes flag values of $8001 and $8000 instead of 1 and 0. This makes the highlighting work right even for a text- based Apple character with a weird color table. Fixed cpOpenCDev request to work reliably. In 6.0, it did not always work. (The handling of finderSaysBeforeOpen has always worked fine.) EasyMount v1.1 Loads even if an AppleTalk network is not available, since it's useful locally now. Added support for folders and applications, and for local disks. Yes, you can make an alias for lots of things now! (You can't make aliases to documents, or aliases to aliases, and you can't do anything helpful with an alias other than open it...like drag things onto it.) Menu item now reads "Make Alias..." and has the keyboard equivalent Command-M. On handling a redundant finderSaysGoodbye call, EasyMount does nothing (as required in the 6.0 documentation). We now accept the srqGoAway request (in case somebody wants to remove or replace us on the fly, with IR or a similar utility). Added the message "You can make aliases for disks, folders, and applications only." Fixed srvNameBuff and zoneNameBuf to be large enough to hold 31-character GS/OS strings, so we can now deal with the longest server and zone names. We now use UseColorTable/RestoreColorTable in QuickDraw II Auxiliary when displaying the password dialog. It swaps in the 640-mode colors so the icon always looks correct. EasyMount now works correctly in 320 mode. The dialog was redesigned a bit so it works equally well in both modes. Made srqMountServer work properly with the new 1.1 file format that includes the alias pathname at the end. Crunched code a little by using the new calls OpenResourceFileByID, HiliteCtlByID, and SetCtlValueByID. Changed many error messages for clarity and consistency. Find File NDA v1.1 Command-F opens Find File, if the application doesn't use the Command-F for a menu item. (Find File installs a request procedure and watches for systemSaysMenuKey.) Excellently improved responsiveness by giving up control when EventAvail shows there is a keypress or mouse click waiting to be processed. Passes a real auxiliary type to GetSysIcon (was always passing zero, so request procedures were unable to give different icons for files with the same file type but different auxiliary types). Fixed intermittent $0201 error on going to P8 after clicking on a found file. It wasn't disposing the $53xx memory for the bottom list, and sometimes it would wind up in special memory. Removed code that truncates disk names for the pop-up menu, since the menu manager takes care of it now. Removed leading colons from volume names in the pop-up. Uses the new Control Manager call GetCtlValueByID. Calculator NDA v1.1 Disables the Undo item when the window is active. Media Control NDA Changed version from 1.3a0 to 1.3. VideoMix NDA Changed version from 1.3a0 to 1.3. Finder 6.0.1 User-Level Finder Changes Changed the About box title and menu item to "About This Apple IIgs". Removed Finder version and engineer names. (You can Get Info on Finder to see the version, which should always match the System version anyway.) Keyboard Navigation implemented. See Finder Help under "Selecting & Coloring Icons." When you click on an icon, it starts renaming it only if you click on the *name*, not if you click on the icon part. (Terribly handy for keyboard navigation.) Removed "File Copy Alternatives" dialog. Option-dragging a file to another location on the same disk now forces a copy rather than a move. You can now click in the Name, Size, Kind, or Last Modified text in the info bar of a list-view window to change the view. Icon Info Calculate button has key equivalent of Command-K. You can use Command-period to stop the calculation. Added the display of SCSI IDs on the "Where" card of Icon Info windows. If the device that the window comes from supports DStatus subcall $4000 (GetSCSITargetPriority), then the ID will be displayed after the device name. Dragging control panels, desk accessories, drivers, Finder extensions, fonts, file system translators, sound files, initialization files, and tools onto the System folder icon on the boot disk now does "magic routing" after telling the user. (Font files get special treatment only if bit 15 of their auxtype is clear, so that DTS can make font filetype assignments for files that do not belong in the Fonts folder.) The rubber-band icon selection now actively highlights and unhighlights icons, instead of waiting until you release the mouse button. Fixed rename with an Icon Info window open on the target file to work for regular files. In 6.0 it only redrew the Icon Info name for devices and folders. We now dynamically resize the long product name static text control rectangle on Icon Info cards to account for the existence of the "Inactive" check box. We also set the new control flag bit of the same control to use DrawStringWidth to truncate and compact to fit the area. When running the Finder from an AppleShare file server, the Finder now properly draws the server volume name in the writing a bundle status dialog if the @:Desktop file is being written to. It used to always be blank. Fixed a bug in the info card recalculation code. If you had any Icon Info windows open when you emptied the trash, the sizes of files would be updated to match the disk that they came from. Now only disk Icon Info windows get updated when the trash is emptied. Command-Option-O (tunnel open) no longer closes your current window if there was nothing to open. Changed window-closing code so it always selects the icon the window closes into. In 6.0 it selected the icon only if there would be no other selection, which was confusing. New untitled folders now have lowercase names (like untitled.a). Changing the Hide Invisible Files preference updates all windows, not just the front one (it was trying to update them all, but it was getting confused after the first one). Creates Trash icon and window even if device #1 fails to mount (you could crash Finder 6.0 by booting from floppy, moving the floppy to some other drive, re-entering the Finder with the boot device empty, and then trying to leave the Finder). Re-fixed the "trash icon turns into the icon you dragged into it" bug that was allegedly fixed in 6.0. It was *almost* fixed in 6.0. Changed the "need an FType file" message to say "...the Icons folder on your startup disk" instead of "the *:Icons folder." About box numbers now read "zero" when they would be "0", as in "0K". For example, boot with Inits/DAs off & see "zero K" for DAs. Kind strings in list views now get compressed if necessary (the Finder draws them with DrawStringWidth instead of DrawString). Files with HFS file type 'APPL' now show up with kind string "Macintosh application". Inactive files no longer "miss" their specific Kind string & get the generic-filetype kind. (When mapping a filetype/auxtype to a kind string, if the match is an any- auxtype entry that can be Inactive, and bit 15 of the auxtype is in fact set, the Finder repeats the search with bit 15 cleared, getting a kind string that is at least as descriptive.) Added oneDocs in the Finder's resource fork for various Driver auxiliary types, which now show up as Kinds: GS/OS Device Driver, AppleTalk Driver, Media Control Driver, Printer Driver, Printer Port Driver, MIDI Driver. Added an icon for DiskCopy files. Dragging a different-sized disk (or option-dragging a same- sized disk) onto an read-only-filesystem disk (like MS-DOS) now correctly complains that you can't do that. Improved the Clipboard display (uses the new ShowClipboard call in the Scrap Manager). The "Finder requires 6.0.1 and 300K" message now shows a hex error code (from StartUpTools or other calls during startup, like LoadResource). Erase and Initialize on a disk now update the icon's file system. Fixes bugs like: Erase a DOS 3.3 disk to be ProDOS; when you drag something onto the disk, it still complains that the disk uses a read-only file system. Control works with Command-W and Command-Option-W. (Control reverses the save-finder-data setting.) Changed a lot of window parameter blocks to allow windows to update in the background (like behind an AlertWindow). Changed preference to read "Check 5.25" drives on Finder start" (key equivalent is now 5). It used to say "When starting up, check 5.25 drives", but this was confusing (could be misunderstood as affecting what device the system boots from). Finder no longer gets confused about the file system of an icon that you drag to the desktop. Fixes bugs like Locked boxes showing up for HFS folders on the desktop, and not being able to launch ProDOS 8 applications that were just dragged onto the desktop. Fixed a bug when shortening a disk name (rename RAM5 to RAM, for example). The Finder would get really confused about the pathnames of existing icons on the disk that you renamed. DrawDesk uses full-screen rectangle, not just below the menu bar. This way HideMenuBar works as expected in the Finder. Fixed up I-Beam handling (new code is smaller). Fixed bug where IBeam could mistakenly appear when the icon being renamed was in a window but scrolled outside the visible area, and the mouse was over the desktop. When you change the system date/time format (for example, using the Time Control Panel), the Finder now bothers redrawing all directory/trash windows that have a Last Modified column. (It used to notice the change but not force a redraw, so windows could get half-updated.) Saved 1800 bytes by making menu resources string-based instead of template-based (so far they're rCStrings). This saves disk space and load time and reduces the handle count. Developer-Level Finder Changes Finder uses Volume Changed events to notice when windows need to be updated because of GS/OS calls made by anything other than the Finder. The tellFinderAboutChange call now does nothing, since the Finder now notices changes without special help. Note that the Finder does not notice when it should make changes to icons on the desktop (not even in 6.0 with tellFinderAboutChange). Changed tellFinderSetSelectedIcons to not flicker an icon if it is the sole selected icon and we've been asked to highlight it again. When Finder sends out multiple finderSaysBeforeOpen requests (when a group of icons are opened), the modifiers are now correct for all of the requests, not just the first one. In 6.0, the modifiers were accidentally zero for all requests other than the first. tellFinderGetSelectedIcons (extended) now returns the icon height and width. This was broken in 6.0 (the workaround in the 6.0 documentation sees that the Finder version is not 6.0 and automatically does nothing). Fixed the oneDoc match types matchCreateDateTime and matchModDateTime. They did not work in 6.0. Finder no longer forgets what menu title to unhighlight if an Extras menu handler calls tellFinderMItemSelected (even with no-highlight). We now send finderSaysBeforeOpen any time we launch an application, not just when the user explicitly launches one. This means that you can now properly trap the Finder any time it was about to quit to another application. (Finder 6.0 neglected to send a finderSaysBeforeOpen when the user chose the application using Standard File.) Finder accepts the srqQuit request, handling it just like a tellFinderShutDown with a selector of kQuit. When matching an icon by filename and using a leading "*", the "*" can now match zero characters (it works like 5.0.4 again). In 6.0, a leading wildcard accidentally required at least one character to match. When matching an icon by filename, the case of the string in the Icon file or in the rBundle resource no longer matters. Previously, a string with a leading wildcard (like "*PAINT") would only work if all letters were uppercase, regardless of the case of any actual files being matched against. Added a tick count parameter (long) to finderSaysKeyHit. The parameter count is now three. The parameter count for finderSaysBeforeOpen and finderSaysOpenFailed is now seven. (It was accidentally only 6 in 6.0, but all seven parameters were there.) For convenience, finderSaysIdle now passes the idle ticks (as would be returned from askFinderIdleHowLong) as the dataIn value. Changed finderSaysHello pCount to 4 and added a word of flags, none of which are presently useful. Fixed tellFinderSetSelectedIcons to handle bit 31 correctly (the 6.0 Finder documentation says not to set the bit; now it works as originally intended, deselecting all icons before selecting the specified ones). tellFinderRemoveFromExtras validates the item number for $Exxx, returns error fErrFailed if invalid. (If you pass itemID 0 to Finder 6.0, it happily removes the first (remaining) item from the Apple menu!) Implemented the geekPrefs option for Shut Down default. Set the low two bits of the X2 word to 0, 1, or 2. (This word was semi-documented with 6.0, but it didn't do anything.) Fixed tellFinderAddBundle to use GetIndResource(1) instead of 0 when you pass zero to grab the first available rBundle (this case always failed with an error in 6.0). tellFinderSpecialPreferences now returns a valid finderResult ($0000). In 6.0, it was returning the dragFlag value as the finderResult. Internal Finder Changes When we're network-booted, we now load the Desktop file from the user prefix ('@'). In 6.0, the Finder wrote rBundles to the Desktop file there, but it forgot to read them. Removed the new-for-6.0 server-specific copy code, because the code that built the destination hierarchy tree was whacked in the head. This means that duplicating files or copying from disk-to-disk on a single server now reads and writes file data instead of telling the server to do it. LoadExtensions now tries to create @:FinderExtras. This way the folder already exists in case you drag a Finder Extension into your System folder. (If you're booting from a network, magic-routing a Finder Extension is not helpful, because it will try to route into your *:System:FinderExtras folder instead of @:FinderExtras.) Fixed CompareVols to be case insensitive in its comparison. Internally Finder will always create icon objects and window names and pathnames in the same case as they have on disk. However, if a window was opened via tellFinderOpenWindow that used a different case, moving icons from/to that window could previously result in files being copied instead of being moved. Fixed a fatal bug in the Icon Info size calculation code. If it couldn't read the current size from the device for whatever reason, the stack became unbalanced. Changed keyDown to ignore the event if systemSaysMenuKey ate it (if the "what" of the event is zero). For example, when Command-Ctrl-Esc opens the Control Panels NDA, the Finder does not accidentally process the Esc keypress and deselect all icons. Fixed the problem where a server disconnecting unexpectedly would make the Finder hang if a server window was the current selection plane. During tellFinderSetSelectedIcons, we now bring each icon to the head of the linked list as it is drawn. This fixes cosmetic problems when icons overlap and get partially redrawn. Finder can now deal with 128 devices being online as opposed to the old limit of 64. Fixed four incorrectly-coded 32-bit additions. There were problems when certain data structures crossed bank boundaries. Changed SizeToString to do "zero " instead of "0" (affects info bars, icon info cards, & much more). When Finder gets error $46, $51, $5A, or $2D from a Volume call on a newly-inserted disk, it no longer sets the hdiUnreadable bit to HandleDiskInsert (that bit is only set for a real I/O error). Knowledge of what filetypes can be Inactive is no longer in the Finder. It comes from the Filetype Descriptor files instead. Flag bit 0 in an index entry for an any-auxtype entry means files of that type can be inactive. Finder now uses Filetype Descriptor files even if some of flag bits 0..7 are set. No longer calls SelectWindow on a non-window when you click on a desktop icon or start rubber-banding on the desktop. The tellFinderGetWindowInfo call has a special case for the Clipboard window, which is now created by the system. tellFinderGetWindowInfo pretends it's a Finder window and gives you information about it anyway. Saved a few bytes by removing a redundant MessageCenter call for deleting message $11, the long-pathnames-to-launch message (the toolbox automatically deletes this message when the Finder deletes message 1, the pstring-pathnames-to-launch message). Optimized main segment (AND #$7FFF becomes ASL LSR; use Zero constant on direct page) Uses new Line Edit call LEClassifyKey to determine what control characters to let through for editing when renaming an icon (saved a few bytes; no user-visible change). Fixed the error-exit path when tellFinderOpenWindow gets an error from ExpandPath. Various miscellaneous optimizations, including reserving one word of direct-page space to always hold a zero. Replaced many pea 0 with pei