POM2
POM2 emulates Apple II. It reads 16 files, none of them required: it starts games without them.
The app reads its files from this folder:
%LOCALAPPDATA%/POM2/
Searched before the files shipped beside the executable.
Source: src/ResourcePaths.cpp:95-124
~/
Searched before the files shipped in the bundle.
Source: src/ResourcePaths.cpp:95-124
$XDG_DATA_HOME/POM2/
~/.local/share/POM2 when XDG_DATA_HOME is unset. Searched before the install tree.
Source: src/ResourcePaths.cpp:95-124
About this profile
Technical notes
Apple ][, ][+, //e, //c and //c+ emulator by Arnaud Verhille, C++ with an
ImGui frontend, plus a browser build and a headless CLI. Nine machine
profiles (src/SystemProfile.cpp:32-305): Apple ][ Original, ][+, //e
Unenhanced, //e Enhanced, //c, //c Plus, and PAL variants of the //e
Unenhanced, //e Enhanced (the default) and //c (Le Chat Mauve).
Every file is looked up by a relative name through findResource
(src/ResourcePaths.cpp:178-251): the per-user data directory
(~/.local/share/POM2, ~/Library/Application Support/POM2,
%LOCALAPPDATA%\POM2) when it really is per-user, the executable
directory, its parent, ../share/POM2, the temp fallback data directory
otherwise, then the working directory and its two parents. The first hit
wins. Release packages ship the whole roms/ tree, the fonts, the About
photo, the two keyboard photos and the pic/retro artwork
(packaging/bundle.manifest:39, 50-61).
Machine firmware is a probe chain per profile, first name found wins
(SystemProfile.cpp romProbeOrder, src/ProfileSwitch.cpp:136-154):
][ Original apple2o.rom, apple2.rom
][+ apple2p.rom, apple2.rom
//e Unenhanced apple2e_unenh.rom, 342-0135-b.64.rom, apple2e.rom
//e Enhanced apple2e.rom
//c apple2c-32Kv0.rom, apple2c-16K.rom, 3420033a.256
//c Plus apple2cp.rom, apple2c-plus.rom, apple2c-32Kv0.rom
With no candidate the machine runs on a $D000-$FFFF stub and the Welcome
panel opens (src/MainWindow.cpp:334-342). A first run with no //e image
falls back to the ][+ chain (src/MainWindow.cpp:239-252).
Memory::loadAppleIIRom (src/Memory.cpp:175-262) maps 12 KB at $D000,
16 KB at $C000, skips the 4 KB pad of a 20 KB ][+ dump, and slices a
32 KB dump by profile: //e images carry the firmware in the upper half,
//c and //c+ images are two firmware banks with bank 0 in the lower half
(src/SystemProfile.cpp:432).
Character generators follow charRomProbeOrder per profile, or the locale
picked in the toolbar (src/CharRomCatalog.cpp:42-91,
src/ProfileSwitch.cpp:156-162). Memory::loadCharRom accepts 2 KB, 4 KB
and 8 KB dumps (src/Memory.cpp:343-376). An 8 KB dump is two 4 KB banks,
loaded as one bank or kept dual-bank with annunciator 2 selecting the
live set.
Peripheral ROMs are read when the card is plugged (src/SlotCardFactory.cpp).
The Disk II carries the 341-0027-A boot PROM and the 16-sector P6
sequencer built in (src/DiskIICard.cpp:136-149). CFFA, Liron,
Workstation, the MC68705 mouse card, the 1981 Grappler, the Apple
Parallel Interface, the Videx Videoterm and the Apple Memory Expansion
Card leave the slot empty without their dump. Grappler+, ThunderClock+
and the Super Serial Card run a synthetic ROM instead, and TransWarp
accelerates without its boot firmware. The catalogue behind the ROM Status panel (src/RomCatalog.h)
lists every name in probe order with the size the loader enforces,
what a missing dump costs (degraded, card unavailable, unused) and,
where POM2 vouches for a dump, its CRC32. The panel hashes each present
file (src/, 404) and lists the Virtual ][
recordings with a decode check (src/).
Help > Download missing ROMs (src/RomFetch.cpp:68-301) fetches 45 files,
43 distinct dumps, with curl from raw.githubusercontent.com/Abdess/retrobios,
pinned to HTTPS (src/RomFetch.cpp:734-750). Every entry carries a
SHA-256, fourteen a CRC32 as well, and a download is installed only when its
size, CRC32 and SHA-256 match (src/RomFetch.cpp:631-667). A present file
is re-checked with the same gate and, when it is not the catalogued dump,
replaced after a copy to roms-replaced/ under the data directory
(src/RomFetch.cpp:581-629, 840-860, 869-887). A 12 KB apple2p.rom is the
one alternate size kept as is. Nine entries are members of MAME romsets,
read in-process (src/ZipMember.cpp): apple2e_unenh.rom is 342-0135-b.64
then 342-0134-a.64 from apple2e.zip, mouse_341-0270-c.bin is
341-0270-c.4b from a2mouse.zip, ssc_341-0065-a.bin is 341-0065-a.bin from
a2ssc.zip, grappler_eps-1.bin is eps-1_c1981.u6 from a2grappler.zip,
341-0057.bin is 341-0057.7b from a2pic.zip, and the four Videoterm files
come from a2vidtrm.zip. Downloads land in the per-user data directory's
roms/ (src/RomFetch.cpp:808-828). Unavailable in the browser build
(src/RomFetch.cpp:932-937).
The floppy mechanical sounds are MAME's samples/floppy set, read from
roms/floppy_samples/ as two banks of ten WAV files prefixed 525_ and 35_
(src/, src/MainWindow.cpp:351-364). A
missing sample is logged and the drive stays silent. A second bank, the
Virtual ][ recordings, is read from the folder picked with Import
sounds in the audio mixer, stored as mechanical_sound_path
(src/), then from roms/virtual_ii_sons/,
and on macOS from Virtual ][.app/Contents/Resources/ under /Applications
and ~/Applications (src/MainWindow.cpp:365-381,
src/): eight drive and switch takes under
lecteur/ and interface/ (src/) and one
printer loop under imprimante/ (src/). The
bank is selectable once Disk Rotation, Move arm, Disk Insertion and Disk
Removal have loaded (src/). Each take is
tried under its path, then an .aiff path as .wav, then the bare file
name, then the bare name with .aiff turned into .wav or .wav into .raw,
so a Virtual ][ Contents/Resources/ folder is read as it is
(src/, src/).
The packaging manifest keeps the directory out of release packages
(packaging/).
The nine takes come from Contents/Resources/ of Virtual ][.app in
VirtualII.dmg, the free download on virtualii.com (Virtual ][ 13.3).
The five .aiff files are copied unchanged. The four .wav files are the
headerless Boot.raw, Disk Rotation.raw, I-O Error.raw and Matrix
Printer.raw behind a 44-byte RIFF header, the data chunk being the .raw
file byte for byte. The header states PCM, one channel, 44100 Hz, signed
16-bit little-endian. That is the stream Virtual ][ builds for these
files: every playWithSoundFile:sampleRate:sampleSize: call passes 44100.0
and 16, and SoundRepeater fills an lpcm AudioStreamBasicDescription with
one channel, the signed-integer flag for 16 bits and no big-endian flag.
POM2 decodes the takes through miniaudio into mono float at the file's
own rate. An .aiff whose FORM chunk declares more bytes than the file
holds is rejected. A file miniaudio refuses is read as mono signed 16-bit
little-endian 44100 Hz when it ends in .raw, and through AudioToolbox
on macOS when it ends in .aiff (src/,
src/, src/).
The screen sits in a Monitor II bezel, pic/retro/monitor/monitor2.png,
on by default (src/), and the Drives window
shows a picture per drive state from pic/retro/drives/
(src/RetroArtwork.cpp:44-91, src/).
Without a picture the screen has no bezel and the drive is drawn as a
vector mechanism (src/DriveRack_ImGui.cpp:57-61). The FujiNet card runs
FujiNet-PC Apple v1.5.2, a separate program the release packages carry
under fujinet-pc-APPLE/<platform>/ (src/FujiNetRuntime.cpp:38-62,
packaging/).
Media named by the code are not firmware and are not listed here: the
browser demo boots bundled_disks/DIX-fix.po on the //c PAL preset
(wasm/shell.html:114-117, src/main.cpp:313-319), and the headless CLI
mounts disks_5.4/dos33_master.dsk by default
(src/pom2_headless.cpp:265-267). Disk, tape and hard-disk images are
browsed from disks_5.4/, disks_3.5/, hdv/, floppyemu/, bundled_disks/,
cassettes/ and prodos_folder/ next to the executable.
16 files: 0 required, 16 optional. 81 more files come with the app.
By kind: 46 BIOS and 51 game data.
In this collection: 16 in repo and 0 missing.
Optional
Section titled “Optional”| File | Status | Hash |
|---|---|---|
ssc_341-0065-a.binApple Super Serial Card EPROM 341-0065-A, MAME a2ssc
Hashes, validation and source
| in repo | CRC32 b7539d4c |
grappler_eps-1.binOrange Micro Grappler EPROM, the 1981 card, MAME a2grappler
Hashes, validation and source
| in repo | CRC32 862773cb |
341-0057.binApple Parallel Interface Card PROM 341-0057, MAME a2pic
Hashes, validation and source
| in repo | CRC32 0a6b084b |
videx_videoterm_v24_60hz.binVidex Videoterm firmware v2.4 with the 60 Hz CRTC table, 2 KB, MAME a2videoterm 6.ic6.bin
Hashes, priority, validation and more
| in repo | CRC32 5776fa24 |
videx_videoterm_v24_50hz.binVidex Videoterm firmware v2.4 with the 50 Hz CRTC table, 1 KB, MAME a2videoterm videx videoterm rom 2.4.bin
Hashes, priority, validation and more
| in repo | CRC32 bbe3bb28 |
videx_videoterm_char_normal.binVidex Videoterm character ROM, normal set, MAME a2videoterm
Hashes, validation and source
| in repo | CRC32 87f89f08 |
videx_videoterm_char_inverse.binVidex Videoterm character ROM, inverse set, MAME a2videoterm 4.ic4.bin
Hashes, validation and source
| in repo | CRC32 8a497a48 |
Game data
Section titled “Game data”| File | Status | Hash |
|---|---|---|
Disk Rotation.wavVirtual ][ recording, drive motor loop
Hashes and source
| optional in repo game data | SHA1 553e664b2f41 |
Boot.wavVirtual ][ recording, boot one-shot
Hashes and source
| optional in repo game data | SHA1 15c674685554 |
Move arm.aiffVirtual ][ recording, head arm step
Hashes and source
| optional in repo game data | SHA1 3e03cfef6a32 |
Disk Insertion.aiffVirtual ][ recording, drive lid, disk inserted
Hashes and source
| optional in repo game data | SHA1 3da6c2e5986c |
Disk Removal.aiffVirtual ][ recording, drive lid, disk removed
Hashes and source
| optional in repo game data | SHA1 9c33c1c1d793 |
I-O Error.wavVirtual ][ recording, read error one-shot
Hashes and source
| optional in repo game data | SHA1 464e3d8f9b50 |
PopOn2.aiffVirtual ][ recording, power switch on
Hashes and source
| optional in repo game data | SHA1 7473f2ade668 |
PopOff2.aiffVirtual ][ recording, power switch off
Hashes and source
| optional in repo game data | SHA1 60b4b8bb589b |
Matrix Printer.wavVirtual ][ recording, dot-matrix printer loop
Hashes and source
| optional in repo game data | SHA1 0b0363772efc |
Comes with the app
Section titled “Comes with the app”| File | Status | Hash |
|---|---|---|
apple2o.romApple ][ Original monitor and Integer BASIC, $D000-$FFFF
Hashes, priority, validation and more
| - | SHA1 78008be557f6 |
apple2.romApple ][ generic 12 KB fallback, Autostart monitor and Applesoft
Hashes, priority, validation and more
| - | SHA1 33a24f5489ba |
apple2p.romApple ][+ Autostart monitor and Applesoft, 4 KB pad then $C000-$FFFF
Hashes, priority, validation and more
| - | SHA1 29a53f3bb158 |
apple2e.romApple //e Enhanced firmware, 32 KB dump with the 16 KB firmware in the upper half
Hashes, priority, validation and more
| - | SHA1 d756eba578a6 |
apple2e_unenh.romApple //e Unenhanced firmware, 4 KB internal $Cx00 ROM then $D000-$FFFF
Hashes, priority, validation and more
| - | SHA1 61fa9254628e |
apple2c-32Kv0.romApple //c two-bank firmware, bank 0 in the lower 16 KB
Hashes, priority, validation and more
| - | CRC32 323952d1 |
apple2c-16K.romApple //c ROM 255, 16 KB, MAME apple2c a2c.128
Hashes, priority, validation and more
| - | CRC32 f0edaa1b |
3420033a.256Apple //c ROM 0, UniDisk 3.5 firmware, MAME apple2c0 342-0033-A
Hashes, priority, validation and more
| - | CRC32 c8b979b3 |
apple2cp.romApple //c Plus two-bank firmware, MAME apple2cp 341-0625-a.256
Hashes, priority, validation and more
| - | CRC32 0b996420 |
apple2_char.romApple ][ and ][+ character generator, 2 KB uppercase set
Hashes, priority, validation and more
| - | SHA1 f9d312f128c9 |
apple2e_char.romApple //e Enhanced character generator 342-0265-A, 4 KB with MouseText
Hashes, priority, validation and more
| - | SHA1 b2b5d87f5269 |
apple2e_char_us_unenh.romApple //e Unenhanced character generator 342-0133-A, 4 KB
Hashes, priority, validation and more
| - | SHA1 58ad0008df72 |
apple2e_char_fr.romApple //e French character generator, 4 KB
Hashes, validation and source
| - | CRC32 ab0be706 |
apple2e_char_frca.romApple //e French Canadian Enhanced character generator, 4 KB
Hashes, validation and source
| - | CRC32 2c8fc403 |
apple2e_char_uk.romApple //e UK Enhanced character generator 342-0273-A, 4 KB
Hashes, validation and source
| - | CRC32 dda11653 |
apple2e_char_uk_unenh.romApple //e UK Unenhanced character generator 341-0160-A, 4 KB
Hashes, validation and source
| - | CRC32 7a9a91ef |
apple2e_char_de.romApple //e German character generator 341-0161-A, 4 KB
Hashes, validation and source
| - | CRC32 0d72f153 |
apple2e_char_de_improved.romApple //e German Improved character generator, 4 KB
Hashes, validation and source
| - | CRC32 d345d332 |
342-0274-a.e9Apple //e international video ROM 342-0274-A, 8 KB, French Canadian bank then US bank, MAME apple2eefr
Hashes, validation and source
| - | CRC32 8f342081 |
apple2e_char_ft_blockascii.romFrench Touch Block ASCII dual-bank character generator, 8 KB
Hashes, validation and source
| - | CRC32 1eae3944 |
apple2e_char_us_mt_iigs.romApple //e US Enhanced character generator with the IIgs MouseText glyphs, 4 KB
Hashes, validation and source
| - | CRC32 a68a4f03 |
apple2e_char_reactive.romReActive custom Apple //e character generator, 4 KB
Hashes, validation and source
| - | CRC32 af19aff6 |
Videx Lower Case Chip ROM.binVidex LOWER CASE CHIP character generator for the ][ and ][+, 2 KB
Hashes, validation and source
| - | CRC32 00f68076 |
disk2.romDisk II 16-sector boot PROM 341-0027-A
Hashes, validation and source
| built-in fallback | SHA1 d4181c9f046a |
diskii_p6.romDisk II 16-sector P6 logic state sequencer PROM 341-0028-A
Hashes, validation and source
| built-in fallback | SHA1 bc39fbd5b9a8 |
disk2_13.romDisk II 13-sector boot PROM 341-0009
Hashes, validation and source
| - | SHA1 afd060e6f35f |
diskii_p6_13.romDisk II 13-sector P6 logic state sequencer PROM 341-0010
Hashes, validation and source
| - | SHA1 e3d6d1c30653 |
cffa20eec02.binCFFA 2.0 firmware, 65C02 build
Hashes, validation and source
| - | CRC32 fb3726f8 |
cffa20ee02.binCFFA 2.0 firmware, 6502 build
Hashes, validation and source
| - | CRC32 3ecafce5 |
mouse_341-0270-c.binAppleMouse II card slot EPROM 341-0270-C
Hashes, validation and source
| - | SHA1 3a9d881a8a8d |
mouse_341-0269.binAppleMouse II card MC68705P3 MCU mask ROM 341-0269
Hashes, validation and source
| - | SHA1 3a2baa6648ef |
grappler_plus.binOrange Micro Grappler+ parallel printer EPROM 3.2
Hashes, validation and source
| - | SHA1 829072cc19a5 |
ae_transwarp_1.4.binApplied Engineering TransWarp accelerator ROM v1.4, MAME warprom
Hashes, validation and source
| - | CRC32 afe37f55 |
thunderclock_u9_v1.3.binThunderware ThunderClock+ slot ROM rev 1.3, U9
Hashes, validation and source
| - | SHA1 60f434f53258 |
liron.romApple Liron SmartPort controller firmware, 4 KB
Hashes, validation and source
| - | SHA1 fa94ecc2aa23 |
341-0358-A.binApple II Workstation Card firmware 341-0358-A, 64 KB
Hashes, validation and source
| - | CRC32 63819dcb |
slinky_341-0344a.binApple Memory Expansion Card firmware 341-0344A, 4 KB, MAME a2memexp
Hashes, validation and source
| - | CRC32 1e994e17 |
341-0438-a.binApple II 3.5 Disk Controller SuperDrive firmware 341-0438-A, MAME a2superdrive
Hashes, validation and source
| - | CRC32 c73ff25b |
342-0326-a.f12Apple //e French keyboard decode ROM 342-0326-A, MAME apple2eefr
Hashes, validation and source
| - | CRC32 f04970a9 |
525_seek_2ms.wavMAME floppy sample, 5.25 inch drive, 2 ms head seek
Hashes and source
| game data | SHA1 2d046a880476 |
525_seek_6ms.wavMAME floppy sample, 5.25 inch drive, 6 ms head seek
Hashes and source
| game data | SHA1 6f698055fa6e |
525_seek_12ms.wavMAME floppy sample, 5.25 inch drive, 12 ms head seek
Hashes and source
| game data | SHA1 fbbbb5e8724c |
525_seek_20ms.wavMAME floppy sample, 5.25 inch drive, 20 ms head seek
Hashes and source
| game data | SHA1 b6cd14944454 |
525_spin_empty.wavMAME floppy sample, 5.25 inch drive, motor running, no disk
Hashes and source
| game data | SHA1 4b13701d9a7f |
525_spin_loaded.wavMAME floppy sample, 5.25 inch drive, motor running, disk loaded
Hashes and source
| game data | SHA1 875f90538a3f |
525_spin_start_empty.wavMAME floppy sample, 5.25 inch drive, motor start, no disk
Hashes and source
| game data | SHA1 b87d89c4b46c |
525_spin_start_loaded.wavMAME floppy sample, 5.25 inch drive, motor start, disk loaded
Hashes and source
| game data | SHA1 510476098848 |
525_spin_end.wavMAME floppy sample, 5.25 inch drive, motor stop
Hashes and source
| game data | SHA1 f8d9b94c4d92 |
525_step_1_1.wavMAME floppy sample, 5.25 inch drive, single track step
Hashes and source
| game data | SHA1 669ee98fb9fa |
35_seek_2ms.wavMAME floppy sample, 3.5 inch drive, 2 ms head seek
Hashes and source
| game data | SHA1 55caafbd1948 |
35_seek_6ms.wavMAME floppy sample, 3.5 inch drive, 6 ms head seek
Hashes and source
| game data | SHA1 87e5dec269e6 |
35_seek_12ms.wavMAME floppy sample, 3.5 inch drive, 12 ms head seek
Hashes and source
| game data | SHA1 c6b34fc61496 |
35_seek_20ms.wavMAME floppy sample, 3.5 inch drive, 20 ms head seek
Hashes and source
| game data | SHA1 b2fe4c3a4185 |
35_spin_empty.wavMAME floppy sample, 3.5 inch drive, motor running, no disk
Hashes and source
| game data | SHA1 db04fc097bdd |
35_spin_loaded.wavMAME floppy sample, 3.5 inch drive, motor running, disk loaded
Hashes and source
| game data | SHA1 96ce04a5b02a |
35_spin_start_empty.wavMAME floppy sample, 3.5 inch drive, motor start, no disk
Hashes and source
| game data | SHA1 af770fd9261a |
35_spin_start_loaded.wavMAME floppy sample, 3.5 inch drive, motor start, disk loaded
Hashes and source
| game data | SHA1 c82b1714378b |
35_spin_end.wavMAME floppy sample, 3.5 inch drive, motor stop
Hashes and source
| game data | SHA1 a8901b692de1 |
35_step_1_1.wavMAME floppy sample, 3.5 inch drive, single track step
Hashes and source
| game data | SHA1 40d756d0cb5f |
DejaVuSans.ttfDejaVu Sans, the frontend text font
Hashes and source
| game data | SHA1 3061cf7af257 |
fa-solid-900.ttfFont Awesome 6 Free Solid, the frontend icon font
Hashes and source
| game data | SHA1 0c8c9706abc0 |
Apple_II_plus.jpgApple ][+ photograph shown in Help > About
Hashes and source
| game data | SHA1 69358dd49914 |
Keyboard_AppleIIe.jpegApple //e keyboard photograph the clickable keyboard window is built on
Hashes and source
| game data | SHA1 dc85406f7bb6 |
Keyboard_AppleIIc.pngApple //c keyboard photograph the clickable keyboard window uses on the //c family
Hashes and source
| game data | SHA1 f7c8a696d66c |
monitor2.pngApple Monitor II bezel drawn around the screen
Hashes and source
| game data | SHA1 1b8f16f4e74e |
driveopen.pngDisk II drive 1, door open, motor off
Hashes and source
| game data | SHA1 c768cae9b9f1 |
driveopenrunning.pngDisk II drive 1, door open, motor on
Hashes and source
| game data | SHA1 7fb68df047b6 |
driveclosed.pngDisk II drive 1, disk in, motor off
Hashes and source
| game data | SHA1 a0cafd4de513 |
driverunning.pngDisk II drive 1, disk in, motor on
Hashes and source
| game data | SHA1 24fbad2dccd6 |
drive2open.pngDisk II drive 2, door open, motor off
Hashes and source
| game data | SHA1 d35419fe9ca5 |
drive2openrunning.pngDisk II drive 2, door open, motor on
Hashes and source
| game data | SHA1 8b2d611608b6 |
drive2closed.pngDisk II drive 2, disk in, motor off
Hashes and source
| game data | SHA1 200ef91f19ac |
drive2running.pngDisk II drive 2, disk in, motor on
Hashes and source
| game data | SHA1 82b7541e0ba7 |
diskiicopen.png//c built-in drive, door open, motor off
Hashes and source
| game data | SHA1 c9a06c6bfb9a |
diskiicopenrunning.png//c built-in drive, door open, motor on
Hashes and source
| game data | SHA1 e5520d89d116 |
diskiicclosed.png//c built-in drive, disk in, motor off
Hashes and source
| game data | SHA1 5f958d799ed0 |
diskiicrunning.png//c built-in drive, disk in, motor on
Hashes and source
| game data | SHA1 8af19c7739c5 |
apple35.png3.5 inch drive, idle
Hashes and source
| game data | SHA1 17605fc7452f |
apple35running.png3.5 inch drive, busy
Hashes and source
| game data | SHA1 5c5df0b5393e |
applehd.pngHard disk, idle
Hashes and source
| game data | SHA1 f0c81be81393 |
applehdrunning.pngHard disk, busy
Hashes and source
| game data | SHA1 dfe8bdfccad5 |
Next steps
Section titled “Next steps”- Get your files, for the setup you play on
- Every system, and the files each one needs
- When a game does not start