{"id":17012166,"url":"https://github.com/tobiasvl/termin-8","last_synced_at":"2026-02-12T14:06:14.921Z","repository":{"id":49616762,"uuid":"414697199","full_name":"tobiasvl/termin-8","owner":"tobiasvl","description":"Octo-compliant CHIP-8 emulator frontend that runs in your terminal","archived":false,"fork":false,"pushed_at":"2024-02-07T10:11:27.000Z","size":41,"stargazers_count":0,"open_issues_count":11,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-28T06:11:21.374Z","etag":null,"topics":["chip-8","chip-8-debugger","chip-8-emulator","chip-8-interpreter","chip8","chip8-emulator","chip8-interpreter"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/termin-8","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/tobiasvl.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}},"created_at":"2021-10-07T17:28:38.000Z","updated_at":"2021-11-09T12:26:20.000Z","dependencies_parsed_at":"2024-02-07T11:27:38.939Z","dependency_job_id":"9fb688c3-a069-4c90-a3cb-d84f8cb50b95","html_url":"https://github.com/tobiasvl/termin-8","commit_stats":{"total_commits":8,"total_committers":1,"mean_commits":8.0,"dds":0.0,"last_synced_commit":"3cc2bb527df44932022f995ad4424bb1464ff462"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tobiasvl/termin-8","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tobiasvl%2Ftermin-8","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tobiasvl%2Ftermin-8/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tobiasvl%2Ftermin-8/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tobiasvl%2Ftermin-8/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tobiasvl","download_url":"https://codeload.github.com/tobiasvl/termin-8/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tobiasvl%2Ftermin-8/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29367888,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T08:51:36.827Z","status":"ssl_error","status_checked_at":"2026-02-12T08:51:26.849Z","response_time":55,"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":["chip-8","chip-8-debugger","chip-8-emulator","chip-8-interpreter","chip8","chip8-emulator","chip8-interpreter"],"created_at":"2024-10-14T06:09:44.926Z","updated_at":"2026-02-12T14:06:14.868Z","avatar_url":"https://github.com/tobiasvl.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"Termin-8\n========\n[![crates.io](https://img.shields.io/crates/v/termin-8.svg)](https://crates.io/crates/termin-8)\n[![dependency status](https://deps.rs/repo/github/tobiasvl/termin-8/status.svg)](https://deps.rs/crate/termin-8)\n\nCHIP-8 emulator that runs in your terminal and is [Octo](https://github.com/JohnEarnest/Octo) compliant.\n\nPowered by [`deca`](https://crates.io/crates/deca), it supports CHIP-8, SUPER-CHIP (SCHIP) and XO-CHIP programs.\n\nIt will also auto-resize its display to fit your terminal (at the cost of widespread font support and XO-CHIP color in the smallest sizes).\n\n## Installation\n\nFirst, [install Rust](https://www.rust-lang.org/tools/install). Then, in your terminal:\n\n```sh\ncargo install termin-8\n```\n\n## Usage\n\nTermin-8 should work on Windows, Linux, and macOS. If it doesn't, please [file an issue](https://github.com/tobiasvl/termin-8/issues/new/choose).\n\nDownload CHIP-8 ROMs from the internet, like the [Chip8 Community Archive](https://github.com/JohnEarnest/chip8Archive/), or make your own in [Octo](https://github.com/JohnEarnest/Octo).\n\nThen run Termin-8 in your terminal:\n\n```sh\ntermin-8 ROM\n```\n\nThere are some command line options:\n\n```sh\ntermin-8 --help\n```\n\nThe hexadecimal CHIP-8 keypad is customarily mapped to the following keyboard keys:\n\n|   |   |   |   |\n|---|---|---|---|\n| 1 | 2 | 3 | 4 |\n| q | w | e | r |\n| a | s | d | f |\n| z | x | c | v |\n\nIn addition, the arrow keys are bound to WASD.\n\nYou can press \u003ckbd\u003eEsc\u003c/kbd\u003e to exit.\n\n## Debugging capabilities\n\nTermin-8 can be used for testing while developing CHIP-8 games, as an alternative to [Octo](https://JohnEarnest.github.io/Octo) (web) and [C-Octo](https://github.com/JohnEarnest/C-Octo) (SDL).\n\nHowever, Termin-8 can't yet compile Octo code on its own. In an all-terminal workflow, use C-Octo's [`octo-cli`](https://github.com/JohnEarnest/c-octo#octo-cli) tool to compile your code. `octo-cli` can output a symbol file alongside the CHIP-8 binary if you use the `-s` command line option, and `-s` is likewise supported by Termin-8 for reading such a symbol file.\n\nIf a symbol file containing breakpoints is loaded, hitting those breakpoints will interrupt execution and display the contents of all registers.\n\nPress the following keys while Termin-8 is running for further debugging:\n\n* \u003ckbd\u003ei\u003c/kbd\u003e: interrupt execution and display contents of registers (or continue execution after interrupt)\n* \u003ckbd\u003eo\u003c/kbd\u003e: single-step (while interrupted)\n* \u003ckbd\u003eu\u003c/kbd\u003e: step out (execute until the current subroutine returns) \n* \u003ckbd\u003el\u003c/kbd\u003e: step over (execute the contents of any subroutines until they return to the current level)\n* \u003ckbd\u003em\u003c/kbd\u003e: toggle monitors (if a symbol file containing monitors has been loaded)\n\n## Terminal requirements\n\nNote that the terminal requirements vary depending on what kind of program you attempt to run.\n\nHere's a table with the required terminal size and Unicode support needed to get features such as XO-CHIP color support, depending on the resolution of the CHIP-8 program you're running and the [Unicode Block Elements](https://en.wikipedia.org/wiki/Block_Elements) support of your font:\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth\u003eCHIP-8 resolution\u003c/td\u003e\n\u003cth\u003eUnicode version\u003c/td\u003e\n\u003cth\u003eMinimum terminal size\u003c/td\u003e\n\u003cth\u003ePixel size\u003c/td\u003e\n\u003cth\u003eXO-CHIP colors\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd rowspan=\"4\"\u003e64x32 (lores)\u003cbr\u003eCHIP-8, SCHIP, XO-CHIP\u003c/td\u003e\n\u003ctd rowspan=\"3\"\u003e1.0.0\u003c/td\u003e\n\u003ctd\u003e128x32\u003c/td\u003e\n\u003ctd\u003e██\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e64x32\u003c/td\u003e\n\u003ctd\u003e█\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e64x16\u003c/td\u003e\n\u003ctd\u003e▀\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e3.2\u003c/td\u003e\n\u003ctd\u003e32x16\u003c/td\u003e\n\u003ctd\u003e▘\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd rowspan=\"4\"\u003e128x64 (hires)\u003cbr\u003eSCHIP, XO-CHIP\u003c/td\u003e\n\u003ctd rowspan=\"3\"\u003e1.0.0\u003c/td\u003e\n\u003ctd\u003e256x64\u003c/td\u003e\n\u003ctd\u003e██\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e128x64\u003c/td\u003e\n\u003ctd\u003e█\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e128x32\u003c/td\u003e\n\u003ctd\u003e▀\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e3.2\u003c/td\u003e\n\u003ctd\u003e64x32\u003c/td\u003e\n\u003ctd\u003e▘\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\u003ctable\u003e\n\u003ctr\u003e\n\u003cth\u003eCHIP-8 resolution\u003c/td\u003e\n\u003cth\u003eUnicode version\u003c/td\u003e\n\u003cth\u003eMinimum terminal size\u003c/td\u003e\n\u003cth\u003ePixel size\u003c/td\u003e\n\u003cth\u003eXO-CHIP colors\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd rowspan=\"5\"\u003e64x32 (lores)\u003cbr\u003eCHIP-8, SCHIP, XO-CHIP\u003c/td\u003e\n\u003ctd rowspan=\"3\"\u003e1.0.0\u003c/td\u003e\n\u003ctd\u003e128x32\u003c/td\u003e\n\u003ctd\u003e██\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e64x32\u003c/td\u003e\n\u003ctd\u003e█\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e64x16\u003c/td\u003e\n\u003ctd\u003e▀\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e3.2\u003c/td\u003e\n\u003ctd\u003e32x16\u003c/td\u003e\n\u003ctd\u003e▘\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e3.0\u003c/td\u003e\n\u003ctd\u003e32x8\u003c/td\u003e\n\u003ctd\u003e⠁\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd rowspan=\"5\"\u003e128x64 (hires)\u003cbr\u003eSCHIP, XO-CHIP\u003c/td\u003e\n\u003ctd rowspan=\"3\"\u003e1.0.0\u003c/td\u003e\n\u003ctd\u003e256x64\u003c/td\u003e\n\u003ctd\u003e██\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e128x64\u003c/td\u003e\n\u003ctd\u003e█\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e128x32\u003c/td\u003e\n\u003ctd\u003e▀\u003c/td\u003e\n\u003ctd\u003e✔\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e3.2\u003c/td\u003e\n\u003ctd\u003e64x32\u003c/td\u003e\n\u003ctd\u003e▘\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e3.0\u003c/td\u003e\n\u003ctd\u003e64x16\u003c/td\u003e\n\u003ctd\u003e⠁\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\nNotes:\n* In your browser, the smallest pixel block (▘) probably looks square, but this might not be the case with your monospace terminal font.\n* Pretty much all fonts support the basic [Unicode Block Elements](https://en.wikipedia.org/wiki/Block_Elements) in Unicode 1.0.0 which are used for the larger pixel blocks (█, ▀ and ▄), but support for the smallest blocks (like ▘) from Unicode 3.0 and 3.2 is much less common. Font families like _DejaVu_ and _Fira Code_ support them.\n* The smallest pixel blocks (like ⠁) are Unicode Braille symbols, which aren't as common. Patched [Nerd Fonts](https://www.nerdfonts.com/) support them.\n\n## Limitations\n\n* Some games might not detect keypresses correctly. This is because [detecting when a key is released is very hard in a terminal](https://blog.robertelder.org/detect-keyup-event-linux-terminal/). Termin-8 does an approximation of keypress duration, but your OS's \"key repeat\" settings will influence how often it can poll for key presses.\n* Your terminal's bell will sound when there's sound, but XO-CHIP music is not supported (as a terminal can't play sound on its own).\n\n## Configuration file\n\nTermin-8 will look for a file named `.octo.rc` in the user's home directory, which can be used to configure some useful settings. This file is also used by [C-Octo](https://github.com/JohnEarnest/c-octo#configuration-file).\n\nYou can also supply a configuration file with the `-c` command line option. This can be useful for setting some options for specific games – colors, to match the author's artistic vision, or \"quirky\" behavior, to make the game run correctly.\n\nThe file has a traditional `.INI` structure – empty lines or lines beginning with `#` are ignored, and anything else consists of a key and value separated by `=`. Meaningful keys are as follows:\n\n- `core.tickrate`: number of CHIP-8 instructions to execute per 60hz frame.\n- `core.max_rom`: the maximum number of bytes the compiler will permit when assembling a ROM.\n- `core.font`: one of {`octo`, `vip`, `dream_6800`, `eti_660`, `schip`, `fish`} to select the built-in CHIP-8 font.\n\n- `color.plane0`, `color.plane1`, `color.plane2`, `color.plane3`: colors for the 4 XO-CHIP \"plane\" colors.\n- `color.background`: the border drawn behind the CHIP-8 display when no sound is being played.\n- `color.sound`: the alternate border color when sound is being played.\n\n- `quirks.shift`: if `1`, `vx \u003c\u003c= vy` and `vx \u003e\u003e= vy` modify `vx` in place and ignore `vy`, like SCHIP.\n- `quirks.loadstore`: if `1`, `load` and `store` do not post-increment `i`, like SCHIP.\n- `quirks.jump0`: if `1`, emulate a buggy behavior of SCHIP on the HP-48: the 4 high bits of the target address of `jump0` determines the offset register used (instead of always `v0`).\n- `quirks.logic`: if `1`, clear `vf` after `\u0026=`,`|=` and `^=`. On the VIP, these instructions leave `vf` in an unknown state.\n- `quirks.clip`: if `1`, do not \"wrap\" sprite drawing around the edges of the display.\n- `quirks.vblank`: if `1`, drawing a sprite will block until the end of the 60hz frame, like the VIP.\n\nAll colors are specified as 6-digit RGB in hexadecimal, like `996600`. The default quirks settings, palette, and other options correspond to those of web-octo.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftobiasvl%2Ftermin-8","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftobiasvl%2Ftermin-8","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftobiasvl%2Ftermin-8/lists"}