feat: profile hatari on main and hatarib

This commit is contained in:
Abdessamad Derraz committed 2026-09-03 22:28:59 +02:00
1 parent ce739761fb
commit b362d81910
20 files changed
+346 -75

No files matched your search

+138 -75
View File
@@ -1,103 +1,166 @@
emulator: Hatari
type: standalone + libretro
core_classification: frozen_snapshot
type: libretro
core_classification: official_port
source: "https://github.com/libretro/hatari"
upstream: "https://github.com/hatari/hatari"
logo: "https://raw.githubusercontent.com/hatari/hatari/main/share/icons/hicolor/scalable/apps/hatari.svg"
profiled_date: "2026-03-23"
source_commit: "92e2874e664be40e1b51b97e0ff925a1aa917f22"
core_version: "1.8"
profiled_date: "2026-09-03"
source_commit: "7fd34ccf34c6ea12b7f2b960b2f167d7f251892d"
upstream_commit: "51ed9991101fdc4623b3b38ec16e5a170cf2dffa"
core_version: "2.6.1-devel"
display_name: "Atari - ST/STE/TT/Falcon (Hatari)"
cores:
- hatari
- hatarib
systems: [atari-st, atari-ste, atari-tt, atari-falcon]
systems:
- atari-st
- atari-ste
- atari-tt
- atari-falcon
# Hatari requires a TOS ROM image to boot. The default filename is tos.img,
# loaded from either system/ or system/hatari/tos/ (libretro core scans both).
# EmuTOS (open source replacement) is detected via 'ETOS' magic at offset 0x2c.
# Cartridge ROM is optional and loaded from szCartridgeImageFileName config.
notes: |
The main branch of libretro/hatari is the upstream Hatari tree with its
experimental libretro target in src/retro, which upstream added in
January 2026, plus the port commits that follow the merge base recorded
as upstream_commit: VFS, disk control, core options and hard disk
loading. It builds as hatari_libretro (.gitlab-ci-libretro.yml:10-11,
src/CMakeLists.txt:371-402), reports library_name hatari and the
HATARI_VERSION string 2.6.1-devel (src/retro/main_retro.c:219-220,
src/includes/version.h:8). The .info shipped in the tree declares no
firmware (share/libretro/info/libretro-hatari.info); the
hatari_libretro.info in libretro-core-info still describes the 1.8 port
and its tos.img MD5, which this code never checks.
# TOS version/machine compatibility (enforced in tos.c TOS_CheckSysConfig):
# TOS 1.00-1.04 -> ST only, 68000
# TOS 1.06/1.62 -> STE only
# TOS 2.0x -> ST/STE (patched for ST compatibility)
# TOS 3.0x -> TT only, 68030+
# TOS 4.0x -> Falcon only, 68020+
# EmuTOS -> all machine types (no version constraint)
retro_init builds <system>/tos.img, records whether it exists and passes
it as --tos (src/retro/main_retro.c:157-204); when it is absent a
frontend message is shown and retro_run only refreshes the framebuffer
(src/retro/main_retro.c:186-189, src/retro/main_retro.c:251-262). The
name is fixed by that check: the .rom and .tos fallbacks of File_Read
(src/tos.c:61-67, src/file.c:298-339, src/file.c:530-569) are never
reached under a frontend. Without a system directory Main_Init runs
with no --tos and the TOS path falls back to tos.img in the Hatari data
directory derived from the executable location (src/configuration.c:810-812,
src/paths.c:299-331, CMakeLists.txt:418-430). TOS_LoadImage strips the
256-byte (34-byte for 4.92) loader of a RAM TOS, detects EmuTOS by ETOS
at offset 0x2c, refuses images below 0x40 bytes, above 1 MB, with a
version outside 0x100-0x6FF or a load address other than 0xE00000 or
0xFC0000, and coerces machine type and CPU to the TOS version unless
the image is a 512 KB or larger EmuTOS (src/tos.c:976-1097,
src/tos.c:838-969). ROM patches apply when the hatari_patch_tos option
is on (src/retro/options.c:250-263, src/retro/options.c:784). No TOS is
embedded. Because nSymbolsAutoLoad defaults to SYM_AUTOLOAD_DEBUGGER
(src/configuration.c:621, src/includes/configuration.h:29-31), every TOS
load also reads a <tos>.sym symbol table when one exists
(src/tos.c:1094, src/debug/symbols.c:1095-1113,
src/debug/symbols.c:1002-1020, src/debug/symbols.c:372-407).
# Libretro core search paths (libretro.c):
# 1. <system>/tos.img (legacy default)
# 2. <system>/hatari/tos/ directory (all .img/.rom/.tos files listed as options)
# Core option "hatari_tosimage" selects which TOS image to use.
The Hatari home directory is the RetroArch save directory
(src/paths.c:236-250). Configuration is read from <CONFDIR>/hatari.cfg,
/etc on Unix and the current directory on Windows, then from hatari.cfg
in that home directory, before the --tos argument is applied
(src/main.c:256-278, src/main.c:315-318, src/configuration.c:862-867,
src/configuration.c:1061-1071, CMakeLists.txt:440-457). Every section is
honoured: the cartridge image (src/configuration.c:487-493), floppy
images, GEMDOS directories and ACSI, SCSI and IDE images
(src/configuration.c:362-364, src/configuration.c:375-483), MIDI, printer
and RS232 host endpoints (src/configuration.c:509-543), all disabled by
default (src/configuration.c:736-761) and opened by Midi_Host_Open,
Printer_TransferByteTo and RS232_OpenCOMPort when enabled
(src/midi.c:342-367, src/printer.c:42-65, src/printer.c:89-106,
src/rs232.c:175-230). szMappingFileName is parsed
(src/configuration.c:256) but the port's Keymap_LoadRemapFile is empty
(src/retro/keymap.c:222-224); only the SDL build reads a keymap file
(src/sdl/keymap.c:701). The autosave snapshot is restored by
M68000_Start (src/m68000.c:332-348), which the port never calls. TT and
Falcon NVRAM is hatari.nvram in the home directory, read at NvRam_Init
and written at exit (src/falcon/nvram.c:282-294,
src/falcon/nvram.c:334-337).
Content is a floppy image, an .m3u list parsed relative to its own
directory (src/retro/disk_control.c:96-184), an .ide image put on the
IDE master, a .vhd image put on ACSI 0 or a .gem marker naming a GEMDOS
directory (src/retro/main_retro.c:370-424, src/retro/harddisk.c:32-129).
With a .gem, <system>/hatari/BOOT.ST is inserted into drive A when it
exists (src/retro/harddisk.c:104-127). A disk whose name ends in A pulls
the sibling ending in B into drive B (src/floppy.c:300-343,
src/floppy.c:385-388), and an STX image reads its .wd1772 overlay from
the same directory (src/floppies/stx.c:807-825). Savestates pass through
hatari_savestate.tmp in the system directory
(src/retro/main_retro.c:41, src/retro/main_retro.c:293-357). IPF support
is compiled in from rsn8887/capsimg when ENABLE_STATIC_CAPSIMAGE is on
(cmake/BuildDependencies.cmake:93-126); the Windows and Vita CI jobs turn
it off (.gitlab-ci-libretro.yml:97, .gitlab-ci-libretro.yml:105,
.gitlab-ci-libretro.yml:189).
File access goes through the libretro VFS when the frontend provides it
(src/retro/vfs.c:17-49, src/file.c:239-286, src/file.c:465-478).
files:
# -- Primary TOS ROM (required) --
# At minimum one TOS image must be present. The most commonly used
# version is TOS 1.02, which is the default for Atari ST emulation.
- name: "tos.img"
path: "tos.img"
description: "Atari TOS ROM image"
required: true
max_size: 1048576
validation: [size]
source_ref: "src/retro/main_retro.c:157-204, src/retro/main_retro.c:251-262, src/options.c:1937-1945, src/tos.c:61-67, src/tos.c:976-1097, src/tos.c:838-969, src/file.c:298-339"
note: >
TOS ROM image. Any valid version (1.00 through 4.04) or EmuTOS works.
The core auto-detects version from the ROM header and adjusts machine type.
Default location is system/tos.img, additional images go in system/hatari/tos/.
source_ref: "src/tos.c:575-696, libretro/libretro.c:390-413"
Any TOS 1.00 to 4.04, TOS 0.00, a RAM TOS or EmuTOS. The file must
carry this exact name: retro_init only enables emulation when
<system>/tos.img exists.
# -- Cartridge ROM (optional) --
# External cartridge image, max 128 KB. Formats: .img, .rom, .stc
# Cannot be used together with GEMDOS HD emulation or extended VDI resolution.
- name: "tos.sym"
path: "tos.sym"
description: "Symbol table for the TOS image, nm-style text or a program symbol table"
required: false
storage: user_provided
unsourceable: "matches whichever image is installed as tos.img; EmuTOS releases ship one per ROM, Atari TOS has none"
source_ref: "src/tos.c:1094, src/debug/symbols.c:1095-1113, src/debug/symbols.c:1002-1020, src/debug/symbols.c:372-407, src/configuration.c:621, src/includes/configuration.h:29-31"
note: >
Read next to tos.img at every TOS load when present; the symbols
serve the built-in debugger.
- name: "cartridge ROM"
path: null # user-configured via szCartridgeImageFileName
path: null
config_key: "szCartridgeImageFileName"
description: "Atari ST cartridge image loaded at 0xFA0000"
required: false
max_size: 131076 # 0x20004 (.stc with 4-byte header) or 0x20000 (raw)
min_size: 40
max_size: 131076
validation: [size]
source_ref: "src/cart.c:39-46, src/cart.c:52-88, src/cart.c:97-105, src/cart.c:115-141, src/configuration.c:487-493, src/configuration.c:814"
note: >
External cartridge image. Loaded to address 0xFA0000.
STC format images (0x20004 bytes) have a 4-byte header that is stripped.
Mutually exclusive with GEMDOS hard disk emulation and extended VDI.
source_ref: "src/cart.c:53-88"
Set through hatari.cfg. Raw images up to 0x20000 bytes or .stc
images of exactly 0x20004 bytes whose 4-byte header is skipped;
extensions .img, .rom and .stc are tried when the configured path is
missing. Replaced by the built-in GEMDOS trampoline whenever GEMDOS
hard disk emulation, extended VDI or OS tracing is on.
- name: "BOOT.ST"
path: "hatari/BOOT.ST"
description: "Boot floppy inserted with GEMDOS hard disk folders"
required: false
source_ref: "src/retro/harddisk.c:78-129, src/retro/main_retro.c:393-396"
note: "Inserted into drive A when the content is a .gem file."
- name: "hatari.cfg"
path: null
description: "Hatari configuration file"
required: false
storage: user_provided
unsourceable: "user settings in Hatari's INI format; no canonical contents"
source_ref: "src/main.c:256-278, src/main.c:315-318, src/configuration.c:862-867, src/configuration.c:1061-1071, src/paths.c:236-250, CMakeLists.txt:440-457"
note: >
Floppy image used for GEMDOS HD bootstrapping with .gem files.
Libretro port addition (not in upstream Hatari).
source_ref: "libretro/libretro.c:1669"
Read from <CONFDIR>/hatari.cfg and then from hatari.cfg in the
RetroArch save directory, before the --tos argument is applied.
# Supported TOS versions (from patch table in tos.c):
# 0x100 - TOS 1.00 (ST, 68000 only, no VDI extensions)
# 0x102 - TOS 1.02 (ST, most common for gaming)
# 0x104 - TOS 1.04 (ST, adds autostart support)
# 0x106 - TOS 1.06 (STE only)
# 0x162 - TOS 1.62 (STE only)
# 0x205 - TOS 2.05 (STE native, patched for ST)
# 0x206 - TOS 2.06 (STE/ST)
# 0x306 - TOS 3.06 (TT, 68030+)
# 0x400 - TOS 4.00 (Falcon, 68020+)
# 0x401 - TOS 4.01 (Falcon)
# 0x402 - TOS 4.02 (Falcon)
# 0x404 - TOS 4.04 (Falcon)
# 0x492 - TOS 4.92 (RAM TOS variant)
# TOS ROM sizes (typical):
# 192 KB (0x30000) - TOS 1.0x (loaded at 0xFC0000)
# 256 KB (0x40000) - TOS 2.0x+ (loaded at 0xE00000)
# Up to 1 MB - maximum accepted by the loader
# File extensions scanned: .img, .rom, .tos
notes:
emutos_note: >
EmuTOS is a free open-source TOS replacement that works with all machine types.
Hatari detects it via the 'ETOS' signature at ROM offset 0x2c and skips
machine-type enforcement and ROM patches.
gemdos_boot_note: >
When using GEMDOS hard disk mode with .gem files, the core also loads
system/hatari/BOOT.ST as a floppy image for bootstrapping.
libretro_path_note: >
The libretro core checks system/tos.img first for backward compatibility,
then scans system/hatari/tos/ for additional TOS images exposed as core options.
- name: "hatari.nvram"
path: null
description: "TT and Falcon NVRAM contents, 50 bytes"
required: false
has_builtin: true
min_size: 50
validation: [size]
storage: user_provided
unsourceable: "machine state the emulator writes itself at exit; no canonical contents"
source_ref: "src/falcon/nvram.c:96-97, src/falcon/nvram.c:116-141, src/falcon/nvram.c:148-171, src/falcon/nvram.c:282-294, src/falcon/nvram.c:334-337, src/paths.c:236-250, src/main.c:204"
note: >
Read from the RetroArch save directory at NvRam_Init; a short read
keeps the built-in defaults. Saved back on exit.
+208
View File
@@ -0,0 +1,208 @@
emulator: hatariB
type: libretro
core_classification: community_fork
source: "https://github.com/bbbradsmith/hatariB"
upstream: "https://github.com/hatari/hatari"
profiled_date: "2026-09-03"
source_commit: "e9bbbd5fb35076402dc6b3c8ee3259e1809001cf"
upstream_commit: "6a8e26d69fb32d61efd398dc1ad9a77122400034"
core_version: "0.5"
display_name: "Atari - ST/STE/TT/Falcon (hatariB)"
cores:
- hatarib
systems:
- atari-st
- atari-ste
- atari-tt
- atari-falcon
notes: |
hatariB carries Hatari 2.6.1 in its hatari/ directory, every change
fenced by __LIBRETRO__ (DEVELOP.md:7-14, DEVELOP.md:44-48), and
builds as hatarib (makefile.libretro:1-3, core/core.c:1134); the
upstream_commit is the v2.6.1 tag the tree was taken from. The core
reads and writes through core_file.c, using the libretro VFS when the
frontend offers version 3 (core/core_file.c:747-790). Hatari's own
directory strings are replaced by <nopath> (hatari/src/paths.c:339-350),
hatari.cfg is never read because Main_LoadInitialConfig calls
core_config_init instead (hatari/src/main.c:984-1012,
core/core_config.c:1421-1426), and printer, RS232 and keymap file
settings keep their disabled defaults with no option to change them
(hatari/src/configuration.c:728, hatari/src/keymap.c:63,
hatari/src/keymap.c:699-718).
At retro_set_environment the core looks for <system>/tos.img and lists
every entry of <system>/hatarib/, up to 128 files and 16 directories
(core/core_file.c:13-14, core/core_file.c:791-851). Those lists fill the
hatarib_tos, hatarib_cartridge and hatarib_hardimg options, 100 values
each: TOS candidates end in .img, .rom, .bin or .tos, cartridges in .img,
.rom, .bin or .cart, hard disks are any file or subdirectory
(core/core_config.c:11, core/core_config.c:1299-1366). The TOS option
defaults to <tos.img> when the file exists and to EmuTOS 192uk otherwise
(core/core_config.c:68-92, core/core_config.c:1306-1321); the four
special values select tos.img or one of the built-in images, any other
value is a path under the system directory
(core/core_config.c:1094-1117). TOS_LoadImage copies the built-in image
or reads the file with core_read_file_system and caches it
(hatari/src/tos.c:45-63, hatari/src/tos.c:1028-1078); a failed load
raises a notification and halts the CPU instead of leaving
(hatari/src/tos.c:1080-1086, hatari/src/tos.c:1250-1262,
core/core.c:419-433, hatari/src/main.c:903-922). Validation is
upstream's (hatari/src/tos.c:1114-1160), but TOS_CheckSysConfig only
warns and never switches machine or CPU (hatari/src/tos.c:859-1000). The
hatarib_emutos_region and hatarib_emutos_framerate options rewrite the
OS header word of an EmuTOS image (hatari/src/tos.c:1351-1365,
core/core_config.c:1163-1169). Symbols_LoadTOS still runs
(hatari/src/tos.c:1193) but resolves <tos>.sym against the process
working directory, so nothing is read from the system directory.
The three EmuTOS images are EmuTOS 1.4 built from the hatarib-custom-140
branch of bbbradsmith/emutos, which lets DESKTOP.INF and NEWDESK.INF be
loaded, and are compiled in through emutos/bin_to_h.py
(DEVELOP.md:10, README.md:305-307).
A cartridge is read with core_read_file_system from the option value
(hatari/src/cart.c:40, hatari/src/cart.c:57-100) and disabled with
GEMDOS hard disk emulation, extended VDI or OS tracing
(hatari/src/cart.c:108-147). A permanent hard disk comes from
system/hatarib through hatarib_hardimg and hatarib_hardtype, GEMDOS
folder, ACSI, SCSI or IDE (core/core_config.c:186-233,
core/core_config.c:1000-1057, core/core_config.c:1151-1162); temporary
ones are content with an .acsi, .ahd, .vhd, .scsi, .shd, .ide or .gem
extension or lines of an M3U (core/core_disk.c:16-23,
core/core_disk.c:676-713, core/core_disk.c:782-785,
core/core_config.c:1059-1087). Images open through core_file_open_hard
(hatari/src/hdc.c:903, hatari/src/hdc.c:961-963,
hatari/src/ide.c:663-666) and GEMDOS folders through core_scandir_hard
(hatari/src/gemdos.c:663, hatari/src/gemdos.c:761,
hatari/src/gemdos.c:1321); hard disks are write protected by default
(hatari/src/configuration.c:918). Floppy content is ST, MSA, DIM, STX,
IPF or CTR, also inside a ZIP, ZST or GZ, or an M3U or M3U8 list with
#BOOTA, #BOOTB, #AUTO and #RES directives (core/core_disk.c:14-24,
core/core_disk.c:202-384, core/core_disk.c:444-559,
core/core_disk.c:621-670). Before the original image the core takes a
same-named copy from the save directory and, for STX, a .wd1772 overlay
there (core/core_disk.c:787-814); modified disks are written back to
the save directory (core/core_disk.c:1154-1226, hatari/src/st.c:93,
hatari/src/msa.c:417, hatari/src/floppy_stx.c:451). #AUTO and #RES
write a virtual INF file to system/hatarib.tmp
(hatari/src/inffile.c:761) and, when booting from a GEMDOS C: folder,
read the DESKTOP.INF, NEWDESK.INF or EMUDESK.INF found there
(hatari/src/inffile.c:598-667). MIDI goes through the libretro MIDI
interface (core/core.c:485-545, hatari/src/midi.c:593-700); Midi_Host_Open
no longer opens files (hatari/src/midi.c:346-424).
files:
- name: "tos.img"
path: "tos.img"
description: "Atari TOS ROM image, default when present"
required: false
has_builtin: true
max_size: 1048576
validation: [size]
source_ref: "core/core_file.c:791-851, core/core_config.c:68-92, core/core_config.c:1094-1117, core/core_config.c:1306-1321, hatari/src/tos.c:1028-1160"
note: >
Any TOS 1.00 to 4.04, TOS 0.00, a RAM TOS or EmuTOS. Further images
go in system/hatarib/ with an .img, .rom, .bin or .tos extension and
are selected with the hatarib_tos option; without tos.img the
built-in EmuTOS 192uk is the default.
- name: "etos1024k.img"
description: "EmuTOS 1.4 1024 KB image, all machine types"
required: false
embedded: true
size: 1048576
md5: 1cb3775c4775bad75d24447a90a2890b
sha1: 38dc8baf5224229df55e7d0804b6b7b6bacfc7a0
sha256: 757c571b98b955887ea6d9034513555f4263040420e9d2195cd0c6f8de06c451
crc32: 118b35b4
source_ref: "emutos/bin_to_h.py:1-30, hatari/src/tos.c:45-63, hatari/src/tos.c:1038-1046, core/core_config.c:76, core/core_config.c:1096-1116"
note: >
Compiled into the core from emutos/etos1024k.img and never opened at
run time. Built from the hatarib-custom-140 branch of
bbbradsmith/emutos; hashes are of the file in the repository.
- name: "etos192uk.img"
description: "EmuTOS 1.4 192 KB UK image, 50 Hz, default TOS"
required: false
embedded: true
size: 196608
md5: 5f5730d9b557c44ddb9bc410ce2925d8
sha1: ef3a3ccffcb317bff7d0dceca0abacefc3a58abc
sha256: 5c679e6b1b8ed178fa079e4957ed66f9277094f0fe0a5b50c8cbea041e220250
crc32: fe4c3ff1
source_ref: "emutos/bin_to_h.py:1-30, hatari/src/tos.c:45-63, hatari/src/tos.c:1038-1046, core/core_config.c:77, core/core_config.c:91, core/core_config.c:1096-1116"
note: >
Compiled into the core from emutos/etos192uk.img and never opened at
run time. Selected when no tos.img exists and no other image is
chosen. Built from the hatarib-custom-140 branch of
bbbradsmith/emutos; hashes are of the file in the repository.
- name: "etos192us.img"
description: "EmuTOS 1.4 192 KB US image, 60 Hz"
required: false
embedded: true
size: 196608
md5: 796f62574413bc59ca767063b3184f90
sha1: bb98cd8a50df53afecfe183b049eda4014fc0d05
sha256: ccccc420908012e03b4b38b8ed4530923bb04f27ab189eb2c694bf7e8509b666
crc32: 18030f9a
source_ref: "emutos/bin_to_h.py:1-30, hatari/src/tos.c:45-63, hatari/src/tos.c:1038-1046, core/core_config.c:78, core/core_config.c:1096-1116"
note: >
Compiled into the core from emutos/etos192us.img and never opened at
run time. Built from the hatarib-custom-140 branch of
bbbradsmith/emutos; hashes are of the file in the repository.
- name: "cartridge ROM"
path: null
config_key: "hatarib_cartridge"
description: "Atari ST cartridge image loaded at 0xFA0000"
required: false
min_size: 40
max_size: 131076
validation: [size]
source_ref: "core/core_config.c:166-185, core/core_config.c:1145-1149, core/core_config.c:1332-1344, core/core_file.c:256-259, hatari/src/cart.c:40, hatari/src/cart.c:57-100, hatari/src/cart.c:108-147"
note: >
Any file of system/hatarib/ with an .img, .rom, .bin or .cart
extension. Raw images up to 0x20000 bytes or .stc images of exactly
0x20004 bytes whose 4-byte header is skipped. Replaced by the
built-in GEMDOS trampoline whenever GEMDOS hard disk emulation,
extended VDI or OS tracing is on.
- name: "hatarib.nvram"
path: "hatarib.nvram"
description: "TT and Falcon NVRAM contents, 50 bytes"
required: false
has_builtin: true
min_size: 50
validation: [size]
storage: user_provided
unsourceable: "machine state the emulator writes itself when the content closes; no canonical contents"
source_ref: "hatari/src/falcon/nvram.c:97, hatari/src/falcon/nvram.c:111-117, hatari/src/falcon/nvram.c:127-170, hatari/src/falcon/nvram.c:178-205, hatari/src/falcon/nvram.c:317-330, hatari/src/falcon/nvram.c:371-374, hatari/src/falcon/nvram.h:54-58, core/core_file.c:273-277, core/core_file.c:319-322"
note: >
Read from the system directory at NvRam_Init for the TT and Falcon
machines only; a read shorter than 50 bytes keeps the built-in
defaults. Written back when the core shuts down.
- name: "capsimg.so"
path: null
description: "CAPSImage 5.1 shared library for IPF and CTR floppy images, Linux, macOS, Android and Raspberry Pi builds"
required: false
source_ref: "hatari/src/floppy_ipf.c:320-331, hatari/src/floppy_ipf.c:632-640, hatari/src/floppy_ipf.c:686-744, hatari/src/floppy_ipf.c:752-764, hatari/CMakeLists.txt:246, hatari/cmake/config-cmake.h:99-101, DEVELOP.md:56, DEVELOP.md:59"
note: >
Opened with dlopen on the first IPF or CTR read, from the dlopen
search path or next to the core, and required to export the CAPS
functions the core imports; without it those images are refused
with a notification and every other format still works.
rsn8887/capsimg publishes one build per platform under this name.
- name: "capsimg.dll"
path: null
description: "CAPSImage 5.1 shared library for IPF and CTR floppy images, Windows build"
required: false
source_ref: "hatari/src/floppy_ipf.c:320-331, hatari/src/floppy_ipf.c:632-640, hatari/src/floppy_ipf.c:686-744, hatari/src/floppy_ipf.c:752-764, DEVELOP.md:56"
note: >
Opened with LoadLibrary on the first IPF or CTR read, from the
RetroArch directory or the library search path; without it those
images are refused with a notification and every other format still
works.