How to get Hatari to run (any) games?

Working with Windows 10 on my setup, trying to get the Hatari core for Atari ST running games. I’ve taken a look at the documentation and also ran some searches on the forums and have seen a few topics about the core and some of it’s problems recognizing the joystick, but as of now I can’t get the core to actually run any games to even be concerned about joystick recognition.

I’ve setup the /system directory with the proper tos.img and a hatari.cfg with the following information:

[Floppy]
bAutoInsertDiskB = TRUE
FastFloppy = TRUE
nWriteProtection = 0
szDiskAFileName =
szDiskBFileName =
szDiskImageDirectory =
szDiskAZipPath =
szDiskBZipPath =

[ROM]
szCartridgeImageFileName =
szTosImageFileName = tos.img 

I’m still getting just a bland-colored empty screen:

I can press Start to get to the Hatari configuration, and I can press Y (RetroPad ‘X’) to pull up an onscreen keyboard. No matter what else I do at this band-aid colored screen though I just get high-pitched beeps.

I’m not sure what step I’m missing to get software to run in this core - even if there will be control headaches once I get there.

Do you have the bios file (“tos.img”) in your retroarch\system folder?

Yes, both tos.img and hatari.cfg are in the system folder.

Is that the only information in your hatari.cfg? Mine has many more lines.

Did you make it manually or did you let the core make it by itself? Maybe you should let it automatically create the .cfg file?

Anyway, i don’t remember how i did mine so here is my hatari.cfg. Maybe you can adjust some paths to make it work.

> [Log]
> sLogFileName = stderr
> sTraceFileName = stderr
> nExceptionDebugMask = 259
> nTextLogLevel = 4
> nAlertDlgLogLevel = 1
> bConfirmQuit = TRUE
> bNatFeats = FALSE
> bConsoleWindow = FALSE
> 
> [Debugger]
> nNumberBase = 10
> nDisasmLines = 8
> nMemdumpLines = 8
> nDisasmOptions = 15
> bDisasmUAE = FALSE
> 
> [Screen]
> nMonitorType = 1
> nFrameSkips = 10
> bFullScreen = TRUE
> bKeepResolution = TRUE
> bKeepResolutionST = FALSE
> bAllowOverscan = FALSE
> nSpec512Threshold = 1
> nForceBpp = 0
> bAspectCorrect = TRUE
> bUseExtVdiResolutions = FALSE
> nVdiWidth = 640
> nVdiHeight = 480
> nVdiColors = 2
> bShowStatusbar = FALSE
> bShowDriveLed = FALSE
> bCrop = FALSE
> bForceMax = FALSE
> nMaxWidth = 832
> nMaxHeight = 520
> 
> [Joystick0]
> nJoystickMode = 1
> bEnableAutoFire = FALSE
> bEnableJumpOnFire2 = FALSE
> nJoyId = 0
> nKeyCodeUp = 273
> nKeyCodeDown = 274
> nKeyCodeLeft = 276
> nKeyCodeRight = 275
> nKeyCodeFire = 305
> 
> [Joystick1]
> nJoystickMode = 1
> bEnableAutoFire = FALSE
> bEnableJumpOnFire2 = FALSE
> nJoyId = 0
> nKeyCodeUp = 273
> nKeyCodeDown = 274
> nKeyCodeLeft = 276
> nKeyCodeRight = 275
> nKeyCodeFire = 305
> 
> [Joystick2]
> nJoystickMode = 1
> bEnableAutoFire = FALSE
> bEnableJumpOnFire2 = FALSE
> nJoyId = 1
> nKeyCodeUp = 273
> nKeyCodeDown = 274
> nKeyCodeLeft = 276
> nKeyCodeRight = 275
> nKeyCodeFire = 305
> 
> [Joystick3]
> nJoystickMode = 1
> bEnableAutoFire = FALSE
> bEnableJumpOnFire2 = FALSE
> nJoyId = 2
> nKeyCodeUp = 273
> nKeyCodeDown = 274
> nKeyCodeLeft = 276
> nKeyCodeRight = 275
> nKeyCodeFire = 305
> 
> [Joystick4]
> nJoystickMode = 0
> bEnableAutoFire = FALSE
> bEnableJumpOnFire2 = FALSE
> nJoyId = 0
> nKeyCodeUp = 273
> nKeyCodeDown = 274
> nKeyCodeLeft = 276
> nKeyCodeRight = 275
> nKeyCodeFire = 305
> 
> [Joystick5]
> nJoystickMode = 0
> bEnableAutoFire = FALSE
> bEnableJumpOnFire2 = FALSE
> nJoyId = 0
> nKeyCodeUp = 273
> nKeyCodeDown = 274
> nKeyCodeLeft = 276
> nKeyCodeRight = 275
> nKeyCodeFire = 305
> 
> [Keyboard]
> bDisableKeyRepeat = FALSE
> nKeymapType = 0
> szMappingFileName =
> 
> [ShortcutsWithModifiers]
> keyOptions = 111
> keyFullScreen = 102
> keyMouseMode = 109
> keyColdReset = 99
> keyWarmReset = 114
> keyScreenShot = 103
> keyBossKey = 105
> keyCursorEmu = 106
> keyFastForward = 120
> keyRecAnim = 97
> keyRecSound = 121
> keySound = 115
> keyPause = 0
> keyDebugger = 19
> keyQuit = 113
> keyLoadMem = 108
> keySaveMem = 107
> keyInsertDiskA = 100
> keySwitchJoy0 = 282
> keySwitchJoy1 = 283
> keySwitchPadA = 284
> keySwitchPadB = 285
> 
> [ShortcutsWithoutModifiers]
> keyOptions = 293
> keyFullScreen = 292
> keyMouseMode = 0
> keyColdReset = 0
> keyWarmReset = 0
> keyScreenShot = 0
> keyBossKey = 0
> keyCursorEmu = 0
> keyFastForward = 0
> keyRecAnim = 0
> keyRecSound = 0
> keySound = 0
> keyPause = 19
> keyDebugger = 0
> keyQuit = 0
> keyLoadMem = 0
> keySaveMem = 0
> keyInsertDiskA = 0
> keySwitchJoy0 = 0
> keySwitchJoy1 = 0
> keySwitchPadA = 0
> keySwitchPadB = 0
> 
> [Sound]
> bEnableMicrophone = TRUE
> bEnableSound = TRUE
> bEnableSoundSync = TRUE
> nPlaybackFreq = 44100
> nSdlAudioBufferSize = 0
> szYMCaptureFileName = G:\RetroArch\//hatari.wav
> YmVolumeMixing = 2
> 
> [Memory]
> nMemorySize = 1
> bAutoSave = FALSE
> szMemoryCaptureFileName = G:\RetroArch\
> szAutoSaveFileName =
> 
> [Floppy]
> bAutoInsertDiskB = TRUE
> FastFloppy = TRUE
> EnableDriveA = TRUE
> DriveA_NumberOfHeads = 2
> EnableDriveB = TRUE
> DriveB_NumberOfHeads = 2
> nWriteProtection = 0
> szDiskAZipPath =
> szDiskAFileName = G:\Hyperspin\Roms\Atari ST\Alien Storm (Europe).st
> szDiskBZipPath =
> szDiskBFileName =
> szDiskImageDirectory =
> 
> [HardDisk]
> nHardDiskDrive = 0
> bBootFromHardDisk = FALSE
> bUseHardDiskDirectory = FALSE
> szHardDiskDirectory = G:\RetroArch\/
> nGemdosCase = 0
> nWriteProtection = 0
> bUseHardDiskImage = FALSE
> szHardDiskImage = G:\RetroArch\/
> bUseIdeMasterHardDiskImage = FALSE
> bUseIdeSlaveHardDiskImage = FALSE
> szIdeMasterHardDiskImage = /
> szIdeSlaveHardDiskImage = /
> 
> [ROM]
> szTosImageFileName = G:\RetroArch\system\tos.img
> bPatchTos = TRUE
> szCartridgeImageFileName =
> 
> [RS232]
> bEnableRS232 = FALSE
> szOutFileName = G:\RetroArch\/dev/modem
> szInFileName = G:\RetroArch\/dev/modem
> 
> [Printer]
> bEnablePrinting = FALSE
> szPrintToFileName = G:\RetroArch\/root/.hatari/hatari.prn
> 
> [Midi]
> bEnableMidi = FALSE
> sMidiInFileName = G:\RetroArch\/dev/snd/midiC1D0
> sMidiOutFileName = G:\RetroArch\/dev/snd/midiC1D0
> 
> [System]
> nCpuLevel = 0
> nCpuFreq = 8
> bCompatibleCpu = TRUE
> nMachineType = 0
> bBlitter = FALSE
> nDSPType = 0
> bRealTimeClock = FALSE
> bPatchTimerD = TRUE
> bFastBoot = TRUE
> bFastForward = FALSE
> 
> [Video]
> AviRecordVcodec = 1
> AviRecordFps = 0
> AviRecordFile = G:\RetroArch\//hatari.avi
1 Like

Thanks for sharing your hatari.cfg!

The lines I had in there were from another thread on here that said they should work, which unfortunately wasn’t the case; in my case. So I tried using your info, switching the paths of course, but it didn’t work. I then tried removing the "> " on each line, just in case, but it still didn’t take.

I also tried generating my own, but that didn’t work either :frowning: This is what the Hatari core generated on my system.

[Log]
sLogFileName = stderr
sTraceFileName = stderr
nExceptionDebugMask = 259
nTextLogLevel = 4
nAlertDlgLogLevel = 1
bConfirmQuit = TRUE
bNatFeats = FALSE
bConsoleWindow = FALSE

[Debugger]
nNumberBase = 10
nDisasmLines = 8
nMemdumpLines = 8
nDisasmOptions = 15
bDisasmUAE = FALSE

[Screen]
nMonitorType = 1
nFrameSkips = 0
bFullScreen = FALSE
bKeepResolution = TRUE
bKeepResolutionST = FALSE
bAllowOverscan = TRUE
nSpec512Threshold = 1
nForceBpp = 0
bAspectCorrect = TRUE
bUseExtVdiResolutions = FALSE
nVdiWidth = 640
nVdiHeight = 480
nVdiColors = 2
bShowStatusbar = FALSE
bShowDriveLed = TRUE
bCrop = FALSE
bForceMax = FALSE
nMaxWidth = 832
nMaxHeight = 520

[Joystick0]
nJoystickMode = 1
bEnableAutoFire = FALSE
bEnableJumpOnFire2 = FALSE
nJoyId = 1
nKeyCodeUp = 273
nKeyCodeDown = 274
nKeyCodeLeft = 276
nKeyCodeRight = 275
nKeyCodeFire = 305

[Joystick1]
nJoystickMode = 1
bEnableAutoFire = FALSE
bEnableJumpOnFire2 = FALSE
nJoyId = 0
nKeyCodeUp = 273
nKeyCodeDown = 274
nKeyCodeLeft = 276
nKeyCodeRight = 275
nKeyCodeFire = 305

[Joystick2]
nJoystickMode = 0
bEnableAutoFire = FALSE
bEnableJumpOnFire2 = FALSE
nJoyId = 2
nKeyCodeUp = 273
nKeyCodeDown = 274
nKeyCodeLeft = 276
nKeyCodeRight = 275
nKeyCodeFire = 305

[Joystick3]
nJoystickMode = 0
bEnableAutoFire = FALSE
bEnableJumpOnFire2 = FALSE
nJoyId = 3
nKeyCodeUp = 273
nKeyCodeDown = 274
nKeyCodeLeft = 276
nKeyCodeRight = 275
nKeyCodeFire = 305

[Joystick4]
nJoystickMode = 0
bEnableAutoFire = FALSE
bEnableJumpOnFire2 = FALSE
nJoyId = 4
nKeyCodeUp = 273
nKeyCodeDown = 274
nKeyCodeLeft = 276
nKeyCodeRight = 275
nKeyCodeFire = 305

[Joystick5]
nJoystickMode = 0
bEnableAutoFire = FALSE
bEnableJumpOnFire2 = FALSE
nJoyId = 5
nKeyCodeUp = 273
nKeyCodeDown = 274
nKeyCodeLeft = 276
nKeyCodeRight = 275
nKeyCodeFire = 305

[Keyboard]
bDisableKeyRepeat = FALSE
nKeymapType = 0
szMappingFileName =

[ShortcutsWithModifiers]
keyOptions = 111
keyFullScreen = 102
keyMouseMode = 109
keyColdReset = 99
keyWarmReset = 114
keyScreenShot = 103
keyBossKey = 105
keyCursorEmu = 106
keyFastForward = 120
keyRecAnim = 97
keyRecSound = 121
keySound = 115
keyPause = 0
keyDebugger = 19
keyQuit = 113
keyLoadMem = 108
keySaveMem = 107
keyInsertDiskA = 100
keySwitchJoy0 = 282
keySwitchJoy1 = 283
keySwitchPadA = 284
keySwitchPadB = 285

[ShortcutsWithoutModifiers]
keyOptions = 293
keyFullScreen = 292
keyMouseMode = 0
keyColdReset = 0
keyWarmReset = 0
keyScreenShot = 0
keyBossKey = 0
keyCursorEmu = 0
keyFastForward = 0
keyRecAnim = 0
keyRecSound = 0
keySound = 0
keyPause = 19
keyDebugger = 0
keyQuit = 0
keyLoadMem = 0
keySaveMem = 0
keyInsertDiskA = 0
keySwitchJoy0 = 0
keySwitchJoy1 = 0
keySwitchPadA = 0
keySwitchPadB = 0

[Sound]
bEnableMicrophone = TRUE
bEnableSound = TRUE
bEnableSoundSync = FALSE
nPlaybackFreq = 44100
nSdlAudioBufferSize = 0
szYMCaptureFileName = X:\Emulators\RetroArch\hatari.wav
YmVolumeMixing = 2

[Memory]
nMemorySize = 1
bAutoSave = FALSE
szMemoryCaptureFileName = C:\Users\skyhi\.hatari\hatari.sav
szAutoSaveFileName = C:\Users\skyhi\.hatari\auto.sav

[Floppy]
bAutoInsertDiskB = TRUE
FastFloppy = TRUE
EnableDriveA = TRUE
DriveA_NumberOfHeads = 2
EnableDriveB = TRUE
DriveB_NumberOfHeads = 2
nWriteProtection = 0
szDiskAZipPath =
szDiskAFileName = X:\Games\Atari ST\Barbarian - The Ultimate Warrior (Europe).ipf
szDiskBZipPath =
szDiskBFileName =
szDiskImageDirectory = X:\Emulators\RetroArch\

[HardDisk]
nHardDiskDrive = 0
bBootFromHardDisk = FALSE
bUseHardDiskDirectory = FALSE
szHardDiskDirectory = X:\Emulators\RetroArch
nGemdosCase = 0
nWriteProtection = 0
bUseHardDiskImage = FALSE
szHardDiskImage = X:\Emulators\RetroArch
bUseIdeMasterHardDiskImage = FALSE
bUseIdeSlaveHardDiskImage = FALSE
szIdeMasterHardDiskImage = X:\Emulators\RetroArch
szIdeSlaveHardDiskImage = X:\Emulators\RetroArch

[ROM]
szTosImageFileName = X:\Emulators\RetroArch\system\Hatari\tos.img
bPatchTos = TRUE
szCartridgeImageFileName =

[RS232]
bEnableRS232 = FALSE
szOutFileName = X:\Emulators\RetroArch\/dev/modem
szInFileName = X:\Emulators\RetroArch\/dev/modem

[Printer]
bEnablePrinting = FALSE
szPrintToFileName = C:\Users\skyhi\.hatari\hatari.prn

[Midi]
bEnableMidi = FALSE
sMidiInFileName = X:\Emulators\RetroArch\/dev/snd/midiC1D0
sMidiOutFileName = X:\Emulators\RetroArch\/dev/snd/midiC1D0

[System]
nCpuLevel = 0
nCpuFreq = 8
bCompatibleCpu = TRUE
nMachineType = 0
bBlitter = FALSE
nDSPType = 0
bRealTimeClock = FALSE
bPatchTimerD = TRUE
bFastBoot = TRUE
bFastForward = FALSE

[Video]
AviRecordVcodec = 1
AviRecordFps = 0
AviRecordFile = X:\Emulators\RetroArch\hatari.avi

I know this line will probably stand out.

[ROM]
szTosImageFileName = X:\Emulators\RetroArch\system\Hatari\tos.img

I have core overrides for all my ./system directories, for every core, so the ./system folder isn’t a mess. To be safe I tried this without that override in place, and the .tos directly in ./system/tos.img - but it was the same result either way.

In both cases I can confirm in Core Information (once the core is running) that it shows the tos.img as “Present”.

Anyway, all methods and factors concerned, I still get the blank page.

When you tried this without the overrides, did you also include the .cfg file in the default system folder?

One other possibility is that the tos image may be the wrong version, despite being “present”.

One last thing, make sure you also update the info file for this core. This have caused issues for me in the past.

At the moment I have that generated hatari.cfg and tos.img in both ./system and ./system/Hatari , just to cover my bases.

I ran and MD5 check on my tos.img and it spits out “c1c57ce48e8ee4135885cee9e63a68a2”

Which from what I can see online is the CRC for the 1.02 TOS. That search did lead me to an EmuTOS which I tried running as well - wich I assumed was going to fail but gave me the exact same result.

I also just ran core info updates and core updates to make sure all was up to par, but still no change.

I’m starting to wonder if maybe it’s my games? I’m using a no intro set, all zipped with .ipf files. Core Information shows both zip and ipf.


I stopped writing this at this point and went and got some other versions of games. Ones I found were .stx… they booted right up. I also tried extracting the .ipf out of the zip files, and they still fail when loaded directly - meanwhile .stx loads out of .zip just fine.

So - in the end the issue is that despite being listed as a supported file type, it seems that .ipf files might not be supported after all. I’ll just have to track down .stx version of the games or otherwise.

RetroArch and it’s band of cores is such a wonderful rollercoaster sometimes hahaha. Thanks for your help with this, it really helps to be able to bounce ideas around with other members of the community. :smiley:

1 Like

IPF might need an an additional library file. I haven’t bothered a lot with IPF or .stx files since the menu disks by cracker groups (by Automation etc.) are usually sufficient if not better.

I’m not familiar, what are menu disks?

They were the releases by the cracker groups. “menu” because most of the them contain more than one game which you can choose after the intro, sometimes 50/60 hz selection, docs etc. Games that used multiple disks can use less because of compression. For some reason, these compilations were (are?) the dominant format in the ST emulation scene for a long time. In the Steem emulator I still use for CRT playing, there’s a search tool included which tells you what game is on what disk. There are also online sources, search for something like Atari menus + cracker group name (example: Automation).