<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Get Info: #megadrive</title>
    <description>Posts tagged “megadrive” — 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/megadrive/</link>
    <atom:link href="https://blog.gingerbeardman.com/tag/megadrive/index.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 06 Jul 2026 14:37:40 +0000</pubDate>
    <lastBuildDate>Mon, 06 Jul 2026 14:37:40 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>

    
      
        <item>
          <title>New (Old) 3D Golf: porting PC-9801 &amp; Virtual Boy to Mega Drive</title>
          <description>&lt;p&gt;The Japanese Mega Drive ports of T&amp;amp;E SOFT’s &lt;a href=&quot;/2024/11/09/new-3d-golf-simulation-video-game-series/&quot;&gt;New 3D Golf Simulation&lt;/a&gt; series are my favourite golf games, and recently I’ve been living inside their ROMs.&lt;/p&gt;

&lt;p&gt;As with all the craziest ideas, it began with a “I wonder if I could”… In the early hours of one April morning I managed to pull a single course out of the game—its terrain and flyby data—and reimplement it in a viewer of my own, written in Three.js. Over the following week or so of continued reverse engineering, that viewer quietly grew into something resembling a 3D golf game running in the browser. Finding the data had some big clues: we know that there are 18 holes, the distances of each hole and their sequence order, and I’d read the courses were made of ~256 points, so adding all these heuristics together meant it was much easier to find the data than finding a needle in a haystack.&lt;/p&gt;

&lt;p&gt;Understanding the data that well meant I could go the other way, too—&lt;a href=&quot;https://bsky.app/profile/gingerbeardman.com/post/3mkgnbdzljc2o&quot;&gt;back into the original Mega Drive games&lt;/a&gt; themselves. First I added a terrain modifier. To test it I &lt;a href=&quot;https://bsky.app/profile/gingerbeardman.com/post/3mkkxeaebm22c&quot;&gt;flattened the entire course like a pancake&lt;/a&gt; to confirm my understanding was correct, and then cranked it up to 11 into a sort of &lt;a href=&quot;https://bsky.app/profile/gingerbeardman.com/post/3mkpwexii4c2t&quot;&gt;“Hyperactive Terrain Mode”&lt;/a&gt; that warps the fairways into something wild. Both worked well.&lt;/p&gt;

&lt;p&gt;An early attempt changed its mind on every run; turned out I was seeding it from an uninitialised memory location. 🤦 With no debugger console to hand, I’d been hunting bugs like this the crude way—scribbling values into the cartridge’s SRAM (its battery-backed save memory) and reading them back out, a poor man’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;printf&lt;/code&gt;. So it wasn’t exactly straightforward.&lt;/p&gt;

&lt;p&gt;Once that was sorted, I gave the 32-year-old game some &lt;a href=&quot;https://bsky.app/profile/gingerbeardman.com/post/3mkt6k57nlc2e&quot;&gt;brand new, custom user interface&lt;/a&gt; to match.&lt;/p&gt;

&lt;lite-youtube style=&quot;aspect-ratio: 4/3;&quot; videoid=&quot;HHbEVRtbw7Q&quot; params=&quot;start=0&amp;amp;modestbranding=2&quot;&gt;
&lt;/lite-youtube&gt;

&lt;p&gt;Next I wondered if the course data was the same across all of the four Mega Drive games, could it be the same across the games on other platforms? The answer is &lt;strong&gt;yes&lt;/strong&gt;: &lt;a href=&quot;https://bsky.app/profile/gingerbeardman.com/post/3ml2k552qis2f&quot;&gt;the same course data format&lt;/a&gt; turns out to be used right across the series, from the original PC-9801 games (and almost certainly X68000 and FM Towns) through to the Mega Drive and even the Virtual Boy. If my (little-endian) maths is correct that’s a total of 7 unique courses, all sharing one format. There’s some reformatting that needs to be done, but the data structure is the same. And since I could already read the courses, I could write them too—patching the games to pick a course at random, or to load one that was never available on the Mega Drive in the first place. PC-9801 to Mega Drive required sorting the polygons to match how they were expected to be stored.&lt;/p&gt;

&lt;p&gt;But I guess T&amp;amp;E SOFT used the same POLYSYS-CAD software to design all the courses over several years? I love how such a tool could have that sort of longevity.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/new-old-golf-polysyscad.jpg&quot; alt=&quot;IMG&quot; title=&quot;ポリシスCAD (POLYSYS-CAD) PC software used to design hole topology mesh of only ~256 points&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;That last part is the really fun bit. (Can this even &lt;em&gt;be&lt;/em&gt; more fun?)&lt;/p&gt;

&lt;p&gt;Here are three courses running on the Mega Drive for the first time:&lt;/p&gt;

&lt;h2 id=&quot;te-selection&quot;&gt;T&amp;amp;E Selection&lt;/h2&gt;

&lt;p&gt;Extracted from the &lt;a href=&quot;https://www.mobygames.com/game/102547/new-3d-golf-simulation-te-selection/&quot;&gt;NEC PC-9801 add-on course disk&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This course is somewhat unique as it has messages spelled using coloured topology:&lt;br /&gt;
the 1st has “GO!” by the tee position; the 18th has “T&amp;amp;E” just beyond the final green&lt;/p&gt;
&lt;/blockquote&gt;

&lt;lite-youtube style=&quot;aspect-ratio: 4/3;&quot; videoid=&quot;duXwfq-F-CA&quot; params=&quot;start=0&amp;amp;modestbranding=2&quot;&gt;
&lt;/lite-youtube&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;eight-lakes-gc&quot;&gt;Eight Lakes G.C.&lt;/h2&gt;

&lt;p&gt;Also extracted from &lt;a href=&quot;https://www.mobygames.com/game/71396/new-3d-golf-simulation-eight-lakes-gc/&quot;&gt;NEC PC-9801 add-on course disk&lt;/a&gt;:&lt;/p&gt;

&lt;lite-youtube style=&quot;aspect-ratio: 4/3;&quot; videoid=&quot;J0PliXErDNU&quot; params=&quot;start=0&amp;amp;modestbranding=2&quot;&gt;
&lt;/lite-youtube&gt;

&lt;blockquote&gt;
  &lt;p&gt;A fact perhaps only I care about: &lt;a href=&quot;https://bsky.app/profile/gingerbeardman.com/post/3mmmt2mkrzc2z&quot;&gt;during development, prior to Feb 1990, it was &lt;em&gt;Seven Lakes G.C.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/new-old-golf-seven-lakes.webp&quot; alt=&quot;Seven Lakes G.C.&quot; title=&quot;Seven Lakes G.C., as seen in Comptiq Vol. 63 &amp;amp; Oh! PC Issue 117&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;papillon-cc&quot;&gt;Papillon C.C.&lt;/h2&gt;

&lt;p&gt;Extracted from the Nintendo Virtual Boy game &lt;a href=&quot;https://www.mobygames.com/game/15306/golf/&quot;&gt;T&amp;amp;E Virtual Golf&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It’s called Papillon—the French word for butterfly—because the course holes were laid out in the shape of a butterfly. Which was surely a nod to the shape of the Virtual Boy controller.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;lite-youtube style=&quot;aspect-ratio: 4/3;&quot; videoid=&quot;8Hpnm4w4EDU&quot; params=&quot;start=0&amp;amp;modestbranding=2&quot;&gt;
&lt;/lite-youtube&gt;

&lt;p&gt;That last one needed a little extra work. T&amp;amp;E Golf on Virtual Boy doesn’t have a hole flyby, so I had to generate the camera path myself: a bezier curve from tee to pin, nudged towards the centre point of the visible course as it appears on the mini-map. The flyby path in this video was about half way to my final solution.&lt;/p&gt;

&lt;p&gt;Playing these courses on Mega Drive is truly special and the effort was very much worthwhile. 🥰&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;a-few-things-i-learned-along-the-way&quot;&gt;A few things I learned along the way&lt;/h2&gt;

&lt;p&gt;Living inside the disassembly for weeks, I kept tripping over the little decisions T&amp;amp;E SOFT made all those years ago. Some are clever, some are quietly bonkers, and all of them made me grin:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;The hole is three times too big.&lt;/strong&gt; The cup grabs any ball within ~6.7 inches—triple a real hole’s radius—so balls drop from further out than they look. A fudge for the 320×224 screen, where ball and cup were both sub-pixel.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The polygons pre-sort themselves.&lt;/strong&gt; No depth buffer on the Mega Drive, so the draw order is baked into the course data, back-to-front (the painter’s algorithm). The giveaway: it doesn’t match the original PC-9801 CAD order.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Backspin can reverse a putt.&lt;/strong&gt; Spin isn’t cosmetic: it’s fed back into the roll and can make the ball check up and trickle backwards. Real ballistic physics in a 1993 cartridge. Love it!&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Water isn’t a hazard—just very sticky.&lt;/strong&gt; There’s no “in the water” state; water polygons carry friction so high it kills the ball in one frame. The penalty falls out of the ordinary maths.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Wind is a real force, not an aim fudge.&lt;/strong&gt; It becomes a horizontal acceleration applied every frame of flight, exactly like gravity.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Augusta’s wind never actually changes.&lt;/strong&gt; The direction is never written—only strength varies. The arrow only seems to swing because it’s drawn relative to the camera.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Bunkers plug, cart paths kick.&lt;/strong&gt; Every surface has its own bounce coefficient. The fairway hands back a healthy ~40% of the ball’s speed; a bunker returns only ~10%, so the ball plugs where it lands; a cart path or rock fires it back at ~75% for that horrible hard skip.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Your lie quietly rolls the dice.&lt;/strong&gt; On every stroke the game picks a random number from a per-(lie, club) range and folds it into your swing power. A clean fairway lie uses a narrow range; a bad lie widens it—so the rough genuinely makes your shots less predictable. The ranges live in a 17×17 table, one entry per lie-and-club combination.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;four-volumes-one-evolving-engine&quot;&gt;Four volumes, one evolving engine&lt;/h2&gt;

&lt;p&gt;It’s tempting to treat the four Mega Drive games as a single engine with interchangeable courses. They’re not, and the very first line of the cross-volume notes I kept is a warning to myself: ⚠️ &lt;em&gt;never assume all four ROMs share code or data layouts.&lt;/em&gt; T&amp;amp;E SOFT kept tinkering release to release, and you only catch it by dumping the same region in all four disassemblies and diffing.&lt;/p&gt;

&lt;p&gt;The ROM headers number them &lt;em&gt;New 3D Golf Simulation&lt;/em&gt; Vol.1–4, and each header also carries a build date stamped in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YYYY.MMM&lt;/code&gt; form. Here’s the curiosity: the volume numbers track the &lt;strong&gt;build&lt;/strong&gt; dates, not the retail release dates. Vol.2 &lt;em&gt;Devil’s Course&lt;/em&gt; was finished a month before Vol.3 &lt;em&gt;Augusta&lt;/em&gt;—but reached the shops a month after it:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Vol&lt;/th&gt;
      &lt;th&gt;Title&lt;/th&gt;
      &lt;th&gt;Japanese&lt;/th&gt;
      &lt;th&gt;ROM build&lt;/th&gt;
      &lt;th&gt;Retail release&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Pebble Beach no Hatou&lt;/td&gt;
      &lt;td&gt;ペブルビーチの波濤&lt;/td&gt;
      &lt;td&gt;1993-07&lt;/td&gt;
      &lt;td&gt;1993-10-29&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Devil’s Course&lt;/td&gt;
      &lt;td&gt;デビルズコース&lt;/td&gt;
      &lt;td&gt;1993-08&lt;/td&gt;
      &lt;td&gt;1994-01-28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;Harukanaru Augusta&lt;/td&gt;
      &lt;td&gt;遙かなるオーガスタ&lt;/td&gt;
      &lt;td&gt;1993-09&lt;/td&gt;
      &lt;td&gt;1993-12-17&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;Waialae no Kiseki&lt;/td&gt;
      &lt;td&gt;ワイアラエの奇蹟&lt;/td&gt;
      &lt;td&gt;1993-09&lt;/td&gt;
      &lt;td&gt;1994-02-25&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;A couple of header quirks fell out of this. Pebble’s stamp reads &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1993.JLY&lt;/code&gt;—Sega’s own oddball abbreviation for July. And while three of the carts credit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SEGA&lt;/code&gt;, &lt;em&gt;Augusta&lt;/em&gt; credits T&amp;amp;E Soft’s Sega licensee code &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;T-114&lt;/code&gt; instead—a clue that it alone was self-published by T&amp;amp;E SOFT rather than by Sega. The boxes agree: Augusta’s isn’t Sega-branded either.&lt;/p&gt;

&lt;p&gt;Two places they genuinely diverge, each confirmed by dumping the same region in all four:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Colour isn’t a plain palette lookup—and the recipe is per-game.&lt;/strong&gt; A surface byte runs through a little chain of lookup tables before it becomes a pen colour, and those tables aren’t shared: Pebble grades several surfaces differently and even reorders two entries, while Devil’s Course carries its own darker, redder palette. Waialae, charmingly, reuses a single palette three times where its siblings have three distinct ones.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;A decoder bug only Pebble could trigger.&lt;/strong&gt; In the polygon stream, vertex indices are single bytes, with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xFF&lt;/code&gt; acting as an escape prefix—the byte after it encodes a higher index (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xE0 + xx&lt;/code&gt;), so a hole can point past the ~254 vertices a lone byte can name. My extractor mishandled that escaped range, but only Pebble’s holes are dense enough to actually &lt;em&gt;use&lt;/em&gt; it—so the bug sailed through the other three games and only fell over when I reached Pebble. Same encoding in every cart; one course’s data was all it took to expose the flaw in my reader.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s also the US release, &lt;em&gt;Pebble Beach Golf Links&lt;/em&gt; (header stamped 1993-11, likely on shelves 1994-04): the same course data on a larger ROM, with English strings present where the Japanese Vol.1 zeroed them. That parallel made a useful “Rosetta Stone” for decoding menus and text.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;inside-waialae&quot;&gt;Inside Waialae&lt;/h2&gt;

&lt;p&gt;Waialae was my primary reference—1,572,864 bytes, header &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NEW 3D GOLF SIMULATION Vol.4 Waialae C.C.&lt;/code&gt;, serial &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GM G-5529&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each hole is reached through four ROM pointers, one per data block, and they’re wildly different sizes. Block 0 is the vertex list—244 XYZ points, the ~256-point mesh, about 1.5 KB. Block 1 is the bulk of it: sixteen view-order streams (one draw order per camera angle) that bake in the back-to-front sorting—around 5.5 KB, bigger than the geometry it orders. Block 2 holds the mesh and sprites themselves (230 polygons plus 54 sprites), ~1.8 KB. Block 3 is just the flyby keyframes, a slim ~0.7 KB. For Waialae’s first hole that comes to about 9.2 KB, split like this:&lt;/p&gt;

&lt;svg viewBox=&quot;0 0 740 94&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-labelledby=&quot;holeDesc&quot; style=&quot;display:block;margin:0 auto;width:100%;max-width:740px;height:auto;font-family:-apple-system,BlinkMacSystemFont,&apos;Segoe UI&apos;,Helvetica,Arial,sans-serif&quot;&gt;
  &lt;desc id=&quot;holeDesc&quot;&gt;One bar representing a hole&apos;s data for Waialae hole 1, split into four segments by size: Block 0 vertex list 1,466 bytes; Block 1 view-order streams 5,490 bytes; Block 2 mesh and sprites 1,758 bytes; Block 3 flyby keyframes 666 bytes.&lt;/desc&gt;
  &lt;rect x=&quot;12&quot; y=&quot;8&quot; width=&quot;112&quot; height=&quot;78&quot; fill=&quot;#c5e0b4&quot; stroke=&quot;#2f5e22&quot; /&gt;
  &lt;rect x=&quot;124&quot; y=&quot;8&quot; width=&quot;419&quot; height=&quot;78&quot; fill=&quot;#538135&quot; stroke=&quot;#2f5e22&quot; /&gt;
  &lt;rect x=&quot;543&quot; y=&quot;8&quot; width=&quot;134&quot; height=&quot;78&quot; fill=&quot;#70ad47&quot; stroke=&quot;#2f5e22&quot; /&gt;
  &lt;rect x=&quot;677&quot; y=&quot;8&quot; width=&quot;51&quot; height=&quot;78&quot; fill=&quot;#a9d18e&quot; stroke=&quot;#2f5e22&quot; /&gt;
  &lt;text x=&quot;22&quot; y=&quot;28&quot; font-size=&quot;12&quot; font-weight=&quot;700&quot; fill=&quot;#1f3b14&quot;&gt;Block 0&lt;/text&gt;
  &lt;text x=&quot;22&quot; y=&quot;46&quot; font-size=&quot;11&quot; fill=&quot;#33521f&quot;&gt;Vertex list&lt;/text&gt;
  &lt;text x=&quot;22&quot; y=&quot;64&quot; font-size=&quot;11&quot; fill=&quot;#33521f&quot;&gt;1,466 B&lt;/text&gt;
  &lt;text x=&quot;134&quot; y=&quot;28&quot; font-size=&quot;12&quot; font-weight=&quot;700&quot; fill=&quot;#ffffff&quot;&gt;Block 1 · View-order streams&lt;/text&gt;
  &lt;text x=&quot;134&quot; y=&quot;46&quot; font-size=&quot;11&quot; fill=&quot;#e7f2dd&quot;&gt;one draw order per camera angle (×16)&lt;/text&gt;
  &lt;text x=&quot;134&quot; y=&quot;64&quot; font-size=&quot;11&quot; fill=&quot;#e7f2dd&quot;&gt;5,490 B&lt;/text&gt;
  &lt;text x=&quot;553&quot; y=&quot;28&quot; font-size=&quot;12&quot; font-weight=&quot;700&quot; fill=&quot;#14300a&quot;&gt;Block 2&lt;/text&gt;
  &lt;text x=&quot;553&quot; y=&quot;46&quot; font-size=&quot;11&quot; fill=&quot;#14300a&quot;&gt;Mesh + sprites&lt;/text&gt;
  &lt;text x=&quot;553&quot; y=&quot;64&quot; font-size=&quot;11&quot; fill=&quot;#14300a&quot;&gt;1,758 B&lt;/text&gt;
  &lt;text x=&quot;683&quot; y=&quot;28&quot; font-size=&quot;12&quot; font-weight=&quot;700&quot; fill=&quot;#1f3b14&quot;&gt;Block 3&lt;/text&gt;
  &lt;text x=&quot;683&quot; y=&quot;46&quot; font-size=&quot;11&quot; fill=&quot;#1f3b14&quot;&gt;Flyby&lt;/text&gt;
  &lt;text x=&quot;683&quot; y=&quot;64&quot; font-size=&quot;11&quot; fill=&quot;#1f3b14&quot;&gt;666 B&lt;/text&gt;
&lt;/svg&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;A couple more structural quirks:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;A spatial grid, decades early.&lt;/strong&gt; Immediately after the vertex pool sits a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;count&lt;/code&gt; followed by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;count × 16&lt;/code&gt; word offsets into the face section—a two-level spatial grid (cell → faces) so the engine can look up the relevant polygons from the ball’s (x, z) without walking the whole hole.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Why the SRAM debugging hurt.&lt;/strong&gt; Waialae’s battery-backed save RAM is odd-lane only, from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$200001&lt;/code&gt;. Byte writes have to land on odd Mega Drive addresses; even-address writes to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$200000&lt;/code&gt; simply disappear. That’s the real reason scribbling values into SRAM as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;printf&lt;/code&gt; substitute was so finicky—half my early writes were going into the void. (BlastEm helpfully flushes SRAM to disk on quit, so I could read it back from the host.)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;variable-zoom&quot;&gt;Variable zoom&lt;/h2&gt;

&lt;p&gt;The shared course format is what let me move holes between platforms, but each machine scales the world differently. The proven case: Waialae hole 1 from the PC-9801 drops into the Mega Drive after a fixed &lt;strong&gt;1.6× rescale on X and Z&lt;/strong&gt; (Y untouched), plus a &lt;strong&gt;little-endian → big-endian flip&lt;/strong&gt; on the flyby path records.&lt;/p&gt;

&lt;p&gt;Lining those transplanted polygons up against the stock Mega Drive ones is also what &lt;em&gt;proved&lt;/em&gt; the rendering trick I mentioned earlier: the Mega Drive packs faces in descending max-Z order—back to front, the painter’s algorithm—and the original PC-9801 face id survives the journey as the Mega Drive’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;attr1&lt;/code&gt; byte.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;two-deeper-cuts&quot;&gt;Two deeper cuts&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;The flyby camera, decoded by statistics.&lt;/strong&gt; Each flyby keyframe carries two mystery bytes. With no documentation, I histogrammed 4,723 of them across every hole and the shape gave it away: one byte is an 8-bit angle (256 units = 360°) for yaw, the other a signed pitch clamped to about ±40, positive meaning the camera looks down. Educated guessing, with visuals.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The Virtual Boy world is built at a different scale.&lt;/strong&gt; The Virtual Boy stores its courses at 32 raw units per yard, where the Mega Drive works in 17—so Papillon has to be shrunk by exactly &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;17/32&lt;/code&gt; (0.53) to sit correctly on the Mega Drive, otherwise every club hits too short for the hole. (My first attempt used the wrong unit and reported hole 1 as 321 yards instead of its true 360.) It’s the same idea as the 1.6× I needed coming the other way from the PC-9801—one shared format, but every machine measures its yards differently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole thing ran on rizin and vasmm68k with BlastEm for execution—though frame-time profiling had to move to Genesis Plus GX, because BlastEm freezes the VDP’s HV counter during the long rendering routines I was trying to measure.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;what-the-old-magazines-turned-up&quot;&gt;What the old magazines turned up&lt;/h2&gt;

&lt;p&gt;Reverse engineering only tells you &lt;em&gt;what&lt;/em&gt; the games do; for the &lt;em&gt;why&lt;/em&gt;, I went digging through a stack of Japanese computer magazines from the era, OCRing the scans to pull out the text. A 1989 developer interview about &lt;em&gt;Harukanaru Augusta&lt;/em&gt; (遙かなるオーガスタ)—the PC-9801 original that kicked off the series—turned out to be a goldmine:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;The 3D engine came first.&lt;/strong&gt; T&amp;amp;E’s POLYSYS pre-dated the golf games by a couple of years, already appearing—only in the 3D intro logos, as far as I can tell—in &lt;em&gt;DAIVA STORY 7: Light of Kali Yuga&lt;/em&gt; and &lt;em&gt;Psy-O-Blade&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Trees were nearly real 3D.&lt;/strong&gt; They tried modelling trees as polygons, leaves and all—but one tree took as long to draw as a whole screen. So scaled sprites were used instead.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The first game had no hills.&lt;/strong&gt; T&amp;amp;E’s &lt;em&gt;3-D Golf Simulation&lt;/em&gt;, written in BASIC six years earlier, had no terrain undulation at all—and on the Sharp X1, 18 holes took &lt;em&gt;half a day&lt;/em&gt; to play through.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;POLYSYS was meant to be general-purpose:&lt;/strong&gt; swap the data and it renders anything. T&amp;amp;E planned an RPG and a shooter on it and intended to license it to other software houses.&lt;/li&gt;
  &lt;li&gt;One programmer, mostly: &lt;strong&gt;Eiji Kato&lt;/strong&gt; (加藤英治).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the &lt;em&gt;Augusta&lt;/em&gt; course itself came with a wonderful backstory:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;They licensed the real thing.&lt;/strong&gt; An official contract with Augusta National, working from the club’s blueprints. Staff visited, didn’t play, but “rubbed their cheeks on the grass.”&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Augusta sent back ~60 corrections:&lt;/strong&gt; eg. pine trees too short and too spread out, flowers too pink, bunker sand the wrong colour.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No do-overs, by design.&lt;/strong&gt; You could save mid-round, but loading erased the save data—so no replaying holes to pad your score.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Best of all:&lt;/strong&gt; the dev build’s four caddies were all women. Augusta’s are all men, so the final game swapped them. The ladies returned in the expansion courses and Mega Drive games.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The T&amp;amp;E Selection caddies are real people:&lt;/strong&gt; four women who worked at &lt;strong&gt;Brother Industries&lt;/strong&gt;—whose &lt;strong&gt;TAKERU&lt;/strong&gt; software vending machines sold these add-on course disks.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;what-next&quot;&gt;What Next?&lt;/h2&gt;

&lt;p&gt;There’s an extra bit of hacking I’m working on but am unsure if it will lead to anything, but if it does it will need a post all of its own. Hold your thumbs. Fingers crossed. 🤞&lt;/p&gt;

&lt;p&gt;It would be possible to release a small script which given both original games would do the extraction and patching, but for now I don’t feel comfortable doing that. I still need to figure out the correct tree mapping for each game, decide which of the four Mega Drive games is most suited to each of the three new courses, add new title screens and a few more bits of detail work.&lt;/p&gt;

&lt;p&gt;I’d love to &lt;a href=&quot;https://bsky.app/profile/gingerbeardman.com/post/3mnhbioqr4s2f&quot;&gt;see these ported courses released officially&lt;/a&gt; some day—the series IP is now owned and managed by D4 Enterprise—so if you know anybody there please hook us up! If you are an employee of D4 Enterprise then please check my request to license the IP. 🙏&lt;/p&gt;

&lt;p&gt;There are more period games in the series that I’d like to take a look at to see if they use the same data format, or modify it in any specific way. SNES and 3DO seem to be the most interesting. 🧐&lt;/p&gt;

&lt;p&gt;But for now it’s just me, a pile of disassembly files, rizin and vasmm68k, the BlastEm emulator, and a soft spot for blue skies and FM synth — still trying to get the ball in the hole. ⛳️🏌️‍♂️&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 19 Jun 2026 16:26:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2026/06/19/new-old-3d-golf-porting-pc-9801-and-virtual-boy-to-mega-drive/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2026/06/19/new-old-3d-golf-porting-pc-9801-and-virtual-boy-to-mega-drive/</guid>
        </item>
      
    
      
        <item>
          <title>Ace Mega Blaster controller for Sega Mega Drive</title>
          <description>&lt;p&gt;I recently did a teardown and clean of one of my Japanese Mega Drive controllers. When I received it I notices that it had some sticky residue in the inside of the the d-pad causing up and right to feel a bit sticky.&lt;/p&gt;

&lt;p&gt;The controller is called the BLASTER, sometimes MEGA BLASTER, and was released by ACE which was a sort of hardware sub-brand of the game developer &lt;a href=&quot;https://gingerbeardman.creator-spring.com/listing/sur-de-wave-back-print?product=387&quot;&gt;Sur Dé Wave&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This particular controller is one of two colours that were available for the Sega Mega Drive, though you could buy an equivalent for PC-Engine and maybe some other platforms.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Rapid fire for all three buttons (off/fast/faster)&lt;/li&gt;
  &lt;li&gt;Slow does the usual rapid pressing of the start button (off/on)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bottom half of the shell is held together with three small Philips screws, all visible, and three clips on the bottom and sides that need to be carefully pressed to release the shell.&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/ace-mega-blaster-1.jpg&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/ace-mega-blaster-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/ace-mega-blaster-2.jpg&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/ace-mega-blaster-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/ace-mega-blaster-3.jpg&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/ace-mega-blaster-3.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/ace-mega-blaster-4.jpg&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/ace-mega-blaster-4.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: 100%; 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;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/ace-mega-blaster-ad.jpg&quot; alt=&quot;Print ad&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 16 Sep 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/09/16/ace-mega-blaster-controller-for-sega-mega-drive/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/09/16/ace-mega-blaster-controller-for-sega-mega-drive/</guid>
        </item>
      
    
      
        <item>
          <title>Review: Flicky</title>
          <description>&lt;p&gt;&lt;img src=&quot;https://64.media.tumblr.com/tumblr_lqg56oZ49r1qbfpni.png&quot; alt=&quot;Flicky&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flicky is one of those games that’s been released so many times on so many compilations that you probably already own it without even realising. It’s also a typical 1980s arcade game—simple to pick up, difficult to master, and a lot of fun along the way.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m a bit too young to have encountered &lt;a href=&quot;http://www.mobygames.com/game/flicky&quot;&gt;Flicky&lt;/a&gt; in the arcades. I actually stumbled across the game by accident—it came in a double game cartridge alongside &lt;a href=&quot;http://www.mobygames.com/game/gunstar-heroes&quot;&gt;Gunstar Heroes&lt;/a&gt; on the Mega Drive. Quite why those two games were put together I have no idea. Designed by Yoji Ishii—later part of Sonic Team—Flicky can be considered spiritual precursor to the Sonic the Hedgehog series.&lt;/p&gt;

&lt;p&gt;The aim of the game is, as a blue sparrow named Flicky, to collect a bunch of lost chicks from around each stage and lead them to the exit. It may sound easy but there are a lot of things that can get in your way. Enemies take the form of various animals that emerge from air vents—one touch and you’ll lose a life, as well as your trail of chicks. Chicks will also stop following you if an enemy crosses their path, at which point you’ll need to pick them up again. You’re not totally defenceless though, as you can collect plant pots and things from around each stage. These things are autmatically thrown as you jump, so judicious timing of jumps can be key. The stages in the game are single screens that scroll horizontally to keep Flicky centred. Each stage is loosely decorated to look like an apartment with windows, shelves, pot plants, home-wares, and of course the exit door.&lt;/p&gt;

&lt;p&gt;There are more nice touches—some chicks are blind, and if set loose from your trail will wander around aimlessly making them much more difficult to pick up. You can spot those chicks easily as they wear Stevie Wonder style sunglasses. Every few stages a bonus round appears, in which chicks are flung into the air leaving you to catch them in a net. Flicky’s inertia makes collecting all of them pretty tricky, but doing so will gain a lot more points. More points not only means a higher score, but also the chance of extra lives. Doing really well will result in a series of pixel girls appearing in the odd looking window on the level as your end of level bonus is added to your score. Quite a task, if you’re looking for a challenge.&lt;/p&gt;

&lt;p&gt;What I love so much about Flicky is that it’s such a pure, zen gaming experience. It’s possible to plan a route around the stage in away that you can pick up all chicks in one go, avoiding/killing any enemies en route, before depositing them at the exit. All in less than 20 seconds in order to get maximum bonus points. The satisfaction from such a perfect run is immense. However, messing up will result in the stage becoming very difficult indeed, as you attempt to pick up the chicks who are, of course, now moving around.&lt;/p&gt;

&lt;p&gt;I love the way the game does so much with so little. A true classic.&lt;/p&gt;

&lt;p&gt;Over the years Flicky has been re-released as part of various Sega Mega Drive/Genesis compilations and is available, in one form or another, for pretty much every recent platform, including GameCube, PC, PSP, PS2, PS3, Xbox, Xbox 360 and even some mobile phones. And that’s just the official emulated versions. MAME would be the best place to play the original arcade version. So there’s no shortage of places to get your Flicky on.&lt;/p&gt;

&lt;p&gt;Since writing this review I’ve been lucky enough to become owner of an original Flicky arcade cabinet, which is now the star of its own blog: &lt;a href=&quot;https://www.flicky1984.com&quot;&gt;www.flicky1984.com&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/3C0FGxzWm0E&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/arcade/flicky&quot;&gt;Find out more at mobygames.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 07 Oct 2010 08:35:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2010/10/07/flicky/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2010/10/07/flicky/</guid>
        </item>
      
    

  </channel>
</rss>
