Skip to content

needlestack/gmc64

Repository files navigation

gmc64

gmc64 is a JavaScript reimplementation of Garry Kitchen’s GameMaker for the Commodore 64. This project documents the graphic and sound formats, virtual machine, instruction set and runtime behavior, and includes a browser-based version that works with original GameMaker projects.


Intro Demo

Sprite Maker

Scene Maker

Sound Maker

Music Maker

Program Editor

If you used GameMaker back then

You probably remember the fun of animating sprites pixel by pixel, drawing background scenes, coding up little games and demos, tweaking SID sounds, and writing music.

If you tried to relive that fun on a C64 emulator, you probably noticed the joystick based UI on the original is a tough sell today, and the slow disk operations are a drag.

gmc64 solves this. It's a fully modern JavaScript recreation of GameMaker with modern convenience: use your mouse or trackpad, instantly preview, load, and save files, copy, paste, undo, and more. Import and export GIF, PNG, and MIDI files.

It's not an emulator, it's a recreation, with the stumbling blocks gone.

If you have your original work

Do you have your original work on a disk? gmc64 reads .d64 disk images and all GameMaker file formats. Drag and drop a disk or use the built-in file browser.

Then you can open the editor, add a sprite, change the music, and save it back to the disk image. You can even export your creations as a single self-contained HTML file that you can post online.

gmc64 can save files back to .d64 images as well, and you can even import them back to the original GameMaker.

If you're new to GameMaker

GameMaker was a game-creation tool for the Commodore 64 created by Garry Kitchen and published by Activision in 1985. It let users build real, runnable C64 games without learning assembly or having to hand code graphics and sounds. An early graphical IDE, you drew sprites and backgrounds, composed music, recorded sound effects, and wrote game logic from a list of simple instructions.

sprite 1 is player
sprite 1 x position = 160
sprite 1 y position = 100
if joystick 1 is left then
    sprite 1 direction = left
endif

Many people who grew up to be game developers got their start here. It's been largely inaccessible in the modern age, and even through emulation the usability suffers from the limitations of the original C64.

gmc64 brings it back. The same sprites, same instructions, same sounds, all instantly in your browser.

Two-way compatibility

gmc64 doesn't just open old files. It implements the same formats: /PRG, /SPR, /PIC, /SND, and /SNG — and they round-trip cleanly in both directions.

A game built here saves to a real disk image that loads on an actual Commodore 64 running the original 1985 GameMaker disk. Anything authored on that hardware loads here without translation. New creations can ship to a 1541. Old creations can ship to the web.

Quick start

Click any of the image links at the top of this page to dive in.

Then:

  • Try the demos - disks/gmc64-demo.d64 ships with the project and includes runnable programs and editable sprites, scenes, sounds, and songs
  • Start from scratch — author sprites, scenes, sounds, and music, of your own
  • Drop a .d64 into any gmc64 tool - editor, sprite-maker, scene-maker, sound-maker, and music-maker will all open a pop-up file picker.
  • Host a .d64 - you can point to an online d64 as well: editor.html?disk=https://your-host/game.d64 opens the same file picker

When your game is ready, hit Export Game to get a single HTML file of your creation.

Sharing your creations

Every editor takes URL parameters, so you can hand someone a direct link to a specific program or drop the player into a page you're building. And every editor accepts a .d64 dropped onto its window — the file picker will open filtered to that tool's file type (.PRG in the editor, .SPR in sprite-maker, etc.).

Player (play.html) — chrome-free, iframe-friendly

Param Purpose
disk .d64 URL, or the magic value demo for the bundled demo disk
file Program name on the disk (case-insensitive)
nocredit=1 Hide the gmc64.com corner link
poster_seconds How many seconds to simulate the game for the preview frame behind the play button. Default 2, max 10, 0 skips the poster entirely. Decimals allowed.

Example — direct link:

https://gmc64.com/play.html?disk=demo&file=aliens/prg&nocredit=1

Editor (editor.html) — loads into the editor, optionally plays

Param Purpose
disk Same as above
file Same as above
play=1 Show a play-button overlay with a poster preview when the page opens. Visitor clicks play to run, clicks the stop button to drop into the editor. Without this flag the file just opens for editing.
poster_seconds Same as above; only meaningful with play=1
play_demo=1 Alias — expands to disk=demo&file=gmc64i/prg&play=1&poster_seconds=8.5

Example — send someone a runnable link that still lets them drop into the editor and see the code:

https://gmc64.com/editor.html?disk=https://your-host.com/game.d64&file=GAME/PRG&play=1

The other editors (sprite-maker.html, scene-maker.html, sound-maker.html, music-maker.html) accept disk and file too, deep-linking straight to a specific asset for editing.

Iframe embed

Two ways to get an embeddable game, depending on what you're willing to host.

Option A — self-contained HTML. Use the editor's Export Game button under file. It downloads a single HTML file containing your program, the disk image, and the runtime. Host it anywhere (GitHub Pages, Netlify, S3, your own server), then embed it. The Export dialog also generates the iframe snippet for you — just paste the URL where you'll host the file:

<iframe src="https://your-site.com/mygame.html"
        width="640" height="500"
        allow="autoplay" loading="lazy"
        frameborder="0"></iframe>

Option B — play.html + a hosted .d64. Skip export. If your disk image is already at a public URL, point play.html at it directly:

<iframe src="https://gmc64.com/play.html?disk=https://your-host.com/game.d64&file=GAME/PRG"
        width="640" height="500"
        allow="autoplay" loading="lazy"
        frameborder="0"></iframe>

Note: disk=demo is a special case that loads from the bundled demo disk.

Cross-origin disks: for option B, if your .d64 lives on a different domain than the page hosting play.html, that origin needs to allow cross-origin fetches (CORS). Option A avoids this entirely — the disk is inside the HTML.

What's included

File What it edits
editor.html Program instructions + runtime + asset assignment
sprite-maker.html Sprites (multi-color, multi-frame, multi-part)
scene-maker.html Backgrounds (160×200 4 indexed-color scenes)
sound-maker.html Sound effects (SID-style)
music-maker.html Songs (3 channels, score-style staff editor)

All five editors read and write to the same in-browser .d64 image, so your sprites flow into scenes flow into programs the same way they did on the C64.

Dependencies

To play and edit: none. It's static HTML and JavaScript. Just open the files in a browser and use them. They also run locally from file://.

To rebuild the standalone bundle: Node.js. Pure built-ins, no npm install needed. After editing play.html or any file it loads from js/, run:

node tools/bundle-standalone.js

This regenerates js/standalone-source.js — a snapshot of play.html with every <script src> inlined, used by the editor's "Export Game" flow to produce a self-contained playable HTML file.

To run the test suite: the test tooling lives in dev/ (kept out of the project root so static hosts don't mistake this for a Node project). One-time setup:

cd dev
npm install

Then from dev/:

npm test                 # run the full suite
npm run generate-golden  # regenerate golden files after intentional changes

This pulls in vitest (test runner) and puppeteer (headless browser). Only contributors need this.

Status

Ready for use. Most games run faithfully. Tested on GameMaker's included demo games Archer, Chopper, and Pitfall. (Note: these are not included in gmc64 for copyright reasons.) Sprites, scenes, sound effects, music, and program logic all reproduce the original behavior. Reports of edge cases are welcome.

The overall user experience should be significantly better than running GameMaker under an emulator.

Known limitations:

  • Instruction timing is not cycle-accurate. The JavaScript engine runs at 59.94fps and executes 50 ops (GameMaker instructions) per frame. This is very close to the original, but programs that rely on precise timing loops may have some timing issues.
  • Music-maker instrument sounds aren't fine-tuned. The song instruments are very rough approximations of the original GameMaker tones. They sound similar in most cases but songs will sound somewhat different.
  • Music and sound effects polyphony. The original C64 could only generate 3 voices at once, so sound effects would steal voices temporarily from music. gmc64 does not emulate this and so you have three channels for music and three more channels for sound.

Technical notes

  • File format details (.D64, /PRG, /SPR, /SND, /SNG, /PIC)
  • Architecture decisions
  • Coordinate system, timing formulas, multi-part sprites

All documented in CLAUDE.md — written for both humans and AI coding assistants.

Disclaimer

gmc64 is an independent, unaffiliated, re-implementation made for preservation, education, and fun. It is not affiliated with, endorsed by, or connected to Activision, Activision Blizzard, Microsoft, or any other rights holder. "GameMaker" and any related marks are property of their respective owners. None of the original 1985 code is used or included.

The repository does not contain any commercial disk images or programs. If you have an original GameMaker disk, you can use it with gmc64 yourself; obtain disk images through legal channels.

License

MIT. Do what you like with the engine and editors.

The included demos (disks/gmc64-demo.d64) are original work, also under MIT.

About

A JavaScript recreation of the classic C64 GameMaker

Resources

License

Stars

2 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors