
4.40-test12 / 27-05-2025
Altirra
Accuracy
Performance
Features
Altirra is a full cycle-exact emulation of all documented hardware features for the Atari 400/800, 1200XL, 600/800XL, 130XE, XEGS, and 5200 systems and is particularly notable for having a very well equipped debugger tool.
--
Windows: XP SP3+ for x86/x64
Qualcomm Snapdragon 835+ for ARM64
Most Recent Changes
--4.40 TEST12--
Adds custom display effect support for Direct3D 11.
Fixed cases where the debugger UI did not update when non-debugger commands were used to suspend/resume execution (pause, reset).
The blank "autoselect" option for firmware is now always visible.
The hard disk options dialog now rounds down instead of up when guessing cylinder counts from a raw file with no inherent CHS geometry, and allows direct LBA sector limit entry.
Fixed a PRIOR state handling bug when switching between CTIA and GTIA on the fly.
The custom display effects code got a major refactor in this version. Besides supporting D3D11 as well as D3D9, it has a few more features now:
Improved compatibility with .cgp effects due to supporting more undocumented features (//-style comments, PASSPREV, etc). Some .cgp effects still don't work for various reasons, such as using a field called "texture" which is an HLSL reserved keyword, but more effects work out of the box now.
Custom effect profiling can be enabled by advanced cvar as well as in the .cgp file itself.
Passes that don't reference the input can be cached for better performance.
There are now more sample custom effects in the extras folder (which is now a .zip file).
There are issues specific to the D3D11 custom effects path that can cause issues. The biggest one is an annoying requirement specific to Direct3D 11, VS-PS linkage matching, where the vertex shader must output attributes in the same order as the pixel shader. This is not required by Cg or D3D9, and so effects not written with this in mind will fail to work in D3D11 mode unless adjusted.
Part of the reason for doing this is that I would like to drop D3D9 mode at some point, but the timeline for doing that is uncertain -- one reason being that Wine's support of D3D11 feature level 9.x is completely broken.
--4.40 TEST11--
Firmware autodetect now explicitly labels common ATARIOSB.ROM as being related to Xformer.
Fixed enhanced CIO display not wrapping characters properly between margins on Delete Character.
Fixed a crash in the custom device compiler with certain patterns of nested anonymous functions.
Added custom device support for playing sound clips, and a new Electronic Keyboard sample device.
Added custom device support for issuing emulator UI commands.
Fixed recording position not being reset properly when mounting a new tape, and auto-select Record when doing so.
SuperSALT device now modifies SIO +12V, 9VAC, and port 3/4 +5V/GND results based on computer model.
Merged Tools > Options into System > Configure System.
--4.40 TEST10--
Rewrote SIO bus handling to allow for per-device command processing.
Disk emulator now ignores overlapping commands except for Indus GT profile, and allows early SIO command deassertion except for XF551 mode.
Fixed bug with POKEY IRQs in progress getting lost on save state loads.
Built-in 1030 firmware now properly installs T: device when ModemLink is booted but not run (e.g. BASIC on).
Fixed 1030 standard emulation not booting ModemLink with SIO acceleration enabled.
Improved timing for accelerated disk commands.
This build has SIO handling rewritten so that active commands can be tracked separately for each device. Full emulators already did this, but standard device emulators all worked through a common handler that could only track one active command at a time. The most direct effect of this is that the standard disk emulator can now ignore overlapping commands so that Rescue at Fractalus v4.1 now boots.
The SIO acceleration path now also takes into account the time it would take to send the command frame when warping the disk position. This improves timing accuracy a bit so that Sky Blazer can boot more reliably with acceleration enabled.
--4.40 TEST9--
Fixed bug in fast math acceleration normalize routine that could cause small errors.
1090 80-column registers are now always visible.
Some rework internally in the Direct3D11 renderer.
Fixed Screen Effects dialog sometimes reporting wide color gamut (WCG) displays as HDR capable.
Updated bloom algorithm with better scaling to smaller displays.
Fixed bright bar on the right side of screen when using a slot mask.
Fixed slot mask counter-scrolling artifacts when panning.
Reduced flickering of drive indicators when using full emulation disk drives.
Fixed filename matching bug CP/M filesystem handler and crash with missing extents.
Added The Pill device.
Some details on the above
1090 80-column behavior was changed to always make the CRTC and memory mapping registers available, based on dumping the PLA equations. This makes the 1090 80-column card less compatible with other PBI devices but is required for the 1090 AtariWriter 0.1 driver to work. However, that driver appears to be pretty buggy and prone to crashing on scrolling, so it's still not really usable.
I finally figured out why the bloom couldn't scale well to lower resolutions, after spending some time with scipy. The pyramid filter still resulted in a relatively wide lobe even at the narrowest pyramid level, about radius-8. This meant that at 2560x1440 the width needed to be cranked all the way down, and at lower resolutions even the narrowest filter level was too wide:
--4.40 TEST8--
Fixed bug in fast math acceleration normalize routine that could cause small errors.
1090 80-column registers are now always visible.
Some rework internally in the Direct3D11 renderer.
Fixed Screen Effects dialog sometimes reporting wide color gamut (WCG) displays as HDR capable.
Updated bloom algorithm with better scaling to smaller displays.
Fixed bright bar on the right side of screen when using a slot mask.
Fixed slot mask counter-scrolling artifacts when panning.
Reduced flickering of drive indicators when using full emulation disk drives.
Fixed filename matching bug CP/M filesystem handler and crash with missing extents.
Added The Pill device.
Some details on the above:
1090 80-column behavior was changed to always make the CRTC and memory mapping registers available, based on dumping the PLA equations. This makes the 1090 80-column card less compatible with other PBI devices but is required for the 1090 AtariWriter 0.1 driver to work. However, that driver appears to be pretty buggy and prone to crashing on scrolling, so it's still not really usable.
I finally figured out why the bloom couldn't scale well to lower resolutions, after spending some time with scipy. The pyramid filter still resulted in a relatively wide lobe even at the narrowest pyramid level, about radius-8. This meant that at 2560x1440 the width needed to be cranked all the way down, and at lower resolutions even the narrowest filter level was too wide:
This is now fixed with two additional narrower filter levels so the filter can be narrowed at lower resolutions / window sizes. It also potentially allows for making the bloom shape sharper, though I need to spend some time tweaking the filter coefficients. The downside is that this makes the bloom filter a bit more expensive -- nothing that dGPUs can't handle, but might be a bit noticeable with iGPUs. I spent some time trying to optimize it with a compute shader, but in the end it was significantly slower than a pixel shader on an iGPU (and ~10% faster on a dGPU).
The HDR vs. WCG issue came about because one day I was working on the laptop and was trying to figure out why Altirra thought it had an HDR-capable screen... only to discover that it had something that I thought was extinct, a non-HDR wide color gamut (WCG) display actually exposed in Windows. This manifests as the following option in Windows:
Wide color gamut means that the display can handle saturated colors beyond standard PC sRGB. This is pretty common now with displays now supporting wider gamut color spaces like Adobe RGB and DCI-P3, and the difference is noticeable even in some Atari colors. However, to display a wider gamut, both the system and the program need to render in extended color. The above option enables system compositing in extended color, and Altirra can render in scRGB, but currently it's tied to HDR rendering which I need to update. 4.40-test8 at least uses a new API exposed in the latest Windows SDK so it can distinguish between HDR and WCG displays.
--4.40 TEST7--
Fixed two bugs in VBXE attribute map handling. RES=1 to switch to hires was broken in 1.26 core mode, and RES=0 was not forced properly at the right border.
Custom devices can now auto-enable memory layers based on system ROM visibility. auto_enable: "osrom|basicrom|selftestrom" will automatically enable or disable a memory layer based on visibility of the OS, internal BASIC, or self-test ROM.
Reduced duplicate/stale errors being displayed for custom devices.
.tracecio now reports AUX2 on opens.
--4.40 TEST6--
PerfAnalyzer: Fixed incorrect CPU history after saving trace.
PerfAnalyzer: Fixed scrolling artifacts on frame lines.
PerfAnalyzer: Right-drag is now supported.
PerfAnalyzer: Fixed lockup when pressing Tab.
PerfAnalyzer: Added native tracing support.
Devices: Fixed Rapidus write-through conflicts on ROM and extended memory.
Disk Explorer: Fixed dragging out of subfolders from a MyDOS disk producing a bogus file.
--4.40 TEST5--
Reduced aliasing on screen masks by switching to a softer antialiasing filter.
Fixed blending startup crash with extended PAL height displays.
Fixed artifacts around edges when scrolling 1020 plotter views.
Fixed canceling some load progress dialogs giving a blank error dialog.
Fixed a crash in raw tape loading code if decoding errors occurred.
Fixed dot/slot masks occasionally displaying as vertical stripes in Direct3D 9 mode.
Fixed dark display in Direct3D 11 mode with screen mask enabled, PAL artifacting on, blending off or interlace on, and color correction disabled.
--4.40 TEST3--4
Fixed Direct3D9 rendering artifacts with bloom enabled and some image formats.
Z80 disassembly now supports block separators.
Added option to disk dialog to reinterleave a disk to SD 4:1 interleave for Indus SuperSynchromesh.
Improved timing accuracy of Indus GT full emulation so the Indus Doubler works.
--4.40 TEST3--
Fixed crash in devices tree when adding new devices with certain nodes selected.
Fixed console key input bindings in input maps being disabled in full screen mode.
The Add Device dialog now has device names sorted.
Fixed D3D11 bloom rendering with incorrect gamma in full-screen mode.
Moved screen mask rendering to post color correction to reduce aliasing artifacts.
--4.40 TEST2--
Adds full 850 Interface Module emulation.
850 standard emulation now matches the transfer speed of the 850, and fixed an issue with inconsistent DTR/RTS state.
Updated internal 850 R: handler to v0.3 so it matches the Break key behavior of the newer 850 firmware instead of the older 850 firmware.
On-screen error decoder (Ctrl+Alt+click) now interprets 850-specific CIO error codes.
SIODATA logging channel now detects and interprets command frames.
Added vertical slot mask type to mask rendering.
Fixed a crash in custom device error reporting code.
More detailed explanation of the 850 stuff:
Like the other full emulators, 850 full emulation means that it is running the actual controller firmware instead of a high-level emulation of the 850. This also comes with the usual caveats: it requires the actual firmware, and some quality-of-life features aren't available with it, such as unthrottled operation. However, it also means you can test real corner cases like running code on the emulated 850 (and yes, warerat's firmware dumper does work). One caveat is that in some cases you may need to specify the baud rates for each port in the settings. This is because with full emulation, the emulator no longer has a direct way to tell what baud rate the 850 is using or expecting on each port, and this causes problems with output paths that are baudless like the file writer. Currently, the Auto detection will attempt to match POKEY's baud rate. This should work for the majority of cases that use concurrent I/O, but it may fail with the uncommonly used block write feature unless a specific baud rate is specified.
The full emulation also reveals a couple of things about the firmware. There are two firmware revisions in the wild, with CRC32s 9201359A and 2CF990B9. The [9201359A] firmware is the older revision and [2CF990B9] is the newer and more common revision. The 850 firmware sources from the Atari History Museum match the newer revision. The main differences between the two are documented in the different versions of the 850 Interface Manual, with the 1980 Owner's Manual documenting the older revision and the 1982 Technical Manual documenting the newer revision, with a note on getting older 850s upgraded at a service center. The main difference between the two is the handling of the Break key when concurrent I/O is active. In the older revision, pressing Break causes the R: handler to autonomously exit concurrent I/O mode, whereas in the newer revision, the Break key is disabled and ignored. However, there are also two undocumented changes: the newer revision also recognizes P2: for printer access, and raises the printer I/O timeout from 5 seconds to 30 seconds. The relocator and handler downloads are slightly longer on the older revision as well, meaning that some software won't work with it -- notably BobTerm can't auto-download the R: handler.
Accordingly, a couple of adjustments have been made to the 850 standard emulation to improve accuracy. The internal R: firmware that's built-in and included on the Additions disk has been updated to v0.3 with the Break key behavior now matching the newer firmware, and the transfer rate of the firmware download has been slowed down to match the 850, which like the 1050 is a little bit on the slow side. A fix has also been made to control signal handling as DTR and RTS weren't consistently being set on the attached device. The main potential impact of this is that the modem will not auto-answer on default settings unless DTR is asserted or the DTR handling mode is changed with the AT&D command. BobTerm at least makes sure that DTR is asserted at startup, but other software might not.
Finally, in not 850 related news, slot mask support has been added, which is a mask type with fine vertical slots instead of unbroken vertical stripes as in an aperture grille. It is the mask type used by at least some versions of the Commodore 1702 monitor.
--4.40 TEST1--
Adds support for display screen mask emulation, currently supporting aperture grille (Trinitron) and dot triad patterns. This is set up in View > Adjust Screen Effects. It works best with a high resolution display (e.g. 2560x1440 or higher) with high brightness or HDR enabled, as this requires even higher peak brightness than scanlines. The renderer will try to compensate if bloom is enabled, but you'll see moiré patterns on bright colors if you push it too hard.
New test version; old stuff uneeded...