soundsmith/docs/xmas.html

977 lines
33 KiB
HTML
Raw Normal View History

2017-08-21 18:12:33 +00:00
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.6.9" />
<title>Extracting music from the Xmas demo</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
/* Default font. */
body {
font-family: Georgia,serif;
}
/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
font-family: Arial,Helvetica,sans-serif;
}
body {
margin: 1em 5% 1em 5%;
}
a {
color: blue;
text-decoration: underline;
}
a:visited {
color: fuchsia;
}
em {
font-style: italic;
color: navy;
}
strong {
font-weight: bold;
color: #083194;
}
h1, h2, h3, h4, h5, h6 {
color: #527bbd;
margin-top: 1.2em;
margin-bottom: 0.5em;
line-height: 1.3;
}
h1, h2, h3 {
border-bottom: 2px solid silver;
}
h2 {
padding-top: 0.5em;
}
h3 {
float: left;
}
h3 + * {
clear: left;
}
h5 {
font-size: 1.0em;
}
div.sectionbody {
margin-left: 0;
}
hr {
border: 1px solid silver;
}
p {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
ul, ol, li > p {
margin-top: 0;
}
ul > li { color: #aaa; }
ul > li > * { color: black; }
.monospaced, code, pre {
font-family: "Courier New", Courier, monospace;
font-size: inherit;
color: navy;
padding: 0;
margin: 0;
}
pre {
white-space: pre-wrap;
}
#author {
color: #527bbd;
font-weight: bold;
font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}
#footer {
font-size: small;
border-top: 2px solid silver;
padding-top: 0.5em;
margin-top: 4.0em;
}
#footer-text {
float: left;
padding-bottom: 0.5em;
}
#footer-badges {
float: right;
padding-bottom: 0.5em;
}
#preamble {
margin-top: 1.5em;
margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
div.admonitionblock {
margin-top: 2.0em;
margin-bottom: 2.0em;
margin-right: 10%;
color: #606060;
}
div.content { /* Block element content. */
padding: 0;
}
/* Block element titles. */
div.title, caption.title {
color: #527bbd;
font-weight: bold;
text-align: left;
margin-top: 1.0em;
margin-bottom: 0.5em;
}
div.title + * {
margin-top: 0;
}
td div.title:first-child {
margin-top: 0.0em;
}
div.content div.title:first-child {
margin-top: 0.0em;
}
div.content + div.title {
margin-top: 0.0em;
}
div.sidebarblock > div.content {
background: #ffffee;
border: 1px solid #dddddd;
border-left: 4px solid #f0f0f0;
padding: 0.5em;
}
div.listingblock > div.content {
border: 1px solid #dddddd;
border-left: 5px solid #f0f0f0;
background: #f8f8f8;
padding: 0.5em;
}
div.quoteblock, div.verseblock {
padding-left: 1.0em;
margin-left: 1.0em;
margin-right: 10%;
border-left: 5px solid #f0f0f0;
color: #888;
}
div.quoteblock > div.attribution {
padding-top: 0.5em;
text-align: right;
}
div.verseblock > pre.content {
font-family: inherit;
font-size: inherit;
}
div.verseblock > div.attribution {
padding-top: 0.75em;
text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
text-align: left;
}
div.admonitionblock .icon {
vertical-align: top;
font-size: 1.1em;
font-weight: bold;
text-decoration: underline;
color: #527bbd;
padding-right: 0.5em;
}
div.admonitionblock td.content {
padding-left: 0.5em;
border-left: 3px solid #dddddd;
}
div.exampleblock > div.content {
border-left: 3px solid #dddddd;
padding-left: 0.5em;
}
div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; vertical-align: text-bottom; }
a.image:visited { color: white; }
dl {
margin-top: 0.8em;
margin-bottom: 0.8em;
}
dt {
margin-top: 0.5em;
margin-bottom: 0;
font-style: normal;
color: navy;
}
dd > *:first-child {
margin-top: 0.1em;
}
ul, ol {
list-style-position: outside;
}
ol.arabic {
list-style-type: decimal;
}
ol.loweralpha {
list-style-type: lower-alpha;
}
ol.upperalpha {
list-style-type: upper-alpha;
}
ol.lowerroman {
list-style-type: lower-roman;
}
ol.upperroman {
list-style-type: upper-roman;
}
div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
margin-top: 0.1em;
margin-bottom: 0.1em;
}
tfoot {
font-weight: bold;
}
td > div.verse {
white-space: pre;
}
div.hdlist {
margin-top: 0.8em;
margin-bottom: 0.8em;
}
div.hdlist tr {
padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
font-weight: bold;
}
td.hdlist1 {
vertical-align: top;
font-style: normal;
padding-right: 0.8em;
color: navy;
}
td.hdlist2 {
vertical-align: top;
}
div.hdlist.compact tr {
margin: 0;
padding-bottom: 0;
}
.comment {
background: yellow;
}
.footnote, .footnoteref {
font-size: 0.8em;
}
span.footnote, span.footnoteref {
vertical-align: super;
}
#footnotes {
margin: 20px 0 20px 0;
padding: 7px 0 0 0;
}
#footnotes div.footnote {
margin: 0 0 5px 0;
}
#footnotes hr {
border: none;
border-top: 1px solid silver;
height: 1px;
text-align: left;
margin-left: 0;
width: 20%;
min-width: 100px;
}
div.colist td {
padding-right: 0.5em;
padding-bottom: 0.3em;
vertical-align: top;
}
div.colist td img {
margin-top: 0.3em;
}
@media print {
#footer-badges { display: none; }
}
#toc {
margin-bottom: 2.5em;
}
#toctitle {
color: #527bbd;
font-size: 1.1em;
font-weight: bold;
margin-top: 1.0em;
margin-bottom: 0.1em;
}
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
margin-top: 0;
margin-bottom: 0;
}
div.toclevel2 {
margin-left: 2em;
font-size: 0.9em;
}
div.toclevel3 {
margin-left: 4em;
font-size: 0.9em;
}
div.toclevel4 {
margin-left: 6em;
font-size: 0.9em;
}
span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }
span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }
span.big { font-size: 2em; }
span.small { font-size: 0.6em; }
span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }
div.unbreakable { page-break-inside: avoid; }
/*
* xhtml11 specific
*
* */
div.tableblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
div.tableblock > table {
border: 3px solid #527bbd;
}
thead, p.table.header {
font-weight: bold;
color: #527bbd;
}
p.table {
margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
border-style: none;
}
div.tableblock > table[frame="hsides"] {
border-left-style: none;
border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
border-top-style: none;
border-bottom-style: none;
}
/*
* html5 specific
*
* */
table.tableblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
thead, p.tableblock.header {
font-weight: bold;
color: #527bbd;
}
p.tableblock {
margin-top: 0;
}
table.tableblock {
border-width: 3px;
border-spacing: 0px;
border-style: solid;
border-color: #527bbd;
border-collapse: collapse;
}
th.tableblock, td.tableblock {
border-width: 1px;
padding: 4px;
border-style: solid;
border-color: #527bbd;
}
table.tableblock.frame-topbot {
border-left-style: hidden;
border-right-style: hidden;
}
table.tableblock.frame-sides {
border-top-style: hidden;
border-bottom-style: hidden;
}
table.tableblock.frame-none {
border-style: hidden;
}
th.tableblock.halign-left, td.tableblock.halign-left {
text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
text-align: right;
}
th.tableblock.valign-top, td.tableblock.valign-top {
vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
vertical-align: bottom;
}
/*
* manpage specific
*
* */
body.manpage h1 {
padding-top: 0.5em;
padding-bottom: 0.5em;
border-top: 2px solid silver;
border-bottom: 2px solid silver;
}
body.manpage h2 {
border-style: none;
}
body.manpage div.sectionbody {
margin-left: 3em;
}
@media print {
body.manpage div#toc { display: none; }
}
</style>
<script type="text/javascript">
/*<![CDATA[*/
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Table Of Content generator
* Version: 0.4
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
/* modified by Troy D. Hanson, September 2006. License: GPL */
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
// toclevels = 1..4.
toc: function (toclevels) {
function getText(el) {
var text = "";
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
text += i.data;
else if (i.firstChild != null)
text += getText(i);
}
return text;
}
function TocEntry(el, text, toclevel) {
this.element = el;
this.text = text;
this.toclevel = toclevel;
}
function tocEntries(el, toclevels) {
var result = new Array;
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
// Function that scans the DOM tree for header elements (the DOM2
// nodeIterator API would be a better technique but not supported by all
// browsers).
var iterate = function (el) {
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
var mo = re.exec(i.tagName);
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
}
iterate(i);
}
}
}
iterate(el);
return result;
}
var toc = document.getElementById("toc");
if (!toc) {
return;
}
// Delete existing TOC entries in case we're reloading the TOC.
var tocEntriesToRemove = [];
var i;
for (i = 0; i < toc.childNodes.length; i++) {
var entry = toc.childNodes[i];
if (entry.nodeName.toLowerCase() == 'div'
&& entry.getAttribute("class")
&& entry.getAttribute("class").match(/^toclevel/))
tocEntriesToRemove.push(entry);
}
for (i = 0; i < tocEntriesToRemove.length; i++) {
toc.removeChild(tocEntriesToRemove[i]);
}
// Rebuild TOC entries.
var entries = tocEntries(document.getElementById("content"), toclevels);
for (var i = 0; i < entries.length; ++i) {
var entry = entries[i];
if (entry.element.id == "")
entry.element.id = "_toc_" + i;
var a = document.createElement("a");
a.href = "#" + entry.element.id;
a.appendChild(document.createTextNode(entry.text));
var div = document.createElement("div");
div.appendChild(a);
div.className = "toclevel" + entry.toclevel;
toc.appendChild(div);
}
if (entries.length == 0)
toc.parentNode.removeChild(toc);
},
/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////
/* Based on footnote generation code from:
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
*/
footnotes: function () {
// Delete existing footnote entries in case we're reloading the footnodes.
var i;
var noteholder = document.getElementById("footnotes");
if (!noteholder) {
return;
}
var entriesToRemove = [];
for (i = 0; i < noteholder.childNodes.length; i++) {
var entry = noteholder.childNodes[i];
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
entriesToRemove.push(entry);
}
for (i = 0; i < entriesToRemove.length; i++) {
noteholder.removeChild(entriesToRemove[i]);
}
// Rebuild footnote entries.
var cont = document.getElementById("content");
var spans = cont.getElementsByTagName("span");
var refs = {};
var n = 0;
for (i=0; i<spans.length; i++) {
if (spans[i].className == "footnote") {
n++;
var note = spans[i].getAttribute("data-note");
if (!note) {
// Use [\s\S] in place of . so multi-line matches work.
// Because JavaScript has no s (dotall) regex flag.
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
spans[i].innerHTML =
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
"' title='View footnote' class='footnote'>" + n + "</a>]";
spans[i].setAttribute("data-note", note);
}
noteholder.innerHTML +=
"<div class='footnote' id='_footnote_" + n + "'>" +
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
n + "</a>. " + note + "</div>";
var id =spans[i].getAttribute("id");
if (id != null) refs["#"+id] = n;
}
}
if (n == 0)
noteholder.parentNode.removeChild(noteholder);
else {
// Process footnoterefs.
for (i=0; i<spans.length; i++) {
if (spans[i].className == "footnoteref") {
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
href = href.match(/#.*/)[0]; // Because IE return full URL.
n = refs[href];
spans[i].innerHTML =
"[<a href='#_footnote_" + n +
"' title='View footnote' class='footnote'>" + n + "</a>]";
}
}
}
},
install: function(toclevels) {
var timerId;
function reinstall() {
asciidoc.footnotes();
if (toclevels) {
asciidoc.toc(toclevels);
}
}
function reinstallAndRemoveTimer() {
clearInterval(timerId);
reinstall();
}
timerId = setInterval(reinstall, 500);
if (document.addEventListener)
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
else
window.onload = reinstallAndRemoveTimer;
}
}
asciidoc.install();
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Extracting music from the Xmas demo</h1>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>This is very similar to the documentation on extracting music from Modulae.
The steps are a little more involved since the Xmas demo is a multi-part
demo, where the code and music for each part is loaded from disk separately.</p></div>
<div class="paragraph"><p>As with Modulae, we&#8217;ll start with extracting the initial boot loader.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/disasm xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">800</span> <span style="color: #993399">0</span> <span style="color: #993399">1</span> <span style="color: #990000">&gt;</span> boot<span style="color: #990000">.</span>s</tt></pre></div></div>
<div class="paragraph"><p>This time, the loading starts at <code>$08e3</code>. It loads blocks 7&#8212;17 into
RAM starting at <code>$9000</code> and then calls the decrunch routine at <code>$0a00</code>.</p></div>
<div class="paragraph"><p>We&#8217;ll do the same to extract the main loader.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">7</span> <span style="color: #993399">11</span> loader
<span style="color: #990000">.</span>/disasm loader <span style="color: #993399">9000</span> <span style="color: #990000">&gt;</span> loader<span style="color: #990000">.</span>s</tt></pre></div></div>
<div class="paragraph"><p>Again, we track down the loading routine. This time, it&#8217;s a function
located at <code>$9c3f</code>. It gets called multiple times, to load the different
parts of the demo. The <code>A</code> register holds the address of the table to use
when loading.</p></div>
<div class="paragraph"><p>The first time the loader is called, it uses the table at <code>$9ac3</code>. This
table only contains the loading screen graphics. So we&#8217;ll ignore it.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_loading_8230_music">Loading&#8230; Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>The second time the loader is called, it uses the table at <code>$9ad5</code>.
We&#8217;ll extract the table offsets as we did in the Modulae example. Using
the relative address of the table from the start of the loader file.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/dumptbl loader ad5</tt></pre></div></div>
<div class="paragraph"><p>We can see a huge chunk of data that is loaded into <code>$e:9000</code>. We&#8217;ll
go ahead and disassemble it and look for the music player.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">47</span> <span style="color: #993399">92</span> loading
<span style="color: #990000">.</span>/disasm loading e9000 <span style="color: #990000">&gt;</span> loading<span style="color: #990000">.</span>s</tt></pre></div></div>
<div class="paragraph"><p>Most of the loading disassembly is actually noise because we disassembled
data.. but we know from the loader that after this block of data is loaded
and decrunched, it calls <code>$f:f000</code>. We can use that to follow the code
flow and inspect the music player.</p></div>
<div class="paragraph"><p>We see that the music player is slightly different from the standard
soundsmith music player. The timer runs on the last channel instead of the
first channel, and the tempo sets the timer frequency based on a lookup
table. Neither of things really matter, they&#8217;re just used to lighten the CPU
load a bit.</p></div>
<div class="paragraph"><p>We discover the music starts at <code>$e:9000</code> and the wavebank starts at <code>$e:e700</code>.
We&#8217;ll use the trim functions to extract the data into separate files.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/trimmusic loading <span style="color: #993399">0</span> loading<span style="color: #990000">.</span>song
<span style="color: #990000">.</span>/trimwb loading <span style="color: #993399">5700</span> loading<span style="color: #990000">.</span>wb</tt></pre></div></div>
</div>
</div>
<div class="sect1">
<h2 id="_main_menu_music">Main Menu Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>The next time the loader is called, it uses the table at <code>$9ae7</code>.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/dumptbl loader ae7</tt></pre></div></div>
<div class="paragraph"><p>We hunt for the music player, and discover it. We also discover that
the music and wavebank are again combined into a giant block of data.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">139</span> <span style="color: #993399">122</span> main
<span style="color: #990000">.</span>/trimmusic main <span style="color: #993399">0</span> main<span style="color: #990000">.</span>song
<span style="color: #990000">.</span>/trimwb main <span style="color: #993399">9600</span> main<span style="color: #990000">.</span>wb</tt></pre></div></div>
<div class="paragraph"><p>After the main menu, the different parts of the demo are selectable by the
user. Making a selection causes the loader to load a unique table which
contains the graphics and the music and a different music player.</p></div>
<div class="paragraph"><p>The process is pretty much the same for each section. We look at the
table, we track down the music player, we use that to determine where
the music and wavetables are.</p></div>
<div class="paragraph"><p>I&#8217;ll just summarize each section from here-on out since the process is the
same for each. I will include the dumptbl command for each, though,
so you can see the block table for each section.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_section_1_music">Section 1 Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>The music and wavebanks are combined again, and loaded into <code>$7:0000</code>.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/dumptbl loader b09
<span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">393</span> <span style="color: #993399">135</span> section1
<span style="color: #990000">.</span>/trimmusic section1 <span style="color: #993399">0</span> section1<span style="color: #990000">.</span>song
<span style="color: #990000">.</span>/trimwb section1 a000 section1<span style="color: #990000">.</span>wb</tt></pre></div></div>
</div>
</div>
<div class="sect1">
<h2 id="_section_2_music">Section 2 Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>The music is loaded into <code>$5:0000</code>, the wavebank is loaded into <code>$3:0000</code>
and not crunched.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/dumptbl loader b4d
<span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">682</span> <span style="color: #993399">67</span> section2<span style="color: #990000">.</span>song
<span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">749</span> <span style="color: #993399">131</span> section2<span style="color: #990000">.</span>wb raw</tt></pre></div></div>
<div class="paragraph"><p>You can pass the song and wavebank back through the trim functions to
trim off the padding.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_section_3_music">Section 3 Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>The music and wavebank are combined again, and loaded into <code>$c:0000</code>.
The music doesn&#8217;t sound quite right, so I&#8217;m thinking it may be patched
elsewhere.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/dumptbl loader b2b
<span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">538</span> <span style="color: #993399">114</span> section3
<span style="color: #990000">.</span>/trimmusic section3 <span style="color: #993399">0</span> section3<span style="color: #990000">.</span>song
<span style="color: #990000">.</span>/trimwb section3 <span style="color: #993399">8200</span> section3<span style="color: #990000">.</span>wb</tt></pre></div></div>
</div>
</div>
<div class="sect1">
<h2 id="_section_4_music">Section 4 Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>The music and wavebank are combined again, loaded into <code>$7:0000</code>.
The loader hot-patches the music just after loading it. It sets the word at
<code>$7:0006</code> to <code>$3b80</code>. This sets the size of each block to <code>$3b80</code>, where
it was previously <code>$3b00</code>. We&#8217;ll go ahead and duplicate that patch in
our extract process.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/dumptbl loader b7f
<span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">915</span> <span style="color: #993399">127</span> section4
<span style="font-weight: bold"><span style="color: #0000FF">printf</span></span> <span style="color: #FF0000">'</span><span style="color: #CC33CC">\x</span><span style="color: #FF0000">80</span><span style="color: #CC33CC">\x</span><span style="color: #FF0000">3b'</span> <span style="color: #990000">|</span> dd <span style="color: #009900">of</span><span style="color: #990000">=</span>section4 <span style="color: #009900">bs</span><span style="color: #990000">=</span><span style="color: #993399">1</span> <span style="color: #009900">seek</span><span style="color: #990000">=</span><span style="color: #993399">6</span> <span style="color: #009900">count</span><span style="color: #990000">=</span><span style="color: #993399">2</span> <span style="color: #009900">conv</span><span style="color: #990000">=</span>notrunc
<span style="color: #990000">.</span>/trimmusic section4 <span style="color: #993399">0</span> section4<span style="color: #990000">.</span>song
<span style="color: #990000">.</span>/trimwb section4 b600 section4<span style="color: #990000">.</span>wb</tt></pre></div></div>
</div>
</div>
<div class="sect1">
<h2 id="_section_5_music">Section 5 Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>Section 5 doesn&#8217;t have any music. This is a very strange section too, since
it does two different things depending on whether or not you have the 3rd
joystick button held when it launches. Easter egg?</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_section_6_music">Section 6 Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>Section 6 also is missing music, but it does have a sound effect that
is loaded into <code>$3:0000</code>.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_section_7_music">Section 7 Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>The music is loaded into <code>$4:0000</code> along with the demo code. The wavebank
is loaded into <code>$3:0000</code>. Unfortunately, the wavebank is incomplete for
some reason, making this music unplayable. I haven&#8217;t figured out how the
demo patches the wavebank.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/dumptbl loader bbb
<span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">1078</span> <span style="color: #993399">103</span> section7
<span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">1181</span> <span style="color: #993399">56</span> section7<span style="color: #990000">.</span>wb raw
<span style="color: #990000">.</span>/trimmusic section7 <span style="color: #993399">10000</span> section7<span style="color: #990000">.</span>song</tt></pre></div></div>
</div>
</div>
<div class="sect1">
<h2 id="_section_8_music">Section 8 Music</h2>
<div class="sectionbody">
<div class="paragraph"><p>This one is tricky. It first loads the table at <code>$9c1b</code>, which loads
uncrunched data into <code>$2000</code>. It then loads the table at <code>$9c2d</code> which
loads more uncrunched data into <code>$3:0000</code>. It then takes <code>$100</code> bytes from
<code>$2010</code> and appends them onto the end of the data at <code>$3:0000</code>. Finally, it
uncrunches the data at <code>$3:0000</code>. So we&#8217;ll have to do this patch as well.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">.</span>/dumptbl loader c1b
<span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">24</span> <span style="color: #993399">16</span> patch raw
<span style="color: #990000">.</span>/dumptbl loader c2d
<span style="color: #990000">.</span>/decrunch xmasdemo<span style="color: #990000">.</span>2mg <span style="color: #993399">1487</span> <span style="color: #993399">113</span> crunched raw
dd <span style="font-weight: bold"><span style="color: #0000FF">if</span></span><span style="color: #990000">=</span>patch <span style="color: #009900">of</span><span style="color: #990000">=</span>crunched <span style="color: #009900">skip</span><span style="color: #990000">=</span><span style="color: #993399">16</span> <span style="color: #009900">bs</span><span style="color: #990000">=</span><span style="color: #993399">1</span> <span style="color: #009900">count</span><span style="color: #990000">=</span><span style="color: #993399">256</span> <span style="color: #009900">oflag</span><span style="color: #990000">=</span>append <span style="color: #009900">conv</span><span style="color: #990000">=</span>notrunc
<span style="color: #990000">.</span>/decrunch crunched <span style="color: #993399">0</span> <span style="color: #993399">0</span> section8
<span style="color: #990000">.</span>/trimmusic section8 <span style="color: #993399">1000</span> section8<span style="color: #990000">.</span>song
<span style="color: #990000">.</span>/trimwb seciton8 <span style="color: #993399">7000</span> section8<span style="color: #990000">.</span>wb</tt></pre></div></div>
<div class="paragraph"><p>And that&#8217;s all the music in the xmas demo that I can find.</p></div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Last updated
2017-08-21 11:09:12 MST
</div>
</div>
</body>
</html>