{"id":13703,"date":"2026-02-10T15:44:19","date_gmt":"2026-02-10T20:44:19","guid":{"rendered":"https:\/\/www.zdziarski.com\/blog\/?p=13703"},"modified":"2026-02-16T18:59:16","modified_gmt":"2026-02-16T23:59:16","slug":"pixel-perfect-retro-gaming-with-tinynes-and-c0pperdragon","status":"publish","type":"post","link":"https:\/\/www.zdziarski.com\/blog\/?p=13703","title":{"rendered":"Pixel-Perfect Retro Gaming with TinyNES and c0pperdragon"},"content":{"rendered":"<p><a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-13736\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda-1024x768.jpg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda-1024x768.jpg 1024w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda-300x225.jpg 300w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda-768x576.jpg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda.jpg 1169w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>The photo above isn&#8217;t an emulator screenshot, it&#8217;s a photo of the actual Zelda game played through my system on an HDMI monitor (any moire effect is a result of taking a picture of the monitor screen itself). For several months, I&#8217;ve been playing with the <a href=\"https:\/\/www.c0pperdragon.com\">c0pperdrag0n PPU Digitizer<\/a>; I&#8217;ve had a lot of success soldering it into a lot of devices it was never originally targeting: an early Famicom, a NES Test Market console and as of this writing, a TinyNES. The c0pperdragon PPU digitizer easily solders onto the back of a Ricoh 2C02 PPU and converts the picture into a signal its creator has dubbed <em>Lumacode<\/em>. The signal contains all of the RGB information necessary to render individual pixels for the game in high definition. This signal can then be rendered by a few different upscalers (I use OSSC Pro) to display on an HDMI monitor with absolute perfection.<\/p>\n<p>If you&#8217;re not familiar with the TinyNES, it&#8217;s fully open source hardware to create a modern, but authentic, NES clone. It comes with DIP slots for the PPU and the CPU from an original NES, and all modern SMT circuitry for the discreet logic, RAM, and other components that aren&#8217;t crucial to accuracy. You can purchase TinyNES with clone chips (which do <em>not\u00a0<\/em>provide authentic sound or picture), or you can de-solder the original PPU\/CPU chips from an old NES and use it in the TinyNES, giving you an identical experience to the original console. If you don&#8217;t have any desoldering equipment, you can usually find these chips on eBay as well. Not only is the TinyNES small and modern, but it&#8217;s also more power efficient and even supports Famicom expansion audio (great if you like to play old FDS games like me).<\/p>\n<p>The TinyNES has often been overlooked for its much pricier competitor, the Analogue NT Noir, which is an FPGA console capable of providing HDMI output. With the PPU Digitizer, however, the TinyNES can be made to output pixel-perfect video at a fraction of the price &#8211; and running original chips, rather than an FPGA reconstruction.<\/p>\n<p><!--more--><\/p>\n<p>When I ordered the TinyNES, it wasn&#8217;t clear whether or not there would be room for the digitizer board, or whether it would work with clone chips, or at all. Here is the back of the TinyNES board, once removed from its case:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3725.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13705\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3725-225x300.jpeg\" alt=\"\" width=\"225\" height=\"300\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3725-225x300.jpeg 225w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3725-768x1024.jpeg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3725.jpeg 900w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/a> <a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3726.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13706\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3726-225x300.jpeg\" alt=\"\" width=\"225\" height=\"300\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3726-225x300.jpeg 225w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3726-768x1024.jpeg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3726.jpeg 900w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/a><\/p>\n<p>The PPU digitizer solders over the back of the pins, as shown. There are two pads for signal output and ground. I didn&#8217;t want to physically modify the TinyNES&#8217; video port, as I wanted the ability to plug it into a PVM whenever I felt like it. Instead, I cut up a well-shielded RCA cable, ran it through one of the screw holes on the bottom, and soldered it to the digitizer, adding an extra video port out the back.<\/p>\n<p>The per-pixel detail is far superior to the basic AV out that the TinyNES comes with. I was surprised to find that the clone chips it ships with are compatible with the digizier. I ended up also desoldering the NES CPU and PPU from an old console for the final version, as the sound from the clone CPU is quite inauthentic. So authentic that it even crashes in the same places that the original Test Market CPU crashed.<\/p>\n<p>A lot of people may not like this hard-raw-pixel look, but once you get a clean signal like this you can layer special effects on top of it.\u00a0The photo above adds scanlines and an overlay using the OSSC Pro&#8217;s built-in functions. It&#8217;s easier on the eyes than a blurry picture, and doesn&#8217;t look nearly as blocky as the original RGB signal.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3757.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13726 size-large\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3757-1024x768.jpeg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3757-1024x768.jpeg 1024w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3757-300x225.jpeg 300w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3757-768x576.jpeg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3757.jpeg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p><em>Legend of Zelda, with scanlines and post-processing added<\/em><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3751.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13728\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3751-225x300.jpeg\" alt=\"\" width=\"225\" height=\"300\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3751-225x300.jpeg 225w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3751-767x1024.jpeg 767w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3751-768x1025.jpeg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3751.jpeg 899w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/a> <a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3753.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13729\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3753-225x300.jpeg\" alt=\"\" width=\"225\" height=\"300\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3753-225x300.jpeg 225w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3753-768x1024.jpeg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3753.jpeg 900w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/a><\/p>\n<p><em>A close-up of Mario (Super Mario Bros. 2), with scanlines and post-processing<\/em><\/p>\n<p>&nbsp;<\/p>\n<p>My understanding is you can also desolder the PPU chip from an arcade Vs. System to generate the RGB signals, however you&#8217;ll also need an RGB kit that doesn&#8217;t seem to be stocked right now. This seems like a much less expensive solution, unless you count the cost of a good desoldering gun (I use the Hakko FR-301) for all of my arcade PCB repairs and other electronics work.<\/p>\n<p>For a clean look, I used a 5\/16&#8243; bit to drill a small hole in the back of the TinyNES body. This allowed me to screw in a second AV jack and run the Lumacode signal straight to it. This way, no wires hanging out of the unit and I can also use a PVM with it whenever I want.<\/p>\n<p><a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3739-scaled.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13715\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3739-225x300.jpeg\" alt=\"\" width=\"225\" height=\"300\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3739-225x300.jpeg 225w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3739-768x1024.jpeg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3739-1152x1536.jpeg 1152w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3739-1536x2048.jpeg 1536w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3739-scaled.jpeg 1920w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/a> \u00a0<a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3740-scaled.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13716\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3740-225x300.jpeg\" alt=\"\" width=\"225\" height=\"300\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3740-225x300.jpeg 225w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3740-768x1024.jpeg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3740-1152x1536.jpeg 1152w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3740-1536x2048.jpeg 1536w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3740-scaled.jpeg 1920w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/>\u00a0<\/a><a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3741-scaled.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13717\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3741-225x300.jpeg\" alt=\"\" width=\"225\" height=\"300\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3741-225x300.jpeg 225w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3741-768x1024.jpeg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3741-1152x1536.jpeg 1152w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3741-1536x2048.jpeg 1536w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/IMG_3741-scaled.jpeg 1920w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><a href=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-13736\" src=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda-1024x768.jpg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda-1024x768.jpg 1024w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda-300x225.jpg 300w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda-768x576.jpg 768w, https:\/\/www.zdziarski.com\/blog\/wp-content\/uploads\/2026\/02\/zelda.jpg 1169w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>The photo above isn&#8217;t an emulator screenshot, it&#8217;s a photo of the actual Zelda game played through my system on an HDMI monitor (any moire effect is a result of taking a picture of the monitor screen itself). For several months, I&#8217;ve been playing with the <a href=\"https:\/\/www.c0pperdragon.com\">c0pperdrag0n PPU Digitizer<\/a>; I&#8217;ve had a lot of success soldering it into a lot of devices it was never originally targeting: an early Famicom, a NES Test Market console and as of this writing, a TinyNES. The c0pperdragon PPU digitizer easily solders onto the back of a Ricoh 2C02 PPU and converts the picture into a signal its creator has dubbed <em>Lumacode<\/em>. The signal contains all of the RGB information necessary to render individual pixels for the game in high definition. This signal can then be rendered by a few different upscalers (I use OSSC Pro) to display on an HDMI monitor with absolute perfection.<\/p>\n<p>If you&#8217;re not familiar with the TinyNES, it&#8217;s fully open source hardware to create a modern, but authentic, NES clone. It comes with DIP slots for the PPU and the CPU from an original NES, and all modern SMT circuitry for the discreet logic, RAM, and other components that aren&#8217;t crucial to accuracy. You can purchase TinyNES with clone chips (which do <em>not\u00a0<\/em>provide authentic sound or picture), or you can de-solder the original PPU\/CPU chips from an old NES and use it in the TinyNES, giving you an identical experience to the original console. If you don&#8217;t have any desoldering equipment, you can usually find these chips on eBay as well. Not only is the TinyNES small and modern, but it&#8217;s also more power efficient and even supports Famicom expansion audio (great if you like to play old FDS games like me).<\/p>\n<p>The TinyNES has often been overlooked for its much pricier competitor, the Analogue NT Noir, which is an FPGA console capable of providing HDMI output. With the PPU Digitizer, however, the TinyNES can be made to output pixel-perfect video at a fraction of the price &#8211; and running original chips, rather than an FPGA reconstruction.<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/www.zdziarski.com\/blog\/?p=13703\" title=\"Read More\"> <span class=\"button \">Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32],"tags":[],"class_list":["post-13703","post","type-post","status-publish","format-standard","hentry","category-gaming"],"_links":{"self":[{"href":"https:\/\/www.zdziarski.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/13703","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zdziarski.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.zdziarski.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.zdziarski.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.zdziarski.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=13703"}],"version-history":[{"count":0,"href":"https:\/\/www.zdziarski.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/13703\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.zdziarski.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13703"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.zdziarski.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13703"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zdziarski.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}