
4.40-test22 / 09-10-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 TEST22--
Fix memory leak when using MediaFoundation-based video recording (WMV/MP4).
--4.40 TEST21--
Alt+key menu shortcuts now work in the Performance Analyzer.
Added stereo SAP type R recording support.
Added VGM recording/playback support (POKEY streams only).
Fixed regression with Rapidus running at 40MHz. It is now back at 20MHz and emulation for the experimental 40MHz option is controlled by advanced cvar.
CPU speed options no longer show as enabled while Rapidus is active.
Fixed SIDE 3 not responding to being disabled by the upstream cartridge port.
Fixed bugs with SpartaDOS X pass-through port.
--4.40 TEST20--
Added pause/resume for recordings.
Refactored ZMBV encoder, added ARM64 optimizations, and fixed some minor bugs in the resampler.
Fixed bitrate not being adjustable with H.264+AAC encoding.
Fixed a regression in 4.40-test with errors writing the last sector on a disk.
Minor optimizations to performance trace load/save.
--4.40 TEST19--
Flash chip type is now selectable for Maxflash 1Mbit cartridges.
H: device fixes: current directory is now cleared on reset, fixed LFN translation of intermediate subdirectories, implemented XIO 33 behavior for directories, fixed chdir to root, fixed cwds getting mixed up between H: device units.
Open Image on a program no longer forces a cold reset.
Added Speedy XF full drive emulation.
Fixed cycle counting error when single stepping 6502-based coprocessors.
The Speedy XF is an interesting drive mod -- it is essentially an XF551 with almost everything but the drive mechanism gutted and replaced with Speedy 1050 innards, including replacing the 8048 MCU with a 1MHz 65C02 + RIOT + RAM. It's fairly overspecced with 32K of ROM/RAM, only 24K/16K of which is usable. The mod goes so far as to buffer the data bus to intercept and modify status register reads from the 1772 FDC to mimic the Not Ready bit from the 1050's 279x.
Track buffering is supported by the Speedy XF, and like the Speedy 1050, it has the unusual behavior of auto-disabling track buffering and switching to a more 1050 compatible mode when booting certain types of disks. This includes slowing down the track step rate. The Speedy XF supports a track display, which displays SL when this transition happens. Booting the computer without a disk in the drive will auto-load a utility program allowing reconfiguring the drive and running DOS and copy utilities. This is fairly useful except that the drive has no NVRAM, so in emulation you have to be very careful not to reset the drive after changing settings.
Oddly, despite being based on an XF551, the Speedy XF doesn't use the same side 2 logical to physical sector mapping that the XF551 does. The XF551 maps both tracks and sectors in reverse order on side 2, but the Speedy XF maps reverse tracks with forward sectors, an unusual mapping previously only seen with the 1450XLD parallel disk drive.
The drive's extended commands and basic memory map are documented in the original manual and there is also a schematic by Guus Assmann, but much of the address decoding is hidden within two GALs that AFAICT have not been decoded. The main omission that I had to guess at is an undocumented control latch at $4004 that controls, among other things, the drive mechanism side select.
--4.40 TEST18--
Disabled click-to-rename on firmware entries, and added right-click option for set as default (since double-click is already edit).
Added default icon to firmware manager.
Specifying multiple files on the command line without a type switch stacks them in successive slots for the media type.
Fixed some cases where a boot action didn't unload a pending program load that hadn't triggered yet.
Rewrote POKEY pot scan for better accuracy.
Fixed a regression with and improved accuracy of reading keyboard controllers.
Debugger .pokey command now reports pot scan status.
Pot scan is now stored in save states.
Added noisy paddle emulation.
The paddle / pot scan has been rewritten in this version. It is now cycle precise for scan timing, including a counter increment glitch that occurs one out of every 114 cycles, and tracks paddle capacitor charge levels more realistically when switching between slow and fast scan modes. Some regressions with grounded pot lines have also been fixed which affected the keyboard controller, and the POT4-7 lines are also now grounded on XL/XE computer models.
Noisy / dirty paddles is something I threw in for fun, since people might not have experienced this without actually playing on paddles dug out of a box in a garage. It is a simplistic algorithm, you cannot wipe the paddle back and forth to clean it. It is enabled under Input in Configure System. Only paddle controllers are affected, not any other controllers that use the pot inputs like tablets or 5200 controllers (no need to make the latter any worse).
I also discovered that it is possible to extend the pot scan to cover the full range of a CX-30 paddle. The emulator supports this scan hack but not extending the paddles to cover this range, since that extra range is generally unusable and annoying. I have a retro-controller adapter on order but I'm guessing it probably doesn't cover that extended range either.
--4.40 TEST17--
Fixed unnecessary line buffer clear in ANTIC emulation.
Fixed history window sometimes not showing effective address on an insn after stopping on a memory access breakpoint.
Adjusted horizontal scrolling in memory window and implemented history.
Improved visual behavior when resizing the window with docked panes.
Docked panes no longer show window captions.
Re-enabled OS window theme for undocked window panes and enabled minimize/maximize buttons.
Increased drag thresholds to reduce accidental undocking of window panes.
--4.40 TEST16--
Firmware dialog redesigned. Those who have tracked the emulator's development have seen how much this has grown; it was far more manageable when there were only a dozen firmware types instead of the several dozen there are now. The tree view has been replaced with a filtered list view that is easier to read.
The cheat dialog is now resizable and more readable in dark mode, and is now modeless so it can be kept open while the emulation is running.
Disk drives dialog has improved dark mode support.
Miscellaneous other dark mode fixes.
Added protection against stack overflows in the custom device compiler.
--4.40 TEST15--
Fixed regression with 1050 full disk drive emulation.
Fixed a minor issue in the Vorbis decoder.
The video frame capture and display size are now adjustable in the performance analyzer.
--4.40 TEST14--
Modem no longer forces off remote echo when connecting as a client in Telnet mode.
Modem no longer negotiates or allows binary mode when connecting with Telnet CR/LF translation enabled.
Fixed some cases where modem TCP connection did not have Nagle's Algorithm successfully disabled.
Fixed a crash when configuring input maps after disconnecting XInput controllers.
Added workaround for Xbox Wireless Controllers connected over Bluetooth also showing up as duplicate DirectInput controllers.
Fixed fake index pulse and seek timing for the Black Box Floppy Board.
The Floppy Board now uses a 1770 FDC instead of a 1772 as seen in Guus' schematic, since the step rates better match the 1770 -- it uses the FDC's 6ms and 12ms normal step rates with an 8.33MHz clock and switches to the 16MHz FDC clock with the 6ms step setting to step at 3ms/track. Using a 1772 was causing the FB to step way too fast.
--4.40 TEST13--
Fixed output multiplication in .pathdump output.
Fixed some sounds not playing.
Initial support for the Black Box Floppy Board.
Added ATR mapping support for additional geometries supported by the Floppy Board, such as 5.25" 1.2M HD disks.
The Floppy Board is an add-on board for the Black Box that adds parallel floppy drive support to the Black Box. It's similar to the 1450XLD in design but more capable and reliable. With this version, the Floppy Board can now be emulated, but there are a lot of caveats:
You need a 64K base Black Box firmware such as version 2.16 to have Floppy Board support. This originally came with the Floppy Board as a replacement ROM chip.
Drive Configuration needs to have drive entries redirected to PBI Floppy 0-3, and those drives also configured in the FB options submenu. (You also need a SCSI drive attached to save the config.)
The drive type, such as 5.25" HD, needs to be configured the same in both in Drive Configuration and in the emulator settings for the Floppy Board. The emulator needs this to compute the drive RPM, track count, and logical-to-physical sector mappings.
The emulation configuration for the Floppy Board also selects which drive slots in the emulator are mapped to the PBI floppy slots. These do not have to match the mappings in the Black Box drive configuration, but it'll be pretty confusing if they don't.
The Floppy Board only has 2K onboard RAM and does not have track buffering. It will not run faster with standard disks unless they are reinterleaved or reformatted.
I still need to figure out what's going on with index sensor selection, as I had to invert it from Guus' schematics to get it to work, but this is causing the motor to stay running when there is no disk inserted.
The drive seek sounds can be a bit loud at 3ms/track, need to modulate that a bit.
There is an ambiguity problem for ATR images between 5.25" 40 track double-sided and 3.5" 80 track single sided. They have the same sector count, so the emulator can't tell which was used in an ATR. Thus, currently you will have problems re-reading a 3.5" 400K image stored in an ATR file.
This does confirm one thing I had long suspected: that Percom's side 2 mapping is indeed bugged and off by one from what it's supposed to be. The Floppy Board firmware has a setting for which side 2 mapping mode to use (XF551 / ATR8000 / Percom) and the Percom mode shifts everything by one sector from XF551, making the last logical sector inaccessible.
--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...