zxian 32
    a ZX Spectrum emulator written by Sebastian Mihai

I chose to emulate the ZX Spectrum because it introduced me to software development. 

The easiest way to use zxian is via zxianui, which is a friendlier, UI-based starter - as opposed to zxian's command line-only interface. However, more advanced configuration is only available via zxian's command line. Read the file usage.txt for a list of all available command line switches.

The most recent version supports Z80 snapshots, SNA snapshots, and TAP tape images.
If a tape image is loaded:
    - the tape controls user interface is shown at the bottom of the window
    - user can select "turbo" mode loading, which greatly speeds up the loading process
    - at startup the emulator automatically keys in:
        LOAD "" followed by ENTER, awaiting tape play

The emulator also supports loading and saving of state via shortcut keys. See keys listing further in this document for how to load and save state.

Zxian supports game controllers. See the "Game controller" section below.

Versions 1 through 19 are compiled exclusively to 32bit.
Versions 20 and later are compiled exclusively to 64bit.

Version changes:
   v32 - improved timing accuracy by introducing memory/IO contention
         fixed incorrect (too slow) timing of CB prefix opcodes
         the above changes improved gameplay of games such as Manic Miner
         the above changes improved audio fidelity of games such as Skool Daze
   v31 - fixed a long-standing sound sampling bug due to a rounding error
         increased the number of audio oversamples
         the above changes improved sound quality and reduced resyncs
         improved CPU timing and how it deals with tstate overruns
         this fixes games such as Mask III
         added a history selector (recently-loaded files) to the UI
   v30 - added support for loading and saving Z80 snapshots
         fixed a bug whereby IM0 did not behave like IM1
   v29 - added support for game controllers, with re-mapping and autofire
         rewrote rewind functionality to allow for multiple rewinds
   v28 - added support for sound volume control
   v27 - added support for emulation rewinding
   v26 - added a button which plays a single tape block, for multi-load games
         removed clicking noises heard during tape loading
   v25 - fixed a bug which sometimes deteriorated sound quality at high
         sample rates
         improved sound quality via oversampling
         screenshots now no longer include UIs elements (e.g. poke UI)
   v24 - corrected R register behaviour (7bit counter instead of 8bit)
         this fixes games such as Robin of the Wood, Ping Pong, Sanxion
   v23 - fixed a border rendering bug after fast tape loading finishes
         fixed a TAP loading bug concerning custom-length header blocks
         this fixes games such as Lemmings
   v22 - added support for saving SNA snapshots
   v21 - added support for more options to the UI
         fixed a border rendering bug in fullscreen display modes
         fixed minor scanlines effect bugs
   v20 - transition to 64bit
   v19 - optimizations: reduced host CPU usage by 75%-90% of previous version
   v18 - added zxianui, a friendlier, UI-based zxian starter
   v17 - added support for taking screenshots
   v16 - added support for CRT scanlines effect
         fixed a slowdown issue when using accelerated renderer
         removed an overly eager optimization which impacted CPU-screen sync
         this fixes games where graphics are updated multiple times per
         frame such as Dizzy 7
   v15 - added fullscreen support
   v14 - sound improvements via variable sync
         this fixes sustained tones (such as the BEEP command in BASIC)
   v13 - optimizations: reduced host CPU usage by 85%
   v12 - CPU microcode fix: R register behaviour
         this unfreezes some games which rely on R for timing, 
         like Defender of the Crown
         CPU microcode fix: DD/FD prefix opcodes fall-through to unprefixed
         cleaner application shutdown
   v11 - added support for saving and loading state
         added a UI which allows memory modification (pokes)
   v10 - fixed an interrupt bug which allowed reentrancy
         this fixes games such as Zynaps
    v9 - fixed an overflow bug which deteriorated sound after 20 minutes
    v8 - tape UI improvements: current block size and progress
         sound improvements: configurability and parameter tweaks
    v7 - added support for frame skipping
         improved sound quality and configurability
    v6 - significantly improved audio quality
         added support for TAP tape images
    v5 - video frame duration can now be specified in milliseconds
         rewrote the "read key status" code to fix a bug
         this fixes games such as Manic Miner
    v4 - support for "floating bus", whereby data read by ULA can "leak"
         into hardware ports that are not wired, such as 0xFF
         some games rely on this for timing, instead of an interrupt handler
         this fixes games such as Cobra and Arkanoid
    v3 - improved game compatibility by supplying a well-known value for the
         LSB during IM2 handler lookup; previous behaviour can be attained
         through a switch
         this fixes games such as Dizzy 7
    v2 - fixed an SNA loading bug caused by incorrect IFF2 initialization
         it was causing some games to soft reset, and some to have
         corrupted graphics
    v1 - initial release

Keys:
    LEFT SHIFT KEY - ZX Spectrum's caps shift key
    RIGHT SHIFT KEY - ZX Spectrum's symbol shift key
    
    F1..F4 KEYS - load state from slot 0..3
    F5..F8 KEYS - save state to slot 0..3
    
    F11 - save SNA snapshot; by design, snapshots can save corrupted,
          depending on the state of program and CPU
    F12 - save Z80 snapshot; this is the preferred snapshot format
    
    PRINT SCREEN KEY - takes a screenshot
    
    [ KEY - sound volume down
    ] KEY - sound volume up
    
    BACKSPACE - rewinds emulation by few seconds
    
Kempston joystick:
    UP - up arrow
    DOWN - down arrow
    LEFT - left arrow
    RIGHT - right arrow
    FIRE - left control key

Game controller:
If a controller is plugged in prior to zxian starting, zxian will use it as a kempston joystick by default.
A controller configuration file can be specified to zxian, which can reconfigure controller buttons to other inputs. For example, the controller can be configured to act as an interface 2 joystick, or a cursor/Protek/AGF joystick, or even the popular QAOP M/space key setup.
Read the files inside the controller\ directory to see how you can make your own config file - or use or modify the ones supplied with zxian.
