drhelius/gearlynx/gearlynx-debugging
- community
Checking that the SKILL.md file is still in the repository.
Debug and trace Atari Lynx games using the Gearlynx emulator MCP server. Provides workflows for 6502 CPU debugging, breakpoint management, hardware inspection, disassembly analysis, and execution tracing. Use when the user wants to debug a Lynx game, trace code execution, inspect CPU registers or hardware state, set breakpoints, analyze interrupts, step through 6502 instructions, reverse engineer game code, examine Mikey/Suzy registers, view the call stack, or diagnose rendering, audio, or timing issues. Also use when the user mentions Atari Lynx development, Lynx homebrew testing, or 6502 debugging with Gearlynx.
Install
npx vskill@latest install drhelius/gearlynx/gearlynx-debuggingSKILL.md
Atari Lynx Game Debugging with Gearlynx
Overview
Debug Atari Lynx games using the Gearlynx emulator as an MCP server. Control execution (pause, step, breakpoints), inspect the 6502 CPU and hardware (Mikey, Suzy), read/write memory, disassemble code, trace instructions, and capture screenshots — all through MCP tool calls. Hardware documentation is available in the references/ directory.
MCP Server Prerequisite
IMPORTANT — Check before installing: Before attempting any installation or configuration, you MUST first verify if the Gearlynx MCP server is already connected in your current session. In the default mode, call debug_get_status directly. If Gearlynx was intentionally started with --mcp-router, call get_tool_info with {"name":"debug_get_status"}, then call execute_tool with {"name":"debug_get_status","arguments":{}}. A valid response from either workflow means the server is active and ready.
Only if neither workflow is available or the call fails, you need to help install and configure the Gearlynx MCP server:
Installing Gearlynx
Run the bundled install script (macOS/Linux):
This installs Gearlynx via Homebrew on macOS or downloads the latest release on Linux. It prints the binary path on completion. You can also set INSTALL_DIR to control where the binary goes (default: ~/.local/bin).
Alternatively, download from GitHub Releases or install with brew install --cask drhelius/geardome/gearlynx on macOS.
Connecting as MCP Server
Configure your AI client to run Gearlynx as an MCP server via STDIO transport. For Claude Code:
For Codex:
Replace /path/to/gearlynx with the actual binary path from the install script. Add --headless before --mcp-stdio on headless machines.
Hardware Documentation (References)
Atari Lynx hardware documentation is available in the references/ directory. Load them into your context when investigating specific hardware.
| Reference | File | Load when... | |
|---|---|---|---|
| General Overview | references/lynx1_general_overview.md | System specs, feature set, overall architecture | |
| Hardware Overview | references/lynx2_hardware_overview.md | System block diagram: CPU, Mikey, Suzy, RAM, cart | |
| Hardware Quirks | references/lynx3_software_hardware_perniciousness.md | Unsafe register operations, hardware gotchas | |
| CPU/ROM | references/lynx4_cpu_rom.md | 65C02 cycle timing, CPU sleep, ROM mapping | |
| Display | references/lynx5_display.md | Frame rate, pen/palette colors, display buffer addresses | |
| Sprite/Collision | references/lynx6_sprite_collision.md | SCB format, sprite types, collision depository | |
| Audio/ROM Cart | references/lynx7_audio_tape_romcart.md | 4 audio channels, feedback taps, stereo, ROM cart banking | |
| Timers/Interrupts | references/lynx8_timers_interrupts.md | 8 timer channels, linking, reload, IRQ sources | |
| UART | references/lynx8a_uart.md | ComLynx serial port, UART registers, baud rate, flow control | |
| Other Hardware | references/lynx9_other_hardware.md | Hardware multiply/divide, parallel port, upward compatibility | |
| System Reset | references/lynx10_system_reset.md | Reset/power-up sequence, Suzy/Mikey init, boot ROM | |
| System Bus Interplay | references/lynx11_system_bus_interplay.md | Bus masters, page mode, DMA timing, bus contention | |
| Hardware Addresses | references/hardware_addresses.md | 64K memory map, Mikey/Suzy register addresses ($FC00-$FCFF, $FD00-$FDFF) | |
| Interrupts & CPU Sleep | references/irq_interrupts_cpu_sleep.md | IRQ vector, interrupt enable/status bits, CPU sleep (JAM) | |
| Sprite Engine | references/sprite_engine.md | Display init, double-buffering, VIDBAS/COLLBAS macros |
Debugging Workflow
1. Load and Orient
Start every session by loading the ROM, confirming it loaded correctly, then checking CPU state and taking a screenshot to understand the current game state. If a .sym, .elf, .lbl, or .noi file exists alongside the ROM, symbols are loaded automatically.
Load additional symbols with load_symbols or add individual labels with add_symbol.
2. Pause and Inspect
Always call debug_pause before inspecting state. While paused:
- CPU state:
get_6502_status— registers A, X, Y, S, P (flags), PC, interrupt status, MAPCTL visibility - Disassembly:
get_disassemblywith a start/end address range — only shows executed code paths - Call stack:
get_call_stack— current subroutine hierarchy - Memory:
read_memorywith area name (RAM, Zero Page, Stack, Bank 0, Bank 0A, Bank 1, Bank 1A, BIOS, EEPROM) and address/length
3. Set Breakpoints
Use breakpoints to stop execution at points of interest:
| Breakpoint Type | Tool | Use Case | |
|---|---|---|---|
| Execution | set_breakpoint (type: exec) | Stop when PC reaches address | |
| Read | set_breakpoint (type: read) | Stop when memory address is read | |
| Write | set_breakpoint (type: write) | Stop when memory address is written | |
| Range | set_breakpoint_range | Cover an address range (exec/read/write) | |
| IRQ | set_breakpoint_on_irq | Stop on specific timer IRQ (Timer0-7: HBLANK, VBLANK, UART, etc.) |
Important: Read/write breakpoints stop with PC at the instruction after the memory access.
Manage breakpoints with list_breakpoints, remove_breakpoint, list_breakpoints_on_irq, clear_breakpoint_on_irq.
4. Step Through Code
After hitting a breakpoint or pausing:
| Action | Tool | Behavior | |
|---|---|---|---|
| Step Into | debug_step_into | Execute one instruction, enter subroutines | |
| Step Over | debug_step_over | Execute one instruction, skip JSR calls | |
| Step Out | debug_step_out | Run until RTS/RTI returns from current subroutine | |
| Step Frame | debug_step_frame | Execute until next VBLANK; use mode: "sync" before dependent calls | |
| Run To | debug_run_to_cursor | Continue until PC reaches target address | |
| Continue | debug_continue | Resume normal execution |
After each step, call get_6502_status and get_disassembly to see where you are.
5. Trace Execution
The trace logger records CPU instructions interleaved with hardware events (Suzy math/sprites, Mikey timers/audio/UART, cartridge access).
set_trace_logwithenabled: trueto start recording (optionally filter event types)- Let the game run or step through code
set_trace_logwithenabled: falseto stop (entries are preserved)get_trace_logto read recorded entries
Tracing is essential for understanding timing-sensitive code, interrupt handlers, and hardware interaction sequences.
Hardware Inspection
Mikey (Display, Timers, Audio)
get_mikey_registers— all registers at $FD00-$FDFF, or filter by addressget_mikey_timers— Timer 0-7 status (HBLANK, VBLANK, UART, sample rate, etc.)get_mikey_audio— audio channel 0-3 status (volume, feedback, output, etc.)get_lcd_status— LCD pixel/DMA info (only on visible lines)write_mikey_register— modify a Mikey register live
Suzy (Sprites, Math)
get_suzy_registers— all registers at $FC00-$FCFF, or filter by addresswrite_suzy_register— modify a Suzy register live
Other Hardware
get_uart_status— ComLynx serial port stateget_cart_status— cartridge address generation, bank info, AUDINget_eeprom_status— EEPROM type, size, mode, state, IO pins
Frame Buffers and Screenshots
get_screenshot— current rendered frame as PNGget_frame_buffer— raw debug frame buffer (VIDBAS from Suzy or DISPADR from Mikey)
Use screenshots after stepping or continuing to see the visual impact of changes.
Common Debugging Scenarios
Finding an Interrupt Handler
set_breakpoint_on_irqfor the target IRQ (e.g., Timer0 for HBLANK, Timer2 for VBLANK)debug_continueto run until the IRQ firesget_6502_status+get_disassemblyto see the handler codeget_call_stackto see how deep you areadd_symbolto label the handler address and any subroutines it calls
Diagnosing Graphics Corruption
debug_pause→get_suzy_registers— check VIDBAS, COLLBAS, sprite controlget_frame_buffer— capture both Suzy and Mikey buffersget_mikey_registers— check DISPADR, display DMA settingsget_lcd_status— verify line-by-line rendering state- Set read/write breakpoints on display buffer addresses to catch corruption source
Analyzing a Subroutine
set_breakpointat the subroutine entry pointdebug_continue→ when hit,get_6502_status- Step through with
debug_step_into/debug_step_over - After each step: check registers, read relevant memory
add_symbolfor the routine and any called subroutinesadd_disassembler_bookmarkto mark interesting locations
Tracking a Variable
add_memory_watchon the variable's address — watches are visible in the emulator GUI- Set a write breakpoint with
set_breakpoint(type: write) on that address - When hit,
get_disassemblyreveals what code is modifying it get_call_stackshows the call chain leading to the write
Timing Analysis
set_breakpoint_on_irqfor Timer interruptsset_trace_logwithenabled: trueto start recordingget_trace_logto see the interleaved CPU + hardware events- Analyze timer reload values via
get_mikey_timers - Correlate timer fires with code execution in the trace
Debug Output for Homebrew Development
Homebrew games can send debug text to the Trace Logger via unused Mikey registers $FDC0–$FDC4 — a printf-style mechanism without breakpoints.
set_trace_logwithenabled: trueanddebug_output: true- Run your game — text written through the registers appears in
get_trace_log
| Register | Write | |
|---|---|---|
$FDC0 | Flush buffer to Trace Logger (any non-zero value) | |
$FDC1 | Append byte as ASCII character | |
$FDC2 | Append byte as two hex digits | |
$FDC3 | Set string pointer low byte | |
$FDC4 | Set string pointer high byte (triggers copy) |
ca65 example:
When disabled (the default), these registers are no-ops — safe to leave in shipping code.
Organizing Your Debug Session
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 85 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/gearlynx-debugging/SKILL.md
Popularity
- Repository stars
- 70
- Repository forks
- 8
- 7-day trend score
- 21
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/drhelius/gearlynx/gearlynx-debugging)