<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.intellivision.us/index.php?action=history&amp;feed=atom&amp;title=Tracker.asm_and_tracker.mac</id>
		<title>Tracker.asm and tracker.mac - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.intellivision.us/index.php?action=history&amp;feed=atom&amp;title=Tracker.asm_and_tracker.mac"/>
		<link rel="alternate" type="text/html" href="http://wiki.intellivision.us/index.php?title=Tracker.asm_and_tracker.mac&amp;action=history"/>
		<updated>2026-04-30T21:25:28Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://wiki.intellivision.us/index.php?title=Tracker.asm_and_tracker.mac&amp;diff=14914&amp;oldid=prev</id>
		<title>Mr z: Protected &quot;Tracker.asm and tracker.mac&quot; ([edit=autoconfirmed] (indefinite) [move=autoconfirmed] (indefinite))</title>
		<link rel="alternate" type="text/html" href="http://wiki.intellivision.us/index.php?title=Tracker.asm_and_tracker.mac&amp;diff=14914&amp;oldid=prev"/>
				<updated>2010-12-04T09:38:07Z</updated>
		
		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/index.php/Tracker.asm_and_tracker.mac&quot; title=&quot;Tracker.asm and tracker.mac&quot;&gt;Tracker.asm and tracker.mac&lt;/a&gt;&amp;quot; ([edit=autoconfirmed] (indefinite) [move=autoconfirmed] (indefinite))&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 09:38, 4 December 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Mr z</name></author>	</entry>

	<entry>
		<id>http://wiki.intellivision.us/index.php?title=Tracker.asm_and_tracker.mac&amp;diff=2989&amp;oldid=prev</id>
		<title>Arnauld at 20:03, 7 September 2008</title>
		<link rel="alternate" type="text/html" href="http://wiki.intellivision.us/index.php?title=Tracker.asm_and_tracker.mac&amp;diff=2989&amp;oldid=prev"/>
				<updated>2008-09-07T20:03:50Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 20:03, 7 September 2008&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l8&quot; &gt;Line 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 8:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;CENTER&amp;gt;&amp;lt;TABLE BORDER&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;TH&amp;gt;Macro&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Action performed&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Notes&amp;lt;/TH&amp;gt;&amp;lt;/TR&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;CENTER&amp;gt;&amp;lt;TABLE BORDER&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;TH&amp;gt;Macro&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Action performed&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Notes&amp;lt;/TH&amp;gt;&amp;lt;/TR&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;DRUM &amp;lt;I&amp;gt;t_per, n_per, tone, noise, vol&amp;lt;/I&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Defines drum data for one frame.&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;A drum is fully defined by 8 frames.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;DRUM &amp;lt;I&amp;gt;t_per, n_per, tone, noise, vol&amp;lt;/I&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Defines drum data for one frame.&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;A drum is fully defined by 8 frames.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;NOTES &amp;lt;I&amp;gt;n0, n1, n2, n3&amp;lt;/I&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Defines 4 notes at once&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;This helps to pattern data in a more compact manner.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;NOTES &amp;lt;I&amp;gt;n0, n1, n2, n3&amp;lt;/I&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Defines 4 notes at once&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;This helps to &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;write &lt;/ins&gt;pattern data in a more compact manner.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;NOTE &amp;lt;I&amp;gt;n&amp;lt;/I&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Defines one note&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Expected format for &amp;lt;I&amp;gt;n&amp;lt;/I&amp;gt;: &amp;quot;NnO IVL&amp;quot;. See comments in source file for details.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&amp;lt;/TABLE&amp;gt;&amp;lt;/CENTER&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;NOTE &amp;lt;I&amp;gt;n&amp;lt;/I&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Defines one note&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Expected format for &amp;lt;I&amp;gt;n&amp;lt;/I&amp;gt;: &amp;quot;NnO IVL&amp;quot;. See comments in source file for details.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&amp;lt;/TABLE&amp;gt;&amp;lt;/CENTER&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Arnauld</name></author>	</entry>

	<entry>
		<id>http://wiki.intellivision.us/index.php?title=Tracker.asm_and_tracker.mac&amp;diff=2988&amp;oldid=prev</id>
		<title>Arnauld at 20:02, 7 September 2008</title>
		<link rel="alternate" type="text/html" href="http://wiki.intellivision.us/index.php?title=Tracker.asm_and_tracker.mac&amp;diff=2988&amp;oldid=prev"/>
				<updated>2008-09-07T20:02:25Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Programming]] [[Category:Library]]&lt;br /&gt;
&lt;br /&gt;
These are two files that work together to provide a &amp;quot;music tracker&amp;quot;.  &amp;lt;TT&amp;gt;tracker.mac&amp;lt;/TT&amp;gt; provides the macros that allow to write music code as expected by the tracker, in a rather easily readable form.  &amp;lt;TT&amp;gt;tracker.asm&amp;lt;/TT&amp;gt; provides the actual tracker functions.&lt;br /&gt;
&lt;br /&gt;
= Functions Provided =&lt;br /&gt;
&lt;br /&gt;
== tracker.mac ==&lt;br /&gt;
&amp;lt;CENTER&amp;gt;&amp;lt;TABLE BORDER&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;TH&amp;gt;Macro&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Action performed&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Notes&amp;lt;/TH&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;DRUM &amp;lt;I&amp;gt;t_per, n_per, tone, noise, vol&amp;lt;/I&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Defines drum data for one frame.&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;A drum is fully defined by 8 frames.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;NOTES &amp;lt;I&amp;gt;n0, n1, n2, n3&amp;lt;/I&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Defines 4 notes at once&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;This helps to pattern data in a more compact manner.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;NOTE &amp;lt;I&amp;gt;n&amp;lt;/I&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Defines one note&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Expected format for &amp;lt;I&amp;gt;n&amp;lt;/I&amp;gt;: &amp;quot;NnO IVL&amp;quot;. See comments in source file for details.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&amp;lt;/TABLE&amp;gt;&amp;lt;/CENTER&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tracker.asm ==&lt;br /&gt;
&amp;lt;CENTER&amp;gt;&amp;lt;TABLE BORDER&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;TH&amp;gt;Entry point&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Function provided&amp;lt;/TH&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;TRKINIT&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Global tracker initialization.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;TRKSNGINIT&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Initialize a new song.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;TRKSNGINIT.1&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Alternate entry point.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;TRKPLAY&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;Ticks the tracker and updates the PSG.&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;TRKPATINIT&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;(internal function)&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;TRKCHUPD&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;(internal function)&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;TRKPSGUPD&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;(internal function)&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&amp;lt;/TABLE&amp;gt;&amp;lt;/CENTER&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Source Code =&lt;br /&gt;
&lt;br /&gt;
== tracker.mac ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
;* ======================================================================== *;&lt;br /&gt;
;*  This code is placed into the public domain by its author.               *;&lt;br /&gt;
;*  All copyright rights are hereby relinquished on the code and data in    *;&lt;br /&gt;
;*  this file.  -- Arnauld Chevallier, 2008                                 *;&lt;br /&gt;
;* ======================================================================== *;&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  DRUM        Drum definition                                             ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
MACRO DRUM(t_per, n_per, tone, noise, vol)&lt;br /&gt;
      DECLE %t_per%, %n_per%, $39 - %tone% - 8 * %noise%, %vol%&lt;br /&gt;
ENDM&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  NOTES       Defines 4 notes at once                                     ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
MACRO NOTES(n0, n1, n2, n3)&lt;br /&gt;
      ;&lt;br /&gt;
      LISTING &amp;quot;code&amp;quot;&lt;br /&gt;
      NOTE(%n0%)&lt;br /&gt;
      NOTE(%n1%)&lt;br /&gt;
      NOTE(%n2%)&lt;br /&gt;
      NOTE(%n3%)&lt;br /&gt;
      LISTING &amp;quot;prev&amp;quot;&lt;br /&gt;
ENDM&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  NOTE        Defines one note                                            ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  Format:                                                                 ;;&lt;br /&gt;
;;    &amp;quot;NnO IVL&amp;quot;                                                             ;;&lt;br /&gt;
;;  where:                                                                  ;;&lt;br /&gt;
;;    N = Note (C, D, E, F, G, A, B)                                        ;;&lt;br /&gt;
;;    n = '-' or '#'                                                        ;;&lt;br /&gt;
;;    O = Octave (1 to 7)                                                   ;;&lt;br /&gt;
;;    I = new Instrument (1 to F, or 0 for unchanged)                       ;;&lt;br /&gt;
;;    V = Volume (0 to F)                                                   ;;&lt;br /&gt;
;;    L = Length (0 to F)                                                   ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  The following strings can be used instead of the NnO parameters:        ;;&lt;br /&gt;
;;    &amp;quot;DRM&amp;quot; --&amp;gt; invokes a drum                                              ;;&lt;br /&gt;
;;    &amp;quot;NUL&amp;quot; --&amp;gt; no note                                                     ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  Examples:                                                               ;;&lt;br /&gt;
;;    &amp;quot;C-3 1F1&amp;quot;, &amp;quot;D#4 0F1&amp;quot;, &amp;quot;DRM 1F1&amp;quot;, &amp;quot;NUL 0F1&amp;quot;                            ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
MACRO NOTE(n)&lt;br /&gt;
      ;&lt;br /&gt;
      IF STRLEN(%n%) &amp;gt; 0&lt;br /&gt;
        ; instrument&lt;br /&gt;
_Hex2Dec(_i, ASC(%n%, 4))&lt;br /&gt;
        ; volume&lt;br /&gt;
_Hex2Dec(_v, ASC(%n%, 5))&lt;br /&gt;
        ; length&lt;br /&gt;
_Hex2Dec(_l, ASC(%n%, 6))&lt;br /&gt;
        ; &amp;quot;DRM&amp;quot; ?&lt;br /&gt;
        IF ASC(%n%, 0) = 68 AND ASC(%n%, 1) = 82 AND ASC(%n%, 2) = 77&lt;br /&gt;
      DECLE (84+_i) * $100 + _l * $10 + (15-_v)&lt;br /&gt;
        ELSE&lt;br /&gt;
          ; &amp;quot;NUL&amp;quot; ?&lt;br /&gt;
          IF ASC(%n%, 0) = 78 AND ASC(%n%, 1) = 85 AND ASC(%n%, 2) = 76&lt;br /&gt;
            IF _i &amp;lt;&amp;gt; 0&lt;br /&gt;
      DECLE  $8000 + _l * $10 + (15-_v)&lt;br /&gt;
      DECLE (_i - 1) * 3&lt;br /&gt;
            ELSE&lt;br /&gt;
      DECLE  _l * $10 + (15-_v)&lt;br /&gt;
            ENDI&lt;br /&gt;
          ELSE&lt;br /&gt;
            _InsertNote(%n%, _i, _v, _l)&lt;br /&gt;
          ENDI&lt;br /&gt;
        ENDI&lt;br /&gt;
      ENDI&lt;br /&gt;
ENDM&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  _InsertNote Inserts one note                                            ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  This was put outside the &amp;quot;Note&amp;quot; macro for readability.                  ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
MACRO _InsertNote(n, i, v, l)&lt;br /&gt;
      ; note&lt;br /&gt;
_n0   SET   ASC(%n%, 0)&lt;br /&gt;
      IF (_n0 &amp;lt; 65) OR (_n0 &amp;gt; 71)&lt;br /&gt;
        ERR &amp;quot;Invalid note&amp;quot;&lt;br /&gt;
      ENDI&lt;br /&gt;
      ; conversion letter -&amp;gt; value&lt;br /&gt;
      ;          ABCDEFG&lt;br /&gt;
_n1   SET   ASC(&amp;quot;JLACEFH&amp;quot;, _n0-65) - 64&lt;br /&gt;
      ; sharp ?&lt;br /&gt;
      IF ASC(%n%, 1) = 35&lt;br /&gt;
_n1   SET   _n1 + 1&lt;br /&gt;
      ELSE&lt;br /&gt;
        ; minus ?&lt;br /&gt;
        IF ASC(%n%, 1) &amp;lt;&amp;gt; 45&lt;br /&gt;
          ERR &amp;quot;Invalid note&amp;quot;&lt;br /&gt;
        ENDI&lt;br /&gt;
      ENDI&lt;br /&gt;
      ; octave&lt;br /&gt;
_o    SET   ASC(%n%, 2)&lt;br /&gt;
      IF (_o &amp;lt; 49) OR (_o &amp;gt; 55)&lt;br /&gt;
        ERR &amp;quot;Invalid octave&amp;quot;&lt;br /&gt;
      ENDI&lt;br /&gt;
      ; value&lt;br /&gt;
      IF %i% &amp;lt;&amp;gt; 0&lt;br /&gt;
      DECLE $8000 + (_n1 + 12 * (_o - 49)) * $100 + %l% * $10 + (15-%v%)&lt;br /&gt;
      DECLE (%i% - 1) * 3&lt;br /&gt;
      ELSE&lt;br /&gt;
      DECLE (_n1 + 12 * (_o - 49)) * $100 + %l% * $10 + (15-%v%)&lt;br /&gt;
      ENDI&lt;br /&gt;
ENDM&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  _Hex2Dec    Hexa to decimal conversion                                  ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
MACRO _Hex2Dec(var, dec)&lt;br /&gt;
      ;&lt;br /&gt;
      IF (%dec% &amp;gt;= 48) AND (%dec% &amp;lt;= 57)&lt;br /&gt;
%var% SET   %dec% - 48&lt;br /&gt;
      ELSE&lt;br /&gt;
        IF (%dec% &amp;gt;= 65) AND (%dec% &amp;lt;= 70)&lt;br /&gt;
%var% SET   %dec% - 55&lt;br /&gt;
        ELSE&lt;br /&gt;
          ERR &amp;quot;Invalid hexa value&amp;quot;&lt;br /&gt;
        ENDI&lt;br /&gt;
      ENDI&lt;br /&gt;
ENDM&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  End of File:  tracker.mac                                               ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tracker.asm ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
;* ======================================================================== *;&lt;br /&gt;
;*  These routines are placed into the public domain by their author.  All  *;&lt;br /&gt;
;*  copyright rights are hereby relinquished on the routines and data in    *;&lt;br /&gt;
;*  this file.  -- Arnauld Chevallier, 2008                                 *;&lt;br /&gt;
;* ======================================================================== *;&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  TRKINIT       Global tracker initialization                             ;;&lt;br /&gt;
;;  TRKSNGINIT    Song initialization                                       ;;&lt;br /&gt;
;;  TRKSNGINIT.1  Alternate entry point                                     ;;&lt;br /&gt;
;;  TRKPLAY       Ticks the tracker and updates the PSG                     ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  TRKPATINIT    (internal) Pattern initialization                         ;;&lt;br /&gt;
;;  TRKCHUPD      (internal) Updates a channel                              ;;&lt;br /&gt;
;;  TRKPSGUPD     (internal) Updates the PSG                                ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  AUTHOR                                                                  ;;&lt;br /&gt;
;;      Arnauld Chevallier &amp;lt;a_chevallier AT yahoo.com&amp;gt;                      ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  REVISION HISTORY                                                        ;;&lt;br /&gt;
;;      07-Sep-2008 Initial Revision                                        ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  INPUTS for TRKINIT                                                      ;;&lt;br /&gt;
;;      none                                                                ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  INPUTS for TRKSONGINIT                                                  ;;&lt;br /&gt;
;;      R5    Pointer to invocation record, followed by return address      ;;&lt;br /&gt;
;;            Song base address            1 DECLE                          ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  INPUTS for TRKSONGINIT.1                                                ;;&lt;br /&gt;
;;      R1    Song base address                                             ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  INPUTS for TRKPLAY                                                      ;;&lt;br /&gt;
;;      none                                                                ;;&lt;br /&gt;
;;                                                                          ;;&lt;br /&gt;
;;  CODESIZE                                                                ;;&lt;br /&gt;
;;      524 words                                                           ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  VARIABLES IN SCRATCH RAM USED BY THESE ROUTINES                         ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
; TRKSCRACTH  ORG         $01DC ; (or anywhere else)&lt;br /&gt;
; G_FAD       RMB         1&lt;br /&gt;
; REF_M       RMB         1&lt;br /&gt;
; NOTE_A      RMB         1&lt;br /&gt;
; NOTE_B      RMB         1&lt;br /&gt;
; NOTE_C      RMB         1&lt;br /&gt;
; REF_A       RMB         1&lt;br /&gt;
; REF_B       RMB         1&lt;br /&gt;
; REF_C       RMB         1&lt;br /&gt;
; VOL_A       RMB         1&lt;br /&gt;
; VOL_B       RMB         1&lt;br /&gt;
; VOL_C       RMB         1&lt;br /&gt;
; INSTR_A     RMB         1&lt;br /&gt;
; INSTR_B     RMB         1&lt;br /&gt;
; INSTR_C     RMB         1&lt;br /&gt;
; COUNT_A     RMB         1&lt;br /&gt;
; COUNT_B     RMB         1&lt;br /&gt;
; COUNT_C     RMB         1&lt;br /&gt;
; COUNT_M     RMB         1&lt;br /&gt;
; COUNT_P     RMB         1&lt;br /&gt;
; PAT         RMB         1&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  VARIABLES IN SYSTEM RAM USED BY THESE ROUTINES                          ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
; TRKSYSTEM   ORG         $035B ; (or anywhere else)&lt;br /&gt;
; SONG        RMB         1&lt;br /&gt;
; INS_PTR     RMB         1&lt;br /&gt;
; POS_A       RMB         1&lt;br /&gt;
; POS_B       RMB         1&lt;br /&gt;
; POS_C       RMB         1&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  CONSTANTS USED BY THESE ROUTINES                                        ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
RF2POS      EQU     ((POS_A - REF_A)   AND $FFFF)&lt;br /&gt;
POS2NT      EQU     ((POS_A - NOTE_A)  AND $FFFF)&lt;br /&gt;
POS2IN      EQU     ((INSTR_A - POS_A) AND $FFFF)&lt;br /&gt;
IN2PER      EQU     (($01F0 - INSTR_A) AND $FFFF)&lt;br /&gt;
PER2CN      EQU     ((COUNT_A - $01F4) AND $FFFF)&lt;br /&gt;
V2V         EQU     (($01FB - VOL_A)   AND $FFFF)&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  TRKSNGINIT    Song initialization                                       ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
TRKSNGINIT  PROC&lt;br /&gt;
&lt;br /&gt;
            MVI@    R5,     R1          ; read song address&lt;br /&gt;
@@1         MVO     R1,     SONG        ; save song address&lt;br /&gt;
&lt;br /&gt;
            ADDI    #2,     R1          ; read pointer to instruments&lt;br /&gt;
            MVI@    R1,     R1&lt;br /&gt;
            MVO     R1,     INS_PTR     ; and save it&lt;br /&gt;
&lt;br /&gt;
            CLRR    R0                  ; initialize variables&lt;br /&gt;
            MVO     R0,     REF_M&lt;br /&gt;
            MVO     R0,     COUNT_M&lt;br /&gt;
            MVO     R0,     PAT&lt;br /&gt;
            NOP&lt;br /&gt;
            MVO     R0,     REF_A&lt;br /&gt;
            MVO     R0,     REF_B&lt;br /&gt;
            MVO     R0,     REF_C&lt;br /&gt;
&lt;br /&gt;
            COMR    R0&lt;br /&gt;
            MVO     R0,     COUNT_A&lt;br /&gt;
            MVO     R0,     COUNT_B&lt;br /&gt;
            MVO     R0,     COUNT_C&lt;br /&gt;
&lt;br /&gt;
            MVII    #1,     R0&lt;br /&gt;
            MVO     R0,     G_FAD       ; default global volume fading&lt;br /&gt;
&lt;br /&gt;
            ENDP&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  TRKPATINIT    Pattern initialization                                    ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
TRKPATINIT  PROC&lt;br /&gt;
&lt;br /&gt;
            MVI     SONG,   R4&lt;br /&gt;
            INCR    R4&lt;br /&gt;
            MVI@    R4,     R2          ; R2 = address of 1st pattern&lt;br /&gt;
            INCR    R4&lt;br /&gt;
            MVI     PAT,    R0          ; R0 = position in patterns order table&lt;br /&gt;
            ADDR    R0,     R4&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R1          ; R1 = pattern number&lt;br /&gt;
            TSTR    R1&lt;br /&gt;
            BPL     @@pat_ok            ; end of patterns ? ...&lt;br /&gt;
&lt;br /&gt;
            CMPI    #$F000, R1          ; ... yes : stop replay ?&lt;br /&gt;
            BEQ     TRKINIT&lt;br /&gt;
&lt;br /&gt;
@@restart   ADDR    R1,     R0          ; ... no : jump to restart position ...&lt;br /&gt;
            ADDR    R1,     R4&lt;br /&gt;
            DECR    R4&lt;br /&gt;
            MVI@    R4,     R1          ; ... and read again&lt;br /&gt;
&lt;br /&gt;
@@pat_ok    INCR    R0                  ; increment position&lt;br /&gt;
            MVO     R0,     PAT         ; in patterns order table&lt;br /&gt;
&lt;br /&gt;
            SLL     R1,     2           ; R4 = R1 * 4 + R2&lt;br /&gt;
            MOVR    R1,     R4          ; (beginning of pattern's details)&lt;br /&gt;
            ADDR    R2,     R4&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R0          ; init. pattern counter&lt;br /&gt;
            MVO     R0,     COUNT_P&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R0          ; init. position for each channel&lt;br /&gt;
            MVO     R0,     POS_A&lt;br /&gt;
            MVI@    R4,     R0&lt;br /&gt;
            MVO     R0,     POS_B&lt;br /&gt;
            MVI@    R4,     R0&lt;br /&gt;
            MVO     R0,     POS_C&lt;br /&gt;
&lt;br /&gt;
            JR      R5&lt;br /&gt;
            ENDP&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  TRKINIT       Global tracker initialization                             ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
TRKINIT     PROC&lt;br /&gt;
&lt;br /&gt;
            MVII    #$38,   R0          ; 'Enable Noise/Tone' register&lt;br /&gt;
            MVO     R0,     $01F8&lt;br /&gt;
&lt;br /&gt;
            CLRR    R0&lt;br /&gt;
&lt;br /&gt;
            MVO     R0,     SONG        ; no song&lt;br /&gt;
&lt;br /&gt;
            MVII    #$01F0, R4          ; clear channels periods / low&lt;br /&gt;
            MVO@    R0,     R4          ; $01F0&lt;br /&gt;
            MVO@    R0,     R4          ; $01F1&lt;br /&gt;
            MVO@    R0,     R4          ; $01F2&lt;br /&gt;
&lt;br /&gt;
            INCR    R4                  ; clear channels periods / hi&lt;br /&gt;
            MVO@    R0,     R4          ; $01F4&lt;br /&gt;
            MVO@    R0,     R4          ; $01F5&lt;br /&gt;
            MVO@    R0,     R4          ; $01F6&lt;br /&gt;
&lt;br /&gt;
            MVII    #$01FB, R4          ; clear volumes&lt;br /&gt;
            MVO@    R0,     R4          ; $01FB&lt;br /&gt;
            MVO@    R0,     R4          ; $01FC&lt;br /&gt;
            MVO@    R0,     R4          ; $01FD&lt;br /&gt;
&lt;br /&gt;
            JR      R5&lt;br /&gt;
            ENDP&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  TRKPLAY       Ticks the tracker and updates the PSG                     ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
TRKPLAY     PROC&lt;br /&gt;
            PSHR    R5&lt;br /&gt;
&lt;br /&gt;
            MVI     SONG,   R4          ; R4 = song base address&lt;br /&gt;
            TSTR    R4                  ; is a song actually playing ?&lt;br /&gt;
            BEQ     @@done&lt;br /&gt;
&lt;br /&gt;
            MVI     COUNT_M,R0          ; ... yes : increment global music counter&lt;br /&gt;
            INCR    R0&lt;br /&gt;
            MVO     R0,     COUNT_M&lt;br /&gt;
&lt;br /&gt;
            MVI     REF_M,  R0          ; refresh notes ?&lt;br /&gt;
            DECR    R0&lt;br /&gt;
            BPL     @@notes_ok&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R0          ; ... yes : read speed&lt;br /&gt;
            MVO     R0,     REF_M&lt;br /&gt;
&lt;br /&gt;
            MVII    #REF_A, R3          ; refresh note for each channel&lt;br /&gt;
            CALL    TRKCHUPD&lt;br /&gt;
            MVII    #REF_B, R3&lt;br /&gt;
            CALL    TRKCHUPD&lt;br /&gt;
            MVII    #REF_C, R3&lt;br /&gt;
            CALL    TRKCHUPD&lt;br /&gt;
&lt;br /&gt;
            MVI     COUNT_P,R0          ; decrement pattern counter&lt;br /&gt;
            DECR    R0&lt;br /&gt;
            MVO     R0,     COUNT_P&lt;br /&gt;
            BNEQ    @@upd_psg           ; jump to next pattern ?&lt;br /&gt;
&lt;br /&gt;
            CALL    TRKPATINIT          ; ... yes&lt;br /&gt;
            B       @@upd_psg&lt;br /&gt;
&lt;br /&gt;
@@notes_ok  MVO     R0,     REF_M&lt;br /&gt;
&lt;br /&gt;
@@upd_psg   MVII    #NOTE_A,R3          ; update PSG for each channel&lt;br /&gt;
            CALL    TRKPSGUPD&lt;br /&gt;
            MVII    #NOTE_B,R3&lt;br /&gt;
            CALL    TRKPSGUPD&lt;br /&gt;
            MVII    #NOTE_C,R3&lt;br /&gt;
            CALL    TRKPSGUPD&lt;br /&gt;
&lt;br /&gt;
@@done      PULR    PC&lt;br /&gt;
            ENDP&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  TRKCHUPD      Updates a channel                                         ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
TRKCHUPD    PROC&lt;br /&gt;
            PSHR    R5&lt;br /&gt;
&lt;br /&gt;
            MVI@    R3,     R0          ; (R3 = REF_x)&lt;br /&gt;
            SUBI    #$10,   R0&lt;br /&gt;
            BMI     @@ch_new&lt;br /&gt;
&lt;br /&gt;
            MVO@    R0,     R3&lt;br /&gt;
            PULR    PC&lt;br /&gt;
&lt;br /&gt;
@@ch_new    ADDI    #RF2POS,R3          ; read pos&lt;br /&gt;
            MVI@    R3,     R4&lt;br /&gt;
            MVI@    R4,     R0          ; read data&lt;br /&gt;
&lt;br /&gt;
            MOVR    R0,     R1          ; extra data to read ? ...&lt;br /&gt;
            BPL     @@data_ok&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R2          ; ... yes : R2 = new instrument&lt;br /&gt;
            ADDI    #POS2IN,R3&lt;br /&gt;
            MVO@    R2,     R3          ; save it&lt;br /&gt;
            SUBI    #POS2IN,R3&lt;br /&gt;
&lt;br /&gt;
@@data_ok   MVO@    R4,     R3          ; update pos&lt;br /&gt;
&lt;br /&gt;
            SWAP    R0                  ; save note&lt;br /&gt;
            SUBI    #POS2NT,R3&lt;br /&gt;
            ANDI    #$7F,   R0&lt;br /&gt;
            BEQ     @@skip_sav&lt;br /&gt;
&lt;br /&gt;
            MVO@    R0,     R3&lt;br /&gt;
&lt;br /&gt;
@@skip_sav  ADDI    #3,     R3          ; new refresh value (R3 = REF_x)&lt;br /&gt;
            MVO@    R1,     R3&lt;br /&gt;
&lt;br /&gt;
            ANDI    #$F,    R1          ; new volume&lt;br /&gt;
            ADDI    #3,     R3          ; (R3 = VOL_x)&lt;br /&gt;
            MVO@    R1,     R3&lt;br /&gt;
&lt;br /&gt;
            TSTR    R0                  ; if note = 0,&lt;br /&gt;
            BEQ     @@ch_ok             ; don't reset counter&lt;br /&gt;
&lt;br /&gt;
            ADDI    #6,     R3          ; (R3 = COUNT_x)&lt;br /&gt;
            CLRR    R0                  ; reset counter&lt;br /&gt;
            MVO@    R0,     R3&lt;br /&gt;
&lt;br /&gt;
@@ch_ok     PULR    PC&lt;br /&gt;
            ENDP&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  TRKPSGUPD     Updates the PSG                                           ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
TRKPSGUPD   PROC&lt;br /&gt;
&lt;br /&gt;
            MVI@    R3,     R1          ; read note&lt;br /&gt;
&lt;br /&gt;
            ADDI    #12,    R3          ; (R3 = COUNT_x)&lt;br /&gt;
            MVI@    R3,     R2          ; read channel counter -&amp;gt; R2&lt;br /&gt;
            CMPI    #$FF,   R2          ; prevents loop after $FF&lt;br /&gt;
            BEQ     @@cnt_ok&lt;br /&gt;
&lt;br /&gt;
            INCR    R2                  ; increment counter&lt;br /&gt;
            MVO@    R2,     R3&lt;br /&gt;
            DECR    R2&lt;br /&gt;
&lt;br /&gt;
@@cnt_ok    CMPI    #85,    R1          ; drum ?&lt;br /&gt;
            BGE     @@drum&lt;br /&gt;
&lt;br /&gt;
;; ------------------------------------------------------------------------ ;;&lt;br /&gt;
;;  Standard instrument                                                     ;;&lt;br /&gt;
;; ------------------------------------------------------------------------ ;;&lt;br /&gt;
            SUBI    #3,     R3          ; (R3 = INSTR_x)&lt;br /&gt;
            MVI@    R3,     R4          ; R4 = pointer to instrument&lt;br /&gt;
            ADD     INS_PTR,R4&lt;br /&gt;
&lt;br /&gt;
            PSHR    R2                  ; apply pitch effect&lt;br /&gt;
            ANDI    #3,     R2&lt;br /&gt;
            ADD@    R4,     R2&lt;br /&gt;
            ADD@    R2,     R1&lt;br /&gt;
&lt;br /&gt;
            ADDI    #@@nt-1,R1          ; read period from notes table&lt;br /&gt;
            MVI@    R1,     R0          ; R0 = period&lt;br /&gt;
&lt;br /&gt;
            ADDI    #84,    R1          ; read vibrato amplitude for this note&lt;br /&gt;
            MVI@    R1,     R1          ; R1 = vibrato amplitude&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R2          ; R2 = type of vibrato for this channel&lt;br /&gt;
            CMPI    #1,     R2&lt;br /&gt;
            BLT     @@vibr0             ; no vibrato ?&lt;br /&gt;
            BEQ     @@low_vibr          ; low vibrato ?&lt;br /&gt;
&lt;br /&gt;
            CMPI    #2,     R2&lt;br /&gt;
            BGT     @@apply_vb          ; high vibrato --&amp;gt; amplitude unchanged&lt;br /&gt;
&lt;br /&gt;
            SLR     R1                  ; medium vibrato --&amp;gt; 1/2 amplitude&lt;br /&gt;
            INCR    PC&lt;br /&gt;
&lt;br /&gt;
@@low_vibr  SLR     R1,     2           ; low vibrato --&amp;gt; 1/4 amplitude&lt;br /&gt;
&lt;br /&gt;
@@apply_vb  MVI     COUNT_M,R2          ; apply vibrato&lt;br /&gt;
            ANDI    #7,     R2          ; according to current step&lt;br /&gt;
            ADDI    #@@v_tb,R2          ; (i.e. COUNT_M % 8)&lt;br /&gt;
            MVI@    R2,     PC&lt;br /&gt;
&lt;br /&gt;
@@v_tb      DECLE   @@vibr1, @@vibr2    ; vibrato processing index&lt;br /&gt;
            DECLE   @@vibr0, @@vibr3&lt;br /&gt;
            DECLE   @@vibr4, @@vibr3&lt;br /&gt;
            DECLE   @@vibr0, @@vibr2&lt;br /&gt;
&lt;br /&gt;
@@vibr1     SUBR    R1,     R0          ; - amplitude&lt;br /&gt;
            B       @@vibr0&lt;br /&gt;
&lt;br /&gt;
@@vibr2     SLR     R1                  ; - 1/2 amplitude&lt;br /&gt;
            SUBR    R1,     R0&lt;br /&gt;
            B       @@vibr0&lt;br /&gt;
&lt;br /&gt;
@@vibr3     SLR     R1                  ; + 1/2 amplitude&lt;br /&gt;
            ADDR    R1,     R0&lt;br /&gt;
            INCR    PC&lt;br /&gt;
&lt;br /&gt;
@@vibr4     ADDR    R1,     R0          ; + amplitude&lt;br /&gt;
&lt;br /&gt;
@@vibr0     ADDI    #IN2PER,R3          ; write period&lt;br /&gt;
            MVO@    R0,     R3          ; (low)&lt;br /&gt;
            SWAP    R0&lt;br /&gt;
            ADDI    #4,     R3&lt;br /&gt;
            MVO@    R0,     R3          ; (high)&lt;br /&gt;
            ADDI    #PER2CN,R3&lt;br /&gt;
&lt;br /&gt;
            PULR    R0                  ; R0 = channel counter / 2&lt;br /&gt;
            SLR     R0&lt;br /&gt;
&lt;br /&gt;
@@env       MVI@    R4,     R4          ; R4 = pointer to envelope&lt;br /&gt;
&lt;br /&gt;
            ADD@    R4,     PC          ; apply speed of envelope&lt;br /&gt;
            SLR     R0&lt;br /&gt;
            SLR     R0&lt;br /&gt;
            SLR     R0&lt;br /&gt;
&lt;br /&gt;
            MOVR    R0,     R1          ; get volume from envelope&lt;br /&gt;
            SLR     R0,     2&lt;br /&gt;
            ADDR    R0,     R4&lt;br /&gt;
            MVI@    R4,     R0&lt;br /&gt;
            ANDI    #3,     R1&lt;br /&gt;
            ADDI    #@@e_tb,R1&lt;br /&gt;
            MVI@    R1,     PC&lt;br /&gt;
&lt;br /&gt;
@@e_tb      DECLE   @@env0, @@env1&lt;br /&gt;
            DECLE   @@env2, @@env3&lt;br /&gt;
&lt;br /&gt;
@@env1      SWAP    R0&lt;br /&gt;
            B       @@env3&lt;br /&gt;
&lt;br /&gt;
@@env0      SWAP    R0&lt;br /&gt;
&lt;br /&gt;
@@env2      SLR     R0,     2&lt;br /&gt;
            SLR     R0,     2&lt;br /&gt;
&lt;br /&gt;
@@env3      ANDI    #$F,    R0&lt;br /&gt;
&lt;br /&gt;
            SUBI    #6,     R3          ; (R3 = VOL_x)&lt;br /&gt;
            SUB@    R3,     R0          ; get volume from song&lt;br /&gt;
            SUB     G_FAD,  R0          ; apply global volume fading&lt;br /&gt;
            BPL     @@upd_vol&lt;br /&gt;
&lt;br /&gt;
            CLRR    R0&lt;br /&gt;
&lt;br /&gt;
@@upd_vol   ADDI    #V2V,   R3          ; apply new volume&lt;br /&gt;
            MVO@    R0,     R3&lt;br /&gt;
&lt;br /&gt;
            JR      R5                  ; return&lt;br /&gt;
&lt;br /&gt;
;; ------------------------------------------------------------------------ ;;&lt;br /&gt;
;;  Drum                                                                    ;;&lt;br /&gt;
;; ------------------------------------------------------------------------ ;;&lt;br /&gt;
;;  WARNING: drums are currently supported on channel A only                ;;&lt;br /&gt;
;; ------------------------------------------------------------------------ ;;&lt;br /&gt;
@@drum      CMPI    #8,     R2          ; end of drum ?&lt;br /&gt;
            BGE     @@end_drum&lt;br /&gt;
&lt;br /&gt;
            SUBI    #85-3*4,R1          ; get pointer to drum data&lt;br /&gt;
            ADD     INS_PTR,R1&lt;br /&gt;
            MVI@    R1,     R4&lt;br /&gt;
            SLL     R2,     2&lt;br /&gt;
            ADDR    R2,     R4&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R0          ; tone period&lt;br /&gt;
            MVO     R0,     $01F0&lt;br /&gt;
            SWAP    R0&lt;br /&gt;
            MVO     R0,     $01F4&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R0          ; noise period&lt;br /&gt;
            MVO     R0,     $01F9&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R0          ; enable tone / noise&lt;br /&gt;
            MVO     R0,     $01F8&lt;br /&gt;
&lt;br /&gt;
            MVI@    R4,     R0          ; volume&lt;br /&gt;
            SUB     G_FAD,  R0&lt;br /&gt;
            BPL     @@drum_vol&lt;br /&gt;
&lt;br /&gt;
@@end_drum  CLRR    R0&lt;br /&gt;
&lt;br /&gt;
@@drum_vol  MVO     R0,     $01FB&lt;br /&gt;
&lt;br /&gt;
            JR      R5&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  Periods of the 84 defined notes                                         ;;&lt;br /&gt;
;;  (from C-1 to B-7)                                                       ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
@@nt        DECLE   $0D5C, $0C9D, $0BE7, $0B3C, $0A9B, $0A02, $0973, $08EB&lt;br /&gt;
            DECLE   $086B, $07F2, $0780, $0714, $06AE, $064E, $05F4, $059E&lt;br /&gt;
            DECLE   $054D, $0501, $04B9, $0475, $0435, $03F9, $03C0, $038A&lt;br /&gt;
            DECLE   $0357, $0327, $02FA, $02CF, $02A7, $0281, $025D, $023B&lt;br /&gt;
            DECLE   $021B, $01FC, $01E0, $01C5, $01AC, $0194, $017D, $0168&lt;br /&gt;
            DECLE   $0153, $0140, $012E, $011D, $010D, $00FE, $00F0, $00E2&lt;br /&gt;
            DECLE   $00D6, $00CA, $00BE, $00B4, $00AA, $00A0, $0097, $008F&lt;br /&gt;
            DECLE   $0087, $007F, $0078, $0071, $006B, $0065, $005F, $005A&lt;br /&gt;
            DECLE   $0055, $0050, $004C, $0047, $0043, $0040, $003C, $0039&lt;br /&gt;
            DECLE   $0035, $0032, $0030, $002D, $002A, $0028, $0026, $0024&lt;br /&gt;
            DECLE   $0022, $0020, $001E, $001C&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  Vibrato amplitude for each note above                                   ;;&lt;br /&gt;
;;  (30% of an half-tone)                                                   ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
            DECLE   $003B, $0038, $0035, $0032, $002F, $002C, $002A, $0028&lt;br /&gt;
            DECLE   $0025, $0023, $0021, $001F, $001E, $001C, $001A, $0019&lt;br /&gt;
            DECLE   $0018, $0016, $0015, $0014, $0013, $0012, $0011, $0010&lt;br /&gt;
            DECLE   $000F, $000E, $000D, $000C, $000C, $000B, $000A, $000A&lt;br /&gt;
            DECLE   $0009, $0009, $0008, $0008, $0007, $0007, $0007, $0006&lt;br /&gt;
            DECLE   $0006, $0006, $0005, $0005, $0005, $0004, $0004, $0004&lt;br /&gt;
            DECLE   $0004, $0003, $0003, $0003, $0003, $0003, $0003, $0002&lt;br /&gt;
            DECLE   $0002, $0002, $0002, $0002, $0002, $0002, $0002, $0002&lt;br /&gt;
            DECLE   $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001&lt;br /&gt;
            DECLE   $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001&lt;br /&gt;
            DECLE   $0001, $0001, $0001, $0000&lt;br /&gt;
&lt;br /&gt;
            ENDP&lt;br /&gt;
&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
;;  End of File:  tracker.asm                                               ;;&lt;br /&gt;
;; ======================================================================== ;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Arnauld</name></author>	</entry>

	</feed>