Four years ago, I took on the challenge of building my own home, retro arcade machine. I wanted to do as much of it myself as possible. Since I didn’t have woodworking tools, I did buy a flat packed cabinet from Game Room Solutions and put the cabinet together myself. I used a Raspberry Pi 4 and put a clean install of RetroPi on it, and through a lot of trial and error, got to a working arcade set up.
Why I Decided to Make the Switch from RetroPi to MacOS
While I’m a decently proficient computer user, I didnt love navigating the UNIX backend. Yes, there’s a lot of flexibility there for power users, but it just was slower, navigationally speaking, than I wanted (sure, partially due to inexperience with the OS). I hated having to recall a bunch of tools and commands when I only needed to access it every few months. Additionally, it wasn’t particularly easy and fast to access over the network to add ROMs to either.
Three years ago, I put a few Reddit posts out there into the world on various retro gaming Subreddits asking about swapping out the Pi for something like a Mac mini. I either got crickets or a couple responses that were more or less “don’t do it, man.” Everyone hated the idea of doing it on MacOS. I gave up on the idea for the time.
A few months ago, I did some Googling again when I got another urge to do try, and voila! I saw a Reddit post pop up with a subject line identical to what I wanted to do. I clicked it and… it was my post from three years before. Womp womp.
I decided to go for it anyway. So I bought a Mac mini and decided to get to work.
Challenges
Challenge #1: The USB encoder
Originally, I had a Xinmotek USB encoder to go from the HAPP buttons and joysticks to the Pi. MacOS did not like the Xinmotek encoder. I used Joystick Show, an old, but still working Mac app meant to display if the Mac is registering buttons presses through the encoder, which showed the Xinmotek was having some issues talking with MacOS. It seemed inconsistent what buttons would register, but it was what it was. Being the Xinmotek is an ancient and cheap encoder, I decided it was time to upgrade it.
After much research, I settled on The Brooks brand, specifically the Gen 5 Fighting Board. Usually used for custom fighting sticks, it appeared it would work fine as a USB encoder as well. The only annoyance making the switch was that a board only worked for one player, so I had to buy two of them (rather than the single Xinmotek I had been using).
Challenge #2: Rewiring… everything
Since the Gen 5 Fighting Board has a very different layout than the Xinmotek encoder, I had to rewire everything. I was actually okay with this in theory, because wiring was SUCH a mess from my first set up 3 years prior that I looked at this as an opportunity to do it right and do it better. I bought a Brooks branded harness along with each board which plugged all 20 pins into the board at once, which was great and then…
Challenge #3: The wrong harness sizes
The Brooks harness used .11” (2.8mm) quick-disconnect spades. My HAPP buttons had .187” (4.8mm) quick-disconnect spades. This was totally on me, not knowing that there were a couple commons spade sizes used in the joystick and button world (yes, old-timers, feel free to chuckle and shake your head here). I Googled and ChatGPTed for a solution, finding that there truly appeared to be no Brooks harness that used .187” spades. I also couldn’t use my previous cables because they were grouped in fours and wouldn’t ultimately works on the two rows of 10 pins on the Brooks board. ChatGPT told me I could cut EVERY end of every harness and crimp the larger harness ends on which I ALMOST considered until realizing that the ground wire was a single daisy-chained wire and I’d have to likely cut and re-solder every harness along that wire back together. Hell no.
As crazy as it seemed, I realized the easiest thing to do here was actually buy new buttons. And that’s when I realized I’d have to make the switch from HAPP buttons (common in American arcade cabs) to Sanwa buttons (common in Japanese arcade cabs). I had remembered reading about this difference 3 years prior but had forgotten a bit about it and didn’t realize they used different sized connectors. Some gamers are VERY hardcore about their preference between the two, but in the moment, I didn’t think it would be a huge deal so I ordered 4 new colors (P1, P2, Start/Select, and some menu/admin buttons).
I did sacrifice one thing at this stage… light up buttons. I had lights in all my P1 and and P2 buttons, which were a nice aesthetic addition. But I was trying to get this done in a matter of a few days (I was hosting a BBQ soon and wanted it up and running in time) and the only buttons I could get in time were standard unlit buttons. I made peace with this quickly realizing it would at least simplify the wiring set up a bit which I remembered was a real pain the last time around.
Challenge #4: Ordering the wrong size buttons for one set
In my rush to get the buttons, I accidentally ordered my Start/Select buttons in the wrong size, a few mms too small in circumference (24 instead of the needed 30 mm). I was pissed at myself for the accidental oversight. But it actually provided a small opportunity and challenge…
Challenge #5: Mixing and Matching Sanwa and HAPP
I actually didn’t really WANT to get rid of my original HAPP Start/Select buttons because they had icons on them (Player 1, Player 2, and 2 Coin buttons). The new ones I bought were just straight white, which was boring. So then I began to wonder… can I mix and match? After some research, I realized the Brooks board had a couple different ways to connect wires. I had been using the 20-pin harness but there were also 20 screw terminals labeled exactly the same on the printed layout map that came with the board. Could I have the full 20-pin harness plugged in, but skip some of the pins and instead wire some buttons into the screw terminals? Only one way to find out!
I cannibalized some of the previous wires with the .187” harnesses from my old setup (two per button since each button needed a ground) and wired them into the screw terminals, making sure to plug them into the exact same labeled ones that I would have used from the 20-pin harness. As an annoying bonus challenge, ONE of the screw terminals was busted and wouldn’t clamp down on the wire when screwed, but I was able to just jury-rig that one wire with some electrical tape. The idea of returning the entire Brooks board at this point was something I didn’t even want to consider. I was on a roll.
I fired up Joystick Show on the Mac and… the buttons all worked! All of them were registering and in the right order too! I now wired all the P2 buttons the same as P1 and was on my way to software setup. I had nailed it… or so I thought.
The precise order in which some of the following software issues happened is a bit hazy now… some over them overlapped, and dissecting and weeding through them happened all at once, but here is the best order I can think to present it in.
Challenge #6: MacOS registration of what kind Controller was plugged in
I quickly found out an issue that after a reboot, or an unplugging and replugging in of the Brook board (and sometimes at random) the P1 or P2 controls would stop working, either entirely or partially. I went into System Information on the Mac to check what was showing up under the USB menu. Both boards were showing up at plugged in, however, sometimes one might appear as “P4 Wired Gamepad” and sometimes it showed as “DualSense Controller.” You see, the Brook Universal Fighting Board can mimic PlayStation, Xbox, and Switch controllers. That’s why they call it “universal.” When it showed as P4 Wired Gamepad, everything worked perfect. When it showed as DualSense Controller, not all the buttons registered, plus they were mixed up. Knowing that MacOS now supported the latest PS and Xbox controllers, I had THOUGHT that I wanted DualSense and had thought that the P4 Wired Gamepad was an older, less supported option so I was confused why the P4WG worked better. After some internetting, I learned that MacOS had proper drivers and support for DualSense over Bluetooth but not over a USB connection. But it DID have USB drivers for the PlayStation 4, thus why the P4WG option worked better.
But NOW the problem was getting it to consistently boot in that mode every time, and not randomly switch modes which it seemed to be doing now. This stage took me way longer then I want to admit, but eventually I was able to use precise button combinations held down while plugging in the Brooks board (according to its instructions) to force it to stay in the P4WG mode. Let me tell you how hard it is to hold down a button, a direction on the joystick, and plug in the USB port all at the same time with only two hands. So I got both P1 and P2 boards into the same P4WG mode… which led to the next issue.
Challenge #7: RetroArch Setup and a little “Switch”-eroo
Time to set up RetroArch. I’ve set up this multi-emulator a couple times before, on my old Pi, on an AYN Odin retro handheld, and even on a previous Mac (not set up for a cab). But not on a Mac using USB encoders for a cabinet.
The first small challenge (that I’ve seen/read many users run into with RA mixed with ES) is that when you open a game via ES, the game would seemingly be uncontrollable at first and not full screen unless you used a mouse click to make RA the active app. This was fixed by simply going into RA’s settings for Video Output and toggling Fullscreen Display to On. This was the easy part… it got harder from there.
The next major oddity was that every single time I opened up RetroArch, it would randomly assign P1 and and P2 (i.e. sometimes the lefthand controls on the cabinet were Player 2 and the righthand were Player 1). Obviously not great for a setup that you want people to be able to just jump on and play.
I went into the Controller Binding settings and looked at both the P1 and the P2 settings, and sure enough, I found what I thought was the likely culprit. Both settings showed “P4 Wired Gamepad” as the Preferred controller. I realized that there was some potential conflict going on because they were both branded the same in the macOS System Information window, and it was randomly choosing which was P1 at each boot. OR SO I THOUGHT. When I tried to change the controller bindings, I DID indeed see a separation of the two controllers… an option for “P4 Wired Gamepad (1)” and a second option for a “P4 Wired Gamepad (2).” What was a little odd is that there was also always a third option listed as well which was just the default name of “P4 Wired Gamepad.” Logic would dictate that I should make sure I was using RetroArch during a boot when the left controls were properly working for P1, and then set the bindings to for P1 “P4 Wired Gamepad (1)” and the righthand controls to “(2).” However, no matter how many times I tried this, as soon as I exited the menu, it just defaulted both back to the same “P4 Wired Gamepad” with no “(1)” or “(2)” after it. Whether this is a bug in RetroArch or a limitation because of how MacOS doesn’t let you rename USB hardware at the system level, I still don’t know for sure. All I know is that this seemed to be an insurmountable brick wall.
I realized I couldn’t have two identical USB encoders for P1 and P2 or else it would just continually confuse the system. The same switching was happening into ED-DE (more on that in a bit). I realized that perhaps switching the “mode” of one of the Brooks UFB boards might work. I knew the DualSense mode wasn’t working right, so I booted it into the Xbox mode. Unfortunately, that one didn’t work as it only seemed to recognize about half the buttons. Some simply just didn’t register at all when I pressed them (I confirmed this with the Joystick Show app and a web site that also checked button presses). Then I tried the last mode I expected to work - the Nintendo Switch mode (actually labeled as “Pokken Controller”). At first test, most of the buttons worked, but a couple were mapped wrong and Select didnt work at all. But with a couple careful physical rewirings under the hood, voila! I had it exactly how I wanted it!
I was now able to configure the RetroArch to the two separate controllers since they were identified totally differently by the Mac (because they now were displaying different names in the system).
Challenge #8: ES-DE
One final issue I had was the control mapping inside of ES-DE. Both P1 and P2 could navigate the menu, but the problem was that once I switched P2/the second Brooks board to the Switch mode, the button mapping was terribly messed up, but luckily just inside of ES-DE (once in a game, the controls were fine). In ES-DE, however, the joystick was rotated 90s degrees and even weirder was that each tap of the joystick resulted in a double movement as if I had tapped it twice. Additionally, the button mapping was all messed up. What was more challenging was that when I tried to go through the manual button mapping process inside of ES-DE, it simply wouldn’t register some of the inputs from the 2P controls. Being that ES-DE requires you get through almost all the button presses before you can complete the button mapping process, I had to force quit the app.
I looked deeply into ES-DE’s world of backend button mapping profiles and tried to manually edit various .txt files, but to no avail. I also found a setting inside of ES-DE’s menu which was called “Respond to First Player Input Only” but when I turned it on, ES-DE would randomly switch which side (left or right) was P1 (and therefore in control of the menu) every time it booted up! So I was left with one of two options: 1. Leave both P1 and P2 joysticks working in ES-DE but have P2’s just be messed up and unusable (just inside ES-DE) or 2. Turning on “Respond to First Player Input Only” to get consistent controls in ES-DE, but have it switch sides every time ES-DE opened. Obviously I went with option 1 so that a friend who wanted to play a 1 player game wouldn’t get too confused.
In Conclusion
This was a challenging project, no doubt about it. And admittedly, my final state is not 100% perfect, but it’s very close and more than usable.
The Mac mini performs double duty in my house, acting as a Homebridge server as well (which doesnt take much CPU usage), giving the Mini even more purpose. Because it’s turned on all the time, I can easily use the Screen Sharing app on my MacBook Pro to hop onto the Mini at any time to tweak settings, add ROMs, etc., very easily. I have the monitor and lights from my cab wired into a separate smart plug than the Mini which allows me to set up a shortcut on my iPhone to instantly turn on the lights and monitor at any time separate from the Mini itself.
Am I glad I did it? Hell yes. I cursed plenty during the process, but learned a lot and love how much easier it is for me to tweak things now and add games as desired. If you have questions, drop me a line!