<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Get Info: #famicom</title>
    <description>Posts tagged “famicom” — Blog of independent game and app developer Matt Sephton. Featuring vintage Macintosh, game development, digital artwork, Japanese esoterica, video game reviews, hacks and tips, and much more.</description>
    <link>https://blog.gingerbeardman.com/tag/famicom/</link>
    <atom:link href="https://blog.gingerbeardman.com/tag/famicom/index.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 03 Jul 2026 20:16:48 +0000</pubDate>
    <lastBuildDate>Fri, 03 Jul 2026 20:16:48 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>

    
      
        <item>
          <title>Famicom Mahjong/Hanafuda controller USB keyboard mod</title>
          <description>&lt;ul&gt;
  &lt;li&gt;Difficulty: 7/10&lt;/li&gt;
  &lt;li&gt;Cost: &amp;lt; £20&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I play a lot of Hanafuda games. In the arcade these games share a control panel with Mahjong. It’s basically a keyboard featuring the first half of the alphabet, presented as a long row of keys in alphabetical order. This makes playing Arcade Hanafuda games a bit of a chore without a bunch of keyboard remapping and emulator faff.&lt;/p&gt;

&lt;p&gt;Some people were using arcade control panels connected to their PC. In Japan you can buy a custom electronics kit to make a USB Mahjong/Hanafuda controller, but it’s expensive at about €85 plus shipping and import duty. There had to be a better way!&lt;/p&gt;

&lt;p&gt;I saw that a couple of old Famicom Mahjong games by Capcom were bundled with a custom controller. It was essentially two controllers in one, so won’t work with my controller adapter cables. So I wondered how easy it would be to convert one to USB? Posting on a NES developer forum helped me verify that it should be possible.&lt;/p&gt;

&lt;p&gt;Christmas 2019 I bought a bunch of games from Japan and added a Famicom Mahjong controller to my order. It arrived, I put it on my to-do list, then a global pandemic happened.&lt;/p&gt;

&lt;p&gt;Almost a year later I picked it up and decided to figure it out. I would need a little Arduino, a usb cable with data and power, and I’d have to write some Arduino code to poll the buttons a couple of times every update. Back in 2019 nobody had done this mod so I was in my own.&lt;/p&gt;

&lt;p&gt;Just before I started to write code, I figured I’d do a quick Google search to see if anything had changed. And, unbelievably, somebody else had done this exact mod in February 2020 and open sourced their code. I thanked them and that meant the project was instantly half done.&lt;/p&gt;

&lt;p&gt;I bought an additional Pro Micro (Arduino compatible) and set it up on a breadboard that made it easier for me to wire up a prototype and check everything was working.&lt;/p&gt;

&lt;p&gt;Finally I cut the old controller cord and wired my new setup into the controller. It worked perfectly. I went back in to trim some supports and add some alternative reinforcements to prevent the controller bending and creaking.&lt;/p&gt;

&lt;p&gt;Using this controller makes playing these games so much easier, and I’ve discovered a couple of games that have made this well worth the time and investment.&lt;/p&gt;

&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;b&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;c&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;d&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;d&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;c&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;d&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;c&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/hanafuda-controller-a-1.jpg&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/hanafuda-controller-a-1.jpg&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/hanafuda-controller-a-2.jpg&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/hanafuda-controller-a-2.jpg&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/hanafuda-controller-b-1.jpg&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/hanafuda-controller-b-1.jpg&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/hanafuda-controller-b-2.jpg&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/hanafuda-controller-b-2.jpg&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;c&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;d&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 82%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__staticimage,
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}

.carousel__activator:nth-of-type(3):checked ~ .carousel__track {
  -webkit-transform: translateX(-200%);
          transform: translateX(-200%);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__slide:nth-of-type(3) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__controls:nth-of-type(3) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(3) {
  opacity: 1;
}

.carousel__activator:nth-of-type(4):checked ~ .carousel__track {
  -webkit-transform: translateX(-300%);
          transform: translateX(-300%);
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__slide:nth-of-type(4) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__controls:nth-of-type(4) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(4) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(3) {
  -webkit-transform: translateX(200%) translateZ(0);
          transform: translateX(200%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(4) {
  -webkit-transform: translateX(300%) translateZ(0);
          transform: translateX(300%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(3),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(3) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(4),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(4) {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;.carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },7000);
  
&lt;/script&gt;

</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 09 Jan 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/01/09/famicom-mahjong-hanafuda-controller-usb-keyboard-mod/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/01/09/famicom-mahjong-hanafuda-controller-usb-keyboard-mod/</guid>
        </item>
      
    
      
        <item>
          <title>Door Door redrawn</title>
          <description>&lt;p&gt;I redrew the box art from &lt;a href=&quot;https://en.wikipedia.org/wiki/Door_Door&quot;&gt;Door Door&lt;/a&gt; (1985, Famicom). It’s a great game and worthy of your time.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Door Door was designed by &lt;a href=&quot;https://en.wikipedia.org/wiki/Koichi_Nakamura&quot;&gt;Koichi Nakamura&lt;/a&gt;, known as one of the creators of &lt;a href=&quot;https://en.wikipedia.org/wiki/Dragon_Quest&quot;&gt;Dragon Quest&lt;/a&gt;. The game was the runner-up in the Enix-sponsored “First Game and Hobby Program Contest” in 1982, winning the “Outstanding Program Award” with a prize of 500,000 yen. Enix was given the rights to the game and ported the game to several Japanese home computers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Out of all the versions I think the Famicom one plays best, even though it has an annoying squeaky walking sound. I just lower or mute the audio.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/door-door-redrawn-colour.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/door-door-original.jpg&quot; alt=&quot;JPG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Affinity Designer is my tool of choice for doing most of my vector illustration work. Below are the vector outlines for the above drawing. As you can see I like to keep things fairly minimal! Lots of gradients were used, and the noise function to give things a bit of texture.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/door-door-redrawn-outline.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The coloured image was originally posted on my &lt;a href=&quot;https://dribbble.com/shots/5872857-Door-Door-Redrawn&quot;&gt;Dribbble account&lt;/a&gt;, but the outline image is new for this blog post. I hope you like it!&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 19 Jan 2019 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2019/01/19/door-door-redrawn/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2019/01/19/door-door-redrawn/</guid>
        </item>
      
    
      
        <item>
          <title>Review: Binary Land</title>
          <description>&lt;p&gt;&lt;img src=&quot;https://64.media.tumblr.com/tumblr_l9tivxpF6i1qbfpni.png&quot; alt=&quot;Binary Land&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A tale of enduring love, spiders and spray cans. This charming little maze game is interesting for one major reason - you control both characters simultaneously.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s not as difficult as it sounds, though, so don’t worry. Both characters walk up and down the screen as directed, but when you attempt sideways movement the first character does as directed and the other does the opposite - making for some interesting brain work. The characters start on opposite sides the screen and you have to figure out how to navigate the maze so that the characters arrive at the goal at the same time. Judicious use of dead-ends and the maze walls can prevent movement of one or the other characters and allow you to move them one at a time, albeit only in a limited way. Things get more difficult with the addition of spider enemies that need to be avoided, and also spider’s webs that will trap either character if walked into. At this point you’ll have to get to them and then use a spray can to destroy the web and free them.&lt;/p&gt;

&lt;p&gt;As with most games of this age, the graphics are functional at best but they do have a certain charm of their own. The music is &lt;a href=&quot;http://en.wikipedia.org/wiki/Je_te_veux&quot;&gt;Eric Satie’s “Je te veux” (I want you)&lt;/a&gt; - a sentimental, slow waltz that lends itself wonderfully to the NES chip music stylings. But the game is really all about the puzzles provided by the maze layouts of which there many - the first three are always the same but after that the rest of the mazes are presented in a random order.&lt;/p&gt;

&lt;p&gt;Hudson Soft first released &lt;em&gt;Binary Land&lt;/em&gt; in 1983 for the MSX and a bunch of other Japan-only home computers and this version of the game featured a boy and a girl. The game was later released in 1985 for the NES/Famicom with the two main characters replaced by penguins, which whilst being reminiscent of &lt;a href=&quot;http://www.mobygames.com/game/pengo&quot;&gt;Pengo&lt;/a&gt; adds a lot of charm to the game. Even more so when you look at &lt;a href=&quot;http://www.famicom.biz/all/htmls/6800000003926.html&quot;&gt;the cover&lt;/a&gt;. The MSX version saw release in Europe by Kuma Computers Ltd in 1984, but the NES version never made it out of Japan.&lt;/p&gt;

&lt;p&gt;More recently a poor java mobile phone version was made and the game was released as &lt;em&gt;Hudson Best Collection Vol. 4&lt;/em&gt; on Game Boy Advance, which contains a bunch of NES games running under emulation. Whilst emulation is the most convenient way to play the original game these days, there have also been a couple of fan remakes which can be played on your desktop computer.&lt;/p&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=NLI415emLzQ&quot;&gt;Watch the game on YouTube.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.mobygames.com/game/binary-land&quot;&gt;Find out more at mobygames.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.famicom.biz/all/htmls/6800000003926.html&quot;&gt;Take a look at the Japanese game cover&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 14 Oct 2010 18:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2010/10/14/binary-land/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2010/10/14/binary-land/</guid>
        </item>
      
    

  </channel>
</rss>
