{
  "commit": "d38cd580364b2c788e633b9e51c15e1668f726c0",
  "count": 1,
  "generated_at": "2026-11-03T13:36:34Z",
  "items": [
    {
      "id": "hatari",
      "profile": {
        "core_classification": "official_port",
        "core_version": "2.6.1-devel",
        "cores": [
          "hatari",
          "HATARISA",
          "hatarisa"
        ],
        "data_root": {
          "linux": {
            "note": "~/.hatari is used instead when it exists and ~/.config/hatari does not. Holds hatari.cfg, hatari.nvram and auto.sav. The default tos.img is read from ../share/hatari beside the bin directory.",
            "path": "~/.config/hatari",
            "source_ref": "upstream src/paths.c:24-29, upstream src/paths.c:201-274"
          },
          "macos": {
            "note": "Holds hatari.cfg, hatari.nvram and auto.sav. The default tos.img is read from the bundle's Resources folder.",
            "path": "~/Library/Application Support/Hatari",
            "source_ref": "upstream src/paths.c:24-29, upstream src/paths.c:201-274"
          },
          "windows": {
            "note": "Holds hatari.cfg, hatari.nvram and auto.sav. The default tos.img is read from the directory of the executable.",
            "path": "%USERPROFILE%/AppData/Local/Hatari",
            "source_ref": "upstream src/paths.c:24-29, upstream src/paths.c:201-274"
          }
        },
        "display_name": "Atari - ST/STE/TT/Falcon (Hatari)",
        "emulator": "Hatari",
        "files": [
          {
            "description": "Atari TOS ROM image",
            "max_size": 1048576,
            "min_size": 64,
            "name": "tos.img",
            "note": "Any TOS 1.00 to 4.04, TOS 0.00, a RAM TOS or EmuTOS. The file must carry this exact name in the libretro build: retro_init only enables emulation when <system>/tos.img exists. The standalone program opens tos.img in its data directory unless --tos or the szTosImageFileName key of hatari.cfg names another file. A missing name is retried with its extension replaced by .img, .rom and .tos, so tos.rom and tos.tos stand in for the default, and a .gz or archive is unpacked first. The program exits when no image loads and none is picked in the settings dialog (src/options.c:1937-1940, src/configuration.c:489, src/tos.c:983, src/main.c:191-201).\n",
            "path": "tos.img",
            "required": true,
            "source_ref": "source src/retro/main_retro.c:160-211, source src/retro/main_retro.c:286-299, source src/options.c:1937-1945, source src/configuration.c:489, source src/tos.c:60-66, source src/tos.c:976-1097, source src/tos.c:838-969, source src/file.c:312-353, upstream src/configuration.c:810-812, upstream src/paths.c:316-330, upstream CMakeLists.txt:383-394, upstream src/main.c:191-201, upstream src/reset.c:66-68, upstream src/file.c:275-308, upstream src/file.c:481-520, upstream src/CMakeLists.txt:79, upstream src/CMakeLists.txt:391-398",
            "validation": [
              "size"
            ]
          },
          {
            "description": "Symbol table for the TOS image, nm-style text or a program symbol table",
            "name": "tos.sym",
            "note": "The name is the TOS image path with its last three characters replaced by sym, and the image path is always tos.img here: retro_init passes <system>/tos.img as --tos and no other image name reaches the loader, so a table named after another image, emutos.sym beside emutos.img, is never opened. nSymbolsAutoLoad gates the read. Its default is not off and no core option changes it, so the table is read at every TOS load when present. The standalone program derives the name the same way from the image it opens, tos.sym beside the default tos.img in its data directory. The symbols serve the built-in debugger.\n",
            "path": "tos.sym",
            "required": false,
            "source_ref": "source src/tos.c:1094, source src/debug/symbols.c:1095-1113, source src/debug/symbols.c:1002-1020, source src/debug/symbols.c:372-407, source src/configuration.c:621, source src/includes/configuration.h:29-31, source src/retro/main_retro.c:186-198",
            "storage": "user_provided",
            "unsourceable": "one table per TOS build, valid only beside the image it was linked with: each EmuTOS release archive carries the table of its ROM, etos512k.sym beside etos512k.img, and Atari TOS has none"
          },
          {
            "description": "Floppy drive sample, signed 16-bit little-endian stereo at 44100 Hz, no header",
            "has_builtin": true,
            "max_size": 16777216,
            "min_size": 4,
            "mode": "libretro",
            "name": "floppy.raw",
            "note": "Read whole at retro_init when its size is between 4 bytes and 16 MB, and resampled to the core's audio rate. Otherwise the built-in synthesised sound plays (src/retro/floppy_sound.c:48-101). Played when a drive LED comes on while hatari_floppy_sound is enabled, its default.\n",
            "path": "floppy.raw",
            "required": false,
            "source_ref": "source src/retro/floppy_sound.c:146-186, source src/retro/floppy_sound.c:130-143, source src/retro/main_retro.c:185, source src/retro/statusbar.c:129-130, source src/retro/options.c:369-383, source src/retro/options.c:914-916",
            "storage": "user_provided",
            "unsourceable": "any headerless s16le stereo 44100 Hz sample the user records, with no name or version the code expects beyond the filename",
            "validation": [
              "size"
            ]
          },
          {
            "config_key": "szCartridgeImageFileName",
            "description": "Atari ST cartridge image loaded at 0xFA0000",
            "max_size": 131076,
            "min_size": 40,
            "name": "cartridge ROM",
            "note": "Set through hatari.cfg, or with --cartridge in the standalone program. 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, program autostart or OS tracing is on.\n",
            "path": null,
            "required": false,
            "source_ref": "source src/cart.c:41-47, source src/cart.c:53-88, source src/cart.c:97-104, source src/cart.c:114-142, source src/configuration.c:487-493, source src/configuration.c:814, upstream src/options.c:1951-1959",
            "validation": [
              "size"
            ]
          },
          {
            "description": "Boot floppy inserted with GEMDOS hard disk folders",
            "mode": "libretro",
            "name": "BOOT.ST",
            "note": "Inserted into drive A when the content is a .gem file.",
            "path": "hatari/BOOT.ST",
            "required": false,
            "source_ref": "source src/retro/harddisk.c:78-129, source src/retro/main_retro.c:442-446"
          },
          {
            "description": "Hatari configuration file",
            "name": "hatari.cfg",
            "note": "Read from <CONFDIR>/hatari.cfg and then from hatari.cfg in the RetroArch save directory, before the --tos argument and the boot core options are applied. The standalone program reads the second file from its home directory, ~/.config/hatari on Linux, or from the file -c names.\n",
            "path": null,
            "required": false,
            "source_ref": "upstream src/main.c:260-282, source src/main.c:319-322, source src/main.c:328-330, source src/configuration.c:862-867, source src/configuration.c:1061-1071, upstream src/paths.c:236-250, source CMakeLists.txt:444-461, upstream src/options.c:1283-1289, upstream src/paths.c:24-29",
            "standalone_path": "hatari.cfg",
            "storage": "user_provided",
            "unsourceable": "user settings in Hatari's INI format, with no canonical contents"
          },
          {
            "description": "TT and Falcon NVRAM contents, 50 bytes",
            "has_builtin": true,
            "min_size": 50,
            "name": "hatari.nvram",
            "note": "Read from the RetroArch save directory at NvRam_Init, and from the Hatari home directory in the standalone program. A short read keeps the built-in defaults. Saved back on exit.\n",
            "path": null,
            "required": false,
            "source_ref": "source src/falcon/nvram.c:96-97, source src/falcon/nvram.c:116-141, source src/falcon/nvram.c:148-171, source src/falcon/nvram.c:282-294, source src/falcon/nvram.c:334-337, upstream src/paths.c:236-250, source src/main.c:208, upstream src/paths.c:24-29",
            "standalone_path": "hatari.nvram",
            "storage": "user_provided",
            "unsourceable": "machine state the emulator writes itself at exit, with no canonical contents",
            "validation": [
              "size"
            ]
          },
          {
            "config_key": "szMappingFileName",
            "description": "Host key to ST scancode remapping table, text",
            "mode": "standalone",
            "name": "keymap file",
            "note": "Named by --keymap or the szMappingFileName key, empty by default. Read at start and again when the setting changes. A missing file logs a warning and keeps the default mapping.\n",
            "path": null,
            "required": false,
            "source_ref": "upstream src/configuration.c:256, upstream src/configuration.c:719, upstream src/options.c:2236-2242, upstream src/main.c:178, upstream src/change.c:419-422, upstream src/sdl/keymap.c:47, upstream src/sdl/keymap.c:701-725",
            "storage": "user_provided",
            "unsourceable": "user settings in Hatari's keymap text format, with no canonical contents"
          },
          {
            "bundled": true,
            "crc32": "1639262c",
            "description": "Window icon",
            "md5": "f5e9c46fbbdc660d024a1bdd286a05ef",
            "mode": "standalone",
            "name": "hatari-icon.bmp",
            "note": "Loaded with SDL_LoadBMP from the data directory when the window is created. Without it the window keeps the default icon. Installed from src/hatari-icon.bmp, whose hashes these are.\n",
            "path": null,
            "required": false,
            "sha1": "48be1de23a980bca15a8ed3cb92917340e43bbee",
            "sha256": "0e083a340ad2e522de94e5121565a4730f99d6ee3638c74f5a2c3be579529155",
            "size": 630,
            "source_ref": "upstream src/sdl/screen.c:711-720, upstream src/CMakeLists.txt:391-394"
          }
        ],
        "logo": "https://raw.githubusercontent.com/hatari/hatari/main/share/icons/hicolor/scalable/apps/hatari.svg",
        "notes": "The main branch of libretro/hatari is the upstream Hatari tree with its\nexperimental libretro target in src/retro, which upstream added in\nJanuary 2026, plus the port commits that follow their merge base,\n51ed9991: VFS, disk control, core options, hard disk loading, the\nvirtual keyboard, drive LEDs and the floppy drive sound. It builds as\nhatari_libretro (.gitlab-ci-libretro.yml:10-11, src/CMakeLists.txt:371-404),\nreports library_name hatari and the HATARI_VERSION string 2.6.1-devel\n(src/retro/main_retro.c:223-224, src/includes/version.h:8). The .info\nshipped in the tree declares no firmware\n(share/libretro/info/libretro-hatari.info). The\nhatari_libretro.info in libretro-core-info took that file's metadata on\n2026-09-16 and keeps a tos.img firmware entry with the TOS 1.02 US MD5,\nwhich this code never checks.\n\nretro_init builds <system>/tos.img, records whether it exists and passes\nit as --tos (src/retro/main_retro.c:160-211). It first reads floppy.raw\nfrom the system directory as the floppy drive sample\n(src/retro/main_retro.c:185, src/retro/floppy_sound.c:146-186). When\ntos.img is absent a frontend message is shown and retro_run only\nrefreshes the framebuffer (src/retro/main_retro.c:190-193,\nsrc/retro/main_retro.c:286-299). The\nname is fixed by that check: the .rom and .tos fallbacks of File_Read\n(src/tos.c:60-66, src/file.c:312-353, src/file.c:544-583) are never\nreached under a frontend. A missing --tos file fails option parsing\n(src/options.c:1026-1079, src/options.c:1937-1945), but Main_ErrorExit only\nraises the quit flag in this build (src/retro/main_retro.c:529-541), so\nMain_Init carries on with bUseTos cleared and TOS_InitImage installs the\nbuilt-in test stub of faketosData.c instead of reading a ROM\n(src/tos.c:43, src/tos.c:1112-1131, src/tos.c:1151-1162). Without a\nsystem directory Main_Init runs with no --tos, the TOS path falls back to\ntos.img in the Hatari data directory derived from the executable location\n(src/configuration.c:810-812, src/paths.c:305-356, CMakeLists.txt:422-434)\nand have_bios is never set. TOS_LoadImage strips the 256-byte (34-byte\nfor 4.92) loader of a RAM TOS, detects EmuTOS by ETOS at offset 0x2c,\nrefuses images below 0x40 bytes, above 1 MB, with a version outside\n0x100-0x6FF or a load address other than 0xE00000 or 0xFC0000, and\ncoerces machine type and CPU to the TOS version unless the image is a\n512 KB or larger EmuTOS (src/tos.c:976-1097, src/tos.c:838-969). ROM\npatches apply when the hatari_patch_tos option is on and the image is\nnot EmuTOS (src/retro/options.c:252-265, src/retro/options.c:877,\nsrc/tos.c:1220-1222). No TOS is embedded. Because nSymbolsAutoLoad\ndefaults to SYM_AUTOLOAD_DEBUGGER (src/configuration.c:621,\nsrc/includes/configuration.h:29-31), every TOS load also reads a\n<tos>.sym symbol table when one exists (src/tos.c:1094,\nsrc/debug/symbols.c:1095-1113, src/debug/symbols.c:1002-1020,\nsrc/debug/symbols.c:372-407).\n\nThe Hatari home directory is the RetroArch save directory\n(src/paths.c:236-250). Configuration is read from <CONFDIR>/hatari.cfg,\n/etc on Unix and the current directory on Windows, then from hatari.cfg\nin that home directory, before the --tos argument is applied\n(src/main.c:260-282, src/main.c:319-322, src/configuration.c:862-867,\nsrc/configuration.c:1061-1071, CMakeLists.txt:444-461). The boot core\noptions are applied right after the command line, so the machine, DSP,\nCPU, FPU, memory and hatari_patch_tos keys of hatari.cfg are overwritten\nby them (src/main.c:328-330, src/retro/options.c:817-882). Every other\nsection is honoured: the cartridge image (src/configuration.c:487-493),\nfloppy images, GEMDOS directories and ACSI, SCSI and IDE images\n(src/configuration.c:362-364, src/configuration.c:375-483), MIDI, printer,\nRS232 and SCC host endpoints (src/configuration.c:509-543), all disabled\nby default (src/configuration.c:736-761) and opened by Midi_Host_Open,\nPrinter_TransferByteTo, RS232_OpenCOMPort and SCC_Init_Channel when\nenabled (src/midi.c:342-367, src/printer.c:42-65, src/printer.c:89-106,\nsrc/rs232.c:175-246, src/scc.c:439-500). szMappingFileName is parsed\n(src/configuration.c:256) but the port's Keymap_LoadRemapFile is empty\n(src/retro/keymap.c:222-224). Only the SDL build reads a keymap file\n(src/sdl/keymap.c:701). The autosave snapshot is restored by\nM68000_Start (src/m68000.c:332-348), which the port never calls. TT and\nFalcon NVRAM is hatari.nvram in the home directory, read at NvRam_Init\nand written at exit (src/falcon/nvram.c:282-294,\nsrc/falcon/nvram.c:334-337).\n\nContent is a floppy image, an .m3u list parsed relative to its own\ndirectory (src/retro/disk_control.c:94-182), an .ide image put on the\nIDE master, a .vhd image put on ACSI 0 or a .gem marker naming a GEMDOS\ndirectory (src/retro/main_retro.c:420-478, src/retro/harddisk.c:32-129).\nWith a .gem, <system>/hatari/BOOT.ST is inserted into drive A when it\nexists (src/retro/harddisk.c:105-127). A disk whose name ends in A pulls\nthe sibling ending in B into drive B (src/floppy.c:300-343,\nsrc/floppy.c:385-388), and an STX image reads its .wd1772 overlay from\nthe same directory (src/floppies/stx.c:807-827). Savestates pass through\nhatari_savestate.tmp in the system directory\n(src/retro/main_retro.c:44, src/retro/main_retro.c:343-410). IPF support\nis compiled in from rsn8887/capsimg when ENABLE_STATIC_CAPSIMAGE is on\n(cmake/BuildDependencies.cmake:93-126). The Windows jobs build with it\nsince September 2026 (.gitlab-ci-libretro.yml:101,\n.gitlab-ci-libretro.yml:109) and the static Vita, Wii, Wii U and Switch\njobs turn it off (.gitlab-ci-libretro.yml:193, .gitlab-ci-libretro.yml:202,\n.gitlab-ci-libretro.yml:210, .gitlab-ci-libretro.yml:218).\nFile access goes through the libretro VFS when the frontend provides it\n(src/retro/vfs.c:17-48, src/file.c:253-302, src/file.c:479-492), and a\ndevice-prefixed path such as ux0:/ counts as absolute (src/file.c:152-164).\n\nThe standalone program is the SDL build of the upstream tree. Its default\nTOS image is tos.img in the data directory (src/configuration.c:810-812),\nwhich is the directory of the executable on Windows, ../Resources in the\nmacOS bundle and ../share/hatari beside the bin directory elsewhere\n(src/paths.c:316-330, CMakeLists.txt:383-394). --tos and the\nszTosImageFileName key replace it. When no image loads, Main_InitSubsystems\nopens the settings dialog to pick one and exits with Failed to load TOS\nimage if none is chosen (src/main.c:191-201). Nothing is compiled in as a\nfallback. The install rule copies a src/tos.img into the data directory\nwhen one is present at build time, the source tree carries none, and the\nrelease checklist puts the latest EmuTOS 1024k image in the binary\npackages (doc/release-checklist.txt:85-86). The Hatari home directory is\n~/.config/hatari, Library/Application Support/Hatari or\nAppData\\Local\\Hatari under the user's home (src/paths.c:24-29,\nsrc/paths.c:201-274). hatari.cfg is read from <CONFDIR> and then from that\nhome directory, or from the file -c names (src/main.c:256-278,\nsrc/configuration.c:862-867, src/options.c:1283-1289). hatari.nvram and\nauto.sav, restored only when bAutoSave is on, are kept there\n(src/configuration.c:727-733). The window icon is hatari-icon.bmp in the\ndata directory (src/sdl/screen.c:711-720).\n--lilo boots a Linux kernel instead of TOS, vmlinuz and initrd in the data\ndirectory by default (src/configuration.c:816-824, src/options.c:2309-2323).\nIPF images are decoded by the built-in reader unless the capsimage\nlibrary is found at build time, which then reads them, and RAW and CTR\nimages need that library (src/CMakeLists.txt:70-74,\nCMakeLists.txt:185-188).\n",
        "profiled_date": "2026-10-21",
        "source": "https://github.com/libretro/hatari",
        "source_commit": "50929946d196f431906932420c55e1b3593dacc5",
        "systems": [
          "atari-st",
          "atari-ste",
          "atari-tt",
          "atari-falcon"
        ],
        "type": "standalone + libretro",
        "upstream": "https://github.com/hatari/hatari",
        "upstream_commit": "23bc3060ebf0da348cc842e358c102ba88002b56",
        "version_basis": {
          "kind": "file",
          "path": "src/includes/version.h",
          "pattern": "^#define\\s+HATARI_VERSION\\s+\"([^\" ]+)"
        }
      }
    }
  ],
  "kind": "emulators",
  "schema_version": 1
}
