Read Me
QA2
A Qt-based Apple //e emulator written in C++.
Copyright 2018-2026 by Brandon LaCava
https://sourceforge.net/projects/qa2/
Features:
* Cross-platform, based on Qt.
* Clean, commented, understandable C++ code, with full Doxygen markup.
* All text and graphics modes emulated, as well as audio.
* DSK (DOS or ProDOS ordering), NIB, and 2MB format support.
* Several archive formats supported: ZIP, 7Z, BZIP2, RAR, TGZ.
* Gamepads supported for joystick emulation.
* Serial/Parallel port emulation via serial and telnet.
* Save machine state to file.
* Mouse.
* No-Slot-Clock.
* Mockingboard A.
* Extended 80-col card with RAM up to 16MB.
* RamFactor with RAM up to 8MB.
* Visual debugger.
* RESTful API for easy remote manipulation.
* MIT-licensed source code.
Disk image loading
==================
Load disk images via the preferences dialog, or right click on the
disk controller icon for the appropriate slot in the bottom right
corner.
If loading from an archive file (zip, tgz, etc...) it will load the first
disk image file it finds inside the archive. Disk images inside archives
are considered read-only.
Use the ProdosBlockDevice peripheral card to load images > 140k.
No Slot Clock
=============
No Slot Clock is mapped to the C8 ROM space.
Enable it via the Add-ons tab in the preferences dialog.
Key mappings
============
Common
------
F1 -> Help
F2 -> Reset
F4 -> Emulator Run
F5 -> Emulator Pause
F12 -> Toggle Debugger
Shift+Up -> Joystick Up
Shift+Down -> Joystick Down
Shift+Left -> Joystick Left
Shift+Right -> Joystick Right
Linux
-----
LeftControl -> Ctrl
RightControl -> Ctrl
LeftAlt -> OpenApple
RightAlt -> ClosedApple
Windows
-------
LeftControl -> Ctrl
RightControl -> Ctrl
LeftAlt -> OpenApple
RightAlt -> ClosedApple
Mac
---
LeftControl -> Ctrl
RightControl -> Ctrl
LeftOption -> OpenApple
RightOption -> ClosedApple
REST API
========
You can use these REST commands to control the machine remotely at runtime.
This is very useful for A2 development, especially assembly language.
Default port is 5555, you can change it in the app preferences.
Set memory block
----------------
PUT
http://localhost:5555/api/setmem/<ADDR>
Body contains binary data blob
Data will be copied to A2 <ADDR>
Example:
curl -X PUT --data-binary "@file.bin" -H "Content-Type: application/octet-stream" "http://localhost:5555/api/setmem/0x300"
Set PC
----------------
PUT
http://localhost:5555/api/setpc/<ADDR>
PC will be set to A2 <ADDR>
Example:
curl -X PUT http://localhost:5555/api/setpc/0x300
Execute code
----------------
PUT
http://localhost:5555/api/exec/<ADDR>
Body contains binary data blob
Data will be copied to A2 <ADDR> and PC set to A2 <ADDR>
Example:
curl -X PUT --data-binary "@file.bin" -H "Content-Type: application/octet-stream" "http://localhost:5555/api/exec/0x300"