Downloads · 30 days
0
bmove/amiga-playground-asm
amiga-playground-asm is a text generation model from bmove. Use it when you need the model to write or continue text. It is set up for mlx. The card lists the license as apache-2.0.
Downloads · 30 days
0
Access
Public
Updated Aug 6, 2026
Repo size
26.9 MB
Likes
0
Public
Click a slice to open those files.
.safetensors26.6 MB · 99%
From the Hugging Face model README
Amiga Playground app · Source · Issues
<img src="assets/banner.jpg" alt="Amiga Playground ASM — Boing Ball over copper bars" width="100%" /> </div>Amiga Playground ASM is a small, focused MLX LoRA adapter on top of
mlx-community/Qwen2.5-Coder-3B-Instruct-4bit.
It is the product model behind Amiga Playground —
a native macOS workspace for writing, generating, assembling, and testing Commodore Amiga 68k code.
Ask it for a copper list, a blitter clear, a Paula DMA player, a bootblock skeleton… get Motorola syntax meant to assemble under:
vasmm68k_mot -m68000 -Fhunkexe
Headliner result: 140 / 140 first-shot sealed compile on 7 Amiga ASM families (20 variants each), temperature
0. Compile-gate only — not a full hardware-semantic or emulator-ladder guarantee.
New to ML? Jump to How it was trained (for curious non-ML people) for a plain-language tour of the corpus, LoRA, and compile-gate scoring.
<img src="assets/amiga-playground.png" alt="Amiga Playground — native macOS editor + assistant" width="100%" /> <p align="center"><em>Amiga Playground: editor, local assistant, vasm console, ADF export, emulator launch.</em></p>| Model id | amiga-playground-asm |
| Product / version | Amiga Playground ASM 0.1.0 |
| Kind | LoRA adapter (MLX) — not a full base checkpoint |
| Base | mlx-community/Qwen2.5-Coder-3B-Instruct-4bit |
| Adapter size | ~26 MB (adapters.safetensors) |
| LoRA | rank 8, scale 20, 16 layers, dropout 0 |
| Target CPU | Motorola 68000 / Amiga OCS-era idioms |
| Assembler gate | vasmm68k_mot -m68000 -Fhunkexe |
| Adapter SHA256 | 3c6cadccd24af796bcb9f6a8a3677539e764709abe982dce4c4f7be9ee6cf88a |
| Runtime layout | runtime/base + runtime/adapter (via app / scripts) |
Harness: minimal_sealed_asm.py against frozen benchmark
amila-tier1-promotion-v1 (ASM subset).
| Setting | Value |
|---|---|
| Mode | First-shot (no repair loop) |
| Temperature | 0 |
| Gate | vasmm68k_mot -m68000 -Fhunkexe |
| Pass threshold per family | 18 / 20 |
| Result | 140 / 140 (all 7 families green) |
| Family | What it exercises |
|---|---|
minimal_executable | Valid HUNK sections + clean entry/return |
bootblock_skeleton | 1024-byte checksum-ready bootblock layout |
blitter_clear | Blitter idle wait, masks, modulo, size |
bitplane_display | OCS bitplanes + copper + deterministic cleanup |
cia_input | CIA-A polling without clobbering DDR bits |
keyboard_polling | Serial key decode + CIA handshake |
audio_dma | Paula channel DMA + explicit stop path |
What this measures: the model emits Motorola 68000 that assembles and links to a HUNK executable on the first try.
What this does not measure: cycle-accurate hardware behavior, full demo-scene correctness, or multi-file projects. Emulator / runtime ladders are a separate gate.
| ✅ Good fit | ❌ Not the goal |
|---|---|
| Local Amiga Playground assistant | Cloud-only hosted inference |
| Copper / blitter / CIA / Paula sketches | Full OS multitasking apps |
| Teaching / sketching 68k Amiga idioms | Guaranteed runtime-correct demos |
| Apple Silicon MLX offline workflow | Replacing a human Amiga coder |
Primary consumers:
1234cd aMiLa/fine_tuning
uv sync
./download_model.sh # runtime/base + runtime/adapter
./deploy.sh # OpenAI-compatible server on :1234
In the app:
amiga-playground-asmManual server:
uv run python serve_playground.py --port 1234
# → http://localhost:1234/v1/chat/completions
curl http://localhost:1234/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "amiga-playground-asm",
"temperature": 0,
"messages": [
{
"role": "user",
"content": "Create a CIA-A input polling routine for an active-low control signal. Return one Motorola 68000 source file for a real Amiga target."
}
]
}'
from mlx_lm import load, generate
model, tokenizer = load(
"mlx-community/Qwen2.5-Coder-3B-Instruct-4bit",
adapter_path="path/to/adapters", # this repo's adapters/
)
prompt = (
"Create a minimal Amiga HUNK executable that enters and returns cleanly. "
"Return one source file for a real 68000 Amiga target."
)
messages = [{"role": "user", "content": prompt}]
text = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
print(generate(model, tokenizer, prompt=text, max_tokens=1024))
The sealed harness uses capability prompts like the ones below. Prefer:
mot dialect)Create a minimal Amiga HUNK executable that enters and returns cleanly.
The implementation must construct valid sections and an exported entry point.
Return one source file for a real 68000 Amiga target.
</details>
<details>
<summary><b>Copper + bitplanes</b></summary>
Create an OCS bitplane display setup with a copper list and cleanup path.
The implementation must configure display fetch, DMA, and restoration deterministically.
Return one source file for a real 68000 Amiga target.
</details>
<details>
<summary><b>Blitter clear</b></summary>
Create a routine that clears a bounded planar region with the Amiga blitter.
The implementation must wait for blitter idle and program masks, modulo, and size safely.
Return one source file for a real 68000 Amiga target.
</details>
<details>
<summary><b>Paula audio DMA</b></summary>
Create a single-channel Paula DMA playback routine with an explicit stop path.
The implementation must program aligned sample location, length, period, volume,
and DMA ownership. Return one source file for a real 68000 Amiga target.
</details>
<details>
<summary><b>Bootblock skeleton</b></summary>
Create a checksum-ready 1024-byte bootblock skeleton with a valid entry.
The implementation must preserve the boot ABI and bounded block layout.
Return one source file for a real 68000 Amiga target.
</details>
adapters/
adapters.safetensors # LoRA weights (~26 MB)
adapter_config.json # rank / scale / base / product metadata
model_version.json # product id, version, eval summary, SHA256
README.md # this card
assets/
banner.jpg # hero art
amiga-playground.png # app screenshot
You still need the base MLX model separately
(mlx-community/Qwen2.5-Coder-3B-Instruct-4bit).
download_model.sh in the app tree fetches both.
This section is intentionally plain-language. If you already know fine-tuning, skim the tables; if you don't, read it top-to-bottom.
vasm can assemble — broken syntax
should not teach the model.| Term | What it means here |
|---|---|
| Base model | The general coding brain we start from. It already knows many languages; it is not Amiga-specialized yet. |
| Fine-tuning | A second training phase where we show the model Amiga-specific examples so it picks up 68k / copper / blitter idioms. |
| LoRA (Low-Rank Adaptation) | Instead of rewriting all billions of weights, we train a small set of “sticky notes” (adapter matrices) that sit on top of the base model. Result: small file, cheap to train, easy to distribute. |
| Adapter | The sticky notes: adapters.safetensors in this repo. |
| MLX | Apple’s machine-learning stack for Apple Silicon. Training and serving happen locally on a Mac GPU. |
| 4-bit / quantized | The base model is stored with fewer bits per weight so it fits in laptop memory. Quality tradeoff is usually small for coding assistants. |
| ChatML / chat examples | Training rows look like a conversation: a user prompt + the desired assistant reply (assembly source). |
| Compile gate | Automated check: does generated ASM assemble with vasmm68k_mot -m68000 -Fhunkexe? Yes/no. |
| First-shot | One generation attempt, no “please fix the errors” loop. Harder and more honest. |
| Sealed harness | Frozen prompts + seeds + temperature 0, so scores are comparable across runs. |
| Corpus | The big pile of source files used as raw material for training examples. |
| Training tier | How eagerly we include a project: Tier 1 = teach first; Tier 4 = sample carefully. |
┌──────────────────────────────┐
│ Public base model (HF) │ mlx-community/Qwen2.5-Coder-3B-Instruct-4bit
└──────────────┬───────────────┘
│ + LoRA adapter (this repo)
▼
┌──────────────────────────────┐
│ Local MLX server :1234 │ model id: amiga-playground-asm
└──────────────┬───────────────┘
│ chat completions
▼
┌──────────────────────────────┐
│ Amiga Playground (macOS) │ editor → vasm → ADF → emulator
└──────────────────────────────┘
You never need the training corpus to use the model. Corpus + prep scripts are for people who want to understand or rebuild.
public Amiga sources prepare / filter train ship
───────────────────── ──────────────── ───── ────
GitHub curated repos ──┐
Aminet dev/c, dev/asm ──┼──► keep source files ──► Chat examples ──► LoRA ──► adapters.safetensors
Learning / demo trees ──┘ drop binaries/ROMs (prompt→ASM) on Mac + model_version.json
prefer vasm-clean
│
▼
sealed scoreboard
140/140 first-shot
Historically the aMiLa tree described this loop as:
prepare_dataset.py — crawl sources, clean, optionally compile-check, emit ChatML JSONLsplit_dataset.py — train / valid splitfinetune.sh — MLX-LM LoRA training on Apple Silicon, then package adapterminimal_sealed_asm.py — frozen first-shot compile scoreboard (still present under fine_tuning/tools/)The shipped artifact is only the adapter + metadata. The base weights stay on
the public Hub (mlx-community/...).
The aMiLa dataset work is layered. Think of it as three shelves of books, not one mysterious dump.
Dataset/corpus1)A corpus builder (fetch_amiga_corpus.py) pulls public Amiga-related source:
| Source | Role |
|---|---|
| GitHub search | Queries such as amiga language:assembly, m68k, blitter amiga copper, paula audio, topic:amiga, demo/game sources, toolchains, etc. |
| Curated repos | Hand-picked trees (examples, demos, toolchains, libraries) kept under curated/ |
| Aminet / GitLab | Additional public trees when enabled |
Only source-like files are kept, for example:
.c, .h, .cpp, ….s, .asm, .i, .inc, ….readme, .guideBinaries and huge repos are skipped (e.g. repo size cap around 500 MB in the fetcher).
Each kept file can be listed in a manifest (corpus_manifest.jsonl) with path,
language hint, size, and text — ready for later packaging into training rows.
Curated examples on disk include projects such as demoscene trees, AROS references,
amitools, vbcc, amissl, and other well-known Amiga-adjacent codebases
(full list lives in the fetcher’s CURATED_REPOS).
Dataset/corpus2)A mirror pass over classic Aminet developer categories:
| Field | Snapshot value |
|---|---|
| Mirror | ftp.aminet.net |
| Categories | dev/src, dev/c, dev/asm |
| C sources retained | 12,646 files · ~3.35M lines |
| Assembly retained | 3,658 files · ~1.66M lines |
| Docs retained | 7,125 files |
| Packages processed | 958 (some extractions failed and were skipped) |
| Dedup | SHA-256 · 22,471 unique hashes · 2,668 duplicate blobs skipped |
This shelf is the “historical public Amiga developer archive” layer: lots of real hardware and OS code, uneven quality, valuable when sampled carefully.
amiga_sources tree (Dataset/corpus3)A human-oriented inventory (~75 projects) with explicit training policy:
| training_tier | Meaning | Count in catalog |
|---|---|---|
| 1 | Curated learning material — use first | 18 |
| 2 | Compact runnable projects / demos | 18 |
| 3 | Libraries, tools, moderate apps — sample | 27 |
| 4 | Large apps / ports — targeted use only | 12 |
Categories include learning, asm-demos, c-examples, games, applications,
tools, libraries, toolchains, reference.
Tier 1 examples (preferred teaching material):
amiga-assembler, amiga-c, amiga-c-tutorials, amiga-examples,
amiga-hardware-in-c, amiga-game-prog, amiga-playground, hello-bars,
misc-asm-68k-amiga-ocs, copper/rainbow-style tutorials, etc.
From catalog/training-policy.md — the philosophy is:
Teach Amiga programming concepts. Do not blindly maximize tokens.
Include first: small tutorials and idiomatic examples (68k basics, AmigaOS calls, hardware registers, Copper/display, buildable snippets).
Add second: compact demos/games/utilities with a README or Makefile.
Sample carefully: huge toolchains, NDKs, large application archives — take headers/examples/READMEs before whole trees.
Exclude by default:
*.o, *.exe, *.adf, *.lha, …Attribution: keep README/LICENSE with projects; training records should carry project path, category, tier, and license/readme presence when packaged.
Raw files are not what the GPU trains on directly. The prep idea is:
Read a source file (or a coherent block inside it).
Optionally assemble it with vasm. If it cannot assemble, it is a weak
teacher for a compile-first assistant — prefer drop or repair.
Build a chat example, roughly:
User: Create a CIA-A input polling routine for an active-low control signal.
Return one source file for a real 68000 Amiga target.
Assistant:
; motorola 68000 ...
SECTION Code,CODE
...
Write many such pairs to JSONL (train.jsonl / valid.jsonl style).
Fine-tune with MLX-LM LoRA so the model practices:
English hardware intent → Motorola syntax that vasm likes.
That is why the public product feels “compile-first”: the training objective was never “sound like an Amiga forum,” it was “emit assembler the toolchains accept.”
From adapter_config.json / model_version.json:
| Setting | Value | Plain English |
|---|---|---|
| Fine-tune type | LoRA | Small adapter, not full retrain |
| Base | mlx-community/Qwen2.5-Coder-3B-Instruct-4bit | Starting brain |
| Layers adapted | 16 | How many transformer blocks get sticky notes |
| LoRA rank | 8 | Capacity of the sticky notes (small = focused) |
| LoRA scale | 20 | How strongly the adapter influences the base |
| Dropout | 0 | No random “ignore adapter” during training for this package |
| Product version | 0.1.0 | First productized compile-gate release |
| Adapter SHA256 | 3c6cad…f88a | Integrity pin for the shipped weights |
Why so small?
A rank-8 LoRA on a 3B model is intentionally narrow: good at a dialect
(Motorola Amiga ASM idioms), cheap to ship, unlikely to fully “replace” the base
model’s general coding skill. If something is outside the Amiga ASM lane, the
base model still does most of the talking.
Training loss alone is a weak story for assembly. The product gate is mechanical:
cd aMiLa/fine_tuning
uv run python tools/minimal_sealed_asm.py \
--adapter runtime/adapter \
--output-dir /tmp/asm-score \
--limit 0 --compile-backend both
| Rule | Detail |
|---|---|
| Benchmark | amila-tier1-promotion-v1 (ASM subset) |
| Cases | 140 = 7 families × 20 variants |
| Decoding | temperature 0, fixed seeds per case |
| Pass | vasmm68k_mot -m68000 -Fhunkexe succeeds |
| Family bar | ≥ 18/20 (critical: not 0/20) |
| Shipped score | 140/140 |
Families (again, because this is the curriculum the scoreboard cares about):
Honest scope: this proves syntax + linkable hunk structure under vasm, not “looks perfect in every demo on real A500 copper timing.” Emulator / semantic ladders are separate ambition layers in Amiga Playground.
| Resource | What you’ll find |
|---|---|
| Amiga Playground on the site | Product context, install path |
GINNOV/littlethings → Amiga/aMiLa | App + fine_tuning runtime + dataset notes |
Dataset/corpus3/catalog/training-policy.md | Inclusion / exclusion rules in full |
Dataset/corpus3/catalog/projects.tsv | Per-project tier & category |
fine_tuning/tools/minimal_sealed_asm.py | The actual scoreboard |
| MLX-LM | How LoRA training/serving works on Apple Silicon |
| Qwen2.5-Coder | The base model family |
Imagine a talented junior who already codes in many languages (the base model). You give them a focused internship on Amiga 68000 sources (corpus + LoRA), then a written exam where every answer must compile with the real assembler (sealed harness). This Hub repo is the internship notebook they keep — not their entire brain.
vasm does not prove copper timing, blitter safety in every scene, or legal ROM usage.@misc{amiga-playground-asm,
title = {Amiga Playground ASM: MLX LoRA for Motorola 68000 Amiga assembly},
author = {bmove / GINNOV},
year = {2026},
howpublished = {\url{https://huggingface.co/bmove/amiga-playground-asm}},
note = {LoRA adapter on mlx-community/Qwen2.5-Coder-3B-Instruct-4bit; 140/140 sealed first-shot compile}
}
“Amiga: the computer that refused to die. Now with a local LoRA that speaks 68000.”
Product model for Amiga Playground · build lineage ships with app 1.0.0+
</div>