Learn 6502 Assembly is a modern, native Adwaita application for the GNOME desktop environment that provides a complete learning environment for 6502 assembly language programming. Built with GJS and TypeScript, this application brings the classic easy6502 tutorial by Nick Morgan to your desktop as a beautiful, integrated experience.
- Interactive Tutorial: A comprehensive step-by-step guide to learning 6502 assembly language, with explanations of all core concepts
- Code Editor: Write and edit your 6502 assembly code with syntax highlighting
- Assembler & Debugger: Assemble your code and debug it with a built-in debugger showing registers, flags, and memory in real-time
- Visual Game Console: See your code in action on a virtual display, perfect for creating vintage games and graphics
- Built with Modern Technologies: Developed in GJS and TypeScript with Adwaita styling for a native GNOME experience
This project is a fork of the original web-based easy6502 tutorial, transformed into a native GNOME application while preserving the core functionality that made the original so effective for learning 6502 assembly.
- app-gnome: Main GNOME desktop application with Adwaita styling
- app-android: Android application with NativeScript
- app-web: Web application version
- core: Core 6502 assembler, simulator, and disassembler (published as
@learn6502/core) - common-ui: Shared UI components and controllers
- learn: Tutorial content and learning materials
- translations: Localization files and build system
The repository works with gjsify (recommended), npm, yarn or pnpm — use whichever you're comfortable with.
# Recommended — gjsify (the canonical toolchain)
gjsify install
gjsify run build
gjsify run start:gnomePrefer npm / yarn / pnpm? They all work too — each installs the workspaces and resolves the internal dependencies; the build itself still runs through gjsify (it's a dev dependency, so its bin is available after any install):
npm install # or: yarn install | pnpm install
npm run build && npm run start:gnome # or the yarn / pnpm equivalentNotes:
- gjsify is the canonical path — the committed
gjsify-lock.jsonand the offline Flatpak build use it. npm/yarn/pnpm generate their own lockfiles (gitignored); they're fine for local dev, please don't commit them. - pnpm relies on the committed
pnpm-workspace.yaml(pnpm reads its workspace members + settings there, not theworkspacesfield or a project.npmrc):linkWorkspacePackages: true(plain^ranges link the local workspaces),nodeLinker: hoisted(flat layout the gjsify bundler needs),minimumReleaseAge: 0+dangerouslyAllowAllBuilds: true(match npm/yarn's defaults — no new-version quarantine, run dep build scripts — so non-interactive installs don't error). - The internal packages use plain
^x.y.zranges (not theworkspace:protocol), which is why every manager — including npm and classic yarn — can resolve them. - A manual Package Managers CI workflow verifies all four managers install + resolve the workspaces; trigger it from the Actions tab if you touch the dependency wiring.
The @gjsify/* packages are pinned to registry versions, so a change that spans the platform and
this app would otherwise cost an npm release per iteration. gjsify link points this project at a
local gjsify checkout instead:
gjsify link /path/to/gjsify # build the checkout first — a link does not build
gjsify unlink # undo, and reinstall the registry copies- Nothing tracked changes. The override lives in
.gjsify-link.json, hidden through.git/info/exclude;gjsify-lock.jsonandpackage.jsonstay byte-identical, and every latergjsify installre-applies the links and names them instead of silently replacing them. gjsify install --immutablerefuses while a link is active — deliberately. CI and the offline Flatpak build use--immutablebecause they must build exactly what is committed, so rungjsify unlinkbefore you expect either of them to work.- Bootstrapping is self-resolving: the first
linkhas to be run with the checkout'sgjsifybinary (<checkout>/node_modules/.bin/gjsify link …), because the pinned CLI predates the command.@gjsify/cliis among the linked packages, so afterwards this project's owngjsifyis the checkout's. packages/node-gi/*is outside the checkout's rootworkspaces, so@gjsify/node-giand thegtk-runtime-*/node-runtime-*bundles are not linkable this way.
To build the packages, run gjsify run build in the root of the repository.
To run the packages, run gjsify run start:gnome for the GNOME app or gjsify run start:web for the web app.
Versioning, changelogs and npm publishing are managed with Changesets (see .changeset/README.md). Add a changeset with your change (gjsify run changeset, or npm/yarn/pnpm run changeset). All @learn6502/* packages are version-locked and bump together; only @learn6502/core is published to npm (the rest are private). Maintainer release: … run changeset:version then … run changeset:publish.
Contributions are welcome :)
- The application code is licensed under the GNU General Public License v3
- The tutorial content and all translations are licensed under the Creative Commons Attribution 4.0 International License
- The metadata is licensed under the Creative Commons Zero 1.0 Universal License
