<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5633037</id><updated>2012-02-17T03:38:41.930Z</updated><category term='outrun'/><category term='enhanced'/><category term='turbo outrun'/><category term='space harrier'/><category term='javagear'/><category term='bug'/><category term='bootleg'/><category term='code'/><category term='easter eggs'/><category term='version differences'/><category term='hardware'/><category term='Memorabilia'/><category term='rewrite'/><title type='text'>Reassembler - Emulation &amp; Decompilation</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>84</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5633037.post-7642798878440303896</id><published>2012-01-31T21:57:00.002Z</published><updated>2012-01-31T22:00:42.492Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><title type='text'>Gateway's Broken Arches</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Have you noticed that Gateway's arches are randomly broken in the original OutRun? At times arches don't join, sometimes they float in the air and occasionally complete pillars are missing.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;It's not very noticeable at high speed, and the precise nature of the breakage isn't consistent. Overall though, it spoils the illusion of what would otherwise be a cool level.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Lpi7_WvSIVU/TyhetoRL5wI/AAAAAAAAAKo/NoloCOJ3SUw/s1600/0002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Lpi7_WvSIVU/TyhetoRL5wI/AAAAAAAAAKo/NoloCOJ3SUw/s1600/0002.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;For my rewrite, there's a simple solution to this problem; but not for the original game sadly. OutRun's software engine can display 76 scenery sprites at any one time, which are initialized dynamically as the level progresses. Further sprites are reserved for traffic and other essential objects.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Each Gateway arch comprises 4 sprites (two pillars and two joining sections). So we can display 19 complete arches at any one time. Therefore, on complex stretches of road where no free slots can be allocated, some of the pillar components are simply skipped.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Thankfully, we don't have memory or speed restrictions on a modern PC and can allocate additional slots to dynamically spawn sprites. In fact, it's as easy as changing a single number. And here's a screenshot to (somewhat) prove it.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-h0dj0mXmjN4/TyhjBQ9T1JI/AAAAAAAAAKw/dyCxiaaa0ts/s1600/gateway_fixed.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://1.bp.blogspot.com/-h0dj0mXmjN4/TyhjBQ9T1JI/AAAAAAAAAKw/dyCxiaaa0ts/s320/gateway_fixed.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The illusion when moving through the level is greatly improved, and when I eventually increase the frame rate beyond the original 30fps, this level will be awesome!&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-7642798878440303896?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/7642798878440303896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=7642798878440303896' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7642798878440303896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7642798878440303896'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2012/01/gateways-broken-arches.html' title='Gateway&apos;s Broken Arches'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Lpi7_WvSIVU/TyhetoRL5wI/AAAAAAAAAKo/NoloCOJ3SUw/s72-c/0002.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-3691491584664507412</id><published>2012-01-29T17:21:00.002Z</published><updated>2012-01-30T19:04:37.880Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun C++ Engine Tech Demo</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Finally, after years of hard labour, here's a technical demo of the OutRun C++ port. The demo showcases recent work porting the core level rendering engine. The benefit of rewriting the engine, is that it will facilitate modifications and&amp;nbsp;enhancements&amp;nbsp;to the original game that Yu Suzuki only dreamed of.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, let's get arty and check out some stills from the demo.&amp;nbsp;I've implemented the ability to change the horizon y coordinate, so we can experience viewpoints never seen in the original game. How about a bird's eye view of the start line?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0H_oqPSfjqY/TyV6N7RT5kI/AAAAAAAAAKA/KdFhgvNn1as/s1600/demo01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://1.bp.blogspot.com/-0H_oqPSfjqY/TyV6N7RT5kI/AAAAAAAAAKA/KdFhgvNn1as/s320/demo01.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We can also straddle left and right, so it's possible to find further interesting camera angles. Although this one reveals that our&amp;nbsp;surf-boarding friend&amp;nbsp;isn't actually in the water! Messing with the original engine can highlight its limitations of course. This demo allows you to scroll further left and right than the original engine, which can cause glitches.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NvddaIuoHyI/TyV6iVVLauI/AAAAAAAAAKI/9w1IpV0uC70/s1600/demo02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://2.bp.blogspot.com/-NvddaIuoHyI/TyV6iVVLauI/AAAAAAAAAKI/9w1IpV0uC70/s320/demo02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's fun to be able to browse the scenery in detail:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sYA-W1Evh6c/TyV69Wn6r8I/AAAAAAAAAKQ/CsKKRIbFPXE/s1600/demo04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://3.bp.blogspot.com/-sYA-W1Evh6c/TyV69Wn6r8I/AAAAAAAAAKQ/CsKKRIbFPXE/s320/demo04.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's a&amp;nbsp;beach-side&amp;nbsp;postcard scene for you:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-r7CfY1laIYg/TyV7VBGmSYI/AAAAAAAAAKY/JyYO4QqZsuI/s1600/demo03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://2.bp.blogspot.com/-r7CfY1laIYg/TyV7VBGmSYI/AAAAAAAAAKY/JyYO4QqZsuI/s320/demo03.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And finally a view down the final straight of Coconut Beach before the road fork. Alas, the road fork code hasn't been ported yet, so this is the road to nowhere at the moment.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-oVP9AuWNoO4/TyV7vMqA9VI/AAAAAAAAAKg/c_uiXUq1ytw/s1600/demo05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://2.bp.blogspot.com/-oVP9AuWNoO4/TyV7vMqA9VI/AAAAAAAAAKg/c_uiXUq1ytw/s320/demo05.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The keys for the demo are:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Space:&lt;/b&gt; Toggle automatic movement through level&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cursor Up:&lt;/b&gt; Advance slowly&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cursor Left/Right:&lt;/b&gt; Move camera left/right&lt;/li&gt;&lt;li&gt;&lt;b&gt;A/Z:&lt;/b&gt; Adjust horizon&lt;/li&gt;&lt;li&gt;&lt;b&gt;Escape: &lt;/b&gt;Quit&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Requirements:&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;OutRun Revision B ROMs. They must be named correctly and placed in the roms subdirectory. No other set will work. Although you can use the patched set from &lt;a href="http://reassembler.blogspot.com/2011/08/outrun-enhanced-edition.html"&gt;OutRun Enhanced Edition&lt;/a&gt;. I would recommend running the demo from the console to see any error messages.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=5555"&gt;Microsoft Visual C++ runtime libraries.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Other Notes:&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Having control over the rendering engine surfaces glitches and limitations present in the original code. Using unpatched roms, the sprite zoom bug mentioned in this &lt;a href="http://reassembler.blogspot.com/2012/01/outrun-sprite-zoom-bug.html"&gt;post&lt;/a&gt;&amp;nbsp;is evident. You can use patched roms to eliminate this.&amp;nbsp;&lt;/li&gt;&lt;li&gt;There is a bug where a random shadow pops into view dependent on the camera x coordinate. This is present in MAME as well, but is&amp;nbsp;hard to reproduce when you're actually racing through the level. I need to get this verified on hardware to help track down a solution and determine whether it's a video emulation issue or a bug in the original codebase.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Download &lt;/b&gt;here:&amp;nbsp;&lt;a href="http://www.massdestruction.co.uk/outrun/outrun_tech_demo1.zip"&gt;outrun_tech_demo1.zip&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let me know what you think by leaving a comment below.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-3691491584664507412?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/3691491584664507412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=3691491584664507412' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3691491584664507412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3691491584664507412'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2012/01/outrun-c-engine-tech-demo.html' title='OutRun C++ Engine Tech Demo'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-0H_oqPSfjqY/TyV6N7RT5kI/AAAAAAAAAKA/KdFhgvNn1as/s72-c/demo01.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-2526422246891376478</id><published>2012-01-16T23:54:00.003Z</published><updated>2012-01-17T20:10:54.485Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><title type='text'>OutRun Sprite Zoom Bug</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;OutRun uses a lookup table to set the horizontal and vertical zoom values&amp;nbsp;of sprites based on their z co-ordinate.&lt;br /&gt;&lt;br /&gt;Unfortunately, one of the vertical zoom entries in this table is incorrect.&amp;nbsp;If you drive as slowly as possibly by gently tapping the accelerator, there&amp;nbsp;is a single position where sprites snap to an erroneous vertical zoom value.&amp;nbsp;This causes the sprite to clip incorrectly and jolt to a different offset.&lt;br /&gt;&lt;br /&gt;You can see an example of this behaviour in the animation below. Note the third palm tree from the left suddenly snaps and zooms to an incorrect position.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-t122NrRV1Ao/TxS3AYxV4CI/AAAAAAAAAJw/x4N0VW1TmQc/s1600/outrun_vzoom_bug.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-t122NrRV1Ao/TxS3AYxV4CI/AAAAAAAAAJw/x4N0VW1TmQc/s1600/outrun_vzoom_bug.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Unbelievably, this applies to &lt;b&gt;all &lt;/b&gt;sprites in the game. Although it's only noticeable when driving at low speeds. However, once spotted it's hard to ignore.&lt;br /&gt;&lt;br /&gt;I've updated&amp;nbsp;&lt;a href="http://reassembler.blogspot.com/2011/08/outrun-enhanced-edition.html"&gt;OutRun: Enhanced Edition&lt;/a&gt; with a patch for the bug.&lt;br /&gt;&lt;br /&gt;In other news, expect an early tech demo of my C++ port very shortly. It was in coding the port that I spotted this bug.&lt;br /&gt;&lt;span id="goog_1661541556"&gt;&lt;/span&gt;&lt;span id="goog_1661541557"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-2526422246891376478?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/2526422246891376478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=2526422246891376478' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2526422246891376478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2526422246891376478'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2012/01/outrun-sprite-zoom-bug.html' title='OutRun Sprite Zoom Bug'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-t122NrRV1Ao/TxS3AYxV4CI/AAAAAAAAAJw/x4N0VW1TmQc/s72-c/outrun_vzoom_bug.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6695642446342280063</id><published>2011-11-23T22:32:00.001Z</published><updated>2011-11-23T22:39:51.573Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Conversion Update</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I haven't written about the OutRun conversion to C++ for some time. That's because I put it on hold whilst I focused on the anniversary edition, amongst other projects. Having a break was sensible and necessary, as it's such intense work.&lt;br /&gt;&lt;br /&gt;Compared with other 68k conversions I've worked on professionally, this is much tougher, due to the sheer complexity and in some cases poor quality of the original code. Even after a first draft, a huge amount of refactoring will be needed so that the codebase can be extended.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-QasNyUw0HB8/Ts11EgXkBYI/AAAAAAAAAJM/_5OkzND1lYM/s1600/desktop.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://1.bp.blogspot.com/-QasNyUw0HB8/Ts11EgXkBYI/AAAAAAAAAJM/_5OkzND1lYM/s400/desktop.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Things are &lt;i&gt;slowly &lt;/i&gt;coming together. Don't hold your breath whilst waiting for this; I'm doing it at a very steady pace. I've taken a screenshot of my desktop, which shows that much of the level data is now being parsed. Underlying this, many of the sprite rendering routines are ported. I've included a MAME screenshot for comparison so you can see what's currently missing.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6695642446342280063?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6695642446342280063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6695642446342280063' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6695642446342280063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6695642446342280063'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2011/11/i-havent-written-about-outrun.html' title='OutRun Conversion Update'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-QasNyUw0HB8/Ts11EgXkBYI/AAAAAAAAAJM/_5OkzND1lYM/s72-c/desktop.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-8153844848779604791</id><published>2011-11-13T20:28:00.001Z</published><updated>2011-11-16T00:03:50.207Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='version differences'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Original Japanese Version</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Al2Lt9x3s60/TsL9HLQNWPI/AAAAAAAAAJA/ztE8jX7Usnk/s1600/20090503d.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-Al2Lt9x3s60/TsL9HLQNWPI/AAAAAAAAAJA/ztE8jX7Usnk/s320/20090503d.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Japanese only static sit-down cabinet design with roof&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Pnyy99uRLXU/TsL32q74sxI/AAAAAAAAAI4/rx1StXvBZ4w/s1600/sado-04.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Pnyy99uRLXU/TsL32q74sxI/AAAAAAAAAI4/rx1StXvBZ4w/s1600/sado-04.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Interior shot from a more beat-up cabinet. Note the unique bezel design&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Following my &lt;a href="http://reassembler.blogspot.com/2011/09/outrun-rev-vs-rev-b.html"&gt;comparison of Rev A and Rev B&lt;/a&gt; of the OutRun ROMs, I've turned my attention to the original Japanese release of the ROMs. There are a number of differences and bug fixes which are detailed below.&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;There is no backup RAM.&lt;/b&gt; Therefore, the code doesn't contain the routines to handle backup RAM found in later revisions. For example, the code to calculate backup RAM checksums.&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;The mini upright and standard upright cabinets are not supported.&lt;/b&gt; The revision only includes motor code for the deluxe sitdown. As a result, Dip switch bank B functions differently. Dip switch #1 toggles the motor hardware. Dip switch #2 toggles advertise sound. MAME currently emulates this dip switch incorrectly, assuming it to be the same as later revisions.&lt;br /&gt;&lt;br /&gt;3. &lt;b&gt;The default scores are different.&lt;/b&gt; For example, in the original version YU has 1,000,000 points. In later revisions this became 5,000,000.&lt;br /&gt;&lt;br /&gt;4. The code to initialise default scores is called from a different routine.&lt;br /&gt;&lt;br /&gt;5. The music selection screen is set to a 15 second timeout, rather than 30. SELECT MUSIC BY STEERING text is omitted.&lt;br /&gt;&lt;br /&gt;6. &lt;b&gt;The code to set the y position of the backdrop tilemap is different&lt;/b&gt; (e.g. the position of the cloud backdrop on coconut beach). In the original version, the tilemap immediately snaps to the horizon y coordinate. In later revisions, the tilemap will smoothly scroll to a new position.&lt;br /&gt;&lt;br /&gt;7. &lt;b&gt;Traffic logic changes.&lt;/b&gt; The code that determines when to flag other cars on the road as being near the player's Ferrari is different. This will presumably cause different behaviour when approaching packs of traffic. I'm unsure why the code has been changed or what situation the coders were trying to mitigate.&lt;br /&gt;&lt;br /&gt;8. The code to set the speed of other cars when bunched in traffic has been changed. In later revisions, the speed is capped but in the original version a higher speed can be obtained by the traffic. This is noticeable at the start of the game. In later revisions the truck on the right hand side initially speeds off, but then the other cars catch up and bunch together around it. In the original, the truck accelerates away and the other cars never catch it. Without observing the presumably rare bug the coders were attempting to fix, it's tough to say why this change was made.&lt;br /&gt;&lt;br /&gt;9. Later versions of the game contain an optimization to not add sprites that are off screen to the display list. This version does not contain this optimization.&lt;br /&gt;&lt;br /&gt;10. As most players know, the stages are in a different order and there are layout differences in places in the original version. As such, certain routines differ to compensate for this when setting up stage palettes and sprite effects when driving offroad.&lt;br /&gt;&lt;br /&gt;11. In later revisions, a safety counter was added to bonus mode in the main game's switch. (Bonus mode is the section of the game that increments your bonus score after completing stage 5.) This ensures that bonus mode exits eventually and presumably fixes a rare hang that can take place in this version.&lt;br /&gt;&lt;br /&gt;12. This version does not attempt to terminate the crash animation sequence when entering bonus mode.&lt;br /&gt;&lt;br /&gt;13. There are minor changes to ensure the y placement of some sprite objects (including those on the intro sequence and some in completion screens) more accurately reflect the y position of the blitted road layer.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-8153844848779604791?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/8153844848779604791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=8153844848779604791' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8153844848779604791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8153844848779604791'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2011/11/outrun-original-revision.html' title='OutRun Original Japanese Version'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Al2Lt9x3s60/TsL9HLQNWPI/AAAAAAAAAJA/ztE8jX7Usnk/s72-c/20090503d.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-7510539022902119107</id><published>2011-10-16T22:16:00.000+01:00</published><updated>2011-11-18T13:49:53.090Z</updated><title type='text'>Minor Updates &amp; Translation Request</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Thanks to &lt;a href="http://jap-sai.com/"&gt;jap-sai.com&lt;/a&gt;,&amp;nbsp;I've managed to acquire a number of OutRun related goodies in the past few months. I've updated the &lt;a href="http://reassembler.blogspot.com/2009/10/outrun-gameplay-laserdisc-vhs.html"&gt;VHS and laserdisc page&lt;/a&gt; with some screenshots and a link to a downloadable copy of the gameplay DVD.&lt;br /&gt;&lt;br /&gt;I'm also looking for someone to assist in translating a number of Japanese texts, most importantly Yu Suzuki's Gameworks book. If you can help, please comment below. I'm willing to pay to have a decent translation done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Translation now in progress.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-7510539022902119107?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/7510539022902119107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=7510539022902119107' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7510539022902119107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7510539022902119107'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2011/10/minor-updates-translation-request.html' title='Minor Updates &amp; Translation Request'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4750690070457811590</id><published>2011-09-24T17:25:00.004+01:00</published><updated>2011-09-24T17:26:11.350+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='version differences'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Rev A vs. Rev B</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I've looked into the code changes between the revision A and revision B roms. Comparing the roms isn't easy, because the addresses of the routines are aligned differently rendering a binary compare impractical. Therefore, my technique was to align a rough decompilation of the Rev A code to the addresses of the Rev B code in IDA.&lt;br /&gt;&lt;br /&gt;I manually compared the code. It was easy to see if a function had changed in size for example as subsequent functions would be shifted to different addresses.&amp;nbsp;Clearly, this is prone to human error and I may have missed something. But, if I have, it should be minor.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The differences are:&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Easter Egg activation is more complex&lt;/b&gt; in Revision B. I have blogged about this already &lt;a href="http://reassembler.blogspot.com/2010/05/outrun-easter-egg-definite-guide.html"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The steering wheel vibration code for the Upright Mini cabinet has been altered.&lt;/b&gt; In Revision B, the vibration frequency has changed to make it less aggressive. I would guess this must was done in response to hardware problems reported by operators. The code can be found at address 0xEBA2 in Rev A and&amp;nbsp;0xEC42 in Rev B.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;And that would appear to be it! Maybe not a huge surprise, given that I've not noticed any other differences playing the versions. I hope to compare the original version next, which may yield more interesting surprises.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;As a final note, only IC118 and IC133 change between the revisions. The sub CPU code is identical.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4750690070457811590?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4750690070457811590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4750690070457811590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4750690070457811590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4750690070457811590'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2011/09/outrun-rev-vs-rev-b.html' title='OutRun Rev A vs. Rev B'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-5150417492791768584</id><published>2011-09-12T21:16:00.005+01:00</published><updated>2011-09-24T17:10:04.885+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bootleg'/><category scheme='http://www.blogger.com/atom/ns#' term='version differences'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>OutRun Philko Bootleg</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I studied the 68k code for the OutRun Philko bootleg. This is&amp;nbsp;identifiable by the copyright message reading BETA as opposed to SEGA, as shown in the screenshot below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-CcX577bZu58/Tm5wtWTgI6I/AAAAAAAAAIA/XgQDCQFiUkw/s1600/out_run_title.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-CcX577bZu58/Tm5wtWTgI6I/AAAAAAAAAIA/XgQDCQFiUkw/s1600/out_run_title.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Although the hardware is different to the original Sega boardset (see &lt;a href="http://mamedev.org/source/src/mame/drivers/segaorun.c.html"&gt;MAME source code&lt;/a&gt; for details), it turns out that the game code is identical to the standard Rev B edition. The only changes are in fact the copyright message, the patched rom checksum and the encoding detailed below.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Bizarrely, Philko felt compelled to perform some crude encryption on their code by bitswapping it. As documented in the MAME source code, for the main CPU bits 11,12 and 6,7 should be swapped. For the sub CPU&amp;nbsp;bits 14,15 and 2,3 should be swapped.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Here's a picture of the boardset, kindly provided by Luke Wells. If anyone has a higher quality snap, please feel free to send it over.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-k8zSsZRiomQ/Tm-7ZTRcfnI/AAAAAAAAAIE/fPbRYwMlGvM/s1600/AUK90070_-_Bootleg_-_Outrun_Medium.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-k8zSsZRiomQ/Tm-7ZTRcfnI/AAAAAAAAAIE/fPbRYwMlGvM/s400/AUK90070_-_Bootleg_-_Outrun_Medium.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So this means a couple of things to bootleg board owners: I can potentially provide a version of &lt;a href="http://reassembler.blogspot.com/2011/08/outrun-enhanced-edition.html"&gt;OutRun Enhanced Edition&lt;/a&gt; if there's demand. Or owners can patch with a bitswapped Sega revision B romset, if they dislike the BETA copyright message.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Some questions of my own:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;What was the intended cabinet for the Philko game?&lt;/li&gt;&lt;li&gt;Why identify the boardset as a bootleg by changing the copyright message?&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-5150417492791768584?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/5150417492791768584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=5150417492791768584' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5150417492791768584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5150417492791768584'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2011/09/outrun-philko-bootleg.html' title='OutRun Philko Bootleg'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-CcX577bZu58/Tm5wtWTgI6I/AAAAAAAAAIA/XgQDCQFiUkw/s72-c/out_run_title.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-59916686234638574</id><published>2011-09-10T16:23:00.001+01:00</published><updated>2011-09-12T21:17:30.817+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='turbo outrun'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Turbo OutRun Boardset</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I picked up a Turbo OutRun boardset this week. Unlike OutRun, Sega decided to mount the board in a protective cage. The cage has its own internal wiring as shown below.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-P7dEqYjCvlc/Tmt-n5WXP3I/AAAAAAAAAHc/lr6RffRa_0E/s1600/P1000960.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-P7dEqYjCvlc/Tmt-n5WXP3I/AAAAAAAAAHc/lr6RffRa_0E/s400/P1000960.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The board was in very good condition, it didn't look the cage had ever been opened. The original serial (or selial) stickers were intact:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-KTY8mBxAcXY/Tmt-7DQoJjI/AAAAAAAAAHg/scTFi7zh0OE/s1600/P1000959.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-KTY8mBxAcXY/Tmt-7DQoJjI/AAAAAAAAAHg/scTFi7zh0OE/s400/P1000959.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Ih_xW4ZjYqs/Tmt_jq45Y1I/AAAAAAAAAHk/SKlW6z3-sO4/s1600/P1000961.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-Ih_xW4ZjYqs/Tmt_jq45Y1I/AAAAAAAAAHk/SKlW6z3-sO4/s400/P1000961.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The board is still fitted with its original FD1094 &lt;a href="http://www.segaresurrection.com/#What"&gt;suicide processor&lt;/a&gt;. I'm shocked that some of these are still working 22 years on! The white sticker on the processor reads:&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: #fbfbfd; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;b&gt;SEGA 317-0106.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LnUOzIIfNgY/TmuAHIkqrvI/AAAAAAAAAHo/FgFISOev7Rc/s1600/P1000962.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-LnUOzIIfNgY/TmuAHIkqrvI/AAAAAAAAAHo/FgFISOev7Rc/s400/P1000962.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here's a closeup of the connections, for my own reference:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-hezLT-4oODQ/TmuAQ4Tcq0I/AAAAAAAAAHs/5evX3I4rEsc/s1600/P1000963.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-hezLT-4oODQ/TmuAQ4Tcq0I/AAAAAAAAAHs/5evX3I4rEsc/s400/P1000963.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And here we have it running on the wiring harness made by &lt;a href="http://retroclinic.com/"&gt;RetroClinic&lt;/a&gt;. I took the board out of the cage to plug it in.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-D_oP2sfcGa0/TmuAfHA4gmI/AAAAAAAAAHw/tPED-4P_wLM/s1600/P1000965.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-D_oP2sfcGa0/TmuAfHA4gmI/AAAAAAAAAHw/tPED-4P_wLM/s320/P1000965.JPG" width="169" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-UO06AsMk18g/TmuAjcgl4EI/AAAAAAAAAH0/gNC6r8Tl-nw/s1600/P1000964.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-UO06AsMk18g/TmuAjcgl4EI/AAAAAAAAAH0/gNC6r8Tl-nw/s200/P1000964.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-59916686234638574?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/59916686234638574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=59916686234638574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/59916686234638574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/59916686234638574'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2011/09/turbo-outrun-boardset.html' title='Turbo OutRun Boardset'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-P7dEqYjCvlc/Tmt-n5WXP3I/AAAAAAAAAHc/lr6RffRa_0E/s72-c/P1000960.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6874462024480859730</id><published>2011-09-06T22:55:00.002+01:00</published><updated>2011-09-07T22:54:49.973+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='space harrier'/><title type='text'>Space Harrier: Enduro Racer Edition</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;This is a&amp;nbsp;&lt;/span&gt;customized&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;version of &lt;/span&gt;&lt;b style="font-family: inherit;"&gt;Space Harrier&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;, modified to run on &lt;/span&gt;&lt;b style="font-family: inherit;"&gt;Enduro&amp;nbsp;Racer&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; hardware.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-m-Z6fzkJUoU/TmaWbOL81GI/AAAAAAAAAHU/OlhzHavcnlQ/s1600/1088284893.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-m-Z6fzkJUoU/TmaWbOL81GI/AAAAAAAAAHU/OlhzHavcnlQ/s1600/1088284893.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This means that the game is fully playable on the Enduro boardset without the&amp;nbsp;programmed security i8751 CPU.&lt;br /&gt;&lt;br /&gt;Normally, if you try to run Space Harrier on Enduro Racer hardware, the game&amp;nbsp;controls will not function and therefore the game is unusable.&lt;br /&gt;&lt;br /&gt;I'd like to thank Mark at &lt;a href="http://www.retroclinic.com/"&gt;retroclinic.com&lt;/a&gt; for performing the hardware&amp;nbsp;testing. Without him, this wouldn't have been possible as I don't own either&amp;nbsp;boardset. Please note that currently this requires Enduro Racer hardware with the earlier YM2203 sound board.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Download here:&lt;/b&gt;&amp;nbsp;&lt;a href="http://www.massdestruction.co.uk/sharrier_enduro_v101.zip"&gt;sharrier_enduro_v101.zip&lt;/a&gt;&amp;nbsp;(18K)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Version 1.0.1:&lt;/b&gt; JunoMan from &lt;a href="http://www.segaresurrection.com/"&gt;Sega Resurrection&lt;/a&gt;&amp;nbsp;suggested a more elegant solution. Results should be the same. Thanks!&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Version 1.0.0:&lt;/b&gt; Initial Release&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Please note that no portions of the original game code are included in this package.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6874462024480859730?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6874462024480859730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6874462024480859730' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6874462024480859730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6874462024480859730'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2011/09/space-harrier-enduro-racer-edition.html' title='Space Harrier: Enduro Racer Edition'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-m-Z6fzkJUoU/TmaWbOL81GI/AAAAAAAAAHU/OlhzHavcnlQ/s72-c/1088284893.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-3015853712318938761</id><published>2011-08-11T16:51:00.001+01:00</published><updated>2012-01-17T20:12:40.224Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='enhanced'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Enhanced Edition</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;b&gt;OutRun Enhanced Edition&amp;nbsp;&lt;/b&gt;&lt;i&gt;is an updated version of OutRun, Sega's seminal arcade racer.&amp;nbsp;&lt;/i&gt;&lt;i&gt;It is&amp;nbsp;intended to be programmed to EPROMs and used with the original arcade&amp;nbsp;hardware.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-t5u420py3VM/TkMPybt23MI/AAAAAAAAAHQ/R0hDHqgLxIk/s1600/outrun_ics.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="http://1.bp.blogspot.com/-t5u420py3VM/TkMPybt23MI/AAAAAAAAAHQ/R0hDHqgLxIk/s320/outrun_ics.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Enhancements:&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;High score saving using existing RAM (no hardware modification required)&lt;/li&gt;&lt;li&gt;Improved freeplay mode with attract; press start to begin&lt;/li&gt;&lt;li&gt;Music is played during the music selection (radio dial) screen&lt;/li&gt;&lt;li&gt;Dipswitch-selectable "MPH" / "km/h" speed display&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Bug Fixes to Sega's original release:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Spurious sound in attract mode&lt;/li&gt;&lt;li&gt;Misplaced tile on music select screen (above steering wheel)&lt;/li&gt;&lt;li&gt;Mixed up ROM ID numbers on Memory Test diagnostic screen&lt;/li&gt;&lt;li&gt;&lt;a href="http://reassembler.blogspot.com/2012/01/outrun-sprite-zoom-bug.html"&gt;Incorrect sprite zoom lookup table&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Compatibility, programming and installation instructions can be found in the documentation.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I'd like to thank Darren Finck for jointly working with me on this project and for providing hardware testing. We have released the enhanced edition to celebrate OutRun's 25th anniversary in September.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Download here:&lt;/b&gt;&amp;nbsp;&lt;a href="http://www.massdestruction.co.uk/outrun_enhanced_v102.zip"&gt;outrun_enhanced_v102.zip&lt;/a&gt;&amp;nbsp;(22K)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Online documentation &lt;a href="http://www.finck.net/outrun/"&gt;here&lt;/a&gt;. &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Please note that no portions of the original game code are included in this package.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Version 1.0.2:&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;Fixed sprite zoom lookup table. This is a bug in the original game code.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;b&gt;Version 1.0.1:&lt;/b&gt;&lt;span style="font-size: x-small;"&gt;BUGFIX: The in-game music would continually play throughout attract mode if you failed to achieve a highscore.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Now the in-game music is stopped at game over.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;This issue was present in the original game, but the music would eventually stop during attract mode when the Best Outrunners screen displayed. It could arguably be considered a bug in the original game too.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Please note, that if you achieve a high score, Last Wave is correctly played into attract mode as per the original game.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Note that if you are upgrading from the previous version (1.0.0), you only need to program IC 118 and IC 133.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Version 1.0.0:&lt;/b&gt;&amp;nbsp;Initial Release.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-3015853712318938761?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/3015853712318938761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=3015853712318938761' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3015853712318938761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3015853712318938761'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2011/08/outrun-enhanced-edition.html' title='OutRun Enhanced Edition'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-t5u420py3VM/TkMPybt23MI/AAAAAAAAAHQ/R0hDHqgLxIk/s72-c/outrun_ics.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-1679425871031816581</id><published>2011-07-24T18:21:00.003+01:00</published><updated>2011-07-24T18:24:20.851+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>OutRun Controller Project</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;The aim of this project was to have a fully playable OutRun PCB in my lounge, without the overhead of the original controls or cabinet. As an extra requirement, I wanted to be able to swap the original control panel in if desired without any complex rewiring.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-K1-WE50dz24/TixTTEeRG-I/AAAAAAAAAG0/T7yMhhvqkcY/s1600/project_overview.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="347" src="http://4.bp.blogspot.com/-K1-WE50dz24/TixTTEeRG-I/AAAAAAAAAG0/T7yMhhvqkcY/s400/project_overview.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The original hardware consists of three analog controls: the accelerator, brake and steering. A perfect replacement pad appeared to be the Dreamcast controller. It contains two analog triggers, which we can map to acceleration and braking plus an analog thumbstick for the steering.&lt;br /&gt;&lt;br /&gt;Unfortunately, the original Dreamcast pad uses &lt;a href="http://en.wikipedia.org/wiki/Hall_effect_sensors"&gt;hall effect sensors&lt;/a&gt; for the analog controls and would be unsuitable. Thankfully, many of the third party controllers aren't made to the same standard and instead use cheaper &lt;a href="http://en.wikipedia.org/wiki/Potentiometers"&gt;potentiometers&lt;/a&gt;, just like the original arcade hardware! In addition to this, there are plenty of digital buttons we can map to things like the gear change and the start button.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7WPpGwoPD6Q/TixUHW7z-vI/AAAAAAAAAG8/GoItuIa5n-s/s1600/madcatz.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-7WPpGwoPD6Q/TixUHW7z-vI/AAAAAAAAAG8/GoItuIa5n-s/s320/madcatz.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I plumped for a Madcatz Dreamcast pad. It's a nasty piece of work, but suitable for rewiring. I cut the original cable off, bypassing the pad's logic circuits and soldered wires directly onto the necessary components. One problem is that many of the components are connected via the pad circuity in a way that makes them unusable. For example, the buttons share a ground connection and the pots are also connected. You'll want to use a continuity tester and cut the PCB tracks between the components.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-v8uCtI2GDC0/TixS4D-I3eI/AAAAAAAAAGw/tS_s17bv3dA/s1600/pad_small.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-v8uCtI2GDC0/TixS4D-I3eI/AAAAAAAAAGw/tS_s17bv3dA/s400/pad_small.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Thanks to some forum assistance, I found out that the connectors on the OutRun wiring harness are 'Amp Mate N Lok' which can be bought from &lt;a href="http://www.coin.demon.co.uk/conectrs.htm"&gt;Swallow Amusements&lt;/a&gt;. Using these connectors, I was able to create a wiring harness that would plug straight into the original OutRun wiring loom. It's possible to create your own plugs without buying an official (and expensive) crimping tool. You can simply add solder to the wire, press it into the crimping pin and hope it makes a firm connection. When it does, crush the crimping pin around the wire with some pliers. It might take some time to get it right, but you can still achieve decent results.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7l-Y_ymChSk/TixT3kWEQqI/AAAAAAAAAG4/hwiTZG-D3YA/s1600/matenlok.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="278" src="http://2.bp.blogspot.com/-7l-Y_ymChSk/TixT3kWEQqI/AAAAAAAAAG4/hwiTZG-D3YA/s320/matenlok.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;One other thing to note is that the OutRun 50P controller connector requires 5v to be sent to pins A24 and A25 or your controls won't work. An odd design decision on behalf of Sega it would seem. The pinouts for the ports can be found below:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;b&gt;AMP 50P&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A1 Coin Sw #2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B1 Coin Sw Ground&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A2 Coin Sw #1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B3&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A4 Shift Switch &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B4 Shift Switch Ground&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A5 Start Sw &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B5 Start Sw Ground&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A6 Service Sw &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B6 Service &amp;amp; Test Ground&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A7 Test Sw &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B7 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B8&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A9 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B9&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A10 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B10&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A11 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B11&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A12 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B12&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A13 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B13 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A14 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B14 Ground&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A15 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B15 Ground&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A16 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B16 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A17 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B17 +5V&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A18 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B18&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A19 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B19&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A20 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B20&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A21 Start Lamp &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B21 Start Lamp Ground&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A22 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B22&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A23 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B23&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A24 +5V &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B24&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A25 +5V &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B25&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;b&gt;AMP 20P&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A1 Accel Pot &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B1 Steering Pot&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A2 Accel Pot Wiper &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B2 Steering Pot Wiper&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A3 Accel Pot &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B3 Steering Pot&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A4 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B4 Brake Pot&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A5 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B5 Brake Pot Wiper&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A6 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B6 Brake Pot&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A7 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B7&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B8&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A9 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Pin B9&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Pin A10 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Pin B10&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Here's a video of the final setup in action!&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/ZkG7iOH5HtA/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ZkG7iOH5HtA?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/ZkG7iOH5HtA?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-1679425871031816581?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/1679425871031816581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=1679425871031816581' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1679425871031816581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1679425871031816581'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2011/07/outrun-controller-project.html' title='OutRun Controller Project'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-K1-WE50dz24/TixTTEeRG-I/AAAAAAAAAG0/T7yMhhvqkcY/s72-c/project_overview.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6058555087080783600</id><published>2010-12-05T22:04:00.000Z</published><updated>2010-12-05T22:04:00.389Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Road Layer and Slave CPU Code Converted</title><content type='html'>The entire code for the slave 68k CPU has been ported. This CPU solely controls road generation and interfacing with the road hardware. It's probably the most complex area of the game code. As expected, debugging the code was relatively painful. The code now needs a considerable clean-up, but I'll do that once more of the game code is hooked up, to ensure it's more obvious if I break something whilst refactoring.&lt;br /&gt;&lt;br /&gt;The following screenshot shows a section of curved track using both road layers on Coconut Beach. You can begin to see that all the elements are coming together and we're now in a position where we have the building blocks to rewrite the higher level code.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/TPwML8QF6_I/AAAAAAAAAFc/vOun8RXCRok/s1600/road_demo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_G8-NchROEFI/TPwML8QF6_I/AAAAAAAAAFc/vOun8RXCRok/s1600/road_demo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6058555087080783600?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6058555087080783600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6058555087080783600' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6058555087080783600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6058555087080783600'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/12/road-layer-and-slave-cpu-code-converted.html' title='Road Layer and Slave CPU Code Converted'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_G8-NchROEFI/TPwML8QF6_I/AAAAAAAAAFc/vOun8RXCRok/s72-c/road_demo.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6687647646449394684</id><published>2010-11-24T15:07:00.001Z</published><updated>2010-11-24T15:08:02.038Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Translation Update &amp; Driving Cabinet</title><content type='html'>Currently going gang busters on the slave CPU road code. It's big, it's ugly, but it's unfortunately necessary to translate a large chunk to C++ before I can proceed with more visible aspects of the game code. The level generation is highly dependent on it. Even after translation, I expected to spend a couple of weeks doing a line by line debug - Visual Studio vs. Mame Debugger. Let battle commence. &lt;br /&gt;&lt;br /&gt;Meanwhile, Garnet Hertz provided an &lt;a href="http://www.conceptlab.com/outrun/"&gt;update&lt;/a&gt; back in October, with regard to their real life OutRun driving cabinet.&lt;br /&gt;&lt;br /&gt;Check out a recent video here:&lt;br /&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" data="http://www.flickr.com/apps/video/stewart.swf?v=71377" height="300" type="application/x-shockwave-flash" width="400"&gt; &lt;param name="flashvars" value="intl_lang=en-us&amp;photo_secret=c19bd19129&amp;photo_id=5013777718"&gt;&lt;/param&gt;&lt;param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=71377"&gt;&lt;/param&gt;&lt;param name="bgcolor" value="#000000"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=71377" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;photo_secret=c19bd19129&amp;photo_id=5013777718" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6687647646449394684?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6687647646449394684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6687647646449394684' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6687647646449394684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6687647646449394684'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/11/translation-update-driving-cabinet.html' title='Translation Update &amp; Driving Cabinet'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-5241318555386535236</id><published>2010-11-16T00:33:00.000Z</published><updated>2010-11-16T00:33:11.874Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Sprite Support Implemented</title><content type='html'>A big step forward; I now have full sprite support in my framework.&lt;br /&gt;&lt;br /&gt;Furthermore, I have ported all the low-level OutRun routines from 68k to C++ that abstract the sprite hardware from the general game code. This was a considerable effort and required some serious debugging.&lt;br /&gt;&lt;br /&gt;You can think of the dependencies as follows:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;High-Level OutRun Game Code (68k) -&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;Low-Level OutRun Sprite Routines (68k) -&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;Video Hardware.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I'm at the stage where the second two components in this sequence are done. The ported routines control some of the following areas:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Initializing and caching sprite palette data in RAM&lt;/li&gt;&lt;li&gt;Ordering sprites based on priority&lt;/li&gt;&lt;li&gt;Converting the programmer friendly format used by OutRun game objects to the format required by hardware&lt;/li&gt;&lt;li&gt;Setting horizontal and vertical zoom settings from a lookup table&lt;/li&gt;&lt;li&gt;Setting the height and width from a lookup table in relation to the above&lt;/li&gt;&lt;li&gt;Setting the sprite anchor point&lt;/li&gt;&lt;li&gt;Setting rendering hints based on horizontal flip bits etc.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here's a slightly dull screenshot, which shows the OutRun logo being rendered. Well most of it, the observant among you will notice I didn't hook up the bird sprites as it was getting late:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/TOHP2jszOdI/AAAAAAAAAFY/CRXelGdCa-A/s1600/sprites_demo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_G8-NchROEFI/TOHP2jszOdI/AAAAAAAAAFY/CRXelGdCa-A/s1600/sprites_demo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;It doesn't look like much, but the important thing is I can&amp;nbsp;initialize&amp;nbsp;a sprite simply by setting a few jump table properties using fully ported code. Here's an example of the code required to initialize a sprite object, where 'e' is a jump table entry:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;jump_index = 0;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;x = 0;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;y = 0x70;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;road_priority = 0xFF;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;priority = 0x1FA;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;zoom = 0x7F;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;pal_src = 0x99;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;draw_props = 0;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;control = 0;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;shadow = 3;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e-&amp;gt;addr = ADDRESS_OF_SPRITE_DATA;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;map_palette(e);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;do_spr_order_shadows(e);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;So progress is good. Once I get to the stage where there is something more interesting, I'll release a demo build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-5241318555386535236?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/5241318555386535236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=5241318555386535236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5241318555386535236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5241318555386535236'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/11/sprite-support-implemented.html' title='Sprite Support Implemented'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_G8-NchROEFI/TOHP2jszOdI/AAAAAAAAAFY/CRXelGdCa-A/s72-c/sprites_demo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-707986781579853047</id><published>2010-11-11T11:13:00.000Z</published><updated>2010-11-11T11:26:49.191Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Memorabilia'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Papercraft Model</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Picked up the September 2004 issue of Dorimaga magazine. It includes&amp;nbsp;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;Sega History Papercraft Vol 4, which is a constructable model of the&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;hydraulic&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&amp;nbsp;sitdown OutRun Cabinet. How cool is that?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_G8-NchROEFI/TNvN3iqyHfI/AAAAAAAAAFU/1xUJ3QlPFY8/s1600/IM001153.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_G8-NchROEFI/TNvN3iqyHfI/AAAAAAAAAFU/1xUJ3QlPFY8/s400/IM001153.jpg" width="380" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/TNvN2Qj5sNI/AAAAAAAAAFQ/WH--jf7uksg/s1600/IM001154.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="http://1.bp.blogspot.com/_G8-NchROEFI/TNvN2Qj5sNI/AAAAAAAAAFQ/WH--jf7uksg/s400/IM001154.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-707986781579853047?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/707986781579853047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=707986781579853047' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/707986781579853047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/707986781579853047'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/11/outrun-papercraft-model.html' title='OutRun Papercraft Model'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_G8-NchROEFI/TNvN3iqyHfI/AAAAAAAAAFU/1xUJ3QlPFY8/s72-c/IM001153.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-9186580231355899565</id><published>2010-11-06T13:05:00.001Z</published><updated>2010-11-06T13:07:06.908Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Support for Tile Layers Implemented</title><content type='html'>The hardware tile layer is now supported in my framework. So in addition to the text layer previously mentioned, the ported code can now&amp;nbsp;utilize&amp;nbsp;tiles.&lt;br /&gt;&lt;br /&gt;Here's a screenshot to provide an example of this, using ported code to display the tiles from the music selection screen:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/TNVP9x83dJI/AAAAAAAAAFI/HyD5Wl5mUKY/s1600/tile_demo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/TNVP9x83dJI/AAAAAAAAAFI/HyD5Wl5mUKY/s1600/tile_demo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Much of the detail from the music select screen is missing, because it also makes use of sprites, which are currently unsupported by the framework.&lt;br /&gt;&lt;br /&gt;To&amp;nbsp;summarize&amp;nbsp;the components of the port, the following 68k code has been ported to C++ in order to reach the above stage:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Routines to setup palette ram&lt;/li&gt;&lt;li&gt;A new text routine to blit text with a height of two tiles to the text layer (this displays the Select Music By Steering text string)&amp;nbsp;&lt;/li&gt;&lt;li&gt;The routine which decompresses a tile map from rom and outputs it to tile ram&lt;/li&gt;&lt;li&gt;The routine to update tile hardware on a vertical interrupt&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;And the framework itself emulates the following:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Tile Layers&lt;/li&gt;&lt;li&gt;Text Layers&lt;/li&gt;&lt;li&gt;Palette Hardware&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;So we're getting to a stage where basic routines are coming along nicely. The final ported C++ code is more readable and far more concise than the original assembler.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-9186580231355899565?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/9186580231355899565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=9186580231355899565' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/9186580231355899565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/9186580231355899565'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/11/support-for-tile-layers-implemented.html' title='Support for Tile Layers Implemented'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_G8-NchROEFI/TNVP9x83dJI/AAAAAAAAAFI/HyD5Wl5mUKY/s72-c/tile_demo.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-9030347412495599597</id><published>2010-11-02T23:39:00.000Z</published><updated>2010-11-02T23:39:04.507Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>The OutRun Rewrite Begins</title><content type='html'>I've made a start on the rewrite. Here's a quick summary of what I've been up to aside from brushing up on my C++ skills. Firstly I've installed and configured a suitable build environment, which consists of:&lt;br /&gt;&lt;br /&gt;- Visual Studio 2010 Express C++&lt;br /&gt;- DirectX SDK&lt;br /&gt;- SDL (for rendering)&lt;br /&gt;&lt;br /&gt;From there I've written code to:&lt;br /&gt;&lt;br /&gt;- Read the tile and data roms into memory.&lt;br /&gt;- Ported emulation code to emulate the text layer and convert the pixel format.&lt;br /&gt;- Rewritten three 68k assembler routines decompiled from the OutRun source code.&lt;br /&gt;&lt;br /&gt;The end result is that I can now use a fully ported C++ routine that blits text, in the form of tiles, to the screen. This routine takes the precise same input format as the original code. In the following screenshot, I've called the routine to display various text strings from the game. A simple call to &lt;b&gt;blit_text(address_of_text_data) &lt;/b&gt;renders the text with the correct palette and screen positioning. Exactly the same as the original&amp;nbsp;assembler.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/TNCgBxIxVNI/AAAAAAAAAFE/Fur32nRAGVk/s1600/text_demo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_G8-NchROEFI/TNCgBxIxVNI/AAAAAAAAAFE/Fur32nRAGVk/s1600/text_demo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The structure of the text data (which contains palette info, tile info and screen positioning) is pulled straight from ROM. Although I imagine I will eventually extract such data structures so that they are completely native.&lt;br /&gt;&lt;br /&gt;I appreciate that drawing some text isn't particularly riveting, but the first steps in a project are always the most laborious. I'm pretty happy with the way things are going.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-9030347412495599597?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/9030347412495599597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=9030347412495599597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/9030347412495599597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/9030347412495599597'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/11/outrun-rewrite-begins.html' title='The OutRun Rewrite Begins'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_G8-NchROEFI/TNCgBxIxVNI/AAAAAAAAAFE/Fur32nRAGVk/s72-c/text_demo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4043063301170567904</id><published>2010-10-12T23:24:00.000+01:00</published><updated>2010-10-12T23:24:21.140+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>GOAL</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/TLTamKAFelI/AAAAAAAAAFA/5XHqlWuTjlQ/s1600/goal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_G8-NchROEFI/TLTamKAFelI/AAAAAAAAAFA/5XHqlWuTjlQ/s1600/goal.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Decompilation is complete:&lt;/b&gt; &lt;b&gt;13&lt;/b&gt; months later, over &lt;b&gt;400&lt;/b&gt; subroutines, ~&lt;b&gt;20,000&lt;/b&gt; of lines of commented assembler (a rough estimate) and countless late nights.&lt;br /&gt;&lt;br /&gt;Pretty much everything is done to a standard I'm satisfied with. But it's important to also consider what has been omitted:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Sitdown Motor Code&lt;/b&gt;. I have only decompiled a small portion of this, as it's not particularly useful for the rewrite. It's also hard to verify without a simulation of the hardware. Having said that, I've decompiled and commented the motor code for both the upright hardware variants. This could be adapted to a simple rumble controller easily.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Z80 Sound Code&lt;/b&gt;. Currently, this isn't needed. The master 68000 CPU triggers the sound samples and sets sample volumes for the engine pitch. Therefore, it's straightforward to work out what is going on without resorting to lower levels. I may decompile this at a later stage out of curiosity.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Complex Algorithms.&lt;/b&gt; There are a minor number of routines which, although commented and broadly understood, could be better explained by someone with a better knowledge of Maths/Physics than myself. In many cases it's obvious that a routine is performing a square root or similar. But there are certain routines that I might have not fully grasped. Nevertheless, I am confident I have done enough to convert these to meaningful C routines that aren't gibberish.&amp;nbsp;&lt;/li&gt;&lt;li&gt;I'm sure I'll find and fix mistakes in my comments as I convert the game.&lt;/li&gt;&lt;/ul&gt;The upcoming enormous challenge is to rewrite the game engine in comprehensible C++. I will be releasing the rewritten source code as I work, so that those interested can follow my progress. I initially expect visible results to be slow, so please be patient. If there are any questions, please post in the comments and I'll happily answer anything sensible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4043063301170567904?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4043063301170567904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4043063301170567904' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4043063301170567904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4043063301170567904'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/10/goal.html' title='GOAL'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_G8-NchROEFI/TLTamKAFelI/AAAAAAAAAFA/5XHqlWuTjlQ/s72-c/goal.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-7901883174423598721</id><published>2010-09-30T15:10:00.002+01:00</published><updated>2010-09-30T15:11:59.687+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Binary Translation, Emulation and Decompilation</title><content type='html'>Here's a &lt;a href="http://queue.acm.org/detail.cfm?id=945155"&gt;link&lt;/a&gt;&amp;nbsp;to an interesting article outlining the choice between binary translation and emulation. It might help convey why I'm taking a radical approach in porting OutRun and not automating binary translation.&amp;nbsp;As mentioned, binary translation&amp;nbsp;certainly&amp;nbsp;has its uses in producing code that can be hand optimised and altered. However, it ultimately results in code that is also&amp;nbsp;unwieldy and in hard to decipher.&lt;br /&gt;&lt;br /&gt;Even in cases where the original source code is available and can be translated by a tool, the results are often no better. I've worked with C code, automatically translated from 68k assembler, for a number of games during my days as a mobile developer. Often the output from such tools didn't resemble the target programming language in a meaningful manner.&lt;br /&gt;&lt;br /&gt;Although decompiling and manually rewriting OutRun is a massive task, hopefully the end results will yield code that is understandable, portable and easy to enhance. By the end of the year, I will have completed the decompilation phase and commented an estimated tens of the thousands of lines of assembler. Maybe the end results will be superior to the original source code in areas. It's hard to say, as I don't have access to it!&lt;br /&gt;&lt;br /&gt;One of the more gruelling aspects of the decompilation is the sheer amount of code. For example, I'm currently commenting code that controls the animation relating to smoke, dirt and other debris emitted from the Ferrari's wheels. The animation format and code to handle these routines differs yet again from all previous examples. I've lost count of how many animation formats the game contains.&lt;br /&gt;&lt;br /&gt;One of the reasons the code is so bulky is that the programmers have seemingly reinvented the wheel for various aspects of the game. It wouldn't be difficult to code a generalised animation system, at the expense of a small amount of speed.&amp;nbsp;As it is, many high-level features share little in terms of code or design despite relying on the same low-level routines. This results in a lot of code duplication.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-7901883174423598721?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/7901883174423598721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=7901883174423598721' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7901883174423598721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7901883174423598721'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/09/binary-translation-emulation-and.html' title='Binary Translation, Emulation and Decompilation'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-3200712767566379957</id><published>2010-09-08T23:54:00.002+01:00</published><updated>2010-11-14T11:12:23.528Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='easter eggs'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Unused Lap Time Code</title><content type='html'>There is a fair amount of unused code compiled into the OutRun ROMs. Much of it consists of redundant helper functions, that serve no interesting purpose.&lt;br /&gt;&lt;br /&gt;I came across an unused routine today that's slightly more interesting. Firstly, OutRun stores the 'lap-time' of each stage you've completed - even though this information isn't really made use of (other than showing your previous lap-time on passing the checkpoint).&lt;br /&gt;&lt;br /&gt;Either for debug purposes or as an unfinished feature the programmers included a routine to sequentially print these times during gameplay below the HUD.&lt;br /&gt;&lt;br /&gt;Entering the following command in the mame debugger will print the lap-time for a particular stage you've already completed in a race.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;d0 = x; pc = 7fea; g; [where x is the stage time to print]&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Here's an example screen grab:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_G8-NchROEFI/TIgTS8R4bAI/AAAAAAAAAE4/wpRc_SDyzgc/s1600/laptimes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_G8-NchROEFI/TIgTS8R4bAI/AAAAAAAAAE4/wpRc_SDyzgc/s320/laptimes.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Here, I'm on Stage 3 and I've printed the lap-times for the previous two stages using the unused code routine. The lack of apostrophes in the additional lap print outs indicate that this idea was probably pulled at an early stage.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Code decompilation is progressing nicely. I'm on track to finish this year. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-3200712767566379957?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/3200712767566379957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=3200712767566379957' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3200712767566379957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3200712767566379957'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/09/outrun-unused-lap-time-code.html' title='OutRun Unused Lap Time Code'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_G8-NchROEFI/TIgTS8R4bAI/AAAAAAAAAE4/wpRc_SDyzgc/s72-c/laptimes.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-8825989027239491964</id><published>2010-08-23T20:58:00.000+01:00</published><updated>2010-08-23T20:58:19.097+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Animation Format</title><content type='html'>I've disassembled the code relating to the animation sequences displayed after you complete a route. There are five animation sequences dependent on the route you've taken. I'd hoped that the animation format would be similar to the code to handle the animation sequences during collision, for example the Ferrari rolling over. Unfortunately it was completely different. &lt;br /&gt;&lt;br /&gt;If you're using the same revision of the ROMs as myself, you can trigger the sequences instantly in the MAME debugger with the following command:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;w@60be8 = x; pc = 9978; g [where x is the end sequence number 0-4]&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Animation frames&amp;nbsp; are stored in groups of 8 bytes, and formatted as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+00 [Byte] Sprite Colour Palette&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+01 [Byte] Bit 7: Make X Position Negative&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bits 4-6: Sprite To Sprite Priority&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bits 0-3: Top Bits Of Sprite Data Address&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+02 [Word] Sprite Data Address&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+04 [Byte] Sprite X Position&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+05 [Byte] Sprite Y Position&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+06 [Byte] Sprite To Road Priority&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+07 [Byte] Bit 7: Set To Load Next Block Of Sprite Animation Data To 0x1E&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bit 6: Set For H-Flip&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bit 4:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bits 0-3: Animation Frame Delay (Before Incrementing To Next Block Of 8 Bytes)&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Each sprite (or object if you like) is assigned an address containing the animation sequence data. The animation terminates when bit 7 of byte 7 of a chunk is set. Two other animations use the same format at the start of the game - the map waving the start flag, and the Ferrari driving in from the side of the screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-8825989027239491964?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/8825989027239491964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=8825989027239491964' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8825989027239491964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8825989027239491964'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/08/animation-format.html' title='Animation Format'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-8291439508576933199</id><published>2010-07-17T11:52:00.000+01:00</published><updated>2010-07-17T11:52:14.180+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Object Logic</title><content type='html'>The sun has been out, I changed jobs plus I'm getting married in a couple of months. These factors have conspired against me getting as much done lately. &lt;br /&gt;&lt;br /&gt;Having said that, I've finished decompiling and understanding the routines that handle both the logic of in-game objects and their rendering behaviour. In plain English, the scenery that makes up the levels. There are 15 routines in total with a lot of code duplication between them. The level object structure contains a field that denotes which routine should be used. &lt;br /&gt;&lt;br /&gt;One example is the checkpoint sign at the end of a stage. Each sign consists of two objects; the pillar of the sign and the header which reads "CHECK". Each part of the sign is drawn by a separate routine. The top of the checkpoint sign is drawn by a routine that also determines when the user has past the sign (to handle further game logic like loading the next stage). Whereas the base is handled by a similar routine that doesn't make this check. Additionally, there are two checkpoint signs at the end of each level and only one of them handles the check. Therefore, it cannot be assumed that because an object looks the same, it will always be handled by the same routine.&lt;br /&gt;&lt;br /&gt;There is further complexity in these routines. Let's take the water strip sprites, seen on the left hand side of Coconut Beach (Stage 1) as an example. Each strip is processed by a custom routine that examines its screen z value. If the z value is particularly close to the screen, the sprite is simply zoomed. However, at distances stretching into the horizon the frame is completely changed as well as zooming being applied. There are alternate versions of this routine that swap frames based on the y value of the sprite. This variant is only used on one of the Stage 5 levels. &lt;br /&gt;&lt;br /&gt;The palette changing logic for the countdown lights at the start of the game is also embedded as part of this logic. Some routines handle collision checking where necessary too. It's worth noting that I had to play all 15 levels just to understand where the routines were used. Simply looking at the code to figure out what was going on was impossible at times. &lt;br /&gt;&lt;br /&gt;Moving on, I'm going to work sequentially through the rest of the decompiled program code. I'm at a stage now where a significant amount of work is complete so there are just gaps to fill in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-8291439508576933199?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/8291439508576933199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=8291439508576933199' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8291439508576933199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8291439508576933199'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/07/object-logic.html' title='Object Logic'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4760042643036583777</id><published>2010-06-14T23:35:00.002+01:00</published><updated>2010-06-25T12:13:29.183+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Attract Mode Logic</title><content type='html'>The crash code is now complete, and it was more complex than I'd anticipated.&lt;br /&gt;&lt;br /&gt;On the other hand, the logic to automatically control the player's car during Attract Mode is a lot simpler. The code can be quite basic, because the traffic in OutRun intelligently attempts to move out of your way. A simple detail most home conversions didn't pick up upon.&lt;br /&gt;&lt;br /&gt;Here's a simplified pseudo-code conversion if you're interested:&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;pre&gt;AttractModeAI()&lt;br /&gt;{&lt;br /&gt;  // Check upcoming road segment for straight/curve.&lt;br /&gt;  // Choose route from pre defined table at road split.&lt;br /&gt;  AICheckRoad(); &lt;br /&gt; &lt;br /&gt;  // Set steering value based on upcoming road segment                  &lt;br /&gt;  AISetSteering();  &lt;br /&gt;  &lt;br /&gt;  // If speed is below a certain amount, just accelerate&lt;br /&gt;  if (car_speed &lt; 0xFA)&lt;br /&gt;  {&lt;br /&gt;    accelerator = MAX_VALUE;&lt;br /&gt;    return;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  // If AI Traffic is close, set brake on&lt;br /&gt;  if (traffic_close)&lt;br /&gt;  {&lt;br /&gt;    traffic_close = false;&lt;br /&gt;    brake = 0xC0;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  // If either wheel of the car is off-road&lt;br /&gt;  else if (wheels_offroad)&lt;br /&gt;  {&lt;br /&gt;    brake = 0xC0;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  // Upcoming road: Straight Road&lt;br /&gt;  if (road_type == STRAIGHT)&lt;br /&gt;  {&lt;br /&gt;    curve_counter = 0;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  // Upcoming road: Curved Road&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;    if (++curve_counter == 1)&lt;br /&gt;    {&lt;br /&gt;      // Set road curve value based on hard coded road data. &lt;br /&gt;      // High value = Sharper Bend&lt;br /&gt;      road_curve_value = value - 1;&lt;br /&gt;    }&lt;br /&gt;    // toggle brake on bends. &lt;br /&gt;    // The brake flickers on/off in OutRun attract mode&lt;br /&gt;    else if (road_curve_value != 0 &amp;&amp; ((road_curve_value &lt;= 0xA) &lt;br /&gt;            || (road_curve_value &amp; 8)))&lt;br /&gt;    {&lt;br /&gt;      brake = 0xA0;&lt;br /&gt;      road_curve_value--;&lt;br /&gt;      return;&lt;br /&gt;    }   &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  accelerator = MAX_VALUE;&lt;br /&gt;  return;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4760042643036583777?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4760042643036583777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4760042643036583777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4760042643036583777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4760042643036583777'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/06/attract-mode-logic.html' title='Attract Mode Logic'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6360056491297560719</id><published>2010-06-03T00:37:00.002+01:00</published><updated>2010-06-03T00:39:28.769+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Collision</title><content type='html'>I'm currently working on disassembling the OutRun collision and crash handling code.&lt;br /&gt;&lt;br /&gt;Once you start looking into the code in detail, you realise what an adventurous coding exercise OutRun is. I mean, how many ways do you need to crash in one game? Evidentally quite a lot... I can't quite fathom the level of detail they went into with regard to the collision routines. It's not sloppy coding as such, just simply attention to detail on an excessive scale. Sega&amp;nbsp; must have had a supply of strong caffeine in the 80s. &lt;br /&gt;&lt;br /&gt;Check out the graph I produced in IDA below of one of the main crash routines. This isn't even all of the collision and crash code, it's simply one function which can be toggled by the master jump table!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/TAboU460UyI/AAAAAAAAAEo/UhPXF4WTRPw/s1600/outrun_collision_graph.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://4.bp.blogspot.com/_G8-NchROEFI/TAboU460UyI/AAAAAAAAAEo/UhPXF4WTRPw/s400/outrun_collision_graph.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On a positive note, all the code blocks covered by the above graph are now decompiled and commented. On a negative note, mainly for my sanity, there are still more. Argh!&lt;br /&gt;&lt;br /&gt;There are two main types of crash in OutRun: hitting traffic and hitting scenery. Hitting scenery can be broken down into three new types of crash depending on the speed your travelling at. There's the low speed bump, where the car rises in the air (using the same movement lookup table as the birds flying on the logo in attract mode fact fans), the medium speed spin and the full speed flip. Each of these has multiple internal states to contend with and each crash factors in aspects like your speed, road curvature, height, whether there's a further crash resulting from the first crash and a selection of passenger animations. For example just the lower speed crashes offer a choice of the woman hitting the man, the man scratching head &amp;amp; girl tapping car, the man scratching head &amp;amp; girl pointing or man looking subdued and girl pointing.&lt;br /&gt;&lt;br /&gt;Also, whilst the object format of the crash routines bears some similarity to previous bits of code I decompiled, actually most of it is new. Plus the animation sequencing format seems to be different, though I figured that out too. &lt;br /&gt;&lt;br /&gt;PS I'm going to bed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6360056491297560719?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6360056491297560719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6360056491297560719' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6360056491297560719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6360056491297560719'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/06/collision.html' title='Collision'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_G8-NchROEFI/TAboU460UyI/AAAAAAAAAEo/UhPXF4WTRPw/s72-c/outrun_collision_graph.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4129925729901146543</id><published>2010-05-18T00:12:00.012+01:00</published><updated>2010-05-18T00:52:24.164+01:00</updated><title type='text'>An Interview With Alan Laird</title><content type='html'>&lt;a href="http://www.worldofspectrum.org/infoseekpub.cgi?regexp=%5EAlan+Laird$"&gt;Alan Laird&lt;/a&gt; worked on the Sinclair Spectrum and Amstrad CPC conversions of OutRun for Probe Software in 1988. Back in January 2000, I e-mailed him a series of questions about the conversion and he kindly took the time to answer.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; font-family: inherit; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/S_HNAShXZ2I/AAAAAAAAADM/nXuX5AP5Lpc/s1600/OutRun_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="313" src="http://4.bp.blogspot.com/_G8-NchROEFI/S_HNAShXZ2I/AAAAAAAAADM/nXuX5AP5Lpc/s320/OutRun_2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I've answered your questions below, its been over 10 years so my memory is a little bit hazy in places.....&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Firstly, how large was the team that worked on the Spectrum conversion, and how were the different tasks divided up?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Basically there were two people, &lt;a href="http://www.worldofspectrum.org/infoseekpub.cgi?regexp=%5EIan+Morrison$"&gt;Ian Morrison&lt;/a&gt; and myself. I've been out of touch with Ian for a number of years now so I don't know what he's doing.&lt;br /&gt;&lt;br /&gt;Ian did most of the 3D engine code and I did everything else, but towards the end of the project I was pretty much the only person on the Spectrum version as Ian started working on the ST version.&lt;br /&gt;&lt;br /&gt;We also did an Amstrad version based on the Spectrum code and John Bankier helped out with that.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How long did the conversion take?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Don't remember exactly. All I remember was that they wanted a Xmas release and the production house (Probe) got so paranoid about us running late that I ended up spending 2 weeks in their office in London. I think we got it done somewhere around early December after starting in the summer so about 4 or 5 months elapsed, this was whilst attending university, it was a rather stressful time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Were you initially worried that the Spectrum would not be capable of replicating the original machine, and what were the main difficulties you encountered?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Yes, very worried, but it was too much of an opportunity to pass up. Clearly speed would be a difficulty, Outrun has a lot of graphics on screen so keeping the frame rate up whilst drawing those was difficult. Secondly because we didn't have fancy bitmap scaling hardware like the arcade machine, we had to store each graphic at a range of different sizes. There was a trade off between having enough sizes so that the game looked reasonably smooth and the storage space.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What hardware and software was used to convert the game?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It was developed on a PC based system called PDS that some other game developers had hacked together. This was a pretty decent Z80 assembler/debugger environment and at the time I think we used some flavour of 286 with initially a 10M hard drive. There was a dedicated comms board plugged into the Spectrum and an ISA card in the PC to form a kind of parallel interface between the two. You could squirt the entire assembled code down to the Spectrum in a fraction of a second. Much easier than the previous system using microdrives, multi-part assembles and the interface 1 network.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Were the graphics and sound written from scratch, or were some elements borrowed from the other conversions?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Outrun was really the third in an evolving series of driving games. First we did Nightmare Rally which was an original idea that Ian and I put together and then hawked around games houses before Ocean published it. Off the back of that we got a contract from Activision to convert Enduro Racer. This added the element of a track to the game. And off of that we got the Outrun contract from Probe. At each iteration the graphics engine become more sophisticated. Turbo and Europa were even better, they had much more flexibility in the 3D engine,infinitely variable curves and hills in the road and were getting decent frame rates as well. Sound code always came from third party specialists.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S_HQyVRSDyI/AAAAAAAAADU/6oWDrISNnYQ/s1600/NightmareRally.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S_HQyVRSDyI/AAAAAAAAADU/6oWDrISNnYQ/s320/NightmareRally.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;&amp;nbsp;Nightmare Rally&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/S_HQzYmvQdI/AAAAAAAAADc/z5s2iczVgew/s1600/OutRun.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_G8-NchROEFI/S_HQzYmvQdI/AAAAAAAAADc/z5s2iczVgew/s320/OutRun.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;OutRun&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S_HQ0ZUKNiI/AAAAAAAAADk/Qr-QU8BFDcg/s1600/TurboOutRun.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S_HQ0ZUKNiI/AAAAAAAAADk/Qr-QU8BFDcg/s320/TurboOutRun.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Turbo OutRun&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Did you see or work on any of the other conversions, and if so, how do you think they compared?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As mentioned above I had a hand in the Amstrad version and Ian worked on the ST and Amiga versions. Amstrad was always difficult because it had the same processor as the Spectrum but twice as much video memory to move around. Amstrad users also hated getting Spectrum rewrites since they didn't take full advantage of the graphics flexibility. We didn't have much time on the Outrun conversion but Turbo and Europa were pretty decent. The ST and Amiga, although they were 16 bit 68000, still weren't terribly fast pieces of hardware and expectations were much higher so invariably they disappointed.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/S_HTSLK5-4I/AAAAAAAAAD0/rlKgsGn-n18/s1600/Out_Run_stage_1_%28cpc%29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_G8-NchROEFI/S_HTSLK5-4I/AAAAAAAAAD0/rlKgsGn-n18/s320/Out_Run_stage_1_%28cpc%29.png" /&gt;&lt;/a&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Amstrad CPC Conversion&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;How did you decide where to draw the line between graphical accuracy and speed? I ask this because the graphical accuracy on the game is outstanding, but one of the main criticisms at the time was that the speed suffered on certain stages.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There was a constant battle between me and the production house (Probe) over graphic density and speed. I wanted the game to look as realistic as possible and since I had full control over designing the course layouts I could put in lots of graphics to make it look good. Of course this brought the frame rate way down, I think it was averaging about 3fps in the end, but this game was never destined to be lightening fast.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A nerdy question: On the back of the OutRun packaging, the Spectrum screenshot is clearly different from the final game. The lorry is much larger and detailed, the sky is shaded differently, and the on-screen statistics are in different places. Why were these changes made, and does a copy of this early version still exist?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I think the graphic on the packaging was a mock up done by an artist so that it could get to the printers on time.&lt;br /&gt;&lt;br /&gt;The large graphics were one of the first victims to storage space. We would generate a series of graphics at different scaling factors from full size down to almost nothing in steps of say 10%. What you find is that the largest graphics are only on screen for a fraction of a second as you zoom by something and they take up the most space, so naturally they got dropped pretty quickly. If we'd had the space they could have been left in since they are on screen for such a small amount of time they hardly affected speed.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The multi-loading system used on OutRun was rather complex, as it would load levels into memory as the game progressed, whilst holding as many as possible at one time. Was it developed specifically for OutRun?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Don't really remember too much about this aspect. I think the 48K version could hold about 4 levels at any one time including the most recently played level. So if you took the same route through the game each time you didn't need to reload but if you took a different route you would need to. Again it was down to the space needed by graphics, they just wouldn't all fit at the same time. We did +3 versions of the later games which made the whole thing a lot easier.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Did Turbo Outrun and / or Outrun Europa use the same engine as OutRun, or were they written from scratch?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As I mentioned, they were evolutions of the Outrun engine. By the last one the engine was actually getting quite good. Rendering speed was much faster both for the 3D landscape and the graphical objects. Not bad for such a primitive machine, remember that the Z80 didn't even have hardware multiply and divide operations so imagine how cumbersome doing 3D graphics was. We did everything in fixed precision arithmetic, 8 bit whole part, 8 bit fractional part and implemented multiply  and divide using loops. For anything more complex like trig and log functions, we used pre-computed look up tables. Compare with today's Voodoo chipsets or a Dreamcast console, kids nowadays have it easy....&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Can you briefly summarise the work that you have done since Spectrum programming?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I finished off my undergraduate degree (in Comp Sci) and then did a postgrad degree. After that I joined Baring Securities (of Nick Leeson fame) which later became ING Barings, working there for 5 years in London and mostly Tokyo. Now I'm with Merrill Lynch in Tokyo managing a development team doing real-time stock trading systems in C++. Ian set up his own games production house call ICE which did Turbo and Europa amongst others. Last I heard, which was about 6 or 7 years ago, he was headed to the States.&lt;br /&gt;&lt;br /&gt;I lost interest in home computers for a long time and didn't really play games at all except for the odd arcade driving game until a couple of years ago when I got a couple of Voodoo cards for my work PC and discovered Quake. I've gotten right back into home computers now, although on a slightly different scale, with a network of Sun Sparcstations, a permanent internet connection and my own web sites. Its interesting to do a speed/memory/storage comparison of then and now. I started out with a 1K ZX81 and now I have 256M in my biggest machine, that's a quarter of a million times more memory amongst many other improvements. I still have all the old kit in my attic in London, maybe someday I'll dig it out and see if I can read those old microdrive catridges and floppy disks.&lt;br /&gt;&lt;br /&gt;Hope this was interesting, it has been for me going back to those days and from all the interest on the web I see that the old games still live on. Thanks to everyone who's taken the time to collate information, build emulators and collect games.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Alan Laird - 2/1/2000.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Another article regarding the conversion can be found in the following issue of Sinclair User magazine from 1988:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.worldofspectrum.org/showmag.cgi?mag=SinclairUser/Issue072/Pages/SinclairUser07200045.jpg"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_G8-NchROEFI/S_HUL0ynI6I/AAAAAAAAAD8/e7cJXNxe_cw/s320/background.jpg" width="230" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4129925729901146543?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4129925729901146543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4129925729901146543' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4129925729901146543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4129925729901146543'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/05/interview-with-alan-laird.html' title='An Interview With Alan Laird'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_G8-NchROEFI/S_HNAShXZ2I/AAAAAAAAADM/nXuX5AP5Lpc/s72-c/OutRun_2.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-7045825909878734317</id><published>2010-05-11T23:24:00.003+01:00</published><updated>2011-09-24T17:10:45.049+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='easter eggs'/><category scheme='http://www.blogger.com/atom/ns#' term='version differences'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Easter Egg - The Definite Guide!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;For a while it's been known that on some versions of OutRun holding the start button, just before a checkpoint, will reveal a secret message: "PROGRAM YU SUZUKI 1986 SEP".&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/S-nUhWPXcqI/AAAAAAAAAC0/TIcKqlfEN4w/s1600/egg1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_G8-NchROEFI/S-nUhWPXcqI/AAAAAAAAAC0/TIcKqlfEN4w/s320/egg1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;However, it's also been known that this easter egg &lt;a href="http://klov.net/game_detail.php?game_id=8938"&gt;does not work on all versions&lt;/a&gt; of the game. &lt;br /&gt;&lt;br /&gt;Well, that's until now. I've decompiled the code related to this and will list the differences below, including how to enable this easter egg on later revisions of the game.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sitdown/Upright Revision A:&lt;/b&gt; This version works as stated. Just before any checkpoint, hold start (just before the sky is due to cycle to the upcoming level colour) to reveal the message. Easy.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sitdown/Upright Revision B: &lt;/b&gt;Activating the egg on this version is more complex. First you will will need to achieve a high score, and enter "&lt;b&gt;YU.&lt;/b&gt;" as your name, complete with trailing full-stop.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S-nXGAQ_cRI/AAAAAAAAAC8/Axn5vQxpvZU/s1600/0006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S-nXGAQ_cRI/AAAAAAAAAC8/Axn5vQxpvZU/s320/0006.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Furthermore, the easter egg can only be activated when transitioning from Stage 2 to Stage 3 on this version of the game. Yes, they've actually included extra code to handle this. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/S-nXNW_jK7I/AAAAAAAAADE/GSXonhKWQds/s1600/egg2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_G8-NchROEFI/S-nXNW_jK7I/AAAAAAAAADE/GSXonhKWQds/s320/egg2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It should also be noted that the egg can &lt;i&gt;only be displayed once&lt;/i&gt; and is then deactivated. Also, if the user enters "&lt;b&gt;YU.&lt;/b&gt;" again on the high score table, the egg will also be deactivated. I'm not certain why this required such a rewrite - it's not as if it allows the user to cheat in the game.&lt;br /&gt;&lt;br /&gt;The easter egg code is buried in the middle of a routine to handle setting up the sky palette fade from one level to the next. Which possibly indicates that the programmer wanted to keep the code hidden from more common routines that were shared with the team. I wonder who wrote this piece of code, and why it was heavily altered between revisions?&lt;br /&gt;&lt;br /&gt;Aside from that I've completely disassembled the entire service test code - which enabled me to figure out a bunch of minor book keeeping information. I've also disassembled the palette changing code that handles the road, ground and sky when transitioning between levels. I've even disassembled some rather dull code relating to the coin chutes. Next - there's a load of tilemap code to be looked at. The quest continues!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-7045825909878734317?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/7045825909878734317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=7045825909878734317' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7045825909878734317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7045825909878734317'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/05/outrun-easter-egg-definite-guide.html' title='OutRun Easter Egg - The Definite Guide!'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_G8-NchROEFI/S-nUhWPXcqI/AAAAAAAAAC0/TIcKqlfEN4w/s72-c/egg1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-7470164371409720738</id><published>2010-05-01T00:28:00.003+01:00</published><updated>2010-05-01T00:30:15.040+01:00</updated><title type='text'>Service Test</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I'm debugging the service test code at the moment. After some of the  recent decompilation work, I fancied something easy.&amp;nbsp; Nevertheless there are still some cool things to be discovered.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;One  thing you'll notice in MAME, is that the "Motor Test" fails:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S9tlQ0oimNI/AAAAAAAAACk/N1V6lpETlTc/s1600/motor_test1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S9tlQ0oimNI/AAAAAAAAACk/N1V6lpETlTc/s320/motor_test1.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The motor test, which only runs if the DIP switches are set to the Moving cabinet type, essentially moves the cabinet from left to right. The limit switches activate at the extremities and the pot values from the motor are recorded. A magnet also detects the centre position.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I quickly hooked up a simulation of the motor hardware in the Jemu2 driver I coded, using knowledge from the decompilation. Here are the results:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/S9tl7vcMEnI/AAAAAAAAACs/BSQydJRmfWM/s1600/motor_test2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_G8-NchROEFI/S9tl7vcMEnI/AAAAAAAAACs/BSQydJRmfWM/s320/motor_test2.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Notice that there are no error messages, and the values are correctly recorded.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As far as I can see register &lt;b&gt;0x140001&lt;/b&gt; works as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Bit 3 = Set to indicate left limit reached&lt;br /&gt;Bit 4 = Set to indicate centre reached&lt;br /&gt;Bit 5 = Set to indicate right limit reached&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The desired motor position is written to register &lt;b&gt;0x140003&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The actual motor position can by read by writing '12' to the analogue select register &lt;b&gt;0x140012&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-7470164371409720738?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/7470164371409720738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=7470164371409720738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7470164371409720738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7470164371409720738'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/05/service-test.html' title='Service Test'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_G8-NchROEFI/S9tlQ0oimNI/AAAAAAAAACk/N1V6lpETlTc/s72-c/motor_test1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-1266947126045468337</id><published>2010-04-14T11:12:00.010+01:00</published><updated>2010-11-11T11:25:35.359Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Memorabilia'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Finally, my gold plated Ferrari is here!</title><content type='html'>&lt;div style="font-family: inherit;"&gt;In my unending quest to fill my house with OutRun related junk, I picked up the following Sega OutRun branded gold Ferrari:&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: inherit; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S8WSt7l4O7I/AAAAAAAAAB8/PVmkqv-F1qI/s1600/18mar85.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S8WSt7l4O7I/AAAAAAAAAB8/PVmkqv-F1qI/s320/18mar85.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;The seller had this to say, I've no idea how accurate this information is with regard to the number produced:&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote style="font-family: inherit;"&gt;Rare Sega "Out Run" Commemorative Ferrari 1986&lt;br /&gt;Custom cast, gold plated, all metal scale model Ferrari Testerossa&lt;br /&gt;Approx. 4 3/4" long x 1 1/8" high and weighs about 1.5lb&lt;br /&gt;Fewer than 100 were produced and presented to the top tier arcade game distributors.&lt;br /&gt;The model's exterior rear view mirrors while no longer attached, can be easily re-mounted and are included with the purchase &lt;/blockquote&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;The only other information I can find this, and in fact the only other mention of it I've come across is on the &lt;a href="http://outrun.org/OutRun/View.aspx?Res=1680&amp;amp;GroupID=18&amp;amp;ArticleID=43"&gt;following webpage&lt;/a&gt;:&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;blockquote style="font-family: inherit;"&gt;The only information I know about it is that it was given out by Sega, apparently as part of a trophy to retailers who sold copies  of Outrun.  The back of the car, right behind the rear window, "OutRun"  is engraved in it, and the license plate says "Sega".  The bottom also  has a nut on it, which is a definite indication that it is the top piece  to some kind of trophy.  After I bought it 8 years ago, I have never  been able to find any other information on it since.&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;Intrigued, I asked for a bit more information and it seems they were samples for an advertising promotion:&lt;/div&gt;&lt;br /&gt;&lt;blockquote style="font-family: inherit;"&gt;They were salesman samples so they are  quite rare, They were made to show Sega some of the advertising  possibilities they could choose from and I got them directly from the  salesman who had them made. He tells me they were never displayed, only  passed around by top executives at Sega.&lt;/blockquote&gt;&lt;div style="font-family: inherit;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/S8WUM3blaKI/AAAAAAAAACE/SO9erxWAQMs/s1600/18mar84.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_G8-NchROEFI/S8WUM3blaKI/AAAAAAAAACE/SO9erxWAQMs/s320/18mar84.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_G8-NchROEFI/S8WUOp2cWSI/AAAAAAAAACM/h6ssAkmDFdk/s1600/18mar86.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_G8-NchROEFI/S8WUOp2cWSI/AAAAAAAAACM/h6ssAkmDFdk/s320/18mar86.jpg" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/S8WUPYusBBI/AAAAAAAAACU/mDbKcDgkZPs/s1600/18mar87.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_G8-NchROEFI/S8WUPYusBBI/AAAAAAAAACU/mDbKcDgkZPs/s320/18mar87.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S8WUQSEqs2I/AAAAAAAAACc/x_M3yssSAZQ/s1600/18mar91.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S8WUQSEqs2I/AAAAAAAAACc/x_M3yssSAZQ/s320/18mar91.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;A gold plated Golden Axe branded axe was also thrown in with the bundle.&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;Does anyone else own one of these? And does anyone know whether it was in fact part of a trophy?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-1266947126045468337?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/1266947126045468337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=1266947126045468337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1266947126045468337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1266947126045468337'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/04/finally-my-gold-plated-ferrari-is-here.html' title='Finally, my gold plated Ferrari is here!'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_G8-NchROEFI/S8WSt7l4O7I/AAAAAAAAAB8/PVmkqv-F1qI/s72-c/18mar85.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-1651886013463879475</id><published>2010-04-12T21:29:00.001+01:00</published><updated>2010-04-12T21:30:25.270+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Progress Update</title><content type='html'>Quick update on what I've been upto over the past week. I've decompiled and commented the following code: &lt;br /&gt;&lt;br /&gt;- Palette setup for ground colour, road colours etc.&lt;br /&gt;- Palette setup for sky shading effect&lt;br /&gt;- Code to convert internal increment value to user friendly KP/H display. Including tile blitting.&lt;br /&gt;- Code to setup the speed at which to scroll the sprites. This is  independent from the road scrolling.&amp;nbsp; &lt;br /&gt;- Code to adjust x position of the car based on the curvature of the road, to ensure car 'sticks' to the road on curves.&lt;br /&gt;- Code to convert steering value from hardware to a meaningful change in x position &lt;br /&gt;- Code to prevent car from straying too far from the boundaries of the road.&lt;br /&gt;&lt;br /&gt;There is still a LOT of code to go. This is a long slog!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-1651886013463879475?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/1651886013463879475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=1651886013463879475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1651886013463879475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1651886013463879475'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/04/progress-update.html' title='Progress Update'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-1901750716854744166</id><published>2010-04-12T21:21:00.000+01:00</published><updated>2011-09-24T17:09:55.542+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='version differences'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Version Differences</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: left;"&gt;Here are some details of the visual differences between&amp;nbsp; the first revision of the OutRun ROMs (deluxe sitdown) and the final revision (sitdown/upright, Rev B).&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Notice the omission of "Select Music By Steering" on the original version:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/S8N8fNWyQgI/AAAAAAAAAA0/OkNd4KNVO94/s1600/0006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="224" src="http://4.bp.blogspot.com/_G8-NchROEFI/S8N8fNWyQgI/AAAAAAAAAA0/OkNd4KNVO94/s320/0006.png" width="320" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_G8-NchROEFI/S8N8bzdX1TI/AAAAAAAAAAs/_W0JHVjzI1E/s1600/0002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_G8-NchROEFI/S8N8bzdX1TI/AAAAAAAAAAs/_W0JHVjzI1E/s320/0002.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Stage 1, Coconut Beach, has a different track layout.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Notice the absence of scenery on the right hand side, and in the central reservation.&lt;/div&gt;&lt;div style="text-align: center;"&gt;The dual lanes at the start of the track also merge more quickly into a single road on this version.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S8N9mzbaOYI/AAAAAAAAAA8/7GCYJpMf5hk/s1600/0016.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S8N9mzbaOYI/AAAAAAAAAA8/7GCYJpMf5hk/s320/0016.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Notice the strange positioning of the Flamingo huts on the right hand side of the road. These are replaced with palm trees on the later revision. &lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S8N91tf7EBI/AAAAAAAAABE/fXbRFv4A7ec/s1600/0017.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S8N91tf7EBI/AAAAAAAAABE/fXbRFv4A7ec/s320/0017.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp; &lt;span id="goog_864327015"&gt;&lt;/span&gt;&lt;span id="goog_864327016"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;The well documented course map differences. Older revision shown top. I presume the levels were reordered, so that the more visually impressive levels were shown earlier in the game.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/S8N-OHV7l4I/AAAAAAAAABM/hpdaRoK1JKc/s1600/0014.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_G8-NchROEFI/S8N-OHV7l4I/AAAAAAAAABM/hpdaRoK1JKc/s320/0014.png" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S8N-R2-y9UI/AAAAAAAAABU/D0tkCXwcMas/s1600/0005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S8N-R2-y9UI/AAAAAAAAABU/D0tkCXwcMas/s320/0005.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Service Test. Lack of Backup Ram clearing.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/S8N_QTRuAVI/AAAAAAAAABc/5tUSx95w4VY/s1600/0000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_G8-NchROEFI/S8N_QTRuAVI/AAAAAAAAABc/5tUSx95w4VY/s320/0000.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/S8N_UADzjgI/AAAAAAAAABk/DtX1NZ-A6zM/s1600/0000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_G8-NchROEFI/S8N_UADzjgI/AAAAAAAAABk/DtX1NZ-A6zM/s320/0000.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Memory Test. Deluxe Sitdown and later revisions. &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/S8N_zjytxkI/AAAAAAAAABs/a33JWcUL0OY/s1600/0001_alternate_tests.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_G8-NchROEFI/S8N_zjytxkI/AAAAAAAAABs/a33JWcUL0OY/s320/0001_alternate_tests.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_G8-NchROEFI/S8OAJumbaJI/AAAAAAAAAB0/WMgGV5WDUZk/s1600/0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_G8-NchROEFI/S8OAJumbaJI/AAAAAAAAAB0/WMgGV5WDUZk/s320/0001.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Can anyone find any more? Once I complete the disassembly of OutRun, then it will be easier to compare the revisions to find out what other subtle, non-visual, changes were made. &lt;/div&gt;&lt;span id="goog_864326999"&gt;&lt;/span&gt;&lt;span id="goog_864327000"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-1901750716854744166?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/1901750716854744166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=1901750716854744166' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1901750716854744166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1901750716854744166'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/04/outrun-version-differences.html' title='OutRun Version Differences'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_G8-NchROEFI/S8N8fNWyQgI/AAAAAAAAAA0/OkNd4KNVO94/s72-c/0006.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-565044171466874460</id><published>2010-04-08T10:22:00.001+01:00</published><updated>2010-04-08T10:23:52.469+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Code Reuse At Sega</title><content type='html'>Out of curiosity, and to follow up a &lt;a href="http://reassembler.blogspot.com/2010/02/c-compilers.html"&gt;previous post&lt;/a&gt;, I examined some of the &lt;a href="http://www.system16.com/hardware.php?id=697&amp;amp;page=1#1844"&gt;Super Hang-On&lt;/a&gt; code to figure out the level of code reuse between the games as they share the same hardware. A quick glance at the code shows that a lot of the core routines, responsible for generating the road detailed in &lt;a href="http://reassembler.blogspot.com/2010/03/outrun-automapping-tool.html"&gt;this post&lt;/a&gt; are identical. It appears that the slave CPU code to handle road splits is removed from Super Hang-On.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_G8-NchROEFI/S72gJVvZchI/AAAAAAAAAAU/o2OZ4NAabqs/s1600/118124217619.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_G8-NchROEFI/S72gJVvZchI/AAAAAAAAAAU/o2OZ4NAabqs/s320/118124217619.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It's probably not a surprise, given that there are other obvious  similarities between the titles, including some of the sampled sounds  being identical.&lt;br /&gt;&lt;br /&gt;Now the OutRun hardware supports two road layers. But as far as I know, Super Hang-On only uses a single road layer. Interestingly, there was a &lt;a href="http://www.system16.com/hardware.php?id=696&amp;amp;page=1#1841"&gt;conversion of Super Hang-On&lt;/a&gt; to the Space Harrier hardware, which only supports a single road layer. Presumably, OutRun wasn't converted in the same manner, because of its reliance on two road layers for the wider roads (even when two distinct roads aren't displayed, the two road layers are sometimes in use). &lt;br /&gt;&lt;br /&gt;One other example of code reuse I've found is between OutRun and Sonic the Hedgehog 2 on the Megadrive. Both games share the same random number generator, right down to the default random seed that's used.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-565044171466874460?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/565044171466874460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=565044171466874460' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/565044171466874460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/565044171466874460'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/04/code-reuse-at-sega.html' title='Code Reuse At Sega'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_G8-NchROEFI/S72gJVvZchI/AAAAAAAAAAU/o2OZ4NAabqs/s72-c/118124217619.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6078807802962569163</id><published>2010-04-07T17:47:00.003+01:00</published><updated>2011-09-09T18:11:10.366+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Yu Suzuki Interview</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Back in 2008, RetroGamer magazine ran an interview with Yu Suzuki  discussing the development of OutRun.&lt;br /&gt;&lt;br /&gt;The article can  be read online &lt;a href="http://www.nowgamer.com/features/894882/the_making_of_outrun.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_G8-NchROEFI/S7yzrUsBHoI/AAAAAAAAAAM/iyuQso0R-UQ/s1600/rg54_cover_small.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_G8-NchROEFI/S7yzrUsBHoI/AAAAAAAAAAM/iyuQso0R-UQ/s320/rg54_cover_small.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It's interesting to read about the features that didn't make it into the   final game:&amp;nbsp; &lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;“Because of budget and development time limitations, some of the  contents I’d planned had to be squeezed or cut. I’d made preparations  for eight individual characters and I wanted to include various events  at each checkpoint, which would have made the player experience a story;  something like the Cannonball Run film. I also wanted to give players a  choice of supercars to drive, so that they could enjoy differences in  car performance.”&lt;/blockquote&gt;&lt;br /&gt;Personally, I'm pleased the checkpoint events didn't make it, as they'd have potentially spoilt the flow of the gameplay. The changeable characters make sense, as the player sprites are drawn separately from the car sprite and have a table of offset co-ordinates. This also allows the car sprite to be horizontally flipped (it wouldn't look good if the players swapped seats, as per the Amiga port). There's no mention of the dual direction traffic that I uncovered in the game code though... :) &lt;br /&gt;&lt;br /&gt;In other news, I've returned to working on the Master CPU decompilation at the moment. There's still a heck of a lot of code to plough through, but it's relatively trivial compared with the previous Slave CPU work.&lt;br /&gt;&lt;br /&gt;One subtlety that I noticed whilst working on the code is that the position of the shadows in the game change dependent on which direction the car is facing (in practical terms it's set by the x position of the tilemap backdrop). This attention to detail is somewhat outstanding - I'd never even noticed this previously...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6078807802962569163?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6078807802962569163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6078807802962569163' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6078807802962569163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6078807802962569163'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/04/outrun-yu-suzuki-interview.html' title='OutRun Yu Suzuki Interview'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_G8-NchROEFI/S7yzrUsBHoI/AAAAAAAAAAM/iyuQso0R-UQ/s72-c/rg54_cover_small.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-8068845094463599872</id><published>2010-03-10T14:02:00.000Z</published><updated>2010-03-10T14:02:49.013Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Automapping Tool</title><content type='html'>At last! I've completed my disassembly of OutRun's slave CPU code. This was by far the most difficult part of the project to date. First, a quick summary of how the road data is stored.&lt;br /&gt;&lt;br /&gt;The road data is split into three main components:&lt;br /&gt;&lt;br /&gt;1/ &lt;b&gt;The path that the road takes.&lt;/b&gt; This is stored as a set of words. Each word ultimately represents the x change of the next road segment, and length of that segment. This data is parsed by a series of functions that interpolate the data and create a nice smooth curve, dependent on the adjacent road segments.&lt;br /&gt;&lt;br /&gt;It should be noted that this data does not control the width of the road, the height of the road or how many road layers are enabled.&lt;br /&gt;&lt;br /&gt;From what I've seen each stage has a unique path and no data is reused. However, the road split at the end of each segment is reused and the data is mirrored on the x-axis to create the road split.&lt;br /&gt;&lt;br /&gt;2/ &lt;b&gt;The height of the road segment.&lt;/b&gt; This is divided into a series of segments. Multiple segments are applied to any stage and are reused between stages. &lt;br /&gt;&lt;br /&gt;3/&lt;b&gt; The width of the road segment. &lt;/b&gt;This is actually controlled by the Master CPU. I've disassembled the relevant code, but will revisit it at some stage soon.&lt;br /&gt;&lt;br /&gt;Finally, the x1, x2 co-ordinates of the road segment are used by the sprite hardware and the scenery positioned on the level.&lt;br /&gt;&lt;br /&gt;Interestingly, this means that Outrun's road layer is very dynamic. It's possible to swap the sprites from one stage, with the road data from another. And it's easy to change the height mapping of any point of a level. Very little is hardcoded in terms of screen positioning, and the final world is very much generated in realtime. It's easy to see why an entire 68000 CPU was dedicated to this one task. &lt;br /&gt;&lt;br /&gt;As a test of my understanding, I've already converted some of the functions from assembler to a quick java utility. This utility can output the path (point 1 of the list above) of any stage of the game as a CSV file that can be represented by Microsoft Excel. So now it's easy to create an accurate visual map of all the levels, to aid players of the game. Admittedly, once I amend this tool to take the width into account, it will be more useful. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/graph.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/graph.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here is a &lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/graph_stage1.pdf"&gt;link to an example from Stage 1&lt;/a&gt; (coconut beach). As mentioned, this map doesn't contain the road split information at the end of the level.&lt;br /&gt;&lt;br /&gt;Finally, pleased and amused that people have found the blog interesting - most unexpected. Keep the comments coming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-8068845094463599872?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/8068845094463599872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=8068845094463599872' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8068845094463599872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8068845094463599872'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/03/outrun-automapping-tool.html' title='OutRun Automapping Tool'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-7154245197139455386</id><published>2010-03-04T22:11:00.001Z</published><updated>2010-03-04T22:29:05.786Z</updated><title type='text'>This blog has moved</title><content type='html'>&lt;br /&gt;       This blog is now located at http://reassembler.blogspot.com/.&lt;br /&gt;       You will be automatically redirected in 30 seconds, or you may click &lt;a href='http://reassembler.blogspot.com/'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;       For feed subscribers, please update your feed subscriptions to&lt;br /&gt;       http://www.massdestruction.co.uk/jsnes/atom.xml.&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-7154245197139455386?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://reassembler.blogspot.com/' title='This blog has moved'/><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/7154245197139455386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=7154245197139455386' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7154245197139455386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7154245197139455386'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/03/this-blog-has-moved.html' title='This blog has moved'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-7670945567463408084</id><published>2010-02-22T17:16:00.005Z</published><updated>2010-04-08T10:03:47.694+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>C Compilers</title><content type='html'>Following my previous post, where I questioned whether Gauntlet's code was written in C as opposed to assembler, I've come to the realisation that OutRun's slave CPU code was probably generated by a compiler and is not hand-written assembler. &lt;br /&gt;&lt;br /&gt;The slave CPU controls the road rendering. So essentially it generates the curves, height variation, road splitting and appearance, from the level data. &lt;br /&gt;&lt;br /&gt;This has added an extra layer of obfuscation to the decompilation, as the resulting code is less logical and is convoluted to follow. Maybe AM2 had spare CPU cycles to play with, and decided to simplify the source code to this complex area by writing the code in C, as opposed to assembly code as used by the main CPU. &lt;br /&gt;&lt;br /&gt;One of the first instructions sets one of the address registers to point at the start of RAM:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;lea ($60000).l,a5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The a5 register is never changed and there seems to be an over-reliance on using this block of memory, where a data register would be much faster:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;move.l  d1,$712(a5)&lt;br /&gt;; ...&lt;br /&gt;add.l   $712(a5),d2     ; Why not use add.l d1,d2?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And then there are blocks of code that are just pure spaghetti or irrelevant. I don't know much about compilers, but back in 1986 it's clear they produced dreadful code.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ROM:00001C80 tst.w   $720(a5)&lt;br /&gt;ROM:00001C84 beq.w   *+4          ; What is this here for?&lt;br /&gt;ROM:00001C88 addi.w  #$100,d1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;On the other hand, a quick look at Gauntlet's code in Mame's debugger does not seem to yield equal levels of insanity. Maybe Gauntlet was coded in assembler after all.&lt;br /&gt;&lt;br /&gt;I'd like to know what compiler Sega/AM2 were using. Does anyone know if it's possible to determine from a signature in the code? Is C the likely source language?&lt;br /&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;UPDATE:&lt;/b&gt;&lt;span style="color: red;"&gt; &lt;span style="color: black;"&gt;Some useful information in the comments below. Thanks to the help of a couple of readers, it's possible that portions of this code have been adapted from a previous Sega title that uses similar road hardware. The original Hang-On from 1985 could be a contender, despite the road hardware differing. Would have to examine the code to be sure. I'd assume that Super Hang On, released after OutRun, which had identical road hardware, reuses this code.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&lt;span style="color: black;"&gt;This would also explain why certain blocks of code are unused, the alternate coding style and the relative addresses. As pointed out, you might expect to see NOPs and other quirks&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt; if C compiled.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;UPDATE 2:&lt;/b&gt;&lt;span style="color: black;"&gt; Checked Super Hang-On, which runs on the OutRun hardware. A quick look through its slave CPU code reveals much of it is identical.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-7670945567463408084?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/7670945567463408084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=7670945567463408084' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7670945567463408084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7670945567463408084'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/02/c-compilers.html' title='C Compilers'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-2987409501405692169</id><published>2010-02-02T15:28:00.002Z</published><updated>2010-02-02T15:29:31.555Z</updated><title type='text'>C Compilers for 68000</title><content type='html'>Reading &lt;a href="http://www.edge-online.com/magazine/the-making-of-gauntlet"&gt;The Making of Gauntlet&lt;/a&gt;, I was interested to read the following comment:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;With the switchover from the 6502 to the more capable 68000  microprocessor, the development environment at Atari had changed  considerably. “We were actually entering our own code at this point. Our  development tools changed, too. We were now programming in C instead of  assembly language,” says Logg.&lt;/blockquote&gt;&lt;br /&gt;Was the game really programmed in C, as opposed to assembler, back in 1985 or is Ed Logg remembering this wrongly? Firstly, the &lt;a href="http://www.system16.com/hardware.php?id=766"&gt;Gauntlet hardware&lt;/a&gt; consisted of a 68010 CPU (not the 68000), with a 6502 for sound. Secondly, C compilers in the mid-80s weren't as robust and optimised as today. I can envisage a front-end or name entry screen being programmed in C. But I would expect the majority of the game engine to be assembler for performance reasons. Especially when the article mentions that optimisation was required to ensure the game ran acceptably with so many characters on-screen.&lt;br /&gt;&lt;br /&gt;Does anyone have any thoughts on this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-2987409501405692169?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/2987409501405692169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=2987409501405692169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2987409501405692169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2987409501405692169'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/02/c-compilers-for-68000.html' title='C Compilers for 68000'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-7980638853517258019</id><published>2010-01-14T14:36:00.002Z</published><updated>2010-11-11T11:27:34.538Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='easter eggs'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Hidden Voices</title><content type='html'>If you try OutRun's Sound Test, you'll notice there are four voices you can apparently play. These are the speech samples &lt;i&gt;Get Ready&lt;/i&gt;, &lt;i&gt;Congratulations&lt;/i&gt; and &lt;i&gt;Check Point&lt;/i&gt;. The forth sample, "Voice 4", doesn't work. If, like me, you've lost sleep over such a monumental issue - read on!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/outrun_doing_great.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/outrun_doing_great.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The elusive fourth voice is, in fact, still in the ROM files, namely those containing the &lt;a href="http://en.wikipedia.org/wiki/PCM"&gt;PCM sample data&lt;/a&gt;. You can import these ROMs straight into a sound editor like &lt;a href="http://audacity.sourceforge.net/"&gt;Audacity&lt;/a&gt; and play them. I imported the raw files as PCM 8-bit unsigned, with a sample rate of 8000Hz. Note that the sample rate of the individual samples does differ though. &lt;br /&gt;&lt;br /&gt;The 192K of sample data is stored across the following files:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;opr10188.71&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;opr10189.70&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;opr10190.69&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;opr10191.68 - This file contains Voice 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;opr10192.67&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;opr10193.66&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These PCM files contain all samples from the drums used in the music, through to the sound effects and speech. &lt;br /&gt;&lt;br /&gt;You can hear an mp3 I exported of the voice &lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/outrun_doing_great.mp3"&gt;here&lt;/a&gt;. The voice is "You're Doing Great", and seems to be stored at around 4000Hz, which is a lower sample rate than the other voices, which are at 8000Hz. I imagine the sample was removed because the designers couldn't figure out a good way of invoking it.&amp;nbsp; There is already a voice at the checkpoint stage, which is the main way of determining your progress. Using the voice mid-level, based on your current position and time, could have created bugs or just not proved that compelling. &lt;br /&gt;&lt;br /&gt;I should admit that I haven't debugged the sound code much, so a lot of this is based on pretty rough experimentation. I haven't delved into the code to see if it's easy to hook this sound up somewhere with brief debugging. There are certainly no high-level calls from the 68000 code, as I've listed every sound that can be played (and there are more than just those in the sound test). Looking at the Z80 code might yield more information. But I don't envisage having to port this directly, as I am planning with the 68000 code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Thanks to the &lt;a href="http://www.jammaplus.co.uk/"&gt;JAMMA+&lt;/a&gt; forum I've been informed this hidden voice is apparently used in Space Harrier. So maybe the OutRun developers started by using some of the Space Harrier code as a framework. Certainly some of the error messages are the same as shown in previous blog posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-7980638853517258019?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/7980638853517258019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=7980638853517258019' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7980638853517258019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/7980638853517258019'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/01/hidden-voices.html' title='Hidden Voices'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6766872717373839230</id><published>2010-01-12T12:12:00.000Z</published><updated>2010-01-12T12:12:25.728Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Level Select</title><content type='html'>Yesterday proved a little more fun. Whilst debugging the slave road CPU code, I figured out how to change the level order in OutRun. Using this, you could easily make a level select. Also found a way to have the road data from one level, with the object data from another. It doesn't always work, but does allow you to make some interesting permutations. Some level data for Stage 1 is also hardcoded, but when I finally rewrite the engine in C, this will be trivial to solve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6766872717373839230?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6766872717373839230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6766872717373839230' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6766872717373839230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6766872717373839230'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/01/level-select.html' title='Level Select'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-5741658710621893264</id><published>2010-01-11T11:56:00.000Z</published><updated>2010-01-11T11:56:37.616Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Slave CPU Code</title><content type='html'>Spent most of yesterday working on the code that runs on the slave CPU. On a positive note, there isn't much of it. The code is minimal compared with the main CPU. It's a loop that handles rendering the road. On a negative, progress is slow. I spent most of the afternoon trying to figure out a few hundred lines of assembler and now feel like gouging my eyes out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-5741658710621893264?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/5741658710621893264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=5741658710621893264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5741658710621893264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5741658710621893264'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/01/slave-cpu-code.html' title='Slave CPU Code'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4739059740998185731</id><published>2010-01-05T00:22:00.003Z</published><updated>2010-03-02T13:41:45.535Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Outrun Unidesa Manual</title><content type='html'>I've had no free time lately. But the following manual arrived in the post:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/unidesa_manual.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/unidesa_manual.png" width="229" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It's an OutRun arcade manual from a Spanish company called Unidesa (Universal De Desarrollos Electronicos S.A.) who seem to have licensed OutRun at some stage. The company still exists and has a website &lt;a href="http://www.unidesagamingsystems.com/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I expected it to be a straight translation of the common English Sega manual that can be found at &lt;a href="http://www.klov.com/game_detail.php?game_id=8938"&gt;KLOV&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Whilst the manual initially does contain translations of the service tests and dip switch settings, it interestingly contains additional technical information not present in the Sega manual. Most importantly, it contains a fantastic diagram of the OutRun PCB, with all components labelled. If I had a scanner, I would scan these in, but for now I will simply list the additional pages. The diagrams are &lt;i&gt;not&lt;/i&gt; hand drawn, like the English Sega manual.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1/ Video Board Block Diagram:&lt;/b&gt;&lt;br /&gt;- Video board clearly divided into labelled components including ROM, RAM, Power Outputs and the explanations of what functions the other areas of the board performs. Each component is numbered. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2/ CPU Board Block Diagram&lt;/b&gt;&lt;br /&gt;- Similar to the above. Divided into Main CPU, Slave CPU, Road Character Generator etc.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3/ General Wiring&lt;/b&gt;&lt;br /&gt;- A superclear wiring diagram for the Outrun cabinet. This is far better than the Sega effort. Each wire leading into the PCB and other components is clearly labelled with its function and colour.&lt;br /&gt;&lt;br /&gt;There are also a couple of detailed technical pages about the Hantarex monitor, that don't appear in the Sega manuals including a nice circuit diagram.&lt;br /&gt;&lt;br /&gt;If anyone knows whether there was another manual to accompany this one, or has further information - please let me know.&lt;br /&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;Update:&lt;/b&gt; Here is a picture of the Unidesa white OutRun cabinet, via the &lt;a href="http://www.jammaplus.co.uk/"&gt;JAMMA+&lt;/a&gt; forums. &lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/unidesa_pcb.jpg"&gt;The PCB is different&lt;/a&gt; from the Sega version, which would explain the alternate diagram in the manual. The game uses the European track layout.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/unidesa_outrunwhite.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/unidesa_outrunwhite.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4739059740998185731?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4739059740998185731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4739059740998185731' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4739059740998185731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4739059740998185731'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2010/01/outrun-unidesa-manual.html' title='Outrun Unidesa Manual'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-5976000297636553416</id><published>2009-12-11T15:27:00.000Z</published><updated>2009-12-11T15:27:42.331Z</updated><title type='text'>Pre-Xmas Update</title><content type='html'>Quick update - pretty busy with both work and some other interesting projects that I can't discuss yet. OutRun work will definitely be continuing as I've made good progress, it's just on hold for a short period.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-5976000297636553416?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/5976000297636553416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=5976000297636553416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5976000297636553416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5976000297636553416'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/12/pre-xmas-update.html' title='Pre-Xmas Update'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6629945753090896486</id><published>2009-11-27T17:24:00.001Z</published><updated>2009-11-27T17:43:29.500Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Game Objects and Level Format</title><content type='html'>I've made a lot of progress. After a lot of hard work I've figured out the internal object format used by OutRun for most sprites and game objects which is a big breakthrough. I understand the complete format, with the exception of a single bit that eludes me right now. The internal format is a lot more complex than the values finally written directly to the sprite hardware, as it includes aspects like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Both Screen Co-ordinates &amp;amp; World co-ordinates&lt;/li&gt;&lt;li&gt;Sprite Z Values&lt;/li&gt;&lt;li&gt;Independent priority settings in relation to the road layer and other sprites&lt;/li&gt;&lt;li&gt;Specific Sprite routines to use&lt;/li&gt;&lt;li&gt;X/Y Draw anchors&lt;/li&gt;&lt;li&gt;Sprite Type&lt;/li&gt;&lt;li&gt;Frame Number&lt;/li&gt;&lt;li&gt;The way in which the sprites utilise a series of lookup tables to extract more properties &lt;br /&gt;&lt;/li&gt;&lt;li&gt;All the usual things you'd expect: h-flip values, palette settings and so forth.&lt;/li&gt;&lt;/ul&gt;The traffic sprite format uses a version of this, but adds additional properties:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Bits to denote the traffic's position in relation to other traffic. This is used to control its speed and lane changing behaviour.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Speed&lt;/li&gt;&lt;li&gt;Information regarding the side of the road the traffic has spawned on&lt;/li&gt;&lt;/ul&gt;Even after establishing the above, and also a lot of related code - one thing is pretty clear: the codebase to this game is advanced and complex. &lt;br /&gt;&lt;br /&gt;I also understand the internal format used to store the scenery data for the entire set of levels. Writing a quick utility to spit this out in some kind of visual form would be an interesting exercise and a way of verifying this. Whilst all the code is documented and commented, looking at it actually hurts by brain. I'll follow up on this later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6629945753090896486?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6629945753090896486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6629945753090896486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6629945753090896486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6629945753090896486'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/11/gane-objects-and-level-format.html' title='Game Objects and Level Format'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-851002251377233859</id><published>2009-11-11T01:03:00.000Z</published><updated>2010-11-11T11:28:31.039Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='easter eggs'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Look Both Ways!</title><content type='html'>One interesting aspect of disassembling games you're fond of, is that you might uncover hidden code that was unused in the final build. This can give an insight into some of the features that were planned that didn't make the final cut, either because of time, technical problems or maybe they simply didn't prove fun during playtesting. &lt;br /&gt;&lt;br /&gt;Lately I've been disassembling the traffic handling code, and in doing so I stumbled upon an interesting memory address that controlled a block of code related to spawning traffic. I was unable to figure out exactly what it did from the code and couldn't find any references where the address was written to. So I fired up the MAME debugger and wrote to the memory address manually so that the block of code would always execute.&lt;br /&gt;&lt;br /&gt;In Outrun, all traffic drives into the horizon before disappearing. To my surprise, setting this flag caused the traffic to drive away from the horizon in the opposite direction towards the player's Ferrari. I imagine that the original idea was to have two-way traffic. The fact that Outrun's hardware supports two separate road layers means that the final effect could have been quite impressive with independent flows of traffic on each road!&lt;br /&gt;&lt;br /&gt;As it is, the code is clearly unfinished, and no graphics exist for traffic travelling in the opposite direction. But it demonstrates what the development team originally planned. It certainly would have been impressive back in 1986 if they'd pulled it off.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;You can see for yourself in the MAME debugger by changing the address with: &lt;b&gt;b@60b6b = 1&lt;/b&gt; once the game has booted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-851002251377233859?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/851002251377233859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=851002251377233859' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/851002251377233859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/851002251377233859'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/11/look-both-ways.html' title='Look Both Ways!'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-3641674095771771015</id><published>2009-11-10T10:41:00.003Z</published><updated>2009-11-10T14:37:05.001Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Extend Time!</title><content type='html'>One of the aspects of OutRun that somewhat puzzled me as a player, was exactly how the "Extend Time!" feature at the end of each level worked.&lt;br /&gt;&lt;br /&gt;This is the additional time that is added to the countdown timer on passing a checkpoint. I've never seen details published - until now....&lt;br /&gt;&lt;br /&gt;Here's a table that shows the time, in seconds, that is added to your overall counter per stage. The &lt;i&gt;rightmost &lt;/i&gt;route is show first. The DIP switches of the arcade cabinet can be set to four difficulty settings for timing, and each respective setting has its own column. If you are lucky enough to find a working cabinet in the wild, it's easy to determine the setting by looking at how much time you start the game with.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;.&lt;br /&gt;         | Easy | Norm | Hard | VHar |&lt;br /&gt;         '------'------'------'------'&lt;br /&gt;Stage 1  |  80     75     72     70  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;Stage 2a |  65     65     65     65  |&lt;br /&gt;Stage 2b |  62     62     62     62  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;Stage 3a |  57     55     57     57  |&lt;br /&gt;Stage 3b |  62     60     60     60  |&lt;br /&gt;Stage 3c |  60     60     59     58  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;Stage 4a |  66     65     64     62  |&lt;br /&gt;Stage 4b |  63     62     60     60  |&lt;br /&gt;Stage 4c |  61     60     58     58  |&lt;br /&gt;Stage 4d |  65     65     63     63  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;Stage 5a |  58     56     54     54  |&lt;br /&gt;Stage 5b |  55     56     54     54  |&lt;br /&gt;Stage 5c |  56     56     54     54  |&lt;br /&gt;Stage 5d |  58     56     54     54  |&lt;br /&gt;Stage 5e |  56     56     56     56  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To be honest, some of the entries are a little strange. For example, why is Stage 3a (Cloudy Mountain) more difficult on Normal than Very Hard? Is this an error in the table?&lt;br /&gt;&lt;br /&gt;I'm working from the &lt;a href="http://en.wikipedia.org/wiki/Outrun#Overseas_Layout"&gt;Overseas &lt;/a&gt;version of Outrun. I'm not sure yet whether the table differs for the &lt;a href="http://en.wikipedia.org/wiki/Outrun#Japan_Layout"&gt;Japanese version&lt;/a&gt; where Gateway has been moved to Stage 4.&lt;br /&gt;&lt;br /&gt;It should also be pointed out that all the tracks in Outrun are the same length from a technical point of view. Obviously some will be tougher in terms of sharp bends and thinner stretches of road. The road split at the end of each level is hard coded and not read from the level data. &lt;br /&gt;&lt;br /&gt;Moving onto the traffic in the game. Once again, this can be set by the DIP switches to four independent settings. I haven't reverse engineered the traffic code in detail yet, but I can provide some rough guidance as to how the settings affect each level in the game. It's my understanding that the following table represents the maximum number of vehicles that can be spawned simultaneously on each level.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;.&lt;br /&gt;         | Easy | Norm | Hard | VHar |&lt;br /&gt;         '------'------'------'------'&lt;br /&gt;Stage 1  |   2      3      4      5  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;Stage 2  |   2      4      5      6  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;Stage 3  |   3      5      6      7  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;Stage 4  |   4      6      7      8  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;Stage 5  |   5      7      8      8  |&lt;br /&gt;         '---------------------------'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Looking at the code which spawns the traffic, hacking the game to support more traffic wouldn't be trivial because there are only 8 slots in the jump table reserved for traffic sprite routines.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-3641674095771771015?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/3641674095771771015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=3641674095771771015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3641674095771771015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3641674095771771015'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/11/extend-time.html' title='Extend Time!'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-3326729539963225865</id><published>2009-10-20T00:56:00.004+01:00</published><updated>2011-10-16T20:51:48.931+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Memorabilia'/><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Gameplay Laserdisc &amp; VHS</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I'm still beavering away, reverse engineering the OutRun source. I'm focusing on the sprite routines and level data at the moment. Both of which are quite complex. I've uncovered some pretty intriguing stuff, and understand why OutRun uses the convoluted jump table I mentioned in an earlier post. It's related to rendering the level data, and many of the repeated routines handle sprites. &lt;br /&gt;&lt;br /&gt;But I'm not going to talk about that right now, as there's still further work to be done. Instead let's take a look at some curiosities I've found on ebay over the years.&lt;br /&gt;&lt;br /&gt;First up is a rare Japanese video laser disc (i.e. not a game in anyway), manufactured by &lt;a href="http://en.wikipedia.org/wiki/Pony_Canyon"&gt;Pony Canyon&lt;/a&gt; in 1988. Pony Canyon are a Japanese publisher, who also published the MSX 2 version of Outrun.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc_front-755033.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc_front-755033.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc_back-762229.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc_back-762229.jpg" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The laserdisc is a small 20cm disc, so requires an adapter to work in certain players. The content of the laserdisc is a short 18 min video showing the optimal way of completing each of OutRun's 15 stages. The gameplay makes use of the &lt;a href="http://www.youtube.com/watch?v=tLIKLzAkuq8"&gt;Geargacha technique&lt;/a&gt;, popularised by Japanese games magazine Gamest in 1987. This technique allows the player to drive&amp;nbsp;off-road&amp;nbsp;without loss of speed by carefully timed rapid gear shifting. It also allows the player to achieve a rocket start, flying off the line to top speed in seconds.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The accompanying booklet contains information on the stages in the game. I would love to get this translated if anyone can speak Japanese?&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc_contents-774971.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc_contents-774971.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc_booklet-792705.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc_booklet-792705.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Pony Cannon also released the "Game Simulation Video" shown below in the same year. The video contains footage from Galaxy Force and Thunder Blade in addition to the same video of Outrun.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_front-754232.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_front-754232.jpg" width="185" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_back-777407.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_back-777407.jpg" width="204" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The booklet that accompanies the video, shows a range of these videos was available. Other titles included After Burner, Hang-On, R-Type, Street Fighter and more. Incidentally, at the time I purchased the Outrun LD, the same seller also had a Turbo Outrun disc. But I'm not a huge fan of Turbo Outrun, so I passed on that option.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_booklet-761944.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_booklet-761944.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_booklets-790887.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_booklets-790887.jpg" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_inside-737897.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/video_inside-737897.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This was also released on Laserdisc:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-nB2_Hkfvu08/Tpr2CLxvYBI/AAAAAAAAAII/_V7qS4Xm0gs/s1600/DSCF5617.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-nB2_Hkfvu08/Tpr2CLxvYBI/AAAAAAAAAII/_V7qS4Xm0gs/s320/DSCF5617.jpg" width="317" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vtPE4J7LGvs/Tpr2DrJVfNI/AAAAAAAAAIQ/H0IRkLTWGV4/s1600/DSCF5618.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-vtPE4J7LGvs/Tpr2DrJVfNI/AAAAAAAAAIQ/H0IRkLTWGV4/s320/DSCF5618.jpg" width="318" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-x_0Em-gLMkw/Tpr2FSPKMJI/AAAAAAAAAIY/mJQenM5WsSU/s1600/DSCF5619.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-x_0Em-gLMkw/Tpr2FSPKMJI/AAAAAAAAAIY/mJQenM5WsSU/s320/DSCF5619.jpg" width="315" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The OutRun movie makes a further reappearance on this rare DVD, included in early editions of the OutRun 20th anniversary soundtrack box set. I've partially scanned the inlay &lt;a href="http://www.massdestruction.co.uk/jsnes/files/outrun_dvd.pdf"&gt;here&lt;/a&gt;. A copy of the footage can be found &lt;a href="http://www.megaupload.com/?d=1LDN450D"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/ar22-738245.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/ar22-738239.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: red;"&gt;&lt;span style="color: black;"&gt;In 1987, Sony released a separate gameplay laserdisc. Unlike the Pony Canyon edition, this is a full-size 12 inch disc. It contains a wonderful colour inlay of the OutRun stages, lifted from the original Japanese arcade flyer.&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="color: red;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc-b-0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc-b-0.jpg" width="318" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc-b-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc-b-1.jpg" width="319" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc-b-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/laserdisc-b-2.jpg" width="317" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;And here's the VHS version:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-kTW1cz_FHHg/TmuQjtclIBI/AAAAAAAAAH4/25Qa3VXljWQ/s1600/outrunvhs.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-kTW1cz_FHHg/TmuQjtclIBI/AAAAAAAAAH4/25Qa3VXljWQ/s400/outrunvhs.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I believe the contents of this disc are different, but I haven't verified this yet. For starters, the runtime is slightly longer, the inlay indicates the stages are demonstrated in a different order and it is produced by Tyrell Corporation.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-3326729539963225865?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/3326729539963225865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=3326729539963225865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3326729539963225865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3326729539963225865'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/10/outrun-gameplay-laserdisc-vhs.html' title='OutRun Gameplay Laserdisc &amp; VHS'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-nB2_Hkfvu08/Tpr2CLxvYBI/AAAAAAAAAII/_V7qS4Xm0gs/s72-c/DSCF5617.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-5571633030052427976</id><published>2009-09-29T22:18:00.003+01:00</published><updated>2009-09-29T22:35:42.304+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Tools and Tiles</title><content type='html'>Wrote a quick tool, which takes an Outrun CPU 0 memory dump from the MAME debugger as input. As output it prints the jump table from that stage of the game that has been built and stored in RAM.&lt;br /&gt;&lt;br /&gt;This is handy, because it formats the data and only shows the addresses which are currently enabled, and doesn't repeat addresses when they're called in succession. The table in RAM itself is 124 entries long, and updated at various points during runtime.&lt;br /&gt;&lt;br /&gt;So here's the in-game output:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;&lt;span style="font-family: courier new;"&gt;0. 0xB15E&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;1. 0x74E2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;2. 0x3BEE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;3. 0x4048 (16 times)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;21. 0x4828 (15 times)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;82. 0x4ADC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;83. 0x5248 (5 times)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;91. 0x9862&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;92. 0x9C84&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;93. 0xA568 (2 times)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;95. 0x5EA8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;103. 0xA816&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;104. 0xA7D2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;105. 0xA816&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;106. 0xC5A4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;123. 0x78B0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;124. 0xE644&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This has made it easier to figure out exactly where in code the program is updating this table.&lt;br /&gt;&lt;br /&gt;What else? I've been looking into the tile handling code. Tilemaps are used in OutRun for the horizon graphics (two layers) , the text layer is a tilemap and obvious things like the music selection screen are a tilemap. Each tile entry in the map is a word. The compression format for the first tilemap I've analysed in ROM is as follows:&lt;br /&gt;&lt;br /&gt;1/ If a word &lt;span style="font-style: italic;"&gt;is not&lt;/span&gt; '0x0000', copy immediate word directly to tileram&lt;br /&gt;2/ If a word &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; '0x0000' a long follows which details the compression.&lt;br /&gt;   The upper word of the long is the tilemap value to copy.&lt;br /&gt;   The lower word of the long is the number of times to copy that value.&lt;br /&gt;&lt;br /&gt;And here's how OutRun manages to store your exact route history through the levels in just a byte.&lt;br /&gt;&lt;br /&gt;1/ There are 5 stages, and a memory location increases by 0x10 for each stage you progress.&lt;br /&gt;2/ Each stage forks twice, giving 15 stages in total.  At each stage, this same memory location increments as follows when the &lt;span style="font-weight: bold;"&gt;left hand&lt;/span&gt; route is selected:&lt;br /&gt;&lt;br /&gt;Stage 1 = +8 (1 &lt;&lt; 3 - 0)&lt;br /&gt;Stage 2 = +4 (1 &lt;&lt; 3 - 1)&lt;br /&gt;Stage 3 = +2 (1 &lt;&lt; 3 - 2)&lt;br /&gt;Stage 4 = +1 (1 &lt;&lt; 3 - 3)&lt;br /&gt;Stage 5 = Road doesn't split on this stage&lt;br /&gt;&lt;br /&gt;3/ Later this indexes into a lookup table, which then makes it easy to update things like the stage map at the bottom right hand corner of the screen during gameplay.&lt;br /&gt;&lt;br /&gt;Other than that, I'm thinking about how to represent the graphics once I convert the engine to C. Do I keep them in a similar format, and just render a final array of pixel data (similar to how an emulator would render it's display), or do I convert them to a native PNG or similar? This would make it easier for someone to replace them and change the game, but could run into problems with palette changes and so forth. Thoughts...&lt;br /&gt;&lt;br /&gt;Anyway, this post might give you some idea of some of the things I'm doing at the moment. There's still a long way to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-5571633030052427976?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/5571633030052427976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=5571633030052427976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5571633030052427976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5571633030052427976'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/09/tools-and-tiles.html' title='Tools and Tiles'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-1610647974570927851</id><published>2009-09-17T11:10:00.002+01:00</published><updated>2009-09-17T11:23:56.661+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'></title><content type='html'>&lt;span style="font-weight: bold;"&gt;Quick progress report:&lt;/span&gt; Commented all the code relating to detecting when the car is off-road. Figured out the memory location that determined which wheel was off. Established the memory location that determined the width of the road, and handles splitting the road between number of lanes and individual roads. Commented some slightly less interesting code relating to lap times, output lamps and various other areas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Amusing OutRun link:&lt;/span&gt; Unbelievable. I have found someone with a more insane project than my own. &lt;a href="http://conceptlab.com/outrun/"&gt;A real world OutRun cabinet containing a golf-cart&lt;/a&gt;... The mind boggles?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-1610647974570927851?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/1610647974570927851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=1610647974570927851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1610647974570927851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1610647974570927851'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/09/quick-progress-report-commented-all.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-8185799176458468080</id><published>2009-09-10T15:08:00.005+01:00</published><updated>2009-11-10T10:50:53.501Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Debugging</title><content type='html'>I reached a point where it was time to switch to a competent interactive debugger, instead of working out of a series of text files that were becoming increasingly difficult to manage.&lt;br /&gt;&lt;br /&gt;It took me a good few days to transfer my comments and knowledge to the new system. But the payoff is massive - I've immediately spotted mistakes, and identifying blocks of code has become a lot less painful.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.massdestruction.co.uk/jsnes/uploaded_images/debugging-709035.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/debugging-709033.png" style="cursor: pointer; display: block; height: 167px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the screenshot you can see the commented block of code that transfers the in-game timer to the on-screen HUD.&lt;br /&gt;&lt;br /&gt;Yesterday I also documented how the main branch table works in memory. In fact, I'm not even sure if &lt;a href="http://en.wikipedia.org/wiki/Branch_table"&gt;branch table&lt;/a&gt; is the correct terminology. Figuring this out was important because actually determining the program flow in Outrun is tricky. The list of functions that are finally called is generated at runtime, and differs at different points of the game. &lt;br /&gt;&lt;br /&gt;Firstly, there's a portion of ROM that contains a series of long addresses. Each of these addresses is a pointer to another portion of ROM. This second portion of ROM contains a set of properties related to the function, and the final address of the function itself. The final step is to compile these to a table within RAM. This table contains bits so that the functions can be enabled or disabled.&lt;br /&gt;&lt;br /&gt;I presume this is some kind of optimisation, but it seems to add a lot of indirection and makes following the flow of code rather tough from the onset. Maybe some level of obfuscation was the idea? Perhaps someone reading who is a 68000 wiz will know.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Figured this out. Some useful information in the comments regarding this from one of the blog readers and myself :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-8185799176458468080?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/8185799176458468080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=8185799176458468080' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8185799176458468080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8185799176458468080'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/09/debugging.html' title='Debugging'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4727743973546462183</id><published>2009-08-27T17:07:00.003+01:00</published><updated>2009-08-27T17:16:25.190+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Decompilation Update</title><content type='html'>As predicted, progress is slow and steady.&lt;br /&gt;&lt;br /&gt;The most satisfying way of working is attempting to solve as many unknowns in a particular area, and then moving on when the going gets tough. Going back to a set of routines with a fresh pair of eyes really helps.&lt;br /&gt;&lt;br /&gt;Some areas that I've worked on:&lt;br /&gt;&lt;br /&gt;1/ Car control (X Position, Acceleration, Gear Changes)&lt;br /&gt;2/ Road splitting code (High level areas including the 'road splitting state')&lt;br /&gt;3/ Elements relating to the current track segment&lt;br /&gt;4/ Sprite rendering code (Very complex, so moved on temporarily from there)&lt;br /&gt;&lt;br /&gt;I've successfully understood various memory locations, and slowly routines become understandable from the meaningless muddle they originally were.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4727743973546462183?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4727743973546462183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4727743973546462183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4727743973546462183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4727743973546462183'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/08/decompilation-update.html' title='Decompilation Update'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-2182484465887756807</id><published>2009-08-11T23:03:00.004+01:00</published><updated>2009-09-21T09:55:32.538+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>Outrun Decompilation Oddities</title><content type='html'>The decompilation is moving along reasonably nicely. I've &lt;span style="font-style: italic;"&gt;slowly&lt;/span&gt; picking up a decent understanding of the game code.&lt;br /&gt;&lt;br /&gt;One interesting thing with the decompilation is that it uncovers code routines and text that don't appear to be in the final game.&lt;br /&gt;&lt;br /&gt;For example, check the strings in the following screenshot:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/uploaded_images/debug_text.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BIN CHAN E&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;COLOR BANK GA TARINA NOYO !&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1 STAGE 127 KO INAINI SHITENE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you set the program counter to &lt;span style="font-weight: bold;"&gt;0x7644&lt;/span&gt; (by typing pc=0x7644) in the mame debugger, and resume execution you will see for yourself.&lt;br /&gt;&lt;br /&gt;Any idea if this string is used, or whether it means anything interesting?&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;UPDATED:&lt;/span&gt; Thanks to bluepillnation who points me towards the following &lt;a href="http://www.mameworld.info/ubbthreads/showflat.php?Cat=&amp;amp;Number=133634&amp;amp;page=12&amp;amp;view=expanded&amp;amp;sb=1&amp;amp;o=&amp;amp;fpart=1&amp;amp;vc=1"&gt;link&lt;/a&gt; relating to Space Harrier.&lt;br /&gt;&lt;br /&gt;Firstly, the text can be translated roughly as follows:&lt;br /&gt;&lt;br /&gt;&lt;span class="post"&gt;&lt;span class="link"&gt;&lt;span class="link2"&gt;To BIN (a developer?)&lt;br /&gt;Color bank is lacking.&lt;br /&gt;Make it less than 128 for one stage. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's suggested that this is some kind of protection. &lt;span class="post"&gt;&lt;span class="link"&gt;&lt;span class="link2"&gt;"Sega use the MCU to copy tilebank values on most of the system16 games, maybe they use it to copy a colour bank value on space harrier too, but it's not obvious until you get to that stage".  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-2182484465887756807?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/2182484465887756807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=2182484465887756807' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2182484465887756807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2182484465887756807'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/08/outrun-decompilation-oddities.html' title='Outrun Decompilation Oddities'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-8538492053800682657</id><published>2009-08-10T11:33:00.005+01:00</published><updated>2009-08-10T12:04:29.756+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outrun'/><title type='text'>OutRun Decompilation Project</title><content type='html'>I'm something of an OutRun obsessive. I've got the arcade machine in my parent's garage (they keep requesting that I remove it) and I coded the OutRun driver for Jemu2. The game has so many memories attached to it, and it will always hold a lofty place in my heart beyond what it probably deserves.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/outrun-1-742405.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 224px;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/outrun-1-742403.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;One coding project that I've dabbled with on rainy days, is a full decompilation and reverse engineering of the original arcade ROMs. This is a massive undertaking, and one that I suspect I will never truly complete. But it is intriguing to pull apart the game I loved so much as a kid, to find out exactly how it works.&lt;br /&gt;&lt;br /&gt;The ultimate goals of this project are:&lt;br /&gt;&lt;br /&gt;1/ Reimplement OutRun in portable C, so that it can be compiled to pretty much any modern handheld/computer. And the code can be easily extended/modified.&lt;br /&gt;&lt;br /&gt;2/ Create a level editor for the game. Potentially for the original arcade version and the version created in step 1.&lt;br /&gt;&lt;br /&gt;Realistically, it will probably just be a bit of fun. If you can call pouring through thousands of lines of unlabelled, uncommented, decompiled 68000 assembler fun that is.&lt;br /&gt;&lt;br /&gt;So far, my steps have been as follows:&lt;br /&gt;&lt;br /&gt;1/ Wrote a program to de-interleave the arcade ROMs and spit them back out. I've then decompiled them to text files.&lt;br /&gt;&lt;br /&gt;2/ Made some notes on the OutRun hardware via reference to the Mame source code.&lt;br /&gt;&lt;br /&gt;3/ Begun commenting the decompiled assembler, using the Mame debugger for assistance.&lt;br /&gt;&lt;br /&gt;Progress is promising. I started by figuring out all the routines for the text layer of the hardware. As the name suggests, this is essentially a layer of 8x8 tiles that is used to print things like "INSERT COIN" to the screen, and some other static graphics like the HUD elements.&lt;br /&gt;&lt;br /&gt;It's been quick to rattle through the code and comment exactly when and where the graphics are blitted. So I quickly have an understanding of the general code structure, from the service tests through to high score tables and even the OutRun easter egg, which prints Yu Suzuki's name.&lt;br /&gt;&lt;br /&gt;I've also figured out a lot of other important information, including the memory address used to store the games internal state (e.g. attract mode / music selection / high score entry / in-game / clock countdown / map screen), which makes identifying roughly what individual areas of code are performing far simpler.&lt;br /&gt;&lt;br /&gt;There's a lot more I've managed to achieve, although this is a project whereby progress is slow until you reach a tipping point. The most similar project I've worked on previously was converting Speedball 2 to J2ME phones. But as this was an official port, I had access to nicely commented and labelled 68000 assembler - much easier.&lt;br /&gt;&lt;br /&gt;In other news, I haven't forgotten about FlashGear, just put it on hold for the time being, until I get the motivation to polish it up for a release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-8538492053800682657?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/8538492053800682657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=8538492053800682657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8538492053800682657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/8538492053800682657'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/08/outrun-decompilation-project.html' title='OutRun Decompilation Project'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4127145279087797611</id><published>2009-03-24T21:36:00.001Z</published><updated>2009-03-24T21:37:09.935Z</updated><title type='text'>FlashGear</title><content type='html'>Now it runs pretty well:&lt;br /&gt;&lt;a href="http://www.javagear.co.uk/flashgear"&gt;http://www.javagear.co.uk/flashgear&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Basically I missed a few Flash related things as I was working too late. I knew the code wasn't &lt;span style="font-style: italic;"&gt;that&lt;/span&gt; bad! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4127145279087797611?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4127145279087797611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4127145279087797611' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4127145279087797611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4127145279087797611'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/03/flashgear.html' title='FlashGear'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-1564748543795524098</id><published>2009-03-23T10:01:00.003Z</published><updated>2009-03-23T22:30:14.691Z</updated><title type='text'>JavaGear Actionscript/Flash Port</title><content type='html'>I quickly ported JavaGear to Actionscript 3 the other week to see how fast it would run. The actual port was really quick - took just over a day to get it up and running.&lt;br /&gt;&lt;br /&gt;It seems that Actionscript is a pretty sluggish language for emulation purposes. The main bottleneck in the code is the Z80 emulation. The rendering and flash specific stuff is not really an issue.&lt;br /&gt;&lt;br /&gt;Using a hacked version of Sonic, with some patched speed enhancements (replacing some of the idle cpu loops with halt instructions), it's just about playable. But I'd be lying if I said I wasn't disappointed with the overall performance.&lt;br /&gt;&lt;br /&gt;I did a lot of profiling, but so far haven't made any breakthroughs. The core code is pretty fast anyway. I tried an alternate Z80 emulator from a Flash Spectrum emulator, and this was slower than my own.&lt;br /&gt;&lt;br /&gt;Edit: give it a spin &lt;a href="http://www.javagear.co.uk/flashgear/"&gt;here&lt;/a&gt;&lt;br /&gt;Be warned it's slow, so save any important work in case it stalls your PC ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-1564748543795524098?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/1564748543795524098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=1564748543795524098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1564748543795524098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1564748543795524098'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/03/javagear-actionscriptflash-port.html' title='JavaGear Actionscript/Flash Port'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-2418239622221693445</id><published>2009-03-23T09:58:00.003Z</published><updated>2009-03-23T10:01:21.304Z</updated><title type='text'>DroidGear</title><content type='html'>Due to my own laziness at porting JavaGear to Google Android, I'm pleased to say Stephan has taken it upon himself to start a port. The code can be found &lt;a href="http://code.google.com/p/droidgear/"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A video can be found &lt;a href="http://www.androidandme.com/2009/03/videos/droidgear-sega-emulator-for-android-video-review/"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looks like something's up with the frameskipping code from the video - I don't think the emulator is skipping frames at all. The interface and auto screen flipping looks cool though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-2418239622221693445?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/2418239622221693445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=2418239622221693445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2418239622221693445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2418239622221693445'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2009/03/droidgear.html' title='DroidGear'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-311047122315287888</id><published>2008-07-02T11:14:00.002+01:00</published><updated>2008-07-02T11:26:15.355+01:00</updated><title type='text'>JavaGear 0.97 Preview</title><content type='html'>&lt;span style="font-style: italic;"&gt;Upcoming in the next version:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1/ Big speed increase for mobile version. I've compiled my own customised version of &lt;a href="http://proguard.sourceforge.net"&gt;proguard&lt;/a&gt; (the java obfuscator) . This results are great, and games run noticeably quicker. I'll have some precise data to back this up in due course.&lt;br /&gt;&lt;br /&gt;2/ Decent standalone application version with menubar and windows .exe launcher for ease of use. Essentially the menubar is the final feature lacking from the rewritten javagear present in the original. It works better than the original though :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-311047122315287888?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/311047122315287888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=311047122315287888' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/311047122315287888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/311047122315287888'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2008/07/javagear-097-preview.html' title='JavaGear 0.97 Preview'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-1898373099009403473</id><published>2008-06-02T17:16:00.002+01:00</published><updated>2008-06-02T17:17:59.320+01:00</updated><title type='text'>JavaGear Updates</title><content type='html'>So you've probably noticed that there have been a few minor updates to JavaGear recently.&lt;br /&gt;&lt;br /&gt;I'm also working on implementing 'save state' support. It's a feature I've wanted for ages, but is mind numbingly dull to code. I've finally summed up the courage. It works, I've just got to hook up some UI for it now.&lt;br /&gt;&lt;br /&gt;Any other feature requests are welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-1898373099009403473?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/1898373099009403473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=1898373099009403473' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1898373099009403473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/1898373099009403473'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2008/06/javagear-updates.html' title='JavaGear Updates'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-5889149773402989280</id><published>2008-05-20T14:14:00.000+01:00</published><updated>2008-05-20T14:15:18.419+01:00</updated><title type='text'>JavaGear ME 0.92 Released</title><content type='html'>&lt;p&gt;     &lt;b&gt;        JavaGear for MIDP2 Compatible mobile phones.&lt;br /&gt;       Also contains a standalone J2SE (PC compatible) build of JavaGear.     &lt;/b&gt;   &lt;/p&gt;   &lt;p&gt;    &lt;b&gt;New Features:&lt;/b&gt;    &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Screen rotation    &lt;/li&gt;&lt;li&gt;Screen can be enlarged with SCALE option (before it was only shrunk)    &lt;/li&gt;&lt;li&gt;Lightgun emulation (touchscreen devices and with mouse on J2SE version)    &lt;/li&gt;&lt;li&gt;SRAM is saved (Phantasy Star etc.)    &lt;/li&gt;&lt;li&gt;NTSC/PAL selection    &lt;/li&gt;&lt;li&gt;J2SE: Pass window size as command line parameter    &lt;/li&gt;&lt;li&gt;Uses less memory than previous version    &lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;    &lt;b&gt;Improved Emulation Accuracy:&lt;/b&gt;    &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Z80: Fixed bug in FDCBxxyy, DDCBxxyy opcode timings    &lt;/li&gt;&lt;li&gt;VDP: Fixed VDPbuffer bugs in accurate version (not used by any games)    &lt;/li&gt;&lt;li&gt;VDP: Accurate mirroring of ports (not used by any games)     &lt;/li&gt;&lt;li&gt;VDP: Fixed bug in line interrupt setting    &lt;/li&gt;&lt;li&gt;Fixed bug in GameGear auto resizing code &lt;/li&gt;&lt;/ul&gt;Available &lt;a href="http://javagear.co.uk/index.php?p=downloads.php"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-5889149773402989280?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/5889149773402989280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=5889149773402989280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5889149773402989280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/5889149773402989280'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2008/05/javagear-me-092-released.html' title='JavaGear ME 0.92 Released'/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-2701025355169248369</id><published>2008-05-11T21:02:00.004+01:00</published><updated>2008-05-11T21:08:04.445+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javagear'/><title type='text'></title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;JavaGear Android Port&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/android2-715599.png"&gt;&lt;img style="cursor: pointer;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/android2-715596.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/android1-793013.png"&gt;&lt;img style="cursor: pointer;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/android1-793008.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've started to port &lt;span style="font-weight: bold;"&gt;JavaGear&lt;/span&gt; to Google's &lt;a href="http://code.google.com/android/"&gt;Android&lt;/a&gt; platform. The results are good, although it runs seriously slowly in the emulator. Based on the &lt;a href="http://www.javagear.co.uk/"&gt;J2ME version&lt;/a&gt;, it will presumably run faster on an actual device.&lt;br /&gt;&lt;br /&gt;There will be updates to the existing mobile version of JavaGear in due course. I'm hoping to add Lightgun support for touchscreen handsets.&lt;br /&gt;&lt;br /&gt;There's still some debugging on the Android version to be done in the meantime, and I've got to merge the Android code into the main source tree, as it's forked at the moment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-2701025355169248369?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/2701025355169248369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=2701025355169248369' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2701025355169248369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/2701025355169248369'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2008/05/ive-started-to-port-javagear-to-googles.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-3849374945096711017</id><published>2007-08-17T13:18:00.000+01:00</published><updated>2007-08-17T13:30:40.409+01:00</updated><title type='text'></title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;&lt;a href="http://www.gagaplay.com/jemu2/"&gt;OutRun is now integrated with JEmu2&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-08-733816.png"&gt; &lt;img style="cursor: pointer;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-08-733813.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-08d-776001.png"&gt;&lt;img style="cursor: pointer;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-08d-775998.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-08b-734034.png"&gt;&lt;img style="cursor: pointer;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-08b-734029.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-08c-775830.png"&gt;&lt;img style="cursor: pointer;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-08c-775826.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-3849374945096711017?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/3849374945096711017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=3849374945096711017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3849374945096711017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/3849374945096711017'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2007/08/outrun-is-now-integrated-with-jemu2.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6125373214731088365</id><published>2007-08-13T23:30:00.000+01:00</published><updated>2007-08-13T23:36:23.510+01:00</updated><title type='text'></title><content type='html'>The &lt;span style="font-weight:bold;"&gt;OutRun&lt;/span&gt; driver for JEmu2 is pretty much done. I sent the code to Erik today :)&lt;br /&gt;&lt;br /&gt;It was tricky to get the sound right - a hack was needed to ensure the music played at the correct speed, and I'm not entirely sure I've done it in the best way, but we'll see what he thinks!  &lt;br /&gt;&lt;br /&gt;I'll post a link when it's online and playable :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6125373214731088365?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6125373214731088365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6125373214731088365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6125373214731088365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6125373214731088365'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2007/08/outrun-driver-for-jemu2-is-pretty-much.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4121929643038114654</id><published>2007-08-07T23:52:00.001+01:00</published><updated>2007-08-07T23:53:59.423+01:00</updated><title type='text'></title><content type='html'>More good news on the OutRun front - &lt;span style="font-weight:bold;"&gt;controls&lt;/span&gt; are now fully emulated, so the game is playable.&lt;br /&gt;&lt;br /&gt;I've also fixed a bug with sprite ram swapping, which has fixed the occasional corruption problems I previously mentioned.&lt;br /&gt;&lt;br /&gt;Next steps are to implement sound :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4121929643038114654?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4121929643038114654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4121929643038114654' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4121929643038114654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4121929643038114654'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2007/08/more-good-news-on-outrun-front-controls.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4357924597095521877</id><published>2007-07-31T23:38:00.001+01:00</published><updated>2007-07-31T23:44:31.659+01:00</updated><title type='text'></title><content type='html'>I'm making quick progress. The road layer is now implemented. I've also implemented shadow support on the sprites, you can see these under the trees in the screenshots below. I *think* the graphics hardware is pretty much complete now. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-31a-722762.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-31a-722757.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-31b-753704.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-31b-753700.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've started implementing the controls. The basic digital controls are done and I'll investigate the analogue controls next.&lt;br /&gt;&lt;br /&gt;I will then double check the timings and interrupt handling of the driver as there are some quirks at times. &lt;br /&gt;&lt;br /&gt;There's some other things to be done - some of the code could be optimised and refactored in a slightly better way. Once done, it should be really easy to add further System16 games to Jemu. I've been using finalburn as a reference - the source is much easier to read than mame :)&lt;br /&gt;&lt;br /&gt;Regarding JSnes, just to clarify this isn't abandoned as such - merely halted for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4357924597095521877?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4357924597095521877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4357924597095521877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4357924597095521877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4357924597095521877'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2007/07/im-making-quick-progress.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-4376421087634315807</id><published>2007-07-28T18:45:00.000+01:00</published><updated>2007-07-28T18:52:57.122+01:00</updated><title type='text'></title><content type='html'>I've added sprite support to the Java OutRun arcade emulator driver I'm working on.&lt;br /&gt;&lt;br /&gt;The major graphical hardware left to implement, as you'll see from the screenshots, is the road layer.&lt;br /&gt;&lt;br /&gt;There's occassionally some very brief and minor corruption to the sprites. I'm not sure what this is yet.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-28a-780943.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-28a-780938.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-28b-726953.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-28b-726947.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-4376421087634315807?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/4376421087634315807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=4376421087634315807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4376421087634315807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/4376421087634315807'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2007/07/ive-added-sprite-support-to-my-java.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-6297120207555717476</id><published>2007-07-26T13:43:00.000+01:00</published><updated>2007-07-26T13:50:25.831+01:00</updated><title type='text'></title><content type='html'>OK, so JSnes hasn't been updated in a while. This is purely because I lost interest and had other things to spend my time on.&lt;br /&gt;&lt;br /&gt;In the meantime I worked on a mobile version of &lt;a href="http://www.javagear.co.uk/"&gt;JavaGear &lt;/a&gt;for MIDP handsets.&lt;br /&gt;&lt;br /&gt;I'm also adding OutRun support to &lt;a href="http://www.gagaplay.com/jemu2/"&gt;Jemu2&lt;/a&gt;. You can see below that I have got the text layer and tile layer working.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-25-743965.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://www.massdestruction.co.uk/jsnes/uploaded_images/2007-07-25-743961.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-6297120207555717476?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/6297120207555717476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=6297120207555717476' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6297120207555717476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/6297120207555717476'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2007/07/ok-so-jsnes-hasnt-been-updated-in-while.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-110691501767014744</id><published>2005-01-28T13:14:00.000Z</published><updated>2005-01-28T12:23:37.670Z</updated><title type='text'></title><content type='html'>- Fixed a problem in the CPU core with the RTI instruction, (switching the Accumulator to and from 8 and 16 bits after popping the status register from the stack). Solved graphical corruption and problems in loads of games, including Contra 3:&lt;br /&gt;&lt;img src = "http://www.massdestruction.co.uk/jsnes/screenshots/contra3.png"&gt;&lt;br /&gt;- Bugfixed HDMA support, fixing a bunch of Commercial ROMs (Zool, Turrican 2 etc.).&lt;br /&gt;&lt;br /&gt;- Corrected some SRAM mirroring issues, meaning Mario Allstars passes the protection check. Not entirely convinced I've nailed SRAM yet, as there are some other issues...&lt;br /&gt;&lt;br /&gt;- Added HIROM support. Probably buggy for now, but good enough to get a decent number of titles running.&lt;br /&gt;&lt;br /&gt;- Added a bunch of new opcodes. Roughly 230 out of 255 opcodes are now implemented. I add them as I come across ROMs using them, which helps prevent silly bugs.&lt;br /&gt;&lt;br /&gt;- Thanks to the Snes9x forum for helping out with a couple of issues. Who knows, we might see a source code release in a few months.&lt;br /&gt;&lt;br /&gt;As usual, if you can help out, please contact me.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-110691501767014744?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/110691501767014744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=110691501767014744' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/110691501767014744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/110691501767014744'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2005/01/fixed-problem-in-cpu-core-with-rti.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-110615002882333550</id><published>2005-01-19T15:49:00.000Z</published><updated>2005-01-19T16:02:38.510Z</updated><title type='text'></title><content type='html'>Got my websites back up (Finally!)&lt;br /&gt;&lt;br /&gt;Fixed a few minor issues on JSnes:&lt;br /&gt;&lt;br /&gt;- Fixed CPU cycles per scaline&lt;br /&gt;- Implemented a handful of new opcodes.&lt;br /&gt;- Fixed directPageIndexedIndirect memory mode in CPU emulation&lt;br /&gt;- Fixed bug on certain 256 Colour mode backgrounds&lt;br /&gt;&lt;br /&gt;There are still a lot of bugs, but the above also means that some more games start to run. A handful of basic commercial titles are now playable to some extent.&lt;br /&gt;&lt;br /&gt;If you have decent snes / emulation knowledge and want to help out, please contact me.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-110615002882333550?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/110615002882333550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=110615002882333550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/110615002882333550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/110615002882333550'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2005/01/got-my-websites-back-up-finally-fixed.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107996107867068803</id><published>2004-03-22T13:11:00.000Z</published><updated>2005-01-19T16:46:35.086Z</updated><title type='text'></title><content type='html'>Sprites are now implemented. Support is included for all sizes, including those that are undocumented, as well as features like sprite priority rotation. Check out the new screenshots. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/gradius3.png"&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/warioswoods.png"&gt;&lt;br /&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/smw5.png"&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/smw6.png"&gt;&lt;br /&gt;&lt;br /&gt;Also fixed a bug in VRAM reading, which caused graphical corruption in a few ROMs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107996107867068803?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107996107867068803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107996107867068803'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/03/sprites-are-now-implemented.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107944856899348590</id><published>2004-03-16T14:49:00.000Z</published><updated>2004-03-16T14:51:50.716Z</updated><title type='text'></title><content type='html'>Added support for screen fading, one of the easier bits of the PPU to emulate! In the CPU core, I fixed a bug with the TCS / TSC opcode; the 16-bit accumulator needed to be transferred to/from the stack pointer ignoring the status of the memory flag. I already knew this, but implemented it incorrectly. Oops. Now Ghosts N Ghouls runs further, before hitting an unimplemented opcode.  Lots of commercial ROMs now start, but really need sprites implemented to play!&lt;br /&gt;&lt;br /&gt;Sprites will be the next aspect of the PPU I emulate. Then, a few titles should be playable. A number of people have contacted me to ask when I'll release JSnes. I think there will be a release in a couple of months, once I've stabilised the emulator somewhat. This might be sooner, but no promises.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107944856899348590?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/107944856899348590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=107944856899348590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107944856899348590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107944856899348590'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/03/added-support-for-screen-fading-one-of.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107935115412018822</id><published>2004-03-15T11:45:00.000Z</published><updated>2004-03-15T11:48:49.873Z</updated><title type='text'></title><content type='html'>Well, a short time without an update, but I've been hacking away. I researched offet-per-tile mode, which can be used in Modes 2, 4 and 6 by the Snes. Implementing this proved tricky, as no documentation exists on it, and quite a few emulators don't support it.  Further to this, the game doctor I ordered didn't work and is being sent back for repair, so I couldn't run any tests on hardware. Bah! &lt;br /&gt;&lt;br /&gt;The main problem I ran into with offset-per-tile is that my current line-by-line engine wasn't good enough to support it properly. If I'd realised this functionality existed when I'd started coding, I could have done things differently from the outset.  As it was, most of my graphics rendering code needed a rewrite.&lt;br /&gt;&lt;br /&gt;Anyway, offset-per-tile now seems to be working correctly in all but one demo I've tried. I'm sure there's more bugs to find.&lt;br /&gt;&lt;br /&gt;I also improved the sound skipping code, which means the Infinity demo now runs.  I also fixed directPageIndirect addressing, which fixed problems in the Super Mario Allstars + World double pack and a PD demo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107935115412018822?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/107935115412018822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=107935115412018822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107935115412018822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107935115412018822'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/03/well-short-time-without-update-but-ive.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107823961958204324</id><published>2004-03-02T15:00:00.000Z</published><updated>2005-01-19T16:47:11.836Z</updated><title type='text'></title><content type='html'>Added HDMA support. Managed to get the basics working pretty quickly, but spent a while trying to get the repeat flag working properly. Also had some trouble with conflicting documentation. A lot of nice effects work in PD demos now! &lt;br /&gt;&lt;br /&gt;&lt;img src = "http://www.massdestruction.co.uk/jsnes/screenshots/paradox.png"&gt;&lt;img src = "http://www.massdestruction.co.uk/jsnes/screenshots/anthrox.png"&gt;&lt;br /&gt;&lt;br /&gt;Next, I'm going to work on bug fixing existing code to ensure everything is working as it should. Currently a few simple demos that should work don't, and I want to establish the reasons for this before implementing anything new.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107823961958204324?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107823961958204324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107823961958204324'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/03/added-hdma-support.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107770817013657184</id><published>2004-02-25T11:22:00.000Z</published><updated>2005-01-19T16:48:59.420Z</updated><title type='text'></title><content type='html'>As promised, I've implemented correct (as opposed to hacky) subscreen support. This includes fixed colour and subscreen addition and subtraction. One obvious benefit of this is that the sky in Super Mario World is now correct (compare these new screenshots with the previous ones). Also, have a look at the transparent clouds in the Dwarf demo.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/smw3.png"&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/smw4.png"&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/dwarf.png"&gt;&lt;br /&gt;&lt;br /&gt;Nearly all the docs I found regarding subscreens were absolutely terrible and generally wrong. I have to thank Grog for his doc, which was both clear and correct. I've fixed a bunch of other graphic bugs, and will probably work on either HDMA or sprite support next.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107770817013657184?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107770817013657184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107770817013657184'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/02/as-promised-ive-implemented-correct-as.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107753098363333723</id><published>2004-02-23T10:09:00.000Z</published><updated>2004-02-23T10:11:43.530Z</updated><title type='text'></title><content type='html'>Implemented H-Blanking support, which was causing Super Mario World to hang. In fact, SMW now runs into the game... and I'm sure it would be playable, if I had sprites implemented! There are some graphical glitches, related to me not supporting subscreens correctly yet. I'll optimise the BG layer code next, and simultaneously correct this. &lt;br /&gt;&lt;br /&gt;Found a small bug related to NMI interrupts, although I don't think was affecting anything. SMW also showed up a bug with the LSR absolute opcode. I also corrected a bug related to scrolling tilemaps vertically, which only manifested itself on certain titles.&lt;br /&gt;&lt;br /&gt;Currently, 80% of all opcodes are implemented. SMW, Super Off-Road, Super Mario All-Stars, Gradius III and Super R-Type are among a handful of titles that seem to run into the game (minus sprites).  A few other titles do stuff, but require more of the PPU to be emulated correctly before progressing further.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107753098363333723?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/107753098363333723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=107753098363333723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107753098363333723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107753098363333723'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/02/implemented-h-blanking-support-which.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107701387080328441</id><published>2004-02-17T10:31:00.000Z</published><updated>2005-01-19T16:49:57.093Z</updated><title type='text'></title><content type='html'>I've worked on fixing more graphics related bugs (one of which was very silly and prevented 64x64 tilemaps working). I'm sure they'll be more to uncover yet. I've implemented horizontal and vertical tile flipping.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/smw1.png"&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/smw2.png"&gt;&lt;br /&gt;&lt;br /&gt;Super Mario World now partially works. Obviously, there are no sprites yet, and graphics emulation is incomplete. It doesn't run any further than the second screen at the moment, due to some kind of CPU/Interrupt bug which affects a bunch of ROMs. I'll try to solve this soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107701387080328441?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107701387080328441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107701387080328441'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/02/ive-worked-on-fixing-more-graphics.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107659140609880268</id><published>2004-02-12T13:10:00.000Z</published><updated>2004-02-12T13:11:55.123Z</updated><title type='text'></title><content type='html'>No screenshots today, because I don't have anything interesting enough to post. However, I've worked on improving graphics emulation. I've started to clean a few bits of code, and most importantly, have implemented 16x16 tiles. &lt;br /&gt;&lt;br /&gt;Some further opcodes and bugfixes in the core mean that a whole bunch of new PD demos run, or at least do something. &lt;br /&gt;&lt;br /&gt;I've also ordered myself a Game Doctor SF7, which will enable me to test lots of interesting stuff on SNES hardware if I find the time.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107659140609880268?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/107659140609880268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=107659140609880268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107659140609880268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107659140609880268'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/02/no-screenshots-today-because-i-dont.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107634097223063594</id><published>2004-02-09T15:36:00.000Z</published><updated>2005-01-19T16:56:34.733Z</updated><title type='text'></title><content type='html'>Here's an update of my progress:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;150 CPU Opcodes are now emulated. I've bug fixed quite a few existing ones, and corrected various errors. &lt;li&gt;64x32 tilemaps now display correctly&lt;li&gt;Tilemap scrolling implemented&lt;li&gt;Automatic joypad reading implemented&lt;li&gt;SPU skipper implemented (Fakes the sound processor for now)&lt;/ul&gt;&lt;br /&gt;The result of all this is that a handful of new PD demos are working, and the following commericial ROMs are displaying some graphics:&lt;br /&gt;&lt;br /&gt;&lt;img src = "http://www.massdestruction.co.uk/jsnes/screenshots/ff2.png"&gt;&lt;img src = "http://www.massdestruction.co.uk/jsnes/screenshots/tmnt.png"&gt;&lt;br /&gt;&lt;img src = "http://www.massdestruction.co.uk/jsnes/screenshots/test.png"&gt;&lt;img src = "http://www.massdestruction.co.uk/jsnes/screenshots/supoff.png"&gt;&lt;br /&gt;&lt;br /&gt;Currently, these do not run any further due to unimplemented opcodes. Still, I'm on the right track...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107634097223063594?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107634097223063594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107634097223063594'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/02/heres-update-of-my-progress-150-cpu.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107398975642344577</id><published>2004-01-13T10:29:00.000Z</published><updated>2005-01-19T16:57:42.266Z</updated><title type='text'></title><content type='html'>As promised some screenshots from some partially working new demos:&lt;br /&gt;&lt;br /&gt;&lt;img src="screenshots/eaglesoft.png"&gt;&lt;img src="screenshots/sonic.png"&gt;&lt;br&gt;&lt;br /&gt;&lt;img src="screenshots/tictactoe0.png"&gt;&lt;img src="screenshots/tictactoe1.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107398975642344577?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107398975642344577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107398975642344577'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/01/as-promised-some-screenshots-from-some.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107392898300495119</id><published>2004-01-12T17:36:00.000Z</published><updated>2004-01-12T17:43:04.233Z</updated><title type='text'></title><content type='html'>Over the weekend, I added more opcodes to the processor emulation; roughly 90 out of 250 are now emulated. I fixed a daft bug with regard to the negative flag in certain instructions (actually cause by a typo). I also corrected the JML absolute long instruction. I did a little bug fixing on the video emulation, and now tiles with higher colour depths are decoded correctly.  Following that, I implemented controller emulation.&lt;br /&gt;&lt;br /&gt;The result of this work is that a bunch of new demos are working, or partially working. I'll post some screenshots later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107392898300495119?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/107392898300495119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=107392898300495119' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107392898300495119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107392898300495119'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/01/over-weekend-i-added-more-opcodes-to.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-107355657145337546</id><published>2004-01-08T10:09:00.000Z</published><updated>2005-01-19T16:59:12.170Z</updated><title type='text'></title><content type='html'>Well, a very long time without an update, but I've been busy programming games at work and drinking too much over Christmas. Still, some progress has been made. I've added a load of CPU opcodes, fixed the usual range of silly bugs that come with starting an emulator from scratch and implemented interrupts (see the Hello World demo below). As a result, a handful of simple demos now work. &lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/helloworld.png"&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/consoleconnections.png"&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-107355657145337546?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107355657145337546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/107355657145337546'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2004/01/well-very-long-time-without-update-but.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-106249369589821726</id><published>2003-09-02T10:08:00.000+01:00</published><updated>2005-01-19T16:48:30.016Z</updated><title type='text'></title><content type='html'>Spent a while fixing minor PPU bugs, and other errors due to misinterpretation of documentation. The result is that the homebrew ROM that I've been experimenting with now runs! It only draws a simple image, but demonstrates DMA, CGRAM, and BG layers in operation.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;img src="http://www.massdestruction.co.uk/jsnes/screenshots/demorom.png" /&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-106249369589821726?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/106249369589821726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/106249369589821726'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2003/09/spent-while-fixing-minor-ppu-bugs-and.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-106121792324959271</id><published>2003-08-18T15:45:00.000+01:00</published><updated>2003-08-18T15:45:23.260+01:00</updated><title type='text'></title><content type='html'>The demo that I'm trying to run uses DMA. I've now implemented basic DMA support, although there's no HDMA support yet.  I've also emulated the hardware multiply and divide functionality supported by the SNES.  The next stage is to actually output some graphics to the screen. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-106121792324959271?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/106121792324959271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=106121792324959271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/106121792324959271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/106121792324959271'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2003/08/demo-that-im-trying-to-run-uses-dma.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-106059753504686076</id><published>2003-08-11T11:25:00.000+01:00</published><updated>2003-08-11T11:25:54.830+01:00</updated><title type='text'></title><content type='html'>Implemented all the opcodes necessary to run the homebrew ROM. Started work emulating the basics of the PPU (Picture Processing Unit). I'm going to start by emulating BG1 and Tile Based graphics. So far, PPU registers seem to get written to correctly, which is a promising start. The only real obstacle I've come up against is time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-106059753504686076?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/106059753504686076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=106059753504686076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/106059753504686076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/106059753504686076'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2003/08/implemented-all-opcodes-necessary-to.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-106024800514512798</id><published>2003-08-07T10:20:00.000+01:00</published><updated>2003-08-07T10:20:05.130+01:00</updated><title type='text'></title><content type='html'>Have now implemented 30 65c816 Opcodes... almost enough to step through the homebrew ROM that I'm using. There are a few confusing issues (mainly due to limited documentation), but overall I've found the CPU a lot easier to emulate than the Z80. &lt;br /&gt;&lt;br /&gt;My friend Peter has offered me a crate of beer once I get StarFox running (probably because he believes I won't). I wasn't planning on emulating the SuperFX CPU, might now I might consider porting some C code in that area...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-106024800514512798?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/106024800514512798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=106024800514512798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/106024800514512798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/106024800514512798'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2003/08/have-now-implemented-30-65c816-opcodes.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5633037.post-105964959101676997</id><published>2003-07-31T12:06:00.000+01:00</published><updated>2003-07-31T18:00:32.763+01:00</updated><title type='text'></title><content type='html'>Work has started on JSNES. A Java based SNES Emulator. Like my other project, &lt;a href="http://www.javagear.co.uk"&gt;JavaGear&lt;/a&gt;, the source code will be released under the &lt;a href="http://www.gnu.org/licenses/gpl.html"&gt;GNU GPL license&lt;/a&gt;, once I am happy with progress.&lt;br /&gt;&lt;br /&gt;So far, I've implemented the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Basic ROM Loaders (Simple LoROM / HiROM detection)&lt;br /&gt;&lt;li&gt;LoROM memory map&lt;br /&gt;&lt;li&gt;12 x 65c816 Opcodes&lt;br /&gt;&lt;/ul&gt;I'm quite busy at the moment, so this project may never be completed, but it should prove an interesting learning experience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5633037-105964959101676997?l=reassembler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reassembler.blogspot.com/feeds/105964959101676997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5633037&amp;postID=105964959101676997' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/105964959101676997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5633037/posts/default/105964959101676997'/><link rel='alternate' type='text/html' href='http://reassembler.blogspot.com/2003/07/work-has-started-on-jsnes.html' title=''/><author><name>yt</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
