Current version

Altirra 1.6

Navigation

Main page

Altirra, an 8-bit Atari computer emulator

I had access to a number of 8-bit computers in my childhood, but my most favorite was the Atari 800, a 1.79MHz 6502-based computer with color graphics and a disk drive, and which as the predecessor to the Amiga, another favorite of mine. Over a decade later, I was struck by both nostalgia and ambition and started to write a new 8-bit Atari emulator from scratch. This is the result.

At this point, I've learned a lot more about the Atari and Altirra now emulates more than I ever had or did years ago, but I still work on it periodically. It also serves as a modularity test for the VirtualDub code base, from which Altirra shares some components. If you are struck by nostalgia too or have a desire to do some Atari development, perhaps it might be useful to you, too.

System requirements

Altirra has relatively few system requirements:

If you can run VirtualDub, you can run Altirra, with the one exception that it will not work with the Win9X derived versions of Windows (Windows 95/98/ME).

Before you begin

Altirra is designed with emulation quality in mind, sometimes over speed and polish. It's designed as a system emulator and debugger instead of a games machine, so there is some setup involved. There is a README file in the archive, but here are some quick tips:

First: Software. you need some actual 8-bit Atari (not Atari ST!) software to run. If you don't have any, it'll be a pretty boring experience. I can't give this to you for various reasons, but there are freely available demos, and if you have converted your Atari software to disk images for other emulators, those will work too. Specifically, disk images are supported in ATR, DCM, ATX, and PRO formats; some simple cartridge types are also supported, and you can directly load Atari executables as well (.obx/.xex).

Second: kernel ROMs. Altirra has an internal kernel that can be used to run Atari software, and thus you can run demos, games, and productivity software without needing any Atari ROM images. However, this kernel is reimplemented from scratch, and has some compatibility problems. Therefore, you may want to consider hooking up real kernel ROM images, which will greatly increase Altirra's software compatibility. I'm afraid I can't offer these for download, but if you have downloaded ROM images from your Atari, Altirra uses the same format and filenames as most other popular Atari 8-bit system emulators.

Third: compatibility. Altirra is designed to emulate the actual Atari hardware as closely as possible. Its compatibility has been increasing over time, and at this point it should run most software correctly. However, there can still be problems, some of which may be emulation bugs, and some of which are related to hardware emulation settings. Tips:

Downloads

Altirra is licensed under the GNU General Public License (GPL).

Binaries (i.e. stuff you can run):

Altirra 1.6 binary (local download)
Altirra 1.5 binary (local download)
Altirra 1.4 binary (local download)
Altirra 1.3 binary (local download)
Altirra 1.2 binary (local download)

Source code (i.e. stuff programmers can modify and compile):

Altirra 1.6 source code (local download)
Altirra 1.5 source code (local download)
Altirra 1.4 source code (local download)
Altirra 1.3 source code (local download)
Altirra 1.2 source code (local download)

The compile requirements are the same as for VirtualDub 1.9.2: Visual Studio 2005, YASM 0.4.0+, DirectX SDK, Platform SDK (now Windows SDK).

Hardware Reference Manual

This is a document describing all of the interesting behavior I've discovered in the Atari 8-bit hardware.

Altirra Hardware Reference Manual, 4/25/2010 version (local download, PDF)

Screenshots


A complex screen in the game Alley Cat.

Running the SpartaDOS X shell.

Mid-scanline changes in the BeweSoft 8 players demo.

3D graphics in the Numen demo.

Running drac030's 65C816 XL/XE OS.

Debugging one of the GTIA unit tests.

Running BASIC in enhanced text mode.

 

Changelog

Version 1.6 [April 25, 2010]:
   [features added]
   * Debugger: Added profiler.
   * Debugger: Added support for loading CA65 labels.
   * Debugger: Added verifier to catch possible coding errors.
   * Debugger: Added support to view extended memory to some commands and panes.
   * UI: Added option for controlling vertical sync lock.
   * UI: Added /opengl command line switch.
   * UI: BASIC ROM is now noted on window caption.
   * UI: Window position is saved on exit.
   * UI: Added /debug switch to launch in debugger mode.
   * UI: Added /f switch for full-screen mode.
   * UI: Added .car extension to Open Image dialog.
   * UI: Input maps can now be cloned.
   * UI: Input maps can now be bound to a specific game controller index.
   * UI: Create disk dialog now has entries for standard disk formats.
   * UI: Added ability to paste text from clipboard.
   * UI: Moved warm reset to F5, bound Help to F6 and Break to F7, and merged Run into F8 to match other emulators.
   * UI: Added program icon.
   * Simulator: Added option to fill memory with a psuedorandom pattern on cold boot instead of zeroes.
   * Simulator: Added support for 65C816 high memory at banks $01-03.
   * POKEY: Increased playback sampling rate to 44KHz.
   * POKEY: Added option to toggle non-linear mixing.
   * POKEY: Added option to toggle individual sound channels.
   * POKEY: Implemented keyboard overrun bit.
   * VBXE: Register window can now be switched between $D6xx and $D7xx.
   * Disk: Added support for 1050 drive dual density format.
   * Disk: Added support for XF551 drive high speed commands.
   * GTIA: Added a stronger level of NTSC artifact emulation. 

   [bugs fixed]
   * Fixed command line parsing and added several new switches.
   * HLE: Fixed math pack issues preventing Atari Basic ATN(), INT(), and SQR() from working.
   * HLE: Fixed handling of BASIC enable/disable on warm reset.
   * LLE: Improved math pack implementation.
   * ANTIC: Playfield DMA wasn't properly shut off on cold reset.
   * ANTIC: Improved emulation of mid scan line DMACTL changes.
   * ANTIC: Reset line now resets position counters.
   * ANTIC: Emulated single cycle glitch in VCOUNT at the end of a frame.
   * ANTIC: Implemented delay for changes to CHBASE to take effect.
   * POKEY: Adjusted timing of STIMER and timer rollovers.
   * POKEY: Retuned filters and non-linear mixing curve.
   * POKEY: Fixed behavior of SKSTAT serial overrun bit.
   * GTIA: Added option for displaying full PAL height when extending display past scan line 239.
   * GTIA: Fixed display of beam position when single stepping with VBXE enabled.
   * Debugger: Fixed bug where history window didn't allow scrolling to the bottom via the slider.
   * Debugger: History window now always shows last executed instruction.
   * Debugger: History window now flushes and rebuilds the tree when the history window rolls over.
   * Debugger: "Toggle read/write breakpoint" in the memory window was using the wrong address.
   * Debugger: Disassembly window now tracks 65C816 M/X/E state.
   * Debugger: .history command was using wrong register state for decoding indexed effective addresses.
   * Debugger: Fixed incorrect index register values in Registers pane in 65C816 emulation mode.
   * Debugger: Fixed disassembly of JMP (abs,X) and JSR (abs,X) instructions.
   * CPU: XCE instruction no longer sets M/X bits when staying in native mode.
   * CPU: Fixed bank used by JML, JMP (abs), and JMP (abs,X) instructions in 65C816 mode.
   * Disk: Added support for reading broken DD disks that have full 256 byte boot sectors.
   * Disk: SIO acceleration hook now sets SKCTL correctly.
   * UI: Fixed issue where full-screen mode didn't always cover the entire screen.
   * Simulator: Shortened delay to releasing OPTION on startup. 

Version 1.5 [January 31, 2010]:
   [features added]
   * Added option to redirect P: to a text pane.
   * UI: Added handing for gamepads being added or pulled during execution.
   * UI: Rewrote input system and added general input mapper.
   * UI: Added options for controlling display stretching and aspect ratio.
   * UI: Added better handling for cases in which a requested firmware ROM is not available.
   * UI: Added option to control overscan display.
   * UI: Mounted disks and cartridges are saved and restored across runs.
   * UI: FPS display in window caption is now optional.
   * UI: System configuration is now shown on the window caption.
   * POKEY: Added volume control.
   * Simulator: Added "Other" firmware option to load an otheros.rom custom kernel (16K XL).
   * Cassette: Added seek UI.
   * Cassette: Reworked playback indicator.
   * GTIA: Added option to blend adjacent frames to reduce flicker.
   * GTIA: Added System > Video > Adjust Colors.
   * GTIA: Added support for interlaced output.
   * Disk: Added sector counter option.
   * Disk: Increased max drive count to 8.
   * Disk: Added burst transfer mode compatible with SpartaDOS X.
   * Disk: Get Status and Read PERCOM Block commands are now accelerated.
   * Disk: Lazy writes are now incremental.
   * VBXE: Initial emulation support.
   * Misc: Added R-Time 8 support.
   * Debugger: Added list nearest symbol (ln) command.
   * Debugger: "Go to Source" command now asks for source file location if it cannot be found.

   [bugs fixed]
   * HLE: Improved compatibility of screen editor.
   * HLE: Fixed bug in emulated math pack that broke Atari Basic.
   * Debugger: Fixed crash when a source file couldn't be found.
   * Debugger: Auto-loading of symbols for executable files works again.
   * Debugger: Source windows no longer recenter when toggling breakpoints.
   * Debugger: Fixed misspelled SKRES symbol.
   * ANTIC: Fixed incorrect CPU timing for STA WSYNC + PHA combination.
   * ANTIC: Vertical scroll bit is now kept across VBLANK if display list is too long.
   * ANTIC: Fixed timing of display list DMA enable changes (DMACTL bit 5).
   * ANTIC: Internal line buffer is no longer cleared when repeating mode lines with display list DMA disabled.
   * ANTIC: Mode lines can now repeat across VBLANK with display list DMA disabled.
   * ANTIC: Added emulation of bug where VBLANK can fail to occur if scan line 247 is a hires line.
   * POKEY: Fixed reading of POT timers before pot counters have stabilized.
   * CPU: Implemented SBX instruction ($CB).
   * Disk: Increased reliability of lazy flush mechanism.
   * Disk: Fixed PERCOM block for large disk images.
   * Disk: Fixed boot sector count for 512 byte/sector images.
   * Disk: Hard disk (H:) no longer goes away on a warm reset.
   * Disk: Reverted change to raise RTCLOK on SIO acceleration to fix bugs with programs that monitor RTCLOK from a VBI handler.
   * UI: Mouse capture is automatically released when the simulator stops.
   * UI: Fixed USER handle leaks.
   * Simulator: 1088K memory mode no longer disables self-test bit when extended RAM is disabled.
   * LLE: Fixed cartridge initialization.
   * LLE: Fixed BASIC ROM switching.
   * LLE: K: open/close calls are now implemented.
   * LLE: Added initial math pack implementation.
   * LLE: SIO now shuts off all audio channels.

Version 1.4 [November 8, 2009]:
   [features added]
   * Debugger: Added .diskorder command to force phantom sector load order.
   * Debugger: Added .dma command to dump current ANTIC DMA pattern.
   * Debugger: Added .caslogdata to diagnose cassette data read failures.
   * Debugger: Added .pia command to dump PIA state.
   * Disk: Added support for command $4E (Read PERCOM Block).
   * Disk: Added support for reading Diskcomm (DCM) images.
   * Cassette: CAS images and mono WAV files now play data as audio.
   * Cassette: The SIO acceleration engine now reports diagnostics about damaged blocks to the console window.
   * Cassette: Made accelerated read routine more robust against interpreting garbage as the start of block sync.
   * Cassette: Optimized WAV processing routine.
   * Cassette: Added command to unload tape.
   * Cassette: Added emulation of feedback from SIO motor control line into audio input.
   * UI: Added command to reset window layout.
   * UI: Drag-and-drop is now a synonym for the Open Image command.
   * UI: Added more key mappings.
   * UI: Added Boot Image command to unload all existing cartridges/disks/tapes and cold reset after loading an image.
   * UI: Added debugging option to dump raw audio to disk (32-bit float @ 63920.4 NTSC / 63337.4Hz PAL).
   * UI: Added .com to list of file filters for the Open Image/Boot Image commands.
   * UI: Added enhanced text display mode.
   * Simulator: Added support for loading OS-A kernel ROM.
   * GTIA: Added support for PAL artifacting.

   [bugs fixed]
   * UI: Mapped Ctrl+alpha/num and Ctrl+Shift+alpha/num keys.
   * UI: Arrow-keys now auto-repeat.
   * UI: View > Display works when the debugger is disabled.
   * UI: Fixed window activation and sizing problems when toggling full screen mode.
   * UI: This simulation is now throttled in full-screen mode.
   * CPU: Implemented TDC instruction in 65C816 mode.
   * CPU: Implemented undocumented $93 (SHA) and $BB (LAS) opcodes.
   * CPU: Fixed flags on $9C (SHY) opcode.
   * CPU: Removed bogus 65C816 opcode ($DC) in 6502 decoder.
   * Cassette: Fixed desync between audio and data after accelerated load.
   * Cassette: Audio/data channels are no longer swapped when processing stereo input.
   * Cassette: Raised cutoff on control line low-pass filter to fix reliability problems at turbo baud rates.
   * Cassette: Fixed incorrect SIO return code for accelerated cassette reads.
   * Cartridge: Fixed MMU mapper so that the cartridge ROM now overrides BASIC at $A000-BFFF.
   * Cartridge: TRIG3 is now deasserted when $A000-BFFF is unmapped.
   * Cartridge: The second bank setting for Bounty Bob Strikes Back! cartridges is now saved in save states.
   * Disk: Added support for weak bit emulation in VAPI images.
   * Disk: Fixed VAPI image read errors when missing sectors are present.
   * Disk: Fixed incorrect FDC status when loading long sectors that set the "lost data" status bit.
   * Disk: SIOV/DSKINV acceleration handlers set more kernel variables for better compatibility.
   * Disk: Abort acceleration attempt when disk buffer contains SIO timeout flag (TIMFLG).
   * Disk: Adjusted sector read delay to increase VAPI image compatibility.
   * Disk: Fixed cases where the virtual read/write setting was not obeyed properly.
   * GTIA: Changes to GRAFPx/GRAFM are latched and no longer affect a sprite image that is already shifting out.
   * GTIA: Increased timing precision of console speaker from 28 cycles to single cycle.
   * GTIA: Fixed bug that caused some apps to misdetect the video mode as SECAM.
   * GTIA: Adjusted timing for mid-screen changes to P/M graphics and color registers.
   * GTIA: CONSOL output bit 3 wasn't affecting input bit 3.
   * GTIA: VDELAY now masks DMA fetches rather than actually delaying loads.
   * POKEY: Fixed random crash in stereo mode.
   * POKEY: 15KHz and 64KHz clocks are no longer joined between the left and right channel chips.
   * POKEY: The channels now have the correct 0-3 clock skew for reading the noise generators.
   * POKEY: Implemented channel 1/2 inversion when not in volume-only mode.
   * POKEY: Implemented non-linear mixing.
   * POKEY: Audio plays again when initialization mode is active.
   * POKEY: Implemented serial force break bit (SKCTL bit 7) affecting two-tone mode.
   * POKEY: STIMER now resets output channel states properly.
   * POKEY: Asynchronous serial input mode now holds down timers 3 and 4 again when a byte is not shifting in.
   * HLE: The math pack is now emulated even if the acceleration option is disabled.
   * HLE: POTGO is now strobed during vertical blank stage 2 processing.
   * HLE: STRIG2/3 are now updated from TRIG0/1 instead of TRIG2/3 for XL/XE hardware compatibility.
   * HLE: Fixed bug where POKEY was put into initialization mode after an unaccelerated SIO transfer.
   * HLE: POKEY audio channels are now shut off after an SIO operation.
   * HLE: Added keyboard click.
   * ANTIC: Two-line resolution mode now reloads GTIA every scan line.
   * ANTIC: Fixed timing when using read-modify-write instructions to trigger WSYNC.
   * Simulator: Memory banking wasn't updated properly on changes to the port B data direction register.

Version 1.3 [September 4, 2009]:
   [features added]
   * Debugger: Register pane now shows 65C816 state.
   * Debugger: Added context menu to disassembly pane.
   * Debugger: *.lst and *.lab symbols are automatically detected and loaded for direct-run EXEs and cartridges.
   * Debugger: Improved source-level debugging capability.
   * Debugger: Opcodes are now cached so that they show correctly in the history log even with bank switching.
   * UI: Filter mode is now saved on exit.
   * UI: Added command to copy current frame to the clipboard.
   * UI: Added paddle support.
   * GTIA: Optimized artifacting code.
   * GTIA: Added the ability to disable collisions for cheating.
   * Cartridge: Added support for 64K XEGS and 512K MegaCart cartridge types.
   * Cartridge: Added support for SuperCharger 3D cartridge.
   * Cassette: Added support for non-standard baud rates.
   * Cassette: Added auto-boot option.
   * Cassette: Device open commands are now accelerated.

   [bugs fixed]
   * Simulator: More fixes to executable loader.
   * Simulator: 320K memory mode now banks ANTIC along with the CPU.
   * Simulator: Joystick and bank switch masking via the PIA data direction register is now supported.
   * Simulator: Rewrote BASIC handling to use the OPTION switch rather than masking PORTB bit 1.
   * Simulator: Reset PIA, ANTIC, and CPU on warm reset for XL hardware.
   * Simulator: Self-test ROM no longer appears if kernel ROM is disabled.
   * Simulator: Adjusted PAL frame rate.
   * Simulator: Disk boot flag is now set when loading EXEs to accommodate programs that warm start through DOSINI vector.
   * Simulator: EXE loader is more tolerant of broken files.
   * CPU: Fixed many 65C02/65C816 bugs.
   * CPU: Fixed emulation of NMOS 6502 decimal mode.
   * CPU: Fixed bugs in undocumented instructions.
   * CPU: Fixed emulation crash when switching to 65C816 on the fly.
   * CPU: Fixed handling of break flag.
   * CPU: Now allow one instruction to pass before taking IRQ interrupt after clearing I flag.
   * Debugger: Improved handling of 65C816 modes in disassembler.
   * Debugger: Debug memory reads no longer see $FF in the page where a read memory breakpoint is set.
   * Debugger: Fixed bugs in symbol parser when loading MADS listings.
   * Debugger: Fixed line highlighting in source windows.
   * Debugger: Disassembly recomputes on 65C816 mode changes.
   * Disk: Fixed bug in loading of ATR files that have non-standard boot sector counts.
   * Disk: Additional compatibility fixes to DSKINV acceleration.
   * Disk: Status commands are no longer delayed by the accurate disk timing option.
   * Disk: Applied slight adjustment to SIO transfer rate.
   * Disk: POKEY timers are now shut off after SIO/DSKINV acceleration.
   * Disk: Strengthened disk image format validation and made XFD loading more tolerant.
   * UI: Fixed bug in CPU mode dialog that prevented selection of 65C02 mode.
   * UI: Fixed crash when accessing menu with display pane closed.
   * UI: Keyboard-as-joystick logic no longer allows simultaneous up+down and left+right.
   * UI: Added support for controlling joystick port 2.
   * UI: Blocked invalid machine configurations with XL kernel and 800 hardware or less than 64K of memory.
   * ANTIC: Fixed broken mode 9.
   * ANTIC: Vertical reflect now works on modes 4-7.
   * ANTIC: Player/missile DMA no longer occurs during vertical blank.
   * ANTIC: Fixed behavior of vertical scrolling on blank lines.
   * ANTIC: Changes in playfield width are now supported later in a scan line.
   * ANTIC: Moved VCOUNT advance forward by one cycle.
   * ANTIC: NMIs are now suppressed if enabled too close to trigger point.
   * ANTIC: NMIs are now delayed by one cycle if enabled exactly on cycle 8.
   * GTIA: Bogus missile-player collisions were reported if a register change occurred in the middle of a missile.
   * GTIA: Fixed CONSOL I/O interactions on switch lines.
   * GTIA: Save states now restore player/missile widths.
   * HLE: DSKINV now supports double-density disks.
   * HLE: Improved compatibility of post-init PORTB state.
   * POKEY: Rewrote resampling filter to better block high frequencies.
   * POKEY: Fixed 17-bit noise register polynomial and shift direction.
   * POKEY: Initialization mode (SKCTL[1:0] == 0) now resets the low-speed clocks and polynomial shift registers.
   * POKEY: Asynchronous serial receive mode no longer suspends channels 3 and 4.

Version 1.2 [July 5, 2009]:
   [features added]
   * Debugger: Added memory pane.
   * Debugger: Shift+F11 is now a shortcut for Step Out.
   * Debugger: History window now supports the mouse wheel.
   * GTIA: Added artifacting support.
   * UI: Cursor auto-hides when over display pane.
   * UI: Added window pane layout saving.
   * UI: Basic support for an Atari ST mouse in port 2.
   * UI: Added more keyboard mappings.
   * Simulator: Added initial save state support.
   * Simulator: Added option to pause when not the active application.
   * CPU: Initial 65C02 and 65C816 support.

   [bugs fixed]
   * Simulator: Fixed RUNAD handling in executable loader.
   * Simulator: Fixed incorrect TRIG3 cartridge sense on launch.
   * UI: Tweaked aspect ratio constants.
   * UI: Fixed some bugs with pane undocking.
   * ANTIC: Added missing address wrapping (fixes hang loading Bounty Bob).
   * ANTIC: Fixed VSCROL timing to acccommodate more mode line extension tricks.
   * ANTIC: Fixed low bits in NMIST register.
   * POKEY: Tweaked hi-pass to sound better.
   * POKEY: Implemented fast pot scan mode.
   * POKEY: Two-tone serial mode now affects timer 1/2 sound output.
   * Debugger: Breakpoints can now be seen on the active line.
   * Debugger: Fixed early stop when trying to Step Out across a PLA or PLP instruction.
   * Debugger: CPU status traces on single-step use the instruction PC rather than the raw PC.
   * HLE: Fixed black status pane in Pole Position due to incorrect attract mode handling.
   * HLE: Fixed startup path problems that prevented SpartaDOS X from starting.
   * HLE: Screen handler now adjusts user memory limit.
   * HLE: Fixed length return value bug in CIO put characters command.
   * HLE: Control codes now work with S:.
   * Disk: Fixed CIO return codes for H: handler.
   * Cartridge: Cart bank is now reset on cold reset.
   * Cartridge: Fixed banking and recognition problems with MaxFlash 1M cartridge format.
   * CPU: Added option to halt on BRK instructions.
   * GTIA: Fixed nasty bug where P/M collisions got messed up whenever the simulator dropped a frame.
   * GTIA: Fixed behavior of sprites when repositioned during active region.
   * GTIA: Implemented text blink and vertical reflect bits.
   * GTIA: Fixed low bit in PAL register in NTSC mode.

Version 1.1 [May 12, 2009]:
   [features added]
   * CPU: Added an option to disable illegal opcode support.
   * Disk: Added .XFD support.
   * Disk: Added rudimentary hard disk (H:) support.
   * UI: Added exception handler to write crash information.
   * UI: F8 now also breaks into the debugger.
   * UI: Fixed some window activation issues in the docking system.
   * UI: Display is now locked to correct aspect ratio.
   * UI: Dockable panes are now based on percentage rather than absolute width.
   * UI: Changed location of Registry key to work around antivirus false positives.
   * Cartridge: Added support for cartridge images that have headers.
   * Cartridge: Added support for MaxFlash 128K and 1M cartridge formats.
   * Debugger: F5/F8/F9/F10/Shift+F10 now work.
   * Debugger: Frames are now double-clickable in the call stack window.
   * Debugger: F10 now works in the console command line.
   * Debugger: Added history window.
   * HLE: Rewrote HLE kernel mode to be based off the LLE kernel for better compatibility.

   [bugs fixed]
   * Simulator: Init and run vectors are now implemented properly -- fixes New Year's Miracle demo.
   * Simulator: $FFFF optional headers in executables no longer produce load errors.
   * Kernel: DRKMSK was not set -- fixes missing status bar in The Last Word.
   * Debugger: The start of instruction PC is now reported instead of the CPU raw internal PC.
   * Debugger: Fixed infinite loop when viewing disassembly beyond $FFFF.
   * Debugger: Disassembly view edit window now works.
   * Debugger: Fixed a cycle being lost by the CPU on each step or breakpoint hit.
   * Debugger: Console window now scrolls to bottom when updating.
   * UI: Implemented some Ctrl+Key combinations.
   * UI: Fixed jittering problems in full-screen mode.
   * UI: Fixed some focus problems when docking and undocking panes.
   * UI: Full-screen mode no longer shows window borders when using GDI or DirectDraw for display.
   * UI: Removed horizontal and vertical blank regions from display window.
   * UI: Caps Lock now works.
   * UI: Mouse pointer is now hidden in full-screen mode.
   * Disk: Improved disk emulation compatibility with SpartaDOS X.
   * Disk: Fixed corruption of first byte on sector writes.
   * Pokey: Added missing channel 2+4 high pass filter.
   * Pokey: Fixed off-by-one in 1.79MHz 16-bit timing that screwed up some demos using 4-bit polynomial beats.
   * Pokey: Pot scanning is now implemented.
   * GTIA: Color mixing with PRIOR D0-D3=0 now works.
   * GTIA: Fixed incorrect luminance for background in 16 color mode.
   * GTIA: Fixed player/playfield priorities in 9 color mode.
   * GTIA: Fifth player now mixes in PF3 color properly in 16 color/luma modes.
   * GTIA: Color registers no longer have four luma bits.
   * GTIA: ANTIC modes other than 2, 3, and F now work with GTIA modes.
   * GTIA: Implemented psuedo-mode-E caused by resetting the GTIA mode mid-scanline.
   * GTIA: Collisions now register in 9 color mode.
   * GTIA: Implemented one color clock shift in 9 color mode.
   * GTIA: Changing HSCROL in the middle of a mode line now works.
   * ANTIC: Corrected WSYNC, DLI, and VBI timing.
   * CPU: Fixed instruction timing for read-modify-write opcodes using abs,X addressing.

Version 1.0:
   * Initial release.