Meatloaf Map Maker
Getting Started
Open the editor at https://map.meatloaf.cc. Screen (0, 0, 0, 0) loads by default. The layout is:
- Screen Controls โ W / X / Y / Z coordinate inputs and Load button
- Info Panel โ title, code, description, dimensions, Save
- Char Palette / Editor โ 256-char palette on the left, pixel editor below it
- Tile Grid โ the main 40ร25 editing canvas
- Tile Data Panel โ per-tile text notes and navigation links
- Audio Toolbar โ SID music player
- Screen Toolbar โ three rows of icon buttons covering editing operations, display settings, and file operations
Screen Toolbar layout
The Screen Toolbar has three rows:
- Row 1 โ Editing tools: Undo / Redo ยท Selection shapes ยท Shift arrows ยท Flip ยท Fill modes ยท Clear
- Row 2 โ Display & tools: Palette selector ยท BG & Border color pickers ยท Gradient ยท Font ยท QR Code ยท Animation play/stop
- Row 3 โ File operations: Save .mmm ยท Load .mmm ยท Import ยท Export
All buttons show a tooltip on hover describing the action.
Screen Navigation
Screens live in a four-dimensional space identified by W, X, Y, Z integer coordinates.
Loading by coordinates
- Type the coordinates into the W / X / Y / Z inputs at the top.
- Click Load.
Loading by shortcode
Every saved screen has a unique code. Type it into the Code lookup field and press Enter or click Go.
URL parameters
Link directly to any screen with query params:
/?w=1&x=2&y=3&z=0 /?code=abc123
The Tile Grid
The main canvas is a grid of 40 ร 25 tiles (configurable). Each tile holds one PETSCII character index and one C64 color index.
Use Arrow keys to move the green cursor. The Info Panel status bar shows the current position, SSE connection state, and PRG download links.
Char Palette
The palette shows all 256 characters from the current charset as a 16ร16 grid. Characters 0โ127 appear in the top half; 128โ255 in the bottom half.
Selecting a character
Click any character to open it in the pixel editor and make it the active painting character.
Stamping a character
Double-click any character to instantly stamp it onto the current tile, or to fill the active selection with it.
Keyboard navigation
Click the palette to give it focus, then use Arrow keys to step through characters.
Uppercase / Lowercase mode
The Uppercase / Lowercase toggle switches between the two C64 ROM character sets. Lowercase mode makes aโz available as individual chars.
Char Editor
The pixel editor shows the selected character as an 8ร8 grid at 25 pixels per pixel.
Drawing pixels
- Left-click / drag โ set pixels (foreground)
- Right-click / drag or Alt+click โ clear pixels (background)
Bitmap operations
| Button | Operation |
|---|---|
| Arrow icons (โโโโ) | Shift pixels left / right / up / down (wrapping) |
| Flip horizontal icon | Mirror pixels left/right |
| Flip vertical icon | Mirror pixels top/bottom |
| Rotate right icon | Rotate 90ยฐ clockwise |
| Rotate left icon | Rotate 90ยฐ counter-clockwise |
Changes to the editor update the tile grid immediately.
Color Palette & Screen Colors
Setting the active color
Click a color swatch to make it the active painting color.
Filling a selection with a color
Double-click a color swatch to repaint all tiles in the active selection with that color (char unchanged).
Palette variants
The Palette dropdown in the Screen Toolbar Row 2 selects among 17 named C64 color definitions (Pepto, VICE, Colodore, etc.).
Background and border color
The BG and Border color pickers in the Screen Toolbar Row 2 set the screen background and C64 border color. Both are saved to the screen record.
Painting Tiles
Basic painting
- Move the cursor with Arrow keys or click a tile.
- Type a character on the keyboard to place the PETSCII char at that code point.
- Or click a tile to place the current char + color.
Modifier keys when clicking
| Modifier | Effect |
|---|---|
| None | Place current char + color |
| Alt | Char only (keep existing color) |
| Shift | Color only (keep existing char) |
Delete erases the tile at the cursor (places char 32, space). Backspace erases and steps the cursor left.
Click and hold, then drag to paint continuously.
Selections
Selections scope operations to a subset of tiles. Up to 8 selections can be active simultaneously.
Selection shapes
Choose a shape from the Select group in Screen Toolbar Row 1:
| Icon | Shape | How to draw |
|---|---|---|
| Square icon | Rectangle | Click and drag |
| Circle icon | Oval | Click and drag from center outward |
| Lasso icon | Polygon | Click vertices one at a time; click near the first vertex to close; Esc to cancel |
Adding to a selection
Shift+drag adds a new region to the existing selection without clearing it.
Select matching tiles
Ctrl+A selects all tiles on the screen that match the cursor tile (same char AND color).
Moving and adjusting
| Key / Action | Effect |
|---|---|
| Shift+Arrow | Nudge the selection outline one tile |
| Alt+Arrow | Shift tile content inside the selection (outline stays fixed) |
| Drag selection edge | Reposition the selection with the mouse |
| Delete | Erase all tiles in the selection |
| Esc | Clear all selections |
Copy, Cut & Paste
| Key | Action |
|---|---|
| Ctrl+C | Copy the current selection to the clipboard |
| Ctrl+X | Cut the selection (copies then erases source tiles) |
| Ctrl+V | Paste as a floating selection at the cursor position |
| Shift+Arrow | Nudge the floating paste position |
| Drag floating paste | Reposition with the mouse |
| Space | Toggle transparent paste mode (see below) |
| Enter | Commit paste to the screen |
| Esc | Cancel paste and restore original tiles |
Transparent paste mode
While a paste is floating (after Ctrl+V), press Space to toggle transparent mode. In transparent mode any tile in the clipboard whose character bitmap has no set pixels (all-zero โ e.g. space, blank chars) is skipped during paste and does not overwrite the destination. Press Space again to turn it off. The preview updates immediately so you can see the effect before committing.
Example: duplicate a region
- Draw a rectangle selection around the region.
- Ctrl+C to copy.
- Ctrl+V to paste.
- Shift+Arrow to move to the desired location.
- Enter to commit.
Undo & Redo
The editor keeps 50 levels of undo history covering all tile-modifying operations.
| Action | Key | Toolbar |
|---|---|---|
| Undo | Ctrl+Z | Undo icon (Row 1) |
| Redo | Ctrl+Y or Ctrl+Shift+Z | Redo icon (Row 1) |
Flood Fill
Flood fill replaces connected tiles that share the same char or color. Three modes are in the Fill group of Screen Toolbar Row 1:
| Icon | Mode | Char changed | Color changed |
|---|---|---|---|
| Paint bucket icon | Fill (char + color) | Yes | Yes |
| Brush icon | Fill char only | Yes | No |
| Droplet icon | Fill color only | No | Yes |
If a selection is active, fill is limited to selected tiles. Otherwise it floods from the cursor position outward through connected matching tiles.
Example: recolor all walls
- Select the replacement color in the color palette.
- Click any wall tile on the screen to move the cursor there.
- Click the Droplet (Fill color only) button โ every contiguous tile with the same color is repainted.
Screen Operations
Shift screen
The four arrow icon buttons in the Shift group scroll all tile content one step in that direction. Content wraps around the edges. If a selection is active, only selected tiles shift.
Flip screen
| Icon | Effect |
|---|---|
| Flip horizontal icon ยท Alt+H | Mirror left/right (applies to selection or full screen) |
| Flip vertical icon ยท Alt+V | Mirror top/bottom (applies to selection or full screen) |
Clear
The Trash icon erases all tiles on the screen (or just the selection if one is active), replacing them with space (char 32, color 0).
Gradient Tool
The Gradient Tool paints a smooth multi-stop color gradient across tiles. Click the Blend icon in Screen Toolbar Row 2 to open the modal.
Configuring the gradient
- Click a color in the 16-swatch picker.
- Click + Add Stop to append it to the sequence.
- Repeat for as many colors as needed. Use โ โถ to reorder, โ to remove.
- The preview strip shows the interpolated gradient live.
Applying
- Click Draw Gradient โ (requires at least 2 stops).
- Click and drag across the tile grid to define the gradient direction.
- Tile colors update along the drag direction. Press Esc to cancel.
Example: sunset sky
- Add stops: Yellow โ Orange โ Red โ Purple.
- Click Draw Gradient โ.
- Drag from the top row to the bottom row of the screen.
Find & Replace
Press Ctrl+F to open the Find & Replace modal. Search and replace tiles by char, color, or both.
How it works
Each of the four field rows has a checkbox to enable/disable that criterion:
| Field | Checkbox off | Checkbox on |
|---|---|---|
| Find: Char | Ignore char | Match only tiles with this char |
| Find: Color | Ignore color | Match only tiles with this color |
| Replace: Char | Keep existing char | Replace char with selected value |
| Replace: Color | Keep existing color | Replace color with selected value |
Picking values from the main palette
- Click a field row โ it highlights in yellow to show it is active.
- Click any char in the main char palette to assign it to that row.
- Click a color swatch to assign it to a color row.
Scope
If a selection is active, the operation is limited to selected tiles. Otherwise it applies to the entire screen.
Count vs Replace All
- Count โ counts matching tiles without making any changes.
- Replace All โ applies the replacement to every matching tile.
QR Code Generator
Click the QR code icon in Screen Toolbar Row 2 to open the modal.
Standard mode
- (Optional) Click the Dark field row, then click a char in the palette to set the dark-module character. Default is the currently selected char.
- (Optional) Click Light and pick the light-module character. Default is the sparsest char in the current charset.
- Type your text or URL in the textarea.
- Click Generate & Paste (or press Ctrl+Enter).
- The QR code appears as a floating paste. Nudge with Shift+Arrow, then Enter to commit.
Compact mode
Enable the Compact (1 char per 2ร2 module) checkbox. Each tile represents a 2ร2 block of QR modules, making the output half the size in each dimension. Char selection is fully automatic based on bitmap density โ dark/light fields are hidden in compact mode.
Animations
Any character can be assigned an animation sequence. Click the Anim button next to the char editor to open the Animation modal for the current char.
Animation settings
| Control | Description |
|---|---|
| Interval (ms) | Time between frames (16โ5000 ms) |
| Cycle | Frames play 1โ2โ3โโฆโ1โ2โฆ |
| Bounce | Frames play 1โ2โ3โ2โ1โ2โฆ |
| Loop | Whether the animation repeats indefinitely |
Frame rows
Each frame specifies a char replacement, a pixel-operation (shift/flip/rotate), or no change โ plus an optional color override. To assign a char from the palette: click the frame row to activate it, then click any char in the main palette.
Playback
Click the Play icon in Screen Toolbar Row 2 to start animation playback for all animated chars simultaneously. The icon switches to a filled Stop square while running โ click it again to stop and restore the static tile display.
Example: blinking character
- Open char 160 (solid block) in the editor and click Anim.
- Set Interval = 500 ms, Sequence = Bounce, Loop = on.
- Add two frames: char 160 and char 32 (space).
- Click Save, then click the Play icon in the Screen Toolbar.
SID Audio
Attach C64 SID music to a screen. The SID plays automatically when a visitor loads the screen.
Choosing a SID file
- Click the SID button to open the file browser.
- Navigate folders and click a file name to load and play it.
- The selection is saved to the current screen automatically.
Click โ No music to explicitly disable audio for this screen.
Playback controls
| Button | Action |
|---|---|
| โ / โถ | Previous / next subtune |
| โถ / โธ | Play / Pause |
| โ | Stop |
| Vol slider | Adjust volume |
Tile Text & Navigation Links
Tile text
The Tile Data Panel below the grid shows a textarea for the current tile. Type any notes or metadata โ saved on blur or Enter.
Navigation links
Link any tile to a specific position on another screen:
- Position the cursor on the source tile.
- Fill in W, X, Y, Z (target screen) and X, Y offset (position within that screen).
- Click Set to save.
Use Copy to snapshot the current cursor position, navigate to the linking tile, then Paste to fill the link fields. Click Clear to remove a link.
Custom Charsets & Font Mode
Loading a .64c charset
A .64c file contains 2 KB of C64 bitmap data (256 chars ร 8 bytes). Load one from the charset picker in the toolbar to replace the ROM charset in both the palette and the tile grid.
Font mode
Click the Type (Aa) icon in Screen Toolbar Row 2 to open the Font modal. Font mode lets you render any system font into the char editor as you type:
- Choose a font family from the dropdown (system fonts are listed automatically).
- Set the point size.
- Choose Compact mode or leave it off:
| Mode | Behaviour |
|---|---|
| Off (default) | Each lit pixel in the font glyph paints one tile with the current char. The cursor expands to match the glyph dimensions. |
| Compact | Each tile is scored against all 256 charset chars by pixel density in four quadrants; the best-matching char is stamped. Produces readable text at near-native size. |
- Click Apply to activate the font.
- Move the cursor to the desired position and type โ glyphs are rendered at each keystroke and the cursor advances by glyph width.
- Press Esc to exit font mode and return the cursor to normal size.
Real-time Collaboration
Multiple users can edit the same screen simultaneously.
- Connecting to a screen opens an SSE stream โ your cursor broadcasts to all other users.
- Other users' cursors appear as colored outlines with distinct per-player colors.
- The SSE status indicator in the Info Panel shows green when connected.
- The Clients count shows how many users are on this screen.
Messaging
Click ๐ฌ in the Info Panel to open the messaging modal.
| Scope | Who sees it |
|---|---|
| Global | All connected users |
| Screen | Users on the current screen |
| Group | Members of a named group |
| DM | A specific player |
The Events Log below the editor shows a scrolling feed of server events. Toast notifications appear briefly in the corner for new messages and connection changes.
Saving to Server
Auto-save of tile changes
Every tile paint, fill, paste, and cut is sent to the server immediately. You do not need to manually save individual tile edits.
Saving screen metadata
Click the green Save button in the Info Panel to persist: title, description, code, dimensions, BG/border colors, char mode, animations, charmap, and audio assignment.
PRG download links
After loading a screen, download links appear in the status bar:
| Link | Contents |
|---|---|
| DL chars | Tile char indices as a C64 PRG binary (load $0400) |
| DL colors | Tile color indices as a C64 PRG binary (load $D800) |
| DL charset | Custom charset bitmap data as a PRG binary |
| DL SID | The assigned SID audio file |
MMM Save Files
A .mmm file is a portable JSON snapshot of an entire screen. It captures everything needed to restore the screen on any server or at any coordinates.
What is saved
- App name, version, save timestamp, and screen URL link
- Screen metadata: title, description, code, BG color, border color, char mode, charset path, and original coordinates (for reference)
- All 1000 tile entries (char index + color index)
- All per-tile text notes
- All per-tile navigation links
- All character animations (full AnimConfig for each animated char)
- All custom-drawn character bitmaps
Saving a .mmm file
Click the Save icon (floppy disk) in Screen Toolbar Row 3. The file downloads immediately with no dialog. The filename is:
code.mmmโ if the screen has a code setw.x.y.z.mmmโ using the current screen coordinates otherwise
Loading a .mmm file
Click the Load icon (folder) in Screen Toolbar Row 3 and pick a .mmm file. The data is applied to the current screen coordinates (the original coordinates in the file are ignored). The screen is then saved to the server automatically.
Export & Import
The Export and Import modals in Screen Toolbar Row 3 let you exchange screen data with other tools using industry-standard C64 formats.
Export
Click the Download icon (Export) to open the Export modal. Choose a format and click Download.
| Format | Extension | Notes |
|---|---|---|
| PNG image | .png | Full-color render. Options: 1ร / 2ร / 4ร scale; include C64 border |
| Assembler source | .asm | Byte directives for KickAssembler, ACME, 64tass, or ca65. Options: hex values; standalone (includes ML loader) |
| BASIC listing | .bas | DATA statements with POKE loops for screen and color RAM |
| Executable PRG | .prg | Self-contained binary. BASIC SYS stub + ML loader + screen + color RAM. Uses ROM charset. |
| Marq C format | .c | C byte array compatible with the Marq PETSCII editor |
| JSON | .json | Petmate-compatible framebuf JSON |
| PETSCII sequence | .seq | Raw PETSCII with color control codes. Options: insert CLS ($93) at start; insert CR ($0D) at end of each row |
| PET binary | .pet | 5-byte header + raw screen codes + color RAM |
The exported filename follows the same pattern as MMM saves: code.ext or w.x.y.z.ext.
Import
Click the Upload icon (Import) to open the Import modal. Click the file area to pick a file โ the format is detected automatically from the extension. The parsed result (tile count, background color, border color) is shown before you commit. Click Import to apply it to the current screen.
| Format | Extension | What is imported |
|---|---|---|
| Assembler source | .asm | ScreenData + ColorData byte blocks; BackgroundColor / BorderColor constants |
| BASIC listing | .bas | DATA statement values; POKE 53280/53281 for border/background |
| Executable PRG | .prg | Screen and color RAM extracted from the ML binary payload |
| Marq C format | .c | Byte array values; first two bytes treated as border/bg color |
| JSON | .json | Petmate framebuf โ tiles, colors, background |
| PETSCII sequence | .seq | Screen codes reconstructed from PETSCII control-code stream |
| PET binary | .pet | Header + raw screen + color data |
Keyboard Shortcut Reference
Navigation
| Key | Action |
|---|---|
| Arrow keys | Move cursor one tile |
| Shift+Arrow | Nudge selection outline or floating paste position |
| Alt+Arrow | Shift tile content inside selection (outline stays); or shift entire screen when no selection |
| Alt+H | Flip horizontal โ mirrors selection or full screen left/right |
| Alt+V | Flip vertical โ mirrors selection or full screen top/bottom |
Editing
| Key | Action |
|---|---|
| Type a character | Place PETSCII char at cursor (or render font glyph in font mode) |
| Delete | Erase tile at cursor (char 32 / color 0); or erase all tiles in active selection |
| Backspace | Erase tile and move cursor left |
| Left-click / drag | Paint tile(s) with current char + color |
| Alt+click | Paint char only (keep existing color) |
| Shift+click | Paint color only (keep existing char) |
| Right-click / drag | Clear pixel in char editor; pick tile char (on grid) |
Selection
| Key | Action |
|---|---|
| Ctrl+A | Select all tiles matching the cursor tile (char + color) |
| Shift+drag | Add a new region to the current selection |
| Delete (with selection) | Erase all tiles in the selection |
| Esc | Clear all selections |
Clipboard & paste
| Key | Action |
|---|---|
| Ctrl+C | Copy selection to clipboard |
| Ctrl+X | Cut selection (copy + erase source) |
| Ctrl+V | Paste as floating selection at cursor |
| Space (during paste) | Toggle transparent paste โ blank tiles in clipboard do not overwrite destination |
| Shift+Arrow (during paste) | Nudge floating paste position |
| Enter (during paste) | Commit floating paste to screen |
| Esc (during paste) | Cancel paste and restore original tiles |
History
| Key | Action |
|---|---|
| Ctrl+Z | Undo |
| Ctrl+Y or Ctrl+Shift+Z | Redo |
Modals & modes
| Key | Action |
|---|---|
| Ctrl+F | Open Find & Replace modal |
| Ctrl+Enter | Generate / execute (in modals with a textarea, e.g. QR code) |
| Esc | Cancel: gradient drag ยท polygon in progress ยท floating paste ยท font mode ยท clear selection ยท close open modal |
Char palette (when palette has focus)
| Key / Action | Effect |
|---|---|
| Arrow keys | Navigate to adjacent char |
| Click | Select char for editing and painting |
| Double-click | Stamp char onto cursor tile (or fill selection) |
Screen Toolbar โ Row 1 (editing)
| Icon | Action |
|---|---|
| Undo / Redo | Step through 50-level undo history |
| Square / Circle / Lasso | Set selection shape to rectangle / oval / polygon |
| Arrow Left/Up/Down/Right | Shift screen content (or selection) one tile in that direction |
| Flip Horizontal / Vertical (Alt+H / Alt+V) | Mirror screen or selection |
| Paint Bucket | Flood fill char + color |
| Brush | Flood fill char only |
| Droplet | Flood fill color only |
| Trash | Clear screen (or selection) |
Screen Toolbar โ Row 2 (display & tools)
| Icon | Action |
|---|---|
| Palette dropdown | Switch between 17 named C64 color palette variants |
| BG / Border pickers | Set screen background and border colors |
| Blend (two circles) | Open Gradient Tool modal |
| Type (Aa) | Open Font modal |
| QR code | Open QR Code Generator modal |
| Play / Stop square | Start / stop character animation playback |
Screen Toolbar โ Row 3 (file operations)
| Icon | Action |
|---|---|
| Save (floppy disk) | Download screen as a .mmm file |
| Load (folder) | Load a .mmm file into the current screen |
| Upload arrow | Open Import modal (ASM/BAS/PRG/C/JSON/SEQ/PET) |
| Download arrow | Open Export modal (PNG/ASM/BAS/PRG/C/JSON/SEQ/PET) |