AmigaOS 4.1 update 3

AmigaOS 4.1 Update 3 was released on August 29, 2011. AmigaOS 4.1 Update 3 runs on the following hardware platforms:

  • Amiga Classic equipped with CyberstormPPC or BlizzardPPC
  • AmigaOne and MicroA1-C
  • Sam440ep (all variants)
  • Pegasos II
  • AmigaOne 500 and Sam460ex

An incomplete list of features in Update 3 includes:

  • Updated Installation Utility program
  • Updated PATA and SATA drivers
  • Improved DOS stability and speed
  • Fixed Amiga shared object issues
  • Support for AmigaOne keyboards including boing key swap feature; Set keymap_swapaltamiga to "on" in your firmware to enable
  • Updated Intuition and GUI components
  • New consistent full release string including update number
  • Updated AmiSSL certificates
  • Updated USB stack with USB 2.0 (EHCI) support
  • Improved Sam460ex support including sound driver
  • I2C support for the Sam440ep and Sam460ex platforms
  • Updated and improved Warp3D support
  • Faster 2D graphics support
  • Various kernel fixes for increased stability
  • Updated MUI with many new features to make porting MUI 4.0 based applications simpler
  • Improved notifications support

The following is a more detailed look into what has changed since AmigaOS 4.1 Update 2:


Shell Commands
  • Reading a line from the file no longer forgets to update the line length information in the buffer prefix.
  • Changed the line buffer allocation to multiply by the buffer character size (= CHARSIZE) rather than conveniently shifting stuff around. This now looks like it might make better sense.
  • Figured out that the buffer bounds checking performed by all the code was completely bogus, as it always required two extra bytes to store file names, search patterns, etc. and would have overrun the buffer even if the bounds checking hadn't detected any issues. The new code now uses buffers with two extra slots of storage. Yes, the two extra slots are for what amounts to NUL-terminated BCPL strings.
  • Made sure that in all the places which bothered about having NUL-terminated strings there is actually a NUL put where it is needed.
  • The command's documented WIDTH and PREVIOUS arguments now actually work.They never did, and only the equivalent "OPT W" and "OPT P" options were ever implemented.
  • Version included to align with hard disk drivers.
  • Version included to align with hard disk drivers.
  • Dropped FastIPrefs compatibility, no longer needed under Release 4.
  • Fixed a bug which could cause a crash on a Workbench backdrop pattern change due to an unprotected walk-through of the window list.
  • Replaced ACTION_INHIBIT packet with Inhibit() call.
  • Replaced ACTION_FLUSH with FlushVolume() if dos.library is at 53.58 or higher. Otherwise it defaults to using the ACTION_FLUSH packet.
  • Fixed aborting Reboot SYNC.
  • Fixed the scan code for $VER: tokens inside loaded handler modules. The old code would not work when the version string is in another segment or not at the exact start of the first segments data area.



  • Replaced asynchronous packet I/O with standard DOS function calls.
  • In very rare cases, increasing the number of colors of a picture via PDTA_NumColors could still cause some reads from unallocated memory, because too much data was copied from the old palette to the new one.
  • The allocation of standard (planar) bitmaps was broken due to a difference in behavior between Picasso96's CyberGraphX emulation and the original CyberGraphX. As a result, hicolor or truecolor bitmaps could end up being returned to the client even in legacy V42 mode.
  • Performing a layout of a truecolor picture on a truecolor screen in legacy V42 mode would cause PDTA_NumColors to be incorrectly set to zero even if the picture actually had a color table after the layout.
  • When a CLUT picture needs to be promoted to truecolor format by a layout or scaling process, the depth value in the BitMapHeader does no longer become greater than 8 if the client is operating in legacy V42 mode.
  • When scaling a HAM picture, or a CLUT picture with quality > 0, the depth value in the object's FrameInfo will now get updated to reflect the picture's promotion to truecolor format.
  • No longer modifies the color table of a CLUT picture promoted to truecolor, if the only purpose of the promotion is preparing the picture for display on a hicolor or truecolor screen.
  • PDTM_READPIXELARRAY no longer fails when LUT8 data is requested but the object is in truecolor format because it was promoted by a layout process; now the LUT8 data which was active before the promotion is returned instead.
  • Added new PDTA_PromoteMask tag; if a CLUT (8-bit) picture with a transparent color needs to be promoted to truecolor format for layout or scaling purposes, setting this tag to TRUE allows the picture's transparency mask to be converted as well and carried over to the truecolor data as valid alpha information.
  • Fixed the initialization of the minimal palette for a picture in truecolor format lacking an own color table; the mouse pointer colors (17..19) were being repeated over and over until the end of the color table, and the 32-bit color registers (CRegs/GRegs) could get trashed due to a mismatch between two color counters.
  • No longer reads the "Classes/DataTypes/Picture/DitherHiColour" environment variable when a truecolor picture undergoes a layout on a truecolor screen; now this will only happen when the target screen is actually a hicolor one.
  • Upgraded libpng to version 1.2.42.
  • Fixed the calculation for the ReplayPeriod when using 16 or 32 bit samples. Previously the bytes per sample were not being taken into consideration.
  • During OM_NEW, if the type of the host hardware was determined to be a PPC machine, and not a 603 or 604 CPU, it just assumed that an AHI capable sound-card was installed. Therefore, the result from OM_NEW was always TRUE, and then issuing the DTM_TRIGGER method would hang indefinitely if the machine did not have a soundcard installed. Added a small routine that opens the ahi.device before deciding whether to really use AHI or not. sound.datatype will now return a fail from NewDTObject() if no capable sound-card is installed, and this should stop the application trying to call the trigger method.
  • DT_NewMethod() never called DT_SetMethod(), hence the tags given at init time were lost and never propagated to the sub-classes if they were not explicitely set again later.
  • The DTM_WRITE method was always reporting failure, regardless of whether it actually failed or not; now fixed.
  • Fixed a bug caused by an invalid optimisation in the string search routine.
  • Removed double buffering scheme which used DOS packets.



  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • BUTTON_BevelStyle was documented to be applicable to OM_GET, but it was never implemented
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Added CHOOSER_SelectedNode to the OM_SET list.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Clicking the cycle image now makes the chooser select the next active entry, making it skip any disabled ones.
  • ScrollWheel now cycles the entries instread of stopping at the top/bottom of the list.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Only the active tab now displays the close gadget when a close gadget is specified. This stops any user confusion buy having non-working gadgets displayed allbeit disabled.
  • Added TNA_SoftStyle to Set/GetClickTabNodeAttrs().
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Removed all CyberGraphX dependencies, Now uses BltBitMapTags() instead.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • The GETFILE_Pattern attribute was not updated after the file requester was closed, meaning if the user changed it, there was no way for the application to recognise that.
  • Added GETFILE_InitialShowVolumes to allow the requester to appear with the volume list initially.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Added GETFONT_SpecialModeBitMap, GETFONT_SpecialModeBitMapWidth & GETFONT_SpecialModeBitMapHeight, which correspond to ASLFO counterparts in asl.library v53.41+
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • The GM_QUERY method handling was fundamentally flawed due to a small oversight. The handling of GMQ_HINTINFO has now changed for both layout.gadget and page.gadget. This has finally fixed the dependency on the old WINDOW_HintInfo array, and it is no longer needed.
  • Added GA_HintInfo to OM_NEW and OM_SET.
  • Instances of page.gadget would fail to propagate the gadget font from GUI preferences to any members added via OM_SET; now fixed.
  • The OM_GET method of page.gadget was always returning FALSE even for attributes it did actually support, except for PAGE_Current;
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Added lbsm_CheckedA and lbsm_CheckedB fields to struct LBSortMsg to allow a custom sorting hook to check the state of a nodes CheckBox gadget if available.
  • When enabling LISTBROWSER_Borderless, the entire background is now erased to better integrate the gadget into layouts seamlessly without visible borders.
  • When setting LISTBROWSER_ColumnInfo to NULL, LISTBROWSER_ColumnTitles is now automatically set to FALSE;
  • LBM_ADDNODE now calculates the amount of columns required by counting the amount of LBNA_Column tags supplied.
  • When adding nodes with LBM_ADDNODE or removing nodes with LBM_REMNODE and LISTBROWSER_AutoVirtualWidth is TRUE, the virtual width was not calculated automatically.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Added new SPACE_RenderBox tag which replaces the now deprecated SPACE_AreaBox tag. SPACE_AreaBox was badly flawed because it returns a pointer to an internal memory buffer which means it was never thread safe.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • Fixed a rendering issue when used with GA_TEXTEDITOR_Transparency, TRUE.
  • Turned off the automatic copy to clipboard in readonly mode.
  • Adapted the GM_QUERY handling to suit the changes in layout.gadget.
  • The default backfill from window.class (REACTION_BackFill) was not being propagated to the virtual gadget's contents.


  • BITMAP_Width and BITMAP_Height (as well as their selected and disabled variants) can now be changed via OM_SET for an already existing image. Furthermore, they can now be set even for bitmaps loaded by datatypes.
  • You can now safely pass both BITMAP_SourceFile and BITMAP_BitMap (and their selected/disabled variants) in just one NewObject() call, which previously wasn't fully supported. This allows to try loading an external picture file, and at the same time provide a fallback bitmap to be used if that operation fails for whatever reason.
  • The bitmap section specified with BITMAP_#?OffsetX, BITMAP_#?OffsetY, BITMAP_#?Width and BITMAP_#?Height is now clipped to the actual bitmap boundaries during rendering, to avoid trying to read data from outside the bitmap's memory.
  • Added support for the IA_EraseBackground attribute.
  • Added support for the IM_EXTENT/IM_EXTENTFRAME methods.
  • Bitmap scaling now produces smoother results and is performed with hardware acceleration when possible.
  • Documented the IA_Scalable attribute which was supported since version 45 but never mentioned in the autodoc.
  • Updated and cleaned up the autodoc.
  • Fixed a bug due to which planar masks would produce trashed graphics on CLUT screens when drawing a scaled bitmap section.
  • Fixed a bug in the IM_EXTENT/IM_EXTENTFRAME methods: images larger than their bitmap were always assuming the space around the bitmap would get filled or cleared, regardless of what IA_Scalable or IA_EraseBackground had actually been set to.
  • Multiline labels having an underscored character in a line other than the first one could cause graphic corruption.
  • Added support for 'struct Images' now you can include images for bitmap.images or use your own custom Image structures.


  • Fixed a bug in the layout sizing when supplying custom requester images which were not being disposed of inbetween uses.
  • Changed a very little used feature of the string requester when a chooser array is supplied to allow options for the user to choose from. The actual chooser gadget is now in dropdown mode which makes the chooser menu hidden from the user (this stops the confusion from having two strings on view). The selected item text is now placed into the requesters string buffer as the user would expect and it now works in a much more consistant and expected way.
  • Added WA_StayTop to OM_GET.
  • The default "window" icon used as a fallback for iconification no longer allocates any pens on a hicolor or truecolor screen.
  • Now supports the WA_PubScreenFallBack tag.
  • Slight change in the GM_QUERY broadcast to suit the layout.gadget
  • Added WINDOW_PopupGadget. More information is in the autodoc.
  • The window position was not always updated when IDCMP_CHANGEWINDOW was received, which led to the window changing it's position when jumping screens.
  • Improved alignment of popup menu and associated gadget.
  • The "Jump to Screen" menu will now show the public screen name if one has been assigned, else it will fallback to the screen title.


  • Changed the PCIDevice to PCI_MODE_REVERSE_ENDIAN, making the PIO data register big endian, to be able to use the (In|Out)(Word|Long)Block() functions instead of an (In|Out)(Word|Long)() loop with double endian swapping. On the A1200 Mediator it's much faster now.
  • Bumped version to keep all drivers the same.
  • Bumped version to keep all drivers the same.
  • Changed the PCIDevice to PCI_MODE_REVERSE_ENDIAN, making the PIO data register big endian, to be able to use the (In|Out)(Word|Long)Block() functions instead of an (In|Out)(Word|Long)() loop with double endian swapping. On the A1200 Mediator it's much faster now.
  • Changed the PCIDevice to PCI_MODE_REVERSE_ENDIAN, making the PIO data register big endian, to be able to use the (In|Out)(Word|Long)Block() functions instead of an (In|Out)(Word|Long)() loop with double endian swapping. On the A1200 Mediator it's much faster now.
  • Changed the PCIDevice to PCI_MODE_REVERSE_ENDIAN, making the PIO data register big endian, to be able to use the (In|Out)(Word|Long)Block() functions instead of an (In|Out)(Word|Long)() loop with double endian swapping. On the A1200 Mediator it's much faster now.
  • Changed the PCIDevice to PCI_MODE_REVERSE_ENDIAN, making the PIO data register big endian, to be able to use the (In|Out)(Word|Long)Block() functions instead of an (In|Out)(Word|Long)() loop with double endian swapping. On the A1200 Mediator it's much faster now.
  • Changed the PCIDevice to PCI_MODE_REVERSE_ENDIAN, making the PIO data register big endian, to be able to use the (In|Out)(Word|Long)Block() functions instead of an (In|Out)(Word|Long)() loop with double endian swapping. On the A1200 Mediator it's much faster now.
  • Added sam460sata.device for the new Sam460ex boards


Various keymaps have been updated to improve their ISO compliance.


  • Reworked CalculateBytesPerRow() to only return values that are derived only from the Permedia's own Partial Product representation and not any arbitrary multiple of 32. This was added to ensure that the widths that are returned are always viable targets for the corresponding Warp3D driver. Also fixed a bug that caused the wrong value to be returned for widths > 1388 irrespective of partial product value.
  • Fixed a line drawing bug that caused lines with one coordinate off the left or top edges of the screen to be drawn incorrectly, or not at all
  • Added the DevNameFromPort() and NameFromPort() functions.
  • Added a Serialize() function to cover the missing ACTION_SERIALIZE packet.
  • Added new feature to ScanVars() to be able to specify a sub-directory to search.
  • Sped up the FindSegmentStackSize() cache so it now works even when there is no stack cookie inside the loadable at all, this saves another pointless segment rescan later.
  • SystemTags() no longer allows the SYS_Input stream to be NULL where it can cause subtle resource inheritance problems when the shell initialisation code tries to fix up the NULL pointer, it was also never documented that NULL was ever a valid tag option for the input stream anyway, so now, if NULL is supplied, a "NIL:" stream is always opened internally by the System() function before passing it onto the shell.
  • The DOS lock handler now pre-allocates 5 empty nodes upon handler startup to minimise the even remote chance of failure due to a memory shortage.
  • Now clears pr_EntryCode, pr_ExitCode and pr_FinalCode in cleanup() before calling the vector for resource cleanup tracking purposes.
  • Make sure DOS serviced notify requests have the NRF_DOS_NOTIFY_ONLY flag set, the original request may not have set this, but a filesystem may not support the notify mode or reject it for other reasons, so this flag is now always set in the notify structure nr_Flags field if the request is being serviced by DOS, this allows the caller to determine who is servicing his notification request.
  • MakeLink() cannot create links with the same name as any existing objects now.
  • Renamed the following cli structure manipulation functions and provided source compatibility defines in obsolete.h ; SetPrompt to SetCliPrompt GetPrompt to GetCliPrompt SetCurrentDirName to SetCliCurrentDirName GetCurrentDirName to GetCliCurrentDirName SetProgramName to SetCliProgramName GetProgramName to GetCliProgramName
  • Fixed a bug in RelocateSection(). There was a variable scope issue with the pointer of the RelocBuffer.
  • Made reloc names more meaningful.
  • Added to allow access to the FPGA on the Sam460 boards.
  • Now uses version.library V53 for the command line copyright message.
  • Added to give access the i2c bus on the Sam440 and Sam460 boards.
  • Fixed a bug in the bitmap sharing routines due to which a bitmap instance obtained from a 32-bit picture with alpha channel could never be shared (although the actual bitmap could: this did only affect the instance's opaque "handle" object).
  • Fixed another bug in the bitmap sharing routines due to which a hicolor or truecolor bitmap could be returned in some cases even when trying to obtain a bitmap instance for use on a CLUT screen.
  • ObtainBitMapSourceA() does now always return NULL immediately if it is called by a simple task rather than by a process. Also, it does now prevent unwanted DOS requesters (such as "Please insert volume...") from appearing while it's attempting to do disk I/O.
  • Vastly enhanced openfirmware.resource for Pegasos 2 and AmigaOne X1000.
  • Changed the priority of pagers on classic hardware (ZorRAM first, then disk).
  • Fixed pci(e) initialization problem for some pci(e) cards whose bars don't respond on the initial bar query at all.
  • The trigger of IRQ 29 of the SAM440 machine is now set to level instead of edge. This is the IRQ to which the internal USB controller maps.
  • Added support for MACHINETYPE_SAM460
  • Changed key map matrix to use standard PS/2 scan codes and IKeymap->ObtainRawKeyInfo() for the raw key translations.
  • Added a new feature to swap the Alt and Amiga keys for use with the new Amiga keyboards from A-EON. It works by swapping the raw key codes retrieved via ObtainRawKeyInfo() and only works for PS/2 and USB keyboards. Define the variable "keymap_swapaltamiga" to "on" in your firmware to active this feature.
  • Fixed an issue where the \| key located above the Enter key and below the Backspace key was missing on the AmigaOne American keyboards.
  • Reworked parts of the layer depth arrangement logic to avoid code duplication. This also removes some inconsistencies which in rare circumstances could lead to severe misbehavior.
  • Cleaned up the autodoc a little and added the missing entries for SetLayerInfoAttrsA() and GetLayerInfoAttrsA().
  • Made the memory handling in loader.of 64 bit clean for CFE/Nemo board.
  • Compatibility changes for Pegasos 2.
  • Fixed unlink() to defer removal of files to exit time if they are currently in use. This behaviour extends to remove() as well.
  • Fixed readlink() to work correctly when passed a path not containing soft links.
  • Fixed dup2() to restrict filedes2 to OPEN_MAX and set errno to EBADF as per the standard behaviour. Previously dup2() would not limit the file descriptor number which means some configure tests would take a very long time to execute.
  • Fixed configure script to use grep -E when parsing charsets so it now works with GNU grep. No need for a special grep tool now.
  • Changed GPSLF_CLI to GPSLF_RUN in SHLibInit().
  • Split the allocations for header and data of the data blocks and increased the block size to 32 KB. Deleting large, paged out files is about 45 times faster now.
  • Reworked the main ramlib process to make it able to self restart if it crashes, this now allows for the romtag initialising to be done by the main ramlib process, which also means we can now lose all that CreateNewProc() overhead and a bunch of extra task switches per library load. Vroooooom.....
  • Rewrote the entire seglist scanner code for FindSegRomtag() to use the new optimised 64 bit routine. The speed of this one is way more than twice as fast as the old 32 bit code.
  • Removed WaitBlitter() calls from right after HW accelerated blitter calls. This increases the overall performance by allowing the CPU and GPU to work simultaneously. This has more than doubled the P96Speed BltBitMap() performance.
  • If no MODE or DDCMODE tooltypes are found, then DDC is used to get the screenmodes (i.e., DDC is now the default).
  • It was possible for LoadMonDrivers to try to load monitor settings for a card before initialization was complete (particularly relevant for Radeon HD cards, as they take longer to initialize). This could result in DDC not getting the screenmodes.
  • The Sam440ep and Sam460ex boards now use the DMA unit when possible to copy data from main RAM to VRAM. Due the larger bandwidth available, the use of the DMA Unit has sped-up some graphics operations (like WritePixelArray). Some applications/games may have a significant speed increase.
  • Graphics hardware driver added to support the onboard display hardware for the Sam460 boards.


  • Time stamps of log entries prior to full boot are now recorded and reported properly
  • The initial getting the configuration descriptor is now retired three times before giving up the attachment of a new device.
  • Fixed bug in USBFindFunction() which caused the function to ignore USB functions of a second host controller driver.
  • The handshake functionality of the device init function that been previously disabled caused prompt calls to OpenDevice() to fail. One victim was the boot delay module, which made booting from USB media unreliable. Now enabled again.
  • Fixed USBFindFunction() to actually behave like described in the AutoDoc. Now it really ONLY returns NULL if it searched the whole USB bus and didn't find a function with matching criteria AND which is not claimed (as long as USBA_SeeClaimed wasn't set to true).
  • A Message Port was created twice for every IO Transaction, even if it was not needed at all.
  • Changed qualifier handling to use IKeymap->ObtainRawKeyInfo() instead of hard-coded raw key values.
  • Replaced polling of keyboard repeat and threshold timings with a change notification hook via IND_ADDNOTIFY. This also removes the dependency on intuition.library.
  • Added ehci.usbfd to allow the use of high-speed devices.
  • For USB 2.0 hubs, it switches to the interface supporting multiple TTs if possible.
  • Changed the order of the ohci initialization: the controller is reset before the interrupt server is added and started after it has been added.
  • Yet another ISP1651 specific fix. TDs could be considered as completed although there were not.
  • In ISP1561 mode, all transfers larger than 12*4096 bytes were not completed processed leading to requests that were never replied.
  • Implemented fixes for Errata 5, 12, and 18 of the ISP1561 documentation.
  • Implemented a fix for Erratum 17 of the ISP1561, which states that the HCDoneHead is not always updated properly. We now also traverse our scheduled transfers manually to see whether they are finished.
  • Added preliminary support for isochronous transfers.
  • Added support for the 460ex onchip OHCI controller.
  • Fixed several race conditions that happened when a transaction was aborted, which also was also serviced by the underlying driver at the same time (happens for instance, if a device was unplugged). If an IO request is aborted now, the reply is delayed until the abort is acknowledged by the service task.
  • All massstorage transfers are now limited to 64 blocks for certain devices known to function better with this setting.
  • Added support in the massstorage driver for TD64 command set such that old filesystems that do not understand NSD should work better.
  • When the mounting process fails, the corresponding massstorage device is now considered as manually dismounted, preventing the device to be automatically mounted again.
  • It is possible now to change the filesystem of a manually dismounted device that is used when the user requests to mount the device again.
  • Added L:NTFileSystem to the list of supported floppy-like filesystems.
  • Streamlined the MBR support code: it is now possible to mount FAT and NTFS partitions.
  • Added IO column in the massstorage commodity interface that reflects the current IO state.
  • Added workaround for devices that don't send a short packet in the data-in phase if no data is transfered.


File Systems
  • A very stupid sequencing bug could cause FAT blocks not to be flushed to disk on very specific cache constellations. This would cause clusters to be used twice, thereby messing up disk content. Or clusters would not be freed as expected, thereby losing disk space.
  • Formatting a disk while files are open or locks are existing will now hand over everything to the DOS lock handler.
  • Seek()'s to EOF will not access the cluster chain anymore.
  • A totally empty FAT32 volume that was perfectly ok took longer to validate than one that had at least one block allocated.
  • Formatting a disk was subtly broken. For MBR formatted disks, partition formatting seemed to work if it had been previously formatted on a PC, but it placed strategically wrong values into important parts of the boot block.
  • When mounting a disk, the FAT32 version is now respected, and unknown versions are rejected.
  • Cluster allocation code could have given up on disks which were not yet full.
  • There was a hole in the dirscanning where it could have read out garbage file information.
  • Renaming a directory from somewhere into the root could have caused a valid, but technically not quite right cluster reference in FAT32. Now it should work like Microsoft does it.
  • FAT32 FSInfo block could have been put into rather strange places on MBR based disks. Also, FSInfo will now be written after the main FAT has been flushed to disk, and the volume will be correctly marked/unmarked as dirty or not.
  • Cache system use should be better now for larger disks. Note that the filesystem is read optimized. Writes always go through the cache.
  • FAT12 is still forced to single block I/O to work well with floppy drivers. FAT16/32 make use of the internal block cache for noticable speedups on sticks and drives.
  • SetFileSize no longer actually extends by writing zero bytes. It will now just allocate space but the content is undefined. This roughly doubles copy speed.


  • Included updated SSL certificates.
  • Increased parsing pattern buffers from 130 to 500 bytes. The parsed pattern buffers are 2 * 500 + 2 bytes in size.
  • When in multi-select mode, both files and directories can be selected, but the req->fr_ArgList doesn't include the directory names. This has now been changed and the selected directories are included along with the names of any files. Application that assume the returned list only contains files may break, and should now check the type using ExamineObject().
  • Added ASLFO_SpecialModeBitMap, ASLFO_SpecialModeBitMapWidth and ASLFO_SpecialBitMapHeight, with which you can specify the bitmap to use as the background of the font preview when DoSpecialMode is active.
  • The "Parent", "Create Drawer", "Rename" and "Delete" options are now ghosted when they're not available.
  • Delete and Rename now work properly in drawers only mode.
  • Rename now also renames the corresponding icon, if present.
  • You can now delete a non-empty directory and all its contents, although it will check first and tell you you're trying to delete a dir with contents.
  • Added to the distribution as MUI can now handle archived images.
  • When duplicating a truecolor icon, DupDiskObjectA() would allocate twice as much memory for the ARGB buffers as actually needed; that was due to an internal link in the original icon being transformed into a second copy of the linked data in the duplicate. This problem was causing Workbench to eat up much more memory than necessary when opening a drawer containing a large number of files in "Show all files" mode.
  • Included the latest versions. Details are available from the MiniGL repository.
  • Many many changes applied to support the porting of MUI-OWB.
  • Added library vectors to gain system-wide copyright and version strings.
  • Added locale support to source the translated strings.
  • Previous build introduced a bug in W3D_DrawTriStrip() causing the wrong driver call to be invoked.
  • Fixed a bug in W3D_LockHardware() that did not unlock the graphics driver in the case when the hardware driver failed to successfully lock the hardware.
  • Added vertex count validation to V1-V3 triangle fan, triangle strip, line strip and line loop rendering methods rather than relying on the hardware driver to do this since it is not a hardware-specific operation.
  • Hardware drivers also updated to account for the above changes.
  • Loading the startup module icons will no longer allocate any pens on a hicolor or truecolor Workbench screen.
  • Now tries to let the Workbench backdrop picture appear even while the startup module execution is still in progress. If the picture can be displayed, and there's a transparent progress window, the window's background will be made a little brighter (while staying transparent) in order to keep the module names readable in case a dark backdrop is in use.
  • Now applies current user preferences for drawer icon scaling also to module icons shown during startup.
  • When icon dragging starts, Workbench no longer attempts to make a bitmap out of every selected icon, which could easily consume all available video memory if thousands of icons were selected at the same time (e.g. after a "Select contents" operation); now this is skipped for any icons residing so far from the mouse pointer that they can't possibly be dragged into view before the mouse pointer reaches the edge of the display.
  • UpdateWorkbench() does now perform a check to find out whether an added object is actually a link rather than a file or drawer, and displays it as such (i.e. with an underlined label) if that's the case. Previously the added object didn't look like a link until a manual drawer update was executed.
  • With automatic drawer update turned on, newly added links used to appear in their drawer's window with the name of the object they pointed to, rather than their own name.
  • If a backdrop picture is supposed to be centered, it will now also get centered if it is bigger than the Workbench area on one or both axis. Before they were always aligned on the left/top screen edges.
  • Removed dependency on TaggedOpenLibrary() to retrieve copyright strings. All strings are now retrieved from version.library using the new API. If the new API is not available then blanks are shown.
  • Removed dependency on cybergraphics.library and replaced with IGraphics->BltBitMapTags() instead.


  • Now sets WA_BusyPointer to block user interaction when opening requesters.
  • Editor version aligned to stack version.
  • Adapted to show copyright strings and release information from version.library.


  • Changed internally to use dos functions, rather than filesystem packets.
  • Fixed writing to a device profile when doing the sanity check for profiles/templates.
  • Added usbadm8511.device, rtl8029.device and rtl8139.device to the deny list.


  • Added as a new component for viewing system notification and USB logs.
  • Changed internally to use dos functions, rather than filesystem packets.
  • Updated ASL function call to use latest tags etc.
  • No longer causes a seperate console window to open when it has already opened its own window.
  • When you bring up the "open file" requester from an untitled document view, it no longer has "Untitled" in the filename gadget.
  • Copyright strings are now retrieved from version.library.
  • When you drop a WB icon onto a notepad window, it now activates that window after loading the file.
  • When launching NotePad with the PUBSCREEN argument, the public screen was not brought to the front of the display, which led to a confused user.
  • New version required to align with stack version.