emulator: LinApple type: standalone core_classification: community_fork source: "https://github.com/linappleii/linapple" upstream: "https://github.com/AppleWin/AppleWin" profiled_date: "2026-10-04" source_commit: "42e4321d60dc066470151f76c1cd3fe5e88a695c" core_version: "3.0.0" display_name: "Apple - Apple II (LinApple)" cores: - linapple systems: - apple-ii mode: standalone notes: | SDL port of AppleWin for Linux. The SourceForge project was abandoned and its forks were gathered under the linappleii organization (README.md:166-173). Five frontends build from one core: sdl1, sdl2, sdl3, tui and headless (src/frontends/). The ROMs the emulator runs are compiled into the binary. scripts/generate_roms.sh turns res/roms/*.rom into EmbeddedRoms.h and EmbeddedRoms.cpp, once at configure time and again at build time (CMakeLists.txt:301-338), each image behind an ENABLE_ROM_* macro (scripts/generate_roms.sh:97-118). Eighteen images go through the generator: ten system ROMs, four character generator ROMs and four card ROMs. The printer card, the Super Serial Card and the clock card carry their firmware as arrays in their own source files (src/apple2/peripherals/printer/Printer.cpp:30, src/apple2/peripherals/super_serial_card/SuperSerialRom.h:16, src/apple2/peripherals/clock/ClockCard.cpp:20), and the Mockingboard registers no ROM. What a macro is set to decides whether a machine model runs at all. CMakeLists.txt:57-131 leaves the Apple ][, ][+, J-Plus, //e and Enhanced //e system ROMs ON, along with the Disk II and mouse firmware. The three clone options are OFF: ENABLE_ROM_CLONE_BASE64A, ENABLE_ROM_CLONE_PRAVETS and ENABLE_ROM_CLONE_TK3000E (CMakeLists.txt:95-97). Selecting one of those machine types on a default build reaches mem_initialize with no rom_data, which prints the model name and its cmake flag, destroys the context and returns -1 (src/apple2/Memory.cpp:1124-1134). The message offers two ways out, and the second is a file: -R, --rom loads a system ROM at runtime (src/frontends/common/AppArgs.cpp:77,186). A custom ROM takes precedence over anything embedded. load_custom_rom opens the path as given, then through Path::find_data_file, and refuses a file below 12288 or above 65536 bytes, which stops the start (src/frontends/common/AppController.cpp:127-171,251-253). mem_initialize accepts the buffer at exactly 16384 or 12288 bytes, or larger, taking the trailing 16384 for the //e-class types and the trailing 12288 otherwise (src/apple2/Memory.cpp:1038-1059). No hash or name is checked; the file is whatever the user points at. Character generators are res/charset40*.png, converted to XPM by CMake (CMakeLists.txt:270-299) and included at src/apple2/Video.cpp:39-43. One of five is chosen from the machine type and the keyboard language (src/apple2/Video.cpp:1228-1252). The status font and the splash screen are XPM as well (src/core/Asset.cpp:15-16,57,63). The four *_Video.rom images are compiled in, and no source file reads their symbols. Master.dsk is inserted into slot 6 drive 1 at startup unless the command line names a disk or the configuration autoloads one (src/frontends/common/AppController.cpp:194-215). asset_find_master_disk resolves it through Path::find_data_file (src/core/Asset.cpp:25-39), which walks the user data and config directories, the executable directory and its res/ neighbours, the share and etc prefixes beside it, the compiled-in SOURCE_RES_DIR, /usr/local/share/linapple, /usr/share/linapple, every XDG_CONFIG_DIRS entry and /etc/linapple (src/core/Util_Path.h:116-179). The same search serves icon.bmp and a --rom path that does not open as given. The debugger reads its symbol tables through system_state.program_dir, declared at src/core/LinAppleCore.h:103 and read without ever being assigned, so the names resolve against the working directory. g_file_name_symbols lists nine tables (src/Debugger/Debugger_Symbols.cpp:37-48). CmdSymbolsLoad reads a table's default file when it receives no argument (src/Debugger/Debugger_Symbols.cpp:636-652); its only caller is the LOAD parameter of the SYM commands (src/Debugger/Debugger_Symbols.cpp:817-819), and debug_initialize loads no table (src/Debugger/Debug.cpp:29-37). ParseSymbolTable opens the file with fopen and a missing one leaves the debugger running without its symbols (src/Debugger/Debugger_Symbols.cpp:495). Peripheral cards are linked into the executable by default. With BUILD_SHARED_PERIPHERALS, OFF at CMakeLists.txt:43, each card that add_peripheral does not force built-in builds as a shared object (CMakeLists.txt:554-555,662-666), and peripheral_plugins_init opens every *.so found in the plugin search paths in either build (src/apple2/peripherals/Peripheral_Internal.cpp:192-219, src/core/Util_Path.h:102-114). linapple.conf carries preferences only (src/core/Registry.cpp, src/frontends/common/AppEnvironment.cpp). Each accessor returns a compiled-in default when a key is missing. files: - name: Master.dsk required: false description: "Boot floppy inserted into slot 6 drive 1 at startup" min_size: 143105 max_size: 143364 validation: [size] source_ref: "src/core/Asset.cpp:20,25-39,97-112; src/apple2/peripherals/disk/formats/SectorDiskImage.cpp:65-66,79-82" note: > asset_find_master_disk warns and returns false when no search path holds the file, and the emulator starts with an empty drive. No hash or content check is performed. LinApple and Batocera ship different images under this name, both 143360 bytes. - name: icon.bmp required: false description: "Window icon read from disk by the SDL frontends" size: 2102 md5: be7a389c5aa678f5e6ce4748593b0a29 sha1: 5aee3a718f3d541122b61b9b8203e8a28db97a34 source_ref: "src/frontends/sdl2/SDL_Asset.cpp:18-41,55-69" note: > sdl_asset_load_bmp resolves the name through Path::find_data_file, prints a warning to stderr when no search path holds it and returns nullptr. The sdl1, sdl2 and sdl3 frontends each load it when the window is created. Absence costs the window its icon and nothing else. - name: APPLE2E.SYM required: false description: "Debugger symbol table for the main ROM" source_ref: "src/Debugger/Debugger_Symbols.cpp:37-48,636-652" note: > Read into the Main table when SYMMAIN LOAD is entered without a file name. Parsed as text lines of address and symbol name, with no size or hash check. - name: A2_BASIC.SYM required: false description: "Debugger symbol table for Applesoft BASIC" source_ref: "src/Debugger/Debugger_Symbols.cpp:37-48,636-652" note: > Read into the Basic table when SYMBASIC LOAD is entered without a file name. Parsed as text lines of address and symbol name, with no size or hash check. # System ROMs the default build leaves out. ENABLE_ROM_CLONE_BASE64A, # ENABLE_ROM_CLONE_PRAVETS and ENABLE_ROM_CLONE_TK3000E are OFF in # CMakeLists.txt:95-97, so these machine types refuse to start unless the # user passes the image with --rom. The names are the ones upstream gives # the images in res/roms; the option takes a path and checks no name. - name: Base64A.rom required: false description: "Copam Base 64A clone system ROM, supplied with --rom" min_size: 12288 max_size: 65536 validation: [size] size: 49152 md5: 352fdbcae14c6a8c0398822c7a273309 sha1: f1c779af480b5bda2bdd03950c1201a5c5143bea source_ref: "CMakeLists.txt:95,99-103; scripts/generate_roms.sh:107; src/frontends/common/AppController.cpp:148-159; src/apple2/Memory.cpp:99-100,1038-1059,1124-1134" note: > Larger than a system ROM: mem_initialize takes the trailing 12288 bytes for this machine type. - name: PRAVETS82.ROM required: false description: "Pravets 82 clone system ROM, supplied with --rom" min_size: 12288 max_size: 65536 validation: [size] size: 12288 md5: c619b7edfcf021f3b8fd20d9386676ba sha1: 8bd7ced83e209a15e9b19a05a5ef4b8e996dc1a5 source_ref: "CMakeLists.txt:96,105-109; scripts/generate_roms.sh:109; src/frontends/common/AppController.cpp:148-159; src/apple2/Memory.cpp:101-102,1038-1059,1124-1134" - name: PRAVETS8M.ROM required: false description: "Pravets 8M clone system ROM, supplied with --rom" min_size: 12288 max_size: 65536 validation: [size] size: 12288 md5: 76c79535f7cf77973e2c711aa977a124 sha1: f1b4ff018acf95f3355f0d575b66a188d728b687 source_ref: "CMakeLists.txt:96,105-109; scripts/generate_roms.sh:111; src/frontends/common/AppController.cpp:148-159; src/apple2/Memory.cpp:103-104,1038-1059,1124-1134" - name: PRAVETS8C.ROM required: false description: "Pravets 8C clone system ROM, supplied with --rom" min_size: 12288 max_size: 65536 validation: [size] size: 16384 md5: 1896d7b98dd940c89f7c8ea899b71006 sha1: c976fe56e57706c161f513a82ba3e0d8cda83904 source_ref: "CMakeLists.txt:96,105-109; scripts/generate_roms.sh:110; src/frontends/common/AppController.cpp:148-159; src/apple2/Memory.cpp:105-106,1038-1059,1124-1134" note: > A //e-class type: mem_initialize takes the trailing 16384 bytes when the file is larger. - name: TK3000e.rom required: false description: "Microdigital TK-3000 //e clone system ROM, supplied with --rom" min_size: 12288 max_size: 65536 validation: [size] size: 16384 md5: 8d84b614b545d4eec8799d3f325332cb sha1: f163e5753c18ff0e812a448e8da406f102600edf source_ref: "CMakeLists.txt:97,111-115; scripts/generate_roms.sh:112; src/frontends/common/AppController.cpp:148-159; src/apple2/Memory.cpp:107-108,1038-1059,1124-1134" note: > A //e-class type: mem_initialize takes the trailing 16384 bytes when the file is larger. analysis: embedded_roms: mechanism: > res/roms/*.rom compiled into EmbeddedRoms.cpp by scripts/generate_roms.sh at configure and build time, each behind an ENABLE_ROM_* macro source_ref: "CMakeLists.txt:57-131,301-338; scripts/generate_roms.sh:97-118" extraction: "hashes computed from the res/roms images the generator reads" system_roms: - symbol: g_rom_apple2 machine: "Apple ][" machine_type: A2TYPE_APPLE2 image: res/roms/Apple2.rom cmake_option: ENABLE_ROM_APPLE2 default: on source_ref: "src/apple2/Memory.cpp:1062-1066" size: 12288 md5: 3c406514b9806a7c57ee65fb0b0c39b4 sha1: 09288be705464b608ff190519ab008d3dfcd1b05 - symbol: g_rom_apple2_plus machine: "Apple ][+" machine_type: A2TYPE_APPLE2PLUS image: res/roms/Apple2_Plus.rom cmake_option: ENABLE_ROM_APPLE2PLUS default: on source_ref: "src/apple2/Memory.cpp:1068-1072" size: 12288 md5: 572b3005a4fa49bc54917b069b82c1ab sha1: 33a24f5489ba9195b44be77d9afb2252594cb5c7 - symbol: g_rom_apple2_jplus machine: "Apple ][ J-Plus" machine_type: A2TYPE_APPLE2JPLUS image: res/roms/Apple2_JPlus.rom cmake_option: ENABLE_ROM_APPLE2_JPLUS default: on source_ref: "src/apple2/Memory.cpp:1074-1078" size: 12288 md5: f3e8237eca3809bec2a42b984a1332a8 sha1: ad200b3263d08e7235d0871c8595963a07adc905 - symbol: g_rom_apple2e machine: "Apple //e Unenhanced" machine_type: A2TYPE_APPLE2E image: res/roms/Apple2e.rom cmake_option: ENABLE_ROM_APPLE2E default: on source_ref: "src/apple2/Memory.cpp:1080-1084" size: 16384 md5: 346bc782c6a08a531c460e33bc03daf4 sha1: 61fa9254628e5bb7236fb474006116d67684d747 note: "First 4 KB loaded as internal Cx ROM, remaining 12 KB at $D000" - symbol: g_rom_apple2e_enhanced machine: "Apple //e Enhanced" machine_type: A2TYPE_APPLE2EENHANCED image: res/roms/Apple2e_Enhanced.rom cmake_option: ENABLE_ROM_APPLE2ENHANCED default: on source_ref: "src/apple2/Memory.cpp:1086-1090" size: 16384 md5: 38063e08c778503fc03ecebb979769e9 sha1: b8ea90abe135a0031065e01697c4a3a20d51198b note: "First 4 KB loaded as internal Cx ROM, remaining 12 KB at $D000" - symbol: g_rom_clone_base64a machine: "Base64A" machine_type: A2TYPE_CLONE_BASE64A image: res/roms/Base64A.rom cmake_option: ENABLE_ROM_CLONE_BASE64A default: off source_ref: "src/apple2/Memory.cpp:1092-1098" note: "Trailing 12288 bytes of the image are used" - symbol: g_rom_clone_pravets82 machine: "Pravets 82" machine_type: A2TYPE_CLONE_PRAVETS82 image: res/roms/PRAVETS82.ROM cmake_option: ENABLE_ROM_CLONE_PRAVETS default: off source_ref: "src/apple2/Memory.cpp:1099-1103" - symbol: g_rom_clone_pravets8m machine: "Pravets 8M" machine_type: A2TYPE_CLONE_PRAVETS8M image: res/roms/PRAVETS8M.ROM cmake_option: ENABLE_ROM_CLONE_PRAVETS default: off source_ref: "src/apple2/Memory.cpp:1104-1107" - symbol: g_rom_clone_pravets8c machine: "Pravets 8C" machine_type: A2TYPE_CLONE_PRAVETS8C image: res/roms/PRAVETS8C.ROM cmake_option: ENABLE_ROM_CLONE_PRAVETS default: off source_ref: "src/apple2/Memory.cpp:1108-1112" - symbol: g_rom_clone_tk3000e machine: "TK3000 //e" machine_type: A2TYPE_CLONE_TK3000E image: res/roms/TK3000e.rom cmake_option: ENABLE_ROM_CLONE_TK3000E default: off source_ref: "src/apple2/Memory.cpp:1113-1118" video_roms: note: > Compiled in under the macro of their machine. No source file reads the symbols; the display uses the character_generators below. images: - symbol: g_rom_apple2_video image: res/roms/Apple2_Video.rom cmake_option: ENABLE_ROM_APPLE2 default: on source_ref: "scripts/generate_roms.sh:98" size: 2048 md5: 9ac0dc8c4d0002eb45b0b84be0bde5ec sha1: f9d312f128c9557d9d6ac03bfad6c3ddf83e5659 - symbol: g_rom_apple2_jplus_video image: res/roms/Apple2_JPlus_Video.rom cmake_option: ENABLE_ROM_APPLE2_JPLUS default: on source_ref: "scripts/generate_roms.sh:101" size: 2048 md5: 271e2c9bf928b95e7baeff391db45495 sha1: 0a382be58db5215c4a3de53b19a72fab660d5da2 - symbol: g_rom_apple2e_enhanced_video image: res/roms/Apple2e_Enhanced_Video.rom cmake_option: ENABLE_ROM_APPLE2ENHANCED default: on source_ref: "scripts/generate_roms.sh:104" size: 4096 md5: 9123fff3442c0e688cc6816be88dd4ab sha1: b2b5d87f52693817fc747df087a4aa1ddcdb1f10 - symbol: g_rom_clone_base64a_german_video image: res/roms/Base64A_German_Video.rom cmake_option: ENABLE_ROM_CLONE_BASE64A default: off source_ref: "scripts/generate_roms.sh:108" size: 4096 md5: 4b45852b369e2afd864a02d0d91f70dc sha1: 87ca8135f7526ddf829f9c2c4f7dbe4d568818fc peripheral_firmware: - device: "Disk II controller, 16 sector boot ROM" slot: 6 symbol: g_rom_disk2 image: res/roms/DISK2.rom cmake_option: ENABLE_ROM_DISK2 default: on source_ref: "CMakeLists.txt:118,120-124; scripts/generate_roms.sh:115; src/apple2/peripherals/disk/Disk.cpp:1125-1127" size: 256 md5: 2020aa1413ff77fe29353f3ee72dc295 sha1: d4181c9f046aafc3fb326b381baac809d9e38d16 - device: "Disk II controller, P6 sequencer PROM" slot: 6 symbol: g_rom_disk2_p6 image: res/roms/DISK2-P6.rom cmake_option: ENABLE_ROM_DISK2 default: on source_ref: "scripts/generate_roms.sh:117; src/apple2/peripherals/disk/Disk.cpp:618-624; CMakeLists.txt:957-970" size: 256 md5: 5f1be0c1cdff26f5956eef9643911886 sha1: bc39fbd5b9a8d2287ac5d0a42e639fc4d3c2f9d4 note: > The controller state machine reads its opcodes from this image. A build test pins its SHA-1 and its size. Without ENABLE_ROM_DISK2 the sequencer returns a constant and the data register never moves. - device: "Disk II controller, 13 sector boot ROM" symbol: g_rom_disk2_13sector image: res/roms/DISK2-13sector.rom cmake_option: ENABLE_ROM_DISK2 default: on source_ref: "scripts/generate_roms.sh:116" size: 256 md5: 4f80448507cf43ab40c17ac08d89e278 sha1: afd060e6f35faf3bb0146fa889fc787adf56330a note: "Compiled in; no source file reads the symbol" - device: "Super Serial Card" slot: 2 symbol: super_serial_rom image: res/roms/SSC.rom source_ref: "src/apple2/peripherals/super_serial_card/SuperSerialRom.h:8-16; src/apple2/peripherals/super_serial_card/SuperSerial.cpp:356-358; CMakeLists.txt:884-887" size: 2048 md5: 67c0d61ab0911183faf05270f881a97e sha1: 6dab633470c6bc4cb3e81d09fda46597caf8ee57 note: > Not generated and behind no cmake option: the card carries the 2048 bytes as an array in SuperSerialRom.h, the last page mapped at $Cn00 and the whole image at $C800. The generator does not read res/roms/SSC.rom; a build test pins its SHA-1 as the reference of that transcription. - device: "Mouse interface card" slot: 4 symbol: g_rom_mouse_interface image: res/roms/MouseInterface.rom cmake_option: ENABLE_ROM_MOUSE default: on source_ref: "CMakeLists.txt:126,128-132; scripts/generate_roms.sh:118; src/apple2/peripherals/mouse/Mouse.cpp:537-541" size: 2048 md5: 22563ab338024dac7b03510371d49c57 sha1: 3a9d881a8a8d30f55b9719aceebbcf717f829d6f - device: "Parallel printer card" slot: 1 symbol: printer_rom image: res/roms/Parallel.rom source_ref: "src/apple2/peripherals/printer/Printer.cpp:30-53,215; CMakeLists.txt:872-874" size: 256 md5: 5902996f16dc78fc013f6e1db14805b3 sha1: c75c751589cbcc1ad4ab4f63676af7abadd86f5b note: > Not generated and behind no cmake option: the card carries the 256 bytes as an array in Printer.cpp. The generator does not read res/roms/Parallel.rom; a build test pins its SHA-1 as the reference of that transcription. - device: "Clock card" symbol: clock_rom source_ref: "src/apple2/peripherals/clock/ClockCard.cpp:19-29,158" note: > A 256-byte page written in ClockCard.cpp that answers the ProDOS ThunderClock identification and read entry points. No image under res/roms backs it. character_generators: mechanism: "PNG converted to XPM by CMake, included at src/apple2/Video.cpp:39-43" selection: "machine type, then keyboard language (src/apple2/Video.cpp:1228-1252)" accepted_geometry: "128x128, or 128x256 for the Euro ROMs carrying a second language" images: - filename: charset40.png used_for: "Apple //e class machines, English (US)" size: 2745 md5: c6029ef4d4fa272083769673bdcf2b6c sha1: d79aa8af6446c3637401cb75ffdda92fdf7f3853 - filename: charset40_IIplus.png used_for: "Apple ][, Apple ][+ and Apple ][ J-Plus" size: 1956 md5: 2104f293d5df7137fdd579ea405da847 sha1: bc9aa5cbadfcffe82b5b20ce954555b9d07fa260 - filename: charset40_british.png used_for: "English (UK)" size: 5300 md5: aa001ec528e3c6c472d02cbb09c5b365 sha1: ac363e069b40658f86ccd1e2d57438db732dbc84 - filename: charset40_french.png used_for: "French (FR)" size: 5330 md5: f163ec67c91501b604ca349afef93fc3 sha1: 5b454a2e7194863df3a997cc21e7ea6d61eb61d7 - filename: charset40_german.png used_for: "German (DE)" size: 5290 md5: 4d8ab9d3f15ee19d9e62c1f163df7e48 sha1: f86bd5238604247e04d616850f244b489daef18d symbol_tables: source_ref: "src/Debugger/Debugger_Symbols.cpp:37-48" lookup: "system_state.program_dir + filename, and system_state.program_dir is never assigned" loaded_on_command: - APPLE2E.SYM - A2_BASIC.SYM - A2_ASM.SYM - A2_USER1.SYM - A2_USER2.SYM - A2_SRC1.SYM - A2_SRC2.SYM - A2_DOS33.SYM - A2_PRODOS.SYM note: > Each table is read by the LOAD parameter of its SYM command; no table is loaded when the debugger starts. Only APPLE2E.SYM and A2_BASIC.SYM are distributed with the emulator, in res/. The user slots and the remaining tables have no shipped counterpart. generated_files: written_only: - linapple.log - Profile.txt - Trace.txt - AppleWin_Text40.txt - AppleWin_Text80.txt - Printer.txt - "save states" - "FTP directory cache" note: > Produced by the emulator, none is user-supplied. CmdConfigSave builds the LinAppleDebugger.cfg path and passes it to no open call (src/Debugger/Debugger_Cmd_Config.cpp:218-221). unused_resources: - filename: font.bmp reason: "shipped in res/ and named by no source file at this revision" - filename: fixedsys-excelsior-regular.ttf reason: "shipped in res/ and named by no source file at this revision"