CINXE.COM

Magnetic Scrolls Original Games Source Code Recovered!

<!DOCTYPE HTML> <html lang=""> <head> <title>Magnetic Scrolls Original Games Source Code Recovered! </title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href='//fonts.googleapis.com/css?family=Roboto:400,700,500' rel='stylesheet' type='text/css'> <link href='//fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'> <link href="https://fonts.googleapis.com/css?family=Kanit:100,200,300,400" rel="stylesheet"> <link href="/user/themes/strand/css/pure-0.5.0/grids-min.css" type="text/css" rel="stylesheet"> <link href="/user/themes/strand/css/bootstrap.min.css" type="text/css" rel="stylesheet"> <link href="/user/themes/strand/fonts/font-awesome/css/font-awesome.min.css" type="text/css" rel="stylesheet"> <link href="/user/themes/strand/css/style.css" type="text/css" rel="stylesheet"> <link href="/user/themes/strand/css/mobile-menu.css" type="text/css" rel="stylesheet"> <link href="/user/themes/strand/js/slick/slick.css" type="text/css" rel="stylesheet"> <link href="/user/themes/strand/js/slick/slick-theme.css" type="text/css" rel="stylesheet"> <link href="/user/themes/strand/css/strand.css" type="text/css" rel="stylesheet"> <link href="/user/plugins/markdown-notices/assets/notices.css" type="text/css" rel="stylesheet"> <link href="/user/plugins/form/assets/form-styles.css" type="text/css" rel="stylesheet"> <link href="/user/plugins/lightslider/css/lightslider.css" type="text/css" rel="stylesheet"> <link href="/user/plugins/lightslider/css/lightslider-custom.css" type="text/css" rel="stylesheet"> <link href="/user/plugins/simplesearch/css/simplesearch.css" type="text/css" rel="stylesheet"> <link href="/user/plugins/youtube/css/youtube.css" type="text/css" rel="stylesheet"> <link href="/user/plugins/featherlight/css/featherlight.min.css" type="text/css" rel="stylesheet"> <link href="/user/plugins/login/css/login.css" type="text/css" rel="stylesheet"> <script src="//oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> <script src="//oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <script src="/system/assets/jquery/jquery-2.x.min.js"></script> <script src="/user/plugins/lightslider/js/lightslider.min.js"></script> <script src="/user/plugins/featherlight/js/featherlight.min.js"></script> <script src="/user/themes/strand/js/jquery-2.1.4.min.js"></script> <script src="/user/themes/strand/js/smoothscroll.js"></script> <script src="/user/themes/strand/js/mobile-menu.js"></script> <script src="/user/themes/strand/js/flexSlider/jquery.flexslider-min.js"></script> <script src="/user/themes/strand/js/scripts.js"></script> <script src="/user/themes/strand/js/bootstrap.min.js"></script> <script src="/user/themes/strand/js/lightslider.min.js"></script> <script src="/user/themes/strand/js/slick/slick.min.js"></script> <script src="/user/themes/strand/js/featherlight.min.js"></script> <script> $(document).ready(function(){ $('a[rel="lightbox"]').featherlight({ openSpeed: 250, closeSpeed: 250, closeOnClick: 'background', closeOnEsc: '1', root: 'body' }); }); </script> </head> <body> <div id="main-wrapper"> <div id="preloader"> <div id="status"> <div class="status-mes"></div> </div> </div> <div class="uc-mobile-menu-pusher"> <div class="content-wrapper"> <nav class="navbar m-menu navbar-default navbar-fixed-top"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse-1"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/"> <img class="imglogo" src="/user/themes/strand/img/s_99a.png" alt=""> </a> </div> <div class="collapse navbar-collapse" id="#navbar-collapse-1"> <ul class="nav navbar-nav navbar-right main-nav"> <li class=""> <a href="/">Home</a> </li> <li class=""> <a href="/about">About</a> </li> <li class="dropdown m-menu-fw "> <a href="/games" >Games <span><i class="fa fa-angle-down"></i></span></a> <ul class="dropdown-menu"> <li class="m-menu-content"> <a href="/games/thepawn">The Pawn</a> </li> <li class="m-menu-content"> <a href="/games/theguild">The Guild of Thieves</a> </li> <li class="m-menu-content"> <a href="/games/jinxter">Jinxter</a> </li> </ul> </li> <li class="active"> <a href="/blog">Blog</a> </li> <li class=""> <a href="/help">Help</a> </li> <li class="dropdown m-menu-fw "> <a href="/projects" >Projects <span><i class="fa fa-angle-down"></i></span></a> <ul class="dropdown-menu"> <li class="m-menu-content"> <a href="/projects/zxnext">Spectrum Next Games</a> </li> </ul> </li> <li class=""> <a href="/community">Community</a> </li> </ul> </div> </div> </nav> <section class="single-page-title"style="background-image: url(/user/pages/04.blog/blog.jpg);"> <div class="container text-center"> <a href="/blog"><h2>Blog</h2></a> </div> </section> <div class="container-fluid blog-content-item"> <div id="item" class=h-entry"> <div class="list-item s-blog-entry"> <div class="list-blog-header"> <span class="list-blog-date"> <span class="blog-author">hugh,</span> <time class="dt-published" datetime="2017-06-19T15:28:00+00:00"> <span>19</span> <em>Jun</em> </time> </span> <h4 class="p-name"><a href="/blog/magnetic-scrolls-games-source-code-recovered" class="u-url">Magnetic Scrolls Original Games Source Code Recovered!</a></h4> <div class="x-blog-tag"> <span class="tags"> <a href="/blog/tag:history" class="p-category">history</a> </span> </div> <div class="x-blog-img-pad"> <img alt="" src="/images/9/1/f/e/c/91fec54f1475ef3eb189ef80c43e41427c03f71c-tapeoven900.jpg" /> </div> </div> <div class="list-blog-padding"> <div class="e-content"> <p>Here we have <em>possibly</em> the only surviving backup tape of the source code to 30 year old historical game data being <em>put into an oven and baked!</em></p> <p><em>Have we gone raving mad? Have we totally lost it? What is this insanity?</em></p> <p>The dish is: <em>Baked tapes!</em> Done nicely in your normal kitchen oven. Cook at 45C for 8 hours, take them out, wait to cool then server them (in your server, of course) to hopefully make a good source.</p> <p>No, we're not quite totally crazy (yet). Amazing as it seems, this is the way to restore certain old tape backups. I kid you not.</p> <p>Read on, for the madness...</p> <p>It <strong>wasn't</strong> easy! It took a lot of guesswork, experimentation and raw persistence to finally recover the source code for the original Magnetic Scrolls interactive fiction games from their backup tapes.</p> <p>For over 30 years the only copy of the data lay on now obsolete <a href="/blog/how-to-read-tk50">TK50</a> tape cartridges. You might think, a bit like I did (foolishly), that high quality backups such as these, on proper DEC backup tape media, made with an 1980s DEC <a href="https://en.wikipedia.org/wiki/MicroVAX">MicroVax</a>, would essentially be able to remain on the tape almost indefinitely, providing the tapes themselves are kept in good condition - like in a cupboard, drawer or even perhaps an attic.</p> <p>You would think then, the biggest problem is <em>somehow</em> locating someone with a compatible system and tape drive set up and working. If you can find <em>that</em> system, just <em>pop</em> in the tapes and read away - job done! No problem. Back in time for tea and biscuits!</p> <p><em>Well No, actually</em></p> <p>First, I need to go back a bit and explain the rather curious history of the <a href="/blog/magnetic-scrolls-backups">box of tapes</a> itself.</p> <h2>Back in the Day</h2> <p>Magnetic Scrolls cross-developed its series of interactive fiction on a DEC MicroVAX minicomputer. Everyone would be attached to the central machine via character-based terminal interfaces. Like a LAN but slower and connected via <a href="https://en.wikipedia.org/wiki/Serial_communication">serial comms</a> at 9600 baud - a kind of prehistoric intranet.</p> <p>The upside of this was that <em>all</em> files and <em>data</em> were stored centrally, and it was practical that everyone's work was "on the server" (a bit like today actually). The difference was, that files were not also on the local machines, because they were just dumb terminals with a wire out the back.</p> <p>The only surviving picture from those days, is <a href="/blog/who-was-fred-23">Rob Steggles here</a> shown trying to juggle inflatable dinosaurs (don't ask!).</p> <p>So, all the backups were made by the central minicomputer using the backup tape technology of the time. It seemed a good idea, and probably was. I have no doubt that, had we needed to restore one of the backups on the same machine around the same time, it would have worked right away without any problem whatsoever.</p> <p><em>The same machine around the same time...</em></p> <p>Turned out we never needed to restore any backups. A testament to the reliability of the DEC VAX hardware back then. So all the tapes sat lonely on a shelf and were eventually put into a cardboard box and forgotten about (it's a tape's life 'eh, but they got their revenge).</p> <p><em>Where did that box go?</em></p> <p>The box of tapes turned up again about 17 years ago (around the year 2000), when I recovered them with the <em>mad idea</em> to try to read them and re-release the games on them. Unfortunately, at that time I made no progress in locating the means to read the, even by that time, obsolete tape format.</p> <p>The box sat at the back of an office and was forgotten about again.</p> <h2>Lucky Break</h2> <p>Until recently, when an unexpected sequence of events caused the tapes to turn up again. It turned out, the box of tapes had been rescued by Servan Keondjian (who was also at Scrolls in the old days). He'd put the box in an attic somewhere and also forgotten about them. </p> <p>Servan no longer lives in the UK and during a visit to London, I asked him, as a long-shot, if he had any idea at all where the tapes might have gone. Turned out he <em>did know</em>, and furthermore was able to obtain the tapes for me from their hiding place, just in time, before flying back out of the UK.</p> <p>So now finally, I have the tapes! <em>Mwahahaha!</em> But uh-oh, how to read them??</p> <h2>Rob Jarratt</h2> <p>I put out some queries on vintage forums and was put in touch with Rob Jarratt. Amazingly, Rob has a working DEC system <em>and importantly</em> a working compatible tape drive.</p> <p>Extremely generously, Rob magnanimously offered to help recover the data. At this point, I thought the data was practically <em>in the bag</em> - Just read the tapes and presto! Should be easy, no?</p> <p>Here's Rob original setup for that <a href="/blog/first-attempt-at-restoring-magnetic-scrolls-backup-tapes">first attempt</a> (Unfortunately, the TZ85 shown here was not compatible and Rob switched to TK50Z for the first attempt).</p> <p><img alt="" src="/user/pages/04.blog/b170619/tz85.jpg" /></p> <p><em>Just read the tapes...</em></p> <p>Immediately we hit the problem. The tapes would not read. Turns out that old tape suffers the, so-called, <a href="https://en.wikipedia.org/wiki/Sticky-shed_syndrome">Sticky Shed</a> syndrome. </p> <p>Now, this is <em>really horrible</em> for several reasons; not only does tape oxide rub off the old tape, covering the tape drive, clogging the head and messing up the drive guides and rollers, but the tape is also slightly sticky because it has absorbed water.</p> <p>Do you remember old music cassettes? Remember those times when, all of a sudden the music goes a bit weird and muffled, followed by a disconcerting <em>tape chewing</em> sound. You open the tape compartment to find a massive ball of tangled tape knotted up and totally ruined!</p> <p>Well, imagine the same thing, but with your only data backup, Uh-oh!</p> <p>Rob knew about this problem and also that some people had had, in the past, some success with <em>baking</em> the tapes. The idea is that heating the tape for several hours at a relatively low temperature (for an oven), will dry out the tape for long enough for it to be read without sticking.</p> <p>But at <em>what</em> temperature? and for <em>how</em> long? And if too high or for too long, would it ruin the tape forever?</p> <p>These are the questions that very few people know know solid answers.</p> <p>Initial results were a bit disappointing. We had some tantalising glimpses, where tape would read <em>slightly</em>. Did that mean more cooking was needed? or is something else the problem?</p> <p>Here's Rob Dismantled TK50Z drive and my <a href="/blog/tk50-tape-baking">blog report</a> after the initial baking attempts.</p> <p><img alt="" src="/user/pages/04.blog/b170619/tk50z.jpg" /></p> <h2>The Breakthrough</h2> <p>We needed a breakthrough! Bits and pieces of files here and there would never have realistically given a workable recovery. It's the nature of data unfortunately, that you need it <em>all</em> otherwise it's a bit useless.</p> <p>The clue was knowing that the baking was <em>working</em> to fix the sticky problem, but it wasn't fixing the tape oxide <em>deposit</em> problem.</p> <p>The problem was, now the tape would read <em>at first</em> and then become unreadable due to oxide deposits. Rob would clean the drive head for each read, but that would only give a limited run of tape before the head became clogged with oxide again.</p> <p>Like that muffled music sound on your old cassette player, it just wasn't high fidelity anymore!</p> <p>Exacerbating this problem was that the TK50Z tape drive would spool the tape up and down at the start in order to find the tape directory. It needed to know what was on the tape <em>before</em> data extraction.</p> <p>How easy is it to clean the heads of these drives. Can it be done with the tape loaded even?</p> <p>Nice idea, but tape drives are complicated beasts that aren't particularly obliging to your plans to meddle with the mechanism while it has a tape active and loaded.</p> <p>On a TK50Z drive, it is not possible to clean the heads while the tape is mounted because they have to be lifted to get at them. But when the drive is powered they won't budge. This is because they are moved up and down by the drive during operation, presumably the motor that moves them is energised while the power is on.</p> <p>You can only clean the TK50Z after removing the tape and, each time another tape is loaded, it likes to spool the tape up and down a few times before data extraction. This is because DLT tapes store the data in parallel tracks, each the <em>length</em> of the whole tape.</p> <h2>Solving the Conundrum</h2> <div class="grav-youtube-wrapper "> <div class="grav-youtube"> <iframe src="https://www.youtube.com/embed/5qcK8gyj8V0" frameborder="0" allowfullscreen></iframe> </div> </div> <p>Rob switched from using the TK50Z to a TZ30 drive, which can read (but not write) a TK50 cartridge. This wasn't tried earlier because unfortunately it isn't compatible with the operating system. But the TZ30 does less pre-read spooling and is a newer drive.</p> <p>That, in itself, wasn't enough but, in a <em>masterstroke</em>, Rob discovered it is possible to remove a couple of circlips from the TZ30 mechanism so as to lift the head <em>just enough</em> to clean it with an isopropyl-soaked cotton bud.</p> <p>This meant the drive head could be cleaned before the actual data read.</p> <p>Suddenly, Rob's read yield jumped from 7MB to 70MB (the tapes full capacity is around 90MB). He managed to read 70MB from one tape and 54MB from another. Bingo!</p> <p>Fortunately <em>both</em> tapes contained full copies of the important source data we needed, and as final validation, comparing the files recovered from each tape showed them to be identical and therefore almost certainly a good read.</p> <p>So this is amazing news, and it was down to Rob's ingenuity and dogged persistence that we managed to recover this data. There was absolutely no way it could have been done without him.</p> <p>Examining the data, I have managed to verify that I <em>really</em> can re-build these old games from their source codes. Which is fantastic news as it means the original code can be adjusted as rebuilt for the forthcoming re-masters.</p> <p>For Rob, he's most definitely earned the title of "Tape Baking Master". We were lucky enough to be able to take some calculated risks with some of the tapes, as a few were just backups of user or system files (they had labels). Imagine if there was only ever one and one only tape. Would we have risked the baking unknowns? I don't know the answer to that, but luckily we didn't have to face it.</p> <p>I really hope that by sharing our experiences in this endeavour, it helps others to successfully recover other historical tapes.</p> <p>Rob Jarratt has done an <em>absolutely amazing</em> job with all this, and I'm really pleased that the recovery has finally been a success. It would have been such a shame if we had failed to recover the tapes after all this effort - especially since I now know that the other backup media I have, does not have copies of the original games, the only copies are on these TK50s.</p> <h2>Going Forward</h2> <p>Work has already started in re-mastering of <em>The Guild of Thieves</em>, which is the second Magnetic Scrolls game. I'm pleased to announce that this will come with the updated game source code and;</p> <p>We'll be adding <em>extra locations, objects and puzzles</em> as well as Rob Jarratt to the game credits.</p> </div> <p class="prev-next"> <a class="button" href="/blog/restoring-the-guild-of-thieves-by-magnetic-scrolls"><i class="fa fa-chevron-left"></i> Next Post</a> <a class="button" href="/blog/the-pawn-desktop-on-itch">Previous Post <i class="fa fa-chevron-right"></i></a> </p> </div> </div> </div> </div> </div> </div> <div class="uc-mobile-menu uc-mobile-menu-effect"> <button type="button" class="close" aria-hidden="true" data-toggle="offcanvas" id="uc-mobile-menu-close-btn">&times;</button> <div> <div> <ul id="menu"> <li class=""> <a href="/">Home</a> </li> <li class=""> <a href="/about">About</a> </li> <li class=""> <a href="/games">Games</a> </li> <li class="active"> <a href="/blog">Blog</a> </li> <li class=""> <a href="/help">Help</a> </li> <li class=""> <a href="/projects">Projects</a> </li> <li class=""> <a href="/community">Community</a> </li> </ul> </div> </div> </div> </div> <footer class="footer"> <div class="footer-widget-section"> <div class="container text-center"> <div class="row"> <div class="col-sm-4 footer-block"> <div class="footer-widget widget_text"> <div class="footer-logo"> <a href="/"> <img src="/user/themes/strand/img/s_99a.png" alt=""> </a> </div> Strand Games<br/>History, Technology and Interactive Fiction </div> </div> <div class="col-sm-4 footer-block"> <div class="footer-widget widget_text"> <h3>Become a Strand</h3> Help us make IF.<br/>We are an open-source organisation.<br/><br/>Each strand makes us stronger </div> </div> <div class="col-sm-4 footer-block"> <div class="footer-widget widget_text"> <h3>Contact Us</h3> Email <a href="mailto:contact@strandgames.com">contact@strandgames.com</a> <ul class="list-inline social-links"> <li><a href="https://www.facebook.com/"><i class="fa fa-facebook"></i></a></li> <li><a href="https://www.twitter.com/"><i class="fa fa fa-twitter"></i></a></li> <li><a href="https://www.google.com/"><i class="fa fa-google-plus"></i></a></li> <li><a href="https://www.dribbble.com/"><i class="fa fa-dribbble"></i></a></li> </ul> </div> </div> </div> </div> </div> <div class="copyright-section"> <div class="container clearfix"> <span class="copytext">Copyright &copy; Strand Games 2022</span> <ul class="list-inline pull-right"> <li class=""><a href="/">Home</a></li> <li class=""><a href="/about">About</a></li> <li class=""><a href="/games">Games</a></li> <li class=""><a href="/help">Help</a></li> <li class=""><a href="/projects">Projects</a></li> <li class=""><a href="/community">Community</a></li> </ul> </div> </div> </footer> <script src="/system/assets/jquery/jquery-2.x.min.js"></script> <script src="/user/plugins/lightslider/js/lightslider.min.js"></script> <script src="/user/plugins/featherlight/js/featherlight.min.js"></script> <script src="/user/themes/strand/js/jquery-2.1.4.min.js"></script> <script src="/user/themes/strand/js/smoothscroll.js"></script> <script src="/user/themes/strand/js/mobile-menu.js"></script> <script src="/user/themes/strand/js/flexSlider/jquery.flexslider-min.js"></script> <script src="/user/themes/strand/js/scripts.js"></script> <script src="/user/themes/strand/js/bootstrap.min.js"></script> <script src="/user/themes/strand/js/lightslider.min.js"></script> <script src="/user/themes/strand/js/slick/slick.min.js"></script> <script src="/user/themes/strand/js/featherlight.min.js"></script> <script> $(document).ready(function(){ $('a[rel="lightbox"]').featherlight({ openSpeed: 250, closeSpeed: 250, closeOnClick: 'background', closeOnEsc: '1', root: 'body' }); }); </script> <script> $(window).load(function (){ $('#acc-banner').slick({ slidesToShow: 2, slidesToScroll: 1, autoplay: false, dots: false, infinite: false, responsive: [ { breakpoint: 1024, settings: { slidesToShow: 2, slidesToScroll: 1, infinite: false, dots: false } }, { breakpoint: 768, settings: { slidesToShow: 2, slidesToScroll: 1, infinite: false, dots: false, vertical: true } } ] }); $('#acc-products').slick({ slidesToShow: 3, slidesToScroll: 1, autoplay: true, autoplaySpeed: 3500, dots: true, infinite: true, responsive: [ { breakpoint: 1024, settings: { slidesToShow: 2, slidesToScroll: 1, infinite: true, dots: true } }, { breakpoint: 768, settings: { slidesToShow: 1, slidesToScroll: 1, infinite: true, dots: true } } ] }); var stHeight = $('#acc-products .slick-track').height(); $('#acc-products .slick-slide').css('height',stHeight + 'px' ); $('#acc-products').on('setPosition', function () { $(this).find('#acc-products .slick-slide').height('auto'); var slickTrack = $(this).find('#acc-products .slick-track'); var slickTrackHeight = $(slickTrack).height(); $(this).find('#acc-products .slick-slide').css('height', slickTrackHeight + 'px'); }); /* var stHeight = $('#acc-banner .slick-track').height(); $('#acc-banner .slick-slide').css('height',stHeight + 'px' ); $('#acc-banner').on('setPosition', function () { $(this).find('#acc-banner .slick-slide').height('auto'); var slickTrack = $(this).find('#acc-banner .slick-track'); var slickTrackHeight = $(slickTrack).height(); $(this).find('#acc-banner .slick-slide').css('height', slickTrackHeight + 'px'); }); */ }); </script> <script> $(document).ready(function() { var $window = $(window); var windowWidth = $window.width(); if ($('#ddmenu').length) { $('#ddmenu').menu(hints); jQuery(window).resize(function() { if ($window.width() != windowWidth) { windowWidth = $window.width(); $('#ddmenu').empty(); $('#ddmenu').menu(hints); } }); } }); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10