In active developmentEverything here works and is tested on real hardware, and all of it is still changing. Check the repo for the latest.
68000 socket · ARM64 JIT

Your Atari ST, running on a Raspberry Pi 4.

A PiSTorm board sits in the 68000 socket. The Pi runs the CPU as a JIT 68040 with FPU and talks to the real ST, STe or Mega ST over the bus.

● Raspberry Pi 4 Up to 531× an 8 MHz ST RPi OS Lite · Trixie · aarch64 Open source · MIT and GPL
pistorm@pi4: ~/pistorm-atari-jit
# check the Pi can see the Atari
$ sudo ./ataritest --reset
$ sudo ./ataritest --memory tests=rw

# start the launcher: the setup page comes
# up on the ST monitor and on HDMI
$ sh run-pistorm.sh

# or boot the last build straight away
$ sh run-pistorm.sh --no-setup
How it works

The Pi replaces the CPU. The rest of the ST stays real.

Your keyboard, floppy, shifter and sound chip are still the Atari's own. The processor moves to the Pi, and the Pi adds what the ST never had: fast RAM, HDMI graphics, networking and host-side media.

Atari

ST, STe or Mega ST

The original motherboard, chipset and peripherals. The 68000 comes out of its socket.

Interface

PiSTorm board

A CPLD bridges the 68000 bus to the Pi's GPIO header and handles bus timing.

Raspberry Pi 4

Emulator and JIT

Two cores run emulation, two are left for Linux. The ARM64 JIT turns 68k code into native code.

Software

TOS, MiNT, APJ-OS

Boot EmuTOS or TOS as normal, or the APJ-OS desktop at up to 1920×1080 over HDMI.

Features

What's in the emulator today

CPU and memory

JIT 68040 with FPU

Based on the Amiberry ARM64 JIT with hardware FPU. Any CPU from 68000 to 68060, or the interpreter when you need exact behaviour.

Direct ST-RAM access

stram_cache keeps a copy of ST-RAM on the Pi and writes through only what the hardware must see. stram_direct lets the JIT use it inline.

Up to 256 MB TT-RAM

Fast RAM at $01000000, in the Pi's memory. How much you can give it depends on how much RAM your Pi has.

Video

fVDI on HDMI

GEM at 640×480 up to 1920×1080 in 8, 16 or 32-bit colour, rendered by the Pi.

Falcon Videl and SuperVidel

PSVIDEL gives Falcon and SuperVidel software their video modes, 112 MB of video RAM and the SuperBlitter, on HDMI.

ET4000 and ST mirror

An ET4000AX card for NOVA, XVDI, NVDI or fVDI drivers, and a mirror of ST low, medium and high on HDMI.

Sound and media

Falcon DSP56001

A clean-room 56001 core with host port, SSI, sound matrix, 16-bit DMA and CODEC.

YM2149 and DMA sound on HDMI

Chip music and STe DMA audio played through the Pi alongside the real chip.

MP3, video and recording

Host MP3 playback, MP4/MKV/AVI playback with hardware H.264, and A/V screen recording.

Input, drives and network

Xbox and USB gamepads

Wired or Bluetooth pads as ST joysticks and STe joypads, in GEM, games and the ST Box. One line: usb gamepad.

USB keyboard and mouse

Merged into the IKBD stream. The real ST keyboard and mouse are optional: use them, USB, or both.

Floppy, IDE, ACSI, HOSTFS

WD1772 floppy emulation, IDE and ACSI disk images, and folders on the Pi as GEMDOS drives.

Networking

FreeMiNT networking over the Pi's WiFi, through the NatFeat Ethernet driver. The Pi's RJ45 Ethernet port isn't supported yet.

Emulated blitter

The ST BLiTTER in software over the RAM copy, with or without a real chip fitted.

ST Box

A sandboxed 68000 ST or STe in a resizable GEM window under APJ-OS, for games that want a plain machine. More

Hardware

What you need

Comfort with Linux helps. If you'd rather not build anything, flash the APJ-OS SD card image.

Host

Board
Raspberry Pi 4, 1 GB or more. More RAM lets you give the Atari more TT-RAM. The Pi 3B is tested with the APJ-OS install script.
OS
Raspberry Pi OS Lite, Trixie, 64-bit. Lite is required: a desktop holds the display and takes the isolated cores.
Cores
2 for emulation, 2 for Linux. Build with make -j2.
Display
A monitor on the Pi's HDMI, connected at boot, for HDMI output.
Input
The ST's own keyboard and mouse, or USB and Bluetooth ones on the Pi. Either works.
Network
The Pi's WiFi. RJ45 Ethernet isn't supported yet.

The Pi 3A+ and Pi Zero 2 W have 512 MB of RAM and can't fit the memory layout. The Pi 5's GPIO sits behind the RP1 chip, which is too slow for bus work.

Atari

Tested
STfm, STe, Mega ST
DIL 68000
STfm, Mega ST: a PiStorm board made for the Amiga A500
STe
A custom STe board, available online or from users on the Discord

Bus arbitration in the CPLD doesn't work yet, so the real blitter chip and real DMA devices can't be driven. The emulated blitter, floppy and ACSI cover them.

Install

Two ways in

Easiest

Flash the APJ-OS image

Download apj-os-<version>.img.xz from the APJ-OS releases and write it to a 16 GB or larger card with Raspberry Pi Imager. Fill in wifi.txt on the boot partition for WiFi. The first boot expands the filesystem, then the Atari boots straight into APJ-OS.

gotaproblem/apj-os
From source

Build the emulator yourself

Start from a fresh Raspberry Pi OS Lite 64-bit, logged in as your normal user (ideally pistorm). The installer calls sudo itself. Steps below.

  1. Update the Pi

    The installer adds every package the build needs, so a current OS is all you need first.

    sudo apt update && sudo apt upgrade
    sudo apt install git
  2. Clone the repository

    This creates pistorm-atari-jit/ in your home directory.

    cd ~
    git clone https://github.com/gotaproblem/pistorm-atari-jit.git
  3. Run the installer and reboot

    It checks the OS, installs dependencies, merges the boot firmware settings, builds the emulator and puts the file tree in place. It asks about the autostart service, a Samba share and the web browser engine.

    cd ~/pistorm-atari-jit
    ./install-full.sh
    sudo reboot
  4. Test the hardware

    If these fail, fix the hardware first. Nothing else will work until they pass.

    cd ~/pistorm-atari-jit
    sudo ./ataritest --reset
    sudo ./ataritest --memory tests=rw
  5. Boot from the setup page

    The launcher shows your builds with a countdown on the last one. Enter boots, E edits. See Config for what each setting does.

    sh run-pistorm.sh
APJ-OS 1.0 desktop at 1920×1080 with drive icons, the taskbar showing CPU 8%, 59.8°C, 68040+FPU, Pi4B 2GB, and PSCTRL's benchmark tab open

APJ-OS 1.0 on a Pi 4B 2 GB at 1920×1080, with PSCTRL's benchmark results. A screen dump from the machine.

APJ-OS 1.0

A modern desktop for the accelerated ST

A ready-to-flash distribution: the emulator plus FreeMiNT, XaAES and the Bespoke Desktop, at up to 1920×1080 in 32-bit colour over HDMI.

  • Fluent themeFlat window chrome, themed menus and dialogs, anti-aliased text, a live PiStorm taskbar and four virtual desktops.
  • Apps that use the PiPDFGEM reads PDFs and WEBGEM browses the web, both rendered on the Pi. MP3GEM and VIDGEM play audio and video.
  • Control and monitoringPSCTRL changes settings on the running machine. PSMON shows the JIT, memory and the Pi's clock and temperature.
  • Old software still runsLegacy GEM programs keep their layout. The theme restyles them without resizing anything.
Next

What's being worked on

New work lands on its own branch first and joins main once it has run on real hardware.

JIT code quality

Register allocation and flag handling, and a smaller footprint in the Pi's 48 KB instruction cache.

One interrupt controller

A single virtual MFP that merges real and virtual interrupt sources in priority order.

Regression tests

A make check that boots a matrix of CPU, JIT and machine settings before hardware time is spent.

Licences

Open source, under several licences

The repository's LICENSE is MIT, inherited from the PiStorm project. It also contains code under other licences, and the GPL parts decide the terms for the built emulator as a whole.

PartLicenceWhere
PiStorm base, bus protocol and the Atari platform code (NatFeats, Falcon DSP, ST Box and others)MITLICENSE, SPDX headers
68k CPU core, MMU and ARM64 JIT, from the UAE / WinUAE / Amiberry lineGPL-2.0-or-latercpu/, jit/, include/uae/
SoftFloat FPU emulation (John R. Hauser)SoftFloat-2a / BSDsoftfloat/
Musashi 68000 core for the ST Box (Karl Stenerud)MIT-stylethird_party/musashi/
stb single-file librariesMIT or public domainthird_party/stb/

APJ-OS and its parts

PartLicence
APJ-OS scripts and documentationGPL-2.0
FreeMiNT and XaAES, TeraDesk / Bespoke Desktop, TosWin2GPL-2.0
EmuTOSGPL-2.0
fVDIGPL
apj-os-tools GEM apps (PSCTRL, PSMON, PDFGEM, WEBGEM and others)MIT (per-file headers)
CoreMark, in PSCTRL's benchmarkEEMBC licence + trademark terms
Dhrystone 2.1 (Reinhold P. Weicker)freely distributed source

Not included: Atari TOS ROM images and commercial Atari software. EmuTOS replaces TOS. Source for every GPL component, with all changes, is in the repositories linked above. This is a summary; the licence files in each repository are what apply.

Configuration

One file, any number of machines

Everything lives in configs/psctrl.cfg. Each [section] is a build: a complete machine. You rarely need to edit it by hand, because the setup page and PSCTRL both write it.

Shape of the file

A [psctrl] block holds the setup page's own settings. Every other section is a build, and the emulator loads exactly one of them: the one you pick on the page, or the boot key.

Nothing is inherited between builds. Each says everything it needs. Lines are key value, # starts a comment, and a key on its own means on. Sizes are in KB unless you add M or G.

A build whose name starts with apj gets the APJ-OS-only keys on the page. The installer copies the default file in once and never overwrites yours.

configs/psctrl.cfg
[psctrl]
countdown 5
boot apj-os
rom_path ../roms
disk_path ../dkimages

[apj-os]
cpu 68040
fpu
ttram 128M
jit_cache 16384
vga ET4000AX FVDI
native_hdmi enabled
machine ste
kbd usb
usb gamepad
ym2149
rom emutos-aranym.rom
ide
hdd 0:apj-os.img
fdd A:720k.st
hostfs S /home/pistorm/atari-share
Setup page

Pick a machine before the 68k boots

Drawn by the Pi on the ST's own video and mirrored to HDMI. It works with the ST keyboard, a USB keyboard or a gamepad. Nothing is written until you save or boot.

EnterBoot the build under the cursor
EEdit it
NNew build, empty or a copy
DDelete a build
SSave
F12Screen dump (Help on the ST)
EscLeave and boot the last build
C MClock and date format

The editor has seven tabs: Machine, Video, Sound, Input, Drives, Network and Tuning. Skip the page with countdown 0 or --no-setup.

Keys

The settings you'll reach for

A selection. PSCTRL-CFG.md documents every key, its values and its environment overrides.

Machine

KeyValuesWhat it does
cpu68000 … 68060The CPU the guest sees. 68000 and 68010 are 24-bit and can't have TT-RAM or the JIT. 68040 is the fastest with the JIT.
fpuon / offAn FPU, on 68020 and up.
jiton / offThe JIT compiler, on by default. Off runs the interpreter: several times slower, but exact.
jit_power0 – 6The compiled-chain budget, 256 << (N−1): 1 = 256 (default) up to 6 = 8192. 0 turns the JIT off. Step it down if MiNT beeps or the mouse gets erratic.
jit_cacheKB, default 8192The translation cache. 16384 for big applications.
machinest ste megast falconWhat the guest is told it is, and the hardware modelled around it.
ttram16M … 256M, default 128MTT-RAM in the Pi's memory, up to 256 MB. The size you can use depends on the Pi's RAM. Needs a 32-bit CPU.
stram_size512K … 4MThe ST-RAM the guest sees, matched against the board's real DRAM.
stram_cacheon / offServe CPU reads from a copy of ST-RAM on the Pi. Much faster.
stram_directon / offLet the JIT read and write that copy inline. Faster again, and breaks some software.
mmuon / offFull MMU emulation for Basilisk II, MagiCMac and MiNT memory protection. Interpreter only.

Video and sound

KeyValuesWhat it does
vgaET4000AX NOVA | XVDI | NVDI | FVDIAn ET4000AX card on HDMI, built for that Atari driver. FVDI is APJ-OS's.
native_hdmion / offMirror ST low, medium and high to HDMI at each real VBL.
hdmi_onlyon / offHDMI is the only display, so screen flips stay off the bus.
psvidelon / offFalcon Videl and SuperVidel on HDMI. Armed by PSVIDEL.PRG in AUTO.
ym2149on / offThe PSG on HDMI, alongside the real chip.
dma_soundon / offSTe DMA sound on HDMI.
falcon_dspon / offThe DSP56001, sound matrix, DMA and CODEC.
blitteron / real / offEmulated blitter, pass-through to a real one, or none. Defaults by machine.

Input, drives and network

KeyValuesWhat it does
kbdusb [nograb] [merge|standalone] [mousediv N]USB or Bluetooth keyboard and mouse, injected into the IKBD stream. The real ST keyboard and mouse are optional. F12 toggles the grab.
usbgamepadXbox and other pads as joysticks and STe joypads. Pad 0 is joystick 1 and pad A.
ide / hddN:imageIDE disk images, up to 8. The first should be bootable.
acsiN:imageEmulated ACSI targets beside real devices. .hfs volumes for Spectre.
fddA:image B:imageFloppy drives: .st read-write, .msa read-only. F11 swaps disks.
hostfsdrive path [ro]A Pi folder as a GEMDOS drive. The installed share is S:.
networkon / offFreeMiNT networking over a TAP device, set up by netstart.sh. WiFi only for now; the RJ45 port isn't supported yet.
PSCTRL · desk accessory

Change the running machine from the Atari

PSCTRL puts every switch and tunable the emulator has in one window, and applies changes while your program runs. It ships as PSCTRL.ACC and PSCTRL.PRG in apj-os-tools.

Why an accessory

An accessory sits in the Desk menu of every application under TOS and XaAES, so you can open it while a game or the ST Box is running. That's the point: jit_power is worth moving against the game you're actually playing.

Put PSCTRL.ACC in the root of the boot drive and the skins in C:\GEMSYS\SKINS\. It follows the desktop's Fluent theme at 100, 125 or 175% scale. Without a skin it still runs on plain controls.

It describes itself

No control is compiled into the program. At startup it asks the emulator for every setting, with its key, title, tab, kind, range and current value, and builds the tabs from the answers. A new emulator switch shows up without rebuilding PSCTRL.

Tabs

JITBenchCPUVideoAudioInputST BoxFloppyNetworkDebugAdvanced

Controls

On / offa checkbox
A few short choicesradio buttons
Longer listsa pop-up list
Numbersa slider with the value
Filesa field that lists the Pi's images
Live readoutsrefreshed twice a second
When a change applies

Every setting says when it takes effect

The badge beside each control tells you, and the status line confirms what happened after you change it.

live

Read again by the emulator straight away. In effect before you let go of the mouse.

defer

Applied at the next JIT block boundary. Used for anything that flushes or resizes the translation cache.

boot

Part of the machine's shape. Saved and applied on the next restart.

box

Takes effect the next time the ST Box starts.

Built-in benchmark

Measure, change a setting, measure again

The Bench tab runs a benchmark as 68k code inside the accessory, so it measures what programs get on the settings in force now. It takes about twenty seconds and shows the previous run beside the new one.

The first pass is thrown away, because that's when the JIT compiles the benchmark. Dhrystone runs its own self-check, so a mistranslation shows up as a failure rather than a suspiciously good score. Results and what each figure means.

Keys

← →Previous or next tab
↑ ↓Scroll
BRun the benchmark
SSave to the config file
1 2 3Skin scale 100, 125, 175%
EscClose
PSMON

Its companion: the monitor

PSMON shows the live JIT figures (speed as a multiple of an 8 MHz ST, JIT hit rate, idle time, cache use, compiles), guest memory, and the Pi underneath: board, RAM, ARM clock, temperature and throttle state.

The throttle row matters. A Pi that is thermally capped runs the JIT slower, and nothing on the Atari side would otherwise tell you why a figure dropped.

Get them

Both are on the APJ-OS boot disk, and in apj-os-tools with their sources. They need the PSCTRL NatFeat in the emulator, which is in main.

cd apj-os-tools/psctrl && make
cd ../psmon && make
ST Box · STBOX.PRG

A real-speed ST in a window

Games written for an 8 MHz 68000 want ST timing, not a JIT 68040 under FreeMiNT. The ST Box is a second, private Atari ST inside the emulator, running at 8.02 MHz in a GEM window on the APJ-OS desktop.

How it's built

The box has its own ST-RAM, its own TOS ROM, and its own models of the Shifter, MFP, PSG, ACIA and floppy controller. A Musashi 68000 core runs it, paced against the Pi's clock to exactly 8.021248 MHz and a 50.05 Hz PAL frame.

It runs on core 3 in small, bounded slices between the main machine's interrupt work, so the APJ-OS desktop keeps running alongside it. Its picture goes to a spare HDMI overlay plane laid exactly over the GEM window, so video playback and the box can share the screen.

The window resizes in real time while the box runs. Drag it to any size, up to full screen, and the picture scales with it, keeping the ST's aspect ratio.

Nothing the box does touches the real ST. Its memory, disks and hardware are all its own.

Xenon 2 Megablast title screen running in the ST Box window on the APJ-OS desktop, beside a Z: drive window of game images
Xenon 2 booting in the ST Box, beside the folder of game images on Z:.
Using it

Start a box

STBOX.PRG is installed in apj-os/STBox/ with your .st and .msa images. Run it with no arguments for a file selector that browses the HOSTFS share, or name an image to boot it straight away.

In the config

stbox_tosThe box's TOS: 1.04, 2.06, or a 192K or 256K EmuTOS. The Aranym EmuTOS of the main machine won't boot it.
stbox_machinest (default) or ste. An STE box needs an STE-aware TOS.
stbox_planeForce an HDMI overlay plane. Leave it out for automatic.

These keys appear on the setup page for any build whose name starts with apj. PISTORM_STBOX_TOS overrides stbox_tos.

At launch

STBOX.PRGFile selector, then boot the chosen image
STBOX.PRG game.stBoot that image
… st / steOverride stbox_machine for this launch
EscCapture or release keyboard and mouse
Xenon 2 gameplay in the ST Box, the window stretched to most of the 1920 by 1080 screen with the ST picture scaled to fit
The same box a couple of minutes later, window enlarged mid-game. The picture rescales in real time and keeps the ST's aspect ratio. Both are screen dumps from the machine.
Hardware

What the box models

Every box

Shifter and MFP

All three ST video modes, Timer B counting display lines like the real chip, and the video address counter following the display window.

WD1772 floppy

Type I, II and III commands, DMA, side select and index pulse. READ TRACK is built from sector data with real CRCs. .st and .msa images.

PSG sound

The YM2149 mixed into the Pi's audio output.

Memory sizing

MMU bank aliasing, so TOS sizes 512K, 1M, 2M and 4M correctly.

Input

USB keyboard and mouse, the real ST keyboard, mouse and joystick, and Xbox or USB gamepads, routed to whichever has focus.

Resizable window

Resize the window while a game runs. The picture scales in real time and keeps the ST's aspect ratio.

Crash reports

A double bus fault halts the box with a 64K PC trace, a disassembly of the scene and write watchpoints.

STE tier, when you ask for it

STE Shifter

12-bit palette, fine horizontal scroll, line width and the low byte of the screen base.

BLiTTER

The main machine's blitter engine, run in steps at the real chip's throughput. Tested against it over 20,000 random blits.

DMA sound and joypads

Play and repeat, 6 to 50 kHz, microwire volume, and the STe joypad ports fed from your gamepads.

In an ST box none of the STE registers are decoded, so TOS 2.06's STE probe finds a plain ST, just as on the real machine.

Compatibility

40 games, tested headless

The ST Box core builds and runs on any computer. A harness boots each image for 60 guest-seconds, presses keys and fire every 3 seconds, and reports what happened. The whole collection takes about 75 seconds. Results from 9 September 2026.

Outcome by TOS and machine

Number of the 40 images in each state after 60 guest-seconds.

Stuck means the screen stopped changing for 10 seconds, usually a title screen waiting for input the harness can't give. It's unknown, not broken.
ConfigurationRunningStuckCrashHalt
TOS 1.04, ST132106
TOS 2.06, ST29515
TOS 2.06, STE30514

Running on TOS 2.06

Arkanoid II, Barbarian II, Battle Chess, Black Tiger, Blasteroids, Blood Money, Bubble Bobble, Buggy Boy, Cannon Fodder, Crazy Cars, Defender of the Crown, The Great Giana Sisters, Indiana Jones and the Fate of Atlantis, Indiana Jones and the Last Crusade, Just Buggin', Kick Off 2, Lotus III, Populous, Rampage, Rick Dangerous, Shadow of the Beast, Shufflepuck Cafe, Wizball, Xenon 2, Jet Set Willy, and more. Space Harrier runs as an STE.

Still failing

Chaos Strikes Back, Dark Side of the Spoon, Sensible Soccer, Rainbow Islands and Gauntlet II (on TOS 2.06). Each has a crash report from the harness, and they're the next targets.

Fixed in that round: the WD1772 interrupt clearing on a new command, 68000 trace mode, and the video address counter. No title that ran before broke.

Testing

Regression-test the whole games collection

tools/stbox-harness/ builds a variant of the box, runs every image through it and compares variants side by side. Switch individual fixes off with build flags to see which change fixed or broke which title.

Write watchpoints, PC history, disassembly at a fault and an FDC sector map are all a variable away.

tools/stbox-harness/build.sh cur
ROMS=roms GAMES=games \
  tools/stbox-harness/batch.sh tos206uk 60 cur
HARNESS_STE=1 ROMS=roms GAMES=games \
  tools/stbox-harness/batch.sh tos206uk 60 cur
Limits

Not there yet

Disk writes

Writes stay in memory and aren't saved back to the image. No GEMDOS hard disk in the box yet.

Raster effects

The palette is taken once per frame, so mid-frame colour changes smear. Scanline-level Shifter tricks aren't modelled.

Real joystick mode

A game's IKBD commands reach the box's keyboard model, not the real one. A real joystick reports in whatever mode the main machine left it. USB pads aren't affected.

Benchmarks

How fast is it?

PSCTRL's benchmark on APJ-OS 1.0: a JIT 68040 with FPU on a Raspberry Pi 4B 2 GB, at its stock 1.5 GHz and overclocked to 2.1 GHz, both with jit_power 6 (8192 chain budget). Run on 8 October 2026.

531×an 8 MHz ST by Dhrystone 2.1, at 2.1 GHz (382× stock)
424DMIPS at 2.1 GHz (305 stock)
1488CoreMark, 020+ build, at 2.1 GHz (1056 stock)
Test1.5 GHz (stock)2.1 GHzChange
Processor
Dhrystone 2.1304.66 DMIPS423.55 DMIPS+39%
  vs an 8 MHz ST×382.3×531.5+39%
CoreMark (020+ build)1056.241487.54+41%
ALU1316.70 MIPS1848.45 MIPS+40%
FPU408.53 MFLOPS576.14 MFLOPS+41%
Tight loop145.21 MIPS201.52 MIPS+39%
  per JIT block exit~6.1 ns~4.4 ns−28%
Memory
Mixed (ALU, branch, ld/st, jsr)254.86 MIPS345.44 MIPS+36%
ST-RAM (move.l)81.92 MIPS113.21 MIPS+38%
Mix parts: alu / +ld/st / +br / +jsr / +movem6 / 15 / 22 / 52 / 70 ns4 / 10 / 15 / 36 / 50 ns
Graphics, 160×120 32-bit
Frame rate1613.4 fps2249.6 fps+39%
Per frame619 µs444 µs−28%
Rasterise / blit70% / 29%67% / 32%
Triangles91.0 M/s131.4 M/s+44%
Pixels13.2 M/s19.1 M/s+44%
fVDI blit throughput407,547 KB/s525,283 KB/s+29%

The clock went up 40%, and nearly every figure followed it: the JIT is compute-bound, not waiting on memory. The mixed loop gains a little less because part of it goes through ST-RAM on the real bus, which doesn't speed up with the Pi. CoreMark 1.0 : 1487.541837 / GCC12.3.0 -O2 -m68020-60 / STACK, 13.4 s at 2.1 GHz (1056.245049, 18.9 s stock). PSCTRL noted 7 JIT cache flushes in both runs.

PSCTRL's Bench tab at the stock 1.5 GHz clock
1.5 GHz stock, jit_power 6, 59.8 °C.
PSCTRL's Bench tab with the Pi overclocked to 2.1 GHz
2.1 GHz (arm_freq=2100, over_voltage=6), jit_power 6, 67.6 °C.
Tuning history

What the chain budget is worth

CoreMark in 68000 mode at 1.5 GHz, from the performance tuning work on 7 September 2026. Raising jit_power from 3 to 5 added 4.3%. The 8 October runs above use 6, the maximum.

CoreMark by chain budget

Pi 4 at 1.5 GHz, 68000 mode, 7 Sep 2026. Higher is better.

The plateau hasn't been reached at 4096. Keep the higher setting if MiNT input and sound playback stay clean.
SettingChain budgetCoreMarkChange
jit_power 31024783baseline
jit_power 42048803+2.6%
jit_power 54096817+4.3%
Where the time goes

What the Pi's counters say

Measured with perf-tlb.sh while CoreMark ran in 68040 and 68060 mode.

IPC 2.0

The Cortex-A72 retires two instructions per cycle. The core isn't stalling on memory.

Under 1% in page walks

About one TLB refill per 10,000 instructions. Huge pages wouldn't help, which is why they're moot on the stock kernel.

4–5% in instruction fetch

Translated code and the dispatch loop overflow the 48 KB L1 instruction cache. The next gains are in JIT code size and quality.

Tuning

The cheap wins, and what they're expected to do

ChangeExpectedMeasuredCost
jit_power 4 / 5+1–2%+2.6% / +4.3%A wider window before interrupts are taken
jit_cache 163840–3% on GEM and MiNTnot measured on its own8 MB of RAM. CoreMark fits in 8 MB and won't move.
arm_freq=2100 + over_voltage=6+35–40%+36–44% (PSCTRL, 8 Oct)Heat: 67.6 °C vs 59.8 °C stock. Needs a heatsink and ideally a fan.
2 MB huge pages+3–6%0None. The stock kernel has huge pages off.

The overclock lines are already in configs/config.txt, commented out. Check vcgencmd get_throttled after a long session: 0x0 means it never throttled.

Run your own

The PSCTRL benchmark

Open PSCTRL's Bench tab and press B. Pick the 68000 or 020+ CoreMark build first. It runs inside the accessory and reports each figure next to your previous run.

FigureWhat runsWhat it tells you
Dhrystone 2.1Weicker's published source, unchanged loop, with its self-checkThe headline. Compared with 1400 Dhry/s for a stock 1040 ST at 8 MHz, shown as ×N.
CoreMarkBuilt twice, for 68000 and for 020-and-up; at least 10 secondsWhat the larger instruction set is worth on the same machine.
MIPS mixedALU, branches, ST-RAM load and store, jsr/rts, movemThe one to watch. Closest to a game's inner loop, and the one jit_power moves.
MIPS ALURegister-only arithmeticRaw translation quality.
MIPS ST-RAMmove.l (a0)+,(a1)+ over 32 KB of ST-RAMThe bus path: stram_cache, stram_direct, TT-RAM placement.
MFLOPSAn fmul/fadd chain, when an FPU is presentThe FPU model and JIT FPU.
3DA shaded solid spun for a fixed timeRasterising and blitting timed apart, because a slow frame means different things depending on which one cost the time.
BogoMIPSdbra and nothing elseA ceiling, not a speed. The JIT folds the loop away.

Timing uses the 200 Hz counter at $4BA, driven by the MFP rather than anything the JIT does. Compile flags are fixed so results stay comparable between releases.