No description
  • Pascal 75%
  • PowerShell 10.1%
  • Liquid 10.1%
  • Python 2.4%
  • Batchfile 1.1%
  • Other 1.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Krzysztof Krystian Jankowski f744426f57
Some checks are pending
ci / windows (push) Waiting to run
ci / linux (push) Waiting to run
Tile browser: copy / cut (move) / paste tile runs across BG, sprites, font and art banks
- VRAM / ROM browser: click selects a tile, Shift+click extends a
  contiguous run inside one zone / bank page (blue outline).
- Right-click menu: Copy N tiles, Cut N tiles (move), Paste N tiles here
  (at the right-clicked slot), Clear N tiles. Edit menu mirrors it as
  Ctrl+Shift+C / X / V (plain Ctrl+C / V stay the canvas clipboard).
- Paste writes raw 2bpp data, so BG <-> art bank <-> sprite <-> font all
  work; a run that would cross a zone / bank edge is refused without an
  undo step. One undo step per paste/clear.
- Move (Cut + Paste) clears the source and re-points references that can
  follow: screen cells on a BG->BG move, sprite OAM tiles on OBJ->OBJ,
  art window cells when the target stays inside the window's bank span.
  References that cannot follow (e.g. art-window cells when tiles move to
  BG) are counted and confirmed before the move; Ctrl+Z restores all.

Tests: +18 import_zones selftest assertions (BG->bank copy, bank-edge
refusal + no undo, in-bank move with art ref follow, bank->BG move with
dangling ref, undo, BG->BG move with screen cell follow). run_all ALL GREEN.
2026-10-13 17:03:37 +02:00
.gitea/workflows Robustness release pass: critical + high fixes for the sold build (4.1) 2026-10-09 17:07:08 +02:00
assets/icons UI milestone phase A: icon toolbar, menu restructure, status panels 2026-10-09 18:17:43 +02:00
docs Release notes: Art Manager / Art Editor split in 4.2.1 2026-10-10 22:36:24 +02:00
installer Release 4.2.1.0 (test build): pen pressure, art-window painter; version bump + release notes 2026-10-10 15:13:59 +02:00
scripts package_release.ps1 -Publish: create Gitea release + upload assets (token from GITEA_TOKEN env, never in repo) 2026-10-10 23:20:01 +02:00
shopify Cleanup pass 2: remove one-off incident/dev scripts (av_repro, bug1 zoom harness, f6_show_asm, m3b_parity, helper probes), tracked test binaries, foreign 3d-retro-max template; dist trimmed to 4.1, builds evidence cleaned; AGENTS.md test inventory updated; full gate sweep green 2026-10-09 10:56:07 +02:00
tests Art windows: 2-bank span (256 unique tiles), screen-designer tool set, v4 format 2026-10-09 21:52:37 +02:00
tools UI milestone phase A: icon toolbar, menu restructure, status panels 2026-10-09 18:17:43 +02:00
.gitignore Robustness release pass: critical + high fixes for the sold build (4.1) 2026-10-09 17:07:08 +02:00
about.jpg Just Delphi Project 2026-08-16 18:05:13 +02:00
about_form.lfm Robustness release pass: critical + high fixes for the sold build (4.1) 2026-10-09 17:07:08 +02:00
about_form.pas Robustness release pass: critical + high fixes for the sold build (4.1) 2026-10-09 17:07:08 +02:00
AGENTS.md package_release.ps1 -Publish: create Gitea release + upload assets (token from GITEA_TOKEN env, never in repo) 2026-10-10 23:20:01 +02:00
app_icons.pas UI milestone phase A: icon toolbar, menu restructure, status panels 2026-10-09 18:17:43 +02:00
build.cmd Robustness release pass: critical + high fixes for the sold build (4.1) 2026-10-09 17:07:08 +02:00
build.sh Medium/low robustness pass + two toolbar visibility bugs 2026-10-09 17:28:57 +02:00
build_output_form.lfm LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
build_output_form.pas LZ-M5a: first green Linux x64 GTK2 build - TProcess build steps w/ timeout parity, tar.xz extract + per-OS rgbds pin (linux sha 3e19e50e), XDG data dir, PATH tool resolution, graceful Linux emulator story, GetToolPath/RefreshStates fixes; Windows build re-verified green 2026-10-07 18:35:11 +02:00
downloader.pas Robustness release pass: critical + high fixes for the sold build (4.1) 2026-10-09 17:07:08 +02:00
engine_export.pas Art windows: 2-bank span (256 unique tiles), screen-designer tool set, v4 format 2026-10-09 21:52:37 +02:00
EULA.md Release 4.2.0.0: version bump (version.inc, lpi, manifest, iss, EULA, notices) + release notes 2026-10-09 21:54:22 +02:00
font_editor_frame.lfm LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
font_editor_frame.pas LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
font_manager_frame.lfm LZ-M2b: runtime bring-up - clLtGray->clSilver lfm streaming fix, startup exception logging before OnException wiring; app runs, loads sample, saves byte-exact; gates 1-5 PASS 2026-10-01 17:54:14 +02:00
font_manager_frame.pas LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
main.ico Just Delphi Project 2026-08-16 18:05:13 +02:00
main.lpi Release 4.2.1.0 (test build): pen pressure, art-window painter; version bump + release notes 2026-10-10 15:13:59 +02:00
main.lpr Robustness release pass: critical + high fixes for the sold build (4.1) 2026-10-09 17:07:08 +02:00
main.manifest Release 4.2.1.0 (test build): pen pressure, art-window painter; version bump + release notes 2026-10-10 15:13:59 +02:00
main_selftests.inc Tile browser: copy / cut (move) / paste tile runs across BG, sprites, font and art banks 2026-10-13 17:03:37 +02:00
main_window.lfm UI: drop the workspace tab-button row; View > Workspace (F1-F7) + tree sync 2026-10-09 19:08:04 +02:00
main_window.pas Tile browser: copy / cut (move) / paste tile runs across BG, sprites, font and art banks 2026-10-13 17:03:37 +02:00
nag_form.lfm LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
nag_form.pas Robustness release pass: critical + high fixes for the sold build (4.1) 2026-10-09 17:07:08 +02:00
p1xel_resources.rc UI milestone phase A: icon toolbar, menu restructure, status panels 2026-10-09 18:17:43 +02:00
pen_input.pas Pen pressure (Wacom / Windows Ink) for the pixel editor 2026-10-10 15:09:48 +02:00
pixel_editor_frame.lfm LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
pixel_editor_frame.pas LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
project.p1x Tile selector: scroll + zone rendering fixes 2026-10-09 21:08:18 +02:00
project_io.pas Art windows: 2-bank span (256 unique tiles), screen-designer tool set, v4 format 2026-10-09 21:52:37 +02:00
README.md Medium/low robustness pass + two toolbar visibility bugs 2026-10-09 17:28:57 +02:00
screen_designer_frame.lfm Medium/low robustness pass + two toolbar visibility bugs 2026-10-09 17:28:57 +02:00
screen_designer_frame.pas LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
screen_manager_frame.lfm LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
screen_manager_frame.pas LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
screen_proofer_form.lfm LZ-M0a: Lazarus scaffold green - main.lpr/lpi (4 build modes), 12 units converted in place, main_window stub-gated (LAZARUS_M0_STUB), build.cmd/build.sh + UPX, FileSha256 fail-closed stub (FPC 3.2.2 lacks SHA-256) 2026-10-01 10:36:50 +02:00
screen_proofer_form.pas LZ-M5a: first green Linux x64 GTK2 build - TProcess build steps w/ timeout parity, tar.xz extract + per-OS rgbds pin (linux sha 3e19e50e), XDG data dir, PATH tool resolution, graceful Linux emulator story, GetToolPath/RefreshStates fixes; Windows build re-verified green 2026-10-07 18:35:11 +02:00
sha256.pas LZ-M3a: pure-Pascal SHA-256 (FIPS 180-4, chunked, endian-clean) + test vectors incl. real rgbds pin artifact; FileSha256 live - wizard pin/TOFU re-armed 2026-10-07 17:54:37 +02:00
THIRD_PARTY_NOTICES.md Release 4.2.0.0: version bump (version.inc, lpi, manifest, iss, EULA, notices) + release notes 2026-10-09 21:54:22 +02:00
version.inc Release 4.2.1.0 (test build): pen pressure, art-window painter; version bump + release notes 2026-10-10 15:13:59 +02:00
wizard.pas Robustness release pass: critical + high fixes for the sold build (4.1) 2026-10-09 17:07:08 +02:00

P1Xel Editor

A portable pixel editor custom-built for Game Boy (Color) development — from the first tile to a running ROM in one tiny executable.

~2.4 MiB single EXE (free "floppy" edition: ~720 KiB UPX-packed) · no installer · no runtime dependencies · Windows 10+ · native Linux (GTK2) build from the same source

Written in Free Pascal with Lazarus LCL.


Screenshots

P1Xel Editor at work

Fungus Foray DX — graphics made with P1Xel Editor

The About box

Features

Editors & modes

Editor What you get
Tile Editor 8×8 indexed 2bpp painting — draw, fill, line, clear; grid toggle, zoom, right-click color-0 erase; Single ⇄ 2×2 meta-tile modes (picking a named asset switches the view automatically)
Painter mode Paint an arbitrary block of tiles as one image, then stamp it anywhere on the map — whole-stamp flipping included
Sprite Editor 128-tile sprite zone; up to 40 sprites per screen; multi-part meta-sprites with positioned parts; hardware-ready OAM export
Font Editor + Manager 81-glyph font with its own manager — edit glyphs, browse the map, and bake text directly onto screens with the text tool
Screen Designer Place tiles and meta-tile stamps, bake text, place sprites, and paint per-cell attributes (palette index + H/V flips)
Inspect tool Click any cell — see the tile's name, whether it is single or meta, and which sprite covers it
Screen Manager Add, rename, delete screens in 20×18 and 32×32 sizes, up to 255 levels
Art Windows 20×18 fullscreen art editor — dedicated windows for title-screen art, each bound to its own ROM bank (up to 16 banks × 192 tiles), with a per-window bank selector and a 1× native proofer
Whole-ROM viewer Every byte of your ROM shown as tiles — sprite zone, font, background, and the raw tail — zoomable
Screen Proofer Engine-accurate preview of any screen: verify the map, attributes, and sprites before you build

Color

  • 8 BG + 8 OBJ CGB palette banks, 4 colors each — edited visually, exported as hardware RGB555

Naming & the data contract

  • Name everything — tiles, meta-tiles, sprites, meta-sprites — with duplicate detection and tags (solid, lethal, custom)
  • Names flow straight into catalog.toml; exports use standard Game Boy layouts any engine can consume:
meta.dat      level table, palette RAM dumps, level descriptors (v2: + art window table — only when banks exist)
tileset.chr   6144-byte 2bpp tileset (sprites · font · background zones)
bank<k>.chr   art bank dumps — up to 16 × 192 tiles, VRAM bank 1 (only when banks exist)
levels.tlm    tile maps + CGB attribute planes
art.tlm       fullscreen art window records — bank-relative tiles, attribute bit 3 set (only when banks exist)
levels.oam    hardware OAM entries per level
catalog.toml  every named asset with map bytes and tags (+ [banks], [art_windows])
banks.rgbasm  generated bank ROMX sections with size asserts — assembled into the ROM by Build ROM

Projects without art banks export the byte-identical v1 contract — old projects are unaffected. The engine-side bank contract (file layouts, ArtBank<K>Data labels, CGB load recipe) is documented in docs/CONTRACT-BANKS.md: the ROM carries the bank data, ready for engine consumption.

  • PNG export at 100% and 400% — any tile, meta-tile, sprite, screen, or the whole ROM

Toolchain — zero to running ROM

  • Setup wizard: downloads and installs the RGBDS assembler (pinned release, SHA-256-verified), the BGB emulator, and the nomad-core sample project — staged safely, nothing touched on failure
  • One-click Build ROM (rgbasm → rgblink → rgbfix) with live output and the failing file/line in the build log
  • Bank-aware ROM builds — art banks ship in the ROM as generated banks.rgbasm ROMX sections, byte-verified at link time
  • Run in emulator — or watch mode that rebuilds and reloads while you edit
  • Tool URLs overridable via tools/toolchain.ini

Projects that don't lose work

  • Binary .p1x project format (version 3 — v1/v2 files still open) with atomic saves (write temp → flush → replace)
  • Autosave every 10 seconds with crash recovery prompt on next launch
  • 20-level undo/redo, dirty-state guards on open/close, recent projects, command-line open

Shareware build

The same editor with a 5-second purchase reminder at startup — build mode Release-Shareware (-dSHAREWARE). Buy URL defaults to the product page and is overridable via [Shareware] BuyUrl in tools/toolchain.ini.


Build

Toolchain: Lazarus 4.x + FPC 3.2.2 (lazbuild).

# Windows (from the repo root)
build.cmd Debug              # or: Release (sold build, unpacked + signed), Release-Shareware (floppy build, UPX)
powershell -File tests\run_all.ps1   # every automated gate in one go

# Linux (GTK2, x64) — build in a native FS, never on a mounted Windows drive
lazbuild --build-mode=Linux main.lpi

Output lands in builds/. The Linux mode expects LCLWidgetType=gtk2 (default in main.lpi).

Test

Pure-FPC console tests under tests/ — no GUI needed:

fpc -Mobjfpc -Sh tests/loader_compile_test.pas   # project loader vectors (v1/v2/sample)
fpc -Mobjfpc -Sh tests/sha256_test.pas           # FIPS vectors + pinned rgbds artifacts
cd tests && fpc -Mobjfpc -Sh -Fu.. export_harness.lpr   # .p1x -> 5-file export harness
powershell -File tests/run_golden_gate.ps1       # byte-compare exports vs tests/fixtures/
python tests/zipslip/run_matrix.py               # zip-slip guard regression matrix

Release packaging

powershell -ExecutionPolicy Bypass -File scripts/package_release.ps1

Runs tests/run_all.ps1 first (red gate = no release), then builds Release (unpacked, Authenticode-signed before zipping) + Release-Shareware (UPX, unsigned), produces dist/ with portable zips (EXE + EULA + notices), the Inno Setup installer (when Inno 6/7 is installed), a *-symbols-win32.zip with the .dbg for crash symbolization (keep, do not publish), and SHA256SUMS.txt. Signing: scripts/sign.cmd (cert thumbprint or Azure Trusted Signing; -RequireSigning refuses to produce unsigned artifacts).

Repository layout

main.lpr / main.lpi        project entry + build modes (Debug/Release/Release-Shareware/Linux)
main_window.pas/.lfm       the editor (tile/sprite/font hosts, screens, toolchain UI)
engine_export.pas          the data-contract exporters (deterministic, golden-testable)
project_io.pas             pure-FPC .p1x loader
downloader.pas             WinInet (Windows) / fphttpclient (Linux) + zip/tar extraction + SHA-256
wizard.pas                 toolchain setup wizard (pins, staging, TOFU)
sha256.pas                 pure-Pascal FIPS 180-4
nag_form.*                 shareware reminder ({$IFDEF SHAREWARE})
installer/  scripts/       Inno Setup script, packaging + signing
tests/                     console tests, golden gate, regression kits
docs/CONTRACT-BANKS.md    engine-side art bank contract (bank<k>.chr · art.tlm · meta.dat v2 · banks.rgbasm)
shopify/                   storefront templates

License & notices

The application is distributed under its end-user license — see EULA.md. It is built with Free Pascal / Lazarus LCL (modified LGPL — see THIRD_PARTY_NOTICES.md), the free "floppy" edition is packed with UPX (GPL + special exception), and it integrates RGBDS (MIT) and BGB (freeware) at runtime.

P1Xel Editor is not affiliated with, endorsed by, or sponsored by Nintendo. Game Boy is a trademark of Nintendo.


Made in Poland by Cyfrowy Nomada · Fits on a floppy.