FRED-80 runs on the Apollo A6000 — a real Amiga with a 68080 CPU and SAGA chipset. Write games in Lua. Draw sprites in the built-in editor. Ship a single binary. You can play and develop on Windows and Mac too!
-- soldiers.lua function _init() map(0, 0, 0) units = {} for i = 1, 20 do units[i] = { x = rnd(600), y = rnd(440), s = rnd(8) } end end function _draw() cls() for _, u in ipairs(units) do spr(u.s, u.x, u.y) end end
No cross-dev tools. No emulator. Edit, run, and ship directly on the A6000.
128-slot 16×16 sprite bank with per-sprite hitboxes, palette picker, and live preview. Draw on-machine.
8 map slots, 64×32 tiles each. Parallax-ready with AMMX-accelerated transparent blits.
8 synthesis channels + 4 hardware DMA channels (zero CPU cost for PCM). TOMMY step sequencer with 8 tracks, patterns, and song ordering.
Full Lua — tables, closures, coroutines. A clean 40-function API on top. No globals pollution.
Sprite blits and parallax scrolling use the Vampire's AMMX SIMD unit. 8 pixels per instruction.
One fred-80.m68k file. Drop it anywhere, run from Shell. Carts are plain folders under fred80/.
Copy the binary to your A6000, create a cart folder, start the editor.
1.SYS:> copy fred-80.m68k C:fred-80
1.SYS:> fred-80
Press N on the Home screen to create a new cart, then open the Code tab to start writing.
function _init()
x, y = 320, 240
end
function _update()
if btn(0) then x = x - 2 end
if btn(1) then x = x + 2 end
if btn(2) then y = y - 2 end
if btn(3) then y = y + 2 end
end
function _draw()
cls()
spr(0, x, y)
end
1.SYS:> fred-80 fred80/mygame/main.lua
Or press F5 from the editor to launch the active cart.
Drop a fred80.cfg next to the FRED-80 binary (PROGDIR:fred80.cfg on the A6000) to override defaults.
FRED-80 blanks the screen after 10 seconds of no input by default. Set ss_timeout (in seconds) to change it, or set it very high to effectively disable it.
# fred80.cfg
ss_timeout = 30
100+ functions. Everything you need, nothing you don't.
cls([col]) — clear screenspr(n, x, y [,scale]) — draw spritemap(slot, x, y) — draw tilemaprect(x,y,w,h [,col]) — rect outlinerectfill(x,y,w,h [,col]) — filled rectline(x0,y0,x1,y1 [,col]) — linepset(x, y [,col]) — plot pixelpal(i, r, g, b) — set palette entryprint(str, x, y [,col]) — draw textbtn(b [,p]) — button heldbtnp(b [,p]) — button pressedmouse() — x, y, buttonskey(k) — keyboard heldkeyp(k) — keyboard pressedsfx(n [,ch]) — play soundmusic(n) — start songvol(ch, v) — set channel volumernd(n) — random 0..n-1mid(a,b,c) — median of threeflr(n) — floortime() — time in secondsstat(n) — engine stats (fps, mem…)dset(i, val) — persist number to slot 0–63dget(i) — read persisted slotv0.8.21 · Apollo A6000 / Vampire · Windows · macOS
Runs on the Apollo A6000 (68080 CPU, SAGA chipset, AmiKit or AmigaOS 3.2+) and on Windows and macOS via SDL2.
Source and docs on GitHub