Hatari
Hatari emulates Atari ST, Atari STE, Atari TT and Atari Falcon. It reads 9 files, 1 of them required: without a required file it does not start games. A required file is needed only by the machines that use it. Each file below cites the line of source code that reads it.
Run on its own, the app reads its files from this folder:
%USERPROFILE%/
Holds hatari.cfg, hatari.nvram and auto.sav. The default tos.img is read from the directory of the executable.
Source: src/paths.c:24-29 (upstream emulator), src/paths.c:201-274 (upstream emulator)
~/
Holds hatari.cfg, hatari.nvram and auto.sav. The default tos.img is read from the bundle's Resources folder.
Source: src/paths.c:24-29 (upstream emulator), src/paths.c:201-274 (upstream emulator)
~/.config/hatari/
~/.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.
Source: src/paths.c:24-29 (upstream emulator), src/paths.c:201-274 (upstream emulator)
About this profile
Install this emulator's files
For Hatari inside RetroArch, Batocera or another setup. The installer finds your setup and its BIOS folder, then downloads only the files this emulator reads there and checks each one.
Open the Start menu. Type PowerShell and open it. Paste the line. Press Enter.
&([scriptblock]::Create((irm https://abdess.github.io/retrobios/i.ps1))) --emulator hatariOpen Terminal, in Applications, then Utilities. Paste the line. Press Return.
curl -fsSL https://abdess.github.io/retrobios/i | sh -s -- --emulator hatariOpen a terminal. Paste the line. Press Enter.
curl -fsSL https://abdess.github.io/retrobios/i | sh -s -- --emulator hatariSwitch to Desktop Mode. Open Konsole. Paste with Ctrl+Shift+V. Press Enter.
curl -fsSL https://abdess.github.io/retrobios/i | sh -s -- --emulator hatariOpen a terminal on the device. Or connect from a computer with SSH, a terminal over the network. Paste the line. Press Enter.
curl -fsSL https://abdess.github.io/retrobios/i | sh -s -- --emulator hatariTechnical 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 their merge base, 51ed9991: VFS, disk control, core options, hard disk loading, the virtual keyboard, drive LEDs and the floppy drive sound. It builds as hatari_libretro (.gitlab-ci-libretro.yml:10-11, src/CMakeLists.txt:371-404), reports library_name hatari and the HATARI_VERSION string 2.6.1-devel (src/retro/main_retro.c:223-224, 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 took that file's metadata on 2026-09-16 and keeps a tos.img firmware entry with the TOS 1.02 US MD5, which this code never checks.
retro_init builds <system>/tos.img, records whether it exists and passes it as --tos (src/retro/main_retro.c:160-211). It first reads floppy.raw from the system directory as the floppy drive sample (src/retro/main_retro.c:185, src/retro/floppy_sound.c:146-186). When tos.img is absent a frontend message is shown and retro_run only refreshes the framebuffer (src/retro/main_retro.c:190-193, src/retro/main_retro.c:286-299). The name is fixed by that check: the .rom and .tos fallbacks of File_Read (src/tos.c:60-66, src/file.c:312-353, src/file.c:544-583) are never reached under a frontend. A missing --tos file fails option parsing (src/options.c:1026-1079, src/options.c:1937-1945), but Main_ErrorExit only raises the quit flag in this build (src/retro/main_retro.c:529-541), so Main_Init carries on with bUseTos cleared and TOS_InitImage installs the built-in test stub of faketosData.c instead of reading a ROM (src/tos.c:43, src/tos.c:1112-1131, src/tos.c:1151-1162). Without a system directory Main_Init runs with no --tos, 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:305-356, CMakeLists.txt:422-434) and have_bios is never set. 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 and the image is not EmuTOS (src/retro/options.c:252-265, src/retro/options.c:877, src/tos.c:1220-1222). 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).
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:260-282, src/main.c:319-322, src/configuration.c:862-867, src/configuration.c:1061-1071, CMakeLists.txt:444-461). The boot core options are applied right after the command line, so the machine, DSP, CPU, FPU, memory and hatari_patch_tos keys of hatari.cfg are overwritten by them (src/main.c:328-330, src/retro/options.c:817-882). Every other 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, RS232 and SCC host endpoints (src/configuration.c:509-543), all disabled by default (src/configuration.c:736-761) and opened by Midi_Host_Open, Printer_TransferByteTo, RS232_OpenCOMPort and SCC_Init_Channel when enabled (src/midi.c:342-367, src/printer.c:42-65, src/printer.c:89-106, src/rs232.c:175-246, src/scc.c:439-500). 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:94-182), 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:420-478, 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:105-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-827). Savestates pass through hatari_savestate.tmp in the system directory (src/retro/main_retro.c:44, src/retro/main_retro.c:343-410). IPF support is compiled in from rsn8887/capsimg when ENABLE_STATIC_CAPSIMAGE is on (cmake/BuildDependencies.cmake:93-126). The Windows jobs build with it since September 2026 (.gitlab-ci-libretro.yml:101, .gitlab-ci-libretro.yml:109) and the static Vita, Wii, Wii U and Switch jobs turn it off (.gitlab-ci-libretro.yml:193, .gitlab-ci-libretro.yml:202, .gitlab-ci-libretro.yml:210, .gitlab-ci-libretro.yml:218). File access goes through the libretro VFS when the frontend provides it (src/retro/vfs.c:17-48, src/file.c:253-302, src/file.c:479-492), and a device-prefixed path such as ux0:/ counts as absolute (src/file.c:152-164).
The standalone program is the SDL build of the upstream tree. Its default TOS image is tos.img in the data directory (src/configuration.c:810-812), which is the directory of the executable on Windows, ../Resources in the macOS bundle and ../share/hatari beside the bin directory elsewhere (src/paths.c:316-330, CMakeLists.txt:383-394). --tos and the szTosImageFileName key replace it. When no image loads, Main_InitSubsystems opens the settings dialog to pick one and exits with Failed to load TOS image if none is chosen (src/main.c:191-201). Nothing is compiled in as a fallback. The install rule copies a src/tos.img into the data directory when one is present at build time, the source tree carries none, and the release checklist puts the latest EmuTOS 1024k image in the binary packages (doc/release-checklist.txt:85-86). The Hatari home directory is ~/.config/hatari, Library/Application Support/Hatari or AppData\Local\Hatari under the user's home (src/paths.c:24-29, src/paths.c:201-274). hatari.cfg is read from <CONFDIR> and then from that home directory, or from the file -c names (src/main.c:256-278, src/configuration.c:862-867, src/options.c:1283-1289). hatari.nvram and auto.sav, restored only when bAutoSave is on, are kept there (src/configuration.c:727-733). The window icon is hatari-icon.bmp in the data directory (src/sdl/screen.c:711-720). --lilo boots a Linux kernel instead of TOS, vmlinuz and initrd in the data directory by default (src/configuration.c:816-824, src/options.c:2309-2323). IPF images are decoded by the built-in reader unless the capsimage library is found at build time, which then reads them, and RAW and CTR images need that library (src/CMakeLists.txt:70-74, CMakeLists.txt:185-188).
9 files: 1 required, 8 optional.
In this collection: 2 in repo, 2 missing and 5 unsourceable.
Required
Section titled “Required”| File | Status |
|---|---|
tos.imgAtari TOS ROM image
Validation and source
| in repo |
Optional
Section titled “Optional”| File | Status | Hash |
|---|---|---|
tos.symSymbol table for the TOS image, nm-style text or a program symbol table
Source
| unsourceable user_provided | - |
floppy.rawFloppy drive sample, signed 16-bit little-endian stereo at 44100 Hz, no header
Validation and source
| unsourceable libretro user_provided built-in fallback | - |
cartridge ROMAtari ST cartridge image loaded at 0xFA0000
Validation, source and config key
| missing | - |
BOOT.STBoot floppy inserted with GEMDOS hard disk folders
Source
| in repo libretro | - |
hatari.cfgHatari configuration file
Source
| unsourceable user_provided | - |
hatari.nvramTT and Falcon NVRAM contents, 50 bytes
Validation and source
| unsourceable user_provided built-in fallback | - |
keymap fileHost key to ST scancode remapping table, text
Source and config key
| unsourceable standalone user_provided | - |
hatari-icon.bmpWindow icon
Hashes and source
| missing standalone installed with the standalone emulator | MD5 f5e9c46fbbdc |
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