{"id":23803362,"url":"https://github.com/langurmonkey/playkid","last_synced_at":"2026-01-27T13:03:56.208Z","repository":{"id":261796466,"uuid":"885231698","full_name":"langurmonkey/playkid","owner":"langurmonkey","description":"My GameBoy emulator (WIP).","archived":false,"fork":false,"pushed_at":"2026-01-20T14:27:05.000Z","size":892,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-20T22:06:58.451Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/langurmonkey.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-11-08T07:56:23.000Z","updated_at":"2026-01-20T14:30:24.000Z","dependencies_parsed_at":"2024-11-08T14:20:44.287Z","dependency_job_id":"e0e19b69-d7b2-42e2-98b2-b5db3a4487a0","html_url":"https://github.com/langurmonkey/playkid","commit_stats":null,"previous_names":["langurmonkey/playkid"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/langurmonkey/playkid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/langurmonkey%2Fplaykid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/langurmonkey%2Fplaykid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/langurmonkey%2Fplaykid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/langurmonkey%2Fplaykid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/langurmonkey","download_url":"https://codeload.github.com/langurmonkey/playkid/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/langurmonkey%2Fplaykid/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28813230,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T12:25:15.069Z","status":"ssl_error","status_checked_at":"2026-01-27T12:25:05.297Z","response_time":168,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-01T22:30:46.601Z","updated_at":"2026-01-27T13:03:56.195Z","avatar_url":"https://github.com/langurmonkey.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"img/logo-3x.avif\" /\u003e\n\u003c/p\u003e\n\n**Play Kid** is yet another Game Boy emulator, written in Rust. But hey, it is MY Game Boy emulator, and I'm proud of it.\n\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"img/grid.avif\" /\u003e\n\u003c/p\u003e\n\nHere are the main features of Play Kid:\n\n- All CPU instructions implemented.\n- Full memory map implemented.\n- Modes: ROM, MBC1, MBC2, MBC3.\n- Audio is implemented, with 4 channels, envelopes, sweep, and stereo.\n- Supports game controllers.\n- Multiple color palettes.\n- Save screenshot of current frame buffer.\n- FPS counter.\n- Respects 160:144 aspect ratio by letter-boxing.\n- Debug panel:\n  - Step instruction.\n  - Step scanline.\n  - Pause/continue current execution.\n  - Displays internal state of CPU, PPU, and Joypad.\n  - Full program disassembly, with breakpoints.\n- Save RAM to `.sav` files to emulate the battery-backed SRAM. Those are saved every minute.\n- Automatically adapts to multi-DPI setups by scaling the UI.\n- Working games/roms:\n  - Passes `dmg-acid2`\n  - Tetris\n  - Pokémon\n  - Super Mario Land\n  - Super Mario Land 2: 6 Golden Coins\n  - Wario Land (Super Mario Land 3)\n  - Wario Land II\n  - Bugs Bunny Crazy Castle\n  - The Amazing Spider-Man\n  - Dr. Mario\n  - Probably many, many more\n- Works on Linux, macOS, and Windows.\n\n# Download\n\nThe easiest way to run Play Kid is getting the package for your operating system:\n\n- [Codeberg releases](https://codeberg.org/langurmonkey/playkid/releases)\n- [GitHub releases](https://github.com/langurmonkey/playkid/releases)\n\n# Build\n\nBuild the project with `cargo build`.\n\n# Run\n\nThe usual Rust stuff.\n\n```bash\n  cargo run -- [ROM_FILE]\n```\n\nMake the binary with:\n\n```bash\n  cargo build --release\n```\n\n# Operation\n\nHere are the Joypad keyboard mappings:\n\n- \u003ckbd\u003eenter\u003c/kbd\u003e - Start button\n- \u003ckbd\u003espace\u003c/kbd\u003e - Select button\n- \u003ckbd\u003ea\u003c/kbd\u003e - A button\n- \u003ckbd\u003eb\u003c/kbd\u003e - B button\n\nThe keyboard is clumsy for playing Game Boy games, so you can use any game controller. Controllers are detected when hot-plugged. Use \u003ckbd\u003eLB\u003c/kbd\u003e and \u003ckbd\u003eRB\u003c/kbd\u003e to cycle through different palettes.\n\nAdditionally, there are some more actions available:\n\n- \u003ckbd\u003ep\u003c/kbd\u003e - cycle the palette colors\n- \u003ckbd\u003ew\u003c/kbd\u003e - trigger the SRAM save operation to `.sav` file.\n- \u003ckbd\u003es\u003c/kbd\u003e - save a screenshot, with name `screenshot_[time].jpg`\n- \u003ckbd\u003ed\u003c/kbd\u003e - toggle debug panel\n- \u003ckbd\u003ef\u003c/kbd\u003e - toggle FPS monitor\n- \u003ckbd\u003er\u003c/kbd\u003e - reset the CPU\n- \u003ckbd\u003eEsc\u003c/kbd\u003e - exit the emulator\n\nYou can also use the provided UI.\n\n# Debug panel\n\nYou can open the debug panel any time by pressing \u003ckbd\u003ed\u003c/kbd\u003e, by clikcing on `Machine` \u003e `Debug panel...`, or activate it at launch with the `-d`/`--debug` flag. The debug panel shows up to the right. It provides a view of the internal state of the emulator, with:\n\n- Current address, instruction, operands, and opcode, to the top.\n- Internal state of CPU, PPU, and JOYP, to the left.\n- Disassembly of the program, to the right.\n- Breakpoints.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"img/debug-mode-3.avif\" /\u003e\n\u003c/p\u003e\n\nYou can use the provided UI controls to work with debug mode. You can also use the keyboard. These are the key bindings:\n\n- \u003ckbd\u003eF6\u003c/kbd\u003e - step a single instruction\n- \u003ckbd\u003eF7\u003c/kbd\u003e - step a scanline\n- \u003ckbd\u003eF9\u003c/kbd\u003e - continue execution until breakpoint (if paused), or pause execution (if running)\n- \u003ckbd\u003ed\u003c/kbd\u003e - exit debug mode and go back to normal full-speed emulation\n\nYou can also use breakpoints. A list with the current breakpoint addresses is provided at the bottom. To create a breakpoint, either **click on the address** in the disassembly panel, or enter it (in `$abcd` format) into the text field and click \u003ckbd\u003e+\u003c/kbd\u003e. Remove a breakpoint by clicking the \u003ckbd\u003e×\u003c/kbd\u003e in the breakpoints list. Clear all current breakpoints with \u003ckbd\u003eClear all\u003c/kbd\u003e.\n\n# CLI args\n\nThere are some CLI arguments that you can use:\n\n```\nPlay Kid 0.1.0\n\nMinimalist Game Boy emulator for the cool kids.\n\nUsage: playkid [OPTIONS] \u003cINPUT\u003e\n\nArguments:\n  \u003cINPUT\u003e  Path to the input ROM file to load\n\nOptions:\n  -s, --scale \u003cSCALE\u003e  Initial window scale. It can also be resized manually [default: 4]\n  -d, --debug          Activate debug mode. Use `d` to stop program at any point\n  -f, --fps            Show FPS counter. Use `f` to toggle on and off\n      --skipcheck      Skip global checksum, header checksum, and logo sequence check\n  -h, --help           Print help\n  -V, --version        Print version\n```\n\n# SDL2 version\n\nPlay Kid started as an SDL2 application, but it was moved to a pure Rust tech stack using `winit`, `egui`, `rodio`, and `gilrs`. This makes it much easier to build for different targets (including WASM!). Additionally, the SDL2 version contains a minimalist homegrown UI library that I'm particularly proud about, but it can't hold a candle to `egui` in terms of functionality. It looks like this:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"img/debug-mode-sdl2.avif\" /\u003e\n\u003c/p\u003e\n\nThe SDL2 version is tagged `playkid-sdl2` ([playkid-sdl2@codeberg](https://codeberg.org/langurmonkey/playkid/src/tag/playkid-sdl2), [playkid-sdl2@github](https://github.com/langurmonkey/playkid/tree/playkid-sdl2)).\n\n# Useful links\n\n- Pandocs: https://gbdev.io/pandocs/\n- Complete tech reference: https://gekkio.fi/files/gb-docs/gbctr.pdf\n- Game Boy CPU manual: http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf\n- Game Boy CPU instructions: https://meganesu.github.io/generate-gb-opcodes/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flangurmonkey%2Fplaykid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flangurmonkey%2Fplaykid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flangurmonkey%2Fplaykid/lists"}