Plans for future versions
=========================

Keyboard and controllers
------------------------

* map host joysticks to Atari ports in the emulation core in order to make
  the configuration available in UI and config file

* pass the state of all host keys to the emulation core in order to configure
  keysticks in UI and config file

* standardize key mappings in all ports (making host and Atari layouts
  available everywhere)

* emulate POKEY keyboard scanning (with optional debouncing)

* enhance support for pointing devices, including touch screens;
  "directmouse" should work in more ports, support light pen/gun
  and correct mirroring of pad/touch/koala

* Atari Keyboard Interface (AKI) emulation


Emulation core
--------------

* Java midlet

* cycle-exact POKEY interrupts (timers, serial I/O, keyboard)

* precisely emulate serial I/O rates

* emulate POKEY reset (via SKCTL)

* more accurate frame rates (for example 49.8607456 instead of 50 Hz in PAL)

* improve VAPI and .PRO support

* emulate POKEY SIO shift register

* emulate SIO bus lines, and SIO cable data/audio cross-talk "feep" sound

* redirection of specific Dn: devices to Hn: (for software that supports
  only the D: device)

* log POKEY audio writes, SIO commands (hardware level or DCB level),
  executed Display List commands, all activity to a defined range
  of adressess etc. in a way similar to the 6502 trace

* log events that affect software compatibility: undocumented 6502 opcodes,
  unofficial system calls (including the 5200), extended memory access

* emulate drives at the hardware level (810, 1050, XF551.) use code from other
  emulators which does this.  (drive rotation, FM/MFM raw bits).  WDCxxxx
  controller.  RIOT chip.  6507.  Intel 8048-line chip for the XFD551.
  Use emulated SIO line for bit-banging.  Emulate Drive upgrades (Happy etc.)
  Emulate 3rd party drives (Rana, Karin Maxi etc.)

* sound effects.  Drive retracking noise (BlueMSX has.)  Motor whine.
  On/off switch sound.  Physical key-press sounds.  Cartridge slot sounds.
  Drive door sounds. Floppy rotation flap sound.

* Atari vapourware emulation. XEM (see below). 1090.
  1060 CP/M (sweet-pea.)

* emulate the 850 interface at the hardware level.

* ATR-8000 emulation.  ATR-8500.
  Adapt an existing CPM emulator.

* 6502 BRK bug

* try to understand 6502's "unstable" opcodes (0x93, 0x9b, 0x9f) that seem
  to have unpredictable (at least not easily predictable) results,
  preferrably by studying 6502 schematics

* an option to emulate the variant of 6502 used in new XE machines
  (which lacks most of the undocumented opcodes of the classic 6502)

* fully emulate executing 6502 code from Hardware, cycle-exact ANTIC_load
  from hardware, cycle-exact PMG flickering bus data

* CPU upgrades (65816, etc)

* emulate printer graphics (on screen or bitmap/PDF output): 1029, 1020, etc.
  The Mac OS X port of Atari800 has lots of printer emulation routines.

* RAM Carts (cartridges with battery-powered RAM), writes to flash carts

* serial "network" interfaces (e.g. 8 Ataris connected, is it GameLink?)

* ability to play multi-player games across network

* generate hard disk images or write directly to media that the 8-bit Ataris
  can use, like CompactFlash or MyIDE/SmartIDE/BB

* "Turbo" cassette upgrades (Turbo 2000 etc.)

* cassette emulation of WAV files.  Load a WAV file like WAV2CAS does. Save
  to a WAV file or real cassette like CAS2WAV does.  Load voice-and-data
  combined programmed audio tape images from WAV files.  Support compressed
  (lossless? lossy even?) tape sound images.

* disk auto-flip.  Examine screen data for text string "Insert Side B
  and press any key/fire/return." Flip disk, print on-screen message and
  optionally press key. More a core feature than UI. Requires a database.

* support physical floppy media (hard, port-specific and not very useful)

* support physical Atari drives (hard, port-specific and not very useful)

* improve the event recording.  Avoid cycle-exact RANDOM?


Graphics
--------

* investigate different palettes for different models such as GTIA vs CTIA
  or 400/800, 1200XL, 800XL, XE, 5200, hardware modifications to the colour
  circuts etc.

* SECAM palette and video emulation.

* "flicker fixer": display average pixel values of last two Atari frames

* use YUV output if available. Will it help?

* PAL emulation. VICE has it, but it's not as complete as Blargg's emulation
  of NTSC. PAL luma/chroma artifacts are missing (it is like S-Video).
  Blargg's optimization technique won't work so easily for PAL.
  (perry: I have a hack of Blargg's slow version of the NTSC emulator that
  I tried to make work for PAL.  But it isn't quite right and is way too slow.
  Ask me if you are interested.)

* the NTSC emulator should support other resolutions. It should be supported
  in all possible ports.

* fix the remaining bugs in the NTSC emulation.  Artificating colours are
  not quite right.  odd-even and even-odd combined artifacts (light red
  and light green) do not show unless Gaussian factor is changed a lot,
  which causes even worse artifacts.  Fully document the Atari's video
  output signal (might require a scope.)  Fully document NTSC decoding
  of late 70's and 80's era TVs.

* document CTIA and emulate properly.  Emulate the players not aligning
  with playfield bug/feature of CTIA which is said to exist. Need
  at least screenshots of a CTIA Atari showing all possible artifacts.

* an option to emulate the buggy GTIA chip found in new XE machines.

* fix all remaining collision bugs in the ANTIC and GTIA code (border+scroll,
  player HPOS and GRAF changes, partial_scanline changes.) Use the technique
  of saving data that might generate false collisions, drawing, and then
  restoring the data (pm_scanline).

* cycle-exact DMACTL and HSCROL including all glitches

* ANTIC glitch:
  POKE 39974,18:POKE 39975,8:POKE 54276,15
  or
  POKE 39974,18:POKE 39975,40:POKE 54276,15:POKE 54277,15

* Video Board XE emulation


Sound
-----

* correctly emulate serial I/O sound

* one POKEY sound engine

* include sound settings in the emulation core (command line options,
  config file, UI) and make it possible to change them at runtime

* support WAV files in configurations with no live sound

* an option to auto-enable stereo when an Atari program uses it

* Covox emulation

* 2 POKEY mono, 4 POKEY stereo, 4 POKEY quad

* MIDI <> serial port interface.  In it's simplest form there's only MIDI
  output from the Atari.  The more complicated version is enabled by the motor
  control line and includes two MIDI outputs selected by the command control
  line and one MIDI input.  There is a MIDI composer program for Atari.

* A/D Converter - 4-bit sampler that returns 0xf0-0xff in the 0xd500-0xd5ff
  address space.

* XEM AMY-1 Chip.  This is a huge project.  Schematics (netlist)
  are said to exist. Prototyping software for the PC (connected to parallel
  port) is available online. Datasheet is online. Need netlist for AMY-1,
  schematics for XEM and any software.

* SID chip


User Interface
--------------

* make sure all command-line options are available in UI and config file

* error messages should appear on screen and not in the log

* on screen display, like a TV remote, for the NTSC (or other) screen filter.

* support pointing devices (mouse, touch screen) in UI

* a database to identify programs and choose appropriate settings.
  OS version.  Memory size.  Memory expansion type.  Peripherals.
  Machine type.  Joystick/Trackball/Paddle etc. controller type.
  Artifacting mode.  SIO patch compatibility. Even if compatible with
  SIO patch, loading screen graphics are often interesting to watch, so
  give the user an option to view or ignore them if present. If not
  SIO patch compatible, optional warp-speed through the loading.
  Keyboard layout. Advisories as to bad dump/bad image/special considerations
  Provide documentation, box scan, label scan for the program
  PAL/NTSC mode. Database should indicate PAL/NTSC
  compatibility, and which system the program was originally designed for.
  Allow PAL users to prefer PAL for NTSC-designed programs, but NTSC users
  to prefer NTSC.  NTSC users get PAL (or fake NTSC-upgraded-to-PAL) for
  all PAL-designed programs (Except perhaps very old ones like English
  Software titles that NTSC users might remember.) PAL users get NTSC
  video only for artifacting programs.


Clean up
--------

* make port-specific features available in other ports - now many features
  work only in SDL, Mac OS X or Win PLus

* clean up the "util" directory - remove obsolete files, write one-file
  documentation for all utils

* make documentation consistent across systems (HTML?)

* further clean up in the directory structure - port specific files should
  be hidden in their subfolders (falcon, amiga, ...)


Speed optimizations
-------------------

* use a boolean variable to disable 6502 history tracking and breakpoints
  (even with MONITOR_BREAKPOINTS and MONITOR_TRACE it should be
  faster than currently with just the default MONITOR_BREAK)

* use function pointer table for hardware registers (like PAGED_ATTRIB does)

* 6502 emulation optimizations: limit number of CPU_GO() calls (call ANTIC/GTIA
  routines from 6502 and not vice-versa), use ints instead of UWORD and UBYTE,
  merge N and Z flags into one variable, put 6502 flags into local variables
  so they can be stored in registers;
  see http://asap.sourceforge.net for a 6502 emulator which includes these
  optimizations

* use patches for common routines such as OS interrupt handlers

* make some hardware registers directly available in memory[]

* write versions of draw_antic_* functions for the common case when there are
  no sprites in the current scanline

* update color lookup tables only when color registers change

* automatic framedrop

* fast bank switching (without memcpy)

* implement Dirty Spans (see HOWTO-DIRTYSPAN)

* an option to detect popular lengthy Atari decompression routines
  and run equivalent C routines instead


R: device
---------

* clean up and comment the code

* improve portability

* documentation

* automatic test (similar to hdevtest.lst for H:)

* identify security problems

* TCP port should be configurable (currently hardwired to 9000). The switch
  between real serial port and TCP port should be put there. Something
  along the following lines:
  R_SERIAL = 1
  R_SERPORT = /dev/ttyS0
  R_NETPORT = 9000
