emulator: ACE-DL type: standalone core_classification: community_fork source: "https://roudoudou.com/ACE-DL/" upstream: "http://ace.cpcscene.net" version_source: url: "https://roudoudou.com/ACE-DL/" pattern: 'New release [^<]* - (\d{4}/\d{2}/\d{2})' profiled_date: "2026-11-10" core_version: "2026/10/16" version_basis: kind: package url: "https://roudoudou.com/ACE-DL/" artifact: "BNDGEN.tar.gz (ACE-DL Linux x86-64 build), release date on the download page" display_name: "Amstrad - CPC/Plus (ACE-DL)" cores: - ace-dl - acedl systems: - amstrad-cpc mode: standalone notes: | SDL port of ACE, the Amstrad CPC/Plus emulator written by Philippe Rimauro (OffseT) for MorphOS. ACE-DL is built by Edouard Bergé (Roudoudou) from the MorphOS sources and released for Windows, macOS, Linux and Raspberry Pi. The sources are private. Every entry below was read from the stripped Linux x86-64 executable AceDL of the 2026/10/16 BNDGEN.tar.gz (tarball sha256 4f3567bb2196e32f, AceDL sha256 0f159a705028e80e). The binary has no symbols, so functions are named FUN_
(file offset = virtual address in this PIE). Machines are CPC 464, 664 and 6128 plus the Plus range, which boots from a cartridge and covers the GX-4000. An operating system is one file read by FUN_248970 as two 16 KB halves, the firmware ROM then the BASIC ROM, each fread having to return 0x4000 bytes. A shorter file is refused, bytes past 32 KB are ignored. ACE-DL ships them pre-joined under private/firmware/, one file per machine and language: OS464_UK.rom Firmware v1 + BASIC 1.00 OS464_FR.rom Firmware f1 + French BASIC 1.0 (md5 824f5213...) OS664_UK.rom Firmware v2 + BASIC 1.10 OS6128_UK.rom Firmware v3 + BASIC 1.20 OS6128_FR.rom Firmware f3 + BASIC 1.23 OS6128_S.rom Firmware s3 + BASIC 1.21 OS6128_DK.rom Firmware d3 + BASIC 1.20 XMEM_FW_3_15_UK.rom XMEM 3.15 firmware + BASIC 1.20 XMEM_FW_3_15_FR.rom XMEM 3.15 firmware + BASIC 1.23 Firmware versions run 1 to 4 for the 464, 664, 6128 and Plus, and the letter is the country: v English, f French, s Spanish, d Danish. main (FUN_3a479) builds OS6128_UK.rom and Amsdos.rom from the application directory and creates the machine with them before the config file is read. If either load fails the machine constructor returns NULL, main prints "Initialisation Error should not happend" and the next call dereferences the NULL machine, so startup dies. Afterwards the OS= config key (FUN_2a4840) loads the path it holds, the firmware requester (FUN_373ad0) lists every *.rom under private/firmware/ and loads the pick, and -fuk, -ffr, -fsp, -fdk (FUN_345230, applied by FUN_2989f0 after the config) load one of the four 6128 files. These three paths keep the current firmware when the load fails. The Machine configuration page (FUN_377790) names the loaded firmware by comparing its basename with the nine names above. Two older code paths switch firmware by RAM size, 64 KB for a 464 or 664, more for a 6128, keeping the language through a strstr for "FR" in the current path: the SNA loader (FUN_369ce0) opens ./private/firmware/OS464_FR, OS464_UK, OS664_UK, OS6128_FR or OS6128_UK and the RAM selector (FUN_377790) opens the same names under ./firmware/, both without extension and relative to the working directory. When the open fails the current firmware stays. Plus system cartridges are loaded by the CPR loader FUN_234870, reached from the media loader FUN_2a30a0 on a .cpr extension (command line, CARTRIDGE= config key, dropped file). No code names the three Amstrad_?4.cpr files. Plugins pull three more ROMs, each from a path under the application directory, loaded when the PLUGIN_ key is 1 in the config file (FUN_2a4840) or from the plugin menu (FUN_375320). Multiface II and Play2CPC are also reachable with -plugin multiface2 and -plugin play2cpc. A missing Multiface II or Hacker ROM leaves the plugin uninstalled, a short one also clears its PLUGIN_ flag. A missing YM2608 ROM is reported and Play2CPC runs without the rhythm samples. The Windows x64 package omits that ROM, the Linux packages carry it. Expansion ROMs are user business: config keys ROM0 to ROM255 hold whatever the user picks through the requester rooted at media/rom/, loaded by FUN_248ae0 with the ROM type check. Disc, tape, snapshot, Dandanator and X-MASS images are user content the same way, and the Nova plugin regenerates its 32 KB private/Nova/nova.nvram when the file is absent. Outside emulation the binary loads its own payload: QOI images, WAV drive and monitor samples, and the private/messages catalog. files: # -- Operating systems, firmware ROM + BASIC ROM joined in one 32 KB file -- - name: OS6128_UK.rom path: "private/firmware/OS6128_UK.rom" aliases: [OS6128_UK] system: amstrad-cpc required: true bundled: true min_size: 32768 validation: [size] md5: b96280dc6c95a48857b4b8eb931533ae sha1: 5977adbad3f7c1e0e082cd02fe76a700d9860c30 source_ref: "AceDL 2026/10/16 linux-x64 FUN_3a479 0x3a893-0x3a8ac (sprintf %sprivate/firmware/OS6128_UK.rom), 0x3a8fc FUN_26caf0, FUN_249ef0 0x249fc0 FUN_248970 (fopen rb 0x248a0f, fread 0x4000 at 0x248a2c and 0x248aa1, a short read fails), 0x249fda (Error initializing ROMs!), FUN_3a479 0x3a905-0x3a93e (NULL machine), FUN_247c50 0x247c54 (NULL dereference); FUN_2989f0 0x299450 (-fuk); FUN_372cb0 0x373077-0x3730a4 (reset to 6128 UK); FUN_369ce0 0x36b7f4 and FUN_377790 0x378298 (extensionless OS6128_UK)" note: >- CPC 6128 English. Firmware v3 followed by BASIC 1.20. Absence stops startup with "Error initializing ROMs!". The SNA loader and the RAM selector also try the extensionless name. - name: OS6128_FR.rom path: "private/firmware/OS6128_FR.rom" aliases: [OS6128_FR] system: amstrad-cpc region: [france] required: false bundled: true min_size: 32768 validation: [size] md5: 5ee871d5600eb9b5a22989c295f902a5 sha1: 200d59076dfef36db061d6d7d21d80021cab1237 source_ref: "AceDL 2026/10/16 linux-x64 FUN_345230 0x345f26-0x345f36 (-ffr sets 2), FUN_2989f0 0x298a03, 0x2993d7-0x2993ff (sprintf %sprivate/firmware/OS6128_FR.rom), 0x29946b FUN_248970 (fopen rb 0x248a0f, fread 0x4000 at 0x248a2c and 0x248aa1, a short read fails), 0x299472 (failure keeps the current firmware); FUN_373ad0 0x374ea6-0x374ed7 (requester); FUN_369ce0 0x36b2ad and FUN_377790 0x377dc5 (extensionless OS6128_FR)" note: >- CPC 6128 French. Firmware f3 followed by BASIC 1.23. The SNA loader and the RAM selector also try the extensionless name. - name: OS6128_S.rom path: "private/firmware/OS6128_S.rom" system: amstrad-cpc region: [spain] required: false bundled: true min_size: 32768 validation: [size] md5: 0246740371010333385665dfeb7cd0ec sha1: 1acd01c2c03424a78b32c9440f4d890fb1104815 source_ref: "AceDL 2026/10/16 linux-x64 FUN_345230 0x345f6b-0x345f7b (-fsp sets 3), FUN_2989f0 0x2993c1-0x2993ff (sprintf %sprivate/firmware/OS6128_S.rom), 0x29946b FUN_248970 (fopen rb 0x248a0f, fread 0x4000 at 0x248a2c and 0x248aa1, a short read fails); FUN_373ad0 0x374ea6-0x374ed7 (requester)" note: "CPC 6128 Spanish. Firmware s3 followed by BASIC 1.21." - name: OS6128_DK.rom path: "private/firmware/OS6128_DK.rom" system: amstrad-cpc region: [denmark] required: false bundled: true min_size: 32768 validation: [size] md5: ca1635fd992e2aa7a776b30da13467e5 sha1: a9e7ee6355730f319a37c95ca0a714212b88c3b1 source_ref: "AceDL 2026/10/16 linux-x64 FUN_345230 0x345fb0-0x345fc4 (-fdk sets 4), FUN_2989f0 0x299438-0x299449, 0x2993ff (sprintf %sprivate/firmware/OS6128_DK.rom), 0x29946b FUN_248970 (fopen rb 0x248a0f, fread 0x4000 at 0x248a2c and 0x248aa1, a short read fails); FUN_373ad0 0x374ea6-0x374ed7 (requester)" note: "CPC 6128 Danish. Firmware d3 followed by BASIC 1.20." - name: OS464_UK.rom path: "private/firmware/OS464_UK.rom" aliases: [OS464_UK] system: amstrad-cpc required: false bundled: true min_size: 32768 validation: [size] md5: a993f85b88ac4350cf4d41554e87fe4f sha1: 56d39c463da60968d93e58b4ba0e675829412a20 source_ref: "AceDL 2026/10/16 linux-x64 FUN_373ad0 0x37407d-0x3740ad (firmware requester lists *.rom under %sprivate/firmware), 0x374ea6-0x374ed7 (sprintf %sprivate/firmware/ + pick, FUN_248970 (fopen rb 0x248a0f, fread 0x4000 at 0x248a2c and 0x248aa1, a short read fails)); FUN_2a4840 0x2a4bac-0x2a4c15 (OS= key); FUN_377790 0x3779fe (Machine configuration label); FUN_369ce0 0x36b918 and FUN_377790 0x378363 (extensionless OS464_UK)" note: >- CPC 464 English. Firmware v1 followed by BASIC 1.00. The SNA loader and the RAM selector also try the extensionless name. - name: OS464_FR.rom path: "private/firmware/OS464_FR.rom" aliases: [OS464_FR] system: amstrad-cpc required: false bundled: true min_size: 32768 validation: [size] md5: a588b7c9e1c142b5d8ebec65ac7713d8 sha1: c68d84f37ab9defbb19200598c24948c97c9a644 source_ref: "AceDL 2026/10/16 linux-x64 FUN_373ad0 0x37407d-0x3740ad (firmware requester lists *.rom under %sprivate/firmware), 0x374ea6-0x374ed7 (sprintf %sprivate/firmware/ + pick, FUN_248970 (fopen rb 0x248a0f, fread 0x4000 at 0x248a2c and 0x248aa1, a short read fails)); FUN_2a4840 0x2a4bac-0x2a4c15 (OS= key); FUN_377790 0x3779e7 (Machine configuration label); FUN_369ce0 0x36b8e1 and FUN_377790 0x3782f4 (extensionless OS464_FR)" note: >- CPC 464 French. Firmware f1 followed by a French BASIC 1.0. The SNA loader and the RAM selector also try the extensionless name. - name: OS664_UK.rom path: "private/firmware/OS664_UK.rom" aliases: [OS664_UK] system: amstrad-cpc required: false bundled: true min_size: 32768 validation: [size] md5: 5a384a2310f472c7857888371c00ed66 sha1: 073a7665527b5bd8a148747a3947dbd3328682c8 source_ref: "AceDL 2026/10/16 linux-x64 FUN_373ad0 0x37407d-0x3740ad (firmware requester lists *.rom under %sprivate/firmware), 0x374ea6-0x374ed7 (sprintf %sprivate/firmware/ + pick, FUN_248970 (fopen rb 0x248a0f, fread 0x4000 at 0x248a2c and 0x248aa1, a short read fails)); FUN_2a4840 0x2a4bac-0x2a4c15 (OS= key); FUN_377790 0x377a15 (Machine configuration label); FUN_369ce0 0x36b881 and FUN_377790 0x378168 (extensionless OS664_UK)" note: >- CPC 664 English. Firmware v2 followed by BASIC 1.10. The SNA loader and the RAM selector also try the extensionless name. - name: XMEM_FW_3_15_UK.rom path: "private/firmware/XMEM_FW_3_15_UK.rom" system: amstrad-cpc required: false bundled: true min_size: 32768 validation: [size] md5: 85accc17e98c79dbbdde826cbfaf4692 sha1: c7d7e5116665e4f21ae3b9bcdca2ce3685f00293 source_ref: "AceDL 2026/10/16 linux-x64 FUN_373ad0 0x37407d-0x3740ad (firmware requester lists *.rom under %sprivate/firmware), 0x374ea6-0x374ed7 (sprintf %sprivate/firmware/ + pick, FUN_248970 (fopen rb 0x248a0f, fread 0x4000 at 0x248a2c and 0x248aa1, a short read fails)); FUN_2a4840 0x2a4bac-0x2a4c15 (OS= key); FUN_377790 0x377a9f (Machine configuration label)" note: "X-MEM firmware 3.15 English, followed by BASIC 1.20." - name: XMEM_FW_3_15_FR.rom path: "private/firmware/XMEM_FW_3_15_FR.rom" system: amstrad-cpc required: false bundled: true min_size: 32768 validation: [size] md5: 046fa182f7574bde3ab97ee873f6e736 sha1: faa49a3aeb1d7e972437f6b77515455d14e2d680 source_ref: "AceDL 2026/10/16 linux-x64 FUN_373ad0 0x37407d-0x3740ad (firmware requester lists *.rom under %sprivate/firmware), 0x374ea6-0x374ed7 (sprintf %sprivate/firmware/ + pick, FUN_248970 (fopen rb 0x248a0f, fread 0x4000 at 0x248a2c and 0x248aa1, a short read fails)); FUN_2a4840 0x2a4bac-0x2a4c15 (OS= key); FUN_377790 0x377a88 (Machine configuration label)" note: "X-MEM firmware 3.15 French, followed by BASIC 1.23." # -- Disc ROM, mapped in slot 7 -- - name: Amsdos.rom path: "private/amsdos/Amsdos.rom" system: amstrad-cpc required: true bundled: true size: 16384 md5: 25629dfe870d097469c217b95fdc1c95 sha1: 39102c8e9cb55fcc0b9b62098780ed4a3cb6a4bb source_ref: "AceDL 2026/10/16 linux-x64 FUN_3a479 0x3a8bb-0x3a8d4 (sprintf %sprivate/amsdos/Amsdos.rom), FUN_249ef0 0x24a037 FUN_248ae0 (fopen rb 0x248b42, %s is missing. 0x248c31, 128-byte AMSDOS header skipped when its checksum matches 0x248b63-0x248b99, ROM type byte 0-3 or 0x80 else not a CPC ROM file 0x248bd2-0x248bfd, fread 0x3f80 unchecked 0x248bb7), 0x24a098 (Error loading AMSDOS ROM), 0x249fda, FUN_3a479 0x3a905-0x3a93e, FUN_247c50 0x247c54 (NULL dereference)" note: >- AMSDOS disc ROM. Absence prints "Error loading AMSDOS ROM" then "Error initializing ROMs!" and stops startup. Length is not checked, the first byte must be a ROM type 0 to 3 or 0x80. # -- Plus system cartridges, 8 banks of 16 KB in RIFF chunks -- - name: Amstrad_v4.cpr path: "private/firmware/Amstrad_v4.cpr" system: amstrad-cpc required: false bundled: true size: 131156 md5: 39b565e648172980aa552293e667070f sha1: 405e341437fab8db477606238af0c20eca2e39ee source_ref: "AceDL 2026/10/16 linux-x64 FUN_2a30a0 0x2a31ae (.cpr extension), FUN_234870 (fopen rb 0x2348b3, 12-byte RIFF header 0x234927, form AMS! or CXME 0x234937-0x23494b else Cartridge Load Error (Header) 0x2349a0, chunk loop 0x234bad with truncated file! 0x234d20, cbNN bank number 0x234eb0, 16 KB bank read 0x235010-0x235042)" note: "464plus/6128plus/GX-4000 system cartridge, English, firmware version 4." - name: Amstrad_f4.cpr path: "private/firmware/Amstrad_f4.cpr" system: amstrad-cpc required: false bundled: true size: 131156 md5: e7159fd674022ba05f9b347ae3cdafc6 sha1: e5aa80c501cfb435e2cba35ad92e427240394164 source_ref: "AceDL 2026/10/16 linux-x64 FUN_2a30a0 0x2a31ae (.cpr extension), FUN_234870 (fopen rb 0x2348b3, 12-byte RIFF header 0x234927, form AMS! or CXME 0x234937-0x23494b else Cartridge Load Error (Header) 0x2349a0, chunk loop 0x234bad with truncated file! 0x234d20, cbNN bank number 0x234eb0, 16 KB bank read 0x235010-0x235042)" note: "464plus/6128plus/GX-4000 system cartridge, French, firmware version 4." - name: Amstrad_s4.cpr path: "private/firmware/Amstrad_s4.cpr" system: amstrad-cpc required: false bundled: true size: 131156 md5: 6eeed3fdd4abc98a2a932da810410128 sha1: 05fb14df24b2b504a3ae463a086f02f0adcc07b9 source_ref: "AceDL 2026/10/16 linux-x64 FUN_2a30a0 0x2a31ae (.cpr extension), FUN_234870 (fopen rb 0x2348b3, 12-byte RIFF header 0x234927, form AMS! or CXME 0x234937-0x23494b else Cartridge Load Error (Header) 0x2349a0, chunk loop 0x234bad with truncated file! 0x234d20, cbNN bank number 0x234eb0, 16 KB bank read 0x235010-0x235042)" note: "464plus/6128plus/GX-4000 system cartridge, Spanish, firmware version 4." # -- Plugin ROMs -- - name: multiface2.rom path: "private/multiface2/multiface2.rom" system: amstrad-cpc required: false bundled: true min_size: 8192 validation: [size] md5: 4c9f014e91d407cc6509fad0095ab909 sha1: 1431ec628d38f000715545dd2186b684c5fe5a6f source_ref: "AceDL 2026/10/16 linux-x64 FUN_2a4840 0x2a735b-0x2a73c3 (PLUGIN_MULTIFACE2 into 0x50c410), 0x2a767b-0x2a7685, 0x2ac38a FUN_3aa850 (sprintf %sprivate/multiface2/multiface2.rom 0x3aa87b, fopen rb 0x3aa88c, missing returns uninstalled 0x3aa894, fread 0x2000 0x3aa8ad, short read clears the flag 0x3aa8ba, hooks installed 0x3aa8e0-0x3aa955); FUN_345230 0x346086 (-plugin multiface2), FUN_2989f0 0x29934c-0x299358" note: >- Romantic Robot Multiface Two ROM. Without it the plugin is not installed, a file shorter than 8 KB also clears PLUGIN_MULTIFACE2. - name: hackit400uk.rom path: "private/hacker/hackit400uk.rom" system: amstrad-cpc required: false bundled: true min_size: 16384 validation: [size] md5: 9a293eaaebca601f671070ad56cb81b6 sha1: 56306e7234bcffd14b4f977d42d237c4ad9c12d5 source_ref: "AceDL 2026/10/16 linux-x64 FUN_2a4840 0x2a743d-0x2a74a5 (PLUGIN_HACKER into 0x50c40c), 0x2a74ae-0x2a7516 (PLUGIN_HACKERFR into 0x50c408), 0x2a769b-0x2a76a3, 0x2ac36c FUN_3adac0 (0x3adaf1 %sprivate/hacker/hackit400uk.rom when PLUGIN_HACKERFR=0, fopen rb 0x3adb1d, missing returns uninstalled 0x3adb28, fread 0x4000 0x3adb3e, short read clears PLUGIN_HACKER 0x3adb4b)" note: >- HackIt 4.00 by Siren Software, English, read when PLUGIN_HACKERFR is 0. Without it the plugin is not installed, a file shorter than 16 KB also clears PLUGIN_HACKER. - name: hacker481fr.rom path: "private/hacker/hacker481fr.rom" system: amstrad-cpc required: false bundled: true min_size: 16384 validation: [size] md5: dfdd9924295f491d54f30569874287f8 sha1: 0c15d6753cf0ae2a1737b6e857e8e82ee135a697 source_ref: "AceDL 2026/10/16 linux-x64 FUN_2a4840 0x2a74ae-0x2a7516 (PLUGIN_HACKERFR into 0x50c408), 0x2a769b-0x2a76a3, 0x2ac36c FUN_3adac0 (0x3adafb-0x3adaff %sprivate/hacker/hacker481fr.rom when PLUGIN_HACKERFR=1, fopen rb 0x3adb1d, missing returns uninstalled 0x3adb28, fread 0x4000 0x3adb3e, short read clears PLUGIN_HACKER 0x3adb4b)" note: >- Le Hackeur 4.81, the French edition of the same Siren Software ROM, read when PLUGIN_HACKERFR is 1. Without it the plugin is not installed, a file shorter than 16 KB also clears PLUGIN_HACKER. - name: ym2608_adpcm_rom.bin path: "private/sounds/ym2608_adpcm_rom.bin" system: amstrad-cpc required: false size: 8192 md5: 8740932cda05e518a9955f1d08d6786f sha1: 50b6c3e288eaa12ad275d4f323267bb72b0445df source_ref: "AceDL 2026/10/16 linux-x64 FUN_2a4840 0x2a7584-0x2a758c (PLUGIN_PLAY2CPC flag 0x50c46c), 0x2ac31a FUN_3a7820, 0x3a7849 FUN_3ae520, FUN_3ae340 (sprintf %sprivate/sounds/ym2608_adpcm_rom.bin 0x3ae3d1, fopen rb 0x3ae3f1, missing prints Warning not found 0x3ae4ed-0x3ae505 and continues, whole file read by ftell size 0x3ae402-0x3ae463); FUN_345230 0x345a29 (-plugin play2cpc)" note: >- YM2608 internal ADPCM rhythm ROM used by the Play2CPC cartridge sound. Missing file prints "Warning: ym2608_adpcm_rom.bin not found!" and the plugin keeps running. The whole file is read, its length is not checked. Absent from the Windows x64 package.